diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 6392395d2e..2ce05c728e 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -67,7 +67,7 @@ jobs: with: quay_image_name: ${{ needs.set-vars.outputs.controller-meta-tags }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.22' + go-version: '1.23' platforms: ${{ needs.set-vars.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} secrets: @@ -84,7 +84,7 @@ jobs: with: quay_image_name: ${{ needs.set-vars.outputs.plugin-meta-tags }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.22' + go-version: '1.23' platforms: ${{ needs.set-vars.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} target: kubectl-argo-rollouts diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index d2ef3a1c96..d0767325d0 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -24,9 +24,9 @@ jobs: with: python-version: 3.x - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: - go-version: '1.22' + go-version: '1.23' - name: build run: | pip install mkdocs mkdocs_material diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 290d0f216a..6929fe0f6a 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -9,7 +9,7 @@ on: - 'master' env: # Golang version to use across CI steps - GOLANG_VERSION: '1.22' + GOLANG_VERSION: '1.23' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} - name: Checkout code @@ -35,14 +35,14 @@ jobs: - name: Run golangci-lint uses: golangci/golangci-lint-action@v6 with: - version: v1.57.2 + version: v1.61.0 args: --timeout 6m build: name: Build runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -72,7 +72,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Setup Golang - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} # k8s codegen generates files into GOPATH location instead of the GitHub git checkout location diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index ad43e96f6d..df7e2a8f24 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -69,7 +69,7 @@ jobs: if: ${{ github.ref_type != 'tag'}} - name: Setup Golang - uses: actions/setup-go@v5.1.0 # v3.5.0 + uses: actions/setup-go@v5.2.0 # v3.5.0 with: go-version: ${{ inputs.go-version }} @@ -78,8 +78,8 @@ jobs: with: cosign-release: 'v2.2.0' - - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + - uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0 + - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Setup tags for container image as a CSV type run: | @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 #v6.9.0 + uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d #v6.12.0 with: context: . platforms: ${{ inputs.platforms }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index adb413e4b7..b6dc1ad25b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,7 +7,7 @@ on: permissions: {} env: - GOLANG_VERSION: '1.22' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. + GOLANG_VERSION: '1.23' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. jobs: controller-image: @@ -19,7 +19,7 @@ jobs: with: quay_image_name: quay.io/argoproj/argo-rollouts:${{ github.ref_name }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.22' + go-version: '1.23' platforms: linux/amd64,linux/arm64 push: true secrets: @@ -35,7 +35,7 @@ jobs: with: quay_image_name: quay.io/argoproj/kubectl-argo-rollouts:${{ github.ref_name }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.22' + go-version: '1.23' platforms: linux/amd64,linux/arm64 push: true target: kubectl-argo-rollouts @@ -90,15 +90,15 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v5.1.0 # v4.0.1 + uses: actions/setup-go@v5.2.0 # v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 + uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Generate release artifacts run: | @@ -107,7 +107,7 @@ jobs: make manifests IMAGE_TAG=${{ github.ref_name }} - name: Draft release - uses: softprops/action-gh-release@01570a1f39cb168c169c802c3bceb9e93fb10974 # v0.1.15 + uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v0.1.15 with: tag_name: ${{ github.event.inputs.tag }} draft: true @@ -163,7 +163,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v5.1.0 # v4.0.0 + uses: actions/setup-go@v5.2.0 # v4.0.0 with: go-version: ${{ env.GOLANG_VERSION }} @@ -212,7 +212,7 @@ jobs: /tmp/sbom.tar.gz - name: Upload SBOM and signature assets - uses: softprops/action-gh-release@01570a1f39cb168c169c802c3bceb9e93fb10974 # v0.1.15 + uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v0.1.15 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index d3b3d561f9..39e7747b1e 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -17,7 +17,7 @@ on: default: false env: # Golang version to use across CI steps - GOLANG_VERSION: '1.22' + GOLANG_VERSION: '1.23' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -79,21 +79,21 @@ jobs: fail-fast: false matrix: kubernetes: - - version: 1.26 + - version: '1.28' latest: false - - version: 1.27 + - version: '1.29' latest: false - - version: 1.28 + - version: '1.30' latest: false - - version: 1.29 + - version: '1.31' latest: true name: Run end-to-end tests runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: - go-version: '1.22' + go-version: '1.23' - uses: actions/checkout@v4 - name: Setup k3s env: @@ -165,7 +165,7 @@ jobs: - test-e2e steps: - name: Set up Go - uses: actions/setup-go@v5.1.0 + uses: actions/setup-go@v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -184,7 +184,7 @@ jobs: run: | go tool covdata textfmt -i=coverage-output-unit/,coverage-output-e2e/ -o full-coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303 # v5.1.2 with: file: full-coverage.out fail_ci_if_error: false diff --git a/.golangci.yml b/.golangci.yml index c59d635e9c..af89264b4a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,20 +1,21 @@ run: - deadline: 1m - skip-files: - - ".*\\.pb\\.go" - skip-dirs: - - pkg/client + timeout: 10m modules-download-mode: readonly +issues: + exclude-dirs: + - pkg/client + exclude-files: + - ".*\\.pb\\.go" linter-settings: goimports: local-prefixes: github.com/argoproj/argo-rollouts linters: enable: - - vet - gofmt - goimports - - unused + - govet - ineffassign - - unconvert - misspell + - unconvert + - unused disable-all: true diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7b5d5d427f..aa5927f907 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,6 +1,7 @@ version: 2 formats: all mkdocs: + configuration: mkdocs.yml fail_on_warning: false python: install: diff --git a/CHANGELOG.md b/CHANGELOG.md index 32f585e4e7..d61075e78c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,240 @@ + + +## [v1.8.0-rc2](https://github.com/argoproj/argo-rollouts/compare/v1.8.0-rc1...v1.8.0-rc2) (2024-12-17) + +### Ci + +* add testing for k8s 1.30 and 1.31 ([#3858](https://github.com/argoproj/argo-rollouts/issues/3858)) + +### Docs + +* **analysis:** add docs for consecutiveSuccessLimit ([#3996](https://github.com/argoproj/argo-rollouts/issues/3996)) + +### Fix + +* don't over reconcile on error ([#4005](https://github.com/argoproj/argo-rollouts/issues/4005)) +* remove ReplicaSet write-back ([#4044](https://github.com/argoproj/argo-rollouts/issues/4044)) +* **controller:** Fixed broken pprof links [#4037](https://github.com/argoproj/argo-rollouts/issues/4037) ([#4038](https://github.com/argoproj/argo-rollouts/issues/4038)) +* **experiments:** move recorder event to after experiment reconciliation, fixes [#4021](https://github.com/argoproj/argo-rollouts/issues/4021) ([#4022](https://github.com/argoproj/argo-rollouts/issues/4022)) + + +## [v1.8.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.7.2...v1.8.0-rc1) (2024-12-06) + +### Chore + +* update the link of DCO in PR template ([#3944](https://github.com/argoproj/argo-rollouts/issues/3944)) +* remove some k8s e2e test versions ([#3495](https://github.com/argoproj/argo-rollouts/issues/3495)) +* upgrade react-scripts ([#3584](https://github.com/argoproj/argo-rollouts/issues/3584)) +* update golangci-lint to v1.61.0 ([#3857](https://github.com/argoproj/argo-rollouts/issues/3857)) +* fix and add more cli usage case ([#3592](https://github.com/argoproj/argo-rollouts/issues/3592)) +* don't fail code-cov on failure ([#3661](https://github.com/argoproj/argo-rollouts/issues/3661)) +* add example for updating all container images in set command ([#3667](https://github.com/argoproj/argo-rollouts/issues/3667)) +* add codecov token ([#3623](https://github.com/argoproj/argo-rollouts/issues/3623)) +* code coverage for e2e ([#3740](https://github.com/argoproj/argo-rollouts/issues/3740)) +* use codecov config and only send merged coverage file ([#3751](https://github.com/argoproj/argo-rollouts/issues/3751)) +* Add Cloudflare to users ([#3768](https://github.com/argoproj/argo-rollouts/issues/3768)) +* capitalize AS in Dockerfile ([#3781](https://github.com/argoproj/argo-rollouts/issues/3781)) +* move ReplicaSet creation and Rollout validation earlier during the reconciliation process. ([#3657](https://github.com/argoproj/argo-rollouts/issues/3657)) +* Add Trustly to USERS.md ([#3837](https://github.com/argoproj/argo-rollouts/issues/3837)) +* add step plugin proposal ([#3480](https://github.com/argoproj/argo-rollouts/issues/3480)) +* **deps:** bump docker/setup-buildx-action from 3.4.0 to 3.5.0 ([#3738](https://github.com/argoproj/argo-rollouts/issues/3738)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.42.2 to 1.42.3 ([#3923](https://github.com/argoproj/argo-rollouts/issues/3923)) +* **deps:** bump github.com/newrelic/newrelic-client-go/v2 from 2.48.2 to 2.50.1 ([#3924](https://github.com/argoproj/argo-rollouts/issues/3924)) +* **deps:** bump softprops/action-gh-release from 2.0.8 to 2.0.9 ([#3928](https://github.com/argoproj/argo-rollouts/issues/3928)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.38 to 1.28.1 ([#3917](https://github.com/argoproj/argo-rollouts/issues/3917)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.6.1 to 1.6.2 ([#3908](https://github.com/argoproj/argo-rollouts/issues/3908)) +* **deps:** bump actions/setup-go from 5.0.2 to 5.1.0 ([#3912](https://github.com/argoproj/argo-rollouts/issues/3912)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.32.2 to 1.32.3 ([#3919](https://github.com/argoproj/argo-rollouts/issues/3919)) +* **deps:** bump github.com/newrelic/newrelic-client-go/v2 from 2.50.1 to 2.51.3 ([#3939](https://github.com/argoproj/argo-rollouts/issues/3939)) +* **deps:** bump google.golang.org/grpc from 1.66.2 to 1.67.1 ([#3903](https://github.com/argoproj/argo-rollouts/issues/3903)) +* **deps:** bump docker/setup-buildx-action from 3.6.1 to 3.7.1 ([#3876](https://github.com/argoproj/argo-rollouts/issues/3876)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.8 to 1.42.2 ([#3901](https://github.com/argoproj/argo-rollouts/issues/3901)) +* **deps:** bump github.com/aws/smithy-go from 1.21.0 to 1.22.0 ([#3885](https://github.com/argoproj/argo-rollouts/issues/3885)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.31.0 to 1.32.2 ([#3886](https://github.com/argoproj/argo-rollouts/issues/3886)) +* **deps:** bump google.golang.org/protobuf from 1.34.2 to 1.35.1 ([#3887](https://github.com/argoproj/argo-rollouts/issues/3887)) +* **deps:** bump golang.org/x/oauth2 from 0.22.0 to 0.23.0 ([#3841](https://github.com/argoproj/argo-rollouts/issues/3841)) +* **deps:** bump codecov/codecov-action from 4.5.0 to 4.6.0 ([#3865](https://github.com/argoproj/argo-rollouts/issues/3865)) +* **deps:** bump github.com/newrelic/newrelic-client-go/v2 from 2.45.0 to 2.48.2 ([#3874](https://github.com/argoproj/argo-rollouts/issues/3874)) +* **deps:** bump sigstore/cosign-installer from 3.6.0 to 3.7.0 ([#3875](https://github.com/argoproj/argo-rollouts/issues/3875)) +* **deps:** bump docker/build-push-action from 6.8.0 to 6.9.0 ([#3863](https://github.com/argoproj/argo-rollouts/issues/3863)) +* **deps:** bump docker/build-push-action from 6.7.0 to 6.8.0 ([#3860](https://github.com/argoproj/argo-rollouts/issues/3860)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.33 to 1.27.38 ([#3851](https://github.com/argoproj/argo-rollouts/issues/3851)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.5 to 1.40.8 ([#3838](https://github.com/argoproj/argo-rollouts/issues/3838)) +* **deps:** bump github.com/newrelic/newrelic-client-go/v2 from 2.43.1 to 2.45.0 ([#3829](https://github.com/argoproj/argo-rollouts/issues/3829)) +* **deps:** bump google.golang.org/grpc from 1.65.0 to 1.66.2 ([#3831](https://github.com/argoproj/argo-rollouts/issues/3831)) +* **deps:** bump softprops/action-gh-release from 2.0.9 to 2.1.0 ([#3938](https://github.com/argoproj/argo-rollouts/issues/3938)) +* **deps:** bump peter-evans/create-pull-request from 6 to 7 ([#3819](https://github.com/argoproj/argo-rollouts/issues/3819)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.31 to 1.27.33 ([#3822](https://github.com/argoproj/argo-rollouts/issues/3822)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.30 to 1.27.31 ([#3807](https://github.com/argoproj/argo-rollouts/issues/3807)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.3 to 1.40.5 ([#3808](https://github.com/argoproj/argo-rollouts/issues/3808)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.27 to 1.27.30 ([#3804](https://github.com/argoproj/argo-rollouts/issues/3804)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.42.3 to 1.42.4 ([#3935](https://github.com/argoproj/argo-rollouts/issues/3935)) +* **deps:** bump github.com/newrelic/newrelic-client-go/v2 from 2.41.2 to 2.43.1 ([#3793](https://github.com/argoproj/argo-rollouts/issues/3793)) +* **deps:** bump github.com/aws/smithy-go from 1.20.3 to 1.20.4 ([#3794](https://github.com/argoproj/argo-rollouts/issues/3794)) +* **deps:** bump docker/build-push-action from 6.6.1 to 6.7.0 ([#3791](https://github.com/argoproj/argo-rollouts/issues/3791)) +* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.13.0 to 2.14.0 ([#3786](https://github.com/argoproj/argo-rollouts/issues/3786)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.32.3 to 1.32.4 ([#3934](https://github.com/argoproj/argo-rollouts/issues/3934)) +* **deps:** bump docker/build-push-action from 6.5.0 to 6.6.1 ([#3776](https://github.com/argoproj/argo-rollouts/issues/3776)) +* **deps:** bump sigstore/cosign-installer from 3.5.0 to 3.6.0 ([#3777](https://github.com/argoproj/argo-rollouts/issues/3777)) +* **deps:** bump golang.org/x/oauth2 from 0.21.0 to 0.22.0 ([#3766](https://github.com/argoproj/argo-rollouts/issues/3766)) +* **deps:** bump docker/build-push-action from 6.9.0 to 6.10.0 ([#3963](https://github.com/argoproj/argo-rollouts/issues/3963)) +* **deps:** bump docker/setup-buildx-action from 3.5.0 to 3.6.1 ([#3755](https://github.com/argoproj/argo-rollouts/issues/3755)) +* **deps:** bump google.golang.org/protobuf from 1.35.1 to 1.35.2 ([#3950](https://github.com/argoproj/argo-rollouts/issues/3950)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.26 to 1.27.27 ([#3732](https://github.com/argoproj/argo-rollouts/issues/3732)) +* **deps:** bump softprops/action-gh-release from 2.0.6 to 2.0.8 ([#3733](https://github.com/argoproj/argo-rollouts/issues/3733)) +* **deps:** bump golang.org/x/oauth2 from 0.23.0 to 0.24.0 ([#3949](https://github.com/argoproj/argo-rollouts/issues/3949)) +* **deps:** bump docker/setup-qemu-action from 3.1.0 to 3.2.0 ([#3736](https://github.com/argoproj/argo-rollouts/issues/3736)) +* **deps:** bump docker/build-push-action from 6.4.0 to 6.5.0 ([#3737](https://github.com/argoproj/argo-rollouts/issues/3737)) +* **deps:** bump codecov/codecov-action from 4.6.0 to 5.0.7 ([#3961](https://github.com/argoproj/argo-rollouts/issues/3961)) +* **deps:** bump docker/login-action from 3.2.0 to 3.3.0 ([#3739](https://github.com/argoproj/argo-rollouts/issues/3739)) +* **deps:** bump docker/build-push-action from 6.3.0 to 6.4.0 ([#3723](https://github.com/argoproj/argo-rollouts/issues/3723)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.24 to 1.27.26 ([#3717](https://github.com/argoproj/argo-rollouts/issues/3717)) +* **deps:** bump actions/setup-go from 5.0.1 to 5.0.2 ([#3716](https://github.com/argoproj/argo-rollouts/issues/3716)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.1 to 1.40.3 ([#3719](https://github.com/argoproj/argo-rollouts/issues/3719)) +* **deps:** bump docker/setup-qemu-action from 3.0.0 to 3.1.0 ([#3696](https://github.com/argoproj/argo-rollouts/issues/3696)) +* **deps:** bump docker/build-push-action from 6.2.0 to 6.3.0 ([#3697](https://github.com/argoproj/argo-rollouts/issues/3697)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.23 to 1.27.24 ([#3698](https://github.com/argoproj/argo-rollouts/issues/3698)) +* **deps:** bump docker/setup-buildx-action from 3.3.0 to 3.4.0 ([#3705](https://github.com/argoproj/argo-rollouts/issues/3705)) +* **deps:** bump google.golang.org/grpc from 1.64.0 to 1.65.0 ([#3694](https://github.com/argoproj/argo-rollouts/issues/3694)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.22 to 1.27.23 ([#3695](https://github.com/argoproj/argo-rollouts/issues/3695)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.28.1 to 1.28.6 ([#3981](https://github.com/argoproj/argo-rollouts/issues/3981)) +* **deps:** bump github.com/aws/smithy-go from 1.20.2 to 1.20.3 ([#3685](https://github.com/argoproj/argo-rollouts/issues/3685)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.38.7 to 1.40.1 ([#3687](https://github.com/argoproj/argo-rollouts/issues/3687)) +* **deps:** bump softprops/action-gh-release from 2.0.5 to 2.0.6 ([#3656](https://github.com/argoproj/argo-rollouts/issues/3656)) +* **deps:** bump docker/build-push-action from 6.1.0 to 6.2.0 ([#3676](https://github.com/argoproj/argo-rollouts/issues/3676)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.19 to 1.27.22 ([#3680](https://github.com/argoproj/argo-rollouts/issues/3680)) +* **deps:** bump docker/build-push-action from 6.0.2 to 6.1.0 ([#3662](https://github.com/argoproj/argo-rollouts/issues/3662)) +* **deps:** bump docker/build-push-action from 6.0.0 to 6.0.2 ([#3659](https://github.com/argoproj/argo-rollouts/issues/3659)) +* **deps:** bump google.golang.org/grpc from 1.67.1 to 1.68.1 ([#3979](https://github.com/argoproj/argo-rollouts/issues/3979)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.18 to 1.27.19 ([#3646](https://github.com/argoproj/argo-rollouts/issues/3646)) +* **deps:** bump docker/build-push-action from 5.4.0 to 6.0.0 ([#3644](https://github.com/argoproj/argo-rollouts/issues/3644)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.38.6 to 1.38.7 ([#3647](https://github.com/argoproj/argo-rollouts/issues/3647)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.42.4 to 1.43.3 ([#3980](https://github.com/argoproj/argo-rollouts/issues/3980)) +* **deps:** bump github.com/spf13/cobra from 1.8.0 to 1.8.1 ([#3640](https://github.com/argoproj/argo-rollouts/issues/3640)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.38.0 to 1.38.6 ([#3619](https://github.com/argoproj/argo-rollouts/issues/3619)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.16 to 1.27.18 ([#3625](https://github.com/argoproj/argo-rollouts/issues/3625)) +* **deps:** bump google.golang.org/protobuf from 1.34.1 to 1.34.2 ([#3633](https://github.com/argoproj/argo-rollouts/issues/3633)) +* **deps:** bump codecov/codecov-action from 4.4.1 to 4.5.0 ([#3634](https://github.com/argoproj/argo-rollouts/issues/3634)) +* **deps:** bump docker/build-push-action from 5.3.0 to 5.4.0 ([#3624](https://github.com/argoproj/argo-rollouts/issues/3624)) +* **deps:** bump golang.org/x/oauth2 from 0.20.0 to 0.21.0 ([#3631](https://github.com/argoproj/argo-rollouts/issues/3631)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.31.1 to 1.31.3 ([#3620](https://github.com/argoproj/argo-rollouts/issues/3620)) +* **deps:** bump actions/setup-go from 5.0.0 to 5.0.1 ([#3552](https://github.com/argoproj/argo-rollouts/issues/3552)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.27.0 to 1.27.2 ([#3621](https://github.com/argoproj/argo-rollouts/issues/3621)) +* **deps:** bump docker/login-action from 3.1.0 to 3.2.0 ([#3604](https://github.com/argoproj/argo-rollouts/issues/3604)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.6.0 to 1.6.1 ([#3606](https://github.com/argoproj/argo-rollouts/issues/3606)) +* **deps:** bump google.golang.org/grpc from 1.63.2 to 1.64.0 ([#3607](https://github.com/argoproj/argo-rollouts/issues/3607)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.30.5 to 1.31.1 ([#3608](https://github.com/argoproj/argo-rollouts/issues/3608)) +* **deps:** bump golang.org/x/oauth2 from 0.19.0 to 0.20.0 ([#3554](https://github.com/argoproj/argo-rollouts/issues/3554)) +* **deps:** bump golangci/golangci-lint-action from 5 to 6 ([#3556](https://github.com/argoproj/argo-rollouts/issues/3556)) +* **deps:** bump google.golang.org/protobuf from 1.34.0 to 1.34.1 ([#3557](https://github.com/argoproj/argo-rollouts/issues/3557)) +* **deps:** bump softprops/action-gh-release from 2.0.4 to 2.0.5 ([#3561](https://github.com/argoproj/argo-rollouts/issues/3561)) +* **deps:** bump codecov/codecov-action from 4.3.1 to 4.4.1 ([#3588](https://github.com/argoproj/argo-rollouts/issues/3588)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.11 to 1.27.16 ([#3597](https://github.com/argoproj/argo-rollouts/issues/3597)) +* **deps:** update golang to 1.23 ([#3987](https://github.com/argoproj/argo-rollouts/issues/3987)) +* **deps:** bump google.golang.org/protobuf from 1.33.0 to 1.34.0 ([#3548](https://github.com/argoproj/argo-rollouts/issues/3548)) +* **deps:** bump codecov/codecov-action from 4.3.0 to 4.3.1 ([#3550](https://github.com/argoproj/argo-rollouts/issues/3550)) +* **deps:** bump codecov/codecov-action from 5.0.7 to 5.1.1 ([#3986](https://github.com/argoproj/argo-rollouts/issues/3986)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.37.0 to 1.38.0 ([#3525](https://github.com/argoproj/argo-rollouts/issues/3525)) +* **deps:** bump golangci/golangci-lint-action from 4 to 5 ([#3540](https://github.com/argoproj/argo-rollouts/issues/3540)) +* **deps:** bump sigstore/cosign-installer from 3.4.0 to 3.5.0 ([#3522](https://github.com/argoproj/argo-rollouts/issues/3522)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.10.0 to 2.0.0 ([#3537](https://github.com/argoproj/argo-rollouts/issues/3537)) +* **deps:** bump codecov/codecov-action from 4.2.0 to 4.3.0 ([#3517](https://github.com/argoproj/argo-rollouts/issues/3517)) +* **deps:** bump go version to 1.22 ([#3516](https://github.com/argoproj/argo-rollouts/issues/3516)) +* **deps:** bump google.golang.org/grpc from 1.63.0 to 1.63.2 ([#3512](https://github.com/argoproj/argo-rollouts/issues/3512)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.27.10 to 1.27.11 ([#3510](https://github.com/argoproj/argo-rollouts/issues/3510)) +* **deps:** bump peaceiris/actions-gh-pages from 3 to 4 ([#3513](https://github.com/argoproj/argo-rollouts/issues/3513)) +* **deps:** bump docker/setup-buildx-action from 3.2.0 to 3.3.0 ([#3514](https://github.com/argoproj/argo-rollouts/issues/3514)) +* **deps:** bump google.golang.org/grpc from 1.62.1 to 1.63.0 ([#3497](https://github.com/argoproj/argo-rollouts/issues/3497)) +* **deps:** bump github.com/prometheus/client_model from 0.6.0 to 0.6.1 ([#3499](https://github.com/argoproj/argo-rollouts/issues/3499)) +* **deps:** bump golang.org/x/oauth2 from 0.18.0 to 0.19.0 ([#3506](https://github.com/argoproj/argo-rollouts/issues/3506)) +* **deps:** bump codecov/codecov-action from 4.1.1 to 4.2.0 ([#3500](https://github.com/argoproj/argo-rollouts/issues/3500)) +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#3985](https://github.com/argoproj/argo-rollouts/issues/3985)) + +### Docs + +* fix broken links ([#3962](https://github.com/argoproj/argo-rollouts/issues/3962)) +* add descriptions for additional default trigger templates ([#3960](https://github.com/argoproj/argo-rollouts/issues/3960)) +* document dynamicStableScale ([#3978](https://github.com/argoproj/argo-rollouts/issues/3978)) +* add 7shifts to users.md ([#3965](https://github.com/argoproj/argo-rollouts/issues/3965)) +* add CarGurus to users.md ([#3940](https://github.com/argoproj/argo-rollouts/issues/3940)) +* Add technique for ConfigMap change detection in Rollout ([#3515](https://github.com/argoproj/argo-rollouts/issues/3515)) +* document canary step plugin (alpha) ([#3906](https://github.com/argoproj/argo-rollouts/issues/3906)) +* GTW API support changed to Gloo Gateway instead of GloodMesh ([#3914](https://github.com/argoproj/argo-rollouts/issues/3914)) +* Add Amadeus to Users.md ([#3527](https://github.com/argoproj/argo-rollouts/issues/3527)) +* add TBC Bank to USERS.md ([#3871](https://github.com/argoproj/argo-rollouts/issues/3871)) +* Update specification document ([#3877](https://github.com/argoproj/argo-rollouts/issues/3877)) +* clarify supported deployment strategies ([#3823](https://github.com/argoproj/argo-rollouts/issues/3823)) +* Update metric job docs with some of the available config options ([#3839](https://github.com/argoproj/argo-rollouts/issues/3839)) +* Clarify analysis count with value 0 ([#3847](https://github.com/argoproj/argo-rollouts/issues/3847)) +* fix a link to e2e.yaml ([#3834](https://github.com/argoproj/argo-rollouts/issues/3834)) +* Update Changelog ([#3788](https://github.com/argoproj/argo-rollouts/issues/3788)) +* remove obsolete roadmap page ([#3783](https://github.com/argoproj/argo-rollouts/issues/3783)) +* Update ephemeral-metadata.md with a small fix ([#3782](https://github.com/argoproj/argo-rollouts/issues/3782)) +* add Priceline to USERS.md ([#3764](https://github.com/argoproj/argo-rollouts/issues/3764)) +* added clarifications for short releases ([#3753](https://github.com/argoproj/argo-rollouts/issues/3753)) +* correct the case that autoPromotionSeconds feature is ignored ([#2388](https://github.com/argoproj/argo-rollouts/issues/2388)) +* copy omission in rollout docs ([#3690](https://github.com/argoproj/argo-rollouts/issues/3690)) +* Update Changelog ([#3666](https://github.com/argoproj/argo-rollouts/issues/3666)) +* Update Changelog ([#3632](https://github.com/argoproj/argo-rollouts/issues/3632)) +* provide recommendation for strategies ([#3531](https://github.com/argoproj/argo-rollouts/issues/3531)) +* Update Changelog ([#3507](https://github.com/argoproj/argo-rollouts/issues/3507)) +* **analysis:** new plugin is added to the documentation ([#3915](https://github.com/argoproj/argo-rollouts/issues/3915)) +* **analysis:** plugin url is changed and redirected to argoproj-labs project ([#3922](https://github.com/argoproj/argo-rollouts/issues/3922)) + +### Feat + +* New Prometheus metric: build_info ([#3591](https://github.com/argoproj/argo-rollouts/issues/3591)) +* support multi account Datadog metrics provider ([#3787](https://github.com/argoproj/argo-rollouts/issues/3787)) +* **analysis:** Add ConsecutiveSuccessLimit feature to Analysis ([#3970](https://github.com/argoproj/argo-rollouts/issues/3970)) +* **analysis:** Returns the resolved query as metadata in the New Relic provider ([#3715](https://github.com/argoproj/argo-rollouts/issues/3715)) +* **analysis:** Adds timeout property to NewRelic metrics provider. Resolves: [#3741](https://github.com/argoproj/argo-rollouts/issues/3741) ([#3742](https://github.com/argoproj/argo-rollouts/issues/3742)) +* **controller:** enable pprof profiling support ([#3769](https://github.com/argoproj/argo-rollouts/issues/3769)) +* **controller:** add canary steps plugin ([#3521](https://github.com/argoproj/argo-rollouts/issues/3521)) +* **controller:** Allow specifying full annotations for nginx canary ingresses. ([#3671](https://github.com/argoproj/argo-rollouts/issues/3671)) +* **dashboard:** change the color of the current rollout step ([#3526](https://github.com/argoproj/argo-rollouts/issues/3526)) +* **metricprovider:** credentials to download plugin ([#3905](https://github.com/argoproj/argo-rollouts/issues/3905)) +* **metricprovider:** add prometheus range query support ([#3704](https://github.com/argoproj/argo-rollouts/issues/3704)) + +### Fix + +* add update verb to ClusterRole permissions for scaleDown feature. Fixes [#3672](https://github.com/argoproj/argo-rollouts/issues/3672) ([#3675](https://github.com/argoproj/argo-rollouts/issues/3675)) +* e2e test results processing change key name to run-id ([#3744](https://github.com/argoproj/argo-rollouts/issues/3744)) +* Update loader-utils to 2.0.4 ([#3601](https://github.com/argoproj/argo-rollouts/issues/3601)) +* remove condition where header routes can stay directed at empty service in preemption ([#3898](https://github.com/argoproj/argo-rollouts/issues/3898)) +* add secrets so we can download across workflows ([#3746](https://github.com/argoproj/argo-rollouts/issues/3746)) +* rollout should skip timeout when paused ([#3711](https://github.com/argoproj/argo-rollouts/issues/3711)) +* check isScalingEvent only on stable and newRS ([#3883](https://github.com/argoproj/argo-rollouts/issues/3883)) +* rs conflict with fallback to patch ([#3559](https://github.com/argoproj/argo-rollouts/issues/3559)) +* verify the weight of the alb at the end of the rollout ([#3627](https://github.com/argoproj/argo-rollouts/issues/3627)) +* stop rollout from entering degraded state during blueGreen pause. Fixes [#3843](https://github.com/argoproj/argo-rollouts/issues/3843) ([#3845](https://github.com/argoproj/argo-rollouts/issues/3845)) +* when Rollout has pingpong and stable/canary service defined, only alb traffic management uses pingpong. ([#3628](https://github.com/argoproj/argo-rollouts/issues/3628)) +* protocol missing in ambassador canary mapping creation. Fixes [#3593](https://github.com/argoproj/argo-rollouts/issues/3593) ([#3603](https://github.com/argoproj/argo-rollouts/issues/3603)) +* Change indentation to properly render Markdown - fixes [#3509](https://github.com/argoproj/argo-rollouts/issues/3509) ([#3511](https://github.com/argoproj/argo-rollouts/issues/3511)) +* Add volume for plugin and tmp folder ([#3546](https://github.com/argoproj/argo-rollouts/issues/3546)) +* replicaSet not scaled down due to incorrect annotations ([#3762](https://github.com/argoproj/argo-rollouts/issues/3762)) ([#3784](https://github.com/argoproj/argo-rollouts/issues/3784)) +* don't default datadog aggregator ([#3643](https://github.com/argoproj/argo-rollouts/issues/3643)) +* Support kustomize v5 labels transformer. Fixes [#3105](https://github.com/argoproj/argo-rollouts/issues/3105) ([#3775](https://github.com/argoproj/argo-rollouts/issues/3775)) +* separate e2e and unit test reporting uploads ([#3747](https://github.com/argoproj/argo-rollouts/issues/3747)) +* retain non-nginx canary annotations. Fixes: [#1070](https://github.com/argoproj/argo-rollouts/issues/1070) ([#3806](https://github.com/argoproj/argo-rollouts/issues/3806)) +* docs site version selector broken ([#3590](https://github.com/argoproj/argo-rollouts/issues/3590)) +* **analysis:** explicitly set datadog aggregator to last only on v2 ([#3730](https://github.com/argoproj/argo-rollouts/issues/3730)) +* **analysis:** Take RollbackWindow into account when Reconciling Analysis Runs. Fixes [#3669](https://github.com/argoproj/argo-rollouts/issues/3669) ([#3670](https://github.com/argoproj/argo-rollouts/issues/3670)) +* **controller:** use the stableRS from the rollout context rather tha… ([#3664](https://github.com/argoproj/argo-rollouts/issues/3664)) +* **controller:** weighted experiment validation should allow delegating to trafficRouter plugins ([#3909](https://github.com/argoproj/argo-rollouts/issues/3909)) +* **controller:** Corrects the logic of comparing sha256 has. Fixes [#3519](https://github.com/argoproj/argo-rollouts/issues/3519) ([#3520](https://github.com/argoproj/argo-rollouts/issues/3520)) +* **controller:** Get the right resourceName for traefik.io.Fixes [#3615](https://github.com/argoproj/argo-rollouts/issues/3615) ([#3759](https://github.com/argoproj/argo-rollouts/issues/3759)) +* **controller:** fix race condition in updating ephemeral metadata ([#3975](https://github.com/argoproj/argo-rollouts/issues/3975)) +* **dashboard:** Update pod status logic to support native sidecars. Fixes [#3366](https://github.com/argoproj/argo-rollouts/issues/3366) ([#3639](https://github.com/argoproj/argo-rollouts/issues/3639)) +* **dashboard:** No redirect loop when running on root. Fixes [#3967](https://github.com/argoproj/argo-rollouts/issues/3967) ([#3968](https://github.com/argoproj/argo-rollouts/issues/3968)) +* **dashboard:** parse analysis values with JSON5 to handle NaN. Fixes [#2758](https://github.com/argoproj/argo-rollouts/issues/2758) ([#3801](https://github.com/argoproj/argo-rollouts/issues/3801)) +* **dashboard:** analysis modal crashed when value not valid ([#3881](https://github.com/argoproj/argo-rollouts/issues/3881)) +* **dashboard:** Cleanup viewcontroller after each request. Fixes [#2095](https://github.com/argoproj/argo-rollouts/issues/2095) ([#3966](https://github.com/argoproj/argo-rollouts/issues/3966)) +* **metricprovider:** fix handling null values in datadog ([#3893](https://github.com/argoproj/argo-rollouts/issues/3893)) +* **metricprovider:** reuse http.Transport for http.Client ([#3780](https://github.com/argoproj/argo-rollouts/issues/3780)) +* **trafficrouting:** add nil check for desired annotations map in ALB… ([#3853](https://github.com/argoproj/argo-rollouts/issues/3853)) +* **trafficrouting:** Fix downtime on initial deployment using Istio DestinationRule Subsets. Fixes [#2507](https://github.com/argoproj/argo-rollouts/issues/2507) ([#3602](https://github.com/argoproj/argo-rollouts/issues/3602)) + + ## [v1.7.2](https://github.com/argoproj/argo-rollouts/compare/v1.7.1...v1.7.2) (2024-08-12) @@ -1002,3 +1239,4 @@ There was an unintentional change in behavior related to service creation with e ### Fixes * **controller:** istio dropping fields not defined in type ([#2268](https://github.com/argoproj/argo-rollouts/issues/2268)) + diff --git a/Dockerfile b/Dockerfile index ffd0244abc..ae5df9fa2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM --platform=$BUILDPLATFORM golang:1.22 AS builder +FROM --platform=$BUILDPLATFORM golang:1.23 AS builder RUN apt-get update && apt-get install -y \ wget \ @@ -12,7 +12,7 @@ RUN apt-get update && apt-get install -y \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Install golangci-lint -RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.57.2 && \ +RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.61.0 && \ golangci-lint linters COPY .golangci.yml ${GOPATH}/src/dummy/.golangci.yml @@ -40,7 +40,7 @@ RUN NODE_ENV='production' yarn build #################################################################################################### # Rollout Controller Build stage which performs the actual build of argo-rollouts binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM golang:1.22 AS argo-rollouts-build +FROM --platform=$BUILDPLATFORM golang:1.23 AS argo-rollouts-build WORKDIR /go/src/github.com/argoproj/argo-rollouts diff --git a/USERS.md b/USERS.md index 13af9b9400..211b65ab32 100644 --- a/USERS.md +++ b/USERS.md @@ -2,6 +2,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR with your organization name if you are using Argo Rollouts. +1. [7shifts](https://www.7shifts.com) 1. [Ada](https://www.ada.cx) 1. [ADP](https://www.adp.com) 1. [Akuity](https://akuity.io/) @@ -41,6 +42,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [PagerDuty](https://www.pagerduty.com/) 1. [PayPal](https://www.paypal.com/) 1. [PayPay](https://paypay.ne.jp/) +1. [Plaid](https://plaid.com/) 1. [Priceline](https://priceline.com) 1. [Productboard](https://www.productboard.com) 1. [Quipper](https://www.quipper.com/) @@ -51,6 +53,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Skillz](https://www.skillz.com) 1. [Spotify](https://www.spotify.com/) 1. [Synamedia](https://www.synamedia.com) +1. [Taboola](https://www.taboola.com) 1. [TBC Bank](https://tbcbank.ge/) 1. [Trustly](https://www.trustly.com/) 1. [Tuhu](https://www.tuhu.cn/) diff --git a/analysis/analysis.go b/analysis/analysis.go index b603d9f1ae..567998149c 100644 --- a/analysis/analysis.go +++ b/analysis/analysis.go @@ -387,17 +387,21 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa metricResult.Successful++ metricResult.Count++ metricResult.ConsecutiveError = 0 + metricResult.ConsecutiveSuccess++ case v1alpha1.AnalysisPhaseFailed: metricResult.Failed++ metricResult.Count++ metricResult.ConsecutiveError = 0 + metricResult.ConsecutiveSuccess = 0 case v1alpha1.AnalysisPhaseInconclusive: metricResult.Inconclusive++ metricResult.Count++ metricResult.ConsecutiveError = 0 + metricResult.ConsecutiveSuccess = 0 case v1alpha1.AnalysisPhaseError: metricResult.Error++ metricResult.ConsecutiveError++ + metricResult.ConsecutiveSuccess = 0 logger.Warnf("Measurement had error: %s", newMeasurement.Message) } } @@ -599,11 +603,47 @@ func assessMetricStatus(metric v1alpha1.Metric, result v1alpha1.MetricResult, te return phaseFailureInconclusiveOrError } + // Check if consecutiveSuccessLimit is applicable and was reached. + if metric.ConsecutiveSuccessLimit != nil && metric.ConsecutiveSuccessLimit.IntValue() > 0 && result.ConsecutiveSuccess >= int32(metric.ConsecutiveSuccessLimit.IntValue()) { + logger.Infof("Metric Assessment Result - %s: ConsecutiveSuccessLimit (%s) Reached", v1alpha1.AnalysisPhaseSuccessful, metric.ConsecutiveSuccessLimit.String()) + return v1alpha1.AnalysisPhaseSuccessful + } + // If a count was specified, and we reached that count, then metric is considered Successful. // The Error, Failed, Inconclusive counters are ignored because those checks have already been // taken into consideration above, and we do not want to fail if failures < failureLimit. effectiveCount := metric.EffectiveCount() if effectiveCount != nil && result.Count >= int32(effectiveCount.IntValue()) { + + failureApplicable := (metric.FailureLimit != nil && metric.FailureLimit.IntValue() >= 0) || metric.FailureLimit == nil + successApplicable := metric.ConsecutiveSuccessLimit != nil && metric.ConsecutiveSuccessLimit.IntValue() > 0 + + if failureApplicable && successApplicable { + + // failureLimit was checked above and not reached. + // consecutiveSuccessLimit was checked above and not reached. + + failureLimit := "0" + if metric.FailureLimit != nil { + failureLimit = metric.FailureLimit.String() + } + + logger.Infof("Metric Assessment Result - %s: ConsecutiveSuccessLimit (%s) Not Reached and FailureLimit (%s) Not Violated", v1alpha1.AnalysisPhaseInconclusive, metric.ConsecutiveSuccessLimit.String(), failureLimit) + return v1alpha1.AnalysisPhaseInconclusive + + } else if successApplicable { + + logger.Infof("Metric Assessment Result - %s: ConsecutiveSuccessLimit (%s) Not Reached", v1alpha1.AnalysisPhaseFailed, metric.ConsecutiveSuccessLimit.String()) + return v1alpha1.AnalysisPhaseFailed + + } else if failureApplicable { + // failureLimit was not reached in assessMetricFailureInconclusiveOrError above. + // AnalysisPhaseSuccessful below. + } else { + // This cannot happen, since one of failureLimit or consecutiveSuccessLimit will be applicable + // We validate that failureLimit >= 0 when consecutiveSuccessLimit == 0 + } + logger.Infof("Metric Assessment Result - %s: Count (%s) Reached", v1alpha1.AnalysisPhaseSuccessful, effectiveCount.String()) return v1alpha1.AnalysisPhaseSuccessful } @@ -623,7 +663,8 @@ func assessMetricFailureInconclusiveOrError(metric v1alpha1.Metric, result v1alp if metric.FailureLimit != nil { failureLimit = int32(metric.FailureLimit.IntValue()) } - if result.Failed > failureLimit { + // If failureLimit is negative, that means it isn't applicable. + if failureLimit >= 0 && result.Failed > failureLimit { phase = v1alpha1.AnalysisPhaseFailed message = fmt.Sprintf("failed (%d) > failureLimit (%d)", result.Failed, failureLimit) } diff --git a/analysis/analysis_test.go b/analysis/analysis_test.go index 5b15af7782..07bacd5dd8 100644 --- a/analysis/analysis_test.go +++ b/analysis/analysis_test.go @@ -594,6 +594,208 @@ func TestAssessMetricStatusFailureLimit(t *testing.T) { // max failures assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) } +func TestAssessMetricStatusConsecutiveSuccessLimit(t *testing.T) { + failureLimit := intstr.FromInt(-1) + consecutiveSuccessLimit := intstr.FromInt(3) + metric := v1alpha1.Metric{ + Name: "success-rate", + ConsecutiveSuccessLimit: &consecutiveSuccessLimit, + FailureLimit: &failureLimit, + Interval: "60s", + } + result := v1alpha1.MetricResult{ + Failed: 3, + Successful: 4, + ConsecutiveSuccess: 3, + Count: 7, + Measurements: []v1alpha1.Measurement{{ + Value: "99", + Phase: v1alpha1.AnalysisPhaseFailed, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }}, + } + + ///////////////////////////////////////////////////////////////////////// + // For indefinite analysis (count is not set) + + // When ConsecutiveSuccess == ConsecutiveSuccessLimit + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + // When ConsecutiveSuccess < ConsecutiveSuccessLimit + consecutiveSuccessLimit = intstr.FromInt(5) + metric.ConsecutiveSuccessLimit = &consecutiveSuccessLimit + assert.Equal(t, v1alpha1.AnalysisPhaseRunning, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + ///////////////////////////////////////////////////////////////////////// + // For limited analysis (count is >= 1) + + /// When metric.Count is reached + metricCount := intstr.FromInt(7) + metric.Count = &metricCount + + //// ConsecutiveSuccess=3 < ConsecutiveSuccessLimit=5 + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + //// ConsecutiveSuccess = ConsecutiveSuccessLimit = 3 + consecutiveSuccessLimit = intstr.FromInt(3) + metric.ConsecutiveSuccessLimit = &consecutiveSuccessLimit + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + /// When metric.Count is not reached + metricCount = intstr.FromInt(9) + metric.Count = &metricCount + + //// ConsecutiveSuccess = ConsecutiveSuccessLimit = 3 + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + //// ConsecutiveSuccess=3 < ConsecutiveSuccessLimit=5 + consecutiveSuccessLimit = intstr.FromInt(5) + metric.ConsecutiveSuccessLimit = &consecutiveSuccessLimit + assert.Equal(t, v1alpha1.AnalysisPhaseRunning, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) +} + +func TestAssessMetricStatusFailureLimitAndConsecutiveSuccessLimit(t *testing.T) { + failureLimit := intstr.FromInt(4) + consecutiveSuccessLimit := intstr.FromInt(4) + metric := v1alpha1.Metric{ + Name: "success-rate", + ConsecutiveSuccessLimit: &consecutiveSuccessLimit, + FailureLimit: &failureLimit, + Interval: "60s", + } + result := v1alpha1.MetricResult{ + Failed: 3, + Successful: 4, + ConsecutiveSuccess: 3, + Count: 7, + Measurements: []v1alpha1.Measurement{{ + Value: "99", + Phase: v1alpha1.AnalysisPhaseFailed, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }}, + } + + ///////////////////////////////////////////////////////////////////////// + // For indefinite analysis (count is not set) + + // FailureLimit is not violated and consecutiveSuccessLimit not yet satisfied. + assert.Equal(t, v1alpha1.AnalysisPhaseRunning, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + // FailureLimit is violated and consecutiveSuccessLimit is not yet satisfied. + result.Failed = 5 + result.Successful = 9 + result.Count = 9 + result.ConsecutiveSuccess = 0 + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + // FailureLimit is not violated and consecutiveSuccessLimit is satisfied. + result.Failed = 3 + result.Successful = 5 + result.Count = 8 + result.ConsecutiveSuccess = 4 + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + // FailureLimit is violated and consecutiveSuccessLimit is satisfied. + result.Failed = 5 + result.Successful = 5 + result.Count = 10 + result.ConsecutiveSuccess = 4 + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + ///////////////////////////////////////////////////////////////////////// + // For limited analysis (count is >= 1) + metricCount := intstr.FromInt(10) + metric.Count = &metricCount + + /// When metric.Count is reached + + //// FailureLimit is not violated and consecutiveSuccessLimit not yet satisfied. + result.Failed = 4 + result.Successful = 6 + result.Count = 10 + result.ConsecutiveSuccess = 3 + + assert.Equal(t, v1alpha1.AnalysisPhaseInconclusive, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseInconclusive, assessMetricStatus(metric, result, true)) + + //// FailureLimit is violated and consecutiveSuccessLimit is not yet satisfied. + result.Failed = 5 + result.Successful = 5 + result.Count = 10 + result.ConsecutiveSuccess = 3 + + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + //// FailureLimit is not violated and consecutiveSuccessLimit is satisfied. + result.Failed = 4 + result.Successful = 6 + result.Count = 10 + result.ConsecutiveSuccess = 4 + + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + //// FailureLimit is violated and consecutiveSuccessLimit is satisfied. + result.Failed = 5 + result.Successful = 5 + result.Count = 10 + result.ConsecutiveSuccess = 4 + + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + /// When metric.Count is not yet reached + + //// FailureLimit is not violated and consecutiveSuccessLimit not yet satisfied. + result.Failed = 3 + result.Successful = 5 + result.Count = 8 + result.ConsecutiveSuccess = 3 + + assert.Equal(t, v1alpha1.AnalysisPhaseRunning, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + //// FailureLimit is violated and consecutiveSuccessLimit is not yet satisfied. + result.Failed = 5 + result.Successful = 3 + result.Count = 8 + result.ConsecutiveSuccess = 3 + + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) + + //// FailureLimit is not violated and consecutiveSuccessLimit is satisfied. + result.Failed = 3 + result.Successful = 5 + result.Count = 8 + result.ConsecutiveSuccess = 4 + + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, assessMetricStatus(metric, result, true)) + + //// FailureLimit is violated and consecutiveSuccessLimit is satisfied. + result.Failed = 5 + result.Successful = 4 + result.Count = 9 + result.ConsecutiveSuccess = 4 + + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, false)) + assert.Equal(t, v1alpha1.AnalysisPhaseFailed, assessMetricStatus(metric, result, true)) +} + func TestAssessMetricStatusInconclusiveLimit(t *testing.T) { inconclusiveLimit := intstr.FromInt(2) metric := v1alpha1.Metric{ diff --git a/controller/controller.go b/controller/controller.go index e9509cd78e..0e7a0a8cae 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -238,7 +238,7 @@ func NewAnalysisManager( log.Fatalf("Failed to init config: %v", err) } - err = plugin.DownloadPlugins(plugin.FileDownloaderImpl{}) + err = plugin.DownloadPlugins(plugin.FileDownloaderImpl{}, kubeclientset) if err != nil { log.Fatalf("Failed to download plugins: %v", err) } @@ -444,7 +444,7 @@ func NewManager( log.Fatalf("Failed to init config: %v", err) } - err = plugin.DownloadPlugins(plugin.FileDownloaderImpl{}) + err = plugin.DownloadPlugins(plugin.FileDownloaderImpl{}, kubeclientset) if err != nil { log.Fatalf("Failed to download plugins: %v", err) } diff --git a/controller/controller_test.go b/controller/controller_test.go index 0f94131c96..8bd9582fba 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -274,6 +274,40 @@ func TestNewManager(t *testing.T) { assert.NotNil(t, cm) } +func TestNewAnalysisManager(t *testing.T) { + f := newFixture(t) + + i := informers.NewSharedInformerFactory(f.client, noResyncPeriodFunc()) + k8sI := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) + + scheme := runtime.NewScheme() + listMapping := map[schema.GroupVersionResource]string{} + dynamicClient := dynamicfake.NewSimpleDynamicClientWithCustomListKinds(scheme, listMapping) + dynamicInformerFactory := dynamicinformer.NewDynamicSharedInformerFactory(dynamicClient, 0) + + k8sRequestProvider := &metrics.K8sRequestsCountProvider{} + cm := NewAnalysisManager( + "default", + f.kubeclient, + f.client, + k8sI.Batch().V1().Jobs(), + i.Argoproj().V1alpha1().AnalysisRuns(), + i.Argoproj().V1alpha1().AnalysisTemplates(), + i.Argoproj().V1alpha1().ClusterAnalysisTemplates(), + noResyncPeriodFunc(), + 8090, + 8080, + k8sRequestProvider, + nil, + dynamicInformerFactory, + false, + nil, + nil, + ) + + assert.NotNil(t, cm) +} + func TestPrimaryController(t *testing.T) { f := newFixture(t) diff --git a/controller/metrics/metrics.go b/controller/metrics/metrics.go index 9691b73a40..d06fbbfe37 100644 --- a/controller/metrics/metrics.go +++ b/controller/metrics/metrics.go @@ -2,6 +2,7 @@ package metrics import ( "net/http" + "runtime" "time" "github.com/argoproj/argo-rollouts/utils/defaults" @@ -16,6 +17,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rolloutlister "github.com/argoproj/argo-rollouts/pkg/client/listers/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/log" + "github.com/argoproj/argo-rollouts/utils/version" ) type MetricsServer struct { @@ -39,6 +41,16 @@ const ( MetricsPath = "/metrics" ) +var ( + buildInfo = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "build_info", + Help: "A metric with a constant '1' value labeled by version from which Argo-Rollouts was built.", + }, + []string{"version", "goversion", "goarch", "commit"}, + ) +) + type ServerConfig struct { Addr string RolloutLister rolloutlister.RolloutLister @@ -74,6 +86,9 @@ func NewMetricsServer(cfg ServerConfig) *MetricsServer { reg.MustRegister(MetricNotificationFailedTotal) reg.MustRegister(MetricNotificationSend) reg.MustRegister(MetricVersionGauge) + reg.MustRegister(buildInfo) + + recordBuildInfo() mux.Handle(MetricsPath, promhttp.HandlerFor(prometheus.Gatherers{ // contains app controller specific metrics @@ -174,6 +189,12 @@ func (m *MetricsServer) Remove(namespace string, name string, kind string) { } +// recordBuildInfo publishes information about Argo-Rollouts version and runtime info through an info metric (gauge). +func recordBuildInfo() { + vers := version.GetVersion() + buildInfo.WithLabelValues(vers.Version, runtime.Version(), runtime.GOARCH, vers.GitCommit).Set(1) +} + func boolFloat64(b bool) float64 { if b { return 1 diff --git a/controller/profiling.go b/controller/profiling.go index 03920906ac..cf5af5e60f 100644 --- a/controller/profiling.go +++ b/controller/profiling.go @@ -1,24 +1,21 @@ package controller import ( - "fmt" "net/http" "net/http/pprof" ) -const ( - ProfilingPath = "/debug/pprof" -) - // NewPProfServer returns a new pprof server to gather runtime profiling data func NewPProfServer() *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc(ProfilingPath, pprof.Index) - mux.HandleFunc(fmt.Sprintf("%s/cmdline", ProfilingPath), pprof.Cmdline) - mux.HandleFunc(fmt.Sprintf("%s/profile", ProfilingPath), pprof.Profile) - mux.HandleFunc(fmt.Sprintf("%s/symbol", ProfilingPath), pprof.Symbol) - mux.HandleFunc(fmt.Sprintf("%s/trace", ProfilingPath), pprof.Trace) + // TODO: Remove enumerating all pprof endpoints if/when a more ergonomic + // attachment solution is introduced. See: https://github.com/golang/go/issues/71213. + mux.HandleFunc("/debug/pprof/", pprof.Index) + mux.HandleFunc("/debug/pprof/cmdline/", pprof.Cmdline) + mux.HandleFunc("/debug/pprof/profile/", pprof.Profile) + mux.HandleFunc("/debug/pprof/symbol/", pprof.Symbol) + mux.HandleFunc("/debug/pprof/trace/", pprof.Trace) return mux } diff --git a/docs/analysis/plugins.md b/docs/analysis/plugins.md index 82f63183ad..e1356bf447 100644 --- a/docs/analysis/plugins.md +++ b/docs/analysis/plugins.md @@ -65,8 +65,34 @@ data: - name: "argoproj-labs/sample-prometheus" # name of the plugin, it must match the name required by the plugin so it can find it's configuration location: "https://github.com/argoproj-labs/rollouts-plugin-metric-sample-prometheus/releases/download/v0.0.4/metric-plugin-linux-amd64" # supports http(s):// urls and file:// sha256: "dac10cbf57633c9832a17f8c27d2ca34aa97dd3d" #optional sha256 checksum of the plugin executable + headersFrom: #optional headers for the download via http request + - secretRef: + name: secret-name +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-name +stringData: + Authorization: Basic + My-Header: value ``` + + +## Some words of caution + +Depending on which method you use to install and the plugin, there are some things to be aware of. +The rollouts controller will not start if it can not download or find the plugin executable. This means that if you are using +a method of installation that requires a download of the plugin and the server hosting the plugin for some reason is not available and the rollouts +controllers pod got deleted while the server was down or is coming up for the first time, it will not be able to start until +the server hosting the plugin is available again. + +Argo Rollouts will download the plugin at startup only once but if the pod is deleted it will need to download the plugin again on next startup. Running +Argo Rollouts in HA mode can help a little with this situation because each pod will download the plugin at startup. So if a single pod gets +deleted during a server outage, the other pods will still be able to take over because there will already be a plugin executable available to it. It is the +responsibility of the Argo Rollouts administrator to define the plugin installation method considering the risks of each approach. + ## List of Available Plugins (alphabetical order) If you have created a plugin, please submit a PR to add it to this list. diff --git a/docs/features/analysis.md b/docs/features/analysis.md index bc54c88c43..3afbb42b68 100644 --- a/docs/features/analysis.md +++ b/docs/features/analysis.md @@ -759,6 +759,67 @@ The entire analysis run is considered as Failed after three failed measurements. )) ``` +## ConsecutiveSuccessLimit and FailureLimit + +!!! important + `consecutiveSuccessLimit` available since v1.8 + +You can use either `failureLimit` to define a limit for the number of failures before the analysis is considered failed, `consecutiveSuccessLimit` to define the required consecutive number of successes for the analysis to succeed, or both together. One of them has to be applicable (i.e. not disabled, see below for more), otherwise a validation error is thrown. + +To disable: + + * `failureLimit`, set the field to `-1`. + * `consecutiveSuccessLimit`, set the field to `0` (the default value). + +The default value for both is `0`, the meaning of which differs for each one of them. A value of `0` for `failureLimit` means its logic _is_ applicable and no failures are tolerated. However, a value of `0` for `consecutiveSuccessLimit` means it's inapplicable or disabled. + +Let's go through each case and show what the behavior would look like. + +### Only FailureLimit applicable + +The behavior is shown above in the [Failure Conditions and Failure Limit](#failure-conditions-and-failure-limit) section. This is the default behavior if you set nothing of the two fields (with `failureLimit` having a default value of `0`, so no failures are tolerated). + + +### Only ConsecutiveSuccessLimit applicable + +To have this behavior, you need to have something like +```yaml +failureLimit: -1 +consecutiveSuccessLimit: 4 # Any value > 0 +``` + +This behavior is essentially waiting for a condition to hold, or an event to happen. That is, keep measuring a metric and keep failing until you measure `N` consecutive successful measurements, at which point the analysis concludes successfully. This can be useful as an event-driven way of promoting a rollout when used in an inline analysis. + + +### Both FailureLimit and ConsecutiveSuccessLimit applicable + +To have this behavior, you need to have something like +```yaml +failureLimit: 3 # Any value >= 0 +consecutiveSuccessLimit: 4 # Any value > 0 +``` + +The behavior is simply waiting to measure `N` consecutive successful measurements, _while_ being limited by the number of overall failures specified by `failureLimit`. Above, we need to have at most 3 failures before we get 4 consecutive successful measurements for the analysis to be considered successful. + + +In case of an analysis that has `count` specified (that is, runs for a specific amount of time) and that `count` is reached, the evaluation of success is as follows: + + * `failureLimit` is violated and `consecutiveSuccessLimit` is satisfied: Failure. + * `failureLimit` is violated and `consecutiveSuccessLimit` is not satisfied: Failure. + * `failureLimit` is not violated and `consecutiveSuccessLimit` is satisfied: Success. + * `failureLimit` is not violated and `consecutiveSuccessLimit` is not satisfied: Inconclusive State. + +As illustrated, `failureLimit` takes priority if violated. However, if neither is violated/satisfied, the analysis reaches an inconclusive state. + + +!!! note + When terminating analyses prematurely, they are always terminated successfully, unless it happens that `failureLimit` is enabled and violated, then they terminate in failure. `consecutiveSuccessLimit`, if enabled, doesn't affect the termination status. + + For more clarity, examples of analyses terminated "prematurely": + + * A background analysis with `count` not specified when terminated at the end of the rollout. + * Any analysis with `count` specified and not yet reached when the rollout is aborted. + ## Dry-Run Mode !!! important diff --git a/docs/features/ephemeral-metadata.md b/docs/features/ephemeral-metadata.md index 346aac31d8..a8a9dd7028 100644 --- a/docs/features/ephemeral-metadata.md +++ b/docs/features/ephemeral-metadata.md @@ -2,19 +2,31 @@ !!! important - Available for canary rollouts since v0.10.0 + This is an **optional** feature of Argo Rollouts that allows you to have more visibility while a rollout is in progress. You do **NOT** need to use emphemeral metadata in order to achieve the main functionality of Argo Rollouts. -!!! important +Normally during a deployment, Argo Rollouts automatically handles the pods of the new and old versions along with their labels and their association with your traffic provider (if you use one). + +In some scenarios however, - Available for blue-green rollouts since v1.0 +1. You might want to annotate the pods of each version with your own custom labels +1. You may want the application itself know when a deployment is happening -One use case is for a Rollout to label or annotate the desired/stable pods with user-defined + +Argo Rollouts gives you the capability to label or annotate the desired/stable pods with user-defined labels/annotations, for _only_ the duration which they are the desired or stable set, and for the labels to be updated/removed as soon as the ReplicaSet switches roles (e.g. from desired to stable). -The use case which this enables, is to allow prometheus, wavefront, datadog queries and dashboards + +In the first use case this allows prometheus, wavefront, datadog queries and dashboards to be built, which can rely on a consistent list of labels, rather than the `rollouts-pod-template-hash` which is unpredictable and changing from revision to revision. +In the second use case you can have your application read the labels itself using the [Kubernetes Downward API](https://kubernetes.io/docs/concepts/workloads/pods/downward-api/) and adjust +its behavior automatically only for the duration of the canary/blue/green deployment. For example you could point your application +to a different Queue server while the application pods are in "preview" and only use the production instance of your Queue server +when the pods are marked as "stable". + +## Using Ephemeral labels + A Rollout using the canary strategy has the ability to attach ephemeral metadata to the stable or canary Pods using the `stableMetadata` and `canaryMetadata` fields respectively. @@ -47,12 +59,14 @@ spec: During an update, the Rollout will create the desired ReplicaSet while also merging the metadata defined in `canaryMetadata`/`previewMetadata` to the desired ReplicaSet's `spec.template.metadata`. -This results in all Pods of the ReplicaSet being created with the desired metadata. When the rollout +This results in all Pods of the ReplicaSet being created with the desired metadata. + +When the rollout becomes fully promoted, the desired ReplicaSet becomes the stable, and is updated to use the labels and annotations under `stableMetadata`/`activeMetadata`. The Pods of the ReplicaSet will then be updated _in place_ to use the stable metadata (without recreating the pods). -!!! important +!!! tip In order for tooling to take advantage of this feature, they would need to recognize the change in labels and/or annotations that happen _after_ the Pod has already started. Not all tools may detect - this. + this. For application code apart from the Kubernetes Downward API you also need a programming library that automatically reloads configuration files when they change their contents. diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 6798ef3c1a..edff0c7931 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -105,6 +105,17 @@ ], "x-kubernetes-int-or-string": true }, + "consecutiveSuccessLimit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "x-kubernetes-int-or-string": true + }, "count": { "anyOf": [ { @@ -4971,6 +4982,17 @@ ], "x-kubernetes-int-or-string": true }, + "consecutiveSuccessLimit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "x-kubernetes-int-or-string": true + }, "count": { "anyOf": [ { @@ -9850,6 +9872,17 @@ ], "x-kubernetes-int-or-string": true }, + "consecutiveSuccessLimit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "x-kubernetes-int-or-string": true + }, "count": { "anyOf": [ { diff --git a/docs/features/notifications.md b/docs/features/notifications.md index 5574ab566f..2fc4d33f1b 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -70,7 +70,12 @@ To enable you need to add a flag to the controller `--self-service-notification- Currently the following triggers have [built-in templates](https://github.com/argoproj/argo-rollouts/tree/master/manifests/notifications). +* `on-analysis-run-error` when an error occurs during the execution of an analysis run +* `on-analysis-run-failed` when an analysis run fails +* `on-analysis-run-running` when an analysis run is running +* `on-rollout-aborted` when a rollout process is aborted before completion. * `on-rollout-completed` when a rollout is finished and all its steps are completed +* `on-rollout-paused` when a rollout is paused * `on-rollout-step-completed` when an individual step inside a rollout definition is completed * `on-rollout-updated` when a rollout definition is changed * `on-scaling-replica-set` when the number of replicas in a rollout is changed @@ -141,8 +146,8 @@ add blocks and attachments for Slack, subject for Email or URL path, and body fo In addition to custom notification template administrator and configure custom triggers. Custom trigger defines the condition when the notification should be sent. The definition includes name, condition and notification templates reference. The condition is a predicate expression that returns true if the notification should be sent. The trigger condition -evaluation is powered by [antonmedv/expr](https://github.com/antonmedv/expr). -The condition language syntax is described at [Language-Definition.md](https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md). +evaluation is powered by [expr-lang/expr](https://github.com/expr-lang/expr). +The condition language syntax is described at [Language-Definition.md](https://github.com/expr-lang/expr/blob/master/docs/language-definition.md). The trigger is configured in `argo-rollouts-notification-configmap` ConfigMap. For example the following trigger sends a notification when rollout pod spec uses `argoproj/rollouts-demo:purple` image: @@ -165,4 +170,4 @@ Each condition might use several templates. Typically each template is responsib The following prometheus metrics are emitted when notifications are enabled in argo-rollouts. - notification_send_success is a counter that measures how many times the notification is sent successfully. - notification_send_error is a counter that measures how many times the notification failed to send. -- notification_send is a histogram that measures performance of sending notification. \ No newline at end of file +- notification_send is a histogram that measures performance of sending notification. diff --git a/docs/features/specification.md b/docs/features/specification.md index c4e7b3c1d0..c99ff3d627 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -447,6 +447,11 @@ spec: # 0 means canary pods are not scaled down. Default is 30 seconds. abortScaleDownDelaySeconds: 30 + # Automatically reduce the number of stable pods as the number of canary pods increases + # Only available when traffic routing is used. Default value is false meaning that as more canary pods + # are created the number of stable pods stays the same. + dynamicStableScale: false + status: pauseConditions: - reason: StepPause diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index 51d982417a..1d726ff67f 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -65,6 +65,17 @@ data: - name: "argoproj-labs/sample-nginx" # name of the plugin, it must match the name required by the plugin so it can find it's configuration location: "https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-sample-nginx/releases/download/v0.0.1/metric-plugin-linux-amd64" # supports http(s):// urls and file:// sha256: "08f588b1c799a37bbe8d0fc74cc1b1492dd70b2c" #optional sha256 checksum of the plugin executable + headersFrom: #optional headers for the download via http request + - secretRef: + name: secret-name +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-name +stringData: + Authorization: Basic + My-Header: value ``` ## List of Available Plugins (alphabetical order) diff --git a/experiments/controller.go b/experiments/controller.go index 3aa1519e46..b3c0c56329 100644 --- a/experiments/controller.go +++ b/experiments/controller.go @@ -5,6 +5,8 @@ import ( "sync" "time" + corev1 "k8s.io/api/core/v1" + log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -318,6 +320,7 @@ func (ec *Controller) syncHandler(ctx context.Context, key string) error { } func (ec *Controller) persistExperimentStatus(orig *v1alpha1.Experiment, newStatus *v1alpha1.ExperimentStatus) error { + prevStatus := orig.Status ctx := context.TODO() logCtx := logutil.WithExperiment(orig) patch, modified, err := diff.CreateTwoWayMergePatch( @@ -336,15 +339,27 @@ func (ec *Controller) persistExperimentStatus(orig *v1alpha1.Experiment, newStat return nil } logCtx.Debugf("Experiment Patch: %s", patch) - _, err = ec.argoProjClientset.ArgoprojV1alpha1().Experiments(orig.Namespace).Patch(ctx, orig.Name, patchtypes.MergePatchType, patch, metav1.PatchOptions{}) + patched, err := ec.argoProjClientset.ArgoprojV1alpha1().Experiments(orig.Namespace).Patch(ctx, orig.Name, patchtypes.MergePatchType, patch, metav1.PatchOptions{}) if err != nil { logCtx.Warningf("Error updating experiment: %v", err) return err } logCtx.Info("Patch status successfully") + ec.recordEvent(patched, prevStatus, newStatus) return nil } +func (ec *Controller) recordEvent(ex *v1alpha1.Experiment, prevStatus v1alpha1.ExperimentStatus, newStatus *v1alpha1.ExperimentStatus) { + if prevStatus.Phase != newStatus.Phase { + eventType := corev1.EventTypeNormal + switch newStatus.Phase { + case v1alpha1.AnalysisPhaseError, v1alpha1.AnalysisPhaseFailed, v1alpha1.AnalysisPhaseInconclusive: + eventType = corev1.EventTypeWarning + } + ec.recorder.Eventf(ex, record.EventOptions{EventType: eventType, EventReason: "Experiment" + string(newStatus.Phase)}, "Experiment transitioned from %s -> %s", prevStatus.Phase, newStatus.Phase) + } +} + // enqueueIfCompleted conditionally enqueues the AnalysisRun's Experiment if the run is complete func (ec *Controller) enqueueIfCompleted(obj any) { run := unstructuredutil.ObjectToAnalysisRun(obj) diff --git a/experiments/experiment.go b/experiments/experiment.go index 1b40464015..b27ed5326a 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -523,7 +523,6 @@ func (ec *experimentContext) ResolveAnalysisRunArgs(args []v1alpha1.Argument) ([ } func (ec *experimentContext) calculateStatus() *v1alpha1.ExperimentStatus { - prevStatus := ec.newStatus.DeepCopy() switch ec.newStatus.Phase { case "": ec.newStatus.Phase = v1alpha1.AnalysisPhasePending @@ -568,14 +567,6 @@ func (ec *experimentContext) calculateStatus() *v1alpha1.ExperimentStatus { } } ec.newStatus = calculateExperimentConditions(ec.ex, *ec.newStatus) - if prevStatus.Phase != ec.newStatus.Phase { - eventType := corev1.EventTypeNormal - switch ec.newStatus.Phase { - case v1alpha1.AnalysisPhaseError, v1alpha1.AnalysisPhaseFailed, v1alpha1.AnalysisPhaseInconclusive: - eventType = corev1.EventTypeWarning - } - ec.recorder.Eventf(ec.ex, record.EventOptions{EventType: eventType, EventReason: "Experiment" + string(ec.newStatus.Phase)}, "Experiment transitioned from %s -> %s", prevStatus.Phase, ec.newStatus.Phase) - } return ec.newStatus } diff --git a/go.mod b/go.mod index f66af27a6d..2d9f546290 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,16 @@ module github.com/argoproj/argo-rollouts -go 1.22 - -toolchain go1.22.2 +go 1.23 require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.32.4 - github.com/aws/aws-sdk-go-v2/config v1.28.1 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.42.4 + github.com/aws/aws-sdk-go-v2 v1.33.0 + github.com/aws/aws-sdk-go-v2/config v1.29.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.43.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.31.3 - github.com/aws/smithy-go v1.22.0 + github.com/aws/smithy-go v1.22.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 @@ -26,7 +24,7 @@ require ( github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 github.com/mitchellh/mapstructure v1.5.0 - github.com/newrelic/newrelic-client-go/v2 v2.51.3 + github.com/newrelic/newrelic-client-go/v2 v2.52.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.6.1 @@ -37,13 +35,13 @@ require ( github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.8.1 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.23.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + golang.org/x/oauth2 v0.25.0 + google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 + google.golang.org/grpc v1.69.4 + google.golang.org/protobuf v1.36.3 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.29.3 k8s.io/apiextensions-apiserver v0.29.3 @@ -62,7 +60,7 @@ require ( ) require ( - cloud.google.com/go/compute/metadata v0.5.0 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect github.com/PagerDuty/go-pagerduty v1.7.0 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect @@ -83,17 +81,17 @@ require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.53 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.10 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.8 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect @@ -107,12 +105,12 @@ require ( github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect - github.com/fatih/color v1.7.0 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -137,8 +135,8 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v0.14.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.1 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -152,7 +150,7 @@ require ( github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect @@ -189,32 +187,32 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/sdk v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.19.0 // indirect - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.28.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/term v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/term v0.25.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.162.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 204858a3ed..db672fedc2 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM 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/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= 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= @@ -96,38 +96,38 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.32.4 h1:S13INUiTxgrPueTmrm5DZ+MiAo99zYzHEFh1UNkOxNE= -github.com/aws/aws-sdk-go-v2 v1.32.4/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 h1:A2w6m6Tmr+BNXjDsr7M90zkWjsu4JXHwrzPg235STs4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23/go.mod h1:35EVp9wyeANdujZruvHiQUAo9E3vbhnIO1mTCAxMlY0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 h1:pgYW9FCabt2M25MoHYCfMrVY2ghiiBKYWUVXfwZs+sU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23/go.mod h1:c48kLgzO19wAu3CPkDWC28JbaJ+hfQlsdl7I2+oqIbk= +github.com/aws/aws-sdk-go-v2 v1.33.0 h1:Evgm4DI9imD81V0WwD+TN4DCwjUMdc94TrduMLbgZJs= +github.com/aws/aws-sdk-go-v2 v1.33.0/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.29.0 h1:Vk/u4jof33or1qAQLdofpjKV7mQQT7DcUpnYx8kdmxY= +github.com/aws/aws-sdk-go-v2/config v1.29.0/go.mod h1:iXAZK3Gxvpq3tA+B9WaDYpZis7M8KFgdrDPMmHrgbJM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.53 h1:lwrVhiEDW5yXsuVKlFVUnR2R50zt2DklhOyeLETqDuE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.53/go.mod h1:CkqM1bIw/xjEpBMhBnvqUXYZbpCFuj6dnCAyDk2AtAY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 h1:5grmdTdMsovn9kPZPI23Hhvp0ZyNm5cRO+IZFIYiAfw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24/go.mod h1:zqi7TVKTswH3Ozq28PkmBmgzG1tona7mo9G2IJg4Cis= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28 h1:igORFSiH3bfq4lxKFkTSYDhJEUCYo6C8VKiWJjYwQuQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28/go.mod h1:3So8EA/aAYm36L7XIvCVwLa0s5N0P7o2b1oqnx/2R4g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28 h1:1mOW9zAUMhTSrMDssEHS/ajx8JcAj/IcftzcmNlmVLI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28/go.mod h1:kGlXVIWDfvt2Ox5zEaNglmq0hXPHgQFNMix33Tw22jA= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.42.4 h1:c60zN18a3zQsBWdwE/v5xhK2Mtl1HG1gj9BLIEFxjWc= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.42.4/go.mod h1:fkETEwhdw2tOqu5m0Xa3wimV3PLDaiGqNrVZ3MJ7zOc= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.43.8 h1:T0IOlWMpaKi419QG0XtgXuen8keoVP9v3SwJMwYrgNQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.43.8/go.mod h1:w0Sa1DOIjqTBXmwYFk1r+i6Xtkeq21JGjUGe/NCqBHs= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.31.3 h1:Avh8YS+sgb2OKRht0wdNwY8tqtsCzVrmc8dG8Wfy9LI= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.31.3/go.mod h1:HbtHaw/hnNPaiqcyYnheILVyn81wOZiX9n2gYF5tPmM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9 h1:TQmKDyETFGiXVhZfQ/I0cCFziqqX58pi4tKJGYGFSz0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9/go.mod h1:HVLPK2iHQBUx7HfZeOQSEu3v2ubZaAY2YPbAm5/WUyY= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.10 h1:DyZUj3xSw3FR3TXSwDhPhuZkkT14QHBiacdbUVcD0Dg= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.10/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.9 h1:I1TsPEs34vbpOnR81GIcAq4/3Ud+jRHVGwx6qLQUHLs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.9/go.mod h1:Fzsj6lZEb8AkTE5S68OhcbBqeWPsR8RnGuKPr8Todl8= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.8 h1:pqEJQtlKWvnv3B6VRt60ZmsHy3SotlEBvfUBPB1KVcM= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.8/go.mod h1:f6vjfZER1M17Fokn0IzssOTMT2N8ZSq+7jnNF0tArvw= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -166,8 +166,8 @@ github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtM github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -215,8 +215,10 @@ github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSY github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -246,8 +248,8 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= @@ -408,17 +410,15 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= 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 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= -github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= 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/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= @@ -505,17 +505,17 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 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.10/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +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.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 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/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= @@ -554,8 +554,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ 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 h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/newrelic/newrelic-client-go/v2 v2.51.3 h1:Bu/cUs6nfMjQMPBcxxHt4Xm30tKDT7ttYy/XRDsWP6Y= -github.com/newrelic/newrelic-client-go/v2 v2.51.3/go.mod h1:+RRjI3nDGWT3kLm9Oi3QxpBm70uu8q1upEHBVWCZFpo= +github.com/newrelic/newrelic-client-go/v2 v2.52.0 h1:aY8502kV0IlIeOu1c9B/kLWN1je4NEwFFJ/FN2hMoyQ= +github.com/newrelic/newrelic-client-go/v2 v2.52.0/go.mod h1:+RRjI3nDGWT3kLm9Oi3QxpBm70uu8q1upEHBVWCZFpo= github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= @@ -684,8 +684,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= @@ -737,18 +737,20 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -781,8 +783,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= 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= @@ -867,8 +869,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= 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= @@ -876,8 +878,8 @@ 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.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= +golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -914,7 +916,6 @@ 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-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-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -948,8 +949,10 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc 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-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-20211216021012-1d35b9e2eb4e/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -959,8 +962,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= @@ -969,8 +972,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= 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= @@ -983,8 +986,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= @@ -1110,10 +1113,10 @@ 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-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= 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= @@ -1128,8 +1131,8 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/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.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= @@ -1143,8 +1146,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.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 6050b5df72..e6256b151d 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -98,6 +98,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer @@ -3219,6 +3224,9 @@ spec: consecutiveError: format: int32 type: integer + consecutiveSuccess: + format: int32 + type: integer count: format: int32 type: integer diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index f040d2a219..0b9f22d2cb 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -94,6 +94,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 2de306119e..f966d4f8b0 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -94,6 +94,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer diff --git a/manifests/install.yaml b/manifests/install.yaml index df6cc0614f..acaf436f2d 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -99,6 +99,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer @@ -3220,6 +3225,9 @@ spec: consecutiveError: format: int32 type: integer + consecutiveSuccess: + format: int32 + type: integer count: format: int32 type: integer @@ -3407,6 +3415,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer @@ -6593,6 +6606,11 @@ spec: - type: integer - type: string x-kubernetes-int-or-string: true + consecutiveSuccessLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true count: anyOf: - type: integer diff --git a/metricproviders/job/job_test.go b/metricproviders/job/job_test.go index 80fdb28342..eb7a6a1629 100644 --- a/metricproviders/job/job_test.go +++ b/metricproviders/job/job_test.go @@ -2,6 +2,7 @@ package job import ( "context" + "errors" "fmt" "testing" "time" @@ -178,7 +179,7 @@ func TestRunCreateFail(t *testing.T) { // The following causes the Create call to fail fakeClient := p.kubeclientset.(*k8sfake.Clientset) fakeClient.PrependReactor("create", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, fmt.Errorf(errMsg) + return true, nil, errors.New(errMsg) }) metricsMetadata := p.GetMetadata(run.Spec.Metrics[0]) assert.Nil(t, metricsMetadata) @@ -269,7 +270,7 @@ func TestTerminateError(t *testing.T) { errMsg := "random delete error" fakeClient := p.kubeclientset.(*k8sfake.Clientset) fakeClient.PrependReactor("delete", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, fmt.Errorf(errMsg) + return true, nil, errors.New(errMsg) }) measurement = p.Terminate(run, run.Spec.Metrics[0], measurement) diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 2e6cd847b0..ce2d2fe036 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1514,7 +1514,7 @@ }, "failureLimit": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", - "title": "FailureLimit is the maximum number of times the measurement is allowed to fail, before the\nentire metric is considered Failed (default: 0)" + "title": "FailureLimit is the maximum number of times the measurement is allowed to fail, before the\nentire metric is considered Failed (default: 0)\n-1 for making it disabled (when opting to use ConsecutiveSuccessLimit solely)" }, "inconclusiveLimit": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", @@ -1527,6 +1527,10 @@ "provider": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricProvider", "title": "Provider configuration to the external system to use to verify the analysis" + }, + "consecutiveSuccessLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "ConsecutiveSuccessLimit is the number of consecutive times the measurement must succeed for the\nentire metric to be considered Successful (default: 0, which means it's disabled)" } }, "title": "Metric defines a metric in which to perform analysis" @@ -1651,6 +1655,11 @@ "type": "string" }, "description": "Metadata stores additional metadata about this metric. It is used by different providers to store\nthe final state which gets used while taking measurements. For example, Prometheus uses this field\nto store the final resolved query after substituting the template arguments." + }, + "consecutiveSuccess": { + "type": "integer", + "format": "int32", + "title": "ConsecutiveSuccess is the number of times a measurement was successful in succession\nResets to zero when failures, inconclusive measurements, or errors are encountered" } }, "title": "MetricResult contain a list of the most recent measurements for a single metric along with\ncounters on how often the measurement" diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index bef20a9120..20c50f881f 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -112,6 +112,7 @@ type Metric struct { FailureCondition string `json:"failureCondition,omitempty" protobuf:"bytes,6,opt,name=failureCondition"` // FailureLimit is the maximum number of times the measurement is allowed to fail, before the // entire metric is considered Failed (default: 0) + // -1 for making it disabled (when opting to use ConsecutiveSuccessLimit solely) FailureLimit *intstrutil.IntOrString `json:"failureLimit,omitempty" protobuf:"bytes,7,opt,name=failureLimit"` // InconclusiveLimit is the maximum number of times the measurement is allowed to measure // Inconclusive, before the entire metric is considered Inconclusive (default: 0) @@ -121,6 +122,9 @@ type Metric struct { ConsecutiveErrorLimit *intstrutil.IntOrString `json:"consecutiveErrorLimit,omitempty" protobuf:"bytes,9,opt,name=consecutiveErrorLimit"` // Provider configuration to the external system to use to verify the analysis Provider MetricProvider `json:"provider" protobuf:"bytes,10,opt,name=provider"` + // ConsecutiveSuccessLimit is the number of consecutive times the measurement must succeed for the + // entire metric to be considered Successful (default: 0, which means it's disabled) + ConsecutiveSuccessLimit *intstrutil.IntOrString `json:"consecutiveSuccessLimit,omitempty" protobuf:"bytes,11,opt,name=consecutiveSuccessLimit"` } // DryRun defines the settings for running the analysis in Dry-Run mode. @@ -505,6 +509,9 @@ type MetricResult struct { // the final state which gets used while taking measurements. For example, Prometheus uses this field // to store the final resolved query after substituting the template arguments. Metadata map[string]string `json:"metadata,omitempty" protobuf:"bytes,12,rep,name=metadata"` + // ConsecutiveSuccess is the number of times a measurement was successful in succession + // Resets to zero when failures, inconclusive measurements, or errors are encountered + ConsecutiveSuccess int32 `json:"consecutiveSuccess,omitempty" protobuf:"varint,13,opt,name=consecutiveSuccess"` } // Measurement is a point in time result value of a single metric, and the time it was measured diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 74fbc1259e..7caa8b0aaa 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3466,568 +3466,571 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8969 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x64, 0xd7, - 0x75, 0x98, 0x1e, 0x87, 0x43, 0xce, 0x9c, 0xe1, 0x92, 0xdc, 0xbb, 0xbb, 0x12, 0x45, 0x69, 0x97, - 0xeb, 0xa7, 0x54, 0x5d, 0xc5, 0x32, 0x69, 0xaf, 0xa4, 0x54, 0xb6, 0x5c, 0xb5, 0x33, 0xe4, 0xae, - 0x96, 0x2b, 0x72, 0x97, 0x3a, 0xc3, 0xd5, 0xc6, 0x1f, 0x4a, 0xfc, 0x38, 0x73, 0x39, 0x7c, 0xcb, - 0x99, 0xf7, 0xc6, 0xef, 0xbd, 0xe1, 0x2e, 0x65, 0x21, 0x96, 0x6d, 0x28, 0x76, 0x5c, 0x1b, 0x71, - 0x93, 0x18, 0x45, 0x3f, 0x50, 0xb8, 0x41, 0x8a, 0xb4, 0x4d, 0x7f, 0x14, 0x81, 0x8b, 0xf6, 0x47, - 0x80, 0x16, 0x75, 0x53, 0x38, 0x40, 0x5d, 0x38, 0x3f, 0x5a, 0xa7, 0x05, 0xc2, 0xd4, 0x4c, 0xff, - 0x34, 0x68, 0x61, 0xa4, 0x70, 0x11, 0x54, 0x3f, 0x8a, 0xe2, 0x7e, 0xbe, 0xfb, 0xde, 0xbc, 0xe1, - 0xd7, 0x3c, 0xae, 0x94, 0xc6, 0xff, 0x66, 0xee, 0x39, 0xf7, 0x9c, 0xf3, 0xee, 0xe7, 0xb9, 0xe7, - 0x9e, 0x73, 0x2e, 0xac, 0xb4, 0xdc, 0x68, 0xab, 0xb7, 0x31, 0xdf, 0xf0, 0x3b, 0x0b, 0x4e, 0xd0, - 0xf2, 0xbb, 0x81, 0x7f, 0x8f, 0xff, 0xf8, 0x50, 0xe0, 0xb7, 0xdb, 0x7e, 0x2f, 0x0a, 0x17, 0xba, - 0xdb, 0xad, 0x05, 0xa7, 0xeb, 0x86, 0x0b, 0xba, 0x64, 0xe7, 0x23, 0x4e, 0xbb, 0xbb, 0xe5, 0x7c, - 0x64, 0xa1, 0x45, 0x3d, 0x1a, 0x38, 0x11, 0x6d, 0xce, 0x77, 0x03, 0x3f, 0xf2, 0xc9, 0xc7, 0x63, - 0x6a, 0xf3, 0x8a, 0x1a, 0xff, 0xf1, 0xf3, 0xaa, 0xee, 0x7c, 0x77, 0xbb, 0x35, 0xcf, 0xa8, 0xcd, - 0xeb, 0x12, 0x45, 0x6d, 0xf6, 0x43, 0x86, 0x2c, 0x2d, 0xbf, 0xe5, 0x2f, 0x70, 0xa2, 0x1b, 0xbd, - 0x4d, 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x04, 0xb3, 0xd9, 0xa7, 0xb6, 0x5f, 0x0c, 0xe7, 0x5d, 0x9f, - 0xc9, 0xb6, 0xb0, 0xe1, 0x44, 0x8d, 0xad, 0x85, 0x9d, 0x3e, 0x89, 0x66, 0x6d, 0x03, 0xa9, 0xe1, - 0x07, 0x34, 0x0b, 0xe7, 0xf9, 0x18, 0xa7, 0xe3, 0x34, 0xb6, 0x5c, 0x8f, 0x06, 0xbb, 0xf1, 0x57, - 0x77, 0x68, 0xe4, 0x64, 0xd5, 0x5a, 0x18, 0x54, 0x2b, 0xe8, 0x79, 0x91, 0xdb, 0xa1, 0x7d, 0x15, - 0x7e, 0xe6, 0xb0, 0x0a, 0x61, 0x63, 0x8b, 0x76, 0x9c, 0xbe, 0x7a, 0xcf, 0x0d, 0xaa, 0xd7, 0x8b, - 0xdc, 0xf6, 0x82, 0xeb, 0x45, 0x61, 0x14, 0xa4, 0x2b, 0xd9, 0x3f, 0x2a, 0x40, 0xb9, 0xba, 0x52, - 0xab, 0x47, 0x4e, 0xd4, 0x0b, 0xc9, 0x2f, 0x5a, 0x30, 0xd1, 0xf6, 0x9d, 0x66, 0xcd, 0x69, 0x3b, - 0x5e, 0x83, 0x06, 0x33, 0xd6, 0x65, 0xeb, 0x4a, 0xe5, 0xea, 0xca, 0xfc, 0x30, 0xfd, 0x35, 0x5f, - 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0x37, 0x6b, 0xe7, 0xbf, 0xbb, 0x37, 0xf7, - 0xc8, 0xfe, 0xde, 0xdc, 0xc4, 0x8a, 0xc1, 0x09, 0x13, 0x7c, 0xc9, 0x37, 0x2d, 0x38, 0xdb, 0x70, - 0x3c, 0x27, 0xd8, 0x5d, 0x77, 0x82, 0x16, 0x8d, 0x5e, 0x09, 0xfc, 0x5e, 0x77, 0x66, 0xe4, 0x14, - 0xa4, 0x79, 0x5c, 0x4a, 0x73, 0x76, 0x31, 0xcd, 0x0e, 0xfb, 0x25, 0xe0, 0x72, 0x85, 0x91, 0xb3, - 0xd1, 0xa6, 0xa6, 0x5c, 0x85, 0xd3, 0x94, 0xab, 0x9e, 0x66, 0x87, 0xfd, 0x12, 0x90, 0x67, 0x60, - 0xdc, 0xf5, 0x5a, 0x01, 0x0d, 0xc3, 0x99, 0xd1, 0xcb, 0xd6, 0x95, 0x72, 0x6d, 0x4a, 0x56, 0x1f, - 0x5f, 0x16, 0xc5, 0xa8, 0xe0, 0xf6, 0x6f, 0x17, 0xe0, 0x6c, 0x75, 0xa5, 0xb6, 0x1e, 0x38, 0x9b, - 0x9b, 0x6e, 0x03, 0xfd, 0x5e, 0xe4, 0x7a, 0x2d, 0x93, 0x80, 0x75, 0x30, 0x01, 0xf2, 0x02, 0x54, - 0x42, 0x1a, 0xec, 0xb8, 0x0d, 0xba, 0xe6, 0x07, 0x11, 0xef, 0x94, 0x62, 0xed, 0x9c, 0x44, 0xaf, - 0xd4, 0x63, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, 0x91, 0x84, 0xf3, 0x36, 0x2b, 0xc7, 0xd5, - 0x30, 0x06, 0xa1, 0x89, 0x47, 0x96, 0x60, 0xda, 0xf1, 0x3c, 0x3f, 0x72, 0x22, 0xd7, 0xf7, 0xd6, - 0x02, 0xba, 0xe9, 0x3e, 0x90, 0x9f, 0x38, 0x23, 0xeb, 0x4e, 0x57, 0x53, 0x70, 0xec, 0xab, 0x41, - 0xbe, 0x61, 0xc1, 0x74, 0x18, 0xb9, 0x8d, 0x6d, 0xd7, 0xa3, 0x61, 0xb8, 0xe8, 0x7b, 0x9b, 0x6e, - 0x6b, 0xa6, 0xc8, 0xbb, 0xed, 0xd6, 0x70, 0xdd, 0x56, 0x4f, 0x51, 0xad, 0x9d, 0x67, 0x22, 0xa5, - 0x4b, 0xb1, 0x8f, 0x3b, 0xf9, 0x20, 0x94, 0x65, 0x8b, 0xd2, 0x70, 0x66, 0xec, 0x72, 0xe1, 0x4a, - 0xb9, 0x76, 0x66, 0x7f, 0x6f, 0xae, 0xbc, 0xac, 0x0a, 0x31, 0x86, 0xdb, 0x4b, 0x30, 0x53, 0xed, - 0x6c, 0x38, 0x61, 0xe8, 0x34, 0xfd, 0x20, 0xd5, 0x75, 0x57, 0xa0, 0xd4, 0x71, 0xba, 0x5d, 0xd7, - 0x6b, 0xb1, 0xbe, 0x63, 0x74, 0x26, 0xf6, 0xf7, 0xe6, 0x4a, 0xab, 0xb2, 0x0c, 0x35, 0xd4, 0xfe, - 0xcf, 0x23, 0x50, 0xa9, 0x7a, 0x4e, 0x7b, 0x37, 0x74, 0x43, 0xec, 0x79, 0xe4, 0x33, 0x50, 0x62, - 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0x3c, 0x2f, 0x16, 0x91, 0x79, 0x73, 0x11, 0x89, - 0x3f, 0x9f, 0x61, 0xcf, 0xef, 0x7c, 0x64, 0xfe, 0xf6, 0xc6, 0x3d, 0xda, 0x88, 0x56, 0x69, 0xe4, - 0xd4, 0x88, 0xec, 0x05, 0x88, 0xcb, 0x50, 0x53, 0x25, 0x3e, 0x8c, 0x86, 0x5d, 0xda, 0x90, 0x33, - 0x77, 0x75, 0xc8, 0x19, 0x12, 0x8b, 0x5e, 0xef, 0xd2, 0x46, 0x6d, 0x42, 0xb2, 0x1e, 0x65, 0xff, - 0x90, 0x33, 0x22, 0xf7, 0x61, 0x2c, 0xe4, 0x6b, 0x99, 0x9c, 0x94, 0xb7, 0xf3, 0x63, 0xc9, 0xc9, - 0xd6, 0x26, 0x25, 0xd3, 0x31, 0xf1, 0x1f, 0x25, 0x3b, 0xfb, 0xbf, 0x58, 0x70, 0xce, 0xc0, 0xae, - 0x06, 0xad, 0x5e, 0x87, 0x7a, 0x11, 0xb9, 0x0c, 0xa3, 0x9e, 0xd3, 0xa1, 0x72, 0x56, 0x69, 0x91, - 0x6f, 0x39, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x82, 0xe2, 0x8e, 0xd3, 0xee, 0x51, 0xde, 0x48, 0xe5, - 0xda, 0x19, 0x89, 0x52, 0x7c, 0x9d, 0x15, 0xa2, 0x80, 0x91, 0xb7, 0xa0, 0xcc, 0x7f, 0x5c, 0x0f, - 0xfc, 0x4e, 0x4e, 0x9f, 0x26, 0x25, 0x7c, 0x5d, 0x91, 0x15, 0xc3, 0x4f, 0xff, 0xc5, 0x98, 0xa1, - 0xfd, 0x47, 0x16, 0x4c, 0x19, 0x1f, 0xb7, 0xe2, 0x86, 0x11, 0xf9, 0x74, 0xdf, 0xe0, 0x99, 0x3f, - 0xda, 0xe0, 0x61, 0xb5, 0xf9, 0xd0, 0x99, 0x96, 0x5f, 0x5a, 0x52, 0x25, 0xc6, 0xc0, 0xf1, 0xa0, - 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8c, 0x5c, 0x2e, 0x5c, 0xa9, 0x5c, 0x5d, 0xce, 0xad, 0x1b, 0xe3, - 0xf6, 0x5d, 0x66, 0xf4, 0x51, 0xb0, 0xb1, 0xbf, 0x5d, 0x48, 0x74, 0xdf, 0xaa, 0x92, 0xe3, 0x1d, - 0x0b, 0xc6, 0xda, 0xce, 0x06, 0x6d, 0x8b, 0xb9, 0x55, 0xb9, 0xfa, 0x46, 0x6e, 0x92, 0x28, 0x1e, - 0xf3, 0x2b, 0x9c, 0xfe, 0x35, 0x2f, 0x0a, 0x76, 0xe3, 0xe1, 0x25, 0x0a, 0x51, 0x32, 0x27, 0x7f, - 0xdb, 0x82, 0x4a, 0xbc, 0xaa, 0xa9, 0x66, 0xd9, 0xc8, 0x5f, 0x98, 0x78, 0x31, 0x95, 0x12, 0xe9, - 0x25, 0xda, 0x80, 0xa0, 0x29, 0xcb, 0xec, 0x47, 0xa1, 0x62, 0x7c, 0x02, 0x99, 0x86, 0xc2, 0x36, - 0xdd, 0x15, 0x03, 0x1e, 0xd9, 0x4f, 0x72, 0x3e, 0x31, 0xc2, 0xe5, 0x90, 0xfe, 0xd8, 0xc8, 0x8b, - 0xd6, 0xec, 0xcb, 0x30, 0x9d, 0x66, 0x78, 0x9c, 0xfa, 0xf6, 0x3f, 0x2b, 0x26, 0x06, 0x26, 0x5b, - 0x08, 0x88, 0x0f, 0xe3, 0x1d, 0x1a, 0x05, 0x6e, 0x43, 0x75, 0xd9, 0xd2, 0x70, 0xad, 0xb4, 0xca, - 0x89, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xe2, 0x42, 0xb6, 0x60, 0xd4, 0x09, 0x5a, 0xaa, 0x4f, - 0xae, 0xe7, 0x33, 0x2d, 0xe3, 0xa5, 0xa2, 0x1a, 0xb4, 0x42, 0xe4, 0x1c, 0xc8, 0x02, 0x94, 0x23, - 0x1a, 0x74, 0x5c, 0xcf, 0x89, 0xc4, 0x0e, 0x5a, 0xaa, 0x9d, 0x95, 0x68, 0xe5, 0x75, 0x05, 0xc0, - 0x18, 0x87, 0xb4, 0x61, 0xac, 0x19, 0xec, 0x62, 0xcf, 0x9b, 0x19, 0xcd, 0xa3, 0x29, 0x96, 0x38, - 0xad, 0x78, 0x90, 0x8a, 0xff, 0x28, 0x79, 0x90, 0xdf, 0xb0, 0xe0, 0x7c, 0x87, 0x3a, 0x61, 0x2f, - 0xa0, 0xec, 0x13, 0x90, 0x46, 0xd4, 0x63, 0x1d, 0x3b, 0x53, 0xe4, 0xcc, 0x71, 0xd8, 0x7e, 0xe8, - 0xa7, 0x5c, 0x7b, 0x52, 0x8a, 0x72, 0x3e, 0x0b, 0x8a, 0x99, 0xd2, 0x90, 0xb7, 0xa0, 0x12, 0x45, - 0xed, 0x7a, 0xc4, 0xf4, 0xe0, 0xd6, 0xee, 0xcc, 0x18, 0x5f, 0xbc, 0x86, 0x5c, 0x61, 0xd6, 0xd7, - 0x57, 0x14, 0xc1, 0xda, 0x14, 0x9b, 0x2d, 0x46, 0x01, 0x9a, 0xec, 0xec, 0x7f, 0x59, 0x84, 0xb3, - 0x7d, 0xdb, 0x0a, 0x79, 0x1e, 0x8a, 0xdd, 0x2d, 0x27, 0x54, 0xfb, 0xc4, 0x25, 0xb5, 0x48, 0xad, - 0xb1, 0xc2, 0x77, 0xf7, 0xe6, 0xce, 0xa8, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0xd3, 0xda, 0x3a, 0x34, - 0x0c, 0x9d, 0x96, 0xda, 0x3c, 0x8c, 0x41, 0xca, 0x8b, 0x51, 0xc1, 0xc9, 0x97, 0x2d, 0x38, 0x23, - 0x06, 0x2c, 0xd2, 0xb0, 0xd7, 0x8e, 0xd8, 0x06, 0xc9, 0x3a, 0xe5, 0x66, 0x1e, 0x93, 0x43, 0x90, - 0xac, 0x5d, 0x90, 0xdc, 0xcf, 0x98, 0xa5, 0x21, 0x26, 0xf9, 0x92, 0xbb, 0x50, 0x0e, 0x23, 0x27, - 0x88, 0x68, 0xb3, 0x1a, 0x71, 0x55, 0xae, 0x72, 0xf5, 0xa7, 0x8f, 0xb6, 0x73, 0xac, 0xbb, 0x1d, - 0x2a, 0x76, 0xa9, 0xba, 0x22, 0x80, 0x31, 0x2d, 0xf2, 0x16, 0x40, 0xd0, 0xf3, 0xea, 0xbd, 0x4e, - 0xc7, 0x09, 0x76, 0xa5, 0x76, 0x77, 0x63, 0xb8, 0xcf, 0x43, 0x4d, 0x2f, 0x56, 0x74, 0xe2, 0x32, - 0x34, 0xf8, 0x91, 0x2f, 0x58, 0x70, 0x46, 0xcc, 0x03, 0x25, 0xc1, 0x58, 0xce, 0x12, 0x9c, 0x65, - 0x4d, 0xbb, 0x64, 0xb2, 0xc0, 0x24, 0x47, 0xf2, 0x06, 0x54, 0x1a, 0x7e, 0xa7, 0xdb, 0xa6, 0xa2, - 0x71, 0xc7, 0x8f, 0xdd, 0xb8, 0x7c, 0xe8, 0x2e, 0xc6, 0x24, 0xd0, 0xa4, 0x67, 0xff, 0xc7, 0xa4, - 0x8e, 0xa3, 0x86, 0x34, 0xf9, 0x14, 0x3c, 0x1e, 0xf6, 0x1a, 0x0d, 0x1a, 0x86, 0x9b, 0xbd, 0x36, - 0xf6, 0xbc, 0x1b, 0x6e, 0x18, 0xf9, 0xc1, 0xee, 0x8a, 0xdb, 0x71, 0x23, 0x3e, 0xa0, 0x8b, 0xb5, - 0x8b, 0xfb, 0x7b, 0x73, 0x8f, 0xd7, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0x27, 0x7a, 0xde, - 0x60, 0xf2, 0xe2, 0xf8, 0x31, 0xb7, 0xbf, 0x37, 0xf7, 0xc4, 0x9d, 0xc1, 0x68, 0x78, 0x10, 0x0d, - 0xfb, 0x4f, 0x2c, 0xb6, 0x0d, 0x89, 0xef, 0x5a, 0xa7, 0x9d, 0x6e, 0x9b, 0x2d, 0x9d, 0xa7, 0xaf, - 0x1c, 0x47, 0x09, 0xe5, 0x18, 0xf3, 0xd9, 0xcb, 0x95, 0xfc, 0x83, 0x34, 0x64, 0xfb, 0xbf, 0x5b, - 0x70, 0x3e, 0x8d, 0xfc, 0x10, 0x14, 0xba, 0x30, 0xa9, 0xd0, 0xdd, 0xca, 0xf7, 0x6b, 0x07, 0x68, - 0x75, 0xbf, 0x64, 0x0c, 0x58, 0x85, 0x8a, 0x74, 0x93, 0xbc, 0x08, 0x13, 0x91, 0xfc, 0x7b, 0x2b, - 0x56, 0xce, 0xb5, 0x61, 0x62, 0xdd, 0x80, 0x61, 0x02, 0x93, 0xd5, 0x6c, 0xb4, 0x7b, 0x61, 0x44, - 0x83, 0x7a, 0xc3, 0xef, 0x8a, 0x65, 0xb7, 0x14, 0xd7, 0x5c, 0x34, 0x60, 0x98, 0xc0, 0xb4, 0xff, - 0x46, 0xb1, 0xbf, 0xdd, 0xff, 0x7f, 0xd7, 0x57, 0x62, 0xf5, 0xa3, 0xf0, 0x5e, 0xaa, 0x1f, 0xa3, - 0xef, 0x2b, 0xf5, 0xe3, 0x8b, 0x16, 0xd3, 0xe2, 0xc4, 0x00, 0x08, 0xa5, 0x6a, 0xf4, 0x5a, 0xbe, - 0xd3, 0x01, 0xe9, 0xa6, 0xa9, 0x18, 0x4a, 0x5e, 0x18, 0xb3, 0xb5, 0xff, 0xd1, 0x28, 0x4c, 0x54, - 0xbd, 0xc8, 0xad, 0x6e, 0x6e, 0xba, 0x9e, 0x1b, 0xed, 0x92, 0xaf, 0x8d, 0xc0, 0x42, 0x37, 0xa0, - 0x9b, 0x34, 0x08, 0x68, 0x73, 0xa9, 0x17, 0xb8, 0x5e, 0xab, 0xde, 0xd8, 0xa2, 0xcd, 0x5e, 0xdb, - 0xf5, 0x5a, 0xcb, 0x2d, 0xcf, 0xd7, 0xc5, 0xd7, 0x1e, 0xd0, 0x46, 0x8f, 0xb7, 0xab, 0x58, 0x25, - 0x3a, 0xc3, 0xc9, 0xbe, 0x76, 0x3c, 0xa6, 0xb5, 0xe7, 0xf6, 0xf7, 0xe6, 0x16, 0x8e, 0x59, 0x09, - 0x8f, 0xfb, 0x69, 0xe4, 0x2b, 0x23, 0x30, 0x1f, 0xd0, 0xcf, 0xf6, 0xdc, 0xa3, 0xb7, 0x86, 0x58, - 0xc6, 0xdb, 0x43, 0x6e, 0xf7, 0xc7, 0xe2, 0x59, 0xbb, 0xba, 0xbf, 0x37, 0x77, 0xcc, 0x3a, 0x78, - 0xcc, 0xef, 0xb2, 0xd7, 0xa0, 0x52, 0xed, 0xba, 0xa1, 0xfb, 0x00, 0xfd, 0x5e, 0x44, 0x8f, 0x60, - 0xd0, 0x98, 0x83, 0x62, 0xd0, 0x6b, 0x53, 0xb1, 0xc0, 0x94, 0x6b, 0x65, 0xb6, 0x2c, 0x23, 0x2b, - 0x40, 0x51, 0x6e, 0x7f, 0x91, 0x6d, 0x41, 0x9c, 0x64, 0xca, 0x94, 0x75, 0x0f, 0x8a, 0x01, 0x63, - 0x22, 0x47, 0xd6, 0xb0, 0xa7, 0xfe, 0x58, 0x6a, 0x29, 0x04, 0xfb, 0x89, 0x82, 0x85, 0xfd, 0x9d, - 0x11, 0xb8, 0x50, 0xed, 0x76, 0x57, 0x69, 0xb8, 0x95, 0x92, 0xe2, 0x97, 0x2d, 0x98, 0xdc, 0x71, - 0x83, 0xa8, 0xe7, 0xb4, 0x95, 0xb5, 0x52, 0xc8, 0x53, 0x1f, 0x56, 0x1e, 0xce, 0xed, 0xf5, 0x04, - 0xe9, 0x1a, 0xd9, 0xdf, 0x9b, 0x9b, 0x4c, 0x96, 0x61, 0x8a, 0x3d, 0xf9, 0x5b, 0x16, 0x4c, 0xcb, - 0xa2, 0x5b, 0x7e, 0x93, 0x9a, 0xd6, 0xf0, 0x3b, 0x79, 0xca, 0xa4, 0x89, 0x0b, 0x2b, 0x66, 0xba, - 0x14, 0xfb, 0x84, 0xb0, 0xff, 0xe7, 0x08, 0x3c, 0x36, 0x80, 0x06, 0xf9, 0x4d, 0x0b, 0xce, 0x0b, - 0x13, 0xba, 0x01, 0x42, 0xba, 0x29, 0x5b, 0xf3, 0x13, 0x79, 0x4b, 0x8e, 0x6c, 0x8a, 0x53, 0xaf, - 0x41, 0x6b, 0x33, 0x6c, 0x49, 0x5e, 0xcc, 0x60, 0x8d, 0x99, 0x02, 0x71, 0x49, 0x85, 0x51, 0x3d, - 0x25, 0xe9, 0xc8, 0x43, 0x91, 0xb4, 0x9e, 0xc1, 0x1a, 0x33, 0x05, 0xb2, 0xff, 0x1a, 0x3c, 0x71, - 0x00, 0xb9, 0xc3, 0x27, 0xa7, 0xfd, 0x86, 0x1e, 0xf5, 0xc9, 0x31, 0x77, 0x84, 0x79, 0x6d, 0xc3, - 0x18, 0x9f, 0x3a, 0x6a, 0x62, 0x03, 0xdb, 0x83, 0xf9, 0x9c, 0x0a, 0x51, 0x42, 0xec, 0xef, 0x58, - 0x50, 0x3a, 0x86, 0xed, 0x73, 0x2e, 0x69, 0xfb, 0x2c, 0xf7, 0xd9, 0x3d, 0xa3, 0x7e, 0xbb, 0xe7, - 0x2b, 0xc3, 0xf5, 0xc6, 0x51, 0xec, 0x9d, 0x3f, 0xb2, 0xe0, 0x6c, 0x9f, 0x7d, 0x94, 0x6c, 0xc1, - 0xf9, 0xae, 0xdf, 0x54, 0xdb, 0xe9, 0x0d, 0x27, 0xdc, 0xe2, 0x30, 0xf9, 0x79, 0xcf, 0xb3, 0x9e, - 0x5c, 0xcb, 0x80, 0xbf, 0xbb, 0x37, 0x37, 0xa3, 0x89, 0xa4, 0x10, 0x30, 0x93, 0x22, 0xe9, 0x42, - 0x69, 0xd3, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0x87, 0xd4, 0xd2, 0xae, 0x4b, 0x6a, 0xe2, 0x6a, 0x40, - 0xfd, 0x43, 0xcd, 0xc5, 0xfe, 0xb1, 0x05, 0x93, 0xd5, 0x5e, 0xb4, 0xc5, 0x74, 0x94, 0x06, 0xb7, - 0xc6, 0x11, 0x0f, 0x8a, 0xa1, 0xdb, 0xda, 0x79, 0x3e, 0x9f, 0xc5, 0xb8, 0xce, 0x48, 0xc9, 0x2b, - 0x12, 0xad, 0xac, 0xf3, 0x42, 0x14, 0x6c, 0x48, 0x00, 0x63, 0xbe, 0xd3, 0x8b, 0xb6, 0xae, 0xca, - 0x4f, 0x1e, 0xd2, 0x32, 0x71, 0x9b, 0x7d, 0xce, 0x55, 0xc9, 0x51, 0xab, 0x8c, 0xa2, 0x14, 0x25, - 0x27, 0xfb, 0xf3, 0x30, 0x99, 0xbc, 0x77, 0x3b, 0xc2, 0x98, 0xbd, 0x08, 0x05, 0x27, 0xf0, 0xe4, - 0x88, 0xad, 0x48, 0x84, 0x42, 0x15, 0x6f, 0x21, 0x2b, 0x27, 0xcf, 0x42, 0x69, 0xb3, 0xd7, 0x6e, - 0xf3, 0x73, 0x85, 0xb8, 0xe4, 0xd2, 0xc7, 0xa2, 0xeb, 0xb2, 0x1c, 0x35, 0x86, 0xfd, 0x7f, 0x46, - 0x61, 0xaa, 0xd6, 0xee, 0xd1, 0x57, 0x02, 0x4a, 0x95, 0x2d, 0xa8, 0x0a, 0x53, 0xdd, 0x80, 0xee, - 0xb8, 0xf4, 0x7e, 0x9d, 0xb6, 0x69, 0x23, 0xf2, 0x03, 0x29, 0xcd, 0x63, 0x92, 0xd0, 0xd4, 0x5a, - 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0x32, 0x4c, 0x3a, 0x8d, 0xc8, 0xdd, 0xa1, 0x9a, 0x82, 0x10, 0xf7, - 0x51, 0x49, 0x61, 0xb2, 0x9a, 0x80, 0x62, 0x0a, 0x9b, 0x7c, 0x1a, 0x66, 0xc2, 0x86, 0xd3, 0xa6, - 0x77, 0xba, 0x92, 0xd5, 0xe2, 0x16, 0x6d, 0x6c, 0xaf, 0xf9, 0xae, 0x17, 0x49, 0xbb, 0xe3, 0x65, - 0x49, 0x69, 0xa6, 0x3e, 0x00, 0x0f, 0x07, 0x52, 0x20, 0xff, 0xca, 0x82, 0x8b, 0xdd, 0x80, 0xae, - 0x05, 0x7e, 0xc7, 0x67, 0x43, 0xad, 0xcf, 0x1c, 0x26, 0xcd, 0x42, 0xaf, 0x0f, 0xa9, 0x4b, 0x89, - 0x92, 0xfe, 0x3b, 0x9c, 0x0f, 0xec, 0xef, 0xcd, 0x5d, 0x5c, 0x3b, 0x48, 0x00, 0x3c, 0x58, 0x3e, - 0xf2, 0x6f, 0x2c, 0xb8, 0xd4, 0xf5, 0xc3, 0xe8, 0x80, 0x4f, 0x28, 0x9e, 0xea, 0x27, 0xd8, 0xfb, - 0x7b, 0x73, 0x97, 0xd6, 0x0e, 0x94, 0x00, 0x0f, 0x91, 0xd0, 0xde, 0xaf, 0xc0, 0x59, 0x63, 0xec, - 0x49, 0x63, 0xce, 0x4b, 0x70, 0x46, 0x0d, 0x86, 0x58, 0xf7, 0x29, 0xc7, 0xb6, 0xbd, 0xaa, 0x09, - 0xc4, 0x24, 0x2e, 0x1b, 0x77, 0x7a, 0x28, 0x8a, 0xda, 0xa9, 0x71, 0xb7, 0x96, 0x80, 0x62, 0x0a, - 0x9b, 0x2c, 0xc3, 0x39, 0x59, 0x82, 0xb4, 0xdb, 0x76, 0x1b, 0xce, 0xa2, 0xdf, 0x93, 0x43, 0xae, - 0x58, 0x7b, 0x6c, 0x7f, 0x6f, 0xee, 0xdc, 0x5a, 0x3f, 0x18, 0xb3, 0xea, 0x90, 0x15, 0x38, 0xef, - 0xf4, 0x22, 0x5f, 0x7f, 0xff, 0x35, 0x8f, 0x6d, 0xa7, 0x4d, 0x3e, 0xb4, 0x4a, 0x62, 0xdf, 0xad, - 0x66, 0xc0, 0x31, 0xb3, 0x16, 0x59, 0x4b, 0x51, 0xab, 0xd3, 0x86, 0xef, 0x35, 0x45, 0x2f, 0x17, - 0xe3, 0x63, 0x60, 0x35, 0x03, 0x07, 0x33, 0x6b, 0x92, 0x36, 0x4c, 0x76, 0x9c, 0x07, 0x77, 0x3c, - 0x67, 0xc7, 0x71, 0xdb, 0x8c, 0x89, 0xb4, 0x17, 0x0e, 0xb6, 0x32, 0xf5, 0x22, 0xb7, 0x3d, 0x2f, - 0xfc, 0x38, 0xe6, 0x97, 0xbd, 0xe8, 0x76, 0x50, 0x8f, 0x98, 0xa6, 0x2e, 0x34, 0xc8, 0xd5, 0x04, - 0x2d, 0x4c, 0xd1, 0x26, 0xb7, 0xe1, 0x02, 0x9f, 0x8e, 0x4b, 0xfe, 0x7d, 0x6f, 0x89, 0xb6, 0x9d, - 0x5d, 0xf5, 0x01, 0xe3, 0xfc, 0x03, 0x1e, 0xdf, 0xdf, 0x9b, 0xbb, 0x50, 0xcf, 0x42, 0xc0, 0xec, - 0x7a, 0xc4, 0x81, 0x27, 0x92, 0x00, 0xa4, 0x3b, 0x6e, 0xe8, 0xfa, 0x9e, 0x30, 0xcb, 0x95, 0x62, - 0xb3, 0x5c, 0x7d, 0x30, 0x1a, 0x1e, 0x44, 0x83, 0xfc, 0x5d, 0x0b, 0xce, 0x67, 0x4d, 0xc3, 0x99, - 0x72, 0x1e, 0xb7, 0xc9, 0xa9, 0xa9, 0x25, 0x46, 0x44, 0xe6, 0xa2, 0x90, 0x29, 0x04, 0x79, 0xdb, - 0x82, 0x09, 0xc7, 0x38, 0x41, 0xcf, 0x40, 0x1e, 0xbb, 0x96, 0x79, 0x26, 0xaf, 0x4d, 0xef, 0xef, - 0xcd, 0x25, 0x4e, 0xe9, 0x98, 0xe0, 0x48, 0xfe, 0xbe, 0x05, 0x17, 0x32, 0xe7, 0xf8, 0x4c, 0xe5, - 0x34, 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, 0x0d, 0x4b, 0x6f, 0x65, 0xea, - 0x82, 0x71, 0x66, 0x82, 0x8b, 0x36, 0xa4, 0xc1, 0xc3, 0x50, 0xa3, 0x14, 0xe1, 0xda, 0x39, 0x63, - 0x67, 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x6e, 0xa9, 0xad, 0x51, 0x4b, 0x74, 0xe6, 0xb4, 0x24, - 0x22, 0xf1, 0x4e, 0xab, 0x05, 0x4a, 0x31, 0x27, 0x3f, 0x07, 0xb3, 0xce, 0x86, 0x1f, 0x44, 0x99, - 0x93, 0x6f, 0x66, 0x92, 0x4f, 0xa3, 0x4b, 0xfb, 0x7b, 0x73, 0xb3, 0xd5, 0x81, 0x58, 0x78, 0x00, - 0x05, 0xfb, 0xf7, 0xc6, 0x60, 0x42, 0x9c, 0x84, 0xe4, 0xd6, 0xf5, 0x3b, 0x16, 0x3c, 0xd9, 0xe8, - 0x05, 0x01, 0xf5, 0xa2, 0x7a, 0x44, 0xbb, 0xfd, 0x1b, 0x97, 0x75, 0xaa, 0x1b, 0xd7, 0xe5, 0xfd, - 0xbd, 0xb9, 0x27, 0x17, 0x0f, 0xe0, 0x8f, 0x07, 0x4a, 0x47, 0xfe, 0x83, 0x05, 0xb6, 0x44, 0xa8, - 0x39, 0x8d, 0xed, 0x56, 0xe0, 0xf7, 0xbc, 0x66, 0xff, 0x47, 0x8c, 0x9c, 0xea, 0x47, 0x3c, 0xbd, - 0xbf, 0x37, 0x67, 0x2f, 0x1e, 0x2a, 0x05, 0x1e, 0x41, 0x52, 0xf2, 0x0a, 0x9c, 0x95, 0x58, 0xd7, - 0x1e, 0x74, 0x69, 0xe0, 0xb2, 0x33, 0x87, 0x54, 0x1c, 0x63, 0xdf, 0xb4, 0x34, 0x02, 0xf6, 0xd7, - 0x21, 0x21, 0x8c, 0xdf, 0xa7, 0x6e, 0x6b, 0x2b, 0x52, 0xea, 0xd3, 0x90, 0x0e, 0x69, 0xd2, 0x2a, - 0x72, 0x57, 0xd0, 0xac, 0x55, 0xf6, 0xf7, 0xe6, 0xc6, 0xe5, 0x1f, 0x54, 0x9c, 0xc8, 0x2d, 0x98, - 0x14, 0xe7, 0xd4, 0x35, 0xd7, 0x6b, 0xad, 0xf9, 0x9e, 0xf0, 0xaa, 0x2a, 0xd7, 0x9e, 0x56, 0x1b, - 0x7e, 0x3d, 0x01, 0x7d, 0x77, 0x6f, 0x6e, 0x42, 0xfd, 0x5e, 0xdf, 0xed, 0x52, 0x4c, 0xd5, 0x26, - 0x7f, 0xc7, 0x02, 0x12, 0x46, 0xb4, 0xbb, 0xd6, 0xee, 0xb5, 0x5c, 0xd9, 0x44, 0xd2, 0x3f, 0x2a, - 0x07, 0x57, 0xad, 0x24, 0xdd, 0xda, 0xac, 0x14, 0x92, 0xd4, 0xfb, 0x38, 0x62, 0x86, 0x14, 0xf6, - 0xb7, 0xc7, 0x01, 0xd4, 0x5c, 0xa2, 0x5d, 0xf2, 0x41, 0x28, 0x87, 0x34, 0x12, 0x4d, 0x22, 0xaf, - 0xb9, 0xc4, 0xe5, 0xa4, 0x2a, 0xc4, 0x18, 0x4e, 0xb6, 0xa1, 0xd8, 0x75, 0x7a, 0x21, 0xcd, 0xe7, - 0x70, 0x23, 0x47, 0xe6, 0x1a, 0xa3, 0x28, 0x4e, 0xcd, 0xfc, 0x27, 0x0a, 0x1e, 0xe4, 0x4b, 0x16, - 0x00, 0x4d, 0x8e, 0xa6, 0xa1, 0xad, 0x57, 0x92, 0x65, 0x3c, 0xe0, 0x58, 0x1b, 0xd4, 0x26, 0xf7, - 0xf7, 0xe6, 0xc0, 0x18, 0x97, 0x06, 0x5b, 0x72, 0x1f, 0x4a, 0x8e, 0xda, 0x90, 0x46, 0x4f, 0x63, - 0x43, 0xe2, 0x87, 0x59, 0x3d, 0xa3, 0x34, 0x33, 0xf2, 0x15, 0x0b, 0x26, 0x43, 0x1a, 0xc9, 0xae, - 0x62, 0xcb, 0xa2, 0xd4, 0xc6, 0x87, 0x9c, 0x11, 0xf5, 0x04, 0x4d, 0xb1, 0xbc, 0x27, 0xcb, 0x30, - 0xc5, 0x57, 0x89, 0x72, 0x83, 0x3a, 0x4d, 0x1a, 0x70, 0x5b, 0x89, 0x54, 0xf3, 0x86, 0x17, 0xc5, - 0xa0, 0xa9, 0x45, 0x31, 0xca, 0x30, 0xc5, 0x57, 0x89, 0xb2, 0xea, 0x06, 0x81, 0x2f, 0x45, 0x29, - 0xe5, 0x24, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, 0x8a, 0x2f, 0x69, 0xc3, 0x58, 0x97, 0x4f, - 0x2d, 0xa9, 0xca, 0x0d, 0x79, 0x47, 0xae, 0xa6, 0x29, 0xed, 0x0a, 0x9b, 0x94, 0xf8, 0x8f, 0x92, - 0x87, 0xfd, 0xad, 0x33, 0x30, 0xa9, 0xa6, 0x6d, 0x7c, 0xc8, 0x11, 0x86, 0xc0, 0x01, 0x87, 0x9c, - 0x45, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0xac, 0x5a, 0xc9, 0x33, 0x8e, 0xae, 0x5c, 0x37, 0x81, - 0x98, 0xc4, 0x25, 0x1d, 0x28, 0xb2, 0x95, 0x45, 0xb9, 0x5f, 0x0c, 0xf9, 0xe5, 0xf1, 0x6a, 0x64, - 0x18, 0x55, 0x18, 0x79, 0x14, 0x5c, 0xb8, 0x2d, 0x3b, 0x4a, 0x98, 0xb7, 0xe5, 0x54, 0xcc, 0x67, - 0x35, 0x48, 0x5a, 0xce, 0x45, 0xdf, 0x27, 0xcb, 0x30, 0xc5, 0x3e, 0xe3, 0xdc, 0x53, 0x3c, 0xc5, - 0x73, 0xcf, 0x27, 0xa1, 0xd4, 0x71, 0x1e, 0xd4, 0x7b, 0x41, 0xeb, 0xe4, 0xe7, 0x2b, 0xe9, 0x4e, - 0x2b, 0xa8, 0xa0, 0xa6, 0x47, 0xbe, 0x60, 0x19, 0x0b, 0x9c, 0xf0, 0xb5, 0xb8, 0x9b, 0xef, 0x02, - 0xa7, 0xd5, 0x86, 0x81, 0x4b, 0x5d, 0xdf, 0x29, 0xa4, 0xf4, 0xd0, 0x4f, 0x21, 0x4c, 0xa3, 0x16, - 0x13, 0x44, 0x6b, 0xd4, 0xe5, 0x53, 0xd5, 0xa8, 0x17, 0x13, 0xcc, 0x30, 0xc5, 0x9c, 0xcb, 0x23, - 0xe6, 0x9c, 0x96, 0x07, 0x4e, 0x55, 0x9e, 0x7a, 0x82, 0x19, 0xa6, 0x98, 0x0f, 0x3e, 0x7a, 0x57, - 0x4e, 0xe7, 0xe8, 0x3d, 0x91, 0xc3, 0xd1, 0xfb, 0xe0, 0x53, 0xc9, 0x99, 0x61, 0x4f, 0x25, 0xe4, - 0x26, 0x90, 0xe6, 0xae, 0xe7, 0x74, 0xdc, 0x86, 0x5c, 0x2c, 0xf9, 0x26, 0x3d, 0xc9, 0x4d, 0x33, - 0x5a, 0x2b, 0x5b, 0xea, 0xc3, 0xc0, 0x8c, 0x5a, 0x24, 0x82, 0x52, 0x57, 0x29, 0x9f, 0x53, 0x79, - 0x8c, 0x7e, 0xa5, 0x8c, 0x0a, 0x17, 0x1a, 0x36, 0xf1, 0x54, 0x09, 0x6a, 0x4e, 0x64, 0x05, 0xce, - 0x77, 0x5c, 0x6f, 0xcd, 0x6f, 0x86, 0x6b, 0x34, 0x90, 0x86, 0xa7, 0x3a, 0x8d, 0x66, 0xa6, 0x79, - 0xdb, 0x70, 0x63, 0xc2, 0x6a, 0x06, 0x1c, 0x33, 0x6b, 0xd9, 0xff, 0xdb, 0x82, 0xe9, 0xc5, 0xb6, - 0xdf, 0x6b, 0xde, 0x75, 0xa2, 0xc6, 0x96, 0xf0, 0xd8, 0x20, 0x2f, 0x43, 0xc9, 0xf5, 0x22, 0x1a, - 0xec, 0x38, 0x6d, 0xb9, 0x3f, 0xd9, 0xca, 0x92, 0xbc, 0x2c, 0xcb, 0xdf, 0xdd, 0x9b, 0x9b, 0x5c, - 0xea, 0x05, 0xdc, 0x60, 0x2f, 0x56, 0x2b, 0xd4, 0x75, 0xc8, 0xb7, 0x2c, 0x38, 0x2b, 0x7c, 0x3e, - 0x96, 0x9c, 0xc8, 0x79, 0xad, 0x47, 0x03, 0x97, 0x2a, 0xaf, 0x8f, 0x21, 0x17, 0xaa, 0xb4, 0xac, - 0x8a, 0xc1, 0x6e, 0x7c, 0x66, 0x59, 0x4d, 0x73, 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2d, 0xc0, 0xe3, - 0x03, 0x69, 0x91, 0x59, 0x18, 0x71, 0x9b, 0xf2, 0xd3, 0x41, 0xd2, 0x1d, 0x59, 0x6e, 0xe2, 0x88, - 0xdb, 0x24, 0xf3, 0x5c, 0xc3, 0x0d, 0x68, 0x18, 0xaa, 0xbb, 0xf7, 0xb2, 0x56, 0x46, 0x65, 0x29, - 0x1a, 0x18, 0x64, 0x0e, 0x8a, 0xdc, 0x95, 0x5a, 0x1e, 0xad, 0xb8, 0xce, 0xcc, 0xbd, 0x96, 0x51, - 0x94, 0x93, 0x2f, 0x5a, 0x00, 0x42, 0x40, 0xa6, 0xef, 0xcb, 0x5d, 0x12, 0xf3, 0x6d, 0x26, 0x46, - 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0x59, 0x87, 0x31, 0xa6, 0x3e, 0xfb, 0xcd, 0x13, 0x6f, - 0x8a, 0x42, 0x01, 0xe2, 0x34, 0x50, 0xd2, 0x62, 0x6d, 0x15, 0xd0, 0xa8, 0x17, 0x78, 0xac, 0x69, - 0xf9, 0x36, 0x58, 0x12, 0x52, 0xa0, 0x2e, 0x45, 0x03, 0xc3, 0xfe, 0x17, 0x23, 0x70, 0x3e, 0x4b, - 0x74, 0xb6, 0xdb, 0x8c, 0x09, 0x69, 0xa5, 0x95, 0xe0, 0x67, 0xf3, 0x6f, 0x1f, 0xe9, 0xbe, 0xa4, - 0x6f, 0x6c, 0xa4, 0x2f, 0xa9, 0xe4, 0x4b, 0x7e, 0x56, 0xb7, 0xd0, 0xc8, 0x09, 0x5b, 0x48, 0x53, - 0x4e, 0xb5, 0xd2, 0x65, 0x18, 0x0d, 0x59, 0xcf, 0x17, 0x92, 0x37, 0x3f, 0xbc, 0x8f, 0x38, 0x84, - 0x61, 0xf4, 0x3c, 0x37, 0x92, 0xf1, 0x47, 0x1a, 0xe3, 0x8e, 0xe7, 0x46, 0xc8, 0x21, 0xf6, 0x37, - 0x47, 0x60, 0x76, 0xf0, 0x47, 0x91, 0x6f, 0x5a, 0x00, 0x4d, 0x76, 0x38, 0x0a, 0xb9, 0x13, 0xbf, - 0x70, 0xf7, 0x72, 0x4e, 0xab, 0x0d, 0x97, 0x14, 0xa7, 0xd8, 0x0f, 0x51, 0x17, 0x85, 0x68, 0x08, - 0x42, 0xae, 0xaa, 0xa1, 0xcf, 0x6f, 0xad, 0xc4, 0x64, 0xd2, 0x75, 0x56, 0x35, 0x04, 0x0d, 0x2c, - 0x76, 0xfa, 0xf5, 0x9c, 0x0e, 0x0d, 0xbb, 0x8e, 0x8e, 0xe6, 0xe2, 0xa7, 0xdf, 0x5b, 0xaa, 0x10, - 0x63, 0xb8, 0xdd, 0x86, 0xa7, 0x8e, 0x20, 0x67, 0x4e, 0xc1, 0x32, 0xf6, 0x9f, 0x5a, 0xf0, 0x98, - 0xf4, 0xc4, 0xfb, 0x0b, 0xe3, 0xd6, 0xf9, 0x67, 0x16, 0x3c, 0x31, 0xe0, 0x9b, 0x1f, 0x82, 0x77, - 0xe7, 0x9b, 0x49, 0xef, 0xce, 0x3b, 0xc3, 0x0e, 0xe9, 0xcc, 0xef, 0x18, 0xe0, 0xe4, 0xf9, 0x9d, - 0x51, 0x38, 0xc3, 0x96, 0xad, 0xa6, 0xdf, 0xca, 0x69, 0xe3, 0x7c, 0x0a, 0x8a, 0x9f, 0x65, 0x1b, - 0x50, 0x7a, 0x90, 0xf1, 0x5d, 0x09, 0x05, 0x8c, 0x7c, 0xc9, 0x82, 0xf1, 0xcf, 0xca, 0x3d, 0x55, - 0x9c, 0xe5, 0x86, 0x5c, 0x0c, 0x13, 0xdf, 0x30, 0x2f, 0x77, 0x48, 0x11, 0x83, 0xa3, 0x7d, 0x39, - 0xd5, 0x56, 0xaa, 0x38, 0x93, 0x67, 0x60, 0x7c, 0xd3, 0x0f, 0x3a, 0xbd, 0xb6, 0x93, 0x0e, 0xfc, - 0xbc, 0x2e, 0x8a, 0x51, 0xc1, 0xd9, 0x24, 0x77, 0xba, 0xee, 0xeb, 0x34, 0x08, 0x45, 0x48, 0x46, - 0x62, 0x92, 0x57, 0x35, 0x04, 0x0d, 0x2c, 0x5e, 0xa7, 0xd5, 0x0a, 0x68, 0xcb, 0x89, 0xfc, 0x80, - 0xef, 0x1c, 0x66, 0x1d, 0x0d, 0x41, 0x03, 0x8b, 0x3c, 0x80, 0x72, 0x48, 0x1b, 0x01, 0x8d, 0x90, - 0x6e, 0xca, 0x63, 0xd1, 0x2b, 0xc3, 0x5a, 0x18, 0x24, 0xb9, 0xd8, 0xa9, 0x51, 0x17, 0x61, 0xcc, - 0x6c, 0xf6, 0x63, 0x30, 0x61, 0x36, 0xdb, 0xb1, 0x22, 0x89, 0x3e, 0x0e, 0xd2, 0x9d, 0x34, 0xb5, - 0x18, 0x5a, 0x47, 0x59, 0x0c, 0xed, 0xff, 0x34, 0x02, 0x86, 0x15, 0xec, 0x21, 0x2c, 0x32, 0x5e, - 0x62, 0x91, 0x19, 0xd2, 0x82, 0x63, 0xd8, 0xf4, 0x06, 0xc5, 0x55, 0xee, 0xa4, 0xe2, 0x2a, 0x6f, - 0xe5, 0xc6, 0xf1, 0xe0, 0xb0, 0xca, 0x1f, 0x58, 0xf0, 0x44, 0x8c, 0xdc, 0x6f, 0x3d, 0x3f, 0x7c, - 0xc7, 0x78, 0x01, 0x2a, 0x4e, 0x5c, 0x4d, 0x4e, 0x69, 0x23, 0xa8, 0x4d, 0x83, 0xd0, 0xc4, 0x8b, - 0x03, 0x72, 0x0a, 0x27, 0x0c, 0xc8, 0x19, 0x3d, 0x38, 0x20, 0xc7, 0xfe, 0xf1, 0x08, 0x5c, 0xec, - 0xff, 0x32, 0xd3, 0x4b, 0xfd, 0xf0, 0x6f, 0x4b, 0xfb, 0xb1, 0x8f, 0x9c, 0xd8, 0x8f, 0xbd, 0x70, - 0x54, 0x3f, 0x76, 0xed, 0x3d, 0x3e, 0x7a, 0xea, 0xde, 0xe3, 0x75, 0xb8, 0xa0, 0x5c, 0x55, 0xaf, - 0xfb, 0x81, 0x8c, 0x4a, 0x51, 0x6b, 0x57, 0xa9, 0x76, 0x51, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, - 0x5d, 0xd7, 0xfe, 0x41, 0x01, 0xce, 0xc5, 0xcd, 0xbe, 0xe8, 0x7b, 0x4d, 0x97, 0x7b, 0x3b, 0xbd, - 0x04, 0xa3, 0xd1, 0x6e, 0x57, 0x35, 0xf6, 0x5f, 0x56, 0xe2, 0xac, 0xef, 0x76, 0x59, 0x6f, 0x3f, - 0x96, 0x51, 0x85, 0xdf, 0x5f, 0xf0, 0x4a, 0x64, 0x45, 0xcf, 0x0e, 0xd1, 0x03, 0xcf, 0x27, 0x47, - 0xf3, 0xbb, 0x7b, 0x73, 0x19, 0xf9, 0x25, 0xe6, 0x35, 0xa5, 0xe4, 0x98, 0x27, 0xf7, 0x60, 0xb2, - 0xed, 0x84, 0xd1, 0x9d, 0x6e, 0xd3, 0x89, 0xe8, 0xba, 0x2b, 0xfd, 0x88, 0x8e, 0x17, 0xc8, 0xa3, - 0x1d, 0x2e, 0x56, 0x12, 0x94, 0x30, 0x45, 0x99, 0xec, 0x00, 0x61, 0x25, 0xeb, 0x81, 0xe3, 0x85, - 0xe2, 0xab, 0x18, 0xbf, 0xe3, 0x47, 0x65, 0xe9, 0x43, 0xfb, 0x4a, 0x1f, 0x35, 0xcc, 0xe0, 0x40, - 0x9e, 0x86, 0xb1, 0x80, 0x3a, 0xa1, 0xde, 0x88, 0xf4, 0xfc, 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, - 0xa8, 0xb1, 0x43, 0x26, 0xd4, 0x1f, 0x5a, 0x30, 0x19, 0x77, 0xd3, 0x43, 0x50, 0x7a, 0x3a, 0x49, - 0xa5, 0xe7, 0x46, 0x5e, 0x4b, 0xe2, 0x00, 0x3d, 0xe7, 0x4f, 0xc6, 0xcd, 0xef, 0xe3, 0xa1, 0x23, - 0x9f, 0x33, 0x23, 0x09, 0xac, 0x3c, 0xe2, 0xf9, 0x12, 0x7a, 0xe6, 0x81, 0x21, 0x04, 0x4c, 0xcb, - 0x6a, 0x4a, 0x0d, 0x4a, 0x0e, 0x7b, 0xad, 0x65, 0x29, 0xcd, 0x2a, 0x4b, 0xcb, 0x52, 0x75, 0xc8, - 0x1d, 0x78, 0xac, 0x1b, 0xf8, 0x3c, 0xc3, 0xc1, 0x12, 0x75, 0x9a, 0x6d, 0xd7, 0xa3, 0xca, 0xc0, - 0x24, 0xfc, 0x7d, 0x9e, 0xd8, 0xdf, 0x9b, 0x7b, 0x6c, 0x2d, 0x1b, 0x05, 0x07, 0xd5, 0x4d, 0xc6, - 0xc8, 0x8e, 0x1e, 0x21, 0x46, 0xf6, 0x97, 0xb4, 0x19, 0x57, 0x87, 0x63, 0x7c, 0x2a, 0xaf, 0xae, - 0xcc, 0x0a, 0xcc, 0xd0, 0x43, 0xaa, 0x2a, 0x99, 0xa2, 0x66, 0x3f, 0xd8, 0x56, 0x38, 0x76, 0x42, - 0x5b, 0x61, 0x1c, 0x81, 0x33, 0xfe, 0x5e, 0x46, 0xe0, 0x94, 0xde, 0x57, 0x11, 0x38, 0xdf, 0xb2, - 0xe0, 0x9c, 0xd3, 0x1f, 0xfb, 0x9e, 0x8f, 0xd9, 0x3a, 0x23, 0xa8, 0xbe, 0xf6, 0x84, 0x14, 0x32, - 0x2b, 0xc5, 0x00, 0x66, 0x89, 0x62, 0xbf, 0x53, 0x84, 0xe9, 0xb4, 0x92, 0x74, 0xfa, 0x41, 0xc2, - 0xbf, 0x62, 0xc1, 0xb4, 0x9a, 0xe0, 0xfa, 0xee, 0x5d, 0x1c, 0x6e, 0x56, 0x72, 0x5a, 0x57, 0x84, - 0xba, 0xa7, 0x73, 0xb7, 0xac, 0xa7, 0xb8, 0x61, 0x1f, 0x7f, 0xf2, 0x06, 0x54, 0xf4, 0x7d, 0xce, - 0x89, 0x22, 0x86, 0x79, 0x50, 0x6b, 0x35, 0x26, 0x81, 0x26, 0x3d, 0xf2, 0x8e, 0x05, 0xd0, 0x50, - 0x3b, 0x71, 0x4e, 0xf1, 0x58, 0x19, 0xda, 0x42, 0xac, 0xcf, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, - 0x57, 0xf9, 0x4d, 0x8e, 0x1e, 0x09, 0xca, 0xe7, 0xe1, 0x13, 0x79, 0x2f, 0x45, 0xb1, 0x17, 0x8b, - 0xd6, 0xf6, 0x0c, 0x50, 0x88, 0x09, 0x21, 0xec, 0x97, 0x40, 0x7b, 0x8b, 0xb3, 0x95, 0x95, 0xfb, - 0x8b, 0xaf, 0x39, 0xd1, 0x96, 0x1c, 0x82, 0x7a, 0x65, 0xbd, 0xae, 0x00, 0x18, 0xe3, 0xd8, 0x9f, - 0x81, 0xc9, 0x57, 0x02, 0xa7, 0xbb, 0xe5, 0xf2, 0x1b, 0x13, 0x76, 0x32, 0x7f, 0x06, 0xc6, 0x9d, - 0x66, 0x33, 0x2b, 0xcd, 0x50, 0x55, 0x14, 0xa3, 0x82, 0x1f, 0xe9, 0x10, 0x6e, 0xff, 0x3b, 0x0b, - 0x48, 0x7c, 0xc7, 0xed, 0x7a, 0xad, 0x55, 0x27, 0x6a, 0x6c, 0xb1, 0x23, 0xdc, 0x16, 0x2f, 0xcd, - 0x3a, 0xc2, 0xdd, 0xd0, 0x10, 0x34, 0xb0, 0xc8, 0x5b, 0x50, 0x11, 0xff, 0x5e, 0xd7, 0x07, 0xc4, - 0xe1, 0x9d, 0xde, 0xf9, 0x9e, 0xc7, 0x65, 0x12, 0xa3, 0xf0, 0x46, 0xcc, 0x01, 0x4d, 0x76, 0xac, - 0xa9, 0x96, 0xbd, 0xcd, 0x76, 0xef, 0x41, 0x73, 0x23, 0x6e, 0xaa, 0x6e, 0xe0, 0x6f, 0xba, 0x6d, - 0x9a, 0x6e, 0xaa, 0x35, 0x51, 0x8c, 0x0a, 0x7e, 0xb4, 0xa6, 0xfa, 0xb7, 0x16, 0x9c, 0x5f, 0x0e, - 0x23, 0xd7, 0x5f, 0xa2, 0x61, 0xc4, 0x76, 0x3e, 0xb6, 0x3e, 0xf6, 0xda, 0x47, 0x09, 0xfc, 0x58, - 0x82, 0x69, 0x79, 0x03, 0xde, 0xdb, 0x08, 0x69, 0x64, 0x1c, 0x35, 0xf4, 0x3c, 0x5e, 0x4c, 0xc1, - 0xb1, 0xaf, 0x06, 0xa3, 0x22, 0xaf, 0xc2, 0x63, 0x2a, 0x85, 0x24, 0x95, 0x7a, 0x0a, 0x8e, 0x7d, - 0x35, 0xec, 0xef, 0x17, 0xe0, 0x1c, 0xff, 0x8c, 0x54, 0xd0, 0xd6, 0xd7, 0x07, 0x05, 0x6d, 0x0d, - 0x39, 0x95, 0x39, 0xaf, 0x13, 0x84, 0x6c, 0xfd, 0x4d, 0x0b, 0xa6, 0x9a, 0xc9, 0x96, 0xce, 0xc7, - 0x22, 0x98, 0xd5, 0x87, 0xc2, 0xf7, 0x31, 0x55, 0x88, 0x69, 0xfe, 0xe4, 0xd7, 0x2c, 0x98, 0x4a, - 0x8a, 0xa9, 0x56, 0xf7, 0x53, 0x68, 0x24, 0x1d, 0xac, 0x90, 0x2c, 0x0f, 0x31, 0x2d, 0x82, 0xfd, - 0xbd, 0x11, 0xd9, 0xa5, 0xa7, 0x11, 0x91, 0x44, 0xee, 0x43, 0x39, 0x6a, 0x87, 0xa2, 0x50, 0x7e, - 0xed, 0x90, 0x87, 0xd6, 0xf5, 0x95, 0xba, 0x70, 0x75, 0x89, 0xf5, 0x4a, 0x59, 0xc2, 0xf4, 0x63, - 0xc5, 0x8b, 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x4e, 0xcb, 0xeb, 0x8b, 0x6b, 0x69, 0xc6, 0xb2, - 0x84, 0x31, 0x56, 0xbc, 0xec, 0xdf, 0xb2, 0xa0, 0x7c, 0xd3, 0x57, 0xeb, 0xc8, 0xcf, 0xe5, 0x60, - 0x8b, 0xd2, 0x2a, 0xab, 0x56, 0x5a, 0xe2, 0x53, 0xd0, 0xcb, 0x09, 0x4b, 0xd4, 0x93, 0x06, 0xed, - 0x79, 0x9e, 0x6d, 0x91, 0x91, 0xba, 0xe9, 0x6f, 0x0c, 0x34, 0x5c, 0xff, 0x7a, 0x11, 0xce, 0xbc, - 0xea, 0xec, 0x52, 0x2f, 0x72, 0x8e, 0xbf, 0x49, 0xbc, 0x00, 0x15, 0xa7, 0xcb, 0x6f, 0x51, 0x8d, - 0x63, 0x48, 0x6c, 0xdc, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x08, 0x0f, 0xca, 0x5a, 0x8a, - 0x16, 0x53, 0x70, 0xec, 0xab, 0x41, 0x6e, 0x02, 0x91, 0x21, 0xf5, 0xd5, 0x46, 0xc3, 0xef, 0x79, - 0x62, 0x49, 0x13, 0x76, 0x1f, 0x7d, 0x1e, 0x5e, 0xed, 0xc3, 0xc0, 0x8c, 0x5a, 0xe4, 0xd3, 0x30, - 0xd3, 0xe0, 0x94, 0xe5, 0xe9, 0xc8, 0xa4, 0x28, 0x4e, 0xc8, 0x3a, 0xe0, 0x66, 0x71, 0x00, 0x1e, - 0x0e, 0xa4, 0xc0, 0x24, 0x0d, 0x23, 0x3f, 0x70, 0x5a, 0xd4, 0xa4, 0x3b, 0x96, 0x94, 0xb4, 0xde, - 0x87, 0x81, 0x19, 0xb5, 0xc8, 0xe7, 0xa1, 0x1c, 0x6d, 0x05, 0x34, 0xdc, 0xf2, 0xdb, 0x4d, 0x69, - 0xde, 0x1d, 0xd2, 0x18, 0x28, 0x7b, 0x7f, 0x5d, 0x51, 0x35, 0x86, 0xb7, 0x2a, 0xc2, 0x98, 0x27, - 0x09, 0x60, 0x2c, 0x6c, 0xf8, 0x5d, 0x1a, 0xca, 0x53, 0xc5, 0xcd, 0x5c, 0xb8, 0x73, 0xe3, 0x96, - 0x61, 0x86, 0xe4, 0x1c, 0x50, 0x72, 0xb2, 0x7f, 0x77, 0x04, 0x26, 0x4c, 0xc4, 0x23, 0xac, 0x4d, - 0x5f, 0xb2, 0x60, 0xa2, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0xe3, 0x54, 0x11, 0xc3, 0x6b, 0x14, 0x8c, - 0xd4, 0x12, 0x8d, 0x1c, 0xb7, 0x6d, 0x58, 0xeb, 0x0c, 0x36, 0x98, 0x60, 0x4a, 0xbe, 0x66, 0xc1, - 0x54, 0xec, 0x92, 0x19, 0xdb, 0xfa, 0x72, 0x15, 0x44, 0x2f, 0xf5, 0xd7, 0x92, 0x9c, 0x30, 0xcd, - 0xda, 0xde, 0x80, 0xe9, 0x74, 0x6f, 0xb3, 0xa6, 0xec, 0x3a, 0x72, 0xae, 0x17, 0xe2, 0xa6, 0x5c, - 0x73, 0xc2, 0x10, 0x39, 0x84, 0x3c, 0x0b, 0xa5, 0x8e, 0x13, 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x56, - 0x2c, 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, 0x18, 0x26, 0x56, 0x1d, 0xaf, 0x45, 0x9b, - 0x72, 0x1d, 0x3e, 0x3c, 0x26, 0xf6, 0x8f, 0x47, 0xa1, 0x62, 0x1c, 0x1f, 0x4f, 0xff, 0x9c, 0x95, - 0x48, 0x81, 0x54, 0xc8, 0x31, 0x05, 0xd2, 0x27, 0x01, 0x36, 0x5d, 0xcf, 0x0d, 0xb7, 0x4e, 0x98, - 0x5c, 0x89, 0x7b, 0x05, 0x5c, 0xd7, 0x14, 0xd0, 0xa0, 0x16, 0x5f, 0xbd, 0x16, 0x0f, 0xc8, 0x53, - 0xf8, 0x8e, 0x65, 0x6c, 0x37, 0x63, 0x79, 0xb8, 0x9a, 0x18, 0x1d, 0x33, 0xaf, 0xb6, 0x1f, 0x71, - 0x2b, 0x76, 0xd0, 0xae, 0xb4, 0x0e, 0xa5, 0x80, 0x86, 0xbd, 0x0e, 0x3d, 0x51, 0x1a, 0x24, 0xee, - 0xf4, 0x83, 0xb2, 0x3e, 0x6a, 0x4a, 0xb3, 0x2f, 0xc1, 0x99, 0x84, 0x08, 0xc7, 0xba, 0x61, 0xf2, - 0x21, 0xd3, 0x46, 0x71, 0x92, 0xfb, 0x26, 0xd6, 0x17, 0x6d, 0x23, 0xfd, 0x91, 0xee, 0x0b, 0xe1, - 0xda, 0x25, 0x60, 0xf6, 0x8f, 0xc7, 0x40, 0x7a, 0x4f, 0x1c, 0x61, 0xb9, 0x32, 0xef, 0x4c, 0x47, - 0x4e, 0x70, 0x67, 0x7a, 0x13, 0x26, 0x5c, 0xcf, 0x8d, 0x5c, 0xa7, 0xcd, 0xed, 0x4f, 0x72, 0x3b, - 0x55, 0x61, 0x00, 0x13, 0xcb, 0x06, 0x2c, 0x83, 0x4e, 0xa2, 0x2e, 0x79, 0x0d, 0x8a, 0x7c, 0xbf, - 0x91, 0x03, 0xf8, 0xf8, 0x2e, 0x1e, 0xdc, 0xbb, 0x47, 0xc4, 0x06, 0x0a, 0x4a, 0xfc, 0xf0, 0x21, - 0xf2, 0x3f, 0xe9, 0xe3, 0xb7, 0x1c, 0xc7, 0xf1, 0xe1, 0x23, 0x05, 0xc7, 0xbe, 0x1a, 0x8c, 0xca, - 0xa6, 0xe3, 0xb6, 0x7b, 0x01, 0x8d, 0xa9, 0x8c, 0x25, 0xa9, 0x5c, 0x4f, 0xc1, 0xb1, 0xaf, 0x06, - 0xd9, 0x84, 0x09, 0x59, 0x26, 0x1c, 0xf6, 0xc6, 0x4f, 0xf8, 0x95, 0xdc, 0x31, 0xf3, 0xba, 0x41, - 0x09, 0x13, 0x74, 0x49, 0x0f, 0xce, 0xba, 0x5e, 0xc3, 0xf7, 0x1a, 0xed, 0x5e, 0xe8, 0xee, 0xd0, - 0x38, 0x30, 0xef, 0x24, 0xcc, 0x2e, 0xec, 0xef, 0xcd, 0x9d, 0x5d, 0x4e, 0x93, 0xc3, 0x7e, 0x0e, - 0xe4, 0x0b, 0x16, 0x5c, 0x68, 0xf8, 0x5e, 0xc8, 0xf3, 0x87, 0xec, 0xd0, 0x6b, 0x41, 0xe0, 0x07, - 0x82, 0x77, 0xf9, 0x84, 0xbc, 0xb9, 0xd9, 0x73, 0x31, 0x8b, 0x24, 0x66, 0x73, 0x22, 0x6f, 0x42, - 0xa9, 0x1b, 0xf8, 0x3b, 0x6e, 0x93, 0x06, 0xd2, 0xf9, 0x73, 0x25, 0x8f, 0xa4, 0x4a, 0x6b, 0x92, - 0x66, 0xbc, 0xf4, 0xa8, 0x12, 0xd4, 0xfc, 0xec, 0xff, 0x5b, 0x81, 0xc9, 0x24, 0x3a, 0xf9, 0x05, - 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x45, 0x75, 0x80, 0xd5, 0xad, 0x61, 0xd3, 0xe6, 0x28, 0x7a, - 0xca, 0x61, 0x8a, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, 0x49, 0x00, 0xe3, 0xdb, 0x62, 0xdb, 0x95, - 0x5a, 0xc8, 0xab, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x8f, 0x0c, 0x92, 0x45, 0xa8, 0x18, 0x91, 0x0d, - 0x28, 0xdc, 0xa7, 0x1b, 0xf9, 0xe4, 0x6c, 0xb8, 0x4b, 0xe5, 0x69, 0xa6, 0x36, 0xbe, 0xbf, 0x37, - 0x57, 0xb8, 0x4b, 0x37, 0x90, 0x11, 0x67, 0xdf, 0xd5, 0x14, 0x5e, 0x13, 0x72, 0xa9, 0x78, 0x35, - 0x47, 0x17, 0x0c, 0xf1, 0x5d, 0xb2, 0x08, 0x15, 0x23, 0xf2, 0x26, 0x94, 0xef, 0x3b, 0x3b, 0x74, - 0x33, 0xf0, 0xbd, 0x48, 0x7a, 0xe9, 0x0d, 0x19, 0xd6, 0x72, 0x57, 0x91, 0x93, 0x7c, 0xf9, 0xf6, - 0xae, 0x0b, 0x31, 0x66, 0x47, 0x76, 0xa0, 0xe4, 0xd1, 0xfb, 0x48, 0xdb, 0x6e, 0x23, 0x9f, 0x30, - 0x92, 0x5b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0x7b, 0xfe, - 0x46, 0x3e, 0xce, 0x1c, 0xfa, 0x64, 0x2a, 0xfa, 0xf2, 0xa6, 0xbf, 0x81, 0x8c, 0x38, 0x9b, 0x23, - 0x0d, 0xed, 0x22, 0x26, 0x97, 0xa9, 0x5b, 0xf9, 0xba, 0xc6, 0x89, 0x39, 0x12, 0x97, 0xa2, 0xc1, - 0x91, 0xb5, 0x6d, 0x4b, 0x1a, 0x2b, 0xe5, 0x42, 0x35, 0x64, 0xdb, 0x26, 0x4d, 0x9f, 0xa2, 0x6d, - 0x55, 0x19, 0x6a, 0x5e, 0x8c, 0xaf, 0x2b, 0x2d, 0x7f, 0xf9, 0x2c, 0x55, 0x49, 0x3b, 0xa2, 0xe0, - 0xab, 0xca, 0x50, 0xf3, 0x62, 0xed, 0x1d, 0x6e, 0xef, 0xde, 0x77, 0xda, 0xdb, 0xae, 0xd7, 0x92, - 0x01, 0xc3, 0xc3, 0x06, 0xd8, 0x6d, 0xef, 0xde, 0x15, 0xf4, 0xcc, 0xf6, 0x8e, 0x4b, 0xd1, 0xe0, - 0x48, 0xfe, 0x9e, 0xa5, 0x83, 0x80, 0x26, 0xf2, 0x70, 0x9f, 0x4a, 0x2e, 0xb9, 0x32, 0x26, 0x48, - 0x28, 0x8a, 0x3f, 0xad, 0x3d, 0x3e, 0x79, 0xe1, 0x57, 0xff, 0x68, 0x6e, 0x86, 0x7a, 0x0d, 0xbf, - 0xe9, 0x7a, 0xad, 0x85, 0x7b, 0xa1, 0xef, 0xcd, 0xa3, 0x73, 0x5f, 0xe9, 0xe8, 0x52, 0xa6, 0xd9, - 0x8f, 0x42, 0xc5, 0x20, 0x71, 0x98, 0xa2, 0x37, 0x61, 0x2a, 0x7a, 0xbf, 0x35, 0x06, 0x13, 0x66, - 0x06, 0xd4, 0x23, 0x68, 0x5f, 0xfa, 0xc4, 0x31, 0x72, 0x9c, 0x13, 0x07, 0x3b, 0x62, 0x1a, 0x17, - 0x5c, 0xca, 0xbc, 0xb5, 0x9c, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x4c, 0x8f, - 0xe1, 0xf3, 0xc2, 0xd4, 0x56, 0xa1, 0xd8, 0x15, 0x93, 0x6a, 0x6b, 0x42, 0x55, 0xbb, 0x0a, 0x10, - 0xa7, 0xea, 0x94, 0x17, 0x9f, 0x5a, 0x1f, 0x36, 0x52, 0x88, 0x1a, 0x58, 0xe4, 0x69, 0x18, 0x63, - 0xaa, 0x0f, 0x6d, 0xca, 0x7c, 0x06, 0xfa, 0x1c, 0x7f, 0x9d, 0x97, 0xa2, 0x84, 0x92, 0x17, 0x99, - 0x96, 0x1a, 0x2b, 0x2c, 0x32, 0x4d, 0xc1, 0xf9, 0x58, 0x4b, 0x8d, 0x61, 0x98, 0xc0, 0x64, 0xa2, - 0x53, 0xa6, 0x5f, 0xf0, 0xb5, 0xc1, 0x10, 0x9d, 0x2b, 0x1d, 0x28, 0x60, 0xdc, 0xae, 0x94, 0xd2, - 0x47, 0xf8, 0x9c, 0x2e, 0x1a, 0x76, 0xa5, 0x14, 0x1c, 0xfb, 0x6a, 0xb0, 0x8f, 0x91, 0x77, 0xb6, - 0x15, 0xe1, 0xaa, 0x3d, 0xe0, 0xb6, 0xf5, 0x17, 0xcd, 0xb3, 0x56, 0x8e, 0x73, 0x48, 0x8c, 0xda, - 0xa3, 0x1f, 0xb6, 0x86, 0x3b, 0x16, 0x7d, 0xd9, 0x82, 0xc9, 0xe4, 0x36, 0x94, 0xf7, 0xd5, 0x07, - 0xf9, 0x4b, 0x30, 0x1e, 0xb9, 0x1d, 0xea, 0xf7, 0xc4, 0x61, 0xbb, 0x20, 0x76, 0xf6, 0x75, 0x51, - 0x84, 0x0a, 0x66, 0xff, 0xc3, 0x31, 0x38, 0x77, 0xab, 0xe5, 0x7a, 0xe9, 0xac, 0x74, 0x59, 0x4f, - 0x50, 0x58, 0xc7, 0x7e, 0x82, 0x42, 0x47, 0x0d, 0xca, 0x07, 0x1e, 0xb2, 0xa3, 0x06, 0xd5, 0x6b, - 0x1b, 0x49, 0x5c, 0xf2, 0x87, 0x16, 0x3c, 0xe9, 0x34, 0xc5, 0xf9, 0xc1, 0x69, 0xcb, 0x52, 0x23, - 0x73, 0xba, 0x9c, 0xf9, 0xe1, 0x90, 0xda, 0x40, 0xff, 0xc7, 0xcf, 0x57, 0x0f, 0xe0, 0x2a, 0x46, - 0xc6, 0x4f, 0xc9, 0x2f, 0x78, 0xf2, 0x20, 0x54, 0x3c, 0x50, 0x7c, 0xf2, 0x57, 0x61, 0x2a, 0xf1, - 0xc1, 0xd2, 0x62, 0x5e, 0x16, 0x17, 0x1b, 0xf5, 0x24, 0x08, 0xd3, 0xb8, 0xe4, 0x7b, 0x16, 0xcc, - 0x08, 0xf3, 0x6c, 0x46, 0xd3, 0x88, 0x1b, 0x5d, 0x3f, 0xff, 0xa6, 0x59, 0x1c, 0xc0, 0x51, 0x34, - 0x4b, 0x6c, 0xaf, 0x1d, 0x80, 0x86, 0x03, 0x45, 0x9e, 0xbd, 0x0d, 0x1f, 0x38, 0xb4, 0xdd, 0x8f, - 0x95, 0x67, 0xff, 0x55, 0xb8, 0x78, 0xa0, 0xb4, 0xc7, 0x9a, 0xb1, 0xdf, 0xb5, 0x60, 0xc2, 0xcc, - 0xae, 0x45, 0x9e, 0x85, 0x52, 0xe4, 0x6f, 0x53, 0xef, 0x4e, 0xa0, 0xfc, 0xad, 0xf5, 0x6a, 0xb1, - 0xce, 0xcb, 0x71, 0x05, 0x35, 0x06, 0xc3, 0x6e, 0xb4, 0x5d, 0xea, 0x45, 0xcb, 0x4d, 0x39, 0x07, - 0x34, 0xf6, 0xa2, 0x28, 0x5f, 0x42, 0x8d, 0x21, 0x1c, 0x15, 0xd9, 0x6f, 0xe1, 0xf1, 0x2b, 0xed, - 0x0a, 0x86, 0xa3, 0x62, 0x0c, 0xc3, 0x04, 0x26, 0xb1, 0xb5, 0x9d, 0x78, 0x34, 0xbe, 0x1c, 0x4a, - 0xd9, 0x75, 0xbf, 0x6d, 0x41, 0x59, 0xdc, 0x73, 0x20, 0xdd, 0x4c, 0x79, 0x48, 0xa7, 0x2c, 0x31, - 0xd5, 0xb5, 0xe5, 0x2c, 0x0f, 0xe9, 0xcb, 0x30, 0xba, 0xed, 0x7a, 0xea, 0x4b, 0xf4, 0xde, 0xfe, - 0xaa, 0xeb, 0x35, 0x91, 0x43, 0xf4, 0xee, 0x5f, 0x18, 0xb8, 0xfb, 0x2f, 0x40, 0x59, 0x7b, 0xef, - 0xc8, 0x3d, 0x34, 0x76, 0x74, 0x56, 0x00, 0x8c, 0x71, 0xec, 0xdf, 0xb0, 0x60, 0x92, 0x07, 0xfc, - 0xc7, 0x46, 0x85, 0x17, 0xb4, 0x43, 0x9d, 0x90, 0xfb, 0x62, 0xd2, 0xa1, 0xee, 0xdd, 0xbd, 0xb9, - 0x8a, 0x48, 0x11, 0x90, 0xf4, 0xaf, 0xfb, 0x94, 0xb4, 0x44, 0x72, 0xb7, 0xbf, 0x91, 0x63, 0x1b, - 0xca, 0x62, 0x31, 0x15, 0x11, 0x8c, 0xe9, 0xd9, 0x6f, 0xc1, 0x84, 0x19, 0x4b, 0x47, 0x5e, 0x80, - 0x4a, 0xd7, 0xf5, 0x5a, 0xc9, 0x98, 0x6b, 0x7d, 0x5b, 0xb3, 0x16, 0x83, 0xd0, 0xc4, 0xe3, 0xd5, - 0xfc, 0xb8, 0x5a, 0xea, 0x92, 0x67, 0xcd, 0x37, 0xab, 0xc5, 0x7f, 0x6c, 0x0f, 0x20, 0x0e, 0x0c, - 0x3f, 0x92, 0x05, 0x6c, 0x4c, 0x5c, 0xa0, 0x08, 0x8d, 0x8e, 0x27, 0xf9, 0x18, 0x13, 0x23, 0xfc, - 0xdd, 0xbd, 0x83, 0x34, 0x46, 0x51, 0x8b, 0x3f, 0x21, 0x92, 0x11, 0x23, 0x9a, 0xfb, 0x13, 0x22, - 0x19, 0x3c, 0xde, 0xbb, 0x27, 0x44, 0xb2, 0x84, 0xf9, 0xf3, 0xf5, 0x84, 0xc8, 0x27, 0xe0, 0xb8, - 0xd9, 0x84, 0x99, 0x82, 0x76, 0xdf, 0xcc, 0xfa, 0xa1, 0x5b, 0x5c, 0xa6, 0xfd, 0x90, 0x50, 0xfb, - 0xf7, 0x46, 0x61, 0x3a, 0x6d, 0xa7, 0xc9, 0xdb, 0x05, 0x86, 0x7c, 0xcd, 0x82, 0x49, 0x27, 0x91, - 0xb9, 0x31, 0xa7, 0xf7, 0xc8, 0x12, 0x34, 0x8d, 0xcc, 0x81, 0x89, 0x72, 0x4c, 0xf1, 0x36, 0x75, - 0xad, 0xd1, 0xc1, 0xba, 0x16, 0xdb, 0x04, 0x5c, 0xae, 0xf6, 0x06, 0x54, 0xba, 0x73, 0x4f, 0xc7, - 0xe6, 0x66, 0x51, 0x8e, 0x1a, 0x83, 0x3c, 0x80, 0x71, 0xe1, 0x2c, 0xa3, 0xbc, 0xa2, 0x56, 0x73, - 0xb2, 0x27, 0x09, 0x7f, 0x9c, 0xb8, 0x0b, 0xc4, 0xff, 0x10, 0x15, 0x3b, 0xa6, 0x63, 0x43, 0xe0, - 0x78, 0x2d, 0xca, 0xdb, 0x5c, 0x5a, 0x40, 0x5e, 0xcf, 0xcb, 0x74, 0x87, 0x9a, 0x72, 0x35, 0x68, - 0x85, 0x32, 0x26, 0x53, 0x97, 0xa1, 0xc1, 0xd9, 0xfe, 0x15, 0x0b, 0x66, 0x06, 0x55, 0x64, 0x03, - 0x85, 0xaf, 0xba, 0x72, 0x44, 0x19, 0xa9, 0x20, 0x9c, 0x20, 0x42, 0x01, 0x23, 0x17, 0xa1, 0x40, - 0xf5, 0x46, 0xa5, 0xf3, 0x56, 0x5e, 0xf3, 0x9a, 0xc8, 0xca, 0xc9, 0x55, 0x18, 0x0d, 0x23, 0xda, - 0x4d, 0xc5, 0x3b, 0x8c, 0xb2, 0xc5, 0x33, 0xc3, 0x60, 0xcf, 0x71, 0xed, 0x0f, 0xc3, 0x31, 0x93, - 0x4f, 0xdb, 0xd7, 0x80, 0xa0, 0xdf, 0x6e, 0x6f, 0x38, 0x8d, 0xed, 0xbb, 0xae, 0xd7, 0xf4, 0xef, - 0xf3, 0x8d, 0x61, 0x01, 0xca, 0x81, 0x8c, 0x3f, 0x0f, 0xe5, 0x9c, 0xd2, 0x3b, 0x8b, 0x0a, 0x4c, - 0x0f, 0x31, 0xc6, 0xb1, 0xbf, 0x37, 0x02, 0xe3, 0x32, 0x59, 0xc2, 0x43, 0x08, 0xb6, 0xd9, 0x4e, - 0xb8, 0x38, 0x2c, 0xe7, 0x92, 0xe3, 0x61, 0x60, 0xa4, 0x4d, 0x98, 0x8a, 0xb4, 0x79, 0x35, 0x1f, - 0x76, 0x07, 0x87, 0xd9, 0x7c, 0xa7, 0x08, 0x53, 0xa9, 0xe4, 0x13, 0xa9, 0x3c, 0xf5, 0xd6, 0x7b, - 0x92, 0xa7, 0x9e, 0x84, 0x89, 0xb7, 0x0a, 0xf2, 0x73, 0xcd, 0xfd, 0xc9, 0xb3, 0x05, 0x79, 0x39, - 0x4d, 0x17, 0xdf, 0x3f, 0x4e, 0xd3, 0xff, 0xcd, 0x82, 0xc7, 0x07, 0xa6, 0x50, 0xe1, 0xc9, 0x08, - 0x83, 0x24, 0x54, 0xae, 0x17, 0x39, 0xa7, 0xa5, 0xd2, 0xee, 0x10, 0xe9, 0xfc, 0x71, 0x69, 0xf6, - 0xe4, 0x79, 0x98, 0xe0, 0x6b, 0x33, 0x5b, 0x39, 0xd9, 0xda, 0x2b, 0x6e, 0x73, 0xf9, 0xbd, 0x5e, - 0xdd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x2d, 0x0b, 0x66, 0x06, 0xa5, 0xa6, 0x3b, 0x82, 0x9e, 0xfb, - 0x57, 0x52, 0xc1, 0x4a, 0x73, 0x7d, 0xc1, 0x4a, 0x29, 0x6b, 0xa3, 0x8a, 0x4b, 0x32, 0x0c, 0x7d, - 0x85, 0x43, 0x62, 0x71, 0x7e, 0xbf, 0x00, 0xd3, 0x52, 0xc4, 0xf8, 0x88, 0xf2, 0x62, 0x22, 0xc4, - 0xea, 0xa7, 0x52, 0x21, 0x56, 0xe7, 0xd3, 0xf8, 0x3f, 0x89, 0xaf, 0x7a, 0x7f, 0xc5, 0x57, 0x7d, - 0xb5, 0x08, 0x17, 0x32, 0x93, 0xc0, 0x91, 0xaf, 0x64, 0xec, 0x14, 0x77, 0x73, 0xce, 0x36, 0xa7, - 0x83, 0xc0, 0x4f, 0x37, 0x28, 0xe9, 0xd7, 0xcc, 0x60, 0x20, 0xb1, 0xfa, 0x6f, 0x9e, 0x42, 0xde, - 0xbc, 0xe3, 0xc6, 0x05, 0x3d, 0xdc, 0x77, 0xfc, 0xfe, 0x1c, 0x2c, 0xf5, 0x5f, 0x2d, 0xc0, 0x95, - 0xa3, 0xb6, 0xec, 0xfb, 0x34, 0x90, 0x36, 0x4c, 0x04, 0xd2, 0x3e, 0x24, 0xd5, 0xe6, 0x54, 0x62, - 0x6a, 0xff, 0xc1, 0xa8, 0xde, 0x77, 0xfb, 0x27, 0xec, 0x91, 0x2c, 0x2f, 0xe3, 0x4c, 0xf5, 0x55, - 0xaf, 0x1d, 0xc4, 0x7b, 0xc3, 0x78, 0x5d, 0x14, 0xbf, 0xbb, 0x37, 0x77, 0x36, 0xce, 0x96, 0x24, - 0x0b, 0x51, 0x55, 0x22, 0x57, 0xa0, 0x14, 0x08, 0xa8, 0x0a, 0x1d, 0x94, 0x0e, 0x5c, 0xa2, 0x0c, - 0x35, 0x94, 0x7c, 0xde, 0x38, 0x2b, 0x8c, 0x9e, 0x56, 0x52, 0xb0, 0x83, 0xfc, 0xd2, 0xde, 0x80, - 0x52, 0xa8, 0x52, 0xf2, 0x8b, 0xe9, 0xf4, 0xdc, 0x11, 0x23, 0x52, 0x9d, 0x0d, 0xda, 0x56, 0xf9, - 0xf9, 0xc5, 0xf7, 0xe9, 0xec, 0xfd, 0x9a, 0x24, 0xb1, 0xb5, 0x65, 0x42, 0xdc, 0x9b, 0x41, 0xbf, - 0x55, 0x82, 0x44, 0x30, 0x2e, 0xdf, 0xe5, 0x96, 0xc7, 0xd9, 0xd5, 0x9c, 0x42, 0xbb, 0xa4, 0xe3, - 0x3f, 0x3f, 0xf0, 0x2b, 0x8b, 0x9c, 0x62, 0x65, 0xff, 0xc0, 0x82, 0x8a, 0x1c, 0x23, 0x0f, 0x21, - 0x34, 0xf7, 0x5e, 0x32, 0x34, 0xf7, 0x5a, 0x2e, 0x4b, 0xf8, 0x80, 0xb8, 0xdc, 0x7b, 0x30, 0x61, - 0xa6, 0x63, 0x25, 0x9f, 0x34, 0xb6, 0x20, 0x6b, 0x98, 0x94, 0x83, 0x6a, 0x93, 0x8a, 0xb7, 0x27, - 0xfb, 0x9f, 0x96, 0x75, 0x2b, 0xf2, 0x83, 0xb3, 0x39, 0xf2, 0xad, 0x03, 0x47, 0xbe, 0x39, 0xf0, - 0x46, 0xf2, 0x1f, 0x78, 0xaf, 0x41, 0x49, 0x2d, 0x8b, 0x52, 0x9b, 0x7a, 0xca, 0x8c, 0x04, 0x60, - 0x2a, 0x19, 0x23, 0x66, 0x4c, 0x17, 0x7e, 0x00, 0x8e, 0xef, 0x09, 0xd4, 0x72, 0xad, 0xc9, 0x90, - 0x37, 0xa1, 0x72, 0xdf, 0x0f, 0xb6, 0xdb, 0xbe, 0xc3, 0xdf, 0x41, 0x81, 0x3c, 0x9c, 0x4f, 0xb4, - 0xad, 0x5f, 0x84, 0x63, 0xdd, 0x8d, 0xe9, 0xa3, 0xc9, 0x8c, 0x54, 0x61, 0xaa, 0xe3, 0x7a, 0x48, - 0x9d, 0xa6, 0x8e, 0xc0, 0x1d, 0x15, 0x6f, 0x10, 0x28, 0xdd, 0x7e, 0x35, 0x09, 0xc6, 0x34, 0x3e, - 0xb7, 0xcb, 0x05, 0x09, 0x53, 0x87, 0x4c, 0x34, 0xbe, 0x36, 0xfc, 0x60, 0x4c, 0x9a, 0x4f, 0x44, - 0x3c, 0x52, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0xe7, 0xa0, 0x14, 0xaa, 0x17, 0x6f, 0x8b, 0x39, 0x9e, - 0x7a, 0xf4, 0xab, 0xb7, 0xba, 0x2b, 0xf5, 0xb3, 0xb7, 0x9a, 0x21, 0x59, 0x81, 0xf3, 0xca, 0x76, - 0x93, 0x78, 0xbc, 0x73, 0x2c, 0x4e, 0x96, 0x87, 0x19, 0x70, 0xcc, 0xac, 0xc5, 0x74, 0x5b, 0x9e, - 0xe6, 0x58, 0x5c, 0xf6, 0x1b, 0xf7, 0xe3, 0x7c, 0xfe, 0x35, 0x51, 0x42, 0x0f, 0x0a, 0x30, 0x2f, - 0x0d, 0x11, 0x60, 0x5e, 0x87, 0x0b, 0x69, 0x10, 0xcf, 0x82, 0xc8, 0x13, 0x2f, 0x1a, 0x5b, 0xe8, - 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x1c, 0x50, 0x7e, 0xca, 0xab, 0x2a, 0x3f, 0xc9, - 0x63, 0x7b, 0x84, 0xa3, 0x22, 0x80, 0x31, 0x2d, 0xd6, 0xef, 0x4e, 0xf2, 0x55, 0x80, 0xd7, 0x72, - 0x7c, 0x12, 0x5f, 0xf6, 0xfd, 0x80, 0xec, 0xa4, 0xf6, 0xbf, 0x9f, 0x82, 0x33, 0x09, 0x03, 0x14, - 0x79, 0x0a, 0x8a, 0x3c, 0x2d, 0x24, 0x5f, 0xad, 0x4a, 0xf1, 0x8a, 0x2a, 0x1a, 0x47, 0xc0, 0xc8, - 0x2f, 0x5b, 0x30, 0xd5, 0x4d, 0x5c, 0x6f, 0xa9, 0x85, 0x7c, 0x48, 0x9b, 0x76, 0xf2, 0xce, 0xcc, - 0x78, 0x4f, 0x27, 0xc9, 0x0c, 0xd3, 0xdc, 0xd9, 0x7a, 0x20, 0xc3, 0x2a, 0xda, 0x34, 0xe0, 0xd8, - 0x52, 0xd1, 0xd3, 0x24, 0x16, 0x93, 0x60, 0x4c, 0xe3, 0xb3, 0x1e, 0xe6, 0x5f, 0x37, 0xcc, 0xb3, - 0xc7, 0x55, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x65, 0x98, 0x94, 0xc9, 0xe0, 0xd7, 0xfc, 0xe6, 0x0d, - 0x27, 0xdc, 0x92, 0x47, 0x3e, 0x7d, 0x44, 0x5d, 0x4c, 0x40, 0x31, 0x85, 0xcd, 0xbf, 0x2d, 0xce, - 0xb8, 0xcf, 0x09, 0x8c, 0x25, 0x9f, 0x1b, 0x5a, 0x4c, 0x82, 0x31, 0x8d, 0x4f, 0x9e, 0x35, 0xb6, - 0x21, 0xe1, 0x80, 0xa3, 0x57, 0x83, 0x8c, 0xad, 0xa8, 0x0a, 0x53, 0x3d, 0x7e, 0x42, 0x6e, 0x2a, - 0xa0, 0x9c, 0x8f, 0x9a, 0xe1, 0x9d, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x25, 0x38, 0x13, 0xb0, 0xc5, - 0x56, 0x13, 0x10, 0x5e, 0x39, 0xda, 0x99, 0x02, 0x4d, 0x20, 0x26, 0x71, 0xc9, 0x2b, 0x70, 0x36, - 0x4e, 0x18, 0xac, 0x08, 0x08, 0x37, 0x1d, 0x9d, 0xbd, 0xb2, 0x9a, 0x46, 0xc0, 0xfe, 0x3a, 0xe4, - 0xaf, 0xc3, 0xb4, 0xd1, 0x12, 0xcb, 0x5e, 0x93, 0x3e, 0x90, 0x49, 0x5d, 0xf9, 0xf3, 0x79, 0x8b, - 0x29, 0x18, 0xf6, 0x61, 0x93, 0x8f, 0xc1, 0x64, 0xc3, 0x6f, 0xb7, 0xf9, 0x1a, 0x27, 0x9e, 0xba, - 0x11, 0xd9, 0x5b, 0x45, 0x9e, 0xdb, 0x04, 0x04, 0x53, 0x98, 0xe4, 0x26, 0x10, 0x7f, 0x83, 0xa9, - 0x57, 0xb4, 0xf9, 0x0a, 0xf5, 0xa8, 0xd4, 0x38, 0xce, 0x24, 0x83, 0xba, 0x6e, 0xf7, 0x61, 0x60, - 0x46, 0x2d, 0x9e, 0xfc, 0xd2, 0x08, 0x82, 0x9f, 0xcc, 0x23, 0xdd, 0x7e, 0xda, 0x9e, 0x73, 0x68, - 0x04, 0x7c, 0x00, 0x63, 0xc2, 0x23, 0x22, 0x9f, 0x34, 0xae, 0xe6, 0xab, 0x17, 0xf1, 0x1e, 0x21, - 0x4a, 0x51, 0x72, 0x22, 0xbf, 0x00, 0xe5, 0x0d, 0xf5, 0x04, 0x12, 0xcf, 0xdd, 0x3a, 0xf4, 0xbe, - 0x98, 0x7a, 0xcd, 0x2b, 0xb6, 0x57, 0x68, 0x00, 0xc6, 0x2c, 0xc9, 0xd3, 0x50, 0xb9, 0xb1, 0x56, - 0xd5, 0xa3, 0xf0, 0x2c, 0xef, 0xfd, 0x51, 0x56, 0x05, 0x4d, 0x00, 0x9b, 0x61, 0x5a, 0x7d, 0x23, - 0x49, 0xa7, 0x89, 0x0c, 0x6d, 0x8c, 0x61, 0x73, 0x17, 0x19, 0xac, 0xcf, 0x9c, 0x4b, 0x61, 0xcb, - 0x72, 0xd4, 0x18, 0xe4, 0x0d, 0xa8, 0xc8, 0xfd, 0x82, 0xaf, 0x4d, 0xe7, 0x4f, 0x96, 0x60, 0x01, - 0x63, 0x12, 0x68, 0xd2, 0xe3, 0xd7, 0xf7, 0xfc, 0x65, 0x18, 0x7a, 0xbd, 0xd7, 0x6e, 0xcf, 0x5c, - 0xe0, 0xeb, 0x66, 0x7c, 0x7d, 0x1f, 0x83, 0xd0, 0xc4, 0x23, 0xcf, 0x29, 0x97, 0xc8, 0x47, 0x13, - 0xfe, 0x0c, 0xda, 0x25, 0x52, 0x2b, 0xdd, 0x03, 0x62, 0xb0, 0x1e, 0x3b, 0xc4, 0x17, 0x71, 0x03, - 0x66, 0x95, 0xc6, 0xd7, 0x3f, 0x49, 0x66, 0x66, 0x12, 0xb6, 0xa3, 0xd9, 0xbb, 0x03, 0x31, 0xf1, - 0x00, 0x2a, 0x64, 0x03, 0x0a, 0x4e, 0x7b, 0x63, 0xe6, 0xf1, 0x3c, 0x54, 0xd7, 0xea, 0x4a, 0x4d, - 0x8e, 0x28, 0xee, 0x37, 0x5d, 0x5d, 0xa9, 0x21, 0x23, 0x4e, 0x5c, 0x18, 0x75, 0xda, 0x1b, 0xe1, - 0xcc, 0x2c, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0x2b, 0xb5, 0x10, 0x39, 0x0b, 0xfb, 0x0b, - 0x23, 0xfa, 0x96, 0x48, 0x67, 0xd2, 0x7f, 0xcb, 0x9c, 0x40, 0xe2, 0xb8, 0x73, 0x3b, 0xb7, 0x09, - 0x24, 0xd5, 0x8b, 0x33, 0x03, 0xa7, 0x4f, 0x57, 0x2f, 0x19, 0xb9, 0x24, 0xc2, 0x4b, 0xbe, 0x12, - 0x20, 0x4e, 0xcf, 0xc9, 0x05, 0xc3, 0xfe, 0x62, 0x45, 0x5b, 0x41, 0x53, 0x6e, 0x82, 0x01, 0x14, - 0xdd, 0x30, 0x72, 0xfd, 0x1c, 0xf3, 0x0e, 0xa4, 0xd2, 0xeb, 0xf3, 0xb0, 0x26, 0x0e, 0x40, 0xc1, - 0x8a, 0xf1, 0xf4, 0x5a, 0xae, 0xf7, 0x40, 0x7e, 0xfe, 0x6b, 0xb9, 0x3b, 0xb9, 0x09, 0x9e, 0x1c, - 0x80, 0x82, 0x15, 0xb9, 0x27, 0x06, 0x75, 0x21, 0x8f, 0xbe, 0xae, 0xae, 0xd4, 0x52, 0xfc, 0x92, - 0x83, 0xfb, 0x1e, 0x14, 0xc2, 0x8e, 0x2b, 0xd5, 0xa5, 0x21, 0x79, 0xd5, 0x57, 0x97, 0xb3, 0x78, - 0xd5, 0x57, 0x97, 0x91, 0x31, 0xe1, 0x57, 0xfd, 0x4e, 0x67, 0xc3, 0x09, 0x43, 0xa7, 0xa9, 0xad, - 0x33, 0x43, 0x5e, 0xf5, 0x57, 0x35, 0xbd, 0x14, 0x6b, 0x7e, 0xd5, 0x1f, 0x43, 0xd1, 0xe0, 0x4c, - 0xde, 0x84, 0x71, 0x47, 0x3c, 0xd1, 0x2a, 0x83, 0x3c, 0xf2, 0x79, 0x77, 0x38, 0x25, 0x01, 0x37, - 0xd3, 0x48, 0x10, 0x2a, 0x86, 0x8c, 0x77, 0x14, 0x38, 0x74, 0xd3, 0xdd, 0x96, 0xc6, 0xa1, 0xfa, - 0xd0, 0x8f, 0x08, 0x31, 0x62, 0x59, 0xbc, 0x25, 0x08, 0x15, 0x43, 0xf2, 0x65, 0x0b, 0xce, 0x74, - 0x1c, 0xcf, 0xd1, 0xa1, 0xbb, 0xf9, 0x04, 0x78, 0x9b, 0xc1, 0xc0, 0xb1, 0x86, 0xb8, 0x6a, 0x32, - 0xc2, 0x24, 0x5f, 0xb2, 0x03, 0x63, 0x0e, 0x7f, 0x3c, 0x5a, 0x1e, 0xc5, 0x30, 0x8f, 0x87, 0xa8, - 0x53, 0x6d, 0xc0, 0x17, 0x17, 0xf9, 0x44, 0xb5, 0xe4, 0x46, 0x7e, 0xd3, 0x82, 0x71, 0x11, 0x7f, - 0xc0, 0x14, 0x52, 0xf6, 0xed, 0x9f, 0x39, 0x85, 0x67, 0x3a, 0x64, 0x6c, 0x84, 0x74, 0xce, 0xfa, - 0xa0, 0xf6, 0xad, 0x16, 0xa5, 0x07, 0x46, 0x47, 0x28, 0xe9, 0x98, 0xea, 0xdb, 0x71, 0x1e, 0x24, - 0x9e, 0x88, 0x32, 0x55, 0xdf, 0xd5, 0x14, 0x0c, 0xfb, 0xb0, 0x67, 0x3f, 0x06, 0x13, 0xa6, 0x1c, - 0xc7, 0x8a, 0xb0, 0xf8, 0x51, 0x01, 0x80, 0x77, 0x95, 0x48, 0xf7, 0xd3, 0xe1, 0x59, 0xc9, 0xb7, - 0xfc, 0x66, 0x4e, 0x4f, 0xd5, 0x1a, 0x59, 0x7b, 0x40, 0xa6, 0x20, 0xdf, 0xf2, 0x9b, 0x28, 0x99, - 0x90, 0x16, 0x8c, 0x76, 0x9d, 0x68, 0x2b, 0xff, 0x14, 0x41, 0x25, 0x11, 0xf7, 0x1e, 0x6d, 0x21, - 0x67, 0x40, 0xde, 0xb6, 0x62, 0xbf, 0xa7, 0x42, 0x1e, 0x89, 0x95, 0xe3, 0x36, 0x9b, 0x97, 0x9e, - 0x4e, 0xa9, 0xfc, 0xc2, 0x69, 0xff, 0xa7, 0xd9, 0x77, 0x2c, 0x98, 0x30, 0x51, 0x33, 0xba, 0xe9, - 0xe7, 0xcd, 0x6e, 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0x1f, 0x16, 0x00, 0xf6, 0xbc, 0x7a, 0xaf, - 0xd3, 0x61, 0x6a, 0xbb, 0x0e, 0x24, 0xb1, 0x8e, 0x1c, 0x48, 0x32, 0x72, 0xcc, 0x40, 0x92, 0xc2, - 0xb1, 0x02, 0x49, 0x46, 0x8f, 0x1f, 0x48, 0x52, 0x1c, 0x1c, 0x48, 0x62, 0x7f, 0xc3, 0x82, 0xb3, - 0x7d, 0xfb, 0x15, 0xd3, 0xa4, 0x03, 0xdf, 0x8f, 0x06, 0xf8, 0xcf, 0x62, 0x0c, 0x42, 0x13, 0x8f, - 0x2c, 0xc1, 0xb4, 0x7c, 0x83, 0xa7, 0xde, 0x6d, 0xbb, 0x99, 0xe9, 0x9b, 0xd6, 0x53, 0x70, 0xec, - 0xab, 0x61, 0xff, 0x6b, 0x0b, 0x2a, 0x46, 0xd2, 0x07, 0xee, 0x73, 0xc6, 0x6f, 0xbc, 0xd2, 0x3e, - 0x67, 0xfc, 0xaa, 0x4b, 0xc0, 0xc4, 0x35, 0x74, 0xcb, 0x78, 0xa1, 0x21, 0xbe, 0x86, 0x66, 0xa5, - 0x28, 0xa1, 0x22, 0xf7, 0xbe, 0x74, 0x3e, 0x2b, 0x98, 0xb9, 0xf7, 0x69, 0x57, 0xb8, 0x9a, 0xc5, - 0x2e, 0x6e, 0xa3, 0x87, 0xbb, 0xb8, 0x15, 0xb3, 0x5d, 0xdc, 0xec, 0xdb, 0x30, 0x21, 0x7c, 0xc3, - 0x5f, 0xa5, 0xbb, 0x47, 0x7e, 0xeb, 0x99, 0x8d, 0xf6, 0x94, 0xcf, 0x1c, 0xab, 0xce, 0xca, 0x6d, - 0x07, 0xe2, 0x44, 0xd4, 0x47, 0xa0, 0x76, 0x15, 0x40, 0xa7, 0xc4, 0x17, 0x8e, 0x78, 0xa5, 0x78, - 0x40, 0xea, 0xbc, 0xf9, 0x4d, 0x34, 0xb0, 0xec, 0x7f, 0x62, 0x41, 0xea, 0x8d, 0x31, 0xe3, 0x92, - 0xc7, 0x1a, 0x78, 0xc9, 0x63, 0x5e, 0x0c, 0x8c, 0x1c, 0x78, 0x31, 0x70, 0x13, 0x48, 0x87, 0xcd, - 0xb6, 0xe4, 0x5a, 0x5e, 0x48, 0x3e, 0xc5, 0xb2, 0xda, 0x87, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x2c, - 0x84, 0x35, 0x5f, 0x1d, 0x3b, 0xbc, 0x55, 0x7a, 0x50, 0xe4, 0xa4, 0xa4, 0x89, 0x6f, 0x48, 0xf3, - 0x78, 0x7f, 0x36, 0xb8, 0x78, 0xac, 0xc8, 0x55, 0x85, 0x73, 0xb3, 0x7f, 0x5f, 0xc8, 0x6a, 0x3e, - 0x4b, 0x76, 0xb8, 0xac, 0x9d, 0xa4, 0xac, 0x37, 0xf2, 0x5a, 0x8e, 0xb3, 0x65, 0x24, 0xf3, 0x00, - 0x5d, 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0xe8, 0xba, 0xa2, 0x8c, 0xf3, 0xd6, 0xa5, 0x68, 0x60, 0xd8, - 0x5f, 0x67, 0x73, 0x34, 0x7e, 0x68, 0x9d, 0x5c, 0x49, 0xfb, 0x1a, 0xa7, 0xe7, 0x9f, 0x76, 0x35, - 0x36, 0x42, 0xae, 0x46, 0x0e, 0x09, 0xb9, 0x7a, 0x06, 0xc6, 0x03, 0xbf, 0x4d, 0xab, 0x81, 0x97, - 0x76, 0x03, 0x42, 0x56, 0x8c, 0xb7, 0x50, 0xc1, 0xed, 0x5f, 0xb7, 0x60, 0x3a, 0x1d, 0x14, 0x9a, - 0xbb, 0x03, 0xb4, 0x99, 0xb9, 0xa2, 0x70, 0xfc, 0xcc, 0x15, 0xf6, 0x9f, 0x16, 0x61, 0x3a, 0xfd, - 0x00, 0x24, 0xe3, 0xec, 0x72, 0x7b, 0x5e, 0x6a, 0x83, 0x11, 0x86, 0x3c, 0x01, 0xd3, 0xe3, 0x65, - 0x64, 0xe0, 0x78, 0xb9, 0x0e, 0x65, 0xbf, 0xab, 0x6c, 0x0a, 0x42, 0xb8, 0x2b, 0xca, 0x1e, 0x74, - 0x5b, 0x01, 0xde, 0xdd, 0x9b, 0x3b, 0x17, 0x0b, 0xa0, 0x8b, 0x31, 0xae, 0x4a, 0x7e, 0x46, 0x19, - 0x43, 0x46, 0x13, 0xb9, 0xa0, 0xb4, 0x31, 0x64, 0x2a, 0xae, 0x3f, 0xc8, 0x1e, 0x52, 0x3c, 0x4e, - 0x4e, 0x9a, 0xb1, 0x1c, 0x73, 0xd2, 0xdc, 0x85, 0xb2, 0x34, 0xdf, 0x9e, 0x28, 0x17, 0x0b, 0x27, - 0x7c, 0x47, 0x11, 0xc0, 0x98, 0x56, 0x2a, 0xd9, 0x4d, 0x29, 0xd7, 0x64, 0x37, 0x2f, 0xc1, 0xf8, - 0x86, 0xd3, 0xd8, 0xf6, 0x37, 0x37, 0xf9, 0x11, 0xa0, 0x5c, 0xfb, 0x80, 0x6a, 0xb8, 0x9a, 0x28, - 0xce, 0x18, 0x52, 0xaa, 0x06, 0x5b, 0xe7, 0xa9, 0xf2, 0x78, 0x56, 0x96, 0x65, 0xbd, 0xce, 0x6b, - 0x5f, 0xe8, 0x10, 0x0d, 0x2c, 0xf2, 0x2c, 0x94, 0x9a, 0x6e, 0x28, 0x9e, 0x28, 0xaf, 0x24, 0x1d, - 0xe2, 0x97, 0x64, 0x39, 0x6a, 0x0c, 0xf2, 0xb2, 0x76, 0x88, 0x9b, 0x88, 0x63, 0x55, 0xb4, 0x33, - 0xdc, 0x01, 0xb1, 0x2a, 0xd2, 0xdf, 0xf7, 0x6d, 0x36, 0x31, 0x23, 0xb7, 0xb1, 0xed, 0x7a, 0x22, - 0xc1, 0x09, 0x5b, 0x2d, 0x9e, 0x81, 0x71, 0x2a, 0x1f, 0x49, 0x17, 0xb7, 0x33, 0x7a, 0xb0, 0xa8, - 0xb7, 0xd1, 0x15, 0x9c, 0x54, 0x61, 0x4a, 0xdd, 0x49, 0xab, 0x2b, 0x35, 0x91, 0x98, 0x49, 0x9b, - 0xf0, 0x97, 0x92, 0x60, 0x4c, 0xe3, 0xdb, 0x9f, 0x87, 0x8a, 0xa1, 0xeb, 0x71, 0xb5, 0xe8, 0x81, - 0xd3, 0xe8, 0x73, 0x61, 0xbf, 0xc6, 0x0a, 0x51, 0xc0, 0xf8, 0xcd, 0x9f, 0x88, 0xbf, 0x4c, 0xa9, - 0x13, 0x32, 0xea, 0x52, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, 0x03, 0xf5, 0x2e, 0x8d, 0x22, 0x86, - 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x16, 0x4a, 0x2a, 0x7d, 0x1e, 0xcf, 0x41, 0xa5, 0x6e, 0xa5, 0xcc, - 0x1c, 0x54, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0xaf, 0x43, 0x49, 0x65, 0xf9, 0x3b, 0x1c, 0x9b, 0x6d, - 0xbf, 0xa1, 0xe7, 0xde, 0xf0, 0xc3, 0x48, 0xa5, 0x26, 0x14, 0x17, 0xe7, 0xb7, 0x96, 0x79, 0x19, - 0x6a, 0xa8, 0xfd, 0x67, 0x16, 0x54, 0xd6, 0xd7, 0x57, 0xb4, 0x3d, 0x0d, 0xe1, 0xd1, 0x50, 0xb4, - 0x50, 0x75, 0x33, 0xa2, 0xa6, 0x87, 0x8e, 0x58, 0x89, 0x66, 0xf7, 0xf7, 0xe6, 0x1e, 0xad, 0x67, - 0x62, 0xe0, 0x80, 0x9a, 0x64, 0x19, 0xce, 0x99, 0x10, 0x99, 0x32, 0x46, 0xea, 0x05, 0xfc, 0x55, - 0xfd, 0x7a, 0x3f, 0x18, 0xb3, 0xea, 0xa4, 0x49, 0x49, 0x2d, 0xda, 0x7c, 0xa0, 0xbf, 0xde, 0x0f, - 0xc6, 0xac, 0x3a, 0xf6, 0x73, 0x30, 0x95, 0x72, 0x1d, 0x39, 0x42, 0xaa, 0xae, 0xdf, 0x2d, 0xc0, - 0x84, 0xe9, 0x41, 0x70, 0x84, 0x3d, 0xfb, 0xe8, 0xaa, 0x50, 0xc6, 0xad, 0x7f, 0xe1, 0x98, 0xb7, - 0xfe, 0xa6, 0x9b, 0xc5, 0xe8, 0xe9, 0xba, 0x59, 0x14, 0xf3, 0x71, 0xb3, 0x30, 0xdc, 0x81, 0xc6, - 0x1e, 0x9e, 0x3b, 0xd0, 0xef, 0x14, 0x61, 0x32, 0x99, 0xfb, 0xf9, 0x08, 0x3d, 0xf9, 0x6c, 0x5f, - 0x4f, 0x1e, 0xf3, 0x9a, 0xb1, 0x30, 0xec, 0x35, 0xe3, 0xe8, 0xb0, 0xd7, 0x8c, 0xc5, 0x13, 0x5c, - 0x33, 0xf6, 0x5f, 0x12, 0x8e, 0x1d, 0xf9, 0x92, 0xf0, 0xe3, 0x7a, 0xa3, 0x18, 0x4f, 0x78, 0xd6, - 0xc5, 0x9b, 0x05, 0x49, 0x76, 0xc3, 0xa2, 0xdf, 0xcc, 0xf4, 0xf8, 0x2e, 0x1d, 0xa2, 0x3e, 0x04, - 0x99, 0x8e, 0xce, 0xc7, 0xf7, 0x64, 0x78, 0xf4, 0x18, 0x4e, 0xce, 0x2f, 0x40, 0x45, 0x8e, 0x27, - 0x7e, 0xa6, 0x85, 0xe4, 0x79, 0xb8, 0x1e, 0x83, 0xd0, 0xc4, 0x63, 0x03, 0xa3, 0x1b, 0x4f, 0x10, - 0x7e, 0xe1, 0x5d, 0x49, 0x5e, 0x78, 0xaf, 0x25, 0xc1, 0x98, 0xc6, 0xb7, 0x3f, 0x07, 0x17, 0x32, - 0x2d, 0x9b, 0xfc, 0x56, 0x89, 0x9f, 0x85, 0x68, 0x53, 0x22, 0x18, 0x62, 0xa4, 0x1e, 0xa3, 0x9a, - 0xbd, 0x3b, 0x10, 0x13, 0x0f, 0xa0, 0x62, 0xff, 0x76, 0x01, 0x26, 0x93, 0x8f, 0xb3, 0x93, 0xfb, - 0xfa, 0x1e, 0x24, 0x97, 0x2b, 0x18, 0x41, 0xd6, 0xc8, 0x27, 0x3c, 0xf0, 0xfe, 0xf4, 0x3e, 0x1f, - 0x5f, 0x1b, 0x3a, 0xb9, 0xf1, 0xe9, 0x31, 0x96, 0x17, 0x97, 0x92, 0x1d, 0x7f, 0xe2, 0x3c, 0x4e, - 0x29, 0x20, 0xcd, 0x63, 0xb9, 0x73, 0x8f, 0xa3, 0xbf, 0x35, 0x2b, 0x34, 0xd8, 0xb2, 0xbd, 0x65, - 0x87, 0x06, 0xee, 0xa6, 0x4b, 0x9b, 0xf2, 0xad, 0x09, 0xbe, 0x72, 0xbf, 0x2e, 0xcb, 0x50, 0x43, - 0xed, 0xb7, 0x47, 0xa0, 0xcc, 0x33, 0x25, 0x5e, 0x0f, 0xfc, 0x0e, 0x7f, 0xb6, 0x37, 0x34, 0x4c, - 0x11, 0xb2, 0xdb, 0x6e, 0xe6, 0xf1, 0x4e, 0x96, 0xa0, 0x28, 0xa3, 0x48, 0x8c, 0x12, 0x4c, 0x70, - 0x24, 0x5d, 0x28, 0x6d, 0xca, 0xcc, 0xee, 0xb2, 0xef, 0x86, 0xcc, 0x4e, 0xac, 0xf2, 0xc4, 0x8b, - 0x26, 0x50, 0xff, 0x50, 0x73, 0xb1, 0x1d, 0x98, 0x4a, 0xa5, 0xba, 0xca, 0x3d, 0x1f, 0xfc, 0xff, - 0x1a, 0x85, 0xb2, 0x0e, 0xee, 0x24, 0x1f, 0x4d, 0xd8, 0x85, 0x63, 0x1d, 0x5e, 0x1a, 0x74, 0xd9, - 0xb9, 0x49, 0x23, 0xa7, 0x6c, 0xbc, 0x17, 0xa1, 0xd0, 0x0b, 0xda, 0x69, 0xc3, 0xcf, 0x1d, 0x5c, - 0x41, 0x56, 0x6e, 0x06, 0xa4, 0x16, 0x1e, 0x6e, 0x40, 0xea, 0x65, 0x18, 0xdd, 0xf0, 0x9b, 0xbb, - 0xe9, 0x37, 0x28, 0x6b, 0x7e, 0x73, 0x17, 0x39, 0x84, 0xbc, 0x0c, 0x93, 0x32, 0xca, 0x56, 0x29, - 0x31, 0x45, 0xae, 0xa7, 0x6a, 0x7f, 0xa0, 0xf5, 0x04, 0x14, 0x53, 0xd8, 0x6c, 0x97, 0x65, 0xc7, - 0x06, 0x9e, 0xe5, 0x7f, 0x2c, 0xe9, 0x3c, 0x70, 0xb3, 0x7e, 0xfb, 0x16, 0xb7, 0x4f, 0x6b, 0x8c, - 0x44, 0x20, 0xef, 0xf8, 0xa1, 0x81, 0xbc, 0x4b, 0x82, 0x36, 0x93, 0x96, 0xef, 0x28, 0x13, 0xb5, - 0x2b, 0x8a, 0x2e, 0x2b, 0x3b, 0xf0, 0xec, 0xa2, 0x6b, 0x66, 0x85, 0x3c, 0x97, 0xdf, 0xbb, 0x90, - 0x67, 0xfb, 0x0e, 0x4c, 0xa5, 0xfa, 0x4f, 0xd9, 0x0d, 0xad, 0x6c, 0xbb, 0xe1, 0xd1, 0x5e, 0xb1, - 0xfc, 0xe7, 0x16, 0x9c, 0xed, 0x5b, 0x91, 0x8e, 0x1a, 0x7b, 0x9e, 0xde, 0x1b, 0x47, 0x4e, 0xbe, - 0x37, 0x16, 0x8e, 0xb7, 0x37, 0xd6, 0x36, 0xbe, 0xfb, 0xc3, 0x4b, 0x8f, 0x7c, 0xff, 0x87, 0x97, - 0x1e, 0xf9, 0x83, 0x1f, 0x5e, 0x7a, 0xe4, 0xed, 0xfd, 0x4b, 0xd6, 0x77, 0xf7, 0x2f, 0x59, 0xdf, - 0xdf, 0xbf, 0x64, 0xfd, 0xc1, 0xfe, 0x25, 0xeb, 0xbf, 0xee, 0x5f, 0xb2, 0xbe, 0xf1, 0xc7, 0x97, - 0x1e, 0xf9, 0xe4, 0xc7, 0xe3, 0x9e, 0x5a, 0x50, 0x3d, 0xc5, 0x7f, 0x7c, 0x48, 0xf5, 0xcb, 0x42, - 0x77, 0xbb, 0xb5, 0xc0, 0x7a, 0x6a, 0x41, 0x97, 0xa8, 0x9e, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x68, 0x77, 0xe5, 0x89, 0x8f, 0xae, 0x00, 0x00, + // 9012 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x5d, 0x6c, 0x24, 0xd9, + 0x75, 0x18, 0xac, 0x62, 0xb3, 0xc9, 0xee, 0xd3, 0x1c, 0x92, 0x73, 0x67, 0x66, 0x87, 0xcb, 0xdd, + 0x19, 0x8e, 0x6a, 0xfd, 0xed, 0x37, 0x6b, 0xad, 0x48, 0x69, 0x76, 0xd7, 0x59, 0x69, 0x95, 0x4d, + 0xba, 0xc9, 0x99, 0x1d, 0xce, 0x92, 0x33, 0xdc, 0xd3, 0x9c, 0x1d, 0xeb, 0x67, 0x6d, 0x15, 0xbb, + 0x2f, 0x9b, 0x35, 0xec, 0xae, 0x6a, 0x55, 0x55, 0x73, 0x86, 0xab, 0x85, 0xb5, 0x92, 0xb0, 0x96, + 0xac, 0x48, 0xb0, 0x62, 0x5b, 0x08, 0xf2, 0x83, 0x40, 0x31, 0x1c, 0x38, 0x7f, 0x0f, 0x81, 0xa1, + 0x20, 0x79, 0x30, 0x90, 0x20, 0x8a, 0x03, 0x19, 0x88, 0x02, 0xf9, 0x21, 0x91, 0x13, 0xc0, 0x74, + 0x44, 0xe7, 0x25, 0x46, 0x02, 0xc1, 0x81, 0x03, 0x21, 0xfb, 0x60, 0x04, 0xf7, 0xb7, 0x6e, 0x55, + 0x57, 0xf3, 0xaf, 0x8b, 0xb3, 0xeb, 0xc4, 0x6f, 0xdd, 0xf7, 0x9c, 0x7b, 0xce, 0xa9, 0xfb, 0x7b, + 0xee, 0xb9, 0xe7, 0x9c, 0x0b, 0x2b, 0x2d, 0x37, 0xda, 0xea, 0x6d, 0xcc, 0x37, 0xfc, 0xce, 0x82, + 0x13, 0xb4, 0xfc, 0x6e, 0xe0, 0xdf, 0xe7, 0x3f, 0x3e, 0x1c, 0xf8, 0xed, 0xb6, 0xdf, 0x8b, 0xc2, + 0x85, 0xee, 0x76, 0x6b, 0xc1, 0xe9, 0xba, 0xe1, 0x82, 0x2e, 0xd9, 0xf9, 0xa8, 0xd3, 0xee, 0x6e, + 0x39, 0x1f, 0x5d, 0x68, 0x51, 0x8f, 0x06, 0x4e, 0x44, 0x9b, 0xf3, 0xdd, 0xc0, 0x8f, 0x7c, 0xf2, + 0x89, 0x98, 0xda, 0xbc, 0xa2, 0xc6, 0x7f, 0xfc, 0xbc, 0xaa, 0x3b, 0xdf, 0xdd, 0x6e, 0xcd, 0x33, + 0x6a, 0xf3, 0xba, 0x44, 0x51, 0x9b, 0xfd, 0xb0, 0x21, 0x4b, 0xcb, 0x6f, 0xf9, 0x0b, 0x9c, 0xe8, + 0x46, 0x6f, 0x93, 0xff, 0xe3, 0x7f, 0xf8, 0x2f, 0xc1, 0x6c, 0xf6, 0xa9, 0xed, 0x17, 0xc3, 0x79, + 0xd7, 0x67, 0xb2, 0x2d, 0x6c, 0x38, 0x51, 0x63, 0x6b, 0x61, 0xa7, 0x4f, 0xa2, 0x59, 0xdb, 0x40, + 0x6a, 0xf8, 0x01, 0xcd, 0xc2, 0x79, 0x3e, 0xc6, 0xe9, 0x38, 0x8d, 0x2d, 0xd7, 0xa3, 0xc1, 0x6e, + 0xfc, 0xd5, 0x1d, 0x1a, 0x39, 0x59, 0xb5, 0x16, 0x06, 0xd5, 0x0a, 0x7a, 0x5e, 0xe4, 0x76, 0x68, + 0x5f, 0x85, 0x9f, 0x39, 0xac, 0x42, 0xd8, 0xd8, 0xa2, 0x1d, 0xa7, 0xaf, 0xde, 0x73, 0x83, 0xea, + 0xf5, 0x22, 0xb7, 0xbd, 0xe0, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x4a, 0xf6, 0x8f, 0x0b, 0x50, 0xae, + 0xae, 0xd4, 0xea, 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x8b, 0x16, 0x4c, 0xb4, 0x7d, 0xa7, 0x59, 0x73, + 0xda, 0x8e, 0xd7, 0xa0, 0xc1, 0x8c, 0x75, 0xc5, 0xba, 0x5a, 0xb9, 0xb6, 0x32, 0x3f, 0x4c, 0x7f, + 0xcd, 0x57, 0x1f, 0x84, 0x48, 0x43, 0xbf, 0x17, 0x34, 0x28, 0xd2, 0xcd, 0xda, 0xf9, 0xef, 0xed, + 0xcd, 0x7d, 0x60, 0x7f, 0x6f, 0x6e, 0x62, 0xc5, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0x5b, 0x16, 0x9c, + 0x6d, 0x38, 0x9e, 0x13, 0xec, 0xae, 0x3b, 0x41, 0x8b, 0x46, 0xaf, 0x04, 0x7e, 0xaf, 0x3b, 0x33, + 0x72, 0x0a, 0xd2, 0x3c, 0x2e, 0xa5, 0x39, 0xbb, 0x98, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, + 0xc8, 0xd9, 0x68, 0x53, 0x53, 0xae, 0xc2, 0x69, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xc8, + 0x33, 0x30, 0xee, 0x7a, 0xad, 0x80, 0x86, 0xe1, 0xcc, 0xe8, 0x15, 0xeb, 0x6a, 0xb9, 0x36, 0x25, + 0xab, 0x8f, 0x2f, 0x8b, 0x62, 0x54, 0x70, 0xfb, 0xb7, 0x0a, 0x70, 0xb6, 0xba, 0x52, 0x5b, 0x0f, + 0x9c, 0xcd, 0x4d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x96, 0x49, 0xc0, 0x3a, 0x98, 0x00, 0x79, + 0x01, 0x2a, 0x21, 0x0d, 0x76, 0xdc, 0x06, 0x5d, 0xf3, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x76, 0x4e, + 0xa2, 0x57, 0xea, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, + 0xe3, 0x6a, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x4b, 0x30, 0xed, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, + 0x7b, 0x6b, 0x01, 0xdd, 0x74, 0x1f, 0xca, 0x4f, 0x9c, 0x91, 0x75, 0xa7, 0xab, 0x29, 0x38, 0xf6, + 0xd5, 0x20, 0xdf, 0xb4, 0x60, 0x3a, 0x8c, 0xdc, 0xc6, 0xb6, 0xeb, 0xd1, 0x30, 0x5c, 0xf4, 0xbd, + 0x4d, 0xb7, 0x35, 0x53, 0xe4, 0xdd, 0x76, 0x7b, 0xb8, 0x6e, 0xab, 0xa7, 0xa8, 0xd6, 0xce, 0x33, + 0x91, 0xd2, 0xa5, 0xd8, 0xc7, 0x9d, 0x7c, 0x08, 0xca, 0xb2, 0x45, 0x69, 0x38, 0x33, 0x76, 0xa5, + 0x70, 0xb5, 0x5c, 0x3b, 0xb3, 0xbf, 0x37, 0x57, 0x5e, 0x56, 0x85, 0x18, 0xc3, 0xed, 0x25, 0x98, + 0xa9, 0x76, 0x36, 0x9c, 0x30, 0x74, 0x9a, 0x7e, 0x90, 0xea, 0xba, 0xab, 0x50, 0xea, 0x38, 0xdd, + 0xae, 0xeb, 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0x13, 0xfb, 0x7b, 0x73, 0xa5, 0x55, 0x59, 0x86, 0x1a, + 0x6a, 0xff, 0xa7, 0x11, 0xa8, 0x54, 0x3d, 0xa7, 0xbd, 0x1b, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x59, + 0x28, 0xb1, 0x55, 0xab, 0xe9, 0x44, 0x8e, 0x9c, 0xe9, 0x1f, 0x99, 0x17, 0x8b, 0xc8, 0xbc, 0xb9, + 0x88, 0xc4, 0x9f, 0xcf, 0xb0, 0xe7, 0x77, 0x3e, 0x3a, 0x7f, 0x67, 0xe3, 0x3e, 0x6d, 0x44, 0xab, + 0x34, 0x72, 0x6a, 0x44, 0xf6, 0x02, 0xc4, 0x65, 0xa8, 0xa9, 0x12, 0x1f, 0x46, 0xc3, 0x2e, 0x6d, + 0xc8, 0x99, 0xbb, 0x3a, 0xe4, 0x0c, 0x89, 0x45, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x21, 0x59, 0x8f, + 0xb2, 0x7f, 0xc8, 0x19, 0x91, 0x07, 0x30, 0x16, 0xf2, 0xb5, 0x4c, 0x4e, 0xca, 0x3b, 0xf9, 0xb1, + 0xe4, 0x64, 0x6b, 0x93, 0x92, 0xe9, 0x98, 0xf8, 0x8f, 0x92, 0x9d, 0xfd, 0x9f, 0x2d, 0x38, 0x67, + 0x60, 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x5c, 0x81, 0x51, 0xcf, 0xe9, 0x50, 0x39, 0xab, + 0xb4, 0xc8, 0xb7, 0x9d, 0x0e, 0x45, 0x0e, 0x21, 0x4f, 0x41, 0x71, 0xc7, 0x69, 0xf7, 0x28, 0x6f, + 0xa4, 0x72, 0xed, 0x8c, 0x44, 0x29, 0xbe, 0xce, 0x0a, 0x51, 0xc0, 0xc8, 0x5b, 0x50, 0xe6, 0x3f, + 0x6e, 0x04, 0x7e, 0x27, 0xa7, 0x4f, 0x93, 0x12, 0xbe, 0xae, 0xc8, 0x8a, 0xe1, 0xa7, 0xff, 0x62, + 0xcc, 0xd0, 0xfe, 0x43, 0x0b, 0xa6, 0x8c, 0x8f, 0x5b, 0x71, 0xc3, 0x88, 0x7c, 0xa6, 0x6f, 0xf0, + 0xcc, 0x1f, 0x6d, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0x4c, 0xcb, 0x2f, 0x2d, 0xa9, 0x12, 0x63, 0xe0, + 0x78, 0x50, 0x74, 0x23, 0xda, 0x09, 0x67, 0x46, 0xae, 0x14, 0xae, 0x56, 0xae, 0x2d, 0xe7, 0xd6, + 0x8d, 0x71, 0xfb, 0x2e, 0x33, 0xfa, 0x28, 0xd8, 0xd8, 0xdf, 0x29, 0x24, 0xba, 0x6f, 0x55, 0xc9, + 0xf1, 0x8e, 0x05, 0x63, 0x6d, 0x67, 0x83, 0xb6, 0xc5, 0xdc, 0xaa, 0x5c, 0x7b, 0x23, 0x37, 0x49, + 0x14, 0x8f, 0xf9, 0x15, 0x4e, 0xff, 0xba, 0x17, 0x05, 0xbb, 0xf1, 0xf0, 0x12, 0x85, 0x28, 0x99, + 0x93, 0xbf, 0x69, 0x41, 0x25, 0x5e, 0xd5, 0x54, 0xb3, 0x6c, 0xe4, 0x2f, 0x4c, 0xbc, 0x98, 0x4a, + 0x89, 0xf4, 0x12, 0x6d, 0x40, 0xd0, 0x94, 0x65, 0xf6, 0x63, 0x50, 0x31, 0x3e, 0x81, 0x4c, 0x43, + 0x61, 0x9b, 0xee, 0x8a, 0x01, 0x8f, 0xec, 0x27, 0x39, 0x9f, 0x18, 0xe1, 0x72, 0x48, 0x7f, 0x7c, + 0xe4, 0x45, 0x6b, 0xf6, 0x65, 0x98, 0x4e, 0x33, 0x3c, 0x4e, 0x7d, 0xfb, 0x9f, 0x16, 0x13, 0x03, + 0x93, 0x2d, 0x04, 0xc4, 0x87, 0xf1, 0x0e, 0x8d, 0x02, 0xb7, 0xa1, 0xba, 0x6c, 0x69, 0xb8, 0x56, + 0x5a, 0xe5, 0xc4, 0xe2, 0x0d, 0x51, 0xfc, 0x0f, 0x51, 0x71, 0x21, 0x5b, 0x30, 0xea, 0x04, 0x2d, + 0xd5, 0x27, 0x37, 0xf2, 0x99, 0x96, 0xf1, 0x52, 0x51, 0x0d, 0x5a, 0x21, 0x72, 0x0e, 0x64, 0x01, + 0xca, 0x11, 0x0d, 0x3a, 0xae, 0xe7, 0x44, 0x62, 0x07, 0x2d, 0xd5, 0xce, 0x4a, 0xb4, 0xf2, 0xba, + 0x02, 0x60, 0x8c, 0x43, 0xda, 0x30, 0xd6, 0x0c, 0x76, 0xb1, 0xe7, 0xcd, 0x8c, 0xe6, 0xd1, 0x14, + 0x4b, 0x9c, 0x56, 0x3c, 0x48, 0xc5, 0x7f, 0x94, 0x3c, 0xc8, 0x6f, 0x58, 0x70, 0xbe, 0x43, 0x9d, + 0xb0, 0x17, 0x50, 0xf6, 0x09, 0x48, 0x23, 0xea, 0xb1, 0x8e, 0x9d, 0x29, 0x72, 0xe6, 0x38, 0x6c, + 0x3f, 0xf4, 0x53, 0xae, 0x3d, 0x29, 0x45, 0x39, 0x9f, 0x05, 0xc5, 0x4c, 0x69, 0xc8, 0x5b, 0x50, + 0x89, 0xa2, 0x76, 0x3d, 0x62, 0x7a, 0x70, 0x6b, 0x77, 0x66, 0x8c, 0x2f, 0x5e, 0x43, 0xae, 0x30, + 0xeb, 0xeb, 0x2b, 0x8a, 0x60, 0x6d, 0x8a, 0xcd, 0x16, 0xa3, 0x00, 0x4d, 0x76, 0xf6, 0xbf, 0x28, + 0xc2, 0xd9, 0xbe, 0x6d, 0x85, 0x3c, 0x0f, 0xc5, 0xee, 0x96, 0x13, 0xaa, 0x7d, 0xe2, 0xb2, 0x5a, + 0xa4, 0xd6, 0x58, 0xe1, 0xbb, 0x7b, 0x73, 0x67, 0x54, 0x15, 0x5e, 0x80, 0x02, 0x99, 0x69, 0x6d, + 0x1d, 0x1a, 0x86, 0x4e, 0x4b, 0x6d, 0x1e, 0xc6, 0x20, 0xe5, 0xc5, 0xa8, 0xe0, 0xe4, 0x2b, 0x16, + 0x9c, 0x11, 0x03, 0x16, 0x69, 0xd8, 0x6b, 0x47, 0x6c, 0x83, 0x64, 0x9d, 0x72, 0x2b, 0x8f, 0xc9, + 0x21, 0x48, 0xd6, 0x2e, 0x48, 0xee, 0x67, 0xcc, 0xd2, 0x10, 0x93, 0x7c, 0xc9, 0x3d, 0x28, 0x87, + 0x91, 0x13, 0x44, 0xb4, 0x59, 0x8d, 0xb8, 0x2a, 0x57, 0xb9, 0xf6, 0xd3, 0x47, 0xdb, 0x39, 0xd6, + 0xdd, 0x0e, 0x15, 0xbb, 0x54, 0x5d, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x0b, 0x20, 0xe8, 0x79, 0xf5, + 0x5e, 0xa7, 0xe3, 0x04, 0xbb, 0x52, 0xbb, 0xbb, 0x39, 0xdc, 0xe7, 0xa1, 0xa6, 0x17, 0x2b, 0x3a, + 0x71, 0x19, 0x1a, 0xfc, 0xc8, 0x17, 0x2d, 0x38, 0x23, 0xe6, 0x81, 0x92, 0x60, 0x2c, 0x67, 0x09, + 0xce, 0xb2, 0xa6, 0x5d, 0x32, 0x59, 0x60, 0x92, 0x23, 0x79, 0x03, 0x2a, 0x0d, 0xbf, 0xd3, 0x6d, + 0x53, 0xd1, 0xb8, 0xe3, 0xc7, 0x6e, 0x5c, 0x3e, 0x74, 0x17, 0x63, 0x12, 0x68, 0xd2, 0xb3, 0xff, + 0x43, 0x52, 0xc7, 0x51, 0x43, 0x9a, 0x7c, 0x1a, 0x1e, 0x0f, 0x7b, 0x8d, 0x06, 0x0d, 0xc3, 0xcd, + 0x5e, 0x1b, 0x7b, 0xde, 0x4d, 0x37, 0x8c, 0xfc, 0x60, 0x77, 0xc5, 0xed, 0xb8, 0x11, 0x1f, 0xd0, + 0xc5, 0xda, 0xa5, 0xfd, 0xbd, 0xb9, 0xc7, 0xeb, 0x83, 0x90, 0x70, 0x70, 0x7d, 0xe2, 0xc0, 0x13, + 0x3d, 0x6f, 0x30, 0x79, 0x71, 0xfc, 0x98, 0xdb, 0xdf, 0x9b, 0x7b, 0xe2, 0xee, 0x60, 0x34, 0x3c, + 0x88, 0x86, 0xfd, 0xc7, 0x16, 0xdb, 0x86, 0xc4, 0x77, 0xad, 0xd3, 0x4e, 0xb7, 0xcd, 0x96, 0xce, + 0xd3, 0x57, 0x8e, 0xa3, 0x84, 0x72, 0x8c, 0xf9, 0xec, 0xe5, 0x4a, 0xfe, 0x41, 0x1a, 0xb2, 0xfd, + 0xdf, 0x2c, 0x38, 0x9f, 0x46, 0x7e, 0x04, 0x0a, 0x5d, 0x98, 0x54, 0xe8, 0x6e, 0xe7, 0xfb, 0xb5, + 0x03, 0xb4, 0xba, 0x5f, 0x32, 0x06, 0xac, 0x42, 0x45, 0xba, 0x49, 0x5e, 0x84, 0x89, 0x48, 0xfe, + 0xbd, 0x1d, 0x2b, 0xe7, 0xda, 0x30, 0xb1, 0x6e, 0xc0, 0x30, 0x81, 0xc9, 0x6a, 0x36, 0xda, 0xbd, + 0x30, 0xa2, 0x41, 0xbd, 0xe1, 0x77, 0xc5, 0xb2, 0x5b, 0x8a, 0x6b, 0x2e, 0x1a, 0x30, 0x4c, 0x60, + 0xda, 0x7f, 0xad, 0xd8, 0xdf, 0xee, 0xff, 0xb7, 0xeb, 0x2b, 0xb1, 0xfa, 0x51, 0x78, 0x2f, 0xd5, + 0x8f, 0xd1, 0xf7, 0x95, 0xfa, 0xf1, 0x25, 0x8b, 0x69, 0x71, 0x62, 0x00, 0x84, 0x52, 0x35, 0x7a, + 0x2d, 0xdf, 0xe9, 0x80, 0x74, 0xd3, 0x54, 0x0c, 0x25, 0x2f, 0x8c, 0xd9, 0xda, 0xff, 0x60, 0x14, + 0x26, 0xaa, 0x5e, 0xe4, 0x56, 0x37, 0x37, 0x5d, 0xcf, 0x8d, 0x76, 0xc9, 0xd7, 0x47, 0x60, 0xa1, + 0x1b, 0xd0, 0x4d, 0x1a, 0x04, 0xb4, 0xb9, 0xd4, 0x0b, 0x5c, 0xaf, 0x55, 0x6f, 0x6c, 0xd1, 0x66, + 0xaf, 0xed, 0x7a, 0xad, 0xe5, 0x96, 0xe7, 0xeb, 0xe2, 0xeb, 0x0f, 0x69, 0xa3, 0xc7, 0xdb, 0x55, + 0xac, 0x12, 0x9d, 0xe1, 0x64, 0x5f, 0x3b, 0x1e, 0xd3, 0xda, 0x73, 0xfb, 0x7b, 0x73, 0x0b, 0xc7, + 0xac, 0x84, 0xc7, 0xfd, 0x34, 0xf2, 0xd5, 0x11, 0x98, 0x0f, 0xe8, 0xe7, 0x7a, 0xee, 0xd1, 0x5b, + 0x43, 0x2c, 0xe3, 0xed, 0x21, 0xb7, 0xfb, 0x63, 0xf1, 0xac, 0x5d, 0xdb, 0xdf, 0x9b, 0x3b, 0x66, + 0x1d, 0x3c, 0xe6, 0x77, 0xd9, 0x6b, 0x50, 0xa9, 0x76, 0xdd, 0xd0, 0x7d, 0x88, 0x7e, 0x2f, 0xa2, + 0x47, 0x30, 0x68, 0xcc, 0x41, 0x31, 0xe8, 0xb5, 0xa9, 0x58, 0x60, 0xca, 0xb5, 0x32, 0x5b, 0x96, + 0x91, 0x15, 0xa0, 0x28, 0xb7, 0xbf, 0xc4, 0xb6, 0x20, 0x4e, 0x32, 0x65, 0xca, 0xba, 0x0f, 0xc5, + 0x80, 0x31, 0x91, 0x23, 0x6b, 0xd8, 0x53, 0x7f, 0x2c, 0xb5, 0x14, 0x82, 0xfd, 0x44, 0xc1, 0xc2, + 0xfe, 0xee, 0x08, 0x5c, 0xa8, 0x76, 0xbb, 0xab, 0x34, 0xdc, 0x4a, 0x49, 0xf1, 0xcb, 0x16, 0x4c, + 0xee, 0xb8, 0x41, 0xd4, 0x73, 0xda, 0xca, 0x5a, 0x29, 0xe4, 0xa9, 0x0f, 0x2b, 0x0f, 0xe7, 0xf6, + 0x7a, 0x82, 0x74, 0x8d, 0xec, 0xef, 0xcd, 0x4d, 0x26, 0xcb, 0x30, 0xc5, 0x9e, 0xfc, 0x0d, 0x0b, + 0xa6, 0x65, 0xd1, 0x6d, 0xbf, 0x49, 0x4d, 0x6b, 0xf8, 0xdd, 0x3c, 0x65, 0xd2, 0xc4, 0x85, 0x15, + 0x33, 0x5d, 0x8a, 0x7d, 0x42, 0xd8, 0xff, 0x63, 0x04, 0x2e, 0x0e, 0xa0, 0x41, 0x7e, 0xd3, 0x82, + 0xf3, 0xc2, 0x84, 0x6e, 0x80, 0x90, 0x6e, 0xca, 0xd6, 0xfc, 0x64, 0xde, 0x92, 0x23, 0x9b, 0xe2, + 0xd4, 0x6b, 0xd0, 0xda, 0x0c, 0x5b, 0x92, 0x17, 0x33, 0x58, 0x63, 0xa6, 0x40, 0x5c, 0x52, 0x61, + 0x54, 0x4f, 0x49, 0x3a, 0xf2, 0x48, 0x24, 0xad, 0x67, 0xb0, 0xc6, 0x4c, 0x81, 0xec, 0xbf, 0x02, + 0x4f, 0x1c, 0x40, 0xee, 0xf0, 0xc9, 0x69, 0xbf, 0xa1, 0x47, 0x7d, 0x72, 0xcc, 0x1d, 0x61, 0x5e, + 0xdb, 0x30, 0xc6, 0xa7, 0x8e, 0x9a, 0xd8, 0xc0, 0xf6, 0x60, 0x3e, 0xa7, 0x42, 0x94, 0x10, 0xfb, + 0xbb, 0x16, 0x94, 0x8e, 0x61, 0xfb, 0x9c, 0x4b, 0xda, 0x3e, 0xcb, 0x7d, 0x76, 0xcf, 0xa8, 0xdf, + 0xee, 0xf9, 0xca, 0x70, 0xbd, 0x71, 0x14, 0x7b, 0xe7, 0x8f, 0x2d, 0x38, 0xdb, 0x67, 0x1f, 0x25, + 0x5b, 0x70, 0xbe, 0xeb, 0x37, 0xd5, 0x76, 0x7a, 0xd3, 0x09, 0xb7, 0x38, 0x4c, 0x7e, 0xde, 0xf3, + 0xac, 0x27, 0xd7, 0x32, 0xe0, 0xef, 0xee, 0xcd, 0xcd, 0x68, 0x22, 0x29, 0x04, 0xcc, 0xa4, 0x48, + 0xba, 0x50, 0xda, 0x74, 0x69, 0xbb, 0x19, 0x0f, 0xc1, 0x21, 0xb5, 0xb4, 0x1b, 0x92, 0x9a, 0xb8, + 0x1a, 0x50, 0xff, 0x50, 0x73, 0xb1, 0xff, 0xd4, 0x82, 0xc9, 0x6a, 0x2f, 0xda, 0x62, 0x3a, 0x4a, + 0x83, 0x5b, 0xe3, 0x88, 0x07, 0xc5, 0xd0, 0x6d, 0xed, 0x3c, 0x9f, 0xcf, 0x62, 0x5c, 0x67, 0xa4, + 0xe4, 0x15, 0x89, 0x56, 0xd6, 0x79, 0x21, 0x0a, 0x36, 0x24, 0x80, 0x31, 0xdf, 0xe9, 0x45, 0x5b, + 0xd7, 0xe4, 0x27, 0x0f, 0x69, 0x99, 0xb8, 0xc3, 0x3e, 0xe7, 0x9a, 0xe4, 0xa8, 0x55, 0x46, 0x51, + 0x8a, 0x92, 0x93, 0xfd, 0x05, 0x98, 0x4c, 0xde, 0xbb, 0x1d, 0x61, 0xcc, 0x5e, 0x82, 0x82, 0x13, + 0x78, 0x72, 0xc4, 0x56, 0x24, 0x42, 0xa1, 0x8a, 0xb7, 0x91, 0x95, 0x93, 0x67, 0xa1, 0xb4, 0xd9, + 0x6b, 0xb7, 0xf9, 0xb9, 0x42, 0x5c, 0x72, 0xe9, 0x63, 0xd1, 0x0d, 0x59, 0x8e, 0x1a, 0xc3, 0xfe, + 0xdf, 0xa3, 0x30, 0x55, 0x6b, 0xf7, 0xe8, 0x2b, 0x01, 0xa5, 0xca, 0x16, 0x54, 0x85, 0xa9, 0x6e, + 0x40, 0x77, 0x5c, 0xfa, 0xa0, 0x4e, 0xdb, 0xb4, 0x11, 0xf9, 0x81, 0x94, 0xe6, 0xa2, 0x24, 0x34, + 0xb5, 0x96, 0x04, 0x63, 0x1a, 0x9f, 0xbc, 0x0c, 0x93, 0x4e, 0x23, 0x72, 0x77, 0xa8, 0xa6, 0x20, + 0xc4, 0x7d, 0x4c, 0x52, 0x98, 0xac, 0x26, 0xa0, 0x98, 0xc2, 0x26, 0x9f, 0x81, 0x99, 0xb0, 0xe1, + 0xb4, 0xe9, 0xdd, 0xae, 0x64, 0xb5, 0xb8, 0x45, 0x1b, 0xdb, 0x6b, 0xbe, 0xeb, 0x45, 0xd2, 0xee, + 0x78, 0x45, 0x52, 0x9a, 0xa9, 0x0f, 0xc0, 0xc3, 0x81, 0x14, 0xc8, 0xbf, 0xb4, 0xe0, 0x52, 0x37, + 0xa0, 0x6b, 0x81, 0xdf, 0xf1, 0xd9, 0x50, 0xeb, 0x33, 0x87, 0x49, 0xb3, 0xd0, 0xeb, 0x43, 0xea, + 0x52, 0xa2, 0xa4, 0xff, 0x0e, 0xe7, 0x83, 0xfb, 0x7b, 0x73, 0x97, 0xd6, 0x0e, 0x12, 0x00, 0x0f, + 0x96, 0x8f, 0xfc, 0x6b, 0x0b, 0x2e, 0x77, 0xfd, 0x30, 0x3a, 0xe0, 0x13, 0x8a, 0xa7, 0xfa, 0x09, + 0xf6, 0xfe, 0xde, 0xdc, 0xe5, 0xb5, 0x03, 0x25, 0xc0, 0x43, 0x24, 0xb4, 0xf7, 0x2b, 0x70, 0xd6, + 0x18, 0x7b, 0xd2, 0x98, 0xf3, 0x12, 0x9c, 0x51, 0x83, 0x21, 0xd6, 0x7d, 0xca, 0xb1, 0x6d, 0xaf, + 0x6a, 0x02, 0x31, 0x89, 0xcb, 0xc6, 0x9d, 0x1e, 0x8a, 0xa2, 0x76, 0x6a, 0xdc, 0xad, 0x25, 0xa0, + 0x98, 0xc2, 0x26, 0xcb, 0x70, 0x4e, 0x96, 0x20, 0xed, 0xb6, 0xdd, 0x86, 0xb3, 0xe8, 0xf7, 0xe4, + 0x90, 0x2b, 0xd6, 0x2e, 0xee, 0xef, 0xcd, 0x9d, 0x5b, 0xeb, 0x07, 0x63, 0x56, 0x1d, 0xb2, 0x02, + 0xe7, 0x9d, 0x5e, 0xe4, 0xeb, 0xef, 0xbf, 0xee, 0xb1, 0xed, 0xb4, 0xc9, 0x87, 0x56, 0x49, 0xec, + 0xbb, 0xd5, 0x0c, 0x38, 0x66, 0xd6, 0x22, 0x6b, 0x29, 0x6a, 0x75, 0xda, 0xf0, 0xbd, 0xa6, 0xe8, + 0xe5, 0x62, 0x7c, 0x0c, 0xac, 0x66, 0xe0, 0x60, 0x66, 0x4d, 0xd2, 0x86, 0xc9, 0x8e, 0xf3, 0xf0, + 0xae, 0xe7, 0xec, 0x38, 0x6e, 0x9b, 0x31, 0x91, 0xf6, 0xc2, 0xc1, 0x56, 0xa6, 0x5e, 0xe4, 0xb6, + 0xe7, 0x85, 0x1f, 0xc7, 0xfc, 0xb2, 0x17, 0xdd, 0x09, 0xea, 0x11, 0xd3, 0xd4, 0x85, 0x06, 0xb9, + 0x9a, 0xa0, 0x85, 0x29, 0xda, 0xe4, 0x0e, 0x5c, 0xe0, 0xd3, 0x71, 0xc9, 0x7f, 0xe0, 0x2d, 0xd1, + 0xb6, 0xb3, 0xab, 0x3e, 0x60, 0x9c, 0x7f, 0xc0, 0xe3, 0xfb, 0x7b, 0x73, 0x17, 0xea, 0x59, 0x08, + 0x98, 0x5d, 0x8f, 0x38, 0xf0, 0x44, 0x12, 0x80, 0x74, 0xc7, 0x0d, 0x5d, 0xdf, 0x13, 0x66, 0xb9, + 0x52, 0x6c, 0x96, 0xab, 0x0f, 0x46, 0xc3, 0x83, 0x68, 0x90, 0xbf, 0x6d, 0xc1, 0xf9, 0xac, 0x69, + 0x38, 0x53, 0xce, 0xe3, 0x36, 0x39, 0x35, 0xb5, 0xc4, 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, 0x20, + 0x6f, 0x5b, 0x30, 0xe1, 0x18, 0x27, 0xe8, 0x19, 0xc8, 0x63, 0xd7, 0x32, 0xcf, 0xe4, 0xb5, 0xe9, + 0xfd, 0xbd, 0xb9, 0xc4, 0x29, 0x1d, 0x13, 0x1c, 0xc9, 0xdf, 0xb5, 0xe0, 0x42, 0xe6, 0x1c, 0x9f, + 0xa9, 0x9c, 0x46, 0x0b, 0xf1, 0x41, 0x92, 0xbd, 0xe6, 0x64, 0x8b, 0x41, 0xbe, 0x69, 0xe9, 0xad, + 0x4c, 0x5d, 0x30, 0xce, 0x4c, 0x70, 0xd1, 0x86, 0x34, 0x78, 0x18, 0x6a, 0x94, 0x22, 0x5c, 0x3b, + 0x67, 0xec, 0x8c, 0xaa, 0x10, 0xd3, 0xec, 0xc9, 0x37, 0x2c, 0xb5, 0x35, 0x6a, 0x89, 0xce, 0x9c, + 0x96, 0x44, 0x24, 0xde, 0x69, 0xb5, 0x40, 0x29, 0xe6, 0xe4, 0xe7, 0x60, 0xd6, 0xd9, 0xf0, 0x83, + 0x28, 0x73, 0xf2, 0xcd, 0x4c, 0xf2, 0x69, 0x74, 0x79, 0x7f, 0x6f, 0x6e, 0xb6, 0x3a, 0x10, 0x0b, + 0x0f, 0xa0, 0x60, 0xff, 0xee, 0x18, 0x4c, 0x88, 0x93, 0x90, 0xdc, 0xba, 0x7e, 0xdb, 0x82, 0x27, + 0x1b, 0xbd, 0x20, 0xa0, 0x5e, 0x54, 0x8f, 0x68, 0xb7, 0x7f, 0xe3, 0xb2, 0x4e, 0x75, 0xe3, 0xba, + 0xb2, 0xbf, 0x37, 0xf7, 0xe4, 0xe2, 0x01, 0xfc, 0xf1, 0x40, 0xe9, 0xc8, 0xbf, 0xb7, 0xc0, 0x96, + 0x08, 0x35, 0xa7, 0xb1, 0xdd, 0x0a, 0xfc, 0x9e, 0xd7, 0xec, 0xff, 0x88, 0x91, 0x53, 0xfd, 0x88, + 0xa7, 0xf7, 0xf7, 0xe6, 0xec, 0xc5, 0x43, 0xa5, 0xc0, 0x23, 0x48, 0x4a, 0x5e, 0x81, 0xb3, 0x12, + 0xeb, 0xfa, 0xc3, 0x2e, 0x0d, 0x5c, 0x76, 0xe6, 0x90, 0x8a, 0x63, 0xec, 0x9b, 0x96, 0x46, 0xc0, + 0xfe, 0x3a, 0x24, 0x84, 0xf1, 0x07, 0xd4, 0x6d, 0x6d, 0x45, 0x4a, 0x7d, 0x1a, 0xd2, 0x21, 0x4d, + 0x5a, 0x45, 0xee, 0x09, 0x9a, 0xb5, 0xca, 0xfe, 0xde, 0xdc, 0xb8, 0xfc, 0x83, 0x8a, 0x13, 0xb9, + 0x0d, 0x93, 0xe2, 0x9c, 0xba, 0xe6, 0x7a, 0xad, 0x35, 0xdf, 0x13, 0x5e, 0x55, 0xe5, 0xda, 0xd3, + 0x6a, 0xc3, 0xaf, 0x27, 0xa0, 0xef, 0xee, 0xcd, 0x4d, 0xa8, 0xdf, 0xeb, 0xbb, 0x5d, 0x8a, 0xa9, + 0xda, 0xe4, 0x6f, 0x59, 0x40, 0xc2, 0x88, 0x76, 0xd7, 0xda, 0xbd, 0x96, 0x2b, 0x9b, 0x48, 0xfa, + 0x47, 0xe5, 0xe0, 0xaa, 0x95, 0xa4, 0x5b, 0x9b, 0x95, 0x42, 0x92, 0x7a, 0x1f, 0x47, 0xcc, 0x90, + 0xc2, 0xfe, 0xce, 0x38, 0x80, 0x9a, 0x4b, 0xb4, 0x4b, 0x3e, 0x04, 0xe5, 0x90, 0x46, 0xa2, 0x49, + 0xe4, 0x35, 0x97, 0xb8, 0x9c, 0x54, 0x85, 0x18, 0xc3, 0xc9, 0x36, 0x14, 0xbb, 0x4e, 0x2f, 0xa4, + 0xf9, 0x1c, 0x6e, 0xe4, 0xc8, 0x5c, 0x63, 0x14, 0xc5, 0xa9, 0x99, 0xff, 0x44, 0xc1, 0x83, 0x7c, + 0xd9, 0x02, 0xa0, 0xc9, 0xd1, 0x34, 0xb4, 0xf5, 0x4a, 0xb2, 0x8c, 0x07, 0x1c, 0x6b, 0x83, 0xda, + 0xe4, 0xfe, 0xde, 0x1c, 0x18, 0xe3, 0xd2, 0x60, 0x4b, 0x1e, 0x40, 0xc9, 0x51, 0x1b, 0xd2, 0xe8, + 0x69, 0x6c, 0x48, 0xfc, 0x30, 0xab, 0x67, 0x94, 0x66, 0x46, 0xbe, 0x6a, 0xc1, 0x64, 0x48, 0x23, + 0xd9, 0x55, 0x6c, 0x59, 0x94, 0xda, 0xf8, 0x90, 0x33, 0xa2, 0x9e, 0xa0, 0x29, 0x96, 0xf7, 0x64, + 0x19, 0xa6, 0xf8, 0x2a, 0x51, 0x6e, 0x52, 0xa7, 0x49, 0x03, 0x6e, 0x2b, 0x91, 0x6a, 0xde, 0xf0, + 0xa2, 0x18, 0x34, 0xb5, 0x28, 0x46, 0x19, 0xa6, 0xf8, 0x2a, 0x51, 0x56, 0xdd, 0x20, 0xf0, 0xa5, + 0x28, 0xa5, 0x9c, 0x44, 0x31, 0x68, 0x6a, 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0x25, 0x6d, 0x18, 0xeb, + 0xf2, 0xa9, 0x25, 0x55, 0xb9, 0x21, 0xef, 0xc8, 0xd5, 0x34, 0xa5, 0x5d, 0x61, 0x93, 0x12, 0xff, + 0x51, 0xf2, 0xb0, 0xbf, 0x7d, 0x06, 0x26, 0xd5, 0xb4, 0x8d, 0x0f, 0x39, 0xc2, 0x10, 0x38, 0xe0, + 0x90, 0xb3, 0x68, 0x02, 0x31, 0x89, 0xcb, 0x2a, 0x8b, 0x55, 0x2b, 0x79, 0xc6, 0xd1, 0x95, 0xeb, + 0x26, 0x10, 0x93, 0xb8, 0xa4, 0x03, 0x45, 0xb6, 0xb2, 0x28, 0xf7, 0x8b, 0x21, 0xbf, 0x3c, 0x5e, + 0x8d, 0x0c, 0xa3, 0x0a, 0x23, 0x8f, 0x82, 0x0b, 0xb7, 0x65, 0x47, 0x09, 0xf3, 0xb6, 0x9c, 0x8a, + 0xf9, 0xac, 0x06, 0x49, 0xcb, 0xb9, 0xe8, 0xfb, 0x64, 0x19, 0xa6, 0xd8, 0x67, 0x9c, 0x7b, 0x8a, + 0xa7, 0x78, 0xee, 0xf9, 0x14, 0x94, 0x3a, 0xce, 0xc3, 0x7a, 0x2f, 0x68, 0x9d, 0xfc, 0x7c, 0x25, + 0xdd, 0x69, 0x05, 0x15, 0xd4, 0xf4, 0xc8, 0x17, 0x2d, 0x63, 0x81, 0x13, 0xbe, 0x16, 0xf7, 0xf2, + 0x5d, 0xe0, 0xb4, 0xda, 0x30, 0x70, 0xa9, 0xeb, 0x3b, 0x85, 0x94, 0x1e, 0xf9, 0x29, 0x84, 0x69, + 0xd4, 0x62, 0x82, 0x68, 0x8d, 0xba, 0x7c, 0xaa, 0x1a, 0xf5, 0x62, 0x82, 0x19, 0xa6, 0x98, 0x73, + 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xa9, 0xca, 0x53, 0x4f, 0x30, 0xc3, 0x14, 0xf3, 0xc1, 0x47, + 0xef, 0xca, 0xe9, 0x1c, 0xbd, 0x27, 0x72, 0x38, 0x7a, 0x1f, 0x7c, 0x2a, 0x39, 0x33, 0xec, 0xa9, + 0x84, 0xdc, 0x02, 0xd2, 0xdc, 0xf5, 0x9c, 0x8e, 0xdb, 0x90, 0x8b, 0x25, 0xdf, 0xa4, 0x27, 0xb9, + 0x69, 0x46, 0x6b, 0x65, 0x4b, 0x7d, 0x18, 0x98, 0x51, 0x8b, 0x44, 0x50, 0xea, 0x2a, 0xe5, 0x73, + 0x2a, 0x8f, 0xd1, 0xaf, 0x94, 0x51, 0xe1, 0x42, 0xc3, 0x26, 0x9e, 0x2a, 0x41, 0xcd, 0x89, 0xac, + 0xc0, 0xf9, 0x8e, 0xeb, 0xad, 0xf9, 0xcd, 0x70, 0x8d, 0x06, 0xd2, 0xf0, 0x54, 0xa7, 0xd1, 0xcc, + 0x34, 0x6f, 0x1b, 0x6e, 0x4c, 0x58, 0xcd, 0x80, 0x63, 0x66, 0x2d, 0xfb, 0x7f, 0x59, 0x30, 0xbd, + 0xd8, 0xf6, 0x7b, 0xcd, 0x7b, 0x4e, 0xd4, 0xd8, 0x12, 0x1e, 0x1b, 0xe4, 0x65, 0x28, 0xb9, 0x5e, + 0x44, 0x83, 0x1d, 0xa7, 0x2d, 0xf7, 0x27, 0x5b, 0x59, 0x92, 0x97, 0x65, 0xf9, 0xbb, 0x7b, 0x73, + 0x93, 0x4b, 0xbd, 0x80, 0x1b, 0xec, 0xc5, 0x6a, 0x85, 0xba, 0x0e, 0xf9, 0xb6, 0x05, 0x67, 0x85, + 0xcf, 0xc7, 0x92, 0x13, 0x39, 0xaf, 0xf5, 0x68, 0xe0, 0x52, 0xe5, 0xf5, 0x31, 0xe4, 0x42, 0x95, + 0x96, 0x55, 0x31, 0xd8, 0x8d, 0xcf, 0x2c, 0xab, 0x69, 0xce, 0xd8, 0x2f, 0x8c, 0xfd, 0xab, 0x05, + 0x78, 0x7c, 0x20, 0x2d, 0x32, 0x0b, 0x23, 0x6e, 0x53, 0x7e, 0x3a, 0x48, 0xba, 0x23, 0xcb, 0x4d, + 0x1c, 0x71, 0x9b, 0x64, 0x9e, 0x6b, 0xb8, 0x01, 0x0d, 0x43, 0x75, 0xf7, 0x5e, 0xd6, 0xca, 0xa8, + 0x2c, 0x45, 0x03, 0x83, 0xcc, 0x41, 0x91, 0xbb, 0x52, 0xcb, 0xa3, 0x15, 0xd7, 0x99, 0xb9, 0xd7, + 0x32, 0x8a, 0x72, 0xf2, 0x25, 0x0b, 0x40, 0x08, 0xc8, 0xf4, 0x7d, 0xb9, 0x4b, 0x62, 0xbe, 0xcd, + 0xc4, 0x28, 0x0b, 0x29, 0xe3, 0xff, 0x68, 0x70, 0x25, 0xeb, 0x30, 0xc6, 0xd4, 0x67, 0xbf, 0x79, + 0xe2, 0x4d, 0x51, 0x28, 0x40, 0x9c, 0x06, 0x4a, 0x5a, 0xac, 0xad, 0x02, 0x1a, 0xf5, 0x02, 0x8f, + 0x35, 0x2d, 0xdf, 0x06, 0x4b, 0x42, 0x0a, 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0xff, 0x7c, 0x04, 0xce, + 0x67, 0x89, 0xce, 0x76, 0x9b, 0x31, 0x21, 0xad, 0xb4, 0x12, 0xfc, 0x6c, 0xfe, 0xed, 0x23, 0xdd, + 0x97, 0xf4, 0x8d, 0x8d, 0xf4, 0x25, 0x95, 0x7c, 0xc9, 0xcf, 0xea, 0x16, 0x1a, 0x39, 0x61, 0x0b, + 0x69, 0xca, 0xa9, 0x56, 0xba, 0x02, 0xa3, 0x21, 0xeb, 0xf9, 0x42, 0xf2, 0xe6, 0x87, 0xf7, 0x11, + 0x87, 0x30, 0x8c, 0x9e, 0xe7, 0x46, 0x32, 0xfe, 0x48, 0x63, 0xdc, 0xf5, 0xdc, 0x08, 0x39, 0xc4, + 0xfe, 0xd6, 0x08, 0xcc, 0x0e, 0xfe, 0x28, 0xf2, 0x2d, 0x0b, 0xa0, 0xc9, 0x0e, 0x47, 0x21, 0x77, + 0xe2, 0x17, 0xee, 0x5e, 0xce, 0x69, 0xb5, 0xe1, 0x92, 0xe2, 0x14, 0xfb, 0x21, 0xea, 0xa2, 0x10, + 0x0d, 0x41, 0xc8, 0x35, 0x35, 0xf4, 0xf9, 0xad, 0x95, 0x98, 0x4c, 0xba, 0xce, 0xaa, 0x86, 0xa0, + 0x81, 0xc5, 0x4e, 0xbf, 0x9e, 0xd3, 0xa1, 0x61, 0xd7, 0xd1, 0xd1, 0x5c, 0xfc, 0xf4, 0x7b, 0x5b, + 0x15, 0x62, 0x0c, 0xb7, 0xdb, 0xf0, 0xd4, 0x11, 0xe4, 0xcc, 0x29, 0x58, 0xc6, 0xfe, 0x13, 0x0b, + 0x2e, 0x4a, 0x4f, 0xbc, 0xff, 0x67, 0xdc, 0x3a, 0x7f, 0x62, 0xc1, 0x13, 0x03, 0xbe, 0xf9, 0x11, + 0x78, 0x77, 0xbe, 0x99, 0xf4, 0xee, 0xbc, 0x3b, 0xec, 0x90, 0xce, 0xfc, 0x8e, 0x01, 0x4e, 0x9e, + 0xdf, 0x1d, 0x85, 0x33, 0x6c, 0xd9, 0x6a, 0xfa, 0xad, 0x9c, 0x36, 0xce, 0xa7, 0xa0, 0xf8, 0x39, + 0xb6, 0x01, 0xa5, 0x07, 0x19, 0xdf, 0x95, 0x50, 0xc0, 0xc8, 0x97, 0x2d, 0x18, 0xff, 0x9c, 0xdc, + 0x53, 0xc5, 0x59, 0x6e, 0xc8, 0xc5, 0x30, 0xf1, 0x0d, 0xf3, 0x72, 0x87, 0x14, 0x31, 0x38, 0xda, + 0x97, 0x53, 0x6d, 0xa5, 0x8a, 0x33, 0x79, 0x06, 0xc6, 0x37, 0xfd, 0xa0, 0xd3, 0x6b, 0x3b, 0xe9, + 0xc0, 0xcf, 0x1b, 0xa2, 0x18, 0x15, 0x9c, 0x4d, 0x72, 0xa7, 0xeb, 0xbe, 0x4e, 0x83, 0x50, 0x84, + 0x64, 0x24, 0x26, 0x79, 0x55, 0x43, 0xd0, 0xc0, 0xe2, 0x75, 0x5a, 0xad, 0x80, 0xb6, 0x9c, 0xc8, + 0x0f, 0xf8, 0xce, 0x61, 0xd6, 0xd1, 0x10, 0x34, 0xb0, 0xc8, 0x43, 0x28, 0x87, 0xb4, 0x11, 0xd0, + 0x08, 0xe9, 0xa6, 0x3c, 0x16, 0xbd, 0x32, 0xac, 0x85, 0x41, 0x92, 0x8b, 0x9d, 0x1a, 0x75, 0x11, + 0xc6, 0xcc, 0x66, 0x3f, 0x0e, 0x13, 0x66, 0xb3, 0x1d, 0x2b, 0x92, 0xe8, 0x13, 0x20, 0xdd, 0x49, + 0x53, 0x8b, 0xa1, 0x75, 0x94, 0xc5, 0xd0, 0xfe, 0x8f, 0x23, 0x60, 0x58, 0xc1, 0x1e, 0xc1, 0x22, + 0xe3, 0x25, 0x16, 0x99, 0x21, 0x2d, 0x38, 0x86, 0x4d, 0x6f, 0x50, 0x5c, 0xe5, 0x4e, 0x2a, 0xae, + 0xf2, 0x76, 0x6e, 0x1c, 0x0f, 0x0e, 0xab, 0xfc, 0xa1, 0x05, 0x4f, 0xc4, 0xc8, 0xfd, 0xd6, 0xf3, + 0xc3, 0x77, 0x8c, 0x17, 0xa0, 0xe2, 0xc4, 0xd5, 0xe4, 0x94, 0x36, 0x82, 0xda, 0x34, 0x08, 0x4d, + 0xbc, 0x38, 0x20, 0xa7, 0x70, 0xc2, 0x80, 0x9c, 0xd1, 0x83, 0x03, 0x72, 0xec, 0x3f, 0x1d, 0x81, + 0x4b, 0xfd, 0x5f, 0x66, 0x7a, 0xa9, 0x1f, 0xfe, 0x6d, 0x69, 0x3f, 0xf6, 0x91, 0x13, 0xfb, 0xb1, + 0x17, 0x8e, 0xea, 0xc7, 0xae, 0xbd, 0xc7, 0x47, 0x4f, 0xdd, 0x7b, 0xbc, 0x0e, 0x17, 0x94, 0xab, + 0xea, 0x0d, 0x3f, 0x90, 0x51, 0x29, 0x6a, 0xed, 0x2a, 0xd5, 0x2e, 0xc9, 0x2a, 0x17, 0x30, 0x0b, + 0x09, 0xb3, 0xeb, 0xda, 0x3f, 0x2c, 0xc0, 0xb9, 0xb8, 0xd9, 0x17, 0x7d, 0xaf, 0xe9, 0x72, 0x6f, + 0xa7, 0x97, 0x60, 0x34, 0xda, 0xed, 0xaa, 0xc6, 0xfe, 0xff, 0x95, 0x38, 0xeb, 0xbb, 0x5d, 0xd6, + 0xdb, 0x17, 0x33, 0xaa, 0xf0, 0xfb, 0x0b, 0x5e, 0x89, 0xac, 0xe8, 0xd9, 0x21, 0x7a, 0xe0, 0xf9, + 0xe4, 0x68, 0x7e, 0x77, 0x6f, 0x2e, 0x23, 0xbf, 0xc4, 0xbc, 0xa6, 0x94, 0x1c, 0xf3, 0xe4, 0x3e, + 0x4c, 0xb6, 0x9d, 0x30, 0xba, 0xdb, 0x6d, 0x3a, 0x11, 0x5d, 0x77, 0xa5, 0x1f, 0xd1, 0xf1, 0x02, + 0x79, 0xb4, 0xc3, 0xc5, 0x4a, 0x82, 0x12, 0xa6, 0x28, 0x93, 0x1d, 0x20, 0xac, 0x64, 0x3d, 0x70, + 0xbc, 0x50, 0x7c, 0x15, 0xe3, 0x77, 0xfc, 0xa8, 0x2c, 0x7d, 0x68, 0x5f, 0xe9, 0xa3, 0x86, 0x19, + 0x1c, 0xc8, 0xd3, 0x30, 0x16, 0x50, 0x27, 0xd4, 0x1b, 0x91, 0x9e, 0xff, 0xc8, 0x4b, 0x51, 0x42, + 0xcd, 0x09, 0x35, 0x76, 0xc8, 0x84, 0xfa, 0x03, 0x0b, 0x26, 0xe3, 0x6e, 0x7a, 0x04, 0x4a, 0x4f, + 0x27, 0xa9, 0xf4, 0xdc, 0xcc, 0x6b, 0x49, 0x1c, 0xa0, 0xe7, 0xfc, 0xf1, 0xb8, 0xf9, 0x7d, 0x3c, + 0x74, 0xe4, 0xf3, 0x66, 0x24, 0x81, 0x95, 0x47, 0x3c, 0x5f, 0x42, 0xcf, 0x3c, 0x30, 0x84, 0x80, + 0x69, 0x59, 0x4d, 0xa9, 0x41, 0xc9, 0x61, 0xaf, 0xb5, 0x2c, 0xa5, 0x59, 0x65, 0x69, 0x59, 0xaa, + 0x0e, 0xb9, 0x0b, 0x17, 0xbb, 0x81, 0xcf, 0x33, 0x1c, 0x2c, 0x51, 0xa7, 0xd9, 0x76, 0x3d, 0xaa, + 0x0c, 0x4c, 0xc2, 0xdf, 0xe7, 0x89, 0xfd, 0xbd, 0xb9, 0x8b, 0x6b, 0xd9, 0x28, 0x38, 0xa8, 0x6e, + 0x32, 0x46, 0x76, 0xf4, 0x08, 0x31, 0xb2, 0xbf, 0xa4, 0xcd, 0xb8, 0x3a, 0x1c, 0xe3, 0xd3, 0x79, + 0x75, 0x65, 0x56, 0x60, 0x86, 0x1e, 0x52, 0x55, 0xc9, 0x14, 0x35, 0xfb, 0xc1, 0xb6, 0xc2, 0xb1, + 0x13, 0xda, 0x0a, 0xe3, 0x08, 0x9c, 0xf1, 0xf7, 0x32, 0x02, 0xa7, 0xf4, 0xbe, 0x8a, 0xc0, 0xf9, + 0xb6, 0x05, 0xe7, 0x9c, 0xfe, 0xd8, 0xf7, 0x7c, 0xcc, 0xd6, 0x19, 0x41, 0xf5, 0xb5, 0x27, 0xa4, + 0x90, 0x59, 0x29, 0x06, 0x30, 0x4b, 0x14, 0xfb, 0x9d, 0x22, 0x4c, 0xa7, 0x95, 0xa4, 0xd3, 0x0f, + 0x12, 0xfe, 0x15, 0x0b, 0xa6, 0xd5, 0x04, 0xd7, 0x77, 0xef, 0xe2, 0x70, 0xb3, 0x92, 0xd3, 0xba, + 0x22, 0xd4, 0x3d, 0x9d, 0xbb, 0x65, 0x3d, 0xc5, 0x0d, 0xfb, 0xf8, 0x93, 0x37, 0xa0, 0xa2, 0xef, + 0x73, 0x4e, 0x14, 0x31, 0xcc, 0x83, 0x5a, 0xab, 0x31, 0x09, 0x34, 0xe9, 0x91, 0x77, 0x2c, 0x80, + 0x86, 0xda, 0x89, 0x73, 0x8a, 0xc7, 0xca, 0xd0, 0x16, 0x62, 0x7d, 0x5e, 0x17, 0x85, 0x68, 0x30, + 0x26, 0xbf, 0xca, 0x6f, 0x72, 0xf4, 0x48, 0x50, 0x3e, 0x0f, 0x9f, 0xcc, 0x7b, 0x29, 0x8a, 0xbd, + 0x58, 0xb4, 0xb6, 0x67, 0x80, 0x42, 0x4c, 0x08, 0x61, 0xbf, 0x04, 0xda, 0x5b, 0x9c, 0xad, 0xac, + 0xdc, 0x5f, 0x7c, 0xcd, 0x89, 0xb6, 0xe4, 0x10, 0xd4, 0x2b, 0xeb, 0x0d, 0x05, 0xc0, 0x18, 0xc7, + 0xfe, 0x2c, 0x4c, 0xbe, 0x12, 0x38, 0xdd, 0x2d, 0x97, 0xdf, 0x98, 0xb0, 0x93, 0xf9, 0x33, 0x30, + 0xee, 0x34, 0x9b, 0x59, 0x69, 0x86, 0xaa, 0xa2, 0x18, 0x15, 0xfc, 0x48, 0x87, 0x70, 0xfb, 0xdf, + 0x5a, 0x40, 0xe2, 0x3b, 0x6e, 0xd7, 0x6b, 0xad, 0x3a, 0x51, 0x63, 0x8b, 0x1d, 0xe1, 0xb6, 0x78, + 0x69, 0xd6, 0x11, 0xee, 0xa6, 0x86, 0xa0, 0x81, 0x45, 0xde, 0x82, 0x8a, 0xf8, 0xf7, 0xba, 0x3e, + 0x20, 0x0e, 0xef, 0xf4, 0xce, 0xf7, 0x3c, 0x2e, 0x93, 0x18, 0x85, 0x37, 0x63, 0x0e, 0x68, 0xb2, + 0x63, 0x4d, 0xb5, 0xec, 0x6d, 0xb6, 0x7b, 0x0f, 0x9b, 0x1b, 0x71, 0x53, 0x75, 0x03, 0x7f, 0xd3, + 0x6d, 0xd3, 0x74, 0x53, 0xad, 0x89, 0x62, 0x54, 0xf0, 0xa3, 0x35, 0xd5, 0xbf, 0xb1, 0xe0, 0xfc, + 0x72, 0x18, 0xb9, 0xfe, 0x12, 0x0d, 0x23, 0xb6, 0xf3, 0xb1, 0xf5, 0xb1, 0xd7, 0x3e, 0x4a, 0xe0, + 0xc7, 0x12, 0x4c, 0xcb, 0x1b, 0xf0, 0xde, 0x46, 0x48, 0x23, 0xe3, 0xa8, 0xa1, 0xe7, 0xf1, 0x62, + 0x0a, 0x8e, 0x7d, 0x35, 0x18, 0x15, 0x79, 0x15, 0x1e, 0x53, 0x29, 0x24, 0xa9, 0xd4, 0x53, 0x70, + 0xec, 0xab, 0x61, 0xff, 0xa0, 0x00, 0xe7, 0xf8, 0x67, 0xa4, 0x82, 0xb6, 0xbe, 0x31, 0x28, 0x68, + 0x6b, 0xc8, 0xa9, 0xcc, 0x79, 0x9d, 0x20, 0x64, 0xeb, 0xaf, 0x5b, 0x30, 0xd5, 0x4c, 0xb6, 0x74, + 0x3e, 0x16, 0xc1, 0xac, 0x3e, 0x14, 0xbe, 0x8f, 0xa9, 0x42, 0x4c, 0xf3, 0x27, 0xbf, 0x66, 0xc1, + 0x54, 0x52, 0x4c, 0xb5, 0xba, 0x9f, 0x42, 0x23, 0xe9, 0x60, 0x85, 0x64, 0x79, 0x88, 0x69, 0x11, + 0xec, 0xef, 0x8f, 0xc8, 0x2e, 0x3d, 0x8d, 0x88, 0x24, 0xf2, 0x00, 0xca, 0x51, 0x3b, 0x14, 0x85, + 0xf2, 0x6b, 0x87, 0x3c, 0xb4, 0xae, 0xaf, 0xd4, 0x85, 0xab, 0x4b, 0xac, 0x57, 0xca, 0x12, 0xa6, + 0x1f, 0x2b, 0x5e, 0x9c, 0x71, 0xa3, 0x2b, 0x19, 0xe7, 0x72, 0x5a, 0x5e, 0x5f, 0x5c, 0x4b, 0x33, + 0x96, 0x25, 0x8c, 0xb1, 0xe2, 0x65, 0xff, 0x63, 0x0b, 0xca, 0xb7, 0x7c, 0xb5, 0x8e, 0xfc, 0x5c, + 0x0e, 0xb6, 0x28, 0xad, 0xb2, 0x6a, 0xa5, 0x25, 0x3e, 0x05, 0xbd, 0x9c, 0xb0, 0x44, 0x3d, 0x69, + 0xd0, 0x9e, 0xe7, 0xd9, 0x16, 0x19, 0xa9, 0x5b, 0xfe, 0xc6, 0x40, 0xc3, 0xf5, 0xaf, 0x17, 0xe1, + 0xcc, 0xab, 0xce, 0x2e, 0xf5, 0x22, 0xe7, 0xf8, 0x9b, 0xc4, 0x0b, 0x50, 0x71, 0xba, 0xfc, 0x16, + 0xd5, 0x38, 0x86, 0xc4, 0xc6, 0x9d, 0x18, 0x84, 0x26, 0x5e, 0xbc, 0xa0, 0x89, 0xf0, 0xa0, 0xac, + 0xa5, 0x68, 0x31, 0x05, 0xc7, 0xbe, 0x1a, 0xe4, 0x16, 0x10, 0x19, 0x52, 0x5f, 0x6d, 0x34, 0xfc, + 0x9e, 0x27, 0x96, 0x34, 0x61, 0xf7, 0xd1, 0xe7, 0xe1, 0xd5, 0x3e, 0x0c, 0xcc, 0xa8, 0x45, 0x3e, + 0x03, 0x33, 0x0d, 0x4e, 0x59, 0x9e, 0x8e, 0x4c, 0x8a, 0xe2, 0x84, 0xac, 0x03, 0x6e, 0x16, 0x07, + 0xe0, 0xe1, 0x40, 0x0a, 0x4c, 0xd2, 0x30, 0xf2, 0x03, 0xa7, 0x45, 0x4d, 0xba, 0x63, 0x49, 0x49, + 0xeb, 0x7d, 0x18, 0x98, 0x51, 0x8b, 0x7c, 0x01, 0xca, 0xd1, 0x56, 0x40, 0xc3, 0x2d, 0xbf, 0xdd, + 0x94, 0xe6, 0xdd, 0x21, 0x8d, 0x81, 0xb2, 0xf7, 0xd7, 0x15, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, + 0x79, 0x92, 0x00, 0xc6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x3c, 0x55, 0xdc, 0xca, 0x85, 0x3b, 0x37, + 0x6e, 0x19, 0x66, 0x48, 0xce, 0x01, 0x25, 0x27, 0xfb, 0x77, 0x46, 0x60, 0xc2, 0x44, 0x3c, 0xc2, + 0xda, 0xf4, 0x65, 0x0b, 0x26, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x3b, 0x4e, 0x15, 0x31, 0xbc, 0x46, + 0xc1, 0x48, 0x2d, 0xd1, 0xc8, 0x71, 0xdb, 0x86, 0xb5, 0xce, 0x60, 0x83, 0x09, 0xa6, 0xe4, 0xeb, + 0x16, 0x4c, 0xc5, 0x2e, 0x99, 0xb1, 0xad, 0x2f, 0x57, 0x41, 0xf4, 0x52, 0x7f, 0x3d, 0xc9, 0x09, + 0xd3, 0xac, 0xed, 0x0d, 0x98, 0x4e, 0xf7, 0x36, 0x6b, 0xca, 0xae, 0x23, 0xe7, 0x7a, 0x21, 0x6e, + 0xca, 0x35, 0x27, 0x0c, 0x91, 0x43, 0xc8, 0xb3, 0x50, 0xea, 0x38, 0x41, 0xcb, 0xf5, 0x9c, 0x36, + 0x6f, 0xc5, 0x82, 0xb1, 0x20, 0xc9, 0x72, 0xd4, 0x18, 0xf6, 0x47, 0x60, 0x62, 0xd5, 0xf1, 0x5a, + 0xb4, 0x29, 0xd7, 0xe1, 0xc3, 0x63, 0x62, 0xff, 0x68, 0x14, 0x2a, 0xc6, 0xf1, 0xf1, 0xf4, 0xcf, + 0x59, 0x89, 0x14, 0x48, 0x85, 0x1c, 0x53, 0x20, 0x7d, 0x0a, 0x60, 0xd3, 0xf5, 0xdc, 0x70, 0xeb, + 0x84, 0xc9, 0x95, 0xb8, 0x57, 0xc0, 0x0d, 0x4d, 0x01, 0x0d, 0x6a, 0xf1, 0xd5, 0x6b, 0xf1, 0x80, + 0x3c, 0x85, 0xef, 0x58, 0xc6, 0x76, 0x33, 0x96, 0x87, 0xab, 0x89, 0xd1, 0x31, 0xf3, 0x6a, 0xfb, + 0x11, 0xb7, 0x62, 0x07, 0xed, 0x4a, 0xeb, 0x50, 0x0a, 0x68, 0xd8, 0xeb, 0xd0, 0x13, 0xa5, 0x41, + 0xe2, 0x4e, 0x3f, 0x28, 0xeb, 0xa3, 0xa6, 0x34, 0xfb, 0x12, 0x9c, 0x49, 0x88, 0x70, 0xac, 0x1b, + 0x26, 0x1f, 0x32, 0x6d, 0x14, 0x27, 0xb9, 0x6f, 0x62, 0x7d, 0xd1, 0x36, 0xd2, 0x1f, 0xe9, 0xbe, + 0x10, 0xae, 0x5d, 0x02, 0x66, 0xff, 0xd9, 0x38, 0x48, 0xef, 0x89, 0x23, 0x2c, 0x57, 0xe6, 0x9d, + 0xe9, 0xc8, 0x09, 0xee, 0x4c, 0x6f, 0xc1, 0x84, 0xeb, 0xb9, 0x91, 0xeb, 0xb4, 0xb9, 0xfd, 0x49, + 0x6e, 0xa7, 0x2a, 0x0c, 0x60, 0x62, 0xd9, 0x80, 0x65, 0xd0, 0x49, 0xd4, 0x25, 0xaf, 0x41, 0x91, + 0xef, 0x37, 0x72, 0x00, 0x1f, 0xdf, 0xc5, 0x83, 0x7b, 0xf7, 0x88, 0xd8, 0x40, 0x41, 0x89, 0x1f, + 0x3e, 0x44, 0xfe, 0x27, 0x7d, 0xfc, 0x96, 0xe3, 0x38, 0x3e, 0x7c, 0xa4, 0xe0, 0xd8, 0x57, 0x83, + 0x51, 0xd9, 0x74, 0xdc, 0x76, 0x2f, 0xa0, 0x31, 0x95, 0xb1, 0x24, 0x95, 0x1b, 0x29, 0x38, 0xf6, + 0xd5, 0x20, 0x9b, 0x30, 0x21, 0xcb, 0x84, 0xc3, 0xde, 0xf8, 0x09, 0xbf, 0x92, 0x3b, 0x66, 0xde, + 0x30, 0x28, 0x61, 0x82, 0x2e, 0xe9, 0xc1, 0x59, 0xd7, 0x6b, 0xf8, 0x5e, 0xa3, 0xdd, 0x0b, 0xdd, + 0x1d, 0x1a, 0x07, 0xe6, 0x9d, 0x84, 0xd9, 0x85, 0xfd, 0xbd, 0xb9, 0xb3, 0xcb, 0x69, 0x72, 0xd8, + 0xcf, 0x81, 0x7c, 0xd1, 0x82, 0x0b, 0x0d, 0xdf, 0x0b, 0x79, 0xfe, 0x90, 0x1d, 0x7a, 0x3d, 0x08, + 0xfc, 0x40, 0xf0, 0x2e, 0x9f, 0x90, 0x37, 0x37, 0x7b, 0x2e, 0x66, 0x91, 0xc4, 0x6c, 0x4e, 0xe4, + 0x4d, 0x28, 0x75, 0x03, 0x7f, 0xc7, 0x6d, 0xd2, 0x40, 0x3a, 0x7f, 0xae, 0xe4, 0x91, 0x54, 0x69, + 0x4d, 0xd2, 0x8c, 0x97, 0x1e, 0x55, 0x82, 0x9a, 0x1f, 0xf9, 0x8a, 0x05, 0x17, 0x0d, 0xa9, 0xe4, + 0xb0, 0x12, 0x2d, 0x50, 0x39, 0x61, 0x0b, 0x70, 0x53, 0xf8, 0x62, 0x36, 0x51, 0x1c, 0xc4, 0xcd, + 0xfe, 0xb3, 0x0a, 0x4c, 0x26, 0x05, 0x27, 0xbf, 0x00, 0xd0, 0x0d, 0xfc, 0x0e, 0x8d, 0xb6, 0xa8, + 0x0e, 0xf5, 0xba, 0x3d, 0x6c, 0x02, 0x1f, 0x45, 0x4f, 0xb9, 0x6e, 0xb1, 0x85, 0x2b, 0x2e, 0x45, + 0x83, 0x23, 0x09, 0x60, 0x7c, 0x5b, 0x28, 0x00, 0x52, 0x1f, 0x7a, 0x35, 0x17, 0xed, 0x4d, 0x72, + 0xe6, 0x31, 0x4a, 0xb2, 0x08, 0x15, 0x23, 0xb2, 0x01, 0x85, 0x07, 0x74, 0x23, 0x9f, 0xec, 0x11, + 0xf7, 0xa8, 0x3c, 0x57, 0xd5, 0xc6, 0xf7, 0xf7, 0xe6, 0x0a, 0xf7, 0xe8, 0x06, 0x32, 0xe2, 0xec, + 0xbb, 0x9a, 0xc2, 0x7f, 0x43, 0x2e, 0x5a, 0xaf, 0xe6, 0xe8, 0x0c, 0x22, 0xbe, 0x4b, 0x16, 0xa1, + 0x62, 0x44, 0xde, 0x84, 0xf2, 0x03, 0x67, 0x87, 0x6e, 0x06, 0xbe, 0x17, 0x49, 0x7f, 0xc1, 0x21, + 0x03, 0x6c, 0xee, 0x29, 0x72, 0x92, 0x2f, 0x57, 0x34, 0x74, 0x21, 0xc6, 0xec, 0xc8, 0x0e, 0x94, + 0x3c, 0xfa, 0x00, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0xd0, 0x72, 0x5b, 0x52, 0x93, 0x9c, 0xf9, 0x0e, + 0xac, 0xca, 0x50, 0xf3, 0x62, 0x7d, 0x79, 0xdf, 0xdf, 0xc8, 0xc7, 0xad, 0x44, 0x9f, 0x91, 0x45, + 0x5f, 0xde, 0xf2, 0x37, 0x90, 0x11, 0x67, 0x73, 0xa4, 0xa1, 0x9d, 0xd5, 0xe4, 0x82, 0x79, 0x3b, + 0x5f, 0x27, 0x3d, 0x31, 0x47, 0xe2, 0x52, 0x34, 0x38, 0xb2, 0xb6, 0x6d, 0x49, 0xb3, 0xa9, 0x5c, + 0x32, 0x87, 0x6c, 0xdb, 0xa4, 0x11, 0x56, 0xb4, 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, + 0x0d, 0x32, 0x9f, 0x45, 0x33, 0x69, 0xd1, 0x14, 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, + 0xed, 0xdd, 0x07, 0x4e, 0x7b, 0xdb, 0xf5, 0x5a, 0x72, 0x89, 0x1c, 0x36, 0xd4, 0x6f, 0x7b, 0xf7, + 0x9e, 0xa0, 0x67, 0xb6, 0x77, 0x5c, 0x8a, 0x06, 0x47, 0xf2, 0x77, 0x2c, 0x1d, 0x8e, 0x34, 0x91, + 0x87, 0x23, 0x57, 0x72, 0xc9, 0x95, 0xd1, 0x49, 0x42, 0x65, 0xfd, 0x69, 0xed, 0x7b, 0xca, 0x0b, + 0xbf, 0xf6, 0x87, 0x73, 0x33, 0xd4, 0x6b, 0xf8, 0x4d, 0xd7, 0x6b, 0x2d, 0xdc, 0x0f, 0x7d, 0x6f, + 0x1e, 0x9d, 0x07, 0xea, 0xb4, 0x20, 0x65, 0x9a, 0xfd, 0x18, 0x54, 0x0c, 0x12, 0x87, 0xa9, 0x9c, + 0x13, 0xa6, 0xca, 0xf9, 0x93, 0x31, 0x98, 0x30, 0x73, 0xb1, 0x1e, 0x41, 0x0f, 0xd4, 0x67, 0x9f, + 0x91, 0xe3, 0x9c, 0x7d, 0xd8, 0x61, 0xd7, 0xb8, 0x6a, 0x53, 0x86, 0xb6, 0xe5, 0xdc, 0x54, 0xff, + 0xf8, 0xb0, 0x6b, 0x14, 0x86, 0x98, 0x60, 0x7a, 0x0c, 0xef, 0x1b, 0xa6, 0x40, 0x0b, 0x15, 0xb3, + 0x98, 0x54, 0xa0, 0x13, 0x4a, 0xe3, 0x35, 0x80, 0x38, 0x69, 0xa8, 0xbc, 0x82, 0xd5, 0x9a, 0xb9, + 0x91, 0xcc, 0xd4, 0xc0, 0x22, 0x4f, 0xc3, 0x18, 0x53, 0xc2, 0x68, 0x53, 0x66, 0x56, 0xd0, 0x16, + 0x85, 0x1b, 0xbc, 0x14, 0x25, 0x94, 0xbc, 0xc8, 0xf4, 0xe5, 0x58, 0x75, 0x92, 0x09, 0x13, 0xce, + 0xc7, 0xfa, 0x72, 0x0c, 0xc3, 0x04, 0x26, 0x13, 0x9d, 0x32, 0x4d, 0x87, 0xaf, 0x0d, 0x86, 0xe8, + 0x5c, 0xfd, 0x41, 0x01, 0xe3, 0x16, 0xae, 0x94, 0x66, 0xc4, 0xe7, 0x74, 0xd1, 0xb0, 0x70, 0xa5, + 0xe0, 0xd8, 0x57, 0x83, 0x7d, 0x8c, 0xbc, 0x3d, 0xae, 0x08, 0xa7, 0xf1, 0x01, 0xf7, 0xbe, 0xbf, + 0x68, 0x9e, 0xfa, 0x72, 0x9c, 0x43, 0x62, 0xd4, 0x1e, 0xe3, 0xd8, 0x77, 0x0b, 0x48, 0xbf, 0x32, + 0x24, 0xe3, 0x55, 0xb4, 0xa1, 0xab, 0x5f, 0x8f, 0xc2, 0x8c, 0x5a, 0xc3, 0x1d, 0xf6, 0xbe, 0x62, + 0xc1, 0x64, 0x72, 0x4b, 0xcb, 0xfb, 0x42, 0x87, 0xfc, 0x7f, 0x30, 0x1e, 0xb9, 0x1d, 0xea, 0xf7, + 0x84, 0x09, 0xa1, 0x20, 0xb4, 0x84, 0x75, 0x51, 0x84, 0x0a, 0x66, 0xff, 0xfd, 0x31, 0x38, 0x77, + 0xbb, 0xe5, 0x7a, 0xe9, 0x5c, 0x7b, 0x59, 0x0f, 0x6b, 0x58, 0xc7, 0x7e, 0x58, 0x43, 0xc7, 0x42, + 0xca, 0x67, 0x2b, 0xb2, 0x63, 0x21, 0xd5, 0x1b, 0x22, 0x49, 0x5c, 0xf2, 0x07, 0x16, 0x3c, 0xe9, + 0x34, 0xc5, 0xa9, 0xc8, 0x69, 0xcb, 0x52, 0x23, 0x1f, 0xbc, 0x5c, 0x45, 0xc2, 0x21, 0x35, 0x8b, + 0xfe, 0x8f, 0x9f, 0xaf, 0x1e, 0xc0, 0x55, 0x8c, 0xb2, 0x9f, 0x92, 0x5f, 0xf0, 0xe4, 0x41, 0xa8, + 0x78, 0xa0, 0xf8, 0xe4, 0x2f, 0xc3, 0x54, 0xe2, 0x83, 0xe5, 0x3d, 0x40, 0x59, 0x5c, 0xd7, 0xd4, + 0x93, 0x20, 0x4c, 0xe3, 0x92, 0xef, 0x5b, 0x30, 0x23, 0x8c, 0xce, 0x19, 0x4d, 0x23, 0xee, 0xa9, + 0xfd, 0xfc, 0x9b, 0x66, 0x71, 0x00, 0x47, 0xd1, 0x2c, 0xb1, 0x15, 0x7a, 0x00, 0x1a, 0x0e, 0x14, + 0x79, 0xf6, 0x0e, 0x7c, 0xf0, 0xd0, 0x76, 0x3f, 0xd6, 0xeb, 0x01, 0xaf, 0xc2, 0xa5, 0x03, 0xa5, + 0x3d, 0xd6, 0x8c, 0xfd, 0x9e, 0x05, 0x13, 0x66, 0xce, 0x30, 0xf2, 0x2c, 0x94, 0x22, 0x7f, 0x9b, + 0x7a, 0x77, 0x03, 0xe5, 0x45, 0xae, 0x57, 0x9e, 0x75, 0x5e, 0x8e, 0x2b, 0xa8, 0x31, 0x18, 0x76, + 0xa3, 0xed, 0x52, 0x2f, 0x5a, 0x6e, 0xca, 0x39, 0xa0, 0xb1, 0x17, 0x45, 0xf9, 0x12, 0x6a, 0x0c, + 0xe1, 0x7e, 0xc9, 0x7e, 0x0b, 0x3f, 0x66, 0x69, 0x2d, 0x31, 0xdc, 0x2f, 0x63, 0x18, 0x26, 0x30, + 0x89, 0xad, 0xad, 0xdf, 0xa3, 0xf1, 0x95, 0x57, 0xca, 0x5a, 0xfd, 0x1d, 0x0b, 0xca, 0xe2, 0xf6, + 0x06, 0xe9, 0x66, 0xca, 0xef, 0x3b, 0x65, 0x5f, 0xaa, 0xae, 0x2d, 0x67, 0xf9, 0x7d, 0x5f, 0x81, + 0xd1, 0x6d, 0xd7, 0x53, 0x5f, 0xa2, 0xf5, 0x84, 0x57, 0x5d, 0xaf, 0x89, 0x1c, 0xa2, 0x35, 0x89, + 0xc2, 0x40, 0x4d, 0x62, 0x01, 0xca, 0xda, 0x27, 0x49, 0xee, 0xc7, 0xb1, 0xfb, 0xb6, 0x02, 0x60, + 0x8c, 0x63, 0xff, 0x86, 0x05, 0x93, 0x3c, 0x8d, 0x41, 0x6c, 0x2a, 0x79, 0x41, 0xbb, 0x09, 0x0a, + 0xb9, 0x2f, 0x25, 0xdd, 0x04, 0xdf, 0xdd, 0x9b, 0xab, 0x88, 0xc4, 0x07, 0x49, 0xaf, 0xc1, 0x4f, + 0x4b, 0xfb, 0x2a, 0x77, 0x66, 0x1c, 0x39, 0xb6, 0xf9, 0x2f, 0x16, 0x53, 0x11, 0xc1, 0x98, 0x9e, + 0xfd, 0x16, 0x4c, 0x98, 0x11, 0x82, 0xe4, 0x05, 0xa8, 0x74, 0x5d, 0xaf, 0x95, 0x8c, 0x24, 0xd7, + 0x77, 0x50, 0x6b, 0x31, 0x08, 0x4d, 0x3c, 0x5e, 0xcd, 0x8f, 0xab, 0xa5, 0xae, 0xae, 0xd6, 0x7c, + 0xb3, 0x5a, 0xfc, 0xc7, 0xf6, 0x00, 0xe2, 0x70, 0xf7, 0x23, 0xd9, 0xf5, 0xc6, 0xc4, 0xb5, 0x90, + 0xd0, 0x0e, 0x79, 0xea, 0x92, 0x31, 0x31, 0xc2, 0xdf, 0xdd, 0x3b, 0x48, 0xfb, 0x14, 0xb5, 0xf8, + 0xc3, 0x28, 0x19, 0x91, 0xaf, 0xb9, 0x3f, 0x8c, 0x92, 0xc1, 0xe3, 0xbd, 0x7b, 0x18, 0x25, 0x4b, + 0x98, 0x3f, 0x5f, 0x0f, 0xa3, 0x7c, 0x12, 0x8e, 0x9b, 0x23, 0x99, 0x29, 0x7b, 0x0f, 0xcc, 0x5c, + 0x26, 0xba, 0xc5, 0x65, 0x32, 0x13, 0x09, 0xb5, 0x7f, 0x77, 0x14, 0xa6, 0xd3, 0x36, 0x9f, 0xbc, + 0x1d, 0x7b, 0xc8, 0xd7, 0x2d, 0x98, 0x74, 0x12, 0xf9, 0x28, 0x73, 0x7a, 0x65, 0x2d, 0x41, 0xd3, + 0xc8, 0x87, 0x98, 0x28, 0xc7, 0x14, 0x6f, 0x53, 0xd7, 0x1a, 0x1d, 0xac, 0x6b, 0xb1, 0x4d, 0xc0, + 0xe5, 0x7a, 0x64, 0x40, 0xa5, 0x93, 0xfa, 0x74, 0x6c, 0x44, 0x17, 0xe5, 0xa8, 0x31, 0xc8, 0x43, + 0x18, 0x17, 0x2e, 0x40, 0xca, 0xd7, 0x6b, 0x35, 0x27, 0xdb, 0x94, 0xf0, 0x32, 0x8a, 0xbb, 0x40, + 0xfc, 0x0f, 0x51, 0xb1, 0x63, 0xfa, 0x3a, 0x04, 0x8e, 0xd7, 0xa2, 0xbc, 0xcd, 0xa5, 0x35, 0xe5, + 0xf5, 0xbc, 0xcc, 0x80, 0xa8, 0x29, 0x57, 0x83, 0x56, 0x28, 0x23, 0x4d, 0x75, 0x19, 0x1a, 0x9c, + 0xed, 0x5f, 0xb1, 0x60, 0x66, 0x50, 0x45, 0x36, 0x50, 0xf8, 0xaa, 0x2b, 0x47, 0x94, 0x91, 0xe0, + 0xc2, 0x09, 0x22, 0x14, 0x30, 0x72, 0x09, 0x0a, 0x54, 0x6f, 0x54, 0x3a, 0x1b, 0xe7, 0x75, 0xaf, + 0x89, 0xac, 0x9c, 0x5c, 0x83, 0xd1, 0x30, 0xa2, 0xdd, 0x54, 0x14, 0xc7, 0x28, 0x5b, 0x3c, 0x33, + 0xae, 0x21, 0x38, 0xae, 0xfd, 0x11, 0x38, 0x66, 0x4a, 0x6d, 0xfb, 0x3a, 0x10, 0xf4, 0xdb, 0xed, + 0x0d, 0xa7, 0xb1, 0x7d, 0xcf, 0xf5, 0x9a, 0xfe, 0x03, 0xbe, 0x31, 0x2c, 0x40, 0x39, 0x90, 0x51, + 0xf5, 0xa1, 0x9c, 0x53, 0x7a, 0x67, 0x51, 0xe1, 0xf6, 0x21, 0xc6, 0x38, 0xf6, 0xf7, 0x47, 0x60, + 0x5c, 0xa6, 0x80, 0x78, 0x04, 0x21, 0x44, 0xdb, 0x09, 0xc7, 0x8d, 0xe5, 0x5c, 0x32, 0x57, 0x0c, + 0x8c, 0x1f, 0x0a, 0x53, 0xf1, 0x43, 0xaf, 0xe6, 0xc3, 0xee, 0xe0, 0xe0, 0xa1, 0xef, 0x16, 0x61, + 0x2a, 0x95, 0x52, 0x23, 0x95, 0x7d, 0xdf, 0x7a, 0x4f, 0xb2, 0xef, 0x93, 0x30, 0xf1, 0x02, 0x43, + 0x7e, 0x0e, 0xc7, 0x7f, 0xf1, 0x18, 0x43, 0x5e, 0xae, 0xe0, 0xc5, 0xf7, 0x8f, 0x2b, 0xf8, 0x7f, + 0xb5, 0xe0, 0xf1, 0x81, 0x89, 0x61, 0x78, 0x8a, 0xc5, 0x20, 0x09, 0x95, 0xeb, 0x45, 0xce, 0xc9, + 0xb6, 0xb4, 0x93, 0x47, 0x3a, 0x2b, 0x5e, 0x9a, 0x3d, 0x79, 0x1e, 0x26, 0xf8, 0xda, 0xcc, 0x56, + 0x4e, 0xb6, 0xf6, 0x8a, 0x3b, 0x6a, 0x7e, 0x5b, 0x59, 0x37, 0xca, 0x31, 0x81, 0x65, 0x7f, 0xdb, + 0x82, 0x99, 0x41, 0x09, 0xf7, 0x8e, 0xa0, 0xe7, 0xfe, 0xa5, 0x54, 0x08, 0xd6, 0x5c, 0x5f, 0x08, + 0x56, 0xca, 0x72, 0xa9, 0xa2, 0xad, 0x0c, 0xa3, 0x61, 0xe1, 0x90, 0x08, 0xa3, 0xdf, 0x2b, 0xc0, + 0xb4, 0x14, 0x31, 0x3e, 0xa2, 0xbc, 0x98, 0x08, 0x1c, 0xfb, 0xa9, 0x54, 0xe0, 0xd8, 0xf9, 0x34, + 0xfe, 0x5f, 0x44, 0x8d, 0xbd, 0xbf, 0xa2, 0xc6, 0xbe, 0x56, 0x84, 0x0b, 0x99, 0xa9, 0xed, 0xc8, + 0x57, 0x33, 0x76, 0x8a, 0x7b, 0x39, 0xe7, 0xd0, 0xd3, 0xa1, 0xed, 0xa7, 0x1b, 0x6a, 0xf5, 0x6b, + 0x66, 0x88, 0x93, 0x58, 0xfd, 0x37, 0x4f, 0x21, 0x1b, 0xe0, 0x71, 0xa3, 0x9d, 0x1e, 0xed, 0xeb, + 0x84, 0x7f, 0x0e, 0x96, 0xfa, 0xaf, 0x15, 0xe0, 0xea, 0x51, 0x5b, 0xf6, 0x7d, 0x1a, 0x1e, 0x1c, + 0x26, 0xc2, 0x83, 0x1f, 0x91, 0x6a, 0x73, 0x2a, 0x91, 0xc2, 0x7f, 0x6f, 0x54, 0xef, 0xbb, 0xfd, + 0x13, 0xf6, 0x48, 0x96, 0x97, 0x71, 0xa6, 0xfa, 0xaa, 0x37, 0x1c, 0xe2, 0xbd, 0x61, 0xbc, 0x2e, + 0x8a, 0xdf, 0xdd, 0x9b, 0x3b, 0x1b, 0xe7, 0x80, 0x92, 0x85, 0xa8, 0x2a, 0x91, 0xab, 0x50, 0x0a, + 0x04, 0x54, 0x05, 0x44, 0x4a, 0xb7, 0x34, 0x51, 0x86, 0x1a, 0x4a, 0xbe, 0x60, 0x9c, 0x15, 0x46, + 0x4f, 0x2b, 0xd5, 0xd9, 0x41, 0xd7, 0x2e, 0x6f, 0x40, 0x29, 0x54, 0x0f, 0x0d, 0x88, 0xe9, 0xf4, + 0xdc, 0x11, 0xe3, 0x6c, 0x9d, 0x0d, 0xda, 0x56, 0xaf, 0x0e, 0x88, 0xef, 0xd3, 0x6f, 0x12, 0x68, + 0x92, 0xc4, 0xd6, 0x96, 0x09, 0x71, 0x07, 0x07, 0xfd, 0x56, 0x09, 0x12, 0xc1, 0xb8, 0x7c, 0x6d, + 0x5c, 0x1e, 0x67, 0x57, 0x73, 0x0a, 0x58, 0x93, 0xe1, 0x0c, 0xfc, 0xc0, 0xaf, 0x2c, 0x72, 0x8a, + 0x95, 0xfd, 0x43, 0x0b, 0x2a, 0x72, 0x8c, 0x3c, 0x82, 0x80, 0xe3, 0xfb, 0xc9, 0x80, 0xe3, 0xeb, + 0xb9, 0x2c, 0xe1, 0x03, 0xa2, 0x8d, 0xef, 0xc3, 0x84, 0x99, 0x64, 0x96, 0x7c, 0xca, 0xd8, 0x82, + 0xac, 0x61, 0x12, 0x29, 0xaa, 0x4d, 0x2a, 0xde, 0x9e, 0xec, 0x7f, 0x52, 0xd6, 0xad, 0xc8, 0x0f, + 0xce, 0xe6, 0xc8, 0xb7, 0x0e, 0x1c, 0xf9, 0xe6, 0xc0, 0x1b, 0xc9, 0x7f, 0xe0, 0xbd, 0x06, 0x25, + 0xb5, 0x2c, 0x4a, 0x6d, 0xea, 0x29, 0x33, 0xbe, 0x81, 0xa9, 0x64, 0x8c, 0x98, 0x31, 0x5d, 0xf8, + 0x01, 0x38, 0xbe, 0x27, 0x50, 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x84, 0xca, 0x03, 0x3f, 0xd8, 0x6e, + 0xfb, 0x0e, 0x7f, 0xdd, 0x05, 0xf2, 0x70, 0x64, 0xd1, 0xb6, 0x7e, 0x11, 0x64, 0x76, 0x2f, 0xa6, + 0x8f, 0x26, 0x33, 0x52, 0x85, 0xa9, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0xae, 0x78, 0x54, 0xbc, + 0xac, 0xa0, 0x74, 0xfb, 0xd5, 0x24, 0x18, 0xd3, 0xf8, 0xdc, 0x2e, 0x17, 0x24, 0x4c, 0x1d, 0x32, + 0x7d, 0xfa, 0xda, 0xf0, 0x83, 0x31, 0x69, 0x3e, 0x11, 0x51, 0x56, 0xc9, 0x72, 0x4c, 0xf1, 0x26, + 0x9f, 0x87, 0x52, 0xa8, 0xde, 0xf1, 0x2d, 0xe6, 0x78, 0xea, 0xd1, 0x6f, 0xf9, 0xea, 0xae, 0xd4, + 0x8f, 0xf9, 0x6a, 0x86, 0x64, 0x05, 0xce, 0x2b, 0xdb, 0x4d, 0xe2, 0x49, 0xd2, 0xb1, 0x38, 0x05, + 0x20, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0xd3, 0x6d, 0x79, 0xf2, 0x66, 0xe1, 0x38, 0x60, 0xdc, 0xb5, + 0xf3, 0xf9, 0xd7, 0x44, 0x09, 0x3d, 0x28, 0x6c, 0xbe, 0x34, 0x44, 0xd8, 0x7c, 0x1d, 0x2e, 0xa4, + 0x41, 0x3c, 0xb7, 0x23, 0x4f, 0x27, 0x69, 0x6c, 0xa1, 0x6b, 0x59, 0x48, 0x98, 0x5d, 0x97, 0xdc, + 0x83, 0x72, 0x40, 0xf9, 0x29, 0xaf, 0xaa, 0xbc, 0x3f, 0x8f, 0xed, 0xe7, 0x8e, 0x8a, 0x00, 0xc6, + 0xb4, 0x58, 0xbf, 0x3b, 0xc9, 0xb7, 0x0e, 0x5e, 0xcb, 0xf1, 0xa1, 0x7f, 0xd9, 0xf7, 0x03, 0x72, + 0xae, 0xda, 0xff, 0x6e, 0x0a, 0xce, 0x24, 0x0c, 0x50, 0xe4, 0x29, 0x28, 0xf2, 0x64, 0x97, 0x7c, + 0xb5, 0x2a, 0xc5, 0x2b, 0xaa, 0x68, 0x1c, 0x01, 0x23, 0xbf, 0x6c, 0xc1, 0x54, 0x37, 0x71, 0xbd, + 0xa5, 0x16, 0xf2, 0x21, 0x6d, 0xda, 0xc9, 0x3b, 0x33, 0xe3, 0x95, 0xa0, 0x24, 0x33, 0x4c, 0x73, + 0x67, 0xeb, 0x81, 0x0c, 0x16, 0x69, 0xd3, 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, 0x58, 0x4c, 0x82, + 0x31, 0x8d, 0xcf, 0x7a, 0x98, 0x7f, 0xdd, 0x30, 0x8f, 0x39, 0x57, 0x15, 0x01, 0x8c, 0x69, 0x91, + 0x97, 0x61, 0x52, 0xa6, 0xb8, 0x5f, 0xf3, 0x9b, 0x37, 0x9d, 0x70, 0x4b, 0x1e, 0xf9, 0xf4, 0x11, + 0x75, 0x31, 0x01, 0xc5, 0x14, 0x36, 0xff, 0xb6, 0xf8, 0x1d, 0x01, 0x4e, 0x60, 0x2c, 0xf9, 0x88, + 0xd2, 0x62, 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0xac, 0xb1, 0x0d, 0x09, 0x67, 0x1e, 0xbd, 0x1a, 0x64, + 0x6c, 0x45, 0x55, 0x98, 0xea, 0xf1, 0x13, 0x72, 0x53, 0x01, 0xe5, 0x7c, 0xd4, 0x0c, 0xef, 0x26, + 0xc1, 0x98, 0xc6, 0x27, 0x2f, 0xc1, 0x99, 0x80, 0x2d, 0xb6, 0x9a, 0x80, 0xf0, 0xf0, 0xd1, 0xce, + 0x14, 0x68, 0x02, 0x31, 0x89, 0x4b, 0x5e, 0x81, 0xb3, 0x71, 0x1a, 0x64, 0x45, 0x40, 0xb8, 0xfc, + 0xe8, 0x9c, 0x9c, 0xd5, 0x34, 0x02, 0xf6, 0xd7, 0x21, 0x7f, 0x15, 0xa6, 0x8d, 0x96, 0x58, 0xf6, + 0x9a, 0xf4, 0xa1, 0x4c, 0x55, 0xcb, 0x1f, 0x05, 0x5c, 0x4c, 0xc1, 0xb0, 0x0f, 0x9b, 0x7c, 0x1c, + 0x26, 0x1b, 0x7e, 0xbb, 0xcd, 0xd7, 0x38, 0xf1, 0x80, 0x8f, 0xc8, 0x49, 0x2b, 0xb2, 0xf7, 0x26, + 0x20, 0x98, 0xc2, 0x24, 0xb7, 0x80, 0xf8, 0x1b, 0x4c, 0xbd, 0xa2, 0xcd, 0x57, 0xa8, 0x47, 0xa5, + 0xc6, 0x71, 0x26, 0x19, 0xaa, 0x76, 0xa7, 0x0f, 0x03, 0x33, 0x6a, 0xf1, 0x94, 0x9e, 0x46, 0x68, + 0xff, 0x64, 0x1e, 0x8f, 0x08, 0xa4, 0xed, 0x39, 0x87, 0xc6, 0xf5, 0x07, 0x30, 0x26, 0x3c, 0x22, + 0xf2, 0x49, 0x4e, 0x6b, 0xbe, 0xe5, 0x11, 0xef, 0x11, 0xa2, 0x14, 0x25, 0x27, 0xf2, 0x0b, 0x50, + 0xde, 0x50, 0x0f, 0x3b, 0xf1, 0x8c, 0xb4, 0x43, 0xef, 0x8b, 0xa9, 0x37, 0xca, 0x62, 0x7b, 0x85, + 0x06, 0x60, 0xcc, 0x92, 0x3c, 0x0d, 0x95, 0x9b, 0x6b, 0x55, 0x3d, 0x0a, 0xcf, 0xf2, 0xde, 0x1f, + 0x65, 0x55, 0xd0, 0x04, 0xb0, 0x19, 0xa6, 0xd5, 0x37, 0x92, 0x74, 0x9a, 0xc8, 0xd0, 0xc6, 0x18, + 0x36, 0x77, 0x91, 0xc1, 0xfa, 0xcc, 0xb9, 0x14, 0xb6, 0x2c, 0x47, 0x8d, 0x41, 0xde, 0x80, 0x8a, + 0xdc, 0x2f, 0xf8, 0xda, 0x74, 0xfe, 0x64, 0x69, 0x23, 0x30, 0x26, 0x81, 0x26, 0x3d, 0x7e, 0x7d, + 0xcf, 0xdf, 0xbb, 0xa1, 0x37, 0x7a, 0xed, 0xf6, 0xcc, 0x05, 0xbe, 0x6e, 0xc6, 0xd7, 0xf7, 0x31, + 0x08, 0x4d, 0x3c, 0xf2, 0x9c, 0x72, 0xaf, 0x7c, 0x2c, 0xe1, 0xcf, 0xa0, 0xdd, 0x2b, 0xb5, 0xd2, + 0x3d, 0x20, 0xb2, 0xec, 0xe2, 0x21, 0x7e, 0x8d, 0x1b, 0x30, 0xab, 0x34, 0xbe, 0xfe, 0x49, 0x32, + 0x33, 0x93, 0xb0, 0x1d, 0xcd, 0xde, 0x1b, 0x88, 0x89, 0x07, 0x50, 0x21, 0x1b, 0x50, 0x70, 0xda, + 0x1b, 0x33, 0x8f, 0xe7, 0xa1, 0xba, 0x56, 0x57, 0x6a, 0x72, 0x44, 0x71, 0x1f, 0xec, 0xea, 0x4a, + 0x0d, 0x19, 0x71, 0xe2, 0xc2, 0xa8, 0xd3, 0xde, 0x08, 0x67, 0x66, 0xf9, 0x9c, 0xcd, 0x8d, 0x49, + 0x6c, 0x3c, 0x58, 0xa9, 0x85, 0xc8, 0x59, 0xd8, 0x5f, 0x1c, 0xd1, 0xb7, 0x44, 0xfa, 0x7d, 0x80, + 0xb7, 0xcc, 0x09, 0x24, 0x8e, 0x3b, 0x77, 0x72, 0x9b, 0x40, 0x52, 0xbd, 0x38, 0x33, 0x70, 0xfa, + 0x74, 0xf5, 0x92, 0x91, 0x4b, 0x7a, 0xbf, 0xe4, 0xdb, 0x07, 0xe2, 0xf4, 0x9c, 0x5c, 0x30, 0xec, + 0x2f, 0x55, 0xb4, 0x15, 0x34, 0xe5, 0x26, 0x18, 0x40, 0xd1, 0x0d, 0x23, 0xd7, 0xcf, 0x31, 0x9b, + 0x42, 0xea, 0xd1, 0x00, 0x1e, 0xac, 0xc5, 0x01, 0x28, 0x58, 0x31, 0x9e, 0x5e, 0xcb, 0xf5, 0x1e, + 0xca, 0xcf, 0x7f, 0x2d, 0x77, 0x27, 0x37, 0xc1, 0x93, 0x03, 0x50, 0xb0, 0x22, 0xf7, 0xc5, 0xa0, + 0x2e, 0xe4, 0xd1, 0xd7, 0xd5, 0x95, 0x5a, 0x8a, 0x5f, 0x72, 0x70, 0xdf, 0x87, 0x42, 0xd8, 0x71, + 0xa5, 0xba, 0x34, 0x24, 0xaf, 0xfa, 0xea, 0x72, 0x16, 0xaf, 0xfa, 0xea, 0x32, 0x32, 0x26, 0xfc, + 0xaa, 0xdf, 0xe9, 0x6c, 0x38, 0x61, 0xe8, 0x34, 0xb5, 0x75, 0x66, 0xc8, 0xab, 0xfe, 0xaa, 0xa6, + 0x97, 0x62, 0xcd, 0xaf, 0xfa, 0x63, 0x28, 0x1a, 0x9c, 0xc9, 0x9b, 0x30, 0xee, 0x88, 0x87, 0x67, + 0x65, 0xc0, 0x48, 0x3e, 0xaf, 0x29, 0xa7, 0x24, 0xe0, 0x66, 0x1a, 0x09, 0x42, 0xc5, 0x90, 0xf1, + 0x8e, 0x02, 0x87, 0x6e, 0xba, 0xdb, 0xd2, 0x38, 0x54, 0x1f, 0xfa, 0x69, 0x24, 0x46, 0x2c, 0x8b, + 0xb7, 0x04, 0xa1, 0x62, 0x48, 0xbe, 0x62, 0xc1, 0x99, 0x8e, 0xe3, 0x39, 0x3a, 0x20, 0x39, 0x9f, + 0xb0, 0x75, 0x33, 0xc4, 0x39, 0xd6, 0x10, 0x57, 0x4d, 0x46, 0x98, 0xe4, 0x4b, 0x76, 0x60, 0xcc, + 0xe1, 0x4f, 0x62, 0xcb, 0xa3, 0x18, 0xe6, 0xf1, 0xbc, 0x76, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x1f, + 0xde, 0x96, 0xdc, 0xc8, 0x6f, 0x5a, 0x30, 0x2e, 0x62, 0x19, 0x98, 0x42, 0xca, 0xbe, 0xfd, 0xb3, + 0xa7, 0xf0, 0xf8, 0x88, 0x8c, 0xb3, 0x90, 0xce, 0x59, 0x1f, 0xd2, 0xbe, 0xd5, 0xa2, 0xf4, 0xc0, + 0x48, 0x0b, 0x25, 0x1d, 0x53, 0x7d, 0x3b, 0xce, 0xc3, 0xc4, 0xc3, 0x57, 0xa6, 0xea, 0xbb, 0x9a, + 0x82, 0x61, 0x1f, 0xf6, 0xec, 0xc7, 0x61, 0xc2, 0x94, 0xe3, 0x58, 0xd1, 0x1a, 0x3f, 0x2e, 0x00, + 0xf0, 0xae, 0x12, 0x49, 0x8c, 0x3a, 0x3c, 0xd7, 0xfa, 0x96, 0xdf, 0xcc, 0xe9, 0x01, 0x5e, 0x23, + 0x17, 0x11, 0xc8, 0xc4, 0xea, 0x5b, 0x7e, 0x13, 0x25, 0x13, 0xd2, 0x82, 0xd1, 0xae, 0x13, 0x6d, + 0xe5, 0x9f, 0xf8, 0xa8, 0x24, 0xa2, 0xf9, 0xa3, 0x2d, 0xe4, 0x0c, 0xc8, 0xdb, 0x56, 0xec, 0xf7, + 0x54, 0xc8, 0x23, 0x5d, 0x74, 0xdc, 0x66, 0xf3, 0xd2, 0xd3, 0x29, 0x95, 0x35, 0x39, 0xed, 0xff, + 0x34, 0xfb, 0x8e, 0x05, 0x13, 0x26, 0x6a, 0x46, 0x37, 0xfd, 0xbc, 0xd9, 0x4d, 0x79, 0xb6, 0x87, + 0xd9, 0xe3, 0xff, 0xdd, 0x02, 0xc0, 0x9e, 0x57, 0xef, 0x75, 0x3a, 0x4c, 0x6d, 0xd7, 0x41, 0x29, + 0xd6, 0x91, 0x83, 0x52, 0x46, 0x8e, 0x19, 0x94, 0x52, 0x38, 0x56, 0x50, 0xca, 0xe8, 0xf1, 0x83, + 0x52, 0x8a, 0x83, 0x83, 0x52, 0xec, 0x6f, 0x5a, 0x70, 0xb6, 0x6f, 0xbf, 0x62, 0x9a, 0x74, 0xe0, + 0xfb, 0xd1, 0x00, 0xff, 0x59, 0x8c, 0x41, 0x68, 0xe2, 0x91, 0x25, 0x98, 0x96, 0x2f, 0x0b, 0xd5, + 0xbb, 0x6d, 0x37, 0x33, 0x29, 0xd5, 0x7a, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0x7f, 0x65, 0x41, 0xc5, + 0x48, 0x65, 0xc1, 0x7d, 0xce, 0xf8, 0x8d, 0x57, 0xda, 0xe7, 0x8c, 0x5f, 0x75, 0x09, 0x98, 0xb8, + 0x86, 0x6e, 0x19, 0xef, 0x4e, 0xc4, 0xd7, 0xd0, 0xac, 0x14, 0x25, 0x54, 0xbc, 0x28, 0x20, 0x9d, + 0xcf, 0x0a, 0xe6, 0x8b, 0x02, 0xb4, 0x2b, 0x5c, 0xcd, 0x62, 0x17, 0xb7, 0xd1, 0xc3, 0x5d, 0xdc, + 0x8a, 0xd9, 0x2e, 0x6e, 0xf6, 0x1d, 0x98, 0x10, 0xbe, 0xe1, 0xaf, 0xd2, 0xdd, 0x23, 0xbf, 0x60, + 0xcd, 0x46, 0x7b, 0xca, 0x67, 0x8e, 0x55, 0x67, 0xe5, 0xb6, 0x03, 0x71, 0x7a, 0xed, 0x23, 0x50, + 0xbb, 0x06, 0xa0, 0x13, 0xfd, 0x0b, 0x47, 0xbc, 0x52, 0x3c, 0x20, 0xf5, 0x6b, 0x00, 0x4d, 0x34, + 0xb0, 0xec, 0x7f, 0x64, 0x41, 0xea, 0xe5, 0x34, 0xe3, 0x92, 0xc7, 0x1a, 0x78, 0xc9, 0x63, 0x5e, + 0x0c, 0x8c, 0x1c, 0x78, 0x31, 0x70, 0x0b, 0x48, 0x87, 0xcd, 0xb6, 0xe4, 0x5a, 0x5e, 0x48, 0x3e, + 0x30, 0xb3, 0xda, 0x87, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x28, 0x84, 0x35, 0xdf, 0x52, 0x3b, 0xbc, + 0x55, 0x7a, 0x50, 0xe4, 0xa4, 0xa4, 0x89, 0x6f, 0x48, 0xf3, 0x78, 0x7f, 0x8e, 0xbb, 0x78, 0xac, + 0xc8, 0x55, 0x85, 0x73, 0xb3, 0x7f, 0x4f, 0xc8, 0x6a, 0x3e, 0xb6, 0x76, 0xb8, 0xac, 0x9d, 0xa4, + 0xac, 0x37, 0xf3, 0x5a, 0x8e, 0xb3, 0x65, 0x24, 0xf3, 0x00, 0x5d, 0x1a, 0x34, 0xa8, 0x17, 0xa9, + 0x48, 0xbd, 0xa2, 0x8c, 0x19, 0xd7, 0xa5, 0x68, 0x60, 0xd8, 0xdf, 0x60, 0x73, 0x34, 0x7e, 0x3e, + 0x9e, 0x5c, 0x4d, 0xfb, 0x1a, 0xa7, 0xe7, 0x9f, 0x76, 0x35, 0x36, 0x42, 0xae, 0x46, 0x0e, 0x09, + 0xb9, 0x7a, 0x06, 0xc6, 0x03, 0xbf, 0x4d, 0xab, 0x81, 0x97, 0x76, 0x03, 0x42, 0x56, 0x8c, 0xb7, + 0x51, 0xc1, 0xed, 0x5f, 0xb7, 0x60, 0x3a, 0x1d, 0x60, 0x9a, 0xbb, 0x03, 0xb4, 0x99, 0x8f, 0xa3, + 0x70, 0xfc, 0x7c, 0x1c, 0xf6, 0x9f, 0x14, 0x61, 0x3a, 0xfd, 0xac, 0x25, 0xe3, 0xec, 0x72, 0x7b, + 0x5e, 0x6a, 0x83, 0x11, 0x86, 0x3c, 0x01, 0xd3, 0xe3, 0x65, 0x64, 0xe0, 0x78, 0xb9, 0x01, 0x65, + 0xbf, 0xab, 0x6c, 0x0a, 0x42, 0xb8, 0xab, 0xca, 0x1e, 0x74, 0x47, 0x01, 0xde, 0xdd, 0x9b, 0x3b, + 0x17, 0x0b, 0xa0, 0x8b, 0x31, 0xae, 0x4a, 0x7e, 0x46, 0x19, 0x43, 0x46, 0x13, 0x19, 0xae, 0xb4, + 0x31, 0x64, 0x2a, 0xae, 0x3f, 0xc8, 0x1e, 0x52, 0x3c, 0x4e, 0xa6, 0x9d, 0xb1, 0x1c, 0x33, 0xed, + 0xdc, 0x83, 0xb2, 0x34, 0xdf, 0x9e, 0x28, 0xc3, 0x0c, 0x27, 0x7c, 0x57, 0x11, 0xc0, 0x98, 0x56, + 0x2a, 0x85, 0x4f, 0x29, 0xd7, 0x14, 0x3e, 0x2f, 0xc1, 0xf8, 0x86, 0xd3, 0xd8, 0xf6, 0x37, 0x37, + 0xf9, 0x11, 0xa0, 0x5c, 0xfb, 0xa0, 0x6a, 0xb8, 0x9a, 0x28, 0xce, 0x18, 0x52, 0xaa, 0x06, 0x5b, + 0xe7, 0xa9, 0xf2, 0x78, 0x56, 0x96, 0x65, 0xbd, 0xce, 0x6b, 0x5f, 0xe8, 0x10, 0x0d, 0x2c, 0xf2, + 0x2c, 0x94, 0x9a, 0x6e, 0x28, 0x1e, 0x5e, 0xaf, 0x24, 0x1d, 0xe2, 0x97, 0x64, 0x39, 0x6a, 0x0c, + 0xf2, 0xb2, 0x76, 0x88, 0x9b, 0x88, 0x63, 0x55, 0xb4, 0x33, 0xdc, 0x01, 0xb1, 0x2a, 0xd2, 0xdf, + 0xf7, 0x6d, 0x36, 0x31, 0x23, 0xb7, 0xb1, 0xed, 0x7a, 0x22, 0x6d, 0x0b, 0x5b, 0x2d, 0x9e, 0x81, + 0x71, 0x2a, 0x9f, 0x7e, 0x17, 0xb7, 0x33, 0x7a, 0xb0, 0xa8, 0x17, 0xdf, 0x15, 0x9c, 0x54, 0x61, + 0x4a, 0xdd, 0x49, 0xab, 0x2b, 0x35, 0x91, 0x6e, 0x4a, 0x9b, 0xf0, 0x97, 0x92, 0x60, 0x4c, 0xe3, + 0xdb, 0x5f, 0x80, 0x8a, 0xa1, 0xeb, 0x71, 0xb5, 0xe8, 0xa1, 0xd3, 0xe8, 0x73, 0x61, 0xbf, 0xce, + 0x0a, 0x51, 0xc0, 0xf8, 0xcd, 0x9f, 0x88, 0xbf, 0x4c, 0xa9, 0x13, 0x32, 0xea, 0x52, 0x42, 0x19, + 0xb1, 0x80, 0xb6, 0xe8, 0x43, 0xf5, 0xda, 0x8e, 0x22, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x16, + 0x4a, 0x2a, 0x29, 0x20, 0xcf, 0xac, 0xa5, 0x6e, 0xa5, 0xcc, 0xcc, 0x5a, 0x7e, 0x10, 0x21, 0x87, + 0xd8, 0xaf, 0x43, 0x49, 0xe5, 0x2e, 0x3c, 0x1c, 0x9b, 0x6d, 0xbf, 0xa1, 0xe7, 0xde, 0xf4, 0xc3, + 0x48, 0x25, 0x5c, 0x14, 0x17, 0xe7, 0xb7, 0x97, 0x79, 0x19, 0x6a, 0xa8, 0xfd, 0x13, 0x0b, 0x2a, + 0xeb, 0xeb, 0x2b, 0xda, 0x9e, 0x86, 0xf0, 0x58, 0x28, 0x5a, 0xa8, 0xba, 0x19, 0x51, 0xd3, 0x43, + 0x47, 0xac, 0x44, 0xb3, 0xfb, 0x7b, 0x73, 0x8f, 0xd5, 0x33, 0x31, 0x70, 0x40, 0x4d, 0xb2, 0x0c, + 0xe7, 0x4c, 0x88, 0x4c, 0x84, 0x23, 0xf5, 0x82, 0x8b, 0xfb, 0x6c, 0xf9, 0xe9, 0x07, 0x63, 0x56, + 0x9d, 0x34, 0x29, 0x15, 0x37, 0x5c, 0xc8, 0x26, 0xa5, 0x82, 0x86, 0xb3, 0xea, 0xd8, 0xcf, 0xc1, + 0x54, 0xca, 0x75, 0xe4, 0x08, 0x09, 0xc8, 0x7e, 0xa7, 0x00, 0x13, 0xa6, 0x07, 0xc1, 0x11, 0xf6, + 0xec, 0xa3, 0xab, 0x42, 0x19, 0xb7, 0xfe, 0x85, 0x63, 0xde, 0xfa, 0x9b, 0x6e, 0x16, 0xa3, 0xa7, + 0xeb, 0x66, 0x51, 0xcc, 0xc7, 0xcd, 0xc2, 0x70, 0x07, 0x1a, 0x7b, 0x74, 0xee, 0x40, 0xbf, 0x5d, + 0x84, 0xc9, 0x64, 0x46, 0xeb, 0x23, 0xf4, 0xe4, 0xb3, 0x7d, 0x3d, 0x79, 0xcc, 0x6b, 0xc6, 0xc2, + 0xb0, 0xd7, 0x8c, 0xa3, 0xc3, 0x5e, 0x33, 0x16, 0x4f, 0x70, 0xcd, 0xd8, 0x7f, 0x49, 0x38, 0x76, + 0xe4, 0x4b, 0xc2, 0x4f, 0xe8, 0x8d, 0x62, 0x3c, 0xe1, 0x59, 0x17, 0x6f, 0x16, 0x24, 0xd9, 0x0d, + 0x8b, 0x7e, 0x33, 0xd3, 0xe3, 0xbb, 0x74, 0x88, 0xfa, 0x10, 0x64, 0x3a, 0x3a, 0x1f, 0xdf, 0x93, + 0xe1, 0xb1, 0x63, 0x38, 0x39, 0xbf, 0x00, 0x15, 0x39, 0x9e, 0xf8, 0x99, 0x16, 0x92, 0xe7, 0xe1, + 0x7a, 0x0c, 0x42, 0x13, 0x8f, 0x0d, 0x8c, 0x6e, 0x3c, 0x41, 0xf8, 0x85, 0x77, 0x25, 0x79, 0xe1, + 0xbd, 0x96, 0x04, 0x63, 0x1a, 0xdf, 0xfe, 0x3c, 0x5c, 0xc8, 0xb4, 0x6c, 0xf2, 0x5b, 0x25, 0x7e, + 0x16, 0xa2, 0x4d, 0x89, 0x60, 0x88, 0x91, 0x7a, 0x62, 0x6b, 0xf6, 0xde, 0x40, 0x4c, 0x3c, 0x80, + 0x8a, 0xfd, 0x5b, 0x05, 0x98, 0x4c, 0x3e, 0x39, 0x4f, 0x1e, 0xe8, 0x7b, 0x90, 0x5c, 0xae, 0x60, + 0x04, 0x59, 0x23, 0x4b, 0xf2, 0xc0, 0xfb, 0xd3, 0x07, 0x7c, 0x7c, 0x6d, 0xe8, 0x94, 0xcd, 0xa7, + 0xc7, 0x58, 0x5e, 0x5c, 0x4a, 0x76, 0xfc, 0xe1, 0xf6, 0x38, 0xa5, 0x80, 0x34, 0x8f, 0xe5, 0xce, + 0x3d, 0x8e, 0xfe, 0xd6, 0xac, 0xd0, 0x60, 0xcb, 0xf6, 0x96, 0x1d, 0x1a, 0xb8, 0x9b, 0x2e, 0x6d, + 0xca, 0x17, 0x34, 0xf8, 0xca, 0xfd, 0xba, 0x2c, 0x43, 0x0d, 0xb5, 0xdf, 0x1e, 0x81, 0x32, 0xcf, + 0xff, 0x78, 0x23, 0xf0, 0x3b, 0xfc, 0x31, 0xe2, 0xd0, 0x30, 0x45, 0xc8, 0x6e, 0xbb, 0x95, 0xc7, + 0xeb, 0x5f, 0x82, 0xa2, 0x8c, 0x22, 0x31, 0x4a, 0x30, 0xc1, 0x91, 0x74, 0xa1, 0xb4, 0x29, 0xf3, + 0xd5, 0xcb, 0xbe, 0x1b, 0x32, 0xe7, 0xb2, 0xca, 0x7e, 0x2f, 0x9a, 0x40, 0xfd, 0x43, 0xcd, 0xc5, + 0x76, 0x60, 0x2a, 0x95, 0x36, 0x2b, 0xf7, 0x2c, 0xf7, 0xff, 0x73, 0x14, 0xca, 0x3a, 0xb8, 0x93, + 0x7c, 0x2c, 0x61, 0x17, 0x8e, 0x75, 0x78, 0x69, 0xd0, 0x65, 0xe7, 0x26, 0x8d, 0x9c, 0xb2, 0xf1, + 0x5e, 0x82, 0x42, 0x2f, 0x68, 0xa7, 0x0d, 0x3f, 0x77, 0x71, 0x05, 0x59, 0xb9, 0x19, 0x90, 0x5a, + 0x78, 0xb4, 0x01, 0xa9, 0x57, 0x60, 0x74, 0xc3, 0x6f, 0xee, 0xa6, 0x5f, 0xd6, 0xac, 0xf9, 0xcd, + 0x5d, 0xe4, 0x10, 0xf2, 0x32, 0x4c, 0xca, 0x28, 0x5b, 0xa5, 0xc4, 0x14, 0xb9, 0x9e, 0xaa, 0xfd, + 0x81, 0xd6, 0x13, 0x50, 0x4c, 0x61, 0xb3, 0x5d, 0x96, 0x1d, 0x1b, 0xf8, 0xdb, 0x05, 0x63, 0x49, + 0xe7, 0x81, 0x5b, 0xf5, 0x3b, 0xb7, 0xb9, 0x7d, 0x5a, 0x63, 0x24, 0x02, 0x79, 0xc7, 0x0f, 0x0d, + 0xe4, 0x5d, 0x12, 0xb4, 0x99, 0xb4, 0x7c, 0x47, 0x99, 0xa8, 0x5d, 0x55, 0x74, 0x59, 0xd9, 0x81, + 0x67, 0x17, 0x5d, 0x33, 0x2b, 0xe4, 0xb9, 0xfc, 0xde, 0x85, 0x3c, 0xdb, 0x77, 0x61, 0x2a, 0xd5, + 0x7f, 0xca, 0x6e, 0x68, 0x65, 0xdb, 0x0d, 0x8f, 0xf6, 0x36, 0xe7, 0x3f, 0xb3, 0xe0, 0x6c, 0xdf, + 0x8a, 0x74, 0xd4, 0xd8, 0xf3, 0xf4, 0xde, 0x38, 0x72, 0xf2, 0xbd, 0xb1, 0x70, 0xbc, 0xbd, 0xb1, + 0xb6, 0xf1, 0xbd, 0x1f, 0x5d, 0xfe, 0xc0, 0x0f, 0x7e, 0x74, 0xf9, 0x03, 0xbf, 0xff, 0xa3, 0xcb, + 0x1f, 0x78, 0x7b, 0xff, 0xb2, 0xf5, 0xbd, 0xfd, 0xcb, 0xd6, 0x0f, 0xf6, 0x2f, 0x5b, 0xbf, 0xbf, + 0x7f, 0xd9, 0xfa, 0x2f, 0xfb, 0x97, 0xad, 0x6f, 0xfe, 0xd1, 0xe5, 0x0f, 0x7c, 0xea, 0x13, 0x71, + 0x4f, 0x2d, 0xa8, 0x9e, 0xe2, 0x3f, 0x3e, 0xac, 0xfa, 0x65, 0xa1, 0xbb, 0xdd, 0x5a, 0x60, 0x3d, + 0xb5, 0xa0, 0x4b, 0x54, 0x4f, 0xfd, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x12, 0x87, 0x61, 0xb2, + 0x65, 0xaf, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7454,6 +7457,18 @@ func (m *Metric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ConsecutiveSuccessLimit != nil { + { + size, err := m.ConsecutiveSuccessLimit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } { size, err := m.Provider.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -7741,6 +7756,9 @@ func (m *MetricResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.ConsecutiveSuccess)) + i-- + dAtA[i] = 0x68 if len(m.Metadata) > 0 { keysForMetadata := make([]string, 0, len(m.Metadata)) for k := range m.Metadata { @@ -12134,6 +12152,10 @@ func (m *Metric) Size() (n int) { } l = m.Provider.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.ConsecutiveSuccessLimit != nil { + l = m.ConsecutiveSuccessLimit.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12235,6 +12257,7 @@ func (m *MetricResult) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + n += 1 + sovGenerated(uint64(m.ConsecutiveSuccess)) return n } @@ -14323,6 +14346,7 @@ func (this *Metric) String() string { `InconclusiveLimit:` + strings.Replace(fmt.Sprintf("%v", this.InconclusiveLimit), "IntOrString", "intstr.IntOrString", 1) + `,`, `ConsecutiveErrorLimit:` + strings.Replace(fmt.Sprintf("%v", this.ConsecutiveErrorLimit), "IntOrString", "intstr.IntOrString", 1) + `,`, `Provider:` + strings.Replace(strings.Replace(this.Provider.String(), "MetricProvider", "MetricProvider", 1), `&`, ``, 1) + `,`, + `ConsecutiveSuccessLimit:` + strings.Replace(fmt.Sprintf("%v", this.ConsecutiveSuccessLimit), "IntOrString", "intstr.IntOrString", 1) + `,`, `}`, }, "") return s @@ -14390,6 +14414,7 @@ func (this *MetricResult) String() string { `ConsecutiveError:` + fmt.Sprintf("%v", this.ConsecutiveError) + `,`, `DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`, `Metadata:` + mapStringForMetadata + `,`, + `ConsecutiveSuccess:` + fmt.Sprintf("%v", this.ConsecutiveSuccess) + `,`, `}`, }, "") return s @@ -26145,6 +26170,42 @@ func (m *Metric) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsecutiveSuccessLimit", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsecutiveSuccessLimit == nil { + m.ConsecutiveSuccessLimit = &intstr.IntOrString{} + } + if err := m.ConsecutiveSuccessLimit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -27160,6 +27221,25 @@ func (m *MetricResult) Unmarshal(dAtA []byte) error { } m.Metadata[mapkey] = mapvalue iNdEx = postIndex + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsecutiveSuccess", wireType) + } + m.ConsecutiveSuccess = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ConsecutiveSuccess |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 832258d4b9..489548d836 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1014,6 +1014,7 @@ message Metric { // FailureLimit is the maximum number of times the measurement is allowed to fail, before the // entire metric is considered Failed (default: 0) + // -1 for making it disabled (when opting to use ConsecutiveSuccessLimit solely) optional k8s.io.apimachinery.pkg.util.intstr.IntOrString failureLimit = 7; // InconclusiveLimit is the maximum number of times the measurement is allowed to measure @@ -1026,6 +1027,10 @@ message Metric { // Provider configuration to the external system to use to verify the analysis optional MetricProvider provider = 10; + + // ConsecutiveSuccessLimit is the number of consecutive times the measurement must succeed for the + // entire metric to be considered Successful (default: 0, which means it's disabled) + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString consecutiveSuccessLimit = 11; } // MetricProvider which external system to use to verify the analysis @@ -1113,6 +1118,10 @@ message MetricResult { // the final state which gets used while taking measurements. For example, Prometheus uses this field // to store the final resolved query after substituting the template arguments. map metadata = 12; + + // ConsecutiveSuccess is the number of times a measurement was successful in succession + // Resets to zero when failures, inconclusive measurements, or errors are encountered + optional int32 consecutiveSuccess = 13; } // NewRelicMetric defines the newrelic query to perform canary analysis diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 69b7cd50a2..2f60871c4b 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3063,7 +3063,7 @@ func schema_pkg_apis_rollouts_v1alpha1_Metric(ref common.ReferenceCallback) comm }, "failureLimit": { SchemaProps: spec.SchemaProps{ - Description: "FailureLimit is the maximum number of times the measurement is allowed to fail, before the entire metric is considered Failed (default: 0)", + Description: "FailureLimit is the maximum number of times the measurement is allowed to fail, before the entire metric is considered Failed (default: 0) -1 for making it disabled (when opting to use ConsecutiveSuccessLimit solely)", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, @@ -3086,6 +3086,12 @@ func schema_pkg_apis_rollouts_v1alpha1_Metric(ref common.ReferenceCallback) comm Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MetricProvider"), }, }, + "consecutiveSuccessLimit": { + SchemaProps: spec.SchemaProps{ + Description: "ConsecutiveSuccessLimit is the number of consecutive times the measurement must succeed for the entire metric to be considered Successful (default: 0, which means it's disabled)", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, }, Required: []string{"name", "provider"}, }, @@ -3300,6 +3306,13 @@ func schema_pkg_apis_rollouts_v1alpha1_MetricResult(ref common.ReferenceCallback }, }, }, + "consecutiveSuccess": { + SchemaProps: spec.SchemaProps{ + Description: "ConsecutiveSuccess is the number of times a measurement was successful in succession Resets to zero when failures, inconclusive measurements, or errors are encountered", + Type: []string{"integer"}, + Format: "int32", + }, + }, }, Required: []string{"name", "phase"}, }, diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 5229bb83f8..44cfd72188 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1701,6 +1701,11 @@ func (in *Metric) DeepCopyInto(out *Metric) { **out = **in } in.Provider.DeepCopyInto(&out.Provider) + if in.ConsecutiveSuccessLimit != nil { + in, out := &in.ConsecutiveSuccessLimit, &out.ConsecutiveSuccessLimit + *out = new(intstr.IntOrString) + **out = **in + } return } diff --git a/pkg/apis/rollouts/validation/validation_references.go b/pkg/apis/rollouts/validation/validation_references.go index 9079536c20..f51df2925d 100644 --- a/pkg/apis/rollouts/validation/validation_references.go +++ b/pkg/apis/rollouts/validation/validation_references.go @@ -1,6 +1,7 @@ package validation import ( + "errors" "fmt" appsv1 "k8s.io/api/apps/v1" @@ -342,11 +343,11 @@ func ValidateRolloutVirtualServicesConfig(r *v1alpha1.Rollout) error { if canary.TrafficRouting != nil && canary.TrafficRouting.Istio != nil { if istioutil.MultipleVirtualServiceConfigured(r) { if r.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService != nil { - return field.InternalError(fldPath, fmt.Errorf(errorString)) + return field.InternalError(fldPath, errors.New(errorString)) } } else { if r.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService == nil { - return field.InternalError(fldPath, fmt.Errorf(errorString)) + return field.InternalError(fldPath, errors.New(errorString)) } } } diff --git a/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go b/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go index 962b4d6ce4..4b4ec6b302 100644 --- a/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go +++ b/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go @@ -84,7 +84,7 @@ func (o *ListOptions) PrintExperimentTable(expList *v1alpha1.ExperimentList) err headerStr = "NAMESPACE\t" + headerStr fmtStr = "%-9s\t" + fmtStr } - fmt.Fprintf(w, headerStr) + fmt.Fprint(w, headerStr) for _, exp := range expList.Items { age := duration.HumanDuration(timeutil.MetaNow().Sub(exp.CreationTimestamp.Time)) dur := "-" diff --git a/pkg/kubectl-argo-rollouts/cmd/list/list_rollouts.go b/pkg/kubectl-argo-rollouts/cmd/list/list_rollouts.go index c233776c6d..16dcc68c75 100644 --- a/pkg/kubectl-argo-rollouts/cmd/list/list_rollouts.go +++ b/pkg/kubectl-argo-rollouts/cmd/list/list_rollouts.go @@ -93,7 +93,7 @@ func (o *ListOptions) PrintRolloutTable(roList *v1alpha1.RolloutList) error { if o.timestamps { headerStr = "TIMESTAMP\t" + headerStr } - fmt.Fprintf(w, headerStr) + fmt.Fprint(w, headerStr) for _, ro := range roList.Items { roLine := newRolloutInfo(ro) fmt.Fprintln(w, roLine.String(o.timestamps, o.allNamespaces)) diff --git a/pkg/kubectl-argo-rollouts/cmd/undo/undo.go b/pkg/kubectl-argo-rollouts/cmd/undo/undo.go index be9d0289d7..1f3fb186b1 100644 --- a/pkg/kubectl-argo-rollouts/cmd/undo/undo.go +++ b/pkg/kubectl-argo-rollouts/cmd/undo/undo.go @@ -58,7 +58,7 @@ func NewCmdUndo(o *options.ArgoRolloutsOptions) *cobra.Command { if err != nil { return err } - fmt.Fprintf(o.Out, result) + fmt.Fprint(o.Out, result) return nil }, ValidArgsFunction: completionutil.RolloutNameCompletionFunc(o), diff --git a/rollout/canary_test.go b/rollout/canary_test.go index ad3d9b4267..ddcfe1ec1e 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -3,16 +3,10 @@ package rollout import ( "encoding/json" "fmt" - "os" "strconv" "testing" "time" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - k8stesting "k8s.io/client-go/testing" - "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" @@ -2117,106 +2111,3 @@ func TestIsDynamicallyRollingBackToStable(t *testing.T) { }) } } - -func TestSyncRolloutWithConflictInScaleReplicaSet(t *testing.T) { - os.Setenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT", "true") - defer os.Unsetenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") - - f := newFixture(t) - defer f.Close() - - steps := []v1alpha1.CanaryStep{ - { - SetWeight: int32Ptr(10), - }, { - Pause: &v1alpha1.RolloutPause{ - Duration: v1alpha1.DurationFromInt(10), - }, - }, - } - r1 := newCanaryRollout("foo", 10, nil, steps, int32Ptr(1), intstr.FromInt(1), intstr.FromInt(0)) - r1.Spec.Template.Labels["rollout.argoproj.io/foo"] = "bar" - - rs1 := newReplicaSetWithStatus(r1, 10, 10) - r1.Spec.Replicas = pointer.Int32(2) - f.kubeobjects = append(f.kubeobjects, rs1) - f.replicaSetLister = append(f.replicaSetLister, rs1) - - f.rolloutLister = append(f.rolloutLister, r1) - f.objects = append(f.objects, r1) - - f.expectPatchRolloutAction(r1) - f.expectUpdateReplicaSetAction(rs1) // attempt to scale replicaset but conflict - patchIndex := f.expectPatchReplicaSetAction(rs1) // instead of update patch replicaset - - key := fmt.Sprintf("%s/%s", r1.Namespace, r1.Name) - c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) - - f.kubeclient.PrependReactor("update", "replicasets", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, action.(k8stesting.UpdateAction).GetObject(), errors.NewConflict(schema.GroupResource{ - Group: "Apps", - Resource: "ReplicaSet", - }, action.(k8stesting.UpdateAction).GetObject().(*appsv1.ReplicaSet).Name, fmt.Errorf("test error")) - }) - - f.runController(key, true, false, c, i, k8sI) - - updatedRs := f.getPatchedReplicaSet(patchIndex) // minus one because update did not happen because conflict - assert.Equal(t, int32(2), *updatedRs.Spec.Replicas) -} - -func TestSyncRolloutWithConflictInSyncReplicaSetRevision(t *testing.T) { - os.Setenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT", "true") - defer os.Unsetenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") - - f := newFixture(t) - defer f.Close() - - steps := []v1alpha1.CanaryStep{ - { - SetWeight: int32Ptr(10), - }, { - Pause: &v1alpha1.RolloutPause{ - Duration: v1alpha1.DurationFromInt(10), - }, - }, - } - r1 := newCanaryRollout("foo", 3, nil, steps, int32Ptr(1), intstr.FromInt(1), intstr.FromInt(0)) - r2 := bumpVersion(r1) - - rs1 := newReplicaSetWithStatus(r1, 3, 3) - rs2 := newReplicaSetWithStatus(r2, 3, 3) - rs2.Annotations["rollout.argoproj.io/revision"] = "1" - - f.kubeobjects = append(f.kubeobjects, rs1, rs2) - f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) - - f.rolloutLister = append(f.rolloutLister, r2) - f.objects = append(f.objects, r2) - - key := fmt.Sprintf("%s/%s", r1.Namespace, r1.Name) - c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) - - f.kubeclient.PrependReactor("update", "replicasets", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, &appsv1.ReplicaSet{}, errors.NewConflict(schema.GroupResource{ - Group: "Apps", - Resource: "ReplicaSet", - }, action.(k8stesting.UpdateAction).GetObject().(*appsv1.ReplicaSet).Name, fmt.Errorf("test error")) - }) - - f.expectPatchRolloutAction(r2) - f.expectUpdateReplicaSetAction(rs1) // attempt to update replicaset revision but conflict - patchIndex1 := f.expectPatchReplicaSetAction(rs1) // instead of update patch replicaset - - f.expectUpdateReplicaSetAction(rs2) // attempt to scale replicaset but conflict - patchIndex2 := f.expectPatchReplicaSetAction(rs2) // instead of update patch replicaset - - f.runController(key, true, false, c, i, k8sI) - - updatedRs1 := f.getPatchedReplicaSet(patchIndex1) - assert.Equal(t, "2", updatedRs1.Annotations["rollout.argoproj.io/revision"]) - assert.Equal(t, int32(3), *updatedRs1.Spec.Replicas) - - updatedRs2 := f.getPatchedReplicaSet(patchIndex2) - assert.Equal(t, int32(0), *updatedRs2.Spec.Replicas) -} diff --git a/rollout/controller.go b/rollout/controller.go index 7801610239..5ece9c4302 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -4,16 +4,11 @@ import ( "context" "encoding/json" "fmt" - "os" "reflect" "strconv" - "strings" "sync" "time" - "github.com/argoproj/argo-rollouts/utils/annotations" - - "github.com/argoproj/argo-rollouts/utils/diff" "k8s.io/apimachinery/pkg/runtime/schema" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts" @@ -21,13 +16,11 @@ import ( log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" k8serrors "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/types" - patchtypes "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/dynamic" @@ -439,14 +432,30 @@ func (c *Controller) syncHandler(ctx context.Context, key string) error { }() resolveErr := c.refResolver.Resolve(r) + // We could maybe lose setting the error condition from the below if resolveErr != nil {}, and just log the error to clean up the logic roCtx, err := c.newRolloutContext(r) + if roCtx == nil { + logCtx.Error("newRolloutContext returned nil") + return err + } if err != nil { + if _, ok := err.(*field.Error); ok { + // We want to frequently requeue rollouts with InvalidSpec errors, because the error + // condition might be timing related (e.g. the Rollout was applied before the Service). + c.enqueueRolloutAfter(roCtx.rollout, 20*time.Second) + return nil // do not requeue from error because we already re-queued above + } logCtx.Errorf("newRolloutContext err %v", err) return err } + // We should probably delete this if block and just log the error to clean up the logic, a bigger change would be to add a new + // field to the status maybe (reconcileErrMsg) and store the errors there from the processNextWorkItem function in controller/controller.go if resolveErr != nil { - roCtx.createInvalidRolloutCondition(resolveErr, r) - return resolveErr + err := roCtx.createInvalidRolloutCondition(resolveErr, r) + if err != nil { + return fmt.Errorf("failed to create invalid rollout condition during resolving the rollout: %w", err) + } + return fmt.Errorf("failed to resolve rollout: %w", resolveErr) } // In order to work with HPA, the rollout.Spec.Replica field cannot be nil. As a result, the controller will update @@ -575,9 +584,6 @@ func (c *Controller) newRolloutContext(rollout *v1alpha1.Rollout) (*rolloutConte err = roCtx.getRolloutValidationErrors() if err != nil { if vErr, ok := err.(*field.Error); ok { - // We want to frequently requeue rollouts with InvalidSpec errors, because the error - // condition might be timing related (e.g. the Rollout was applied before the Service). - c.enqueueRolloutAfter(roCtx.rollout, 20*time.Second) err := roCtx.createInvalidRolloutCondition(vErr, roCtx.rollout) if err != nil { return nil, err @@ -596,10 +602,6 @@ func (c *Controller) newRolloutContext(rollout *v1alpha1.Rollout) (*rolloutConte roCtx.stableRS = replicasetutil.GetStableRS(roCtx.rollout, roCtx.newRS, roCtx.olderRSs) roCtx.otherRSs = replicasetutil.GetOtherRSs(roCtx.rollout, roCtx.newRS, roCtx.stableRS, rsList) roCtx.allRSs = append(rsList, roCtx.newRS) - err := roCtx.replicaSetInformer.GetIndexer().Add(roCtx.newRS) - if err != nil { - return nil, err - } } if rolloututil.IsFullyPromoted(rollout) && roCtx.pauseContext.IsAborted() { @@ -1018,91 +1020,14 @@ func remarshalRollout(r *v1alpha1.Rollout) *v1alpha1.Rollout { return &remarshalled } -// updateReplicaSetWithPatch updates the replicaset using Update and on failure falls back to a patch this function only exists to make sure we always can update -// replicasets and to not get into an conflict loop updating replicasets. We should really look into a complete refactor of how rollouts handles replicasets such -// that we do not keep a fully replicaset on the rollout context under newRS and instead switch to a patch only based approach. -func (c *rolloutContext) updateReplicaSetFallbackToPatch(ctx context.Context, rs *appsv1.ReplicaSet) (*appsv1.ReplicaSet, error) { +// updateReplicaSet updates the replicaset using kubeclient update. It returns the updated replicaset and copies the updated replicaset +// into the passed in pointer as well. +func (c *rolloutContext) updateReplicaSet(ctx context.Context, rs *appsv1.ReplicaSet) (*appsv1.ReplicaSet, error) { updatedRS, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Update(ctx, rs, metav1.UpdateOptions{}) if err != nil { - if errors.IsConflict(err) { - if os.Getenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") == "true" { - rsGet, err := c.replicaSetLister.ReplicaSets(rs.Namespace).Get(rs.Name) - if err != nil { - return nil, fmt.Errorf("error getting replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - rsGetJson, err := json.Marshal(rsGet) - if err != nil { - return nil, fmt.Errorf("error marshalling informer replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - rsCopyJson, err := json.Marshal(rs) - if err != nil { - return nil, fmt.Errorf("error marshalling memory replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - c.log.Infof("Informer RS: %s", rsGetJson) - c.log.Infof("Memory RS: %s", rsCopyJson) - } - - c.log.Infof("Conflict when updating replicaset %s, falling back to patch", rs.Name) - - patchRS := appsv1.ReplicaSet{} - patchRS.Spec.Replicas = rs.Spec.Replicas - patchRS.Spec.Template.Labels = rs.Spec.Template.Labels - patchRS.Spec.Template.Annotations = rs.Spec.Template.Annotations - - patchRS.Annotations = make(map[string]string) - patchRS.Labels = make(map[string]string) - patchRS.Spec.Selector = &metav1.LabelSelector{ - MatchLabels: make(map[string]string), - } - - if _, found := rs.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]; found { - patchRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] = rs.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] - } - - if _, found := rs.Annotations[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey]; found { - patchRS.Annotations[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey] = rs.Annotations[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey] - } - - if _, found := rs.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey]; found { - patchRS.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey] = rs.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey] - } - - for key, value := range rs.Annotations { - if strings.HasPrefix(key, annotations.RolloutLabel) || - strings.HasPrefix(key, "argo-rollouts.argoproj.io") || - strings.HasPrefix(key, "experiment.argoproj.io") { - patchRS.Annotations[key] = value - } - } - for key, value := range rs.Labels { - if strings.HasPrefix(key, annotations.RolloutLabel) || - strings.HasPrefix(key, "argo-rollouts.argoproj.io") || - strings.HasPrefix(key, "experiment.argoproj.io") { - patchRS.Labels[key] = value - } - } - - patch, _, err := diff.CreateTwoWayMergePatch(appsv1.ReplicaSet{}, patchRS, appsv1.ReplicaSet{}) - if err != nil { - return nil, fmt.Errorf("error creating patch for conflict log in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - - c.log.Infof("Patching replicaset with patch: %s", string(patch)) - updatedRS, err = c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.StrategicMergePatchType, patch, metav1.PatchOptions{}) - if err != nil { - return nil, fmt.Errorf("error patching replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - - err = c.replicaSetInformer.GetIndexer().Update(updatedRS) - if err != nil { - return nil, fmt.Errorf("error updating replicaset informer in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) - } - - return updatedRS, err - } - } - if updatedRS != nil { - updatedRS.DeepCopyInto(rs) + return nil, fmt.Errorf("error updating replicaset in updateReplicaSet %s: %w", rs.Name, err) } + updatedRS.DeepCopyInto(rs) + return rs, err } diff --git a/rollout/controller_test.go b/rollout/controller_test.go index 2e848212fa..383a539bd0 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -960,7 +960,7 @@ func (f *fixture) getUpdatedReplicaSet(index int) *appsv1.ReplicaSet { return rs } -func (f *fixture) getPatchedReplicaSet(index int) *appsv1.ReplicaSet { +func (f *fixture) getPatchedReplicaSet(index int) *appsv1.ReplicaSet { //nolint action := filterInformerActions(f.kubeclient.Actions())[index] patchAction, ok := action.(core.PatchAction) if !ok { diff --git a/rollout/ephemeralmetadata.go b/rollout/ephemeralmetadata.go index 4f502a78ab..c3b9d27a6b 100644 --- a/rollout/ephemeralmetadata.go +++ b/rollout/ephemeralmetadata.go @@ -63,12 +63,27 @@ func (c *rolloutContext) syncEphemeralMetadata(ctx context.Context, rs *appsv1.R if !modified { return nil } - // 1. Sync ephemeral metadata to pods + + // Used to access old ephemeral data when updating pods below + originalRSCopy := rs.DeepCopy() + + // Order of the following two steps is important for race condition + // First update replicasets, then pods owned by it. + // So that any replicas created in the interim between the two steps are using the new updated version. + // 1. Update ReplicaSet so that any new pods it creates will have the metadata + rs, err := c.updateReplicaSet(ctx, modifiedRS) + if err != nil { + c.log.Infof("failed to sync ephemeral metadata %v to ReplicaSet %s: %v", podMetadata, rs.Name, err) + return fmt.Errorf("failed to sync ephemeral metadata: %w", err) + } + c.log.Infof("synced ephemeral metadata %v to ReplicaSet %s", podMetadata, rs.Name) + + // 2. Sync ephemeral metadata to pods pods, err := replicasetutil.GetPodsOwnedByReplicaSet(ctx, c.kubeclientset, rs) if err != nil { return err } - existingPodMetadata := replicasetutil.ParseExistingPodMetadata(rs) + existingPodMetadata := replicasetutil.ParseExistingPodMetadata(originalRSCopy) for _, pod := range pods { newPodObjectMeta, podModified := replicasetutil.SyncEphemeralPodMetadata(&pod.ObjectMeta, existingPodMetadata, podMetadata) if podModified { @@ -81,13 +96,5 @@ func (c *rolloutContext) syncEphemeralMetadata(ctx context.Context, rs *appsv1.R } } - // 2. Update ReplicaSet so that any new pods it creates will have the metadata - rs, err = c.updateReplicaSetFallbackToPatch(ctx, modifiedRS) - if err != nil { - c.log.Infof("failed to sync ephemeral metadata %v to ReplicaSet %s: %v", podMetadata, rs.Name, err) - return fmt.Errorf("failed to sync ephemeral metadata: %w", err) - } - - c.log.Infof("synced ephemeral metadata %v to ReplicaSet %s", podMetadata, rs.Name) return nil } diff --git a/rollout/ephemeralmetadata_test.go b/rollout/ephemeralmetadata_test.go index 8241a1831c..7c1af82da2 100644 --- a/rollout/ephemeralmetadata_test.go +++ b/rollout/ephemeralmetadata_test.go @@ -133,9 +133,9 @@ func TestSyncCanaryEphemeralMetadataSecondRevision(t *testing.T) { f.expectUpdateRolloutStatusAction(r2) // Update Rollout conditions rs2idx := f.expectCreateReplicaSetAction(rs2) // Create revision 2 ReplicaSet + rs1idx := f.expectUpdateReplicaSetAction(rs1) // update stable replicaset with stable metadata f.expectListPodAction(r1.Namespace) // list pods to patch ephemeral data on revision 1 ReplicaSets pods podIdx := f.expectUpdatePodAction(&pod) // Update pod with ephemeral data - rs1idx := f.expectUpdateReplicaSetAction(rs1) // update stable replicaset with stable metadata f.expectUpdateReplicaSetAction(rs1) // scale revision 1 ReplicaSet down f.expectPatchRolloutAction(r2) // Patch Rollout status @@ -213,9 +213,9 @@ func TestSyncBlueGreenEphemeralMetadataSecondRevision(t *testing.T) { rs2idx := f.expectCreateReplicaSetAction(rs2) // Create revision 2 ReplicaSet f.expectPatchServiceAction(previewSvc, rs2PodHash) // Update preview service to point at revision 2 replicaset f.expectUpdateReplicaSetAction(rs2) // scale revision 2 ReplicaSet up + rs1idx := f.expectUpdateReplicaSetAction(rs1) // update stable replicaset with stable metadata f.expectListPodAction(r1.Namespace) // list pods to patch ephemeral data on revision 1 ReplicaSets pods` podIdx := f.expectUpdatePodAction(&pod) // Update pod with ephemeral data - rs1idx := f.expectUpdateReplicaSetAction(rs1) // update stable replicaset with stable metadata f.expectPatchRolloutAction(r2) // Patch Rollout status f.run(getKey(r2, t)) diff --git a/rollout/replicaset.go b/rollout/replicaset.go index c16ce6f037..e374b98286 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -39,10 +39,6 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { return fmt.Errorf("error removing scale-down-deadline annotation from RS '%s': %w", rs.Name, err) } c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) - err = c.replicaSetInformer.GetIndexer().Update(rs) - if err != nil { - return fmt.Errorf("error updating replicaset informer in removeScaleDownDelay: %w", err) - } return err } @@ -68,10 +64,6 @@ func (c *rolloutContext) addScaleDownDelay(rs *appsv1.ReplicaSet, scaleDownDelay return fmt.Errorf("error adding scale-down-deadline annotation to RS '%s': %w", rs.Name, err) } c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) - err = c.replicaSetInformer.GetIndexer().Update(rs) - if err != nil { - return fmt.Errorf("error updating replicaset informer in addScaleDownDelay: %w", err) - } return err } diff --git a/rollout/restart_test.go b/rollout/restart_test.go index a6a20b4188..1ef873f36d 100644 --- a/rollout/restart_test.go +++ b/rollout/restart_test.go @@ -2,7 +2,7 @@ package rollout import ( "bytes" - "fmt" + "errors" "testing" "time" @@ -199,7 +199,7 @@ func TestRestartReconcile(t *testing.T) { } client.PrependReactor("create", "pods", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { // this is the pod eviction - return true, nil, fmt.Errorf(expectedErrMsg) + return true, nil, errors.New(expectedErrMsg) }) r := RolloutPodRestarter{ client: client, @@ -309,7 +309,7 @@ func TestRestartReplicaSetPod(t *testing.T) { client := fake.NewSimpleClientset() expectedErrMsg := "big bad error" client.PrependReactor("list", "pods", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, fmt.Errorf(expectedErrMsg) + return true, nil, errors.New(expectedErrMsg) }) r := RolloutPodRestarter{client: client} roCtx := &rolloutContext{ diff --git a/rollout/service_test.go b/rollout/service_test.go index 21e7401653..f31cd1bf3a 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -100,10 +100,8 @@ func TestGetPreviewAndActiveServices(t *testing.T) { noActiveSvcRollout := rollout.DeepCopy() noActiveSvcRollout.Spec.Strategy.BlueGreen.ActiveService = "" roCtx, err := c.newRolloutContext(noActiveSvcRollout) - assert.NoError(t, err) - _, _, err = roCtx.getPreviewAndActiveServices() - assert.NotNil(t, err) - assert.EqualError(t, err, "service \"\" not found") + assert.Error(t, err) + assert.Nil(t, roCtx) }) } diff --git a/rollout/sync.go b/rollout/sync.go index c0d394a74b..3a70878d8f 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -82,7 +82,7 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { rsCopy.Spec.MinReadySeconds = c.rollout.Spec.MinReadySeconds rsCopy.Spec.Template.Spec.Affinity = replicasetutil.GenerateReplicaSetAffinity(*c.rollout) - rs, err := c.updateReplicaSetFallbackToPatch(ctx, rsCopy) + rs, err := c.updateReplicaSet(ctx, rsCopy) if err != nil { return nil, fmt.Errorf("failed to update replicaset revision on %s: %w", rsCopy.Name, err) } @@ -372,13 +372,13 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, *(rsCopy.Spec.Replicas) = newScale annotations.SetReplicasAnnotations(rsCopy, rolloutReplicas) if fullScaleDown && !c.shouldDelayScaleDownOnAbort() { - // This bypasses the normal call to removeScaleDownDelay and then depends on the removal via an update in updateReplicaSetFallbackToPatch + // This bypasses the normal call to removeScaleDownDelay and then depends on the removal via an update in updateReplicaSet delete(rsCopy.Annotations, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) } - rs, err = c.updateReplicaSetFallbackToPatch(ctx, rsCopy) + rs, err = c.updateReplicaSet(ctx, rsCopy) if err != nil { - return scaled, rs, fmt.Errorf("failed to updateReplicaSetFallbackToPatch in scaleReplicaSet: %w", err) + return scaled, rs, fmt.Errorf("failed to updateReplicaSet in scaleReplicaSet: %w", err) } if sizeNeedsUpdate { diff --git a/rollout/trafficrouting/alb/alb_test.go b/rollout/trafficrouting/alb/alb_test.go index faa798e524..562c3b599a 100644 --- a/rollout/trafficrouting/alb/alb_test.go +++ b/rollout/trafficrouting/alb/alb_test.go @@ -3,6 +3,7 @@ package alb import ( "context" "encoding/json" + "errors" "fmt" "strings" "testing" @@ -668,7 +669,7 @@ func TestErrorPatching(t *testing.T) { errMessage := "some error occurred" r.cfg.Client.(*fake.Clientset).Fake.AddReactor("patch", "ingresses", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, fmt.Errorf(errMessage) + return true, nil, errors.New(errMessage) }) err = r.SetWeight(10) @@ -700,7 +701,7 @@ func TestErrorPatchingMultiIngress(t *testing.T) { errMessage := "some error occurred" r.cfg.Client.(*fake.Clientset).Fake.AddReactor("patch", "ingresses", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, fmt.Errorf(errMessage) + return true, nil, errors.New(errMessage) }) err = r.SetWeight(10) diff --git a/rollout/trafficrouting/ambassador/ambassador.go b/rollout/trafficrouting/ambassador/ambassador.go index ceb389c81a..06466535f6 100644 --- a/rollout/trafficrouting/ambassador/ambassador.go +++ b/rollout/trafficrouting/ambassador/ambassador.go @@ -213,7 +213,7 @@ func (r *Reconciler) createCanaryMapping(ctx context.Context, if weight != 0 { msg := fmt.Sprintf("Ambassador mapping %q can not define weight", baseMappingName) r.sendWarningEvent(AmbassadorMappingConfigError, msg) - return fmt.Errorf(msg) + return errors.New(msg) } canarySvc := r.Rollout.Spec.Strategy.Canary.CanaryService diff --git a/server/server.go b/server/server.go index 3482634491..9a3e65e328 100644 --- a/server/server.go +++ b/server/server.go @@ -179,7 +179,10 @@ func (s *ArgoRolloutsServer) initRolloutViewController(namespace string, name st } func (s *ArgoRolloutsServer) getRolloutInfo(namespace string, name string) (*rollout.RolloutInfo, error) { - controller := s.initRolloutViewController(namespace, name, context.Background()) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + controller := s.initRolloutViewController(namespace, name, ctx) ri, err := controller.GetRolloutInfo() if err != nil { return nil, err diff --git a/server/server_static.go b/server/server_static.go index 44f2fb78f6..1a7de6b150 100644 --- a/server/server_static.go +++ b/server/server_static.go @@ -30,7 +30,7 @@ func (s *ArgoRolloutsServer) staticFileHttpHandler(w http.ResponseWriter, r *htt requestedURI := path.Clean(r.RequestURI) rootPath := path.Clean("/" + s.Options.RootPath) - if requestedURI == "/" { + if requestedURI == "/" && rootPath != "/" { http.Redirect(w, r, rootPath+"/", http.StatusFound) return } diff --git a/server/server_static_test.go b/server/server_static_test.go index 82b5b19ac9..f749ea842d 100644 --- a/server/server_static_test.go +++ b/server/server_static_test.go @@ -16,31 +16,39 @@ const TestRootPath = "/test-root" var ( //go:embed static_test/* - staticTestData embed.FS //nolint - mockServer ArgoRolloutsServer + staticTestData embed.FS //nolint + mockServerPrefix ArgoRolloutsServer + mockServerRoot ArgoRolloutsServer ) func init() { static = staticTestData staticBasePath = "static_test" indexHtmlFile = staticBasePath + "/index.html" - mockServer = mockArgoRolloutServer() + mockServerPrefix = mockArgoRolloutServer(TestRootPath) + mockServerRoot = mockArgoRolloutServer("/") } func TestIndexHtmlIsServed(t *testing.T) { tests := []struct { + server ArgoRolloutsServer requestPath string }{ - {TestRootPath + "/"}, - {TestRootPath + "/index.html"}, - {TestRootPath + "/nonsense/../index.html"}, - {TestRootPath + "/test-dir/test.css"}, + {mockServerPrefix, TestRootPath + "/"}, + {mockServerPrefix, TestRootPath + "/index.html"}, + {mockServerPrefix, TestRootPath + "/nonsense/../index.html"}, + {mockServerPrefix, TestRootPath + "/test-dir/test.css"}, + + {mockServerRoot, "/"}, + {mockServerRoot, "/index.html"}, + {mockServerRoot, "/nonsense/../index.html"}, + {mockServerRoot, "/test-dir/test.css"}, } for _, test := range tests { t.Run(test.requestPath, func(t *testing.T) { req := httptest.NewRequest(http.MethodGet, test.requestPath, nil) w := httptest.NewRecorder() - mockServer.staticFileHttpHandler(w, req) + test.server.staticFileHttpHandler(w, req) res := w.Result() defer res.Body.Close() data, err := io.ReadAll(res.Body) @@ -60,7 +68,7 @@ func TestIndexHtmlIsServed(t *testing.T) { func TestWhenFileNotFoundSendIndexPageForUiReactRouter(t *testing.T) { req := httptest.NewRequest(http.MethodGet, TestRootPath+"/namespace-default", nil) w := httptest.NewRecorder() - mockServer.staticFileHttpHandler(w, req) + mockServerPrefix.staticFileHttpHandler(w, req) res := w.Result() defer res.Body.Close() data, err := io.ReadAll(res.Body) @@ -72,7 +80,7 @@ func TestWhenFileNotFoundSendIndexPageForUiReactRouter(t *testing.T) { func TestSlashWillBeRedirectedToRootPath(t *testing.T) { req := httptest.NewRequest(http.MethodGet, "/", nil) w := httptest.NewRecorder() - mockServer.staticFileHttpHandler(w, req) + mockServerPrefix.staticFileHttpHandler(w, req) res := w.Result() defer res.Body.Close() _, err := io.ReadAll(res.Body) @@ -95,7 +103,7 @@ func TestInvalidFilesOrHackingAttemptReturn404(t *testing.T) { t.Run(test.requestPath, func(t *testing.T) { req := httptest.NewRequest(http.MethodGet, test.requestPath, nil) w := httptest.NewRecorder() - mockServer.staticFileHttpHandler(w, req) + mockServerPrefix.staticFileHttpHandler(w, req) res := w.Result() defer res.Body.Close() assert.Equal(t, res.StatusCode, http.StatusNotFound) @@ -103,10 +111,10 @@ func TestInvalidFilesOrHackingAttemptReturn404(t *testing.T) { } } -func mockArgoRolloutServer() ArgoRolloutsServer { +func mockArgoRolloutServer(rootPath string) ArgoRolloutsServer { s := ArgoRolloutsServer{ Options: ServerOptions{ - RootPath: TestRootPath, + RootPath: rootPath, }, } return s diff --git a/ui/src/app/components/analysis-modal/constants.ts b/ui/src/app/components/analysis-modal/constants.ts index c1a35ce0d5..70771ba985 100644 --- a/ui/src/app/components/analysis-modal/constants.ts +++ b/ui/src/app/components/analysis-modal/constants.ts @@ -3,6 +3,7 @@ import {AnalysisStatus, FunctionalStatus} from './types'; export const METRIC_FAILURE_LIMIT_DEFAULT = 0; export const METRIC_INCONCLUSIVE_LIMIT_DEFAULT = 0; export const METRIC_CONSECUTIVE_ERROR_LIMIT_DEFAULT = 4; +export const METRIC_CONSECUTIVE_SUCCESS_LIMIT_DEFAULT = 0; export const ANALYSIS_STATUS_THEME_MAP: {[key in AnalysisStatus]: string} = { Successful: FunctionalStatus.SUCCESS, diff --git a/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx index 51247b6d22..04ab3fb051 100644 --- a/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx +++ b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx @@ -63,11 +63,13 @@ interface CriteriaListProps { analysisStatus: AnalysisStatus; className?: string[] | string; consecutiveErrors: number; + consecutiveSuccesses: number; failures: number; inconclusives: number; maxConsecutiveErrors: number; maxFailures: number; maxInconclusives: number; + consecutiveSuccessLimit: number; showIcons: boolean; } @@ -75,25 +77,34 @@ const CriteriaList = ({ analysisStatus, className, consecutiveErrors, + consecutiveSuccesses, failures, inconclusives, maxConsecutiveErrors, maxFailures, maxInconclusives, + consecutiveSuccessLimit, showIcons, }: CriteriaListProps) => { let failureStatus = defaultCriterionStatus(analysisStatus); let errorStatus = defaultCriterionStatus(analysisStatus); let inconclusiveStatus = defaultCriterionStatus(analysisStatus); + let successStatus = defaultCriterionStatus(analysisStatus); if (analysisStatus !== AnalysisStatus.Pending && analysisStatus !== AnalysisStatus.Running) { failureStatus = failures <= maxFailures ? CriterionStatus.Pass : CriterionStatus.Fail; errorStatus = consecutiveErrors <= maxConsecutiveErrors ? CriterionStatus.Pass : CriterionStatus.Fail; inconclusiveStatus = inconclusives <= maxInconclusives ? CriterionStatus.Pass : CriterionStatus.Fail; + successStatus = consecutiveSuccesses >= consecutiveSuccessLimit ? CriterionStatus.Pass : CriterionStatus.Fail; } return (