From af439ae3afbc615708012fe3cefa909b245df32e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 09:42:12 -0500 Subject: [PATCH 001/159] docs: Update Changelog (#2683) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a738bac3d..a248152a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,131 @@ + +## [v1.5.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.4.1...v1.5.0-rc1) (2023-03-27) + +### Build + +* manually run auto changelog and fix workflow ([#2494](https://github.com/argoproj/argo-rollouts/issues/2494)) + +### Chore + +* update e2e k8s versions ([#2637](https://github.com/argoproj/argo-rollouts/issues/2637)) +* Remove namespaced crds ([#2516](https://github.com/argoproj/argo-rollouts/issues/2516)) +* fix dependabot broken dependency ([#2529](https://github.com/argoproj/argo-rollouts/issues/2529)) +* disable docker sbom and attestations ([#2528](https://github.com/argoproj/argo-rollouts/issues/2528)) +* improve e2e test timing ([#2577](https://github.com/argoproj/argo-rollouts/issues/2577)) +* fix typo for json tag on rollbackWindow ([#2598](https://github.com/argoproj/argo-rollouts/issues/2598)) +* update package dependencie ([#2602](https://github.com/argoproj/argo-rollouts/issues/2602)) +* bump node version and set openssl-legacy-provider ([#2606](https://github.com/argoproj/argo-rollouts/issues/2606)) +* switch to distroless for cli/dashboard image ([#2596](https://github.com/argoproj/argo-rollouts/issues/2596)) +* add Tuhu to users ([#2630](https://github.com/argoproj/argo-rollouts/issues/2630)) +* bump deps for prisma ([#2643](https://github.com/argoproj/argo-rollouts/issues/2643)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.6 to 1.25.7 ([#2682](https://github.com/argoproj/argo-rollouts/issues/2682)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.15 to 1.18.16 ([#2652](https://github.com/argoproj/argo-rollouts/issues/2652)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.16 to 1.18.17 ([#2659](https://github.com/argoproj/argo-rollouts/issues/2659)) +* **deps:** bump github.com/antonmedv/expr from 1.12.2 to 1.12.3 ([#2653](https://github.com/argoproj/argo-rollouts/issues/2653)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.5 to 1.19.6 ([#2654](https://github.com/argoproj/argo-rollouts/issues/2654)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.4 to 1.25.5 ([#2655](https://github.com/argoproj/argo-rollouts/issues/2655)) +* **deps:** bump github.com/antonmedv/expr from 1.12.1 to 1.12.2 ([#2649](https://github.com/argoproj/argo-rollouts/issues/2649)) +* **deps:** bump google.golang.org/protobuf from 1.28.1 to 1.29.0 ([#2646](https://github.com/argoproj/argo-rollouts/issues/2646)) +* **deps:** bump github.com/golang/protobuf from 1.5.2 to 1.5.3 ([#2645](https://github.com/argoproj/argo-rollouts/issues/2645)) +* **deps:** bump github.com/prometheus/common from 0.41.0 to 0.42.0 ([#2644](https://github.com/argoproj/argo-rollouts/issues/2644)) +* **deps:** bump minimist from 1.2.5 to 1.2.8 in /ui ([#2638](https://github.com/argoproj/argo-rollouts/issues/2638)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.4.8 to 1.4.9 ([#2636](https://github.com/argoproj/argo-rollouts/issues/2636)) +* **deps:** bump github.com/prometheus/common from 0.40.0 to 0.41.0 ([#2634](https://github.com/argoproj/argo-rollouts/issues/2634)) +* **deps:** bump google.golang.org/protobuf from 1.29.0 to 1.29.1 ([#2660](https://github.com/argoproj/argo-rollouts/issues/2660)) +* **deps:** bump google.golang.org/protobuf from 1.29.1 to 1.30.0 ([#2665](https://github.com/argoproj/argo-rollouts/issues/2665)) +* **deps:** bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#2627](https://github.com/argoproj/argo-rollouts/issues/2627)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.6 to 1.19.7 ([#2672](https://github.com/argoproj/argo-rollouts/issues/2672)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.3 to 1.25.4 ([#2617](https://github.com/argoproj/argo-rollouts/issues/2617)) +* **deps:** bump github.com/antonmedv/expr from 1.12.0 to 1.12.1 ([#2619](https://github.com/argoproj/argo-rollouts/issues/2619)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.4 to 1.19.5 ([#2616](https://github.com/argoproj/argo-rollouts/issues/2616)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.3 to 1.19.4 ([#2612](https://github.com/argoproj/argo-rollouts/issues/2612)) +* **deps:** bump github.com/prometheus/common from 0.39.0 to 0.40.0 ([#2611](https://github.com/argoproj/argo-rollouts/issues/2611)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.13 to 1.18.14 ([#2614](https://github.com/argoproj/argo-rollouts/issues/2614)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.2 to 1.25.3 ([#2615](https://github.com/argoproj/argo-rollouts/issues/2615)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.14 to 1.18.15 ([#2618](https://github.com/argoproj/argo-rollouts/issues/2618)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.17 to 1.18.19 ([#2673](https://github.com/argoproj/argo-rollouts/issues/2673)) +* **deps:** bump imjasonh/setup-crane from 0.2 to 0.3 ([#2600](https://github.com/argoproj/argo-rollouts/issues/2600)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.5 to 1.25.6 ([#2671](https://github.com/argoproj/argo-rollouts/issues/2671)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2593](https://github.com/argoproj/argo-rollouts/issues/2593)) +* **deps:** bump github.com/antonmedv/expr from 1.12.3 to 1.12.5 ([#2670](https://github.com/argoproj/argo-rollouts/issues/2670)) +* **deps:** bump google.golang.org/grpc from 1.52.3 to 1.53.0 ([#2574](https://github.com/argoproj/argo-rollouts/issues/2574)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2565](https://github.com/argoproj/argo-rollouts/issues/2565)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2564](https://github.com/argoproj/argo-rollouts/issues/2564)) +* **deps:** bump github.com/antonmedv/expr from 1.11.0 to 1.12.0 ([#2567](https://github.com/argoproj/argo-rollouts/issues/2567)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.3 to 1.17.4 ([#2566](https://github.com/argoproj/argo-rollouts/issues/2566)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2563](https://github.com/argoproj/argo-rollouts/issues/2563)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2559](https://github.com/argoproj/argo-rollouts/issues/2559)) +* **deps:** bump github.com/antonmedv/expr from 1.9.0 to 1.11.0 ([#2558](https://github.com/argoproj/argo-rollouts/issues/2558)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2555](https://github.com/argoproj/argo-rollouts/issues/2555)) +* **deps:** bump docker/build-push-action from 3.3.0 to 4.0.0 ([#2550](https://github.com/argoproj/argo-rollouts/issues/2550)) +* **deps:** bump github.com/influxdata/influxdb-client-go/v2 ([#2544](https://github.com/argoproj/argo-rollouts/issues/2544)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2542](https://github.com/argoproj/argo-rollouts/issues/2542)) +* **deps:** bump google.golang.org/grpc from 1.52.1 to 1.52.3 ([#2541](https://github.com/argoproj/argo-rollouts/issues/2541)) +* **deps:** bump google.golang.org/grpc from 1.52.0 to 1.52.1 ([#2538](https://github.com/argoproj/argo-rollouts/issues/2538)) +* **deps:** bump dependabot/fetch-metadata from 1.3.5 to 1.3.6 ([#2537](https://github.com/argoproj/argo-rollouts/issues/2537)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2534](https://github.com/argoproj/argo-rollouts/issues/2534)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2533](https://github.com/argoproj/argo-rollouts/issues/2533)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2532](https://github.com/argoproj/argo-rollouts/issues/2532)) +* **deps:** bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#2674](https://github.com/argoproj/argo-rollouts/issues/2674)) +* **deps:** bump actions/setup-go from 3 to 4 ([#2663](https://github.com/argoproj/argo-rollouts/issues/2663)) +* **deps:** bump github.com/antonmedv/expr from 1.9.0 to 1.10.0 ([#2527](https://github.com/argoproj/argo-rollouts/issues/2527)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2523](https://github.com/argoproj/argo-rollouts/issues/2523)) +* **deps:** bump actions/stale from 7 to 8 ([#2677](https://github.com/argoproj/argo-rollouts/issues/2677)) +* **deps:** bump google.golang.org/grpc from 1.51.0 to 1.52.0 ([#2513](https://github.com/argoproj/argo-rollouts/issues/2513)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2505](https://github.com/argoproj/argo-rollouts/issues/2505)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2506](https://github.com/argoproj/argo-rollouts/issues/2506)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2504](https://github.com/argoproj/argo-rollouts/issues/2504)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2497](https://github.com/argoproj/argo-rollouts/issues/2497)) +* **deps:** bump actions/stale from 6 to 7 ([#2496](https://github.com/argoproj/argo-rollouts/issues/2496)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2492](https://github.com/argoproj/argo-rollouts/issues/2492)) + +### Docs + +* Mention Internet Bug Bounty in the security policy ([#2642](https://github.com/argoproj/argo-rollouts/issues/2642)) +* Update Changelog ([#2625](https://github.com/argoproj/argo-rollouts/issues/2625)) +* fix missing links for getting started documentation ([#2557](https://github.com/argoproj/argo-rollouts/issues/2557)) +* fix spelling in example notification templates ([#2554](https://github.com/argoproj/argo-rollouts/issues/2554)) +* Add best practice for reducing memory usage ([#2545](https://github.com/argoproj/argo-rollouts/issues/2545)) +* commit generated docs for readthedocs.org ([#2535](https://github.com/argoproj/argo-rollouts/issues/2535)) +* fix incorrect description for autoPromotionSeconds ([#2525](https://github.com/argoproj/argo-rollouts/issues/2525)) +* manually add changelog due to action failure ([#2510](https://github.com/argoproj/argo-rollouts/issues/2510)) +* fix typo apisix ([#2508](https://github.com/argoproj/argo-rollouts/issues/2508)) +* add release schedule ([#2446](https://github.com/argoproj/argo-rollouts/issues/2446)) +* fix rendering by upgrading deps ([#2495](https://github.com/argoproj/argo-rollouts/issues/2495)) + +### Feat + +* Apache APISIX SetHeader support. Fixes [#2668](https://github.com/argoproj/argo-rollouts/issues/2668) ([#2678](https://github.com/argoproj/argo-rollouts/issues/2678)) +* support N nginx ingresses ([#2467](https://github.com/argoproj/argo-rollouts/issues/2467)) +* Add Service field to Rollout Experiment to allow service creation ([#2633](https://github.com/argoproj/argo-rollouts/issues/2633)) +* Provide time.Parse and time.Now while evaluating notification trigger condition ([#2206](https://github.com/argoproj/argo-rollouts/issues/2206)) +* Allow switching between Datadog v1 and v2. Fixes [#2549](https://github.com/argoproj/argo-rollouts/issues/2549) ([#2592](https://github.com/argoproj/argo-rollouts/issues/2592)) +* add support for traffic router plugins ([#2573](https://github.com/argoproj/argo-rollouts/issues/2573)) +* Add name attribute to ServicePort ([#2572](https://github.com/argoproj/argo-rollouts/issues/2572)) +* metric plugin system based on hashicorp go-plugin ([#2514](https://github.com/argoproj/argo-rollouts/issues/2514)) +* Adding SigV4 Option for Prometheus Metric Analysis ([#2489](https://github.com/argoproj/argo-rollouts/issues/2489)) +* **analysis:** add Apache SkyWalking as metrics provider +* **controller:** Adding status.alb.canaryTargetGroup.fullName for ALB. Fixes [#2589](https://github.com/argoproj/argo-rollouts/issues/2589) ([#2604](https://github.com/argoproj/argo-rollouts/issues/2604)) + +### Fix + +* update GetTargetGroupMetadata to call DescribeTags in batches ([#2570](https://github.com/argoproj/argo-rollouts/issues/2570)) +* switch service selector back to stable on canary service when aborted ([#2540](https://github.com/argoproj/argo-rollouts/issues/2540)) +* change log generator to only add CHANGELOG.md ([#2626](https://github.com/argoproj/argo-rollouts/issues/2626)) +* Rollback change on service creation with weightless experiments ([#2624](https://github.com/argoproj/argo-rollouts/issues/2624)) +* flakey TestWriteBackToInformer test ([#2621](https://github.com/argoproj/argo-rollouts/issues/2621)) +* remove outdated ioutil package dependencies ([#2583](https://github.com/argoproj/argo-rollouts/issues/2583)) +* analysis information box [#2530](https://github.com/argoproj/argo-rollouts/issues/2530) ([#2575](https://github.com/argoproj/argo-rollouts/issues/2575)) +* support only tls in virtual services ([#2502](https://github.com/argoproj/argo-rollouts/issues/2502)) +* **analysis:** Nil Pointer Fixes [#2458](https://github.com/argoproj/argo-rollouts/issues/2458) ([#2680](https://github.com/argoproj/argo-rollouts/issues/2680)) + +### BREAKING CHANGE + + +There was an unintentional change in behavior related to service creation with experiments introduced in v1.4.0 this has been reverted in v1.4.1 back to the original behavior. In v1.4.0 services where always created with for inline experiments even if there was no weight set. In 1.4.1 we go back to the original behavior of requiring weight to be set in order to create a service. + + ## [v1.4.1](https://github.com/argoproj/argo-rollouts/compare/v1.4.0...v1.4.1) (2023-02-20) From b84e039115421e19d605e19cfea3eaac95202e55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 20:49:03 -0500 Subject: [PATCH 002/159] chore(deps): bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 (#2684) chore(deps): bump github.com/influxdata/influxdb-client-go/v2 Bumps [github.com/influxdata/influxdb-client-go/v2](https://github.com/influxdata/influxdb-client-go) from 2.12.2 to 2.12.3. - [Release notes](https://github.com/influxdata/influxdb-client-go/releases) - [Changelog](https://github.com/influxdata/influxdb-client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-go/compare/v2.12.2...v2.12.3) --- updated-dependencies: - dependency-name: github.com/influxdata/influxdb-client-go/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2bf94a1c87..2b4a15f522 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-plugin v1.4.9 - github.com/influxdata/influxdb-client-go/v2 v2.12.2 + github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 diff --git a/go.sum b/go.sum index eba6172002..0fc7a1d122 100644 --- a/go.sum +++ b/go.sum @@ -564,8 +564,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= -github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= +github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= From 3a21038678a153cfcf5ae2cee5c7809e990a1d1a Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Mon, 3 Apr 2023 10:03:34 -0400 Subject: [PATCH 003/159] docs(example): interval requires count (#2690) * doc(examples): interval requires count doc(examples): moved other count up next to interval for visibility Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * fix: noticed typo in bug_report template while making bug report Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --------- Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- examples/analysis-templates.yaml | 2 +- examples/cluster-analysis-templates.yaml | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fd7d7aa972..2a7fef17f4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' Checklist: * [ ] I've included steps to reproduce the bug. -* [ ] I've inclued the version of argo rollouts. +* [ ] I've included the version of argo rollouts. **Describe the bug** @@ -49,4 +49,4 @@ kubectl logs -n argo-rollouts deployment/argo-rollouts | grep rollout= **Message from the maintainers**: -Impacted by this bug? Give it a 👍. We prioritize the issues with the most 👍. \ No newline at end of file +Impacted by this bug? Give it a 👍. We prioritize the issues with the most 👍. diff --git a/examples/analysis-templates.yaml b/examples/analysis-templates.yaml index 84dde3b1c1..02bde8d8c4 100644 --- a/examples/analysis-templates.yaml +++ b/examples/analysis-templates.yaml @@ -10,6 +10,7 @@ metadata: spec: metrics: - name: pass + count: 1 interval: 5s failureLimit: 1 provider: @@ -24,7 +25,6 @@ spec: args: [exit 0] restartPolicy: Never backoffLimit: 0 - count: 1 --- # This AnalysisTemplate will run a Kubernetes Job every 5 seconds, with a 50% chance of failure. # When the number of accumulated failures exceeds failureLimit, it will cause the analysis run to diff --git a/examples/cluster-analysis-templates.yaml b/examples/cluster-analysis-templates.yaml index 00c98c355e..5e1ae76adb 100644 --- a/examples/cluster-analysis-templates.yaml +++ b/examples/cluster-analysis-templates.yaml @@ -5,6 +5,7 @@ metadata: spec: metrics: - name: pass + count: 1 interval: 5s failureLimit: 1 provider: @@ -18,4 +19,4 @@ spec: command: [sh, -c] args: [exit 0] restartPolicy: Never - backoffLimit: 0 \ No newline at end of file + backoffLimit: 0 From f9a39149b3963046b45a4147f2c04a11661a000f Mon Sep 17 00:00:00 2001 From: Daniel Helfand Date: Tue, 4 Apr 2023 09:54:29 -0400 Subject: [PATCH 004/159] docs: update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes #1750 (#1867) * docs: add k3d as recommended cluster Signed-off-by: Daniel Helfand * docs: add details on setting up cluster for e2e tests Signed-off-by: Daniel Helfand * docs: update kubectl install docs Signed-off-by: Daniel Helfand --------- Signed-off-by: Daniel Helfand --- docs/CONTRIBUTING.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index d4e4d89b6d..694a94690a 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -7,9 +7,9 @@ Install: * [docker](https://docs.docker.com/install/#supported-platforms) * [golang](https://golang.org/) -* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +* [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) * [kustomize](https://github.com/kubernetes-sigs/kustomize/releases) -* [minikube](https://kubernetes.io/docs/setup/minikube/) or Docker for Desktop +* [k3d](https://k3d.io/) recommended Kustomize is required for unit tests (`make test` is using it), so you [must install it](https://kubectl.docs.kubernetes.io/installation/kustomize/) locally if you wish to make code contributions to Argo Rollouts. @@ -33,7 +33,7 @@ go get -u github.com/golangci/golangci-lint/cmd/golangci-lint Brew users can quickly install the lot: ```bash -brew install go kubectl kustomize golangci-lint protobuf swagger-codegen +brew install go kubectl kustomize golangci-lint protobuf swagger-codegen k3d ``` Set up environment variables (e.g. is `~/.bashrc`): @@ -87,6 +87,15 @@ running. The rollout controller can be started with the command: make start-e2e ``` +Start and prepare your cluster for e2e tests: + +``` +k3d cluster create +kubectl create ns argo-rollouts +kubectl apply -k manifests/crds +kubectl apply -f test/e2e/crds +``` + Then run the e2e tests: ``` From 8069950fa503437329eac40808b6f2e00ff12fe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:56:53 -0500 Subject: [PATCH 005/159] chore(deps): bump github.com/spf13/cobra from 1.6.1 to 1.7.0 (#2698) Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.6.1 to 1.7.0. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.6.1...v1.7.0) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2b4a15f522..2b6fe5d719 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/sirupsen/logrus v1.9.0 github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.2 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 @@ -126,7 +126,7 @@ require ( github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect diff --git a/go.sum b/go.sum index 0fc7a1d122..4b3e71a4fd 100644 --- a/go.sum +++ b/go.sum @@ -562,8 +562,8 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= @@ -881,8 +881,8 @@ github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSW github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= From ab85dac8921e68af49f8414781d8af564254d368 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:57:52 -0500 Subject: [PATCH 006/159] chore(deps): bump peter-evans/create-pull-request from 4 to 5 (#2697) Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4 to 5. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v4...v5) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/changelog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index ff981916f7..6120a179b9 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -23,7 +23,7 @@ jobs: ./git-chglog --sort semver -o CHANGELOG.md v1.3.1.. rm git-chglog - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: commit-message: update changelog title: "docs: Update Changelog" From b8b3a072cd2e77e4bddaac05db38a086b77ab32e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Apr 2023 20:41:56 -0500 Subject: [PATCH 007/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 (#2702) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.25.7 to 1.25.8. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/polly/v1.25.7...service/cloudwatch/v1.25.8) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 2b6fe5d719..74a2efec20 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.12.5 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.17.7 + github.com/aws/aws-sdk-go-v2 v1.17.8 github.com/aws/aws-sdk-go-v2/config v1.18.19 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.7 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7 github.com/blang/semver v3.5.1+incompatible github.com/evanphx/json-patch/v5 v5.6.0 @@ -82,8 +82,8 @@ require ( github.com/aws/aws-sdk-go v1.44.39 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.18 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 // indirect diff --git a/go.sum b/go.sum index 4b3e71a4fd..dace128b98 100644 --- a/go.sum +++ b/go.sum @@ -131,22 +131,25 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39 h1:pMxYLqnuDidT0ZTDAhYC66fb3W3Yc+oShmfzEL4fTDI= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.17.7 h1:CLSjnhJSTSogvqUGhIC6LqFKATMRexcxLZ0i/Nzk9Eg= github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= +github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.19 h1:AqFK6zFNtq4i1EYu+eC7lcKHYnZagMn6SW171la0bGw= github.com/aws/aws-sdk-go-v2/config v1.18.19/go.mod h1:XvTmGMY8d52ougvakOv1RpiTLPz9dlG/OQHsKU/cMmY= github.com/aws/aws-sdk-go-v2/credentials v1.13.18 h1:EQMdtHwz0ILTW1hoP+EwuWhwCG1hD6l3+RWFQABET4c= github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 h1:gt57MN3liKiyGopcqgNzJb2+d9MJaKT/q1OksHNXVE4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31 h1:sJLYcS+eZn5EeNINGHSCRAwUJMFVqklwkH36Vbyai7M= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25 h1:1mnRASEKnkqsntcxHaysxwgVoUUp5dkiB+l3llKnqyg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh06CXL/h6G8LQJFpZfFBYBNboo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 h1:p5luUImdIqywn6JpQsW3tq5GNOxKmOnEpybzPx+d1lk= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32/go.mod h1:XGhIBZDEgfqmFIugclZ6FU7v75nHhBDtzuB4xB/tEi4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.7 h1:dkpnVfgWELJx4g6Q7GQnvm7dYqBAx3lVvJ4ylh9gsRw= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.7/go.mod h1:hZ0QWEIcOqKen/WqEkFGa6KxhHY6YnKQJb8POFmCpno= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 h1:V8cdRFfoGStOE/yHAgCR+y6bFJZJcZkhtkVZ4iqMk0g= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7 h1:XpIms0tmerNg/t6IiGrbKU6Au25CHyXqs8Yc3zOET5o= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7/go.mod h1:AE8U+Wj27eSDhWhAQp0BJlUi2vIqQ7ndd/e+Hnn+qus= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0= From 7b7b8648a261b9a10e8cebf7a471ca7fc1868346 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Apr 2023 20:42:25 -0500 Subject: [PATCH 008/159] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 (#2703) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.17.7 to 1.17.8. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.17.7...v1.17.8) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From f1f1086e3ca41d5c1e795baeb5159d294f7fb438 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Apr 2023 23:40:39 -0500 Subject: [PATCH 009/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 (#2704) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.7 to 1.19.8. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.7...service/efs/v1.19.8) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 74a2efec20..a4676c26fd 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.17.8 github.com/aws/aws-sdk-go-v2/config v1.18.19 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 github.com/blang/semver v3.5.1+incompatible github.com/evanphx/json-patch/v5 v5.6.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 diff --git a/go.sum b/go.sum index dace128b98..64d8d60538 100644 --- a/go.sum +++ b/go.sum @@ -150,8 +150,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 h1:p5luUImdIqywn6JpQsW3tq5GNOx github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32/go.mod h1:XGhIBZDEgfqmFIugclZ6FU7v75nHhBDtzuB4xB/tEi4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 h1:V8cdRFfoGStOE/yHAgCR+y6bFJZJcZkhtkVZ4iqMk0g= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7 h1:XpIms0tmerNg/t6IiGrbKU6Au25CHyXqs8Yc3zOET5o= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.7/go.mod h1:AE8U+Wj27eSDhWhAQp0BJlUi2vIqQ7ndd/e+Hnn+qus= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 h1:ERV+lq5S47AVt7INnzp+ko6k3PQT+2hUVwD3SS3cJBI= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 h1:5V7DWLBd7wTELVz5bPpwzYy/sikk0gsgZfj40X+l5OI= From 17cd3ad46f824f85c440d6f53d8a7dc6497b9bbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Apr 2023 07:36:40 -0500 Subject: [PATCH 010/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 (#2705) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.19 to 1.18.20. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.19...config/v1.18.20) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 35 ++++++++++++++++------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index a4676c26fd..ea744d010d 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.17.8 - github.com/aws/aws-sdk-go-v2/config v1.18.19 + github.com/aws/aws-sdk-go-v2/config v1.18.20 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 github.com/blang/semver v3.5.1+incompatible @@ -80,15 +80,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.39 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.18 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.19 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.8 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 64d8d60538..b8da68847b 100644 --- a/go.sum +++ b/go.sum @@ -131,35 +131,32 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39 h1:pMxYLqnuDidT0ZTDAhYC66fb3W3Yc+oShmfzEL4fTDI= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.19 h1:AqFK6zFNtq4i1EYu+eC7lcKHYnZagMn6SW171la0bGw= -github.com/aws/aws-sdk-go-v2/config v1.18.19/go.mod h1:XvTmGMY8d52ougvakOv1RpiTLPz9dlG/OQHsKU/cMmY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18 h1:EQMdtHwz0ILTW1hoP+EwuWhwCG1hD6l3+RWFQABET4c= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 h1:gt57MN3liKiyGopcqgNzJb2+d9MJaKT/q1OksHNXVE4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= +github.com/aws/aws-sdk-go-v2/config v1.18.20 h1:yYy+onqmLmDVZtx0mkqbx8aJPl+58V6ivLbLDZ2Qztc= +github.com/aws/aws-sdk-go-v2/config v1.18.20/go.mod h1:RWjF39RiDevmHw/+VaD8F0A36OPIPTHQQyRx0eZohnw= +github.com/aws/aws-sdk-go-v2/credentials v1.13.19 h1:FWHJy9uggyQCSEhovtl/6W6rW9P6DSr62GUeY/TS6Eo= +github.com/aws/aws-sdk-go-v2/credentials v1.13.19/go.mod h1:2m4uvLvl5hvQezVkLeBBUGMEDm5GcUNc3016W6d3NGg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh06CXL/h6G8LQJFpZfFBYBNboo= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 h1:p5luUImdIqywn6JpQsW3tq5GNOxKmOnEpybzPx+d1lk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32/go.mod h1:XGhIBZDEgfqmFIugclZ6FU7v75nHhBDtzuB4xB/tEi4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 h1:V8cdRFfoGStOE/yHAgCR+y6bFJZJcZkhtkVZ4iqMk0g= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 h1:ERV+lq5S47AVt7INnzp+ko6k3PQT+2hUVwD3SS3cJBI= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 h1:5V7DWLBd7wTELVz5bPpwzYy/sikk0gsgZfj40X+l5OI= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6 h1:B8cauxOH1W1v7rd8RdI/MWnoR4Ze0wIHWrb90qczxj4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7 h1:bWNgNdRko2x6gqa0blfATqAZKZokPIeM1vfmQt2pnvM= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.7 h1:rrYYhsvcvg6CDDoo4GHKtAWBFutS86CpmGvqHJHYL9w= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.7/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7 h1:Vjpjt3svuJ/u+eKRfycZwqLsLoxyuvvZyHMJSk+3k58= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.8 h1:SQ8pPoXfzuz4DImO4KAi9xhO4ANG0Ckb5clZ5GoRAPw= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.8/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 950fb56d2d081dcda4fd3a3a6aa5a20cde28568d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Apr 2023 21:07:10 -0500 Subject: [PATCH 011/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 (#2710) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.25.8 to 1.25.9. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/polly/v1.25.8...service/cloudwatch/v1.25.9) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ea744d010d..4102560c6f 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.17.8 github.com/aws/aws-sdk-go-v2/config v1.18.20 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 github.com/blang/semver v3.5.1+incompatible github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index b8da68847b..e435a70971 100644 --- a/go.sum +++ b/go.sum @@ -145,8 +145,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8 h1:V8cdRFfoGStOE/yHAgCR+y6bFJZJcZkhtkVZ4iqMk0g= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.8/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 h1:7jgW378oM948BxuOBarXeeaKSrRaCj7didsdeSwYGGo= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 h1:ERV+lq5S47AVt7INnzp+ko6k3PQT+2hUVwD3SS3cJBI= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= From b9db49012a1ab031cb0b464a7dda960ef382f459 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 08:43:11 -0500 Subject: [PATCH 012/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 (#2708) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.8 to 1.19.9. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.8...service/efs/v1.19.9) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4102560c6f..f2c6c8a558 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.17.8 github.com/aws/aws-sdk-go-v2/config v1.18.20 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 github.com/blang/semver v3.5.1+incompatible github.com/evanphx/json-patch/v5 v5.6.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 diff --git a/go.sum b/go.sum index e435a70971..4674cd63e2 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRv github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 h1:7jgW378oM948BxuOBarXeeaKSrRaCj7didsdeSwYGGo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8 h1:ERV+lq5S47AVt7INnzp+ko6k3PQT+2hUVwD3SS3cJBI= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.8/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 h1:5SFRhHdPrqPgH14WrakFssW78i0eq9e/4mC3ujodNM0= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= github.com/aws/aws-sdk-go-v2/service/sso v1.12.7 h1:rrYYhsvcvg6CDDoo4GHKtAWBFutS86CpmGvqHJHYL9w= From 720116eead7872fd82a1271fcc6e97d58336c695 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 08:43:43 -0500 Subject: [PATCH 013/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 (#2709) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.20 to 1.18.21. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.20...config/v1.18.21) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index f2c6c8a558..585afb7166 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.17.8 - github.com/aws/aws-sdk-go-v2/config v1.18.20 + github.com/aws/aws-sdk-go-v2/config v1.18.21 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 github.com/blang/semver v3.5.1+incompatible @@ -80,15 +80,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.39 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.19 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.7 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 4674cd63e2..4924ef1218 100644 --- a/go.sum +++ b/go.sum @@ -133,10 +133,10 @@ github.com/aws/aws-sdk-go v1.44.39 h1:pMxYLqnuDidT0ZTDAhYC66fb3W3Yc+oShmfzEL4fTD github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.20 h1:yYy+onqmLmDVZtx0mkqbx8aJPl+58V6ivLbLDZ2Qztc= -github.com/aws/aws-sdk-go-v2/config v1.18.20/go.mod h1:RWjF39RiDevmHw/+VaD8F0A36OPIPTHQQyRx0eZohnw= -github.com/aws/aws-sdk-go-v2/credentials v1.13.19 h1:FWHJy9uggyQCSEhovtl/6W6rW9P6DSr62GUeY/TS6Eo= -github.com/aws/aws-sdk-go-v2/credentials v1.13.19/go.mod h1:2m4uvLvl5hvQezVkLeBBUGMEDm5GcUNc3016W6d3NGg= +github.com/aws/aws-sdk-go-v2/config v1.18.21 h1:ENTXWKwE8b9YXgQCsruGLhvA9bhg+RqAsL9XEMEsa2c= +github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= +github.com/aws/aws-sdk-go-v2/credentials v1.13.20 h1:oZCEFcrMppP/CNiS8myzv9JgOzq2s0d3v3MXYil/mxQ= +github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= @@ -151,12 +151,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 h1:5SFRhHdPr github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.7 h1:rrYYhsvcvg6CDDoo4GHKtAWBFutS86CpmGvqHJHYL9w= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.7/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7 h1:Vjpjt3svuJ/u+eKRfycZwqLsLoxyuvvZyHMJSk+3k58= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.7/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.8 h1:SQ8pPoXfzuz4DImO4KAi9xhO4ANG0Ckb5clZ5GoRAPw= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.8/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 h1:5cb3D6xb006bPTqEfCNaEA6PPEfBXxxy4NNeX/44kGk= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.8/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 h1:NZaj0ngZMzsubWZbrEFSB4rgSQRbFq38Sd6KBxHuOIU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 h1:Qf1aWwnsNkyAoqDqmdM3nHwN78XQjec27LjM6b9vyfI= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 689182f730823da3f1efa077c88fb606a0549418 Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Tue, 11 Apr 2023 16:07:27 -0600 Subject: [PATCH 014/159] fix(controller): Add klog logrus bridge. Fixes #2707. (#2701) * Add klog logrus bridge Signed-off-by: Clayton Walker * Pull klog bridge out to log util Signed-off-by: Clayton Walker * Upgrade logrusr to v4 Signed-off-by: Clayton Walker * Simplify logging Signed-off-by: Clayton Walker --------- Signed-off-by: Clayton Walker --- cmd/kubectl-argo-rollouts/main.go | 3 +++ cmd/rollouts-controller/main.go | 1 + go.mod | 5 +++-- go.sum | 10 ++++++---- utils/log/log.go | 7 +++++++ utils/log/log_test.go | 13 +++++++++++++ 6 files changed, 33 insertions(+), 6 deletions(-) diff --git a/cmd/kubectl-argo-rollouts/main.go b/cmd/kubectl-argo-rollouts/main.go index e5bc3121f6..b7d9a02d0a 100644 --- a/cmd/kubectl-argo-rollouts/main.go +++ b/cmd/kubectl-argo-rollouts/main.go @@ -3,6 +3,8 @@ package main import ( "os" + logutil "github.com/argoproj/argo-rollouts/utils/log" + log "github.com/sirupsen/logrus" "k8s.io/cli-runtime/pkg/genericclioptions" _ "k8s.io/client-go/plugin/pkg/client/auth/azure" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" @@ -15,6 +17,7 @@ import ( func main() { klog.InitFlags(nil) + logutil.SetKLogLogger(log.New()) streams := genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr} o := options.NewArgoRolloutsOptions(streams) root := cmd.NewCmdArgoRollouts(o) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 671cc8681d..bb3cfeba1a 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -83,6 +83,7 @@ func newCommand() *cobra.Command { if logFormat != "" { log.SetFormatter(createFormatter(logFormat)) } + logutil.SetKLogLogger(log.New()) logutil.SetKLogLevel(klogLevel) log.WithField("version", version.GetVersion()).Info("Argo Rollouts starting") diff --git a/go.mod b/go.mod index 585afb7166..08c086a04c 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 github.com/blang/semver v3.5.1+incompatible + github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/gogo/protobuf v1.3.2 @@ -103,7 +104,7 @@ require ( github.com/fatih/color v1.7.0 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect @@ -171,7 +172,7 @@ require ( golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/sys v0.7.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/go.sum b/go.sum index 4924ef1218..9cb34f6be0 100644 --- a/go.sum +++ b/go.sum @@ -174,6 +174,8 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh63t1Oo= +github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 h1:5+NghM1Zred9Z078QEZtm28G/kfDfZN/92gkDlLwGVA= github.com/bradleyfalzon/ghinstallation/v2 v2.1.0/go.mod h1:Xg3xPRN5Mcq6GDqeUVhFbjEWMb4JHCyWEeeBGEYQoTU= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= @@ -333,8 +335,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -1245,8 +1247,8 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/utils/log/log.go b/utils/log/log.go index f2b36b078c..049f26f935 100644 --- a/utils/log/log.go +++ b/utils/log/log.go @@ -5,6 +5,8 @@ import ( "strconv" "strings" + "github.com/bombsimon/logrusr/v4" + log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" @@ -28,6 +30,11 @@ const ( NamespaceKey = "namespace" ) +// SetKLogLogger set the klog logger for the k8s go-client +func SetKLogLogger(logger *log.Logger) { + klog.SetLogger(logrusr.New(logger)) +} + // SetKLogLevel set the klog level for the k8s go-client func SetKLogLevel(klogLevel int) { klog.InitFlags(nil) diff --git a/utils/log/log_test.go b/utils/log/log_test.go index 74f8e27647..fa969ebb93 100644 --- a/utils/log/log_test.go +++ b/utils/log/log_test.go @@ -6,6 +6,8 @@ import ( "strings" "testing" + "k8s.io/klog/v2" + log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -274,3 +276,14 @@ func TestWithVersionFields(t *testing.T) { assert.True(t, strings.Contains(logMessage, "generation=2")) assert.True(t, strings.Contains(logMessage, "resourceVersion=123")) } + +func TestKLogLogger(t *testing.T) { + buf := bytes.NewBufferString("") + logger := log.New() + logger.SetOutput(buf) + SetKLogLogger(logger) + defer klog.ClearLogger() + klog.Info("Logging from klog") + logMessage := buf.String() + assert.Contains(t, logMessage, "Logging from klog") +} From 8ecb09316b48199e1da1f33118bf2a4f8edfccb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 08:59:29 -0500 Subject: [PATCH 015/159] chore(deps): bump codecov/codecov-action from 3.1.1 to 3.1.2 (#2711) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.1...v3.1.2) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index afe53e0365..fb1e1911f3 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v3.1.1 + uses: codecov/codecov-action@v3.1.2 with: file: coverage.out From b9fbc9b20300939b749a21e50bbd775d491bc7b1 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Thu, 13 Apr 2023 09:48:53 -0400 Subject: [PATCH 016/159] docs(analysis): fix use stringData in the examples (#2715) Use stringData in the examples resolves #2714 Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- docs/analysis/datadog.md | 4 ++-- docs/analysis/influxdb.md | 2 +- docs/analysis/newrelic.md | 4 ++-- docs/analysis/wavefront.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index 7cc0534eda..8a80064914 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -40,10 +40,10 @@ kind: Secret metadata: name: datadog type: Opaque -data: +stringData: address: https://api.datadoghq.com api-key: app-key: ``` -`apiVersion` here is different from the `apiVersion` from the Datadog configuration above. \ No newline at end of file +`apiVersion` here is different from the `apiVersion` from the Datadog configuration above. diff --git a/docs/analysis/influxdb.md b/docs/analysis/influxdb.md index f4bd95345e..5e0fbe6a63 100644 --- a/docs/analysis/influxdb.md +++ b/docs/analysis/influxdb.md @@ -34,7 +34,7 @@ kind: Secret metadata: name: influxdb type: Opaque -data: +stringData: address: authToken: org: diff --git a/docs/analysis/newrelic.md b/docs/analysis/newrelic.md index b71b661f84..81afad9b75 100644 --- a/docs/analysis/newrelic.md +++ b/docs/analysis/newrelic.md @@ -33,7 +33,7 @@ kind: Secret metadata: name: newrelic type: Opaque -data: +stringData: personal-api-key: account-id: region: "us" # optional, defaults to "us" if not set. Only set to "eu" if you use EU New Relic @@ -47,7 +47,7 @@ kind: Secret metadata: name: newrelic type: Opaque -data: +stringData: personal-api-key: account-id: region: "us" # optional, defaults to "us" if not set. Only set to "eu" if you use EU New Relic diff --git a/docs/analysis/wavefront.md b/docs/analysis/wavefront.md index f7c8f57d91..e22630dd06 100644 --- a/docs/analysis/wavefront.md +++ b/docs/analysis/wavefront.md @@ -35,7 +35,7 @@ kind: Secret metadata: name: wavefront-api-tokens type: Opaque -data: +stringData: example1.wavefront.com: example2.wavefront.com: ``` From 4cecf3484d2dcc1fcd4bb5c02dd3a594399246a1 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 14 Apr 2023 12:47:03 -0500 Subject: [PATCH 017/159] docs: fix link to plugins for traffic routers (#2719) fix docs link Signed-off-by: zachaller --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index f8159bd5d9..c7cdabc426 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -51,7 +51,7 @@ nav: - AWS ALB: features/traffic-management/alb.md - Istio: features/traffic-management/istio.md - NGINX: features/traffic-management/nginx.md - - Plugins: traffic-management/plugins.md + - Plugins: features/traffic-management/plugins.md - SMI: features/traffic-management/smi.md - Traefik: features/traffic-management/traefik.md - Analysis: From c250c7e8ea733efce9082ad19c23b81a5e6bda63 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Sat, 15 Apr 2023 01:42:12 -0400 Subject: [PATCH 018/159] refactor: change plugin naming pattern #2720 (#2722) Update docs to reflect new plugin naming pattern * update contributor plugin guide * update analysis/plugin overview * update trafic-management/plugin overview * automatic linting changes - whitespace, new line at end of file Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> #2720 --- docs/analysis/plugins.md | 18 +++++------ docs/features/traffic-management/plugins.md | 6 ++-- docs/plugins.md | 34 ++++++++++----------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/analysis/plugins.md b/docs/analysis/plugins.md index 8b718bf136..89f8f7a782 100644 --- a/docs/analysis/plugins.md +++ b/docs/analysis/plugins.md @@ -2,10 +2,10 @@ !!! important Available since v1.5 - Status: Alpha -Argo Rollouts supports getting analysis metrics via 3rd party plugin system. This allows users to extend the capabilities of Rollouts +Argo Rollouts supports getting analysis metrics via 3rd party plugin system. This allows users to extend the capabilities of Rollouts to support metric providers that are not natively supported. Rollout's uses a plugin library called -[go-plugin](https://github.com/hashicorp/go-plugin) to do this. You can find a sample plugin -here: [rollouts-sample_prometheus-metric-plugin](https://github.com/argoproj-labs/rollouts-sample_prometheus-metric-plugin) +[go-plugin](https://github.com/hashicorp/go-plugin) to do this. You can find a sample plugin +here: [rollouts-plugin-metric-sample-prometheus](https://github.com/argoproj-labs/rollouts-plugin-metric-sample-prometheus) ## Using a Metric Plugin @@ -36,7 +36,7 @@ data: ### Using a HTTP(S) server to host the plugin executable -Argo Rollouts supports downloading the plugin executable from a HTTP(S) server. To use this method, you will need to +Argo Rollouts supports downloading the plugin executable from a HTTP(S) server. To use this method, you will need to configure the controller via the `argo-rollouts-config` configmap and set `pluginLocation` to a http(s) url. Example: ```yaml @@ -47,7 +47,7 @@ metadata: data: metricProviderPlugins: |- - 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-sample_prometheus-metric-plugin/releases/download/v0.0.4/metric-plugin-linux-amd64" # supports http(s):// urls and file:// + 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 ``` @@ -56,18 +56,18 @@ data: 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 +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 +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) #### Add Your Plugin Here * If you have created a plugin, please submit a PR to add it to this list. -#### [rollouts-sample_prometheus-metric-plugin](https://github.com/argoproj-labs/rollouts-sample_prometheus-metric-plugin) - * This is just a sample plugin that can be used as a starting point for creating your own plugin. +#### [rollouts-plugin-metric-sample-prometheus](https://github.com/argoproj-labs/rollouts-plugin-metric-sample-prometheus) + * This is just a sample plugin that can be used as a starting point for creating your own plugin. It is not meant to be used in production. It is based on the built-in prometheus provider. diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index b211ca75d0..f0d1634ee3 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -5,7 +5,7 @@ Argo Rollouts supports getting analysis metrics via 3rd party plugin system. This allows users to extend the capabilities of Rollouts to support metric providers that are not natively supported. Rollout's uses a plugin library called [go-plugin](https://github.com/hashicorp/go-plugin) to do this. You can find a sample plugin -here: [rollouts-sample_nginx-trafficrouter-plugin](https://github.com/argoproj-labs/rollouts-sample_nginx-trafficrouter-plugin) +here: [rollouts-plugin-trafficrouter-sample-nginx](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-sample-nginx) ## Using a Traffic Router Plugin @@ -47,7 +47,7 @@ metadata: data: trafficRouterPlugins: |- - 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-sample_nginx-trafficrouter-plugin/releases/download/v0.0.1/metric-plugin-linux-amd64" # supports http(s):// urls and file:// + 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 ``` @@ -68,6 +68,6 @@ responsibility of the Argo Rollouts administrator to define the plugin installat #### Add Your Plugin Here * If you have created a plugin, please submit a PR to add it to this list. -#### [rollouts-sample_nginx-trafficrouter-plugin](https://github.com/argoproj-labs/rollouts-sample_nginx-trafficrouter-plugin) +#### [rollouts-plugin-trafficrouter-sample-nginx](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-sample-nginx) * This is just a sample plugin that can be used as a starting point for creating your own plugin. It is not meant to be used in production. It is based on the built-in prometheus provider. diff --git a/docs/plugins.md b/docs/plugins.md index 794ec8157f..ce3a1770ee 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2,7 +2,7 @@ ## High Level Overview -Argo Rollouts plugins depend on hashicorp's [go-plugin](https://github.com/hashicorp/go-plugin) library. This library +Argo Rollouts plugins depend on hashicorp's [go-plugin](https://github.com/hashicorp/go-plugin) library. This library provides a way for a plugin to be compiled as a standalone executable and then loaded by the rollouts controller at runtime. This works by having the plugin executable act as a rpc server and the rollouts controller act as a client. The plugin executable is started by the rollouts controller and is a long-lived process and that the rollouts controller connects to over a unix socket. @@ -11,22 +11,22 @@ The communication protocol uses golang built in net/rpc library so plugins have ## Plugin Repository In order to get plugins listed in the main argo rollouts documentation we ask that the plugin repository be created under -the [argoproj-labs](https://github.com/argoproj-labs) organization. Please open an issue under argo-rollouts requesting a -repo which you would be granted admin access on. +the [argoproj-labs](https://github.com/argoproj-labs) organization. Please open an issue under argo-rollouts requesting a +repo which you would be granted admin access on. -There is also a standard naming convention for plugin names used for configmap registration, as well as what the plugin -uses for locating its specific configuration on rollout or analysis resources. The name needs to be in the form of -`/` and both and have a regular expression check that matches Github's requirements -for `username/org` and `repository name`. This requirement is in place to help with allowing multiple creators of the same plugin -types to exist such as `/nginx` and `/nginx`. These names could be based of the repo name such -as `argoproj-labs/rollouts-sample_prometheus-metric-plugin` but it is not a requirement. +There is also a standard naming convention for plugin names used for configmap registration, as well as what the plugin +uses for locating its specific configuration on rollout or analysis resources. The name needs to be in the form of +`/` and both and have a regular expression check that matches Github's requirements +for `username/org` and `repository name`. This requirement is in place to help with allowing multiple creators of the same plugin +types to exist such as `/nginx` and `/nginx`. These names could be based of the repo name such +as `argoproj-labs/rollouts-plugin-metric-sample-prometheus` but it is not a requirement. -There will also be a standard for naming repositories under argoproj-labs in the form of `rollouts---plugin` +There will also be a standard for naming repositories under argoproj-labs in the form of `rollouts-plugin--` where `` is say `metric`, or `trafficrouter` and `` is the software the plugin is for say nginx. ## Plugin Name -So now that we have an idea on plugin naming and repository standards let's pick a name to use for the rest of this +So now that we have an idea on plugin naming and repository standards let's pick a name to use for the rest of this documentation and call our plugin `argoproj-labs/nginx`. This name will be used in a few different spots the first is the config map that your plugin users will need to configure. @@ -134,17 +134,17 @@ type TrafficRouterPlugin interface { ## Plugin Init Function -Each plugin interface has a `InitPlugin` function, this function is called when the plugin is first started up and is only called -once per startup. The `InitPlugin` function is used as a means to initialize the plugin it gives you the plugin author the ability -to either set up a client for a specific metrics provider or in the case of a traffic router construct a client or informer +Each plugin interface has a `InitPlugin` function, this function is called when the plugin is first started up and is only called +once per startup. The `InitPlugin` function is used as a means to initialize the plugin it gives you the plugin author the ability +to either set up a client for a specific metrics provider or in the case of a traffic router construct a client or informer for kubernetes api. The one thing to note about this though is because these calls happen over RPC the plugin author should not depend on state being stored in the plugin struct as it will not be persisted between calls. ## Kubernetes RBAC The plugin runs as a child process of the rollouts controller and as such it will inherit the same RBAC permissions as the -controller. This means that the service account for the rollouts controller will need the correct permissions for the plugin -to function. This might mean instructing users to create a role and role binding to the standard rollouts service account +controller. This means that the service account for the rollouts controller will need the correct permissions for the plugin +to function. This might mean instructing users to create a role and role binding to the standard rollouts service account for the plugin to use. This will probably affect traffic router plugins more than metrics plugins. ## Sample Plugins @@ -152,4 +152,4 @@ for the plugin to use. This will probably affect traffic router plugins more tha There are two sample plugins within the argo-rollouts repo that you can use as a reference for creating your own plugin. * [Sample Metrics Plugin](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/sample-metrics-plugin) -* [Sample Traffic Router Plugin](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/sample-trafficrouter-plugin) \ No newline at end of file +* [Sample Traffic Router Plugin](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/sample-trafficrouter-plugin) From e7e45f7dffabe19e7a35609620320f3f975ffaf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Apr 2023 00:43:01 -0500 Subject: [PATCH 019/159] chore(deps): bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 (#2721) chore(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.14.0 to 1.15.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.14.0...v1.15.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 08c086a04c..3f1d99f46c 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.15.0 github.com/prometheus/client_model v0.3.0 github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 @@ -157,7 +157,7 @@ require ( github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/russross/blackfriday v1.6.0 // indirect github.com/slack-go/slack v0.12.1 // indirect github.com/spf13/pflag v1.0.5 // indirect diff --git a/go.sum b/go.sum index 9cb34f6be0..653ab25fa8 100644 --- a/go.sum +++ b/go.sum @@ -616,8 +616,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -796,8 +796,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= +github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -822,8 +822,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= From ddce67165b4832001d2ccb6d68798a9580ea9afe Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Thu, 20 Apr 2023 08:31:12 +0800 Subject: [PATCH 020/159] chore: Update test and related docs for plugin name standard (#2728) * Update test and related docs for plugin name standard Signed-off-by: Wilson Wu * Add DaoCloud into USERS Signed-off-by: Wilson Wu * fix ordering and one missing import Signed-off-by: zachaller * fix ordering and one missing import Signed-off-by: zachaller --------- Signed-off-by: Wilson Wu Signed-off-by: zachaller Co-authored-by: zachaller --- Makefile | 6 +++--- USERS.md | 1 + docs/plugins.md | 4 ++-- .../internal/plugin/plugin.go | 0 .../internal/plugin/plugin_test.go | 0 .../main.go | 2 +- .../internal/plugin/plugin.go | 0 .../main.go | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) rename test/cmd/{sample-metrics-plugin => metrics-plugin-sample}/internal/plugin/plugin.go (100%) rename test/cmd/{sample-metrics-plugin => metrics-plugin-sample}/internal/plugin/plugin_test.go (100%) rename test/cmd/{sample-metrics-plugin => metrics-plugin-sample}/main.go (92%) rename test/cmd/{sample-trafficrouter-plugin => trafficrouter-plugin-sample}/internal/plugin/plugin.go (100%) rename test/cmd/{sample-trafficrouter-plugin => trafficrouter-plugin-sample}/main.go (95%) diff --git a/Makefile b/Makefile index 7133f0f9b4..2ebb183635 100644 --- a/Makefile +++ b/Makefile @@ -225,7 +225,7 @@ test-e2e: install-devtools-local .PHONY: test-unit test-unit: install-devtools-local - ${DIST_DIR}/gotestsum --junitfile=junit.xml --format=testname -- -covermode=count -coverprofile=coverage.out `go list ./... | grep -v ./test/cmd/sample-metrics-plugin` + ${DIST_DIR}/gotestsum --junitfile=junit.xml --format=testname -- -covermode=count -coverprofile=coverage.out `go list ./... | grep -v ./test/cmd/metrics-plugin-sample` .PHONY: coverage @@ -284,9 +284,9 @@ checksums: # https://www.jetbrains.com/help/go/attach-to-running-go-processes-with-debugger.html .PHONY: build-sample-metric-plugin-debug build-sample-metric-plugin-debug: - go build -gcflags="all=-N -l" -o metric-plugin test/cmd/sample-metrics-plugin/main.go + go build -gcflags="all=-N -l" -o metric-plugin test/cmd/metrics-plugin-sample/main.go .PHONY: build-sample-traffic-plugin-debug build-sample-traffic-plugin-debug: - go build -gcflags="all=-N -l" -o traffic-plugin test/cmd/sample-trafficrouter-plugin/main.go + go build -gcflags="all=-N -l" -o traffic-plugin test/cmd/trafficrouter-plugin-sample/main.go diff --git a/USERS.md b/USERS.md index 73b47327c2..5fd37e15ed 100644 --- a/USERS.md +++ b/USERS.md @@ -11,6 +11,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Calm](https://www.calm.com/) 1. [Codefresh](https://codefresh.io/) 1. [Credit Karma](https://creditkarma.com/) +1. [DaoCloud](https://daocloud.io) 1. [Databricks](https://github.com/databricks) 1. [Devtron Labs](https://github.com/devtron-labs/devtron) 1. [Farfetch](https://www.farfetch.com/) diff --git a/docs/plugins.md b/docs/plugins.md index ce3a1770ee..f58e64ddbb 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -151,5 +151,5 @@ for the plugin to use. This will probably affect traffic router plugins more tha There are two sample plugins within the argo-rollouts repo that you can use as a reference for creating your own plugin. -* [Sample Metrics Plugin](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/sample-metrics-plugin) -* [Sample Traffic Router Plugin](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/sample-trafficrouter-plugin) +* [Metrics Plugin Sample](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/metrics-plugin-sample) +* [Traffic Router Plugin Sample](https://github.com/argoproj/argo-rollouts/tree/master/test/cmd/trafficrouter-plugin-sample) diff --git a/test/cmd/sample-metrics-plugin/internal/plugin/plugin.go b/test/cmd/metrics-plugin-sample/internal/plugin/plugin.go similarity index 100% rename from test/cmd/sample-metrics-plugin/internal/plugin/plugin.go rename to test/cmd/metrics-plugin-sample/internal/plugin/plugin.go diff --git a/test/cmd/sample-metrics-plugin/internal/plugin/plugin_test.go b/test/cmd/metrics-plugin-sample/internal/plugin/plugin_test.go similarity index 100% rename from test/cmd/sample-metrics-plugin/internal/plugin/plugin_test.go rename to test/cmd/metrics-plugin-sample/internal/plugin/plugin_test.go diff --git a/test/cmd/sample-metrics-plugin/main.go b/test/cmd/metrics-plugin-sample/main.go similarity index 92% rename from test/cmd/sample-metrics-plugin/main.go rename to test/cmd/metrics-plugin-sample/main.go index 703d823e22..fdd01e6ba3 100644 --- a/test/cmd/sample-metrics-plugin/main.go +++ b/test/cmd/metrics-plugin-sample/main.go @@ -2,7 +2,7 @@ package main import ( "github.com/argoproj/argo-rollouts/metricproviders/plugin/rpc" - "github.com/argoproj/argo-rollouts/test/cmd/sample-metrics-plugin/internal/plugin" + "github.com/argoproj/argo-rollouts/test/cmd/metrics-plugin-sample/internal/plugin" goPlugin "github.com/hashicorp/go-plugin" log "github.com/sirupsen/logrus" ) diff --git a/test/cmd/sample-trafficrouter-plugin/internal/plugin/plugin.go b/test/cmd/trafficrouter-plugin-sample/internal/plugin/plugin.go similarity index 100% rename from test/cmd/sample-trafficrouter-plugin/internal/plugin/plugin.go rename to test/cmd/trafficrouter-plugin-sample/internal/plugin/plugin.go diff --git a/test/cmd/sample-trafficrouter-plugin/main.go b/test/cmd/trafficrouter-plugin-sample/main.go similarity index 95% rename from test/cmd/sample-trafficrouter-plugin/main.go rename to test/cmd/trafficrouter-plugin-sample/main.go index 37efcc839b..05122fbe0f 100644 --- a/test/cmd/sample-trafficrouter-plugin/main.go +++ b/test/cmd/trafficrouter-plugin-sample/main.go @@ -4,7 +4,7 @@ import ( "strings" rolloutsPlugin "github.com/argoproj/argo-rollouts/rollout/trafficrouting/plugin/rpc" - "github.com/argoproj/argo-rollouts/test/cmd/sample-trafficrouter-plugin/internal/plugin" + "github.com/argoproj/argo-rollouts/test/cmd/trafficrouter-plugin-sample/internal/plugin" goPlugin "github.com/hashicorp/go-plugin" log "github.com/sirupsen/logrus" ) From 142a03a01c993cca2f209196a1800d394684eb31 Mon Sep 17 00:00:00 2001 From: Remington Breeze Date: Fri, 21 Apr 2023 15:07:13 -0700 Subject: [PATCH 021/159] feat(dashboard): Refresh Rollouts dashboard UI (#2723) * feat: Refresh Rollouts dashboard Signed-off-by: Remington Breeze * rearrange individual rollout view Signed-off-by: Remington Breeze * fix letter L bug Signed-off-by: Remington Breeze * fix single namespace display Signed-off-by: Remington Breeze * bug fixes Signed-off-by: Remington Breeze * remove all dependencies on argo-ui/v2 Signed-off-by: Remington Breeze * feat: Refresh Rollouts dashboard Signed-off-by: Remington Breeze * rearrange individual rollout view Signed-off-by: Remington Breeze * fix letter L bug Signed-off-by: Remington Breeze * fix single namespace display Signed-off-by: Remington Breeze * bug fixes Signed-off-by: Remington Breeze * remove all dependencies on argo-ui/v2 Signed-off-by: Remington Breeze * fix: make logo image path relative Signed-off-by: Remington Breeze --------- Signed-off-by: Remington Breeze --- ui/package.json | 8 +- ui/src/app/App.scss | 4 +- ui/src/app/App.tsx | 108 ++- .../confirm-button/confirm-button.tsx | 72 ++ .../ellipsis-middle/ellipsis-middle.tsx | 13 + ui/src/app/components/header/header.scss | 47 +- ui/src/app/components/header/header.tsx | 67 +- .../app/components/info-item/info-item.scss | 80 ++ ui/src/app/components/info-item/info-item.tsx | 61 ++ ui/src/app/components/pods/pods.scss | 5 +- ui/src/app/components/pods/pods.tsx | 209 +++--- .../rollout-actions/rollout-actions.tsx | 52 +- ui/src/app/components/rollout/containers.tsx | 69 +- ui/src/app/components/rollout/revision.tsx | 73 +- ui/src/app/components/rollout/rollout.scss | 87 +-- ui/src/app/components/rollout/rollout.tsx | 214 +++--- .../rollouts-list/rollouts-list.scss | 59 +- .../rollouts-list/rollouts-list.tsx | 180 ++--- .../components/status-icon/status-icon.tsx | 10 +- ui/src/assets/images/argologo.svg | 1 + ui/src/config/theme.ts | 15 + ui/yarn.lock | 683 +++++++++++++++++- 22 files changed, 1521 insertions(+), 596 deletions(-) create mode 100644 ui/src/app/components/confirm-button/confirm-button.tsx create mode 100644 ui/src/app/components/ellipsis-middle/ellipsis-middle.tsx create mode 100644 ui/src/app/components/info-item/info-item.scss create mode 100644 ui/src/app/components/info-item/info-item.tsx create mode 100644 ui/src/assets/images/argologo.svg create mode 100644 ui/src/config/theme.ts diff --git a/ui/package.json b/ui/package.json index aaaf3de4cb..fac0a758f3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -3,6 +3,10 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "antd": "^5.4.2", "argo-ui": "git+https://github.com/argoproj/argo-ui.git", "classnames": "2.2.6", "isomorphic-fetch": "^3.0.0", @@ -16,7 +20,7 @@ "react-keyhooks": "^0.2.3", "react-router-dom": "5.2.0", "rxjs": "^6.6.6", - "typescript": "4.3.5", + "typescript": "^5.0.4", "web-vitals": "^1.0.1" }, "scripts": { @@ -69,4 +73,4 @@ "resolutions": { "@types/react": "16.9.3" } -} \ No newline at end of file +} diff --git a/ui/src/app/App.scss b/ui/src/app/App.scss index ac371917d0..0254cb4ac1 100644 --- a/ui/src/app/App.scss +++ b/ui/src/app/App.scss @@ -27,7 +27,7 @@ html { } a { - color: inherit; + color: inherit !important; text-decoration: none; } @@ -38,7 +38,7 @@ a { .rollouts { height: 100%; overflow-y: auto; - font-family: 'Heebo', sans-serif; + font-family: system-ui, sans-serif; background-color: $argo-color-gray-3; &--dark { diff --git a/ui/src/app/App.tsx b/ui/src/app/App.tsx index b1d28fa5d5..60ba5419c6 100644 --- a/ui/src/app/App.tsx +++ b/ui/src/app/App.tsx @@ -1,8 +1,7 @@ -import {ThemeDiv, ThemeProvider} from 'argo-ui/v2'; import {Header} from './components/header/header'; import {createBrowserHistory} from 'history'; import * as React from 'react'; -import {Key, KeybindingContext, KeybindingProvider} from 'react-keyhooks'; +import {KeybindingProvider} from 'react-keyhooks'; import {Route, Router, Switch} from 'react-router-dom'; import './App.scss'; import {NamespaceContext, RolloutAPI} from './shared/context/api'; @@ -10,46 +9,39 @@ import {Modal} from './components/modal/modal'; import {Rollout} from './components/rollout/rollout'; import {RolloutsList} from './components/rollouts-list/rollouts-list'; import {Shortcut, Shortcuts} from './components/shortcuts/shortcuts'; +import {ConfigProvider} from 'antd'; +import {theme} from '../config/theme'; const bases = document.getElementsByTagName('base'); const base = bases.length > 0 ? bases[0].getAttribute('href') || '/' : '/'; export const history = createBrowserHistory({basename: base}); const Page = (props: {path: string; component: React.ReactNode; exact?: boolean; shortcuts?: Shortcut[]; changeNamespace: (val: string) => void}) => { - const {useKeybinding} = React.useContext(KeybindingContext); const [showShortcuts, setShowShortcuts] = React.useState(false); - useKeybinding( - [Key.SHIFT, Key.H], - () => { - if (props.shortcuts) { - setShowShortcuts(!showShortcuts); - } - return false; - }, - true - ); return ( - - {showShortcuts && ( - setShowShortcuts(false)}> - - - )} - - -
{ - if (props.shortcuts) { - setShowShortcuts(true); - } - }} - /> - {props.component} - - - + +
+ {showShortcuts && ( + setShowShortcuts(false)}> + + + )} + + +
{ + if (props.shortcuts) { + setShowShortcuts(true); + } + }} + /> + {props.component} + + +
+
); }; @@ -84,31 +76,29 @@ const App = () => { }; return ( - - {namespace && ( - - - - - } - shortcuts={[ - {key: '/', description: 'Search'}, - {key: 'TAB', description: 'Search, navigate search items'}, - {key: ['fa-arrow-left', 'fa-arrow-right', 'fa-arrow-up', 'fa-arrow-down'], description: 'Navigate rollouts list', icon: true}, - {key: ['SHIFT', 'H'], description: 'Show help menu', combo: true}, - ]} - changeNamespace={changeNamespace} - /> - } changeNamespace={changeNamespace} /> - - - - - )} - + namespace && ( + + + + + } + shortcuts={[ + {key: '/', description: 'Search'}, + {key: 'TAB', description: 'Search, navigate search items'}, + {key: ['fa-arrow-left', 'fa-arrow-right', 'fa-arrow-up', 'fa-arrow-down'], description: 'Navigate rollouts list', icon: true}, + {key: ['SHIFT', 'H'], description: 'Show help menu', combo: true}, + ]} + changeNamespace={changeNamespace} + /> + } changeNamespace={changeNamespace} /> + + + + + ) ); }; diff --git a/ui/src/app/components/confirm-button/confirm-button.tsx b/ui/src/app/components/confirm-button/confirm-button.tsx new file mode 100644 index 0000000000..4dd4f37e7c --- /dev/null +++ b/ui/src/app/components/confirm-button/confirm-button.tsx @@ -0,0 +1,72 @@ +import * as React from 'react'; + +import {Button, Popconfirm, Tooltip} from 'antd'; +import {ButtonProps} from 'antd/es/button/button'; +import {useState} from 'react'; +import { TooltipPlacement } from 'antd/es/tooltip'; + +interface ConfirmButtonProps extends ButtonProps { + skipconfirm?: boolean; + tooltip?: string; + placement?: TooltipPlacement; +} + +export const ConfirmButton = (props: ConfirmButtonProps) => { + const [open, setOpen] = useState(false); + const [buttonProps, setButtonProps] = useState(props); + + React.useEffect(() => { + const tmp = {...props}; + delete tmp.skipconfirm; + delete tmp.children; + delete tmp.onClick; + setButtonProps(tmp); + }, [props]); + + const confirm = () => { + setOpen(false); + if (props.onClick) { + props.onClick(null); + } + }; + + const cancel = () => { + setOpen(false); + }; + + const handleOpenChange = (newOpen: boolean) => { + if (!newOpen) { + setOpen(newOpen); + return; + } + if (props.skipconfirm) { + confirm(); // next step + } else { + setOpen(newOpen); + } + }; + + return ( +
{ + e.stopPropagation(); + e.preventDefault(); + }}> + +
+ + + +
+
+
+ ); +}; diff --git a/ui/src/app/components/ellipsis-middle/ellipsis-middle.tsx b/ui/src/app/components/ellipsis-middle/ellipsis-middle.tsx new file mode 100644 index 0000000000..4eba37f8b6 --- /dev/null +++ b/ui/src/app/components/ellipsis-middle/ellipsis-middle.tsx @@ -0,0 +1,13 @@ +import * as React from 'react'; +import {Typography} from 'antd'; + +const {Text} = Typography; +export const EllipsisMiddle: React.FC<{suffixCount: number; children: string; style: React.CSSProperties}> = ({suffixCount, children, style}) => { + const start = children.slice(0, children.length - suffixCount).trim(); + const suffix = children.slice(-suffixCount).trim(); + return ( + + {start} + + ); +}; diff --git a/ui/src/app/components/header/header.scss b/ui/src/app/components/header/header.scss index 395271d8f2..b1f48904a6 100644 --- a/ui/src/app/components/header/header.scss +++ b/ui/src/app/components/header/header.scss @@ -2,13 +2,12 @@ .rollouts-header { display: flex; - background: $slate; + background: #0f2733; color: white; align-items: center; padding: 10px 0; &__brand { - color: $shine; display: flex; align-items: center; text-decoration: none; @@ -16,44 +15,18 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; - } - - &__welcome { - position: absolute; - transform-origin: left; - display: block; - overflow: hidden; - width: 174px; - white-space: nowrap; - transition: transform 1s ease 1s, opacity 1s ease; + margin-left: 10px; } &__title { - position: absolute; - transform: translateX(174px); - transition: transform 500ms ease 750ms; display: flex; align-items: center; - } - - h1 { - position: relative; + color: white !important; + font-weight: 600; font-size: 22px; - font-weight: 400; - margin: 0; - display: flex; - align-items: center; - } - - h2 { - font-size: 18px; - color: $sherbert; - margin: 0; - margin-left: 10px; - flex-grow: 1; - white-space: nowrap; + width: 200px; } - + &__info { margin-left: auto; display: flex; @@ -61,13 +34,11 @@ } &__label { color: $shine; - margin: 0 15px; margin: auto; - padding: 5px; + font-size: 10px; + font-weight: 600; } &__namespace { - color: black; - display: flex; - position: relative; + margin: 0 20px; } } diff --git a/ui/src/app/components/header/header.tsx b/ui/src/app/components/header/header.tsx index 3c3eba392e..e267822108 100644 --- a/ui/src/app/components/header/header.tsx +++ b/ui/src/app/components/header/header.tsx @@ -1,18 +1,19 @@ import * as React from 'react'; -import {ActionButton, Brand, InfoItemRow, ThemeToggle, Tooltip, Header as GenericHeader, Autocomplete, ThemeDiv} from 'argo-ui/v2'; import {useParams} from 'react-router'; import {NamespaceContext, RolloutAPIContext} from '../../shared/context/api'; import './header.scss'; import {Link, useHistory} from 'react-router-dom'; +import {AutoComplete, Button, Input, Tooltip} from 'antd'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faBook, faKeyboard} from '@fortawesome/free-solid-svg-icons'; -const Logo = () => Argo Logo; +const Logo = () => Argo Logo; export const Header = (props: {pageHasShortcuts: boolean; changeNamespace: (val: string) => void; showHelp: () => void}) => { const history = useHistory(); const namespaceInfo = React.useContext(NamespaceContext); - const {name} = useParams<{name: string}>(); const {namespace} = useParams<{namespace: string}>(); const api = React.useContext(RolloutAPIContext); const [version, setVersion] = React.useState('v?'); @@ -25,52 +26,54 @@ export const Header = (props: {pageHasShortcuts: boolean; changeNamespace: (val: getVersion(); }, []); React.useEffect(() => { - if (namespace && namespace != namespaceInfo.namespace) { - props.changeNamespace(namespace); - setNsInput(namespace); - } + if (namespace && namespace != namespaceInfo.namespace) { + props.changeNamespace(namespace); + setNsInput(namespace); + } }, []); return ( - - - } /> +
+ + +
+
+ Argo Text Logo +
+
Rollouts {version}
+
{props.pageHasShortcuts && ( - - + +
- +
); }; diff --git a/ui/src/app/components/info-item/info-item.scss b/ui/src/app/components/info-item/info-item.scss new file mode 100644 index 0000000000..0cd040dde6 --- /dev/null +++ b/ui/src/app/components/info-item/info-item.scss @@ -0,0 +1,80 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +.info-item { + background-color: $argo-color-gray-4; + border-radius: 3px; + border: 1px solid $argo-color-gray-5; + padding: 5px 7px; + margin-right: 5px; + color: $argo-color-gray-8; + display: flex; + align-items: center; + min-width: 0; + + &--lightweight { + border: none; + background: none; + font-weight: 500; + padding-left: 0; + padding-right: 0; + } + + &--dark { + background-color: $fog; + border: 1px solid $silver-lining; + color: $dull-shine; + } + + &--colored { + background-color: $sherbert; + border: 1px solid $sherbert; + color: white; + } + + &--dark#{&}--colored { + background-color: $spray-tan; + border: 1px solid $sherbert; + color: white; + } + + &--canary { + background-color: $canary; + border: 1px solid $canary; + color: $space; + } + + &--bluegreen { + background-color: $sea; + border: 1px solid $sea; + color: white; + } + + &--monospace { + font-family: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 'Fira Mono', + 'Droid Sans Mono', 'Courier New', monospace; + font-size: 14px; + } + + &--row { + display: flex; + align-items: center; + flex-grow: 1; + label { + margin-right: auto; + padding-right: 5px; + } + .info-item { + margin: 0.25em 0; + margin-left: 5px; + } + + &__container { + margin-left: auto; + display: flex; + min-width: 0; + padding-left: 25px; + flex-wrap: wrap; + justify-content: flex-end; + } + } +} diff --git a/ui/src/app/components/info-item/info-item.tsx b/ui/src/app/components/info-item/info-item.tsx new file mode 100644 index 0000000000..7e7bf8e617 --- /dev/null +++ b/ui/src/app/components/info-item/info-item.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import './info-item.scss'; +import { Tooltip } from 'antd'; + +export enum InfoItemKind { + Default = 'default', + Colored = 'colored', + Monospace = 'monospace', + Canary = 'canary', + BlueGreen = 'bluegreen', +} + +export interface InfoItemProps { + content?: string; + icon?: string; + style?: React.CSSProperties; + kind?: InfoItemKind; + truncate?: boolean; + lightweight?: boolean; +} + +/** + * Displays a small piece encapsulated piece of data + */ +export const InfoItem = (props: InfoItemProps) => { + const truncateStyle = props.truncate ? {overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis'} : {}; + const item = ( +
+ {props.icon && ( + + + + )} +
{props.content}
+
+ ); + return props.truncate ? {item} : item; +}; + +/** + * Displays a right justified InfoItem (or multiple InfoItems) and a left justfied label + */ +export const InfoItemRow = (props: {label: string | React.ReactNode; items?: InfoItemProps | InfoItemProps[]; lightweight?: boolean}) => { + let {label, items} = props; + let itemComponents = null; + if (!Array.isArray(items)) { + items = [items]; + } + itemComponents = items.map((c, i) => ); + + return ( +
+ {props.label && ( +
+ +
+ )} + {props.items &&
{itemComponents}
} +
+ ); +}; diff --git a/ui/src/app/components/pods/pods.scss b/ui/src/app/components/pods/pods.scss index ee3121b111..b55f08c9d6 100644 --- a/ui/src/app/components/pods/pods.scss +++ b/ui/src/app/components/pods/pods.scss @@ -7,6 +7,7 @@ $POD_SIZE: 30px; font-size: 16px; font-weight: 500; display: flex; + max-width: 100%; align-items: center; &__tags { margin-left: auto; @@ -25,10 +26,6 @@ $POD_SIZE: 30px; .pod-icon { margin: 3px; } - &--dark { - border-color: $silver-lining; - background-color: $space; - } } } diff --git a/ui/src/app/components/pods/pods.tsx b/ui/src/app/components/pods/pods.tsx index c9be978570..c3e5fecb32 100644 --- a/ui/src/app/components/pods/pods.tsx +++ b/ui/src/app/components/pods/pods.tsx @@ -1,10 +1,14 @@ -import {Menu, ThemeDiv, Tooltip, WaitFor, InfoItem} from 'argo-ui/v2'; import * as React from 'react'; import * as moment from 'moment'; import {Duration, Ticker} from 'argo-ui'; import {RolloutReplicaSetInfo} from '../../../models/rollout/generated'; import {ReplicaSetStatus, ReplicaSetStatusIcon} from '../status-icon/status-icon'; import './pods.scss'; +import {Dropdown, MenuProps, Tooltip} from 'antd'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {IconDefinition, faCheck, faCircleNotch, faClipboard, faExclamationTriangle, faQuestionCircle, faTimes} from '@fortawesome/free-solid-svg-icons'; +import {EllipsisMiddle} from '../ellipsis-middle/ellipsis-middle'; +import {InfoItem} from '../info-item/info-item'; export enum PodStatus { Pending = 'pending', @@ -36,52 +40,6 @@ export const ParsePodStatus = (status: string): PodStatus => { } }; -export const PodIcon = (props: {status: string; customIcon?: string}) => { - const {status, customIcon} = props; - let icon; - let spin = false; - if (status.startsWith('Init:')) { - icon = 'fa-circle-notch'; - spin = true; - } - if (status.startsWith('Signal:') || status.startsWith('ExitCode:')) { - icon = 'fa-times'; - } - if (status.endsWith('Error') || status.startsWith('Err')) { - icon = 'fa-exclamation-triangle'; - } - - const className = ParsePodStatus(status); - - if (customIcon) icon = customIcon; - else - switch (className) { - case PodStatus.Pending: - icon = 'fa-circle-notch'; - spin = true; - break; - case PodStatus.Success: - icon = 'fa-check'; - break; - case PodStatus.Failed: - icon = 'fa-times'; - break; - case PodStatus.Warning: - icon = 'fa-exclamation-triangle'; - break; - default: - spin = false; - icon = 'fa-question-circle'; - break; - } - - return ( - - - - ); -}; - export const ReplicaSets = (props: {replicaSets: RolloutReplicaSetInfo[]; showRevisions?: boolean}) => { const {replicaSets} = props; if (!replicaSets || replicaSets.length < 1) { @@ -106,60 +64,119 @@ export const ReplicaSets = (props: {replicaSets: RolloutReplicaSetInfo[]; showRe export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boolean}) => { const rsName = props.rs.objectMeta.name; return ( - +
{rsName && ( - - {rsName} - {props.showRevision &&
Revision {props.rs.revision}
} - {props.rs.scaleDownDeadline && ( -
- - {(now) => { - const time = moment(props.rs.scaleDownDeadline).diff(now.toDate(), 'second'); - return time <= 0 ? null : ( - - Scaledown in - - }> - ) as any} icon='fa fa-clock'> - - ); - }} - -
- )} -
+ +
+ + {rsName} + + + {props.showRevision &&
Revision {props.rs.revision}
} + {props.rs.scaleDownDeadline && ( +
+ + {(now) => { + const time = moment(props.rs.scaleDownDeadline).diff(now.toDate(), 'second'); + return time <= 0 ? null : ( + + Scaledown in + + }> + ) as any} icon='fa fa-clock'> + + ); + }} + +
+ )} +
+
)} {props.rs.pods && props.rs.pods.length > 0 && ( - - - {props.rs.pods.map((pod, i) => ( - -
Status: {pod.status}
-
{pod.objectMeta?.name}
-
- } - /> - ))} - -
+
+ {(props.rs?.pods || []).map((pod, i) => ( + +
Status: {pod.status}
+
{pod.objectMeta?.name}
+
+ } + /> + ))} + )} - + ); }; -export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; status: string; tooltip: React.ReactNode; customIcon?: string}) => ( - navigator.clipboard.writeText(name), icon: 'fa-clipboard'}]}> - - - - -); +const CopyMenu = (name: string): MenuProps['items'] => { + return [ + { + key: 1, + label: ( +
navigator.clipboard.writeText(name)}> + Copy Name +
+ ), + }, + ]; +}; + +export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; status: string; tooltip: React.ReactNode; customIcon?: IconDefinition}) => { + let icon: IconDefinition; + let spin = false; + if (status.startsWith('Init:')) { + icon = faCircleNotch; + spin = true; + } + if (status.startsWith('Signal:') || status.startsWith('ExitCode:')) { + icon = faTimes; + } + if (status.endsWith('Error') || status.startsWith('Err')) { + icon = faExclamationTriangle; + } + + const className = ParsePodStatus(status); + + if (customIcon) { + icon = customIcon; + } else { + switch (className) { + case PodStatus.Pending: + icon = faCircleNotch; + spin = true; + break; + case PodStatus.Success: + icon = faCheck; + break; + case PodStatus.Failed: + icon = faTimes; + break; + case PodStatus.Warning: + icon = faExclamationTriangle; + break; + default: + spin = false; + icon = faQuestionCircle; + break; + } + } + + return ( + + +
+ +
+
+
+ ); +}; diff --git a/ui/src/app/components/rollout-actions/rollout-actions.tsx b/ui/src/app/components/rollout-actions/rollout-actions.tsx index 283af8c4ca..94a4b289f2 100644 --- a/ui/src/app/components/rollout-actions/rollout-actions.tsx +++ b/ui/src/app/components/rollout-actions/rollout-actions.tsx @@ -2,8 +2,11 @@ import * as React from 'react'; import {RolloutInfo} from '../../../models/rollout/rollout'; import {NamespaceContext, RolloutAPIContext} from '../../shared/context/api'; import {formatTimestamp} from '../../shared/utils/utils'; -import {ActionButton, ActionButtonProps} from 'argo-ui/v2'; import {RolloutStatus} from '../status-icon/status-icon'; +import {ConfirmButton} from '../confirm-button/confirm-button'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faArrowCircleUp, faChevronCircleUp, faExclamationCircle, faRedoAlt, faSync} from '@fortawesome/free-solid-svg-icons'; +import {IconProp} from '@fortawesome/fontawesome-svg-core'; export enum RolloutAction { Restart = 'Restart', @@ -13,19 +16,28 @@ export enum RolloutAction { PromoteFull = 'PromoteFull', } +interface ActionData { + label: string; + icon: IconProp; + action: (body: any, namespace: string, name: string) => Promise; + tooltip?: string; + disabled?: boolean; + shouldConfirm?: boolean; +} + export const RolloutActionButton = (props: {action: RolloutAction; rollout: RolloutInfo; callback?: Function; indicateLoading: boolean; disabled?: boolean}) => { const api = React.useContext(RolloutAPIContext); const namespaceCtx = React.useContext(NamespaceContext); const restartedAt = formatTimestamp(props.rollout.restartedAt || ''); - const isDeploying = props.rollout.status === RolloutStatus.Progressing || props.rollout.status === RolloutStatus.Paused + const isDeploying = props.rollout.status === RolloutStatus.Progressing || props.rollout.status === RolloutStatus.Paused; - const actionMap = new Map([ + const actionMap = new Map([ [ RolloutAction.Restart, { label: 'RESTART', - icon: 'fa-sync', + icon: faSync, action: api.rolloutServiceRestartRollout, tooltip: restartedAt === 'Never' ? 'Never restarted' : `Last restarted ${restartedAt}`, shouldConfirm: true, @@ -35,7 +47,7 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll RolloutAction.Retry, { label: 'RETRY', - icon: 'fa-redo-alt', + icon: faRedoAlt, action: api.rolloutServiceRetryRollout, disabled: props.rollout.status !== RolloutStatus.Degraded, shouldConfirm: true, @@ -45,7 +57,7 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll RolloutAction.Abort, { label: 'ABORT', - icon: 'fa-exclamation-circle', + icon: faExclamationCircle, action: api.rolloutServiceAbortRollout, disabled: !isDeploying, shouldConfirm: true, @@ -55,7 +67,7 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll RolloutAction.Promote, { label: 'PROMOTE', - icon: 'fa-chevron-circle-up', + icon: faChevronCircleUp, action: api.rolloutServicePromoteRollout, body: {full: false}, disabled: !isDeploying, @@ -66,7 +78,7 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll RolloutAction.PromoteFull, { label: 'PROMOTE-FULL', - icon: 'fa-arrow-circle-up', + icon: faArrowCircleUp, action: api.rolloutServicePromoteRollout, body: {full: true}, disabled: !isDeploying, @@ -77,17 +89,27 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll const ap = actionMap.get(props.action); + const [loading, setLoading] = React.useState(false); + return ( - { - ap.action(ap.body || {}, namespaceCtx.namespace, props.rollout.objectMeta?.name || ''); + { + setLoading(true); + await ap.action(ap.body || {}, namespaceCtx.namespace, props.rollout.objectMeta?.name || ''); if (props.callback) { - props.callback(); + await props.callback(); } + setLoading(false); }} - indicateLoading={props.indicateLoading} - /> + disabled={ap.disabled} + loading={loading} + tooltip={ap.tooltip} + icon={}> + {props.action} + ); }; diff --git a/ui/src/app/components/rollout/containers.tsx b/ui/src/app/components/rollout/containers.tsx index 051c8c606c..c69b30658b 100644 --- a/ui/src/app/components/rollout/containers.tsx +++ b/ui/src/app/components/rollout/containers.tsx @@ -1,7 +1,10 @@ -import {ActionButton, Autocomplete, InfoItem, ThemeDiv, useInput} from 'argo-ui/v2'; import * as React from 'react'; import {RolloutContainerInfo} from '../../../models/rollout/generated'; import {ImageInfo, ReactStatePair} from './rollout'; +import {AutoComplete, Button, Input} from 'antd'; +import {ConfirmButton} from '../confirm-button/confirm-button'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faExclamationCircle, faPencilAlt, faSave, faTimes} from '@fortawesome/free-solid-svg-icons'; interface ContainersWidgetProps { containers: RolloutContainerInfo[]; @@ -25,25 +28,28 @@ export const ContainersWidget = (props: ContainersWidgetProps) => { return (
- +
Containers - +
{interactive && (interactive?.editState[0] ? (
- { +
) : ( - setEditing(true)} style={{cursor: 'pointer', marginLeft: 'auto'}} /> + ))}
{containers.map((c, i) => ( @@ -80,12 +87,11 @@ export const ContainersWidget = (props: ContainersWidgetProps) => { /> ))} {containers.length < 2 && ( - +
- Add more containers to fill this space! - +
)}
); @@ -93,16 +99,31 @@ export const ContainersWidget = (props: ContainersWidgetProps) => { const ContainerWidget = (props: {container: RolloutContainerInfo; images: ImageInfo[]; setInput: (image: string) => void; editing: boolean}) => { const {container, editing} = props; - const [, , newImageInput] = useInput(container.image, (val) => props.setInput(val)); + const [input, setInput] = React.useState(container.image); + + const update = (val: string) => { + setInput(val); + props.setInput(val); + }; return ( -
-
{container.name}
-
+
+
{container.name}
+
{!editing ? ( - + ) : ( - img.image)} placeholder='New Image' {...newImageInput} /> + { + return {label: img.image, value: img.image}; + })} + placeholder='New Image' + value={input} + onSelect={update} + onChange={update} + /> )}
diff --git a/ui/src/app/components/rollout/revision.tsx b/ui/src/app/components/rollout/revision.tsx index f61a9229c7..e2fcd11526 100644 --- a/ui/src/app/components/rollout/revision.tsx +++ b/ui/src/app/components/rollout/revision.tsx @@ -1,4 +1,3 @@ -import {ActionButton, EffectDiv, formatTimestamp, InfoItemProps, InfoItemRow, ThemeDiv, Tooltip} from 'argo-ui/v2'; import * as React from 'react'; import {RolloutAnalysisRunInfo, RolloutExperimentInfo, RolloutReplicaSetInfo} from '../../../models/rollout/generated'; import {IconForTag} from '../../shared/utils/utils'; @@ -6,6 +5,21 @@ import {PodWidget, ReplicaSets} from '../pods/pods'; import {ImageInfo, parseImages} from './rollout'; import './rollout.scss'; import '../pods/pods.scss'; +import {ConfirmButton} from '../confirm-button/confirm-button'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faChartBar, faChevronCircleDown, faChevronCircleUp, faUndoAlt} from '@fortawesome/free-solid-svg-icons'; +import {Button, Tooltip} from 'antd'; +import moment = require('moment'); +import {InfoItemProps, InfoItemRow} from '../info-item/info-item'; + +function formatTimestamp(ts: string): string { + const inputFormat = 'YYYY-MM-DD HH:mm:ss Z z'; + const m = moment(ts, inputFormat); + if (!ts || !m.isValid()) { + return 'Never'; + } + return m.format('MMM D YYYY [at] hh:mm:ss'); +} export interface Revision { number: string; @@ -24,7 +38,7 @@ const ImageItems = (props: {images: ImageInfo[]}) => { if (imageItems.length === 0) { imageItems = []; } - return {img.image}} items={imageItems} />; + return {img.image}
} items={imageItems} />; })}
); @@ -41,31 +55,29 @@ interface RevisionWidgetProps { export const RevisionWidget = (props: RevisionWidgetProps) => { const {revision, initCollapsed} = props; const [collapsed, setCollapsed] = React.useState(initCollapsed); - const icon = collapsed ? 'fa-chevron-circle-down' : 'fa-chevron-circle-up'; + const icon = collapsed ? faChevronCircleDown : faChevronCircleUp; const images = parseImages(revision.replicaSets); + const hasPods = (revision.replicaSets || []).some((rs) => rs.pods?.length > 0); return ( - - +
+
Revision {revision.number}
{!props.current && props.rollback && ( - props.rollback(Number(revision.number))} - label='ROLLBACK' - icon='fa-undo-alt' - style={{fontSize: '13px'}} - indicateLoading - shouldConfirm - /> + props.rollback(Number(revision.number))} + type='default' + icon={} + style={{fontSize: '13px', marginRight: '10px'}}> + Rollback + )} - setCollapsed(!collapsed)}> - - + {hasPods && setCollapsed(!collapsed)} />}
- - +
+
- +
{!collapsed && ( @@ -79,7 +91,7 @@ export const RevisionWidget = (props: RevisionWidgetProps) => { )} )} - +
); }; @@ -88,7 +100,7 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { const [selection, setSelection] = React.useState(null); return ( - +
Analysis Runs
{analysisRuns.map((ar) => { @@ -97,7 +109,7 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { return (
Name: {ar.objectMeta.name} @@ -116,10 +128,9 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { className={`analysis__runs-action ${ ar.status === 'Running' ? 'analysis--pending' : ar.status === 'Successful' ? 'analysis--success' : 'analysis--failure' }`}> - (selection?.objectMeta.name === ar.objectMeta.name ? setSelection(null) : setSelection(ar))} - label={`Analysis ${temp[len - 2] + '-' + temp[len - 1]}`} - /> +
); @@ -149,13 +160,13 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => {
MetricName: {job.metricName}
} - customIcon='fa-chart-bar' + customIcon={faChartBar} /> ); })}
metric.name === selection.jobs[0].metricName) .map((metric) => { return ( @@ -212,13 +223,13 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => {
MetricName: {nonJob.metricName}
} - customIcon='fa-chart-bar' + customIcon={faChartBar} /> ); })} metric.name === selection.nonJobInfo[0].metricName) .map((metric) => { return ( @@ -260,6 +271,6 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { )} )} -
+ ); }; diff --git a/ui/src/app/components/rollout/rollout.scss b/ui/src/app/components/rollout/rollout.scss index 88819de47b..ad6247c478 100644 --- a/ui/src/app/components/rollout/rollout.scss +++ b/ui/src/app/components/rollout/rollout.scss @@ -1,26 +1,13 @@ -@import 'node_modules/argo-ui/v2/styles/colors'; +@import "node_modules/argo-ui/v2/styles/colors"; .revision { padding: 15px; margin-bottom: 1em; background: none; - &__background { - background: $argo-color-gray-2; - border: 1px solid $argo-color-gray-4; - border-radius: 5px; - } - - &--dark > &__background { - border: none; - background: $slate; - } - - &:hover > &__background { - transform: scale(1.02); - box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); - } - + background: $argo-color-gray-1; + border-radius: 5px; + &__header { display: flex; align-items: center; @@ -40,39 +27,36 @@ } .steps { - width: 250px; + width: 300px; flex-shrink: 0; - max-height: 500px; overflow-y: auto; &__step { padding: 15px 18px; - &__background { - border-radius: 10px; - border: 1px solid $argo-color-gray-4; - &--dark { - border: 1px solid $silver-lining; - } + border-radius: 10px; + border: 1px solid $argo-color-gray-4; + &--dark { + border: 1px solid $silver-lining; } - &:hover > &__background { + &:hover { border: 1px solid $sherbert; } - &--complete > &__background { + &--complete { border: 2px solid $argo-success-color; } - &--complete:hover > &__background { + &--complete:hover { border: 2px solid $argo-success-color; } - &--current > &__background { + &--current { border: 2px solid $sherbert; } - &--current:hover > &__background { + &--current:hover { border: 2px solid $sherbert; } @@ -105,6 +89,7 @@ display: flex; align-items: center; justify-content: space-between; + font-weight: 600; } &-title { @@ -112,20 +97,6 @@ padding-bottom: 4px; font-size: 14px; } - - &-value { - font-weight: 600; - padding-bottom: 4px; - border-bottom: 1px solid $argo-color-gray-4; - &:last-child { - padding-bottom: -8px; - border-bottom: none; - } - } - } - - &:hover > &__background { - transform: scale(1.02); } } @@ -163,9 +134,8 @@ } .info { - border: 1px solid $argo-color-gray-4; border-radius: 5px; - padding: 20px; + padding: 15px; background-color: white; height: max-content; box-sizing: border-box; @@ -217,27 +187,23 @@ } .action-button { - font-size: '10px'; + font-size: "10px"; line-height: 1; - border: '1px solid'; - padding: '8px 8px 8px 10px'; - border-radius: '12px'; - color: 'white'; + border: "1px solid"; + padding: "8px 8px 8px 10px"; + border-radius: "12px"; + color: "white"; margin-top: 4px; } &.analysis--success .action-button:hover { - .action-button__background { - background-color: seagreen; - border-color: seagreen; - } + background-color: seagreen; + border-color: seagreen; } &.analysis--failure .action-button:hover { - .action-button__background { - background-color: red; - border-color: red; - } + background-color: red; + border-color: red; } } } @@ -362,6 +328,7 @@ &__toolbar { box-sizing: border-box; font-size: 14px; + font-weight: 600; display: flex; align-items: center; padding: 0 10px; @@ -386,7 +353,7 @@ } &__revisions { - width: 550px; + width: 100%; } &__body { diff --git a/ui/src/app/components/rollout/rollout.tsx b/ui/src/app/components/rollout/rollout.tsx index 77d6607ac4..91b6c0a9d8 100644 --- a/ui/src/app/components/rollout/rollout.tsx +++ b/ui/src/app/components/rollout/rollout.tsx @@ -1,8 +1,6 @@ -import {EffectDiv, InfoItemKind, InfoItemRow, Spinner, ThemeDiv, WaitFor} from 'argo-ui/v2'; import * as React from 'react'; import {Helmet} from 'react-helmet'; -import {Key, KeybindingContext} from 'react-keyhooks'; -import {useHistory, useParams} from 'react-router-dom'; +import {useParams} from 'react-router-dom'; import { GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStep, GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch, @@ -21,6 +19,9 @@ import {ContainersWidget} from './containers'; import {Revision, RevisionWidget} from './revision'; import './rollout.scss'; import {Fragment} from 'react'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faChevronCircleDown, faChevronCircleUp, faCircleNotch} from '@fortawesome/free-solid-svg-icons'; +import {InfoItemKind, InfoItemRow} from '../info-item/info-item'; const RolloutActions = React.lazy(() => import('../rollout-actions/rollout-actions')); export interface ImageInfo { @@ -104,78 +105,85 @@ export const RolloutWidget = (props: {rollout: RolloutRolloutInfo; interactive?: } return ( - -
- -
Summary
- - - - {rollout.strategy === Strategy.Canary && ( - - - - {' '} - - )} - -
- - { - interactive.api.rolloutServiceSetRolloutImage({}, interactive.namespace, rollout.objectMeta?.name, container, image, tag); - }, - } - : null - } - /> - +
+
+ {(rollout?.strategy || '').toLowerCase() === 'canary' && rollout.steps && rollout.steps.length > 0 && }
-
- {rollout.replicaSets && rollout.replicaSets.length > 0 && ( - -
Revisions
-
- {revisions.map((r, i) => ( - interactive.api.rolloutServiceUndoRollout({}, interactive.namespace, rollout.objectMeta.name, `${r}`) : null} - current={i === 0} - message={rollout.message} - /> - ))} +
+
+
+
Summary
+ + +
+ {rollout.strategy === Strategy.Canary && ( + + + + {' '} + + )}
- - )} - {(rollout?.strategy || '').toLowerCase() === 'canary' && rollout.steps && rollout.steps.length > 0 && ( - - Steps -
- {rollout.steps - .filter((step) => Object.keys(step).length) - .map((step, i, arr) => ( - +
+
+ { + interactive.api.rolloutServiceSetRolloutImage({}, interactive.namespace, rollout.objectMeta?.name, container, image, tag); + }, + } + : null + } + /> +
+
+ +
+ {rollout.replicaSets && rollout.replicaSets.length > 0 && ( +
+
Revisions
+
+ {revisions.map((r, i) => ( + interactive.api.rolloutServiceUndoRollout({}, interactive.namespace, rollout.objectMeta.name, `${r}`) : null} + current={i === 0} + message={rollout.message} + /> ))} +
- - )} + )} +
- +
); }; +const Steps = (props: {rollout: RolloutInfo; curStep: number}) => ( +
+
Steps
+
+ {props.rollout.steps + .filter((step) => Object.keys(step).length) + .map((step, i, arr) => ( + + ))} +
+
+); + export const Rollout = () => { const {name} = useParams<{name: string}>(); @@ -183,39 +191,25 @@ export const Rollout = () => { const api = React.useContext(RolloutAPIContext); const namespaceCtx = React.useContext(NamespaceContext); - const {useKeybinding} = React.useContext(KeybindingContext); const editState = React.useState(false); - const history = useHistory(); - - useKeybinding(Key.L, () => { - if (editState[0]) { - return false; - } - history.push('/rollouts'); - return true; - }); return (
{name} / Argo Rollouts - - +
+
{name}
- +
- }> + }>
- +
- - - - - +
{!loading && }
); }; @@ -328,7 +322,7 @@ const Step = (props: {step: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1 return ( - +
} {content} {unit} {props.step.setCanaryScale && ( - setOpenCanary(!openCanary)}> +
setOpenCanary(!openCanary)}> - +
)} {props.step.analysis && ( - setOpenAnalysis(!openAnalysis)}> +
setOpenAnalysis(!openAnalysis)}> - +
)} {props.step.setHeaderRoute && props.step.setHeaderRoute.match && ( - setOpenHeader(!openHeader)}> +
setOpenHeader(!openHeader)}> - +
)} {props.step.setMirrorRoute && props.step.setMirrorRoute.match && ( - setOpenMirror(!openMirror)}> +
setOpenMirror(!openMirror)}> - +
)}
{props.step.experiment?.templates && ( @@ -387,8 +381,8 @@ const Step = (props: {step: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1 {props.step?.setCanaryScale && openCanary && } {props.step?.setHeaderRoute && openHeader && } {props.step?.setMirrorRoute && openMirror && } - - {!props.last && } +
+ {!props.last &&
} ); }; @@ -402,23 +396,21 @@ const ExperimentWidget = ({ opened: boolean; onToggle: (name: string) => void; }) => { - const icon = opened ? 'fa-chevron-circle-up' : 'fa-chevron-circle-down'; + const icon = opened ? faChevronCircleUp : faChevronCircleDown; return ( - - +
+
{template.name} - onToggle(opened ? '' : template.name)}> - - - + onToggle(opened ? '' : template.name)} style={{cursor: 'pointer'}} /> +
{opened && } - +
); }; const WidgetItem = ({values}: {values: Record}) => { return ( - +
{Object.keys(values).map((val) => { if (!values[val]) return null; return ( @@ -428,14 +420,14 @@ const WidgetItem = ({values}: {values: Record}) => { ); })} - +
); }; const WidgetItemSetMirror = ({value}: {value: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SetMirrorRoute}) => { if (!value) return null; return ( - +
Name
{value.name}
@@ -493,14 +485,14 @@ const WidgetItemSetMirror = ({value}: {value: GithubComArgoprojArgoRolloutsPkgAp return fragments; })}
- +
); }; const WidgetItemSetHeader = ({values}: {values: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch[]}) => { if (!values) return null; return ( - +
{values.map((record) => { if (!record.headerName) return null; if (!record.headerValue) return null; @@ -528,6 +520,6 @@ const WidgetItemSetHeader = ({values}: {values: GithubComArgoprojArgoRolloutsPkg ); })} - +
); }; diff --git a/ui/src/app/components/rollouts-list/rollouts-list.scss b/ui/src/app/components/rollouts-list/rollouts-list.scss index 3892e8cb9a..f0ec5fdcc7 100644 --- a/ui/src/app/components/rollouts-list/rollouts-list.scss +++ b/ui/src/app/components/rollouts-list/rollouts-list.scss @@ -16,6 +16,11 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; margin: 0 auto; } + &__search { + width: 100%; + font-size: 15px; + } + &__rollouts-container { padding: 20px; display: flex; @@ -89,7 +94,7 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; &__toolbar { width: 100%; - padding-top: 1.5em; + padding: 1em 0; background-color: white; border-bottom: 1px solid white; @@ -111,48 +116,30 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; flex-shrink: 0; margin-bottom: 1.5em; border-radius: 5px; + background-color: white; + box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.05); + border: 1px solid $argo-color-gray-4; + z-index: 0; - &__pods { - margin-bottom: 1em; - } - - &__background { - background-color: white; - box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.05); - border: 1px solid $argo-color-gray-4; - - border-radius: 5px; - &--dark { - border-color: $silver-lining; - box-shadow: 1px 2px 3px 1px $space; - background: none; - } - } - - &:hover > &__background, - &--selected > &__background { - transform: scale(1.01); - border-color: $sherbert; + &:hover, + &--selected { + border-color: $argo-running-color; } - &--dark:hover > &__background, - &--dark#{&}--selected > &__background { - border-color: $spray-tan; + &__pods { + margin-bottom: 1em; } &--dark { color: $dull-shine; - } - - &__container { - position: relative; - display: block; - z-index: 2; + border-color: $silver-lining; + box-shadow: 1px 2px 3px 1px $space; + background: none; } &__refresh { &:hover { - color: $sherbert; + color: $argo-running-color; } } @@ -169,10 +156,8 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; color: $argo-color-gray-8; display: flex; align-items: center; - font-weight: 500; - font-size: 18px; - border-bottom: 1px solid $argo-color-gray-4; - padding-bottom: 1em; + font-weight: 600; + font-size: 20px; margin-bottom: 1em; } @@ -181,9 +166,11 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; border-bottom: 1px solid $silver-lining; } &__actions { + position: relative; display: flex; align-items: center; margin-top: 1.5em; + z-index: 10 !important; } } } diff --git a/ui/src/app/components/rollouts-list/rollouts-list.tsx b/ui/src/app/components/rollouts-list/rollouts-list.tsx index ba7189adb5..e8c9a4dc5f 100644 --- a/ui/src/app/components/rollouts-list/rollouts-list.tsx +++ b/ui/src/app/components/rollouts-list/rollouts-list.tsx @@ -1,4 +1,3 @@ -import {Autocomplete, EffectDiv, InfoItemKind, InfoItemRow, Spinner, ThemeDiv, useAutocomplete, WaitFor} from 'argo-ui/v2'; import * as React from 'react'; import {Key, KeybindingContext, useNav} from 'react-keyhooks'; import {Link, useHistory} from 'react-router-dom'; @@ -10,9 +9,20 @@ import {ParsePodStatus, PodStatus, ReplicaSets} from '../pods/pods'; import {RolloutAction, RolloutActionButton} from '../rollout-actions/rollout-actions'; import {RolloutStatus, StatusIcon} from '../status-icon/status-icon'; import './rollouts-list.scss'; +import {AutoComplete, Tooltip} from 'antd'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCircleNotch, faRedoAlt} from '@fortawesome/free-solid-svg-icons'; +import {InfoItemKind, InfoItemRow} from '../info-item/info-item'; const useRolloutNames = (rollouts: RolloutInfo[]) => { - const parseNames = (rl: RolloutInfo[]) => (rl || []).map((r) => r.objectMeta?.name || ''); + const parseNames = (rl: RolloutInfo[]) => + (rl || []).map((r) => { + const name = r.objectMeta?.name || ''; + return { + label: name, + value: name, + }; + }); const [rolloutNames, setRolloutNames] = React.useState(parseNames(rollouts)); React.useEffect(() => { @@ -28,26 +38,25 @@ export const RolloutsList = () => { const loading = rolloutsList.loading; const [filteredRollouts, setFilteredRollouts] = React.useState(rollouts); const [pos, nav, reset] = useNav(filteredRollouts.length); - const [searchString, setSearchString, searchInput] = useAutocomplete(''); + const [searchString, setSearchString] = React.useState(''); const searchParam = new URLSearchParams(window.location.search).get('q'); React.useEffect(() => { - if (searchParam && searchParam != searchString) { - setSearchString(searchParam); - } + if (searchParam && searchParam != searchString) { + setSearchString(searchParam); + } }, []); - const {useKeybinding, keybindingState} = React.useContext(KeybindingContext); + const searchRef = React.useRef(null); - // ignore H key when typing - const hGroup = keybindingState.groupForKey[Key.H]; - const showHelpMenu = keybindingState.groups[hGroup][Key.H].action; - keybindingState.groups[hGroup][Key.H].action = () => { - if (searchInput.inputref.current === document.activeElement) { - return false; - } else { - return showHelpMenu(); + React.useEffect(() => { + if (searchRef.current) { + // or, if Input component in your ref, then use input property like: + // searchRef.current.input.focus(); + searchRef.current.focus(); } - }; + }, [searchRef]); + + const {useKeybinding} = React.useContext(KeybindingContext); useKeybinding(Key.RIGHT, () => nav(1)); useKeybinding(Key.LEFT, () => nav(-1)); @@ -66,8 +75,8 @@ export const RolloutsList = () => { useKeybinding(Key.SLASH, () => { if (!searchString) { - if (searchInput.inputref.current) { - searchInput.inputref.current.focus(); + if (searchRef) { + searchRef.current.focus(); } return true; } @@ -88,7 +97,9 @@ export const RolloutsList = () => { setFilteredRollouts(filtered); } if (searchString) { - history.replace(`/${namespaceCtx.namespace}?q=${searchString}`); + history.replace(`/${namespaceCtx.namespace}?q=${searchString}`); + } else { + history.replace(`/${namespaceCtx.namespace}`); } }, [searchString, rollouts]); @@ -96,32 +107,35 @@ export const RolloutsList = () => { return (
- - {(rollouts || []).length > 0 ? ( - - -
- history.push(`/rollout/${namespaceCtx.namespace}/${item}`)} - icon='fa-search' - {...searchInput} - /> -
-
-
- {(filteredRollouts.sort((a, b) => (a.objectMeta.name < b.objectMeta.name ? -1 : 1)) || []).map((rollout, i) => ( - reset()} /> - ))} + {loading ? ( +
+ + Loading... +
+ ) : (rollouts || []).length > 0 ? ( + +
+
+ history.push(`/rollout/${namespaceCtx.namespace}/${val}`)} + options={rolloutNames} + onChange={(val) => setSearchString(val)} + value={searchString} + ref={searchRef} + />
- - ) : ( - - )} - +
+
+ {(filteredRollouts.sort((a, b) => (a.objectMeta.name < b.objectMeta.name ? -1 : 1)) || []).map((rollout, i) => ( + reset()} /> + ))} +
+
+ ) : ( + + )}
); }; @@ -131,7 +145,7 @@ const EmptyMessage = (props: {namespace: string}) => { return
 navigator.clipboard.writeText(props.children)}>{props.children}
; }; return ( - +

No Rollouts to display!

Make sure you are running the API server in the correct namespace. Your current namespace is:
@@ -149,7 +163,7 @@ const EmptyMessage = (props: {namespace: string}) => { .
- +
); }; @@ -184,33 +198,33 @@ export const RolloutWidget = (props: {rollout: RolloutInfo; deselect: () => void }, [watching, rollout]); return ( - - - { - subscribe(true); - setTimeout(() => { - subscribe(false); - }, 1000); - }} + + { + subscribe(true); + setTimeout(() => { + subscribe(false); + }, 1000); + }} + /> +
+ - - - {(rollout.strategy || '').toLocaleLowerCase() === 'canary' && } - - }> - - -
- subscribe(true)} indicateLoading /> - subscribe(true)} indicateLoading /> -
- - + {(rollout.strategy || '').toLocaleLowerCase() === 'canary' && } +
+ {(rollout.replicaSets || []).length < 1 && } + +
+ subscribe(true)} indicateLoading /> + subscribe(true)} indicateLoading /> +
+ ); }; @@ -224,15 +238,19 @@ const WidgetHeader = (props: {rollout: RolloutInfo; refresh: () => void}) => {
{rollout.objectMeta?.name} - { - props.refresh(); - setLoading(true); - e.preventDefault(); - }} - /> + + { + props.refresh(); + setLoading(true); + e.preventDefault(); + }} + /> +
diff --git a/ui/src/app/components/status-icon/status-icon.tsx b/ui/src/app/components/status-icon/status-icon.tsx index 7f18813f4b..257dc50567 100644 --- a/ui/src/app/components/status-icon/status-icon.tsx +++ b/ui/src/app/components/status-icon/status-icon.tsx @@ -1,6 +1,6 @@ -import {Tooltip} from 'argo-ui/v2'; import * as React from 'react'; import './status-icon.scss'; +import {Tooltip} from 'antd'; export enum RolloutStatus { Progressing = 'Progressing', @@ -40,7 +40,11 @@ export const StatusIcon = (props: {status: RolloutStatus}): JSX.Element => { className = 'unknown'; } } - return ; + return ( + + + + ); }; export enum ReplicaSetStatus { @@ -84,7 +88,7 @@ export const ReplicaSetStatusIcon = (props: {status: ReplicaSetStatus}) => { } } return ( - + ); diff --git a/ui/src/assets/images/argologo.svg b/ui/src/assets/images/argologo.svg new file mode 100644 index 0000000000..eeeb3fb36d --- /dev/null +++ b/ui/src/assets/images/argologo.svg @@ -0,0 +1 @@ +Asset 3 \ No newline at end of file diff --git a/ui/src/config/theme.ts b/ui/src/config/theme.ts new file mode 100644 index 0000000000..c377896a2e --- /dev/null +++ b/ui/src/config/theme.ts @@ -0,0 +1,15 @@ +import { ThemeConfig } from 'antd/es/config-provider'; + +export const theme: ThemeConfig = { + components: { + Button: { + colorPrimary: '#44505f', + colorPrimaryBgHover: '#626f7e', + colorPrimaryHover: '#626f7e', + colorPrimaryActive: '#626f7e', + borderRadius: 100, + borderRadiusSM: 100, + borderRadiusLG: 100 + } + } +}; diff --git a/ui/yarn.lock b/ui/yarn.lock index dbaded50fa..29f5446d37 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,6 +2,53 @@ # yarn lockfile v1 +"@ant-design/colors@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" + integrity sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/cssinjs@^1.7.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.8.1.tgz#326682e779f5cd074668391a6698b50342a07d92" + integrity sha512-pOQJV9H9viB6qB9u7hkpKEOIQGx4dd8zjpwzF1v8YNwjffbZTlyUNQYln56gwpFF7SFskpYpnSfgoqTK4sFE/Q== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.0.10" + rc-util "^5.27.0" + stylis "^4.0.13" + +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== + +"@ant-design/icons@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.0.1.tgz#febb1fdc5776f58187b2c953ac9a4496069d045b" + integrity sha512-ZyF4ksXCcdtwA/1PLlnFLcF/q8/MhwxXhKHh4oCHDA4Ip+ZzAHoICtyp4wZWfiCVDP0yuz3HsjyvuldHFb3wjA== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + +"@ant-design/react-slick@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.0.tgz#4696eecaa2dea0429e47ae24c267015cfd6df35c" + integrity sha512-OKxZsn8TAf8fYxP79rDXgLs9zvKMTslK6dJ4iLhDXOujUqC5zJPBRszyrcEHXcMPOm1Sgk40JgyF3yiL/Swd7w== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + "@babel/code-frame@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -1164,6 +1211,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/runtime@^7.12.1": version "7.17.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" @@ -1232,11 +1286,26 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" + integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== + "@discoveryjs/json-ext@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@eslint/eslintrc@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" @@ -1252,11 +1321,37 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@fortawesome/fontawesome-common-types@6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz#88da2b70d6ca18aaa6ed3687832e11f39e80624b" + integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ== + "@fortawesome/fontawesome-free@^5.8.1": version "5.15.4" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== +"@fortawesome/fontawesome-svg-core@^6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz#3727552eff9179506e9203d72feb5b1063c11a21" + integrity sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.0" + +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz#48c0e790847fa56299e2f26b82b39663b8ad7119" + integrity sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.0" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1522,6 +1617,63 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28" integrity sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ== +"@rc-component/context@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.3.0.tgz#608ccf0abcbec9406751b17a4b35db08e481c110" + integrity sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w== + dependencies: + "@babel/runtime" "^7.10.1" + rc-util "^5.27.0" + +"@rc-component/mini-decimal@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz#e5dbc20a6a5b0e234d279bc71ce730ab865d3910" + integrity sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA== + dependencies: + "@babel/runtime" "^7.18.0" + +"@rc-component/mutate-observer@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz#ce99af3239ed9c74ee3e7302f1c67098de920b46" + integrity sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/portal@^1.0.0-6", "@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.1.tgz#1a30ffe51c240b54360cba8e8bfc5d1f559325c4" + integrity sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/tour@~1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.8.0.tgz#fda8b533e36db1d4254e3ffbcefe3395c346eb1c" + integrity sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/portal" "^1.0.0-9" + "@rc-component/trigger" "^1.3.6" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/trigger@^1.0.4", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.7.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-1.8.0.tgz#9eb26ecdd29971d7e6d30e83716d40f27b8bb596" + integrity sha512-O9d4Tlg/FiCUlkQ+aAUUO5KmrBbj4XYq6qYfZE/hvNHzIepHqwLGx8H/d+1fG13dVPq70nGDf5ha9PQ96YRMVg== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/portal" "^1.1.0" + classnames "^2.3.2" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-resize-observer "^1.3.1" + rc-util "^5.29.2" + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -2458,6 +2610,60 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +antd@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.4.2.tgz#3923b96da76fc7276992e9fc0286ebb3a638e016" + integrity sha512-OxXZ7joFf6Um4zeXm07tyJ9WV6eMwUw1KUmewfM/BDceUFVtJVf7YbBTBfX3JTl+jOuSpMSb4naFhOCgVwtyFw== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/cssinjs" "^1.7.1" + "@ant-design/icons" "^5.0.0" + "@ant-design/react-slick" "~1.0.0" + "@babel/runtime" "^7.18.3" + "@ctrl/tinycolor" "^3.6.0" + "@rc-component/mutate-observer" "^1.0.0" + "@rc-component/tour" "~1.8.0" + "@rc-component/trigger" "^1.7.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + dayjs "^1.11.1" + qrcode.react "^3.1.0" + rc-cascader "~3.10.0" + rc-checkbox "~3.0.0" + rc-collapse "~3.5.2" + rc-dialog "~9.1.0" + rc-drawer "~6.1.1" + rc-dropdown "~4.0.0" + rc-field-form "~1.29.0" + rc-image "~5.16.0" + rc-input "~1.0.4" + rc-input-number "~7.4.0" + rc-mentions "~2.2.0" + rc-menu "~9.8.3" + rc-motion "^2.6.1" + rc-notification "~5.0.0" + rc-pagination "~3.3.1" + rc-picker "~3.6.1" + rc-progress "~3.4.1" + rc-rate "~2.10.0" + rc-resize-observer "^1.2.0" + rc-segmented "~2.1.2" + rc-select "~14.4.3" + rc-slider "~10.1.0" + rc-steps "~6.0.0" + rc-switch "~4.0.0" + rc-table "~7.31.0" + rc-tabs "~12.5.6" + rc-textarea "~1.2.2" + rc-tooltip "~6.0.0" + rc-tree "~5.7.0" + rc-tree-select "~5.8.0" + rc-trigger "^5.3.4" + rc-upload "~4.3.0" + rc-util "^5.27.0" + scroll-into-view-if-needed "^3.0.3" + throttle-debounce "^5.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2558,6 +2764,11 @@ array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: get-intrinsic "^1.1.1" is-string "^1.0.5" +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2664,6 +2875,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-validator@^4.1.0: + version "4.2.5" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3459,6 +3675,11 @@ classnames@2.2.6, classnames@^2.2.5, classnames@^2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + clean-css@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" @@ -3639,6 +3860,11 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +compute-scroll-into-view@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz#c418900a5c56e2b04b885b54995df164535962b1" + integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -3730,6 +3956,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-to-clipboard@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + copy-webpack-plugin@^6.3.2: version "6.4.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" @@ -4105,6 +4338,11 @@ csstype@^2.2.0: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== +csstype@^3.0.10: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + csstype@^3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" @@ -4144,6 +4382,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +dayjs@^1.11.1: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4371,6 +4614,11 @@ dom-accessibility-api@^0.5.4: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== +dom-align@^1.7.0: + version "1.12.4" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511" + integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== + dom-converter@^0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -7114,6 +7362,13 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== + dependencies: + string-convert "^0.2.0" + json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -9291,6 +9546,15 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.8.1" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -9366,6 +9630,11 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qrcode.react@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" + integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -9454,6 +9723,374 @@ raw-loader@^4.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" +rc-align@^4.0.0: + version "4.0.15" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.15.tgz#2bbd665cf85dfd0b0244c5a752b07565e9098577" + integrity sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.26.0" + resize-observer-polyfill "^1.5.1" + +rc-cascader@~3.10.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.10.1.tgz#bee2732c4ef86dcca06de83d065b1b0d612ff057" + integrity sha512-tImBYEAqLlIZ+jnRmfQQEm5gOXa09N9aGV9AKxriXlCvsNEfdZMIRyY0p74sEZIUn0ycXHo8VcOlqsgLcgFknQ== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.4.0" + rc-tree "~5.7.0" + rc-util "^5.6.1" + +rc-checkbox@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.0.0.tgz#6b426d16c7d2ed9fee219a1dfb14d2c504a45300" + integrity sha512-tOEs1+wWDUei7DuP2EsJCZfam5vxMjKTCGcZdXVgsiOcNszc41Esycbo31P0/jFwUAPmd5oPYFWkcnFUCTLZxA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + +rc-collapse@~3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.5.2.tgz#abb7d144ad55bd9cbd201fa95bc5b271da2aa7c3" + integrity sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.27.0" + +rc-dialog@~9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.1.0.tgz#6bf6fcc0453503b7643e54a5a445e835e3850649" + integrity sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + +rc-drawer@~6.1.1: + version "6.1.5" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.1.5.tgz#c4137b944c16b7c179d0dba6f06ebe54f9311ec8" + integrity sha512-MDRomQXFi+tvDuwsRAddJ2Oy2ayLCZ29weMzp3rJFO9UNEVLEVV7nuyx5lEgNJIdM//tE6wWQV95cTUiMVqD6w== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-6" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.21.2" + +rc-dropdown@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.0.1.tgz#f65d9d3d89750241057db59d5a75e43cd4576b68" + integrity sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.6" + rc-trigger "^5.3.1" + rc-util "^5.17.0" + +rc-field-form@~1.29.0: + version "1.29.2" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.29.2.tgz#1c07f29eb88c13e2987fd0bd1e977dfea9e789a7" + integrity sha512-gXNkthHMUjJ7gDKYmD/lJWJrpMqAjiEPQE4QmlOuZoiHF51LybCL/y+iAmLXpdEjPfJ41WtZBH5hZMUEnEnHXA== + dependencies: + "@babel/runtime" "^7.18.0" + async-validator "^4.1.0" + rc-util "^5.8.0" + +rc-image@~5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.16.0.tgz#79d5864bc1c5d66c4620176cc131d34cd4f4bea8" + integrity sha512-11DOye57IgTXh2yTsmxFNynZJG3tdx8RZnnaqb38eYWrBPPyhVHIuURxyiSZ8B68lEUAggR7SBA0Zb95KP/CyQ== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.1.0" + rc-motion "^2.6.2" + rc-util "^5.0.6" + +rc-input-number@~7.4.0: + version "7.4.2" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.4.2.tgz#7c52d26b986461aa16e486d469dc0476d97c6ea3" + integrity sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-util "^5.28.0" + +rc-input@~1.0.0, rc-input@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.0.4.tgz#2f2c73c884f41e80685bb2eb7b9d5533e8540a77" + integrity sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-mentions@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.2.0.tgz#27900ec04d067c58205309897efd190f5d8f4ac8" + integrity sha512-R7ncCldr02uKgJBBPlXdtnOGQIjZ9C3uoIMi4fabU3CPFdmefYlNF6QM4u2AzgcGt8V0KkoHTN5T6HPdUpet8g== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.6" + rc-input "~1.0.0" + rc-menu "~9.8.0" + rc-textarea "~1.2.0" + rc-util "^5.22.5" + +rc-menu@~9.8.0, rc-menu@~9.8.3: + version "9.8.4" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.8.4.tgz#58bf19d471e3c74ff4bcfdb0f02a3826ebe2553b" + integrity sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.8" + rc-trigger "^5.1.2" + rc-util "^5.27.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.0, rc-motion@^2.6.1, rc-motion@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.6.3.tgz#e6d8ca06591c2c1bcd3391a8e7a822ebc4d94e9c" + integrity sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + +rc-notification@~5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.0.3.tgz#2566d4a6b2334c171bad0cb9a8b80cb1a24b29e6" + integrity sha512-+wHbHu6RiTNtsZYx42WxWA+tC5m0qyKvJAauO4/6LIEyJspK8fRlFQz+OCFgFwGuNs3cOdo9tLs+cPfztSZwbQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.6.0" + rc-util "^5.20.1" + +rc-overflow@^1.0.0, rc-overflow@^1.2.8: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.0.tgz#964f7db14aab611c3047788d3b8ee472732fee09" + integrity sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.19.2" + +rc-pagination@~3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.3.1.tgz#38e364674adf2a753a4fa26e0d9d88ebe523ed0f" + integrity sha512-eI4dSeB3OrFxll7KzWa3ZH63LV2tHxt0AUmZmDwuI6vc3CK5lZhaKUYq0fRowb5586hN+L26j5WZoSz9cwEfjg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-picker@~3.6.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-3.6.2.tgz#68d13af7d240e792769a306ed6447e66e47040aa" + integrity sha512-acLNCi2WTNAuvTtcEzKp72mU15ni0sqrIKVlEcj04KgLZxhlVPMabCS+Sc8VuOCPJbOcW0XeOydbNnJbWTvzxg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.1" + rc-util "^5.27.0" + +rc-progress@~3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.4.1.tgz#a9ffe099e88a4fc03afb09d8603162bf0760d743" + integrity sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.10.0.tgz#b16fd906c13bfc26b4776e27a14d13d06d50c635" + integrity sha512-TCjEpKPeN1m0EnGDDbb1KyxjNTJRzoReiPdtbrBJEey4Ryf/UGOQ6vqmz2yC6DJdYVDVUoZPdoz043ryh0t/nQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0, rc-resize-observer@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz#b61b9f27048001243617b81f95e53d7d7d7a6a3d" + integrity sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.27.0" + resize-observer-polyfill "^1.5.1" + +rc-segmented@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.1.2.tgz#14c9077a1dae9c2ccb2ef5fbc5662c1c48c7ce8e" + integrity sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.4.0, rc-select@~14.4.3: + version "14.4.3" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.4.3.tgz#68d7f1b6bcb41543f69901951facd5e097fb835d" + integrity sha512-qoz4gNqm3SN+4dYKSCRiRkxKSEEdbS3jC6gdFYoYwEjDZ9sdQFo5jHlfQbF+hhai01HOoj1Hf8Gq6tpUvU+Gmw== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.0.0" + rc-util "^5.16.1" + rc-virtual-list "^3.4.13" + +rc-slider@~10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.1.1.tgz#5e82036e60b61021aba3ea0e353744dd7c74e104" + integrity sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.27.0" + +rc-steps@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.0.tgz#f7148f8097d5d135f19b96c1b4f4b50ad6093753" + integrity sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" + +rc-switch@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.0.0.tgz#55fbf99fc2d680791175037d379e170ba51fbe78" + integrity sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.1" + +rc-table@~7.31.0: + version "7.31.1" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.31.1.tgz#85487b25d98559d6e684b3348e893da1d1f48232" + integrity sha512-KZPi35aGpv2VaL1Jbc58FBJo063HtKyVjhOFWX4AkBV7tjHHQokMdUoua5E+GPJh6QZUpK/a8PjKa9IZzPLIEA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/context" "^1.3.0" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.27.1" + +rc-tabs@~12.5.6: + version "12.5.10" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.5.10.tgz#0e41c723fac66c4f0bcad3271429fff6653b0721" + integrity sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.0.0" + rc-menu "~9.8.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.16.0" + +rc-textarea@~1.2.0, rc-textarea@~1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.2.2.tgz#111fa90fcedba6d244bc94615b7971b8d8f68815" + integrity sha512-S9fkiek5VezfwJe2McEs/NH63xgnnZ4iDh6a8n01mIfzyNJj0HkS0Uz6boyR3/eONYjmKaqhrpuJJuEClRDEBw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-input "~1.0.4" + rc-resize-observer "^1.0.0" + rc-util "^5.27.0" + +rc-tooltip@~6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.0.1.tgz#6a5e33bd6c3f6afe8851ea90e7af43e5c26b3cc6" + integrity sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^1.0.4" + classnames "^2.3.1" + +rc-tree-select@~5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.8.0.tgz#b3d861b7b2111d3a96b56040b851d5e280d71c95" + integrity sha512-NozrkVLR8k3cpx8R5/YFmJMptgOacR5zEQHZGMQg31bD6jEgGiJeOn2cGRI6x0Xdyvi1CSqCbUsIoqiej74wzw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.4.0" + rc-tree "~5.7.0" + rc-util "^5.16.1" + +rc-tree@~5.7.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.7.3.tgz#5da576ba87039486d59092eb4490831690b8b3b5" + integrity sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.4.8" + +rc-trigger@^5.1.2, rc-trigger@^5.3.1, rc-trigger@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.3.4.tgz#6b4b26e32825677c837d1eb4d7085035eecf9a61" + integrity sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.19.2" + +rc-upload@~4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.4.tgz#83ff7d3867631c37adbfd72ea3d1fd7e97ca84af" + integrity sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.27.1, rc-util@^5.28.0, rc-util@^5.29.2, rc-util@^5.6.1, rc-util@^5.8.0, rc-util@^5.9.4: + version "5.29.3" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.29.3.tgz#dc02b7b2103468e9fdf14e0daa58584f47898e37" + integrity sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^16.12.0" + +rc-virtual-list@^3.4.13, rc-virtual-list@^3.4.8: + version "3.4.13" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz#20acc934b263abcf7b7c161f50ef82281b2f7e8d" + integrity sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.15.0" + react-app-polyfill@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" @@ -9563,7 +10200,7 @@ react-hot-loader@^3.1.3: redbox-react "^1.3.6" source-map "^0.6.1" -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9918,6 +10555,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -10073,6 +10715,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -10380,6 +11027,13 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +scroll-into-view-if-needed@^3.0.3: + version "3.0.10" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz#38fbfe770d490baff0fb2ba34ae3539f6ec44e13" + integrity sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg== + dependencies: + compute-scroll-into-view "^3.0.2" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10897,6 +11551,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -11058,6 +11717,11 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylis@^4.0.13: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11239,6 +11903,11 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throttle-debounce@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" + integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -11328,6 +11997,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -11506,11 +12180,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@4.3.5, typescript@^4.0.3: +typescript@^4.0.3: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" From 3c9c29178b147e431b1bd4ff54ab5b00671893f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Apr 2023 00:09:28 +0200 Subject: [PATCH 022/159] chore(deps): bump codecov/codecov-action from 3.1.2 to 3.1.3 (#2735) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.2...v3.1.3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index fb1e1911f3..c4e4debbf1 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v3.1.2 + uses: codecov/codecov-action@v3.1.3 with: file: coverage.out From 4273813f14b4fc06925e34a6db57d952c6c6fd55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:31:13 -0500 Subject: [PATCH 023/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 (#2747) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.9 to 1.19.10. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.9...service/efs/v1.19.10) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 3f1d99f46c..f5ea4c067d 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/antonmedv/expr v1.12.5 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.17.8 + github.com/aws/aws-sdk-go-v2 v1.18.0 github.com/aws/aws-sdk-go-v2/config v1.18.21 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 @@ -83,8 +83,8 @@ require ( github.com/aws/aws-sdk-go v1.44.39 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 // indirect diff --git a/go.sum b/go.sum index 653ab25fa8..c227dc4553 100644 --- a/go.sum +++ b/go.sum @@ -131,24 +131,27 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39 h1:pMxYLqnuDidT0ZTDAhYC66fb3W3Yc+oShmfzEL4fTDI= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= +github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.21 h1:ENTXWKwE8b9YXgQCsruGLhvA9bhg+RqAsL9XEMEsa2c= github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= github.com/aws/aws-sdk-go-v2/credentials v1.13.20 h1:oZCEFcrMppP/CNiS8myzv9JgOzq2s0d3v3MXYil/mxQ= github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh06CXL/h6G8LQJFpZfFBYBNboo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 h1:7jgW378oM948BxuOBarXeeaKSrRaCj7didsdeSwYGGo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9 h1:5SFRhHdPrqPgH14WrakFssW78i0eq9e/4mC3ujodNM0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.9/go.mod h1:kxVa+BAqpYmSp4+SrbmY4lph9TKiioxaJNM643o1QZk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 h1:RnL6Jg/DG9CAnY0MP9D0vJYQB3vv/gkKzJPw9nCqeo8= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 h1:5cb3D6xb006bPTqEfCNaEA6PPEfBXxxy4NNeX/44kGk= From 2355e8b30afee7b9501b36a18b7579a7fc3011f8 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Fri, 28 Apr 2023 01:40:36 +0800 Subject: [PATCH 024/159] docs: Add contour trafficrouter plugin (#2729) Add contour trafficrouter plugin Signed-off-by: Wilson Wu --- docs/features/traffic-management/plugins.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index f0d1634ee3..660900e6ae 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -71,3 +71,6 @@ responsibility of the Argo Rollouts administrator to define the plugin installat #### [rollouts-plugin-trafficrouter-sample-nginx](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-sample-nginx) * This is just a sample plugin that can be used as a starting point for creating your own plugin. It is not meant to be used in production. It is based on the built-in prometheus provider. + +#### [rollouts-plugin-trafficrouter-contour](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-contour) +* This is a plugin for support Contour. From cc78ac5487cc93fbc2f785f38f7182c06c2a9dd2 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 28 Apr 2023 09:46:35 -0500 Subject: [PATCH 025/159] docs: copy argo cd docs drop down fix (#2731) copy argo rollouts drop down fix for docs Signed-off-by: zachaller --- docs/assets/versions.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/assets/versions.js b/docs/assets/versions.js index 057ce03158..1336443d1a 100644 --- a/docs/assets/versions.js +++ b/docs/assets/versions.js @@ -9,16 +9,6 @@ setTimeout(function() { caret.innerHTML = "" caret.classList.add('dropdown-caret') div.querySelector('.rst-current-version').appendChild(caret); - div.querySelector('.rst-current-version').addEventListener('click', function() { - const classes = container.className.split(' '); - const index = classes.indexOf('shift-up'); - if (index === -1) { - classes.push('shift-up'); - } else { - classes.splice(index, 1); - } - container.className = classes.join(' '); - }); } var CSSLink = document.createElement('link'); From ba11d16a730e252171d9e1ecd99d46ffc30ed1b0 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 28 Apr 2023 10:46:48 -0500 Subject: [PATCH 026/159] fix: change logic of analysis run to better handle errors (#2695) * change logic of analysis run to better haneld errors Signed-off-by: zachaller * change logic to not call GetMetaData if not nil like the old behavior Signed-off-by: zachaller * move code closer to usage Signed-off-by: zachaller * change logic to not always call GetMetadata keeps original behavior Signed-off-by: zachaller * fix logic Signed-off-by: zachaller * cleanup Signed-off-by: zachaller * add test Signed-off-by: zachaller --------- Signed-off-by: zachaller --- analysis/analysis.go | 40 ++++++++++++++++++------------------- analysis/controller_test.go | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/analysis/analysis.go b/analysis/analysis.go index 4e98556794..c826280d19 100644 --- a/analysis/analysis.go +++ b/analysis/analysis.go @@ -321,26 +321,10 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa //redact secret values from logs logger := logutil.WithRedactor(*logutil.WithAnalysisRun(run).WithField("metric", t.metric.Name), secrets) - resultsLock.Lock() - metricResult := analysisutil.GetResult(run, t.metric.Name) - resultsLock.Unlock() - - provider, err := c.newProvider(*logger, t.metric) - if err != nil { - log.Errorf("Error in getting metric provider :%v", err) - return err - } - if metricResult == nil { - metricResult = &v1alpha1.MetricResult{ - Name: t.metric.Name, - Phase: v1alpha1.AnalysisPhaseRunning, - DryRun: dryRunMetricsMap[t.metric.Name], - Metadata: provider.GetMetadata(t.metric), - } - } - var newMeasurement v1alpha1.Measurement - if err != nil { + provider, providerErr := c.newProvider(*logger, t.metric) + if providerErr != nil { + log.Errorf("Error in getting metric provider :%v", providerErr) if t.incompleteMeasurement != nil { newMeasurement = *t.incompleteMeasurement } else { @@ -348,7 +332,7 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa newMeasurement.StartedAt = &startedAt } newMeasurement.Phase = v1alpha1.AnalysisPhaseError - newMeasurement.Message = err.Error() + newMeasurement.Message = providerErr.Error() } else { if t.incompleteMeasurement == nil { newMeasurement = provider.Run(run, t.metric) @@ -366,12 +350,28 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa } } + resultsLock.Lock() + metricResult := analysisutil.GetResult(run, t.metric.Name) + resultsLock.Unlock() + if metricResult == nil { + metricResult = &v1alpha1.MetricResult{ + Name: t.metric.Name, + Phase: v1alpha1.AnalysisPhaseRunning, + DryRun: dryRunMetricsMap[t.metric.Name], + } + + if provider != nil && providerErr == nil { + metricResult.Metadata = provider.GetMetadata(t.metric) + } + } + if newMeasurement.Phase.Completed() { logger.Infof("Measurement Completed. Result: %s", newMeasurement.Phase) if newMeasurement.FinishedAt == nil { finishedAt := timeutil.MetaNow() newMeasurement.FinishedAt = &finishedAt } + switch newMeasurement.Phase { case v1alpha1.AnalysisPhaseSuccessful: metricResult.Successful++ diff --git a/analysis/controller_test.go b/analysis/controller_test.go index 8d5efe11f9..cde8ba853e 100644 --- a/analysis/controller_test.go +++ b/analysis/controller_test.go @@ -3,6 +3,7 @@ package analysis import ( "context" "encoding/json" + "fmt" "reflect" "testing" "time" @@ -317,6 +318,44 @@ func TestNoReconcileForAnalysisRunWithDeletionTimestamp(t *testing.T) { f.run(getKey(ar, t)) } +func TestFailedToCreateProviderError(t *testing.T) { + f := newFixture(t) + defer f.Close() + + ar := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: []v1alpha1.Metric{ + { + Name: "metric1", + Provider: v1alpha1.MetricProvider{ + Plugin: map[string]json.RawMessage{"mypluginns/myplugin": []byte(`{"invalid": "json"}`)}, + }, + }, + }, + }, + } + f.analysisRunLister = append(f.analysisRunLister, ar) + f.objects = append(f.objects, ar) + + c, i, k8sI := f.newController(noResyncPeriodFunc) + c.newProvider = func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { + return nil, fmt.Errorf("failed to create provider") + } + + pi := f.expectPatchAnalysisRunAction(ar) + + f.runController(getKey(ar, t), true, false, c, i, k8sI) + + updatedAr := f.getPatchedAnalysisRun(pi) + + assert.Equal(t, v1alpha1.AnalysisPhaseError, updatedAr.Status.MetricResults[0].Measurements[0].Phase) + assert.Equal(t, "failed to create provider", updatedAr.Status.MetricResults[0].Measurements[0].Message) +} + func TestRun(t *testing.T) { f := newFixture(t) defer f.Close() From 0a9c6f1b2c9a26652a675d2c2cda01a341f4e153 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 28 Apr 2023 12:23:42 -0500 Subject: [PATCH 027/159] chore: bump k8s deps to v0.25.8 (#2712) * bump to v0.24.12 Signed-off-by: zachaller * bump to v0.26.3 Signed-off-by: zachaller * bump to v0.25.8 Signed-off-by: zachaller * add new interface functions Signed-off-by: zachaller * fix wrong dep inclusion Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .../features/kustomize/rollout_cr_schema.json | 275 +++++++++ go.mod | 117 ++-- go.sum | 559 ++---------------- manifests/crds/analysis-run-crd.yaml | 56 ++ manifests/crds/analysis-template-crd.yaml | 56 ++ .../crds/cluster-analysis-template-crd.yaml | 56 ++ manifests/crds/experiment-crd.yaml | 11 + manifests/crds/rollout-crd.yaml | 11 + manifests/install.yaml | 190 ++++++ pkg/apiclient/rollout/rollout.swagger.json | 37 +- rollout/trafficrouting/apisix/mocks/apisix.go | 8 + .../trafficrouting/traefik/mocks/traefik.go | 8 + ui/src/models/rollout/generated/api.ts | 38 +- 13 files changed, 834 insertions(+), 588 deletions(-) diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 09d0393a53..6e645d3a4c 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -323,6 +323,72 @@ "format": "int32", "type": "integer" }, + "podFailurePolicy": { + "properties": { + "rules": { + "items": { + "properties": { + "action": { + "type": "string" + }, + "onExitCodes": { + "properties": { + "containerName": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "format": "int32", + "type": "integer" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "operator", + "values" + ], + "type": "object" + }, + "onPodConditions": { + "items": { + "properties": { + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "status", + "type" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "action", + "onPodConditions" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "rules" + ], + "type": "object" + }, "selector": { "properties": { "matchExpressions": { @@ -2808,6 +2874,9 @@ "hostPID": { "type": "boolean" }, + "hostUsers": { + "type": "boolean" + }, "hostname": { "type": "string" }, @@ -3975,6 +4044,13 @@ }, "type": "object" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "format": "int32", "type": "integer" @@ -3983,6 +4059,12 @@ "format": "int32", "type": "integer" }, + "nodeAffinityPolicy": { + "type": "string" + }, + "nodeTaintsPolicy": { + "type": "string" + }, "topologyKey": { "type": "string" }, @@ -4612,6 +4694,72 @@ "format": "int32", "type": "integer" }, + "podFailurePolicy": { + "properties": { + "rules": { + "items": { + "properties": { + "action": { + "type": "string" + }, + "onExitCodes": { + "properties": { + "containerName": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "format": "int32", + "type": "integer" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "operator", + "values" + ], + "type": "object" + }, + "onPodConditions": { + "items": { + "properties": { + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "status", + "type" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "action", + "onPodConditions" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "rules" + ], + "type": "object" + }, "selector": { "properties": { "matchExpressions": { @@ -7097,6 +7245,9 @@ "hostPID": { "type": "boolean" }, + "hostUsers": { + "type": "boolean" + }, "hostname": { "type": "string" }, @@ -8264,6 +8415,13 @@ }, "type": "object" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "format": "int32", "type": "integer" @@ -8272,6 +8430,12 @@ "format": "int32", "type": "integer" }, + "nodeAffinityPolicy": { + "type": "string" + }, + "nodeTaintsPolicy": { + "type": "string" + }, "topologyKey": { "type": "string" }, @@ -8901,6 +9065,72 @@ "format": "int32", "type": "integer" }, + "podFailurePolicy": { + "properties": { + "rules": { + "items": { + "properties": { + "action": { + "type": "string" + }, + "onExitCodes": { + "properties": { + "containerName": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "format": "int32", + "type": "integer" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "operator", + "values" + ], + "type": "object" + }, + "onPodConditions": { + "items": { + "properties": { + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "status", + "type" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "action", + "onPodConditions" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "rules" + ], + "type": "object" + }, "selector": { "properties": { "matchExpressions": { @@ -11386,6 +11616,9 @@ "hostPID": { "type": "boolean" }, + "hostUsers": { + "type": "boolean" + }, "hostname": { "type": "string" }, @@ -12553,6 +12786,13 @@ }, "type": "object" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "format": "int32", "type": "integer" @@ -12561,6 +12801,12 @@ "format": "int32", "type": "integer" }, + "nodeAffinityPolicy": { + "type": "string" + }, + "nodeTaintsPolicy": { + "type": "string" + }, "topologyKey": { "type": "string" }, @@ -15486,6 +15732,9 @@ "hostPID": { "type": "boolean" }, + "hostUsers": { + "type": "boolean" + }, "hostname": { "type": "string" }, @@ -16653,6 +16902,13 @@ }, "type": "object" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "format": "int32", "type": "integer" @@ -16661,6 +16917,12 @@ "format": "int32", "type": "integer" }, + "nodeAffinityPolicy": { + "type": "string" + }, + "nodeTaintsPolicy": { + "type": "string" + }, "topologyKey": { "type": "string" }, @@ -19787,6 +20049,13 @@ }, "type": "object" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "maxSkew": { "format": "int32", "type": "integer" @@ -19795,6 +20064,12 @@ "format": "int32", "type": "integer" }, + "nodeAffinityPolicy": { + "type": "string" + }, + "nodeTaintsPolicy": { + "type": "string" + }, "topologyKey": { "type": "string" }, diff --git a/go.mod b/go.mod index f5ea4c067d..2e3e6a473c 100644 --- a/go.mod +++ b/go.mod @@ -40,47 +40,48 @@ require ( google.golang.org/grpc v1.54.0 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.24.2 - k8s.io/apiextensions-apiserver v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/apiserver v0.24.2 - k8s.io/cli-runtime v0.24.2 - k8s.io/client-go v0.24.2 - k8s.io/code-generator v0.24.2 - k8s.io/component-base v0.24.2 - k8s.io/klog/v2 v2.70.1 - k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 - k8s.io/kubectl v0.24.2 - k8s.io/kubernetes v1.24.2 - k8s.io/utils v0.0.0-20220706174534-f6158b442e7c + k8s.io/api v0.25.8 + k8s.io/apiextensions-apiserver v0.25.8 + k8s.io/apimachinery v0.25.8 + k8s.io/apiserver v0.25.8 + k8s.io/cli-runtime v0.25.8 + k8s.io/client-go v0.25.8 + k8s.io/code-generator v0.25.8 + k8s.io/component-base v0.25.8 + k8s.io/klog/v2 v2.80.1 + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 + k8s.io/kubectl v0.25.8 + k8s.io/kubernetes v1.25.8 + k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 ) require ( + cloud.google.com/go/compute v1.15.1 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.27 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/PagerDuty/go-pagerduty v1.6.0 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-github/v45 v45.2.0 // indirect github.com/matryer/is v1.4.0 // indirect + github.com/russross/blackfriday v1.6.0 // indirect ) require ( - cloud.google.com/go/compute v1.15.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect - github.com/aws/aws-sdk-go v1.44.39 // indirect + github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect @@ -94,7 +95,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.11.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect @@ -145,20 +146,18 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/run v1.0.0 // indirect - github.com/onsi/ginkgo v1.16.4 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect - github.com/russross/blackfriday v1.6.0 // indirect github.com/slack-go/slack v0.12.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -166,7 +165,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fastjson v1.6.3 // indirect github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect - github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect + github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/crypto v0.5.0 // indirect golang.org/x/mod v0.8.0 // indirect @@ -184,41 +183,41 @@ require ( gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/cluster-bootstrap v0.24.2 // indirect - k8s.io/component-helpers v0.24.2 // indirect - k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect - sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124 // indirect - sigs.k8s.io/kustomize/api v0.11.5 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.7 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + k8s.io/cluster-bootstrap v0.25.8 // indirect + k8s.io/component-helpers v0.25.8 // indirect + k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/kustomize/api v0.12.1 // indirect + sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) replace ( github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 - k8s.io/api v0.0.0 => k8s.io/api v0.24.2 - k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.24.2 - k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.24.2 - k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.24.2 - k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.24.2 - k8s.io/client-go v0.0.0 => k8s.io/client-go v0.24.2 - k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.24.2 - k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.24.2 - k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.24.2 - k8s.io/component-base v0.0.0 => k8s.io/component-base v0.24.2 - k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.24.2 - k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.24.2 - k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.24.2 - k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.24.2 - k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.24.2 - k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.24.2 - k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.24.2 - k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.24.2 - k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.24.2 - k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.24.2 - k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.24.2 - k8s.io/metrics v0.0.0 => k8s.io/metrics v0.24.2 - k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.24.2 - k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.24.2 - k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.24.2 + k8s.io/api v0.0.0 => k8s.io/api v0.25.8 + k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.25.8 + k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.25.8 + k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.25.8 + k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.25.8 + k8s.io/client-go v0.0.0 => k8s.io/client-go v0.25.8 + k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.25.8 + k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.25.8 + k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.25.8 + k8s.io/component-base v0.0.0 => k8s.io/component-base v0.25.8 + k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.25.8 + k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.25.8 + k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.25.8 + k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.25.8 + k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.25.8 + k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.25.8 + k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.25.8 + k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.25.8 + k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.25.8 + k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.25.8 + k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.25.8 + k8s.io/metrics v0.0.0 => k8s.io/metrics v0.25.8 + k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.25.8 + k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.25.8 + k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.25.8 ) diff --git a/go.sum b/go.sum index c227dc4553..dbb4669683 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -15,11 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -32,7 +25,6 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -43,18 +35,14 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v55.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= @@ -66,8 +54,6 @@ github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= @@ -76,11 +62,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/k8s-cloud-provider v1.16.1-0.20210702024009-ea6160c1d0e3/go.mod h1:8XasY4ymP2V/tn2OOV9ZadmiTE1FIB/h3W+yNlPttKw= -github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -89,11 +72,7 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.22/go.mod h1:91uVCVzvX2QD16sMCenoxxXo6L1wJnLMX2PSufFMtF0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PagerDuty/go-pagerduty v1.6.0 h1:am81SzvG5Pw+s3JZ5yEy6kGvsXXklTNRrGr3d8WKpsU= github.com/PagerDuty/go-pagerduty v1.6.0/go.mod h1:7eaBLzsDpK7VUvU0SJ5mohczQkoWrrr5CjDaw5gh1as= @@ -103,14 +82,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdko github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 h1:MdZskg1II+YVe+9ss935i8+paqqf4KEuYcTYUWSwABI= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214/go.mod h1:rjP7sIipbZcagro/6TCk6X0ZeFT2eyudH5+fve/cbBA= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/antonmedv/expr v1.12.5 h1:Fq4okale9swwL3OeLLs9WD9H6GbgBLJyN/NUHRv+n0E= github.com/antonmedv/expr v1.12.5/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= @@ -118,19 +95,12 @@ github.com/argoproj/notifications-engine v0.4.0 h1:XyE4jAw0oeRQKL9vlDQBnycmqhN7E github.com/argoproj/notifications-engine v0.4.0/go.mod h1:uGas18+DbCCwjif1zSwWWuwR0xJ18FXF+c2dkhPbF2k= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM= -github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.39 h1:pMxYLqnuDidT0ZTDAhYC66fb3W3Yc+oShmfzEL4fTDI= 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.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= @@ -163,20 +133,15 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZ github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh63t1Oo= github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 h1:5+NghM1Zred9Z078QEZtm28G/kfDfZN/92gkDlLwGVA= @@ -185,69 +150,29 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/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/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.12/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.14/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= @@ -255,14 +180,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/deepmap/oapi-codegen v1.11.0 h1:f/X2NdIkaBKsSdpeuwLnY/vDI0AtPUrmB5LMgc7YD+A= github.com/deepmap/oapi-codegen v1.11.0/go.mod h1:k+ujhoQGxmQYBZBbxhOZNZf4j08qv5mC+OH+fFTnKxM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -276,45 +195,28 @@ github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= 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/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= @@ -322,7 +224,6 @@ github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -340,7 +241,6 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -349,7 +249,6 @@ github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= @@ -357,10 +256,8 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= @@ -369,19 +266,13 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -392,7 +283,6 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -410,7 +300,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -429,21 +318,14 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cadvisor v0.44.1/go.mod h1:GQ9KQfz0iNHQk3D6ftzJWK4TXabfIgM10Oy3FkR+Gzg= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -454,7 +336,6 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -475,7 +356,6 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -483,10 +363,6 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -499,13 +375,10 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbVkFXCXHz1QPhVXcHnQKAzBTPfQo= github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -516,14 +389,8 @@ github.com/gregdel/pushover v1.1.0/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -532,37 +399,21 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S 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-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.4.9 h1:ESiK220/qE0aGxWdzKIvRH69iLiuN/PjoLTm69RoWtU= github.com/hashicorp/go-plugin v1.4.9/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= 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-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/heketi/heketi v10.3.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= -github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -573,7 +424,6 @@ github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0 github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= @@ -582,8 +432,6 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -602,9 +450,6 @@ github.com/juju/ansiterm v1.0.0 h1:gmMvnZRq7JZJx6jkfSq9/+2LMrVEwGwt7UR6G+lmDEg= github.com/juju/ansiterm v1.0.0/go.mod h1:PyXUpnI3olx3bsPcHt98FGPX/KCFZ1Fi+hw1XLI6384= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -612,9 +457,7 @@ github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -638,20 +481,14 @@ github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbq github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0= github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg= github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkBZfo= github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailgun/mailgun-go v2.0.0+incompatible/go.mod h1:NWTyU+O4aczg/nsGhQnvHL6v2n5Gy6Sv5tNDVvC6FbU= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -677,43 +514,28 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.29/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -721,16 +543,12 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -740,13 +558,9 @@ github.com/newrelic/newrelic-client-go v1.1.0/go.mod h1:RYMXt7hgYw7nzuXIGd2BH0F1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 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/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -754,33 +568,20 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 h1:nV98dkBpqaYbDnhefmOQ+Rn4hE+jD6AtjYHXaU5WyJI= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13/go.mod h1:4OjcxgwdXzezqytxN534MooNmrxRD50geWZxTD7845s= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -788,17 +589,13 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -807,31 +604,20 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -839,35 +625,23 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/servicemeshinterface/smi-sdk-go v0.5.0 h1:9cZdhvGbGDlmnp9qqmcQL+RL6KZ3IzHfDLoA5Axg8n0= github.com/servicemeshinterface/smi-sdk-go v0.5.0/go.mod h1:nm1Slf3pfaZPP3g2tE/K5wDmQ1uWVSP0p3uu5rQAQLc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= @@ -875,31 +649,17 @@ github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5Pse github.com/spaceapegames/go-wavefront v1.8.1 h1:Xuby0uBfw1WVxD9d+l8Gh+zINqnBfd0RJT8e/3i3vBM= github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDvT/MON9v+4pbdagA8As= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -917,22 +677,14 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= 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-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= @@ -940,68 +692,28 @@ github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLr github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 h1:qqllXPzXh+So+mmANlX/gCJrgo+1kQyshMoQ+NASzm0= github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0/go.mod h1:2rx5KE5FLD0HRfkkpyn8JwbVLBdhgeiOb2D2D9LLKM4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= +github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1009,28 +721,20 @@ golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1038,8 +742,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20210220032938-85be41e4509f/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1052,21 +754,14 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= @@ -1075,17 +770,13 @@ golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1110,19 +801,13 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1134,16 +819,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1163,8 +839,6 @@ golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1175,31 +849,26 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1212,41 +881,21 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1263,7 +912,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -1273,18 +921,13 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1302,8 +945,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1311,7 +952,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1332,18 +972,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -1357,12 +987,6 @@ gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45/go.mod h1:41y72mzHT gomodules.xyz/notify v0.1.1 h1:1tTuoyswmPvzqPCTEDQK8SZ3ukCxLsonAAwst2+y1a0= gomodules.xyz/notify v0.1.1/go.mod h1:QgQyU4xEA/plJcDeT66J2Go2V7U4c0pD9wjo7HfFil4= gomodules.xyz/version v0.1.0/go.mod h1:Y8xuV02mL/45psyPKG3NCVOwvAOy6T5Kx0l3rCjKSjU= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1379,13 +1003,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1407,7 +1024,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1416,7 +1032,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1426,27 +1041,11 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1457,15 +1056,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= @@ -1496,21 +1088,12 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1529,7 +1112,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1539,107 +1121,68 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.17.8/go.mod h1:N++Llhs8kCixMUoCaXXAyMMPbo8dDVnh+IQ36xZV2/0= k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/api v0.25.8 h1:pcbnWkCcmjNhp6OEKqR+ojO0CJydpOOw7WiWedjLJAU= +k8s.io/api v0.25.8/go.mod h1:FaJqAtI13XOERtpLOQTkW3SiSf0lqsUohYqaxCyHI18= +k8s.io/apiextensions-apiserver v0.25.8 h1:PBji7zCXwYoEabNcNOfvb3asd5LIwZKh1mowrbwn010= +k8s.io/apiextensions-apiserver v0.25.8/go.mod h1:3wN73ddXCwLTE1exhoBiWp5G3u6xRfoNt0cKTHZ5KGE= k8s.io/apimachinery v0.17.8/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2 h1:orxipm5elPJSkkFNlwH9ClqaKEDJJA3yR2cAAlCnyj4= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.2 h1:KxY6tSgPGsahA6c1/dmR3uF5jOxXPx2QQY6C5ZrLmtE= -k8s.io/cli-runtime v0.24.2/go.mod h1:1LIhKL2RblkhfG4v5lZEt7FtgFG5mVb8wqv5lE9m5qY= +k8s.io/apimachinery v0.25.8 h1:c4kI9xm0U5nid8sBpBvM+2VHlv4Af8KnbhZIodZF/54= +k8s.io/apimachinery v0.25.8/go.mod h1:ZTl0drTQaFi5gMM3snYI5tWV1XJmRH1gfnDx2QCLsxk= +k8s.io/apiserver v0.25.8 h1:ZTYdLdouAu8D6h9QavMaQZiAV+EfWK87VGdOyb6RZMQ= +k8s.io/apiserver v0.25.8/go.mod h1:IJ1r0vqXxwa+3QbrxAHWqdmoGZnVDDMzWtIK9ju3maI= +k8s.io/cli-runtime v0.25.8 h1:3+I4zgdcY0KoCAWgqfQEMkhKOK35ailULxeTMcrBAfs= +k8s.io/cli-runtime v0.25.8/go.mod h1:Kbi+0tb9s/Gtsp3HfMJ/P20K3MYeC4t/CMDaV4pZiJQ= k8s.io/client-go v0.17.8/go.mod h1:SJsDS64AAtt9VZyeaQMb4Ck5etCitZ/FwajWdzua5eY= k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/cloud-provider v0.24.2/go.mod h1:a7jyWjizk+IKbcIf8+mX2cj3NvpRv9ZyGdXDyb8UEkI= -k8s.io/cluster-bootstrap v0.24.2 h1:p177dIhDst4INUWBZgTnqSad8oJiUdKo0cLLVU24AzE= -k8s.io/cluster-bootstrap v0.24.2/go.mod h1:eIHV338K03vBm3u/ROZiNXxWJ4AJRoTR9PEUhcTvYkg= +k8s.io/client-go v0.25.8 h1:PruqsI6qccbowI5wjeNosyE1BiKViChRWVOvCZtYnXY= +k8s.io/client-go v0.25.8/go.mod h1:Wiu5CQCaOqWugLrdvl04HK90P0QMc4oxQ3BXoJGjD+A= +k8s.io/cluster-bootstrap v0.25.8 h1:2JoXlDAnki1rmYMdrExP5tYXJgJhCERYHtAbucjZgs8= +k8s.io/cluster-bootstrap v0.25.8/go.mod h1:O7q/A8Os259t1Tm2S9Zn9XipZ9eej0AfApj1htCT0Lc= k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.24.2 h1:EGeRWzJrpwi6T6CvoNl0spM6fnAnOdCr0rz7H4NU1rk= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.2 h1:gtXmI/TjVINtkAdZn7m5p8+Vd0Mk4d1q8kwJMMLBdwY= -k8s.io/component-helpers v0.24.2/go.mod h1:TRQPBQKfmqkmV6c0HAmUs8cXVNYYYLsXy4zu8eODi9g= -k8s.io/controller-manager v0.24.2/go.mod h1:hpwCof4KxP4vrw/M5QiVxU6Zmmggmr1keGXtjGHF+vc= -k8s.io/cri-api v0.24.2/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= -k8s.io/csi-translation-lib v0.24.2/go.mod h1:pdHc2CYLViQYYsOqOp79hjKYi8J4NZ7vpiVzn1SqBrg= +k8s.io/code-generator v0.25.8 h1:rhj7PQgiTdDiV2D9Ep0wHRppQ/jrG7DDJ5vPpEtRtck= +k8s.io/code-generator v0.25.8/go.mod h1:DHfpdhSUrwqF0f4oLqCtF8gYbqlndNetjBEz45nWzJI= +k8s.io/component-base v0.25.8 h1:lQ5Ouw7lupdpXn5slRjAeHnlMK/aAEbPf9jjSWbOD3c= +k8s.io/component-base v0.25.8/go.mod h1:MkC9Lz4fXoGOgB2WhFBU4zjiviIEeJS3sVhTxX9vt6s= +k8s.io/component-helpers v0.25.8 h1:jTi68SNaCis1s4//S7CXOtmzIOqhiY5CUroZuD2+OEg= +k8s.io/component-helpers v0.25.8/go.mod h1:+EZENL02v1dJXJvAYXZfAldATLviWL7Y/K3Pw8LB3MU= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-aggregator v0.24.2/go.mod h1:Ju2jNDixn+vqeeKEBfjfpc204bO1pbdXX0N9knCxeMQ= -k8s.io/kube-controller-manager v0.24.2/go.mod h1:KDE0yqiEvxYiO0WRpPA4rVx8AcK1vsWydUF37AJ9lTI= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661/go.mod h1:daOouuuwd9JXpv1L7Y34iV3yf6nxzipkKMWWlqlvK9M= -k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 h1:yEQKdMCjzAOvGeiTwG4hO/hNVNtDOuUFvMUZ0OlaIzs= -k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8/go.mod h1:mbJ+NSUoAhuR14N0S63bPkh8MGVSo3VYSGZtH/mfMe0= -k8s.io/kube-proxy v0.24.2/go.mod h1:bozS2ufl/Ns6s40Ue34eV7rqyLVygi5usSmCgW7rFU8= -k8s.io/kube-scheduler v0.24.2/go.mod h1:DRa+aeXKSYUUOHHIc/9EcaO9+FW5FydaOfPSvaSW5Ko= -k8s.io/kubectl v0.24.2 h1:+RfQVhth8akUmIc2Ge8krMl/pt66V7210ka3RE/p0J4= -k8s.io/kubectl v0.24.2/go.mod h1:+HIFJc0bA6Tzu5O/YcuUt45APAxnNL8LeMuXwoiGsPg= -k8s.io/kubelet v0.24.2/go.mod h1:Xm9DkWQjwOs+uGOUIIGIPMvvmenvj0lDVOErvIKOOt0= -k8s.io/kubernetes v1.24.2 h1:AyjtHzSysliKR04Km91njmk2yaKmOa3ZISQZCIGUnVI= -k8s.io/kubernetes v1.24.2/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0= -k8s.io/legacy-cloud-providers v0.24.2/go.mod h1:sgkasgIP2ZOew8fzoOq0mQLVXJ4AmB57IUbFUjzPWEo= -k8s.io/metrics v0.24.2/go.mod h1:5NWURxZ6Lz5gj8TFU83+vdWIVASx7W8lwPpHYCqopMo= -k8s.io/mount-utils v0.24.2/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= -k8s.io/pod-security-admission v0.24.2/go.mod h1:znnuDHWWWvh/tpbYYPwTsd4y//qHi3cOX+wGxET/mMI= -k8s.io/sample-apiserver v0.24.2/go.mod h1:mf8qgDdu450wqpCJOkSAmoTgU4PIMAcfa5uTBwmJekE= -k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kubectl v0.25.8 h1:i6nlpU5LQyg9J19mKihJo1oE7FE7+Zg1cF4TOpJQmEQ= +k8s.io/kubectl v0.25.8/go.mod h1:IPmVLfTvFIZKl0vwyl0LkegIbk2jsnaVmkpDgDymCPI= +k8s.io/kubernetes v1.25.8 h1:RQ3Rf3aScxhg/xDT1GebWFHOtYodM83Q/Yxvgku39G4= +k8s.io/kubernetes v1.25.8/go.mod h1:mEIT8S9Ir6R4R8N6VLmfxcNFAmGU2hEtV780TuPYlug= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220706174534-f6158b442e7c h1:hFZO68mv/0xe8+V0gRT9BAq3/31cKjjeVv4nScriuBk= -k8s.io/utils v0.0.0-20220706174534-f6158b442e7c/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124 h1:2sgAQQcY0dEW2SsQwTXhQV4vO6+rSslYx8K3XmM5hqQ= -sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag= -sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk= -sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= +sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= +sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= +sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index a4316fa4f9..920eaff7b5 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -232,6 +232,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -1824,6 +1869,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -2571,12 +2618,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 528e3f6fc7..e60e521f1f 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -228,6 +228,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -1820,6 +1865,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -2567,12 +2614,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index cfc93db1ba..3849f1f3b8 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -228,6 +228,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -1820,6 +1865,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -2567,12 +2614,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/manifests/crds/experiment-crd.yaml b/manifests/crds/experiment-crd.yaml index f856a4b9a9..5fb7940b31 100644 --- a/manifests/crds/experiment-crd.yaml +++ b/manifests/crds/experiment-crd.yaml @@ -1720,6 +1720,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -2467,12 +2469,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index bbd547baee..2b026746b6 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -2456,6 +2456,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -3203,12 +3205,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/manifests/install.yaml b/manifests/install.yaml index 8ac2ebaaca..7d9ae8ac33 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -233,6 +233,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -1825,6 +1870,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -2572,12 +2619,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: @@ -3124,6 +3180,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -4716,6 +4817,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -5463,12 +5566,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: @@ -5901,6 +6013,51 @@ spec: parallelism: format: int32 type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object selector: properties: matchExpressions: @@ -7493,6 +7650,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -8240,12 +8399,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: @@ -10170,6 +10338,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -10917,12 +11087,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: @@ -13511,6 +13690,8 @@ spec: type: boolean hostPID: type: boolean + hostUsers: + type: boolean hostname: type: string imagePullSecrets: @@ -14258,12 +14439,21 @@ spec: type: string type: object type: object + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic maxSkew: format: int32 type: integer minDomains: format: int32 type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string topologyKey: type: string whenUnsatisfiable: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index b47f017c91..134bfbf595 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -2220,7 +2220,7 @@ "items": { "$ref": "#/definitions/k8s.io.api.core.v1.ContainerPort" }, - "title": "List of ports to expose from the container. Exposing a port here gives\nthe system additional information about the network connections a\ncontainer uses, but is primarily informational. Not specifying a port here\nDOES NOT prevent that port from being exposed. Any port which is\nlistening on the default \"0.0.0.0\" address inside a container will be\naccessible from the network.\nCannot be updated.\n+optional\n+patchMergeKey=containerPort\n+patchStrategy=merge\n+listType=map\n+listMapKey=containerPort\n+listMapKey=protocol" + "title": "List of ports to expose from the container. Not specifying a port here\nDOES NOT prevent that port from being exposed. Any port which is\nlistening on the default \"0.0.0.0\" address inside a container will be\naccessible from the network.\nModifying this array with strategic merge patch may corrupt the data.\nFor more information See https://github.com/kubernetes/kubernetes/issues/108255.\nCannot be updated.\n+optional\n+patchMergeKey=containerPort\n+patchStrategy=merge\n+listType=map\n+listMapKey=containerPort\n+listMapKey=protocol" }, "envFrom": { "type": "array", @@ -2467,7 +2467,7 @@ "description": "If set, the name of the container from PodSpec that this ephemeral container targets.\nThe ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\nIf not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\nThe container runtime must implement support for this feature. If the runtime does not\nsupport namespace targeting then the result of setting this field is undefined.\n+optional" } }, - "description": "An EphemeralContainer is a temporary container that you may add to an existing Pod for\nuser-initiated activities such as debugging. Ephemeral containers have no resource or\nscheduling guarantees, and they will not be restarted when they exit or when a Pod is\nremoved or restarted. The kubelet may evict a Pod if an ephemeral container causes the\nPod to exceed its resource allocation.\n\nTo add an ephemeral container, use the ephemeralcontainers subresource of an existing\nPod. Ephemeral containers may not be removed or restarted.\n\nThis is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate." + "description": "An EphemeralContainer is a temporary container that you may add to an existing Pod for\nuser-initiated activities such as debugging. Ephemeral containers have no resource or\nscheduling guarantees, and they will not be restarted when they exit or when a Pod is\nremoved or restarted. The kubelet may evict a Pod if an ephemeral container causes the\nPod to exceed its resource allocation.\n\nTo add an ephemeral container, use the ephemeralcontainers subresource of an existing\nPod. Ephemeral containers may not be removed or restarted." }, "k8s.io.api.core.v1.EphemeralContainerCommon": { "type": "object", @@ -3343,7 +3343,7 @@ "items": { "$ref": "#/definitions/k8s.io.api.core.v1.EphemeralContainer" }, - "title": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\npod to perform user-initiated actions such as debugging. This list cannot be specified when\ncreating a pod, and it cannot be modified by updating the pod spec. In order to add an\nephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\nThis field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate.\n+optional\n+patchMergeKey=name\n+patchStrategy=merge" + "title": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\npod to perform user-initiated actions such as debugging. This list cannot be specified when\ncreating a pod, and it cannot be modified by updating the pod spec. In order to add an\nephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n+optional\n+patchMergeKey=name\n+patchStrategy=merge" }, "restartPolicy": { "type": "string", @@ -3495,7 +3495,11 @@ }, "os": { "$ref": "#/definitions/k8s.io.api.core.v1.PodOS", - "description": "Specifies the OS of the containers in the pod.\nSome pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset:\n-securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset:\n- spec.hostPID\n- spec.hostIPC\n- spec.securityContext.seLinuxOptions\n- spec.securityContext.seccompProfile\n- spec.securityContext.fsGroup\n- spec.securityContext.fsGroupChangePolicy\n- spec.securityContext.sysctls\n- spec.shareProcessNamespace\n- spec.securityContext.runAsUser\n- spec.securityContext.runAsGroup\n- spec.securityContext.supplementalGroups\n- spec.containers[*].securityContext.seLinuxOptions\n- spec.containers[*].securityContext.seccompProfile\n- spec.containers[*].securityContext.capabilities\n- spec.containers[*].securityContext.readOnlyRootFilesystem\n- spec.containers[*].securityContext.privileged\n- spec.containers[*].securityContext.allowPrivilegeEscalation\n- spec.containers[*].securityContext.procMount\n- spec.containers[*].securityContext.runAsUser\n- spec.containers[*].securityContext.runAsGroup\n+optional\nThis is a beta field and requires the IdentifyPodOS feature" + "description": "Specifies the OS of the containers in the pod.\nSome pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset:\n-securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset:\n- spec.hostPID\n- spec.hostIPC\n- spec.hostUsers\n- spec.securityContext.seLinuxOptions\n- spec.securityContext.seccompProfile\n- spec.securityContext.fsGroup\n- spec.securityContext.fsGroupChangePolicy\n- spec.securityContext.sysctls\n- spec.shareProcessNamespace\n- spec.securityContext.runAsUser\n- spec.securityContext.runAsGroup\n- spec.securityContext.supplementalGroups\n- spec.containers[*].securityContext.seLinuxOptions\n- spec.containers[*].securityContext.seccompProfile\n- spec.containers[*].securityContext.capabilities\n- spec.containers[*].securityContext.readOnlyRootFilesystem\n- spec.containers[*].securityContext.privileged\n- spec.containers[*].securityContext.allowPrivilegeEscalation\n- spec.containers[*].securityContext.procMount\n- spec.containers[*].securityContext.runAsUser\n- spec.containers[*].securityContext.runAsGroup\n+optional" + }, + "hostUsers": { + "type": "boolean", + "title": "Use the host's user namespace.\nOptional: Default to true.\nIf set to true or not present, the pod will be run in the host user namespace, useful\nfor when the pod needs a feature only available to the host user namespace, such as\nloading a kernel module with CAP_SYS_MODULE.\nWhen set to false, a new userns is created for the pod. Setting false is useful for\nmitigating container breakout vulnerabilities even allowing users to run their\ncontainers as root without actually having root privileges on the host.\nThis field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n+k8s:conversion-gen=false\n+optional" } }, "description": "PodSpec is a description of a pod." @@ -4059,7 +4063,7 @@ }, "topologyKey": { "type": "string", - "description": "TopologyKey is the key of node labels. Nodes that have a label with this key\nand identical values are considered to be in the same topology.\nWe consider each \u003ckey, value\u003e as a \"bucket\", and try to put balanced number\nof pods into each bucket.\nWe define a domain as a particular instance of a topology.\nAlso, we define an eligible domain as a domain whose nodes match the node selector.\ne.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\nAnd, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\nIt's a required field." + "description": "TopologyKey is the key of node labels. Nodes that have a label with this key\nand identical values are considered to be in the same topology.\nWe consider each \u003ckey, value\u003e as a \"bucket\", and try to put balanced number\nof pods into each bucket.\nWe define a domain as a particular instance of a topology.\nAlso, we define an eligible domain as a domain whose nodes meet the requirements of\nnodeAffinityPolicy and nodeTaintsPolicy.\ne.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\nAnd, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\nIt's a required field." }, "whenUnsatisfiable": { "type": "string", @@ -4072,7 +4076,22 @@ "minDomains": { "type": "integer", "format": "int32", - "description": "MinDomains indicates a minimum number of eligible domains.\nWhen the number of eligible domains with matching topology keys is less than minDomains,\nPod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\nAnd when the number of eligible domains with matching topology keys equals or greater than minDomains,\nthis value has no effect on scheduling.\nAs a result, when the number of eligible domains is less than minDomains,\nscheduler won't schedule more than maxSkew Pods to those domains.\nIf value is nil, the constraint behaves as if MinDomains is equal to 1.\nValid values are integers greater than 0.\nWhen value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\nFor example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\nlabelSelector spread as 2/2/2:\n+-------+-------+-------+\n| zone1 | zone2 | zone3 |\n+-------+-------+-------+\n| P P | P P | P P |\n+-------+-------+-------+\nThe number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\nIn this situation, new pod with the same labelSelector cannot be scheduled,\nbecause computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\nit will violate MaxSkew.\n\nThis is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate.\n+optional" + "description": "MinDomains indicates a minimum number of eligible domains.\nWhen the number of eligible domains with matching topology keys is less than minDomains,\nPod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\nAnd when the number of eligible domains with matching topology keys equals or greater than minDomains,\nthis value has no effect on scheduling.\nAs a result, when the number of eligible domains is less than minDomains,\nscheduler won't schedule more than maxSkew Pods to those domains.\nIf value is nil, the constraint behaves as if MinDomains is equal to 1.\nValid values are integers greater than 0.\nWhen value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\nFor example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\nlabelSelector spread as 2/2/2:\n+-------+-------+-------+\n| zone1 | zone2 | zone3 |\n+-------+-------+-------+\n| P P | P P | P P |\n+-------+-------+-------+\nThe number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\nIn this situation, new pod with the same labelSelector cannot be scheduled,\nbecause computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\nit will violate MaxSkew.\n\nThis is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n+optional" + }, + "nodeAffinityPolicy": { + "type": "string", + "description": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\nwhen calculating pod topology spread skew. Options are:\n- Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n- Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy.\nThis is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" + }, + "nodeTaintsPolicy": { + "type": "string", + "description": "NodeTaintsPolicy indicates how we will treat node taints when calculating\npod topology spread skew. Options are:\n- Honor: nodes without taints, along with tainted nodes for which the incoming pod\nhas a toleration, are included.\n- Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy.\nThis is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" + }, + "matchLabelKeys": { + "type": "array", + "items": { + "type": "string" + }, + "title": "MatchLabelKeys is a set of pod label keys to select the pods over which\nspreading will be calculated. The keys are used to lookup values from the\nincoming pod labels, those key-value labels are ANDed with labelSelector\nto select the group of existing pods over which spreading will be calculated\nfor the incoming pod. Keys that don't exist in the incoming pod labels will\nbe ignored. A null or empty list means only match against labelSelector.\n+listType=atomic\n+optional" } }, "description": "TopologySpreadConstraint specifies how to spread matching pods among the given topology." @@ -4363,7 +4382,7 @@ "type": "string" } }, - "description": "Quantity is a fixed-point representation of a number.\nIt provides convenient marshaling/unmarshaling in JSON and YAML,\nin addition to String() and AsInt64() accessors.\n\nThe serialization format is:\n\n\u003cquantity\u003e ::= \u003csignedNumber\u003e\u003csuffix\u003e\n (Note that \u003csuffix\u003e may be empty, from the \"\" case in \u003cdecimalSI\u003e.)\n\u003cdigit\u003e ::= 0 | 1 | ... | 9\n\u003cdigits\u003e ::= \u003cdigit\u003e | \u003cdigit\u003e\u003cdigits\u003e\n\u003cnumber\u003e ::= \u003cdigits\u003e | \u003cdigits\u003e.\u003cdigits\u003e | \u003cdigits\u003e. | .\u003cdigits\u003e\n\u003csign\u003e ::= \"+\" | \"-\"\n\u003csignedNumber\u003e ::= \u003cnumber\u003e | \u003csign\u003e\u003cnumber\u003e\n\u003csuffix\u003e ::= \u003cbinarySI\u003e | \u003cdecimalExponent\u003e | \u003cdecimalSI\u003e\n\u003cbinarySI\u003e ::= Ki | Mi | Gi | Ti | Pi | Ei\n (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html)\n\u003cdecimalSI\u003e ::= m | \"\" | k | M | G | T | P | E\n (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.)\n\u003cdecimalExponent\u003e ::= \"e\" \u003csignedNumber\u003e | \"E\" \u003csignedNumber\u003e\n\nNo matter which of the three exponent forms is used, no quantity may represent\na number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal\nplaces. Numbers larger or more precise will be capped or rounded up.\n(E.g.: 0.1m will rounded up to 1m.)\nThis may be extended in the future if we require larger or smaller quantities.\n\nWhen a Quantity is parsed from a string, it will remember the type of suffix\nit had, and will use the same type again when it is serialized.\n\nBefore serializing, Quantity will be put in \"canonical form\".\nThis means that Exponent/suffix will be adjusted up or down (with a\ncorresponding increase or decrease in Mantissa) such that:\n a. No precision is lost\n b. No fractional digits will be emitted\n c. The exponent (or suffix) is as large as possible.\nThe sign will be omitted unless the number is negative.\n\nExamples:\n 1.5 will be serialized as \"1500m\"\n 1.5Gi will be serialized as \"1536Mi\"\n\nNote that the quantity will NEVER be internally represented by a\nfloating point number. That is the whole point of this exercise.\n\nNon-canonical values will still parse as long as they are well formed,\nbut will be re-emitted in their canonical form. (So always use canonical\nform, or don't diff.)\n\nThis format is intended to make it difficult to use these numbers without\nwriting some sort of special handling code in the hopes that that will\ncause implementors to also use a fixed point implementation.\n\n+protobuf=true\n+protobuf.embed=string\n+protobuf.options.marshal=false\n+protobuf.options.(gogoproto.goproto_stringer)=false\n+k8s:deepcopy-gen=true\n+k8s:openapi-gen=true" + "description": "Quantity is a fixed-point representation of a number.\nIt provides convenient marshaling/unmarshaling in JSON and YAML,\nin addition to String() and AsInt64() accessors.\n\nThe serialization format is:\n\n```\n\u003cquantity\u003e ::= \u003csignedNumber\u003e\u003csuffix\u003e\n\n\t(Note that \u003csuffix\u003e may be empty, from the \"\" case in \u003cdecimalSI\u003e.)\n\n\u003cdigit\u003e ::= 0 | 1 | ... | 9\n\u003cdigits\u003e ::= \u003cdigit\u003e | \u003cdigit\u003e\u003cdigits\u003e\n\u003cnumber\u003e ::= \u003cdigits\u003e | \u003cdigits\u003e.\u003cdigits\u003e | \u003cdigits\u003e. | .\u003cdigits\u003e\n\u003csign\u003e ::= \"+\" | \"-\"\n\u003csignedNumber\u003e ::= \u003cnumber\u003e | \u003csign\u003e\u003cnumber\u003e\n\u003csuffix\u003e ::= \u003cbinarySI\u003e | \u003cdecimalExponent\u003e | \u003cdecimalSI\u003e\n\u003cbinarySI\u003e ::= Ki | Mi | Gi | Ti | Pi | Ei\n\n\t(International System of units; See: http://physics.nist.gov/cuu/Units/binary.html)\n\n\u003cdecimalSI\u003e ::= m | \"\" | k | M | G | T | P | E\n\n\t(Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.)\n\n\u003cdecimalExponent\u003e ::= \"e\" \u003csignedNumber\u003e | \"E\" \u003csignedNumber\u003e\n```\n\nNo matter which of the three exponent forms is used, no quantity may represent\na number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal\nplaces. Numbers larger or more precise will be capped or rounded up.\n(E.g.: 0.1m will rounded up to 1m.)\nThis may be extended in the future if we require larger or smaller quantities.\n\nWhen a Quantity is parsed from a string, it will remember the type of suffix\nit had, and will use the same type again when it is serialized.\n\nBefore serializing, Quantity will be put in \"canonical form\".\nThis means that Exponent/suffix will be adjusted up or down (with a\ncorresponding increase or decrease in Mantissa) such that:\n\n- No precision is lost\n- No fractional digits will be emitted\n- The exponent (or suffix) is as large as possible.\n\nThe sign will be omitted unless the number is negative.\n\nExamples:\n\n- 1.5 will be serialized as \"1500m\"\n- 1.5Gi will be serialized as \"1536Mi\"\n\nNote that the quantity will NEVER be internally represented by a\nfloating point number. That is the whole point of this exercise.\n\nNon-canonical values will still parse as long as they are well formed,\nbut will be re-emitted in their canonical form. (So always use canonical\nform, or don't diff.)\n\nThis format is intended to make it difficult to use these numbers without\nwriting some sort of special handling code in the hopes that that will\ncause implementors to also use a fixed point implementation.\n\n+protobuf=true\n+protobuf.embed=string\n+protobuf.options.marshal=false\n+protobuf.options.(gogoproto.goproto_stringer)=false\n+k8s:deepcopy-gen=true\n+k8s:openapi-gen=true" }, "k8s.io.apimachinery.pkg.apis.meta.v1.FieldsV1": { "type": "object", @@ -4524,10 +4543,6 @@ }, "title": "Must be empty before the object is deleted from the registry. Each entry\nis an identifier for the responsible component that will remove the entry\nfrom the list. If the deletionTimestamp of the object is non-nil, entries\nin this list can only be removed.\nFinalizers may be processed and removed in any order. Order is NOT enforced\nbecause it introduces significant risk of stuck finalizers.\nfinalizers is a shared field, any actor with permission can reorder it.\nIf the finalizer list is processed in order, then this can lead to a situation\nin which the component responsible for the first finalizer in the list is\nwaiting for a signal (field value, external system, or other) produced by a\ncomponent responsible for a finalizer later in the list, resulting in a deadlock.\nWithout enforced ordering finalizers are free to order amongst themselves and\nare not vulnerable to ordering changes in the list.\n+optional\n+patchStrategy=merge" }, - "clusterName": { - "type": "string", - "description": "Deprecated: ClusterName is a legacy field that was always cleared by\nthe system and never used; it will be removed completely in 1.25.\n\nThe name in the go struct is changed to help clients detect\naccidental use.\n\n+optional" - }, "managedFields": { "type": "array", "items": { diff --git a/rollout/trafficrouting/apisix/mocks/apisix.go b/rollout/trafficrouting/apisix/mocks/apisix.go index 5931fb456a..c884167412 100644 --- a/rollout/trafficrouting/apisix/mocks/apisix.go +++ b/rollout/trafficrouting/apisix/mocks/apisix.go @@ -133,3 +133,11 @@ func (f *FakeClient) Namespace(string) dynamic.ResourceInterface { func (f *FakeDynamicClient) Resource(schema.GroupVersionResource) dynamic.NamespaceableResourceInterface { return &FakeClient{IsListError: f.IsListError} } + +func (f *FakeClient) Apply(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) { + return nil, nil +} + +func (f *FakeClient) ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions) (*unstructured.Unstructured, error) { + return nil, nil +} diff --git a/rollout/trafficrouting/traefik/mocks/traefik.go b/rollout/trafficrouting/traefik/mocks/traefik.go index e1ce30a648..aedfd659cd 100644 --- a/rollout/trafficrouting/traefik/mocks/traefik.go +++ b/rollout/trafficrouting/traefik/mocks/traefik.go @@ -97,3 +97,11 @@ func (f *FakeClient) Namespace(string) dynamic.ResourceInterface { func (f *FakeDynamicClient) Resource(schema.GroupVersionResource) dynamic.NamespaceableResourceInterface { return &FakeClient{} } + +func (f *FakeClient) Apply(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) { + return nil, nil +} + +func (f *FakeClient) ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions) (*unstructured.Unstructured, error) { + return nil, nil +} diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index e95c8a4899..4146a6b4cc 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -2648,7 +2648,7 @@ export interface K8sIoApiCoreV1EnvVarSource { secretKeyRef?: K8sIoApiCoreV1SecretKeySelector; } /** - * An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation. To add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted. This is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate. + * An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation. To add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted. * @export * @interface K8sIoApiCoreV1EphemeralContainer */ @@ -3933,6 +3933,12 @@ export interface K8sIoApiCoreV1PodSpec { * @memberof K8sIoApiCoreV1PodSpec */ os?: K8sIoApiCoreV1PodOS; + /** + * + * @type {boolean} + * @memberof K8sIoApiCoreV1PodSpec + */ + hostUsers?: boolean; } /** * @@ -4678,7 +4684,7 @@ export interface K8sIoApiCoreV1TopologySpreadConstraint { */ maxSkew?: number; /** - * TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a \"bucket\", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology. And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology. It's a required field. + * TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a \"bucket\", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology. And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology. It's a required field. * @type {string} * @memberof K8sIoApiCoreV1TopologySpreadConstraint */ @@ -4696,11 +4702,29 @@ export interface K8sIoApiCoreV1TopologySpreadConstraint { */ labelSelector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; /** - * MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: +-------+-------+-------+ | zone1 | zone2 | zone3 | +-------+-------+-------+ | P P | P P | P P | +-------+-------+-------+ The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate. +optional + * MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: +-------+-------+-------+ | zone1 | zone2 | zone3 | +-------+-------+-------+ | P P | P P | P P | +-------+-------+-------+ The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default). +optional * @type {number} * @memberof K8sIoApiCoreV1TopologySpreadConstraint */ minDomains?: number; + /** + * NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional + * @type {string} + * @memberof K8sIoApiCoreV1TopologySpreadConstraint + */ + nodeAffinityPolicy?: string; + /** + * NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional + * @type {string} + * @memberof K8sIoApiCoreV1TopologySpreadConstraint + */ + nodeTaintsPolicy?: string; + /** + * + * @type {Array} + * @memberof K8sIoApiCoreV1TopologySpreadConstraint + */ + matchLabelKeys?: Array; } /** * @@ -5102,7 +5126,7 @@ export interface K8sIoApiCoreV1WindowsSecurityContextOptions { hostProcess?: boolean; } /** - * Quantity is a fixed-point representation of a number. It provides convenient marshaling/unmarshaling in JSON and YAML, in addition to String() and AsInt64() accessors. The serialization format is: ::= (Note that may be empty, from the \"\" case in .) ::= 0 | 1 | ... | 9 ::= | ::= | . | . | . ::= \"+\" | \"-\" ::= | ::= | | ::= Ki | Mi | Gi | Ti | Pi | Ei (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) ::= m | \"\" | k | M | G | T | P | E (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) ::= \"e\" | \"E\" No matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities. When a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized. Before serializing, Quantity will be put in \"canonical form\". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that: a. No precision is lost b. No fractional digits will be emitted c. The exponent (or suffix) is as large as possible. The sign will be omitted unless the number is negative. Examples: 1.5 will be serialized as \"1500m\" 1.5Gi will be serialized as \"1536Mi\" Note that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise. Non-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.) This format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation. +protobuf=true +protobuf.embed=string +protobuf.options.marshal=false +protobuf.options.(gogoproto.goproto_stringer)=false +k8s:deepcopy-gen=true +k8s:openapi-gen=true + * Quantity is a fixed-point representation of a number. It provides convenient marshaling/unmarshaling in JSON and YAML, in addition to String() and AsInt64() accessors. The serialization format is: ``` ::= (Note that may be empty, from the \"\" case in .) ::= 0 | 1 | ... | 9 ::= | ::= | . | . | . ::= \"+\" | \"-\" ::= | ::= | | ::= Ki | Mi | Gi | Ti | Pi | Ei (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) ::= m | \"\" | k | M | G | T | P | E (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) ::= \"e\" | \"E\" ``` No matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities. When a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized. Before serializing, Quantity will be put in \"canonical form\". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that: - No precision is lost - No fractional digits will be emitted - The exponent (or suffix) is as large as possible. The sign will be omitted unless the number is negative. Examples: - 1.5 will be serialized as \"1500m\" - 1.5Gi will be serialized as \"1536Mi\" Note that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise. Non-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.) This format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation. +protobuf=true +protobuf.embed=string +protobuf.options.marshal=false +protobuf.options.(gogoproto.goproto_stringer)=false +k8s:deepcopy-gen=true +k8s:openapi-gen=true * @export * @interface K8sIoApimachineryPkgApiResourceQuantity */ @@ -5310,12 +5334,6 @@ export interface K8sIoApimachineryPkgApisMetaV1ObjectMeta { * @memberof K8sIoApimachineryPkgApisMetaV1ObjectMeta */ finalizers?: Array; - /** - * Deprecated: ClusterName is a legacy field that was always cleared by the system and never used; it will be removed completely in 1.25. The name in the go struct is changed to help clients detect accidental use. +optional - * @type {string} - * @memberof K8sIoApimachineryPkgApisMetaV1ObjectMeta - */ - clusterName?: string; /** * ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like \"ci-cd\". The set of fields is always in the version that the workflow used when modifying the object. +optional * @type {Array} From 96f164f8014e3e3e2117543598b22ba0d95f74a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 12:24:36 -0500 Subject: [PATCH 028/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 (#2745) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.25.9 to 1.25.10. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/polly/v1.25.9...service/cloudwatch/v1.25.10) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2e3e6a473c..1d8fe300d7 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 github.com/aws/aws-sdk-go-v2/config v1.18.21 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index dbb4669683..564b43f875 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7im github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9 h1:7jgW378oM948BxuOBarXeeaKSrRaCj7didsdeSwYGGo= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.9/go.mod h1:hwbKzCoQcD/EvmfhhoM1Zdk+zADOiFBrHVff0+y4hEQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 h1:m7nFc1xk7O5vriDJc6lymQLbfIHbW4sjNTrjcnDpQlM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 h1:RnL6Jg/DG9CAnY0MP9D0vJYQB3vv/gkKzJPw9nCqeo8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= From cb4d6ff77af55847e38846b36e82811be5c810f9 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Sun, 30 Apr 2023 23:20:46 -0500 Subject: [PATCH 029/159] fix(controller): Fix for rollouts getting stuck in loop (#2689) * possible fix for sutck rollouts Signed-off-by: zachaller * add comments Signed-off-by: zachaller * add comments Signed-off-by: zachaller * update comments Signed-off-by: zachaller --------- Signed-off-by: zachaller --- rollout/controller.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/rollout/controller.go b/rollout/controller.go index 1fa0c73ce0..b5d8122ac3 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -413,13 +413,18 @@ func (c *Controller) syncHandler(ctx context.Context, key string) error { } err = roCtx.reconcile() - if roCtx.newRollout != nil { - c.writeBackToInformer(roCtx.newRollout) - } if err != nil { logCtx.Errorf("roCtx.reconcile err %v", err) + // return an err here so that we do not update the informer cache with a "bad" rollout object, for the case when + // we get an error during reconciliation but c.newRollout still gets updated this can happen in syncReplicaSetRevision + // https://github.com/argoproj/argo-rollouts/issues/2522#issuecomment-1492181154 I also believe there are other cases + // that newRollout can get updated while we get an error during reconciliation + return err } - return err + if roCtx.newRollout != nil { + c.writeBackToInformer(roCtx.newRollout) + } + return nil } // writeBackToInformer writes a just recently updated Rollout back into the informer cache. From 04b1e30d74354ce1084452cfcd8c74a29d239b05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Apr 2023 23:21:08 -0500 Subject: [PATCH 030/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 (#2746) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.21 to 1.18.22. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.21...config/v1.18.22) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 35 ++++++++++++++++------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 1d8fe300d7..a5f56e4961 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.21 + github.com/aws/aws-sdk-go-v2/config v1.18.22 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.10 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 564b43f875..076313fc26 100644 --- a/go.sum +++ b/go.sum @@ -101,35 +101,32 @@ 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.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.21 h1:ENTXWKwE8b9YXgQCsruGLhvA9bhg+RqAsL9XEMEsa2c= -github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20 h1:oZCEFcrMppP/CNiS8myzv9JgOzq2s0d3v3MXYil/mxQ= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= +github.com/aws/aws-sdk-go-v2/config v1.18.22 h1:7vkUEmjjv+giht4wIROqLs+49VWmiQMMHSduxmoNKLU= +github.com/aws/aws-sdk-go-v2/config v1.18.22/go.mod h1:mN7Li1wxaPxSSy4Xkr6stFuinJGf3VZW3ZSNvO0q6sI= +github.com/aws/aws-sdk-go-v2/credentials v1.13.21 h1:VRiXnPEaaPeGeoFcXvMZOB5K/yfIXOYE3q97Kgb0zbU= +github.com/aws/aws-sdk-go-v2/credentials v1.13.21/go.mod h1:90Dk1lJoMyspa/EDUrldTxsPns0wn6+KpRKpdAWc0uA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 h1:m7nFc1xk7O5vriDJc6lymQLbfIHbW4sjNTrjcnDpQlM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 h1:RnL6Jg/DG9CAnY0MP9D0vJYQB3vv/gkKzJPw9nCqeo8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 h1:5cb3D6xb006bPTqEfCNaEA6PPEfBXxxy4NNeX/44kGk= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 h1:NZaj0ngZMzsubWZbrEFSB4rgSQRbFq38Sd6KBxHuOIU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 h1:Qf1aWwnsNkyAoqDqmdM3nHwN78XQjec27LjM6b9vyfI= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 h1:GAiaQWuQhQQui76KjuXeShmyXqECwQ0mGRMc/rwsL+c= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.9/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9 h1:TraLwncRJkWqtIBVKI/UqBymq4+hL+3MzUOtUATuzkA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.10 h1:6UbNM/KJhMBfOI5+lpVcJ/8OA7cBSz0O6OX37SRKlSw= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.10/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From f72e565960e074fd885c14d88334168859c44a66 Mon Sep 17 00:00:00 2001 From: Lukasz <106734180+lukaszgyg@users.noreply.github.com> Date: Thu, 4 May 2023 21:38:24 +0200 Subject: [PATCH 031/159] feat(controller): Add custom metadata support for AnalysisRun. Fixes #2740 (#2743) Add custom metadata support for AnalysisRun Signed-off-by: lukasz --- docs/features/analysis.md | 20 + docs/features/specification.md | 6 + manifests/crds/rollout-crd.yaml | 44 + manifests/install.yaml | 44 + pkg/apiclient/rollout/rollout.swagger.json | 24 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1756 +++++++++++------ pkg/apis/rollouts/v1alpha1/generated.proto | 15 + .../rollouts/v1alpha1/openapi_generated.go | 64 +- pkg/apis/rollouts/v1alpha1/types.go | 13 + .../v1alpha1/zz_generated.deepcopy.go | 31 + rollout/analysis.go | 6 + rollout/analysis_test.go | 51 + ui/src/models/rollout/generated/api.ts | 25 + 13 files changed, 1475 insertions(+), 624 deletions(-) diff --git a/docs/features/analysis.md b/docs/features/analysis.md index 9e96cd1d65..1a81a71274 100644 --- a/docs/features/analysis.md +++ b/docs/features/analysis.md @@ -804,6 +804,26 @@ spec: limit: 20 ``` +### Define custom Labels/Annotations for AnalysisRun + +If you would like to annotate/label the `AnalysisRun` with the custom labels your can do it by specifying +`analysisRunMetadata` field. + +```yaml hl_lines="9 10 11" +kind: Rollout +spec: +... + steps: + - analysis: + templates: + - templateName: my-template + analysisRunMetadata: + labels: + my-custom-label: label-value + annotations: + my-custom-annotation: annotation-value +``` + ### Measurements Retention for Experiments If an experiment wants to retain more results of its analysis metrics, it simply needs to specify the diff --git a/docs/features/specification.md b/docs/features/specification.md index 12feeb9240..025ab529c4 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -348,6 +348,12 @@ spec: analyses: - name : mann-whitney templateName: mann-whitney + # Metadata which will be attached to the AnalysisRun. + analysisRunMetadata: + labels: + app.service.io/analysisType: smoke-test + annotations: + link.argocd.argoproj.io/external-link: http://my-loggin-platform.com/pre-generated-link # Anti-affinity configuration between desired and previous ReplicaSet. # Only one must be specified. diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 2b026746b6..80fcbb69e3 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -153,6 +153,17 @@ spec: x-kubernetes-int-or-string: true postPromotionAnalysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -210,6 +221,17 @@ spec: type: object prePromotionAnalysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -297,6 +319,17 @@ spec: type: integer analysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -430,6 +463,17 @@ spec: properties: analysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: diff --git a/manifests/install.yaml b/manifests/install.yaml index 7d9ae8ac33..b4f0bbffc3 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -11387,6 +11387,17 @@ spec: x-kubernetes-int-or-string: true postPromotionAnalysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -11444,6 +11455,17 @@ spec: type: object prePromotionAnalysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -11531,6 +11553,17 @@ spec: type: integer analysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: @@ -11664,6 +11697,17 @@ spec: properties: analysis: properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object args: items: properties: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 134bfbf595..071eb37dbc 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -568,6 +568,26 @@ }, "title": "AnalysisRunArgument argument to add to analysisRun" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata": { + "type": "object", + "properties": { + "labels": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Labels Additional labels to add to the AnalysisRun\n+optional" + }, + "annotations": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Annotations additional annotations to add to the AnalysisRun\n+optional" + } + }, + "title": "AnalysisRunMetadata extra labels to add to the AnalysisRun" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStrategy": { "type": "object", "properties": { @@ -1225,6 +1245,10 @@ "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention" }, "title": "MeasurementRetention object contains the settings for retaining the number of measurements during the analysis\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + }, + "analysisRunMetadata": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata", + "title": "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns\n+optional" } }, "title": "RolloutAnalysis defines a template that is used to create a analysisRun" diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index a485999856..998e3ea168 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -217,10 +217,38 @@ func (m *AnalysisRunList) XXX_DiscardUnknown() { var xxx_messageInfo_AnalysisRunList proto.InternalMessageInfo +func (m *AnalysisRunMetadata) Reset() { *m = AnalysisRunMetadata{} } +func (*AnalysisRunMetadata) ProtoMessage() {} +func (*AnalysisRunMetadata) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{6} +} +func (m *AnalysisRunMetadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AnalysisRunMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AnalysisRunMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnalysisRunMetadata.Merge(m, src) +} +func (m *AnalysisRunMetadata) XXX_Size() int { + return m.Size() +} +func (m *AnalysisRunMetadata) XXX_DiscardUnknown() { + xxx_messageInfo_AnalysisRunMetadata.DiscardUnknown(m) +} + +var xxx_messageInfo_AnalysisRunMetadata proto.InternalMessageInfo + func (m *AnalysisRunSpec) Reset() { *m = AnalysisRunSpec{} } func (*AnalysisRunSpec) ProtoMessage() {} func (*AnalysisRunSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{6} + return fileDescriptor_e0e705f843545fab, []int{7} } func (m *AnalysisRunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -248,7 +276,7 @@ var xxx_messageInfo_AnalysisRunSpec proto.InternalMessageInfo func (m *AnalysisRunStatus) Reset() { *m = AnalysisRunStatus{} } func (*AnalysisRunStatus) ProtoMessage() {} func (*AnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{7} + return fileDescriptor_e0e705f843545fab, []int{8} } func (m *AnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -276,7 +304,7 @@ var xxx_messageInfo_AnalysisRunStatus proto.InternalMessageInfo func (m *AnalysisRunStrategy) Reset() { *m = AnalysisRunStrategy{} } func (*AnalysisRunStrategy) ProtoMessage() {} func (*AnalysisRunStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{8} + return fileDescriptor_e0e705f843545fab, []int{9} } func (m *AnalysisRunStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -304,7 +332,7 @@ var xxx_messageInfo_AnalysisRunStrategy proto.InternalMessageInfo func (m *AnalysisTemplate) Reset() { *m = AnalysisTemplate{} } func (*AnalysisTemplate) ProtoMessage() {} func (*AnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{9} + return fileDescriptor_e0e705f843545fab, []int{10} } func (m *AnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -332,7 +360,7 @@ var xxx_messageInfo_AnalysisTemplate proto.InternalMessageInfo func (m *AnalysisTemplateList) Reset() { *m = AnalysisTemplateList{} } func (*AnalysisTemplateList) ProtoMessage() {} func (*AnalysisTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{10} + return fileDescriptor_e0e705f843545fab, []int{11} } func (m *AnalysisTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -360,7 +388,7 @@ var xxx_messageInfo_AnalysisTemplateList proto.InternalMessageInfo func (m *AnalysisTemplateSpec) Reset() { *m = AnalysisTemplateSpec{} } func (*AnalysisTemplateSpec) ProtoMessage() {} func (*AnalysisTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{11} + return fileDescriptor_e0e705f843545fab, []int{12} } func (m *AnalysisTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -388,7 +416,7 @@ var xxx_messageInfo_AnalysisTemplateSpec proto.InternalMessageInfo func (m *AntiAffinity) Reset() { *m = AntiAffinity{} } func (*AntiAffinity) ProtoMessage() {} func (*AntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{12} + return fileDescriptor_e0e705f843545fab, []int{13} } func (m *AntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -416,7 +444,7 @@ var xxx_messageInfo_AntiAffinity proto.InternalMessageInfo func (m *ApisixRoute) Reset() { *m = ApisixRoute{} } func (*ApisixRoute) ProtoMessage() {} func (*ApisixRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{13} + return fileDescriptor_e0e705f843545fab, []int{14} } func (m *ApisixRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -444,7 +472,7 @@ var xxx_messageInfo_ApisixRoute proto.InternalMessageInfo func (m *ApisixTrafficRouting) Reset() { *m = ApisixTrafficRouting{} } func (*ApisixTrafficRouting) ProtoMessage() {} func (*ApisixTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{14} + return fileDescriptor_e0e705f843545fab, []int{15} } func (m *ApisixTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -472,7 +500,7 @@ var xxx_messageInfo_ApisixTrafficRouting proto.InternalMessageInfo func (m *AppMeshTrafficRouting) Reset() { *m = AppMeshTrafficRouting{} } func (*AppMeshTrafficRouting) ProtoMessage() {} func (*AppMeshTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{15} + return fileDescriptor_e0e705f843545fab, []int{16} } func (m *AppMeshTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -500,7 +528,7 @@ var xxx_messageInfo_AppMeshTrafficRouting proto.InternalMessageInfo func (m *AppMeshVirtualNodeGroup) Reset() { *m = AppMeshVirtualNodeGroup{} } func (*AppMeshVirtualNodeGroup) ProtoMessage() {} func (*AppMeshVirtualNodeGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{16} + return fileDescriptor_e0e705f843545fab, []int{17} } func (m *AppMeshVirtualNodeGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -528,7 +556,7 @@ var xxx_messageInfo_AppMeshVirtualNodeGroup proto.InternalMessageInfo func (m *AppMeshVirtualNodeReference) Reset() { *m = AppMeshVirtualNodeReference{} } func (*AppMeshVirtualNodeReference) ProtoMessage() {} func (*AppMeshVirtualNodeReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{17} + return fileDescriptor_e0e705f843545fab, []int{18} } func (m *AppMeshVirtualNodeReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -556,7 +584,7 @@ var xxx_messageInfo_AppMeshVirtualNodeReference proto.InternalMessageInfo func (m *AppMeshVirtualService) Reset() { *m = AppMeshVirtualService{} } func (*AppMeshVirtualService) ProtoMessage() {} func (*AppMeshVirtualService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{18} + return fileDescriptor_e0e705f843545fab, []int{19} } func (m *AppMeshVirtualService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -584,7 +612,7 @@ var xxx_messageInfo_AppMeshVirtualService proto.InternalMessageInfo func (m *Argument) Reset() { *m = Argument{} } func (*Argument) ProtoMessage() {} func (*Argument) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{19} + return fileDescriptor_e0e705f843545fab, []int{20} } func (m *Argument) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -612,7 +640,7 @@ var xxx_messageInfo_Argument proto.InternalMessageInfo func (m *ArgumentValueFrom) Reset() { *m = ArgumentValueFrom{} } func (*ArgumentValueFrom) ProtoMessage() {} func (*ArgumentValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{20} + return fileDescriptor_e0e705f843545fab, []int{21} } func (m *ArgumentValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -640,7 +668,7 @@ var xxx_messageInfo_ArgumentValueFrom proto.InternalMessageInfo func (m *AwsResourceRef) Reset() { *m = AwsResourceRef{} } func (*AwsResourceRef) ProtoMessage() {} func (*AwsResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{21} + return fileDescriptor_e0e705f843545fab, []int{22} } func (m *AwsResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -668,7 +696,7 @@ var xxx_messageInfo_AwsResourceRef proto.InternalMessageInfo func (m *BlueGreenStatus) Reset() { *m = BlueGreenStatus{} } func (*BlueGreenStatus) ProtoMessage() {} func (*BlueGreenStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{22} + return fileDescriptor_e0e705f843545fab, []int{23} } func (m *BlueGreenStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -696,7 +724,7 @@ var xxx_messageInfo_BlueGreenStatus proto.InternalMessageInfo func (m *BlueGreenStrategy) Reset() { *m = BlueGreenStrategy{} } func (*BlueGreenStrategy) ProtoMessage() {} func (*BlueGreenStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{23} + return fileDescriptor_e0e705f843545fab, []int{24} } func (m *BlueGreenStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -724,7 +752,7 @@ var xxx_messageInfo_BlueGreenStrategy proto.InternalMessageInfo func (m *CanaryStatus) Reset() { *m = CanaryStatus{} } func (*CanaryStatus) ProtoMessage() {} func (*CanaryStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{24} + return fileDescriptor_e0e705f843545fab, []int{25} } func (m *CanaryStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -752,7 +780,7 @@ var xxx_messageInfo_CanaryStatus proto.InternalMessageInfo func (m *CanaryStep) Reset() { *m = CanaryStep{} } func (*CanaryStep) ProtoMessage() {} func (*CanaryStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{25} + return fileDescriptor_e0e705f843545fab, []int{26} } func (m *CanaryStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -780,7 +808,7 @@ var xxx_messageInfo_CanaryStep proto.InternalMessageInfo func (m *CanaryStrategy) Reset() { *m = CanaryStrategy{} } func (*CanaryStrategy) ProtoMessage() {} func (*CanaryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{26} + return fileDescriptor_e0e705f843545fab, []int{27} } func (m *CanaryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -808,7 +836,7 @@ var xxx_messageInfo_CanaryStrategy proto.InternalMessageInfo func (m *CloudWatchMetric) Reset() { *m = CloudWatchMetric{} } func (*CloudWatchMetric) ProtoMessage() {} func (*CloudWatchMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{27} + return fileDescriptor_e0e705f843545fab, []int{28} } func (m *CloudWatchMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -836,7 +864,7 @@ var xxx_messageInfo_CloudWatchMetric proto.InternalMessageInfo func (m *CloudWatchMetricDataQuery) Reset() { *m = CloudWatchMetricDataQuery{} } func (*CloudWatchMetricDataQuery) ProtoMessage() {} func (*CloudWatchMetricDataQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{28} + return fileDescriptor_e0e705f843545fab, []int{29} } func (m *CloudWatchMetricDataQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -864,7 +892,7 @@ var xxx_messageInfo_CloudWatchMetricDataQuery proto.InternalMessageInfo func (m *CloudWatchMetricStat) Reset() { *m = CloudWatchMetricStat{} } func (*CloudWatchMetricStat) ProtoMessage() {} func (*CloudWatchMetricStat) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{29} + return fileDescriptor_e0e705f843545fab, []int{30} } func (m *CloudWatchMetricStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -892,7 +920,7 @@ var xxx_messageInfo_CloudWatchMetricStat proto.InternalMessageInfo func (m *CloudWatchMetricStatMetric) Reset() { *m = CloudWatchMetricStatMetric{} } func (*CloudWatchMetricStatMetric) ProtoMessage() {} func (*CloudWatchMetricStatMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{30} + return fileDescriptor_e0e705f843545fab, []int{31} } func (m *CloudWatchMetricStatMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -920,7 +948,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetric proto.InternalMessageInfo func (m *CloudWatchMetricStatMetricDimension) Reset() { *m = CloudWatchMetricStatMetricDimension{} } func (*CloudWatchMetricStatMetricDimension) ProtoMessage() {} func (*CloudWatchMetricStatMetricDimension) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{31} + return fileDescriptor_e0e705f843545fab, []int{32} } func (m *CloudWatchMetricStatMetricDimension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -948,7 +976,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetricDimension proto.InternalMessageInf func (m *ClusterAnalysisTemplate) Reset() { *m = ClusterAnalysisTemplate{} } func (*ClusterAnalysisTemplate) ProtoMessage() {} func (*ClusterAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{32} + return fileDescriptor_e0e705f843545fab, []int{33} } func (m *ClusterAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -976,7 +1004,7 @@ var xxx_messageInfo_ClusterAnalysisTemplate proto.InternalMessageInfo func (m *ClusterAnalysisTemplateList) Reset() { *m = ClusterAnalysisTemplateList{} } func (*ClusterAnalysisTemplateList) ProtoMessage() {} func (*ClusterAnalysisTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{33} + return fileDescriptor_e0e705f843545fab, []int{34} } func (m *ClusterAnalysisTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1032,7 @@ var xxx_messageInfo_ClusterAnalysisTemplateList proto.InternalMessageInfo func (m *DatadogMetric) Reset() { *m = DatadogMetric{} } func (*DatadogMetric) ProtoMessage() {} func (*DatadogMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{34} + return fileDescriptor_e0e705f843545fab, []int{35} } func (m *DatadogMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1032,7 +1060,7 @@ var xxx_messageInfo_DatadogMetric proto.InternalMessageInfo func (m *DryRun) Reset() { *m = DryRun{} } func (*DryRun) ProtoMessage() {} func (*DryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{35} + return fileDescriptor_e0e705f843545fab, []int{36} } func (m *DryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1060,7 +1088,7 @@ var xxx_messageInfo_DryRun proto.InternalMessageInfo func (m *Experiment) Reset() { *m = Experiment{} } func (*Experiment) ProtoMessage() {} func (*Experiment) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{36} + return fileDescriptor_e0e705f843545fab, []int{37} } func (m *Experiment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1088,7 +1116,7 @@ var xxx_messageInfo_Experiment proto.InternalMessageInfo func (m *ExperimentAnalysisRunStatus) Reset() { *m = ExperimentAnalysisRunStatus{} } func (*ExperimentAnalysisRunStatus) ProtoMessage() {} func (*ExperimentAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{37} + return fileDescriptor_e0e705f843545fab, []int{38} } func (m *ExperimentAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1116,7 +1144,7 @@ var xxx_messageInfo_ExperimentAnalysisRunStatus proto.InternalMessageInfo func (m *ExperimentAnalysisTemplateRef) Reset() { *m = ExperimentAnalysisTemplateRef{} } func (*ExperimentAnalysisTemplateRef) ProtoMessage() {} func (*ExperimentAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{38} + return fileDescriptor_e0e705f843545fab, []int{39} } func (m *ExperimentAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1172,7 @@ var xxx_messageInfo_ExperimentAnalysisTemplateRef proto.InternalMessageInfo func (m *ExperimentCondition) Reset() { *m = ExperimentCondition{} } func (*ExperimentCondition) ProtoMessage() {} func (*ExperimentCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{39} + return fileDescriptor_e0e705f843545fab, []int{40} } func (m *ExperimentCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1172,7 +1200,7 @@ var xxx_messageInfo_ExperimentCondition proto.InternalMessageInfo func (m *ExperimentList) Reset() { *m = ExperimentList{} } func (*ExperimentList) ProtoMessage() {} func (*ExperimentList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{40} + return fileDescriptor_e0e705f843545fab, []int{41} } func (m *ExperimentList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1200,7 +1228,7 @@ var xxx_messageInfo_ExperimentList proto.InternalMessageInfo func (m *ExperimentSpec) Reset() { *m = ExperimentSpec{} } func (*ExperimentSpec) ProtoMessage() {} func (*ExperimentSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{41} + return fileDescriptor_e0e705f843545fab, []int{42} } func (m *ExperimentSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1228,7 +1256,7 @@ var xxx_messageInfo_ExperimentSpec proto.InternalMessageInfo func (m *ExperimentStatus) Reset() { *m = ExperimentStatus{} } func (*ExperimentStatus) ProtoMessage() {} func (*ExperimentStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{42} + return fileDescriptor_e0e705f843545fab, []int{43} } func (m *ExperimentStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1256,7 +1284,7 @@ var xxx_messageInfo_ExperimentStatus proto.InternalMessageInfo func (m *FieldRef) Reset() { *m = FieldRef{} } func (*FieldRef) ProtoMessage() {} func (*FieldRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{43} + return fileDescriptor_e0e705f843545fab, []int{44} } func (m *FieldRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1284,7 +1312,7 @@ var xxx_messageInfo_FieldRef proto.InternalMessageInfo func (m *GraphiteMetric) Reset() { *m = GraphiteMetric{} } func (*GraphiteMetric) ProtoMessage() {} func (*GraphiteMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{44} + return fileDescriptor_e0e705f843545fab, []int{45} } func (m *GraphiteMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1312,7 +1340,7 @@ var xxx_messageInfo_GraphiteMetric proto.InternalMessageInfo func (m *HeaderRoutingMatch) Reset() { *m = HeaderRoutingMatch{} } func (*HeaderRoutingMatch) ProtoMessage() {} func (*HeaderRoutingMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{45} + return fileDescriptor_e0e705f843545fab, []int{46} } func (m *HeaderRoutingMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1340,7 +1368,7 @@ var xxx_messageInfo_HeaderRoutingMatch proto.InternalMessageInfo func (m *InfluxdbMetric) Reset() { *m = InfluxdbMetric{} } func (*InfluxdbMetric) ProtoMessage() {} func (*InfluxdbMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{46} + return fileDescriptor_e0e705f843545fab, []int{47} } func (m *InfluxdbMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1368,7 +1396,7 @@ var xxx_messageInfo_InfluxdbMetric proto.InternalMessageInfo func (m *IstioDestinationRule) Reset() { *m = IstioDestinationRule{} } func (*IstioDestinationRule) ProtoMessage() {} func (*IstioDestinationRule) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{47} + return fileDescriptor_e0e705f843545fab, []int{48} } func (m *IstioDestinationRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1424,7 @@ var xxx_messageInfo_IstioDestinationRule proto.InternalMessageInfo func (m *IstioTrafficRouting) Reset() { *m = IstioTrafficRouting{} } func (*IstioTrafficRouting) ProtoMessage() {} func (*IstioTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{48} + return fileDescriptor_e0e705f843545fab, []int{49} } func (m *IstioTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1424,7 +1452,7 @@ var xxx_messageInfo_IstioTrafficRouting proto.InternalMessageInfo func (m *IstioVirtualService) Reset() { *m = IstioVirtualService{} } func (*IstioVirtualService) ProtoMessage() {} func (*IstioVirtualService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{49} + return fileDescriptor_e0e705f843545fab, []int{50} } func (m *IstioVirtualService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1452,7 +1480,7 @@ var xxx_messageInfo_IstioVirtualService proto.InternalMessageInfo func (m *JobMetric) Reset() { *m = JobMetric{} } func (*JobMetric) ProtoMessage() {} func (*JobMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{50} + return fileDescriptor_e0e705f843545fab, []int{51} } func (m *JobMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1480,7 +1508,7 @@ var xxx_messageInfo_JobMetric proto.InternalMessageInfo func (m *KayentaMetric) Reset() { *m = KayentaMetric{} } func (*KayentaMetric) ProtoMessage() {} func (*KayentaMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{51} + return fileDescriptor_e0e705f843545fab, []int{52} } func (m *KayentaMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1536,7 @@ var xxx_messageInfo_KayentaMetric proto.InternalMessageInfo func (m *KayentaScope) Reset() { *m = KayentaScope{} } func (*KayentaScope) ProtoMessage() {} func (*KayentaScope) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{52} + return fileDescriptor_e0e705f843545fab, []int{53} } func (m *KayentaScope) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1536,7 +1564,7 @@ var xxx_messageInfo_KayentaScope proto.InternalMessageInfo func (m *KayentaThreshold) Reset() { *m = KayentaThreshold{} } func (*KayentaThreshold) ProtoMessage() {} func (*KayentaThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{53} + return fileDescriptor_e0e705f843545fab, []int{54} } func (m *KayentaThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1592,7 @@ var xxx_messageInfo_KayentaThreshold proto.InternalMessageInfo func (m *MangedRoutes) Reset() { *m = MangedRoutes{} } func (*MangedRoutes) ProtoMessage() {} func (*MangedRoutes) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{54} + return fileDescriptor_e0e705f843545fab, []int{55} } func (m *MangedRoutes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1592,7 +1620,7 @@ var xxx_messageInfo_MangedRoutes proto.InternalMessageInfo func (m *Measurement) Reset() { *m = Measurement{} } func (*Measurement) ProtoMessage() {} func (*Measurement) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{55} + return fileDescriptor_e0e705f843545fab, []int{56} } func (m *Measurement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1620,7 +1648,7 @@ var xxx_messageInfo_Measurement proto.InternalMessageInfo func (m *MeasurementRetention) Reset() { *m = MeasurementRetention{} } func (*MeasurementRetention) ProtoMessage() {} func (*MeasurementRetention) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{56} + return fileDescriptor_e0e705f843545fab, []int{57} } func (m *MeasurementRetention) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1648,7 +1676,7 @@ var xxx_messageInfo_MeasurementRetention proto.InternalMessageInfo func (m *Metric) Reset() { *m = Metric{} } func (*Metric) ProtoMessage() {} func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{57} + return fileDescriptor_e0e705f843545fab, []int{58} } func (m *Metric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,7 +1704,7 @@ var xxx_messageInfo_Metric proto.InternalMessageInfo func (m *MetricProvider) Reset() { *m = MetricProvider{} } func (*MetricProvider) ProtoMessage() {} func (*MetricProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{58} + return fileDescriptor_e0e705f843545fab, []int{59} } func (m *MetricProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1704,7 +1732,7 @@ var xxx_messageInfo_MetricProvider proto.InternalMessageInfo func (m *MetricResult) Reset() { *m = MetricResult{} } func (*MetricResult) ProtoMessage() {} func (*MetricResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{59} + return fileDescriptor_e0e705f843545fab, []int{60} } func (m *MetricResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1732,7 +1760,7 @@ var xxx_messageInfo_MetricResult proto.InternalMessageInfo func (m *NewRelicMetric) Reset() { *m = NewRelicMetric{} } func (*NewRelicMetric) ProtoMessage() {} func (*NewRelicMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{60} + return fileDescriptor_e0e705f843545fab, []int{61} } func (m *NewRelicMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1760,7 +1788,7 @@ var xxx_messageInfo_NewRelicMetric proto.InternalMessageInfo func (m *NginxTrafficRouting) Reset() { *m = NginxTrafficRouting{} } func (*NginxTrafficRouting) ProtoMessage() {} func (*NginxTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{61} + return fileDescriptor_e0e705f843545fab, []int{62} } func (m *NginxTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1788,7 +1816,7 @@ var xxx_messageInfo_NginxTrafficRouting proto.InternalMessageInfo func (m *ObjectRef) Reset() { *m = ObjectRef{} } func (*ObjectRef) ProtoMessage() {} func (*ObjectRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{62} + return fileDescriptor_e0e705f843545fab, []int{63} } func (m *ObjectRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1816,7 +1844,7 @@ var xxx_messageInfo_ObjectRef proto.InternalMessageInfo func (m *PauseCondition) Reset() { *m = PauseCondition{} } func (*PauseCondition) ProtoMessage() {} func (*PauseCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{63} + return fileDescriptor_e0e705f843545fab, []int{64} } func (m *PauseCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1844,7 +1872,7 @@ var xxx_messageInfo_PauseCondition proto.InternalMessageInfo func (m *PingPongSpec) Reset() { *m = PingPongSpec{} } func (*PingPongSpec) ProtoMessage() {} func (*PingPongSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{64} + return fileDescriptor_e0e705f843545fab, []int{65} } func (m *PingPongSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1872,7 +1900,7 @@ var xxx_messageInfo_PingPongSpec proto.InternalMessageInfo func (m *PodTemplateMetadata) Reset() { *m = PodTemplateMetadata{} } func (*PodTemplateMetadata) ProtoMessage() {} func (*PodTemplateMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{65} + return fileDescriptor_e0e705f843545fab, []int{66} } func (m *PodTemplateMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1902,7 +1930,7 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*PreferredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*PreferredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{66} + return fileDescriptor_e0e705f843545fab, []int{67} } func (m *PreferredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1930,7 +1958,7 @@ var xxx_messageInfo_PreferredDuringSchedulingIgnoredDuringExecution proto.Intern func (m *PrometheusMetric) Reset() { *m = PrometheusMetric{} } func (*PrometheusMetric) ProtoMessage() {} func (*PrometheusMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{67} + return fileDescriptor_e0e705f843545fab, []int{68} } func (m *PrometheusMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1960,7 +1988,7 @@ func (m *RequiredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*RequiredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*RequiredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{68} + return fileDescriptor_e0e705f843545fab, []int{69} } func (m *RequiredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1988,7 +2016,7 @@ var xxx_messageInfo_RequiredDuringSchedulingIgnoredDuringExecution proto.Interna func (m *RollbackWindowSpec) Reset() { *m = RollbackWindowSpec{} } func (*RollbackWindowSpec) ProtoMessage() {} func (*RollbackWindowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{69} + return fileDescriptor_e0e705f843545fab, []int{70} } func (m *RollbackWindowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2016,7 +2044,7 @@ var xxx_messageInfo_RollbackWindowSpec proto.InternalMessageInfo func (m *Rollout) Reset() { *m = Rollout{} } func (*Rollout) ProtoMessage() {} func (*Rollout) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{70} + return fileDescriptor_e0e705f843545fab, []int{71} } func (m *Rollout) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2044,7 +2072,7 @@ var xxx_messageInfo_Rollout proto.InternalMessageInfo func (m *RolloutAnalysis) Reset() { *m = RolloutAnalysis{} } func (*RolloutAnalysis) ProtoMessage() {} func (*RolloutAnalysis) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{71} + return fileDescriptor_e0e705f843545fab, []int{72} } func (m *RolloutAnalysis) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2072,7 +2100,7 @@ var xxx_messageInfo_RolloutAnalysis proto.InternalMessageInfo func (m *RolloutAnalysisBackground) Reset() { *m = RolloutAnalysisBackground{} } func (*RolloutAnalysisBackground) ProtoMessage() {} func (*RolloutAnalysisBackground) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{72} + return fileDescriptor_e0e705f843545fab, []int{73} } func (m *RolloutAnalysisBackground) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2100,7 +2128,7 @@ var xxx_messageInfo_RolloutAnalysisBackground proto.InternalMessageInfo func (m *RolloutAnalysisRunStatus) Reset() { *m = RolloutAnalysisRunStatus{} } func (*RolloutAnalysisRunStatus) ProtoMessage() {} func (*RolloutAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{73} + return fileDescriptor_e0e705f843545fab, []int{74} } func (m *RolloutAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2128,7 +2156,7 @@ var xxx_messageInfo_RolloutAnalysisRunStatus proto.InternalMessageInfo func (m *RolloutAnalysisTemplate) Reset() { *m = RolloutAnalysisTemplate{} } func (*RolloutAnalysisTemplate) ProtoMessage() {} func (*RolloutAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{74} + return fileDescriptor_e0e705f843545fab, []int{75} } func (m *RolloutAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2156,7 +2184,7 @@ var xxx_messageInfo_RolloutAnalysisTemplate proto.InternalMessageInfo func (m *RolloutCondition) Reset() { *m = RolloutCondition{} } func (*RolloutCondition) ProtoMessage() {} func (*RolloutCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{75} + return fileDescriptor_e0e705f843545fab, []int{76} } func (m *RolloutCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2184,7 +2212,7 @@ var xxx_messageInfo_RolloutCondition proto.InternalMessageInfo func (m *RolloutExperimentStep) Reset() { *m = RolloutExperimentStep{} } func (*RolloutExperimentStep) ProtoMessage() {} func (*RolloutExperimentStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{76} + return fileDescriptor_e0e705f843545fab, []int{77} } func (m *RolloutExperimentStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2214,7 +2242,7 @@ func (m *RolloutExperimentStepAnalysisTemplateRef) Reset() { } func (*RolloutExperimentStepAnalysisTemplateRef) ProtoMessage() {} func (*RolloutExperimentStepAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{77} + return fileDescriptor_e0e705f843545fab, []int{78} } func (m *RolloutExperimentStepAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +2270,7 @@ var xxx_messageInfo_RolloutExperimentStepAnalysisTemplateRef proto.InternalMessa func (m *RolloutExperimentTemplate) Reset() { *m = RolloutExperimentTemplate{} } func (*RolloutExperimentTemplate) ProtoMessage() {} func (*RolloutExperimentTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{78} + return fileDescriptor_e0e705f843545fab, []int{79} } func (m *RolloutExperimentTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2270,7 +2298,7 @@ var xxx_messageInfo_RolloutExperimentTemplate proto.InternalMessageInfo func (m *RolloutList) Reset() { *m = RolloutList{} } func (*RolloutList) ProtoMessage() {} func (*RolloutList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{79} + return fileDescriptor_e0e705f843545fab, []int{80} } func (m *RolloutList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2298,7 +2326,7 @@ var xxx_messageInfo_RolloutList proto.InternalMessageInfo func (m *RolloutPause) Reset() { *m = RolloutPause{} } func (*RolloutPause) ProtoMessage() {} func (*RolloutPause) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{80} + return fileDescriptor_e0e705f843545fab, []int{81} } func (m *RolloutPause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2326,7 +2354,7 @@ var xxx_messageInfo_RolloutPause proto.InternalMessageInfo func (m *RolloutSpec) Reset() { *m = RolloutSpec{} } func (*RolloutSpec) ProtoMessage() {} func (*RolloutSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{81} + return fileDescriptor_e0e705f843545fab, []int{82} } func (m *RolloutSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2354,7 +2382,7 @@ var xxx_messageInfo_RolloutSpec proto.InternalMessageInfo func (m *RolloutStatus) Reset() { *m = RolloutStatus{} } func (*RolloutStatus) ProtoMessage() {} func (*RolloutStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{82} + return fileDescriptor_e0e705f843545fab, []int{83} } func (m *RolloutStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2382,7 +2410,7 @@ var xxx_messageInfo_RolloutStatus proto.InternalMessageInfo func (m *RolloutStrategy) Reset() { *m = RolloutStrategy{} } func (*RolloutStrategy) ProtoMessage() {} func (*RolloutStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{83} + return fileDescriptor_e0e705f843545fab, []int{84} } func (m *RolloutStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2410,7 +2438,7 @@ var xxx_messageInfo_RolloutStrategy proto.InternalMessageInfo func (m *RolloutTrafficRouting) Reset() { *m = RolloutTrafficRouting{} } func (*RolloutTrafficRouting) ProtoMessage() {} func (*RolloutTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{84} + return fileDescriptor_e0e705f843545fab, []int{85} } func (m *RolloutTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2438,7 +2466,7 @@ var xxx_messageInfo_RolloutTrafficRouting proto.InternalMessageInfo func (m *RouteMatch) Reset() { *m = RouteMatch{} } func (*RouteMatch) ProtoMessage() {} func (*RouteMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{85} + return fileDescriptor_e0e705f843545fab, []int{86} } func (m *RouteMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2466,7 +2494,7 @@ var xxx_messageInfo_RouteMatch proto.InternalMessageInfo func (m *RunSummary) Reset() { *m = RunSummary{} } func (*RunSummary) ProtoMessage() {} func (*RunSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{86} + return fileDescriptor_e0e705f843545fab, []int{87} } func (m *RunSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2494,7 +2522,7 @@ var xxx_messageInfo_RunSummary proto.InternalMessageInfo func (m *SMITrafficRouting) Reset() { *m = SMITrafficRouting{} } func (*SMITrafficRouting) ProtoMessage() {} func (*SMITrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{87} + return fileDescriptor_e0e705f843545fab, []int{88} } func (m *SMITrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2522,7 +2550,7 @@ var xxx_messageInfo_SMITrafficRouting proto.InternalMessageInfo func (m *ScopeDetail) Reset() { *m = ScopeDetail{} } func (*ScopeDetail) ProtoMessage() {} func (*ScopeDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{88} + return fileDescriptor_e0e705f843545fab, []int{89} } func (m *ScopeDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2550,7 +2578,7 @@ var xxx_messageInfo_ScopeDetail proto.InternalMessageInfo func (m *SecretKeyRef) Reset() { *m = SecretKeyRef{} } func (*SecretKeyRef) ProtoMessage() {} func (*SecretKeyRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{89} + return fileDescriptor_e0e705f843545fab, []int{90} } func (m *SecretKeyRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2578,7 +2606,7 @@ var xxx_messageInfo_SecretKeyRef proto.InternalMessageInfo func (m *SetCanaryScale) Reset() { *m = SetCanaryScale{} } func (*SetCanaryScale) ProtoMessage() {} func (*SetCanaryScale) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{90} + return fileDescriptor_e0e705f843545fab, []int{91} } func (m *SetCanaryScale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2606,7 +2634,7 @@ var xxx_messageInfo_SetCanaryScale proto.InternalMessageInfo func (m *SetHeaderRoute) Reset() { *m = SetHeaderRoute{} } func (*SetHeaderRoute) ProtoMessage() {} func (*SetHeaderRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{91} + return fileDescriptor_e0e705f843545fab, []int{92} } func (m *SetHeaderRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2634,7 +2662,7 @@ var xxx_messageInfo_SetHeaderRoute proto.InternalMessageInfo func (m *SetMirrorRoute) Reset() { *m = SetMirrorRoute{} } func (*SetMirrorRoute) ProtoMessage() {} func (*SetMirrorRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{92} + return fileDescriptor_e0e705f843545fab, []int{93} } func (m *SetMirrorRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2662,7 +2690,7 @@ var xxx_messageInfo_SetMirrorRoute proto.InternalMessageInfo func (m *SkyWalkingMetric) Reset() { *m = SkyWalkingMetric{} } func (*SkyWalkingMetric) ProtoMessage() {} func (*SkyWalkingMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{93} + return fileDescriptor_e0e705f843545fab, []int{94} } func (m *SkyWalkingMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2690,7 +2718,7 @@ var xxx_messageInfo_SkyWalkingMetric proto.InternalMessageInfo func (m *StickinessConfig) Reset() { *m = StickinessConfig{} } func (*StickinessConfig) ProtoMessage() {} func (*StickinessConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{94} + return fileDescriptor_e0e705f843545fab, []int{95} } func (m *StickinessConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2718,7 +2746,7 @@ var xxx_messageInfo_StickinessConfig proto.InternalMessageInfo func (m *StringMatch) Reset() { *m = StringMatch{} } func (*StringMatch) ProtoMessage() {} func (*StringMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{95} + return fileDescriptor_e0e705f843545fab, []int{96} } func (m *StringMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2746,7 +2774,7 @@ var xxx_messageInfo_StringMatch proto.InternalMessageInfo func (m *TCPRoute) Reset() { *m = TCPRoute{} } func (*TCPRoute) ProtoMessage() {} func (*TCPRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{96} + return fileDescriptor_e0e705f843545fab, []int{97} } func (m *TCPRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2774,7 +2802,7 @@ var xxx_messageInfo_TCPRoute proto.InternalMessageInfo func (m *TLSRoute) Reset() { *m = TLSRoute{} } func (*TLSRoute) ProtoMessage() {} func (*TLSRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{97} + return fileDescriptor_e0e705f843545fab, []int{98} } func (m *TLSRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2802,7 +2830,7 @@ var xxx_messageInfo_TLSRoute proto.InternalMessageInfo func (m *TemplateService) Reset() { *m = TemplateService{} } func (*TemplateService) ProtoMessage() {} func (*TemplateService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{98} + return fileDescriptor_e0e705f843545fab, []int{99} } func (m *TemplateService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2830,7 +2858,7 @@ var xxx_messageInfo_TemplateService proto.InternalMessageInfo func (m *TemplateSpec) Reset() { *m = TemplateSpec{} } func (*TemplateSpec) ProtoMessage() {} func (*TemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{99} + return fileDescriptor_e0e705f843545fab, []int{100} } func (m *TemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2858,7 +2886,7 @@ var xxx_messageInfo_TemplateSpec proto.InternalMessageInfo func (m *TemplateStatus) Reset() { *m = TemplateStatus{} } func (*TemplateStatus) ProtoMessage() {} func (*TemplateStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{100} + return fileDescriptor_e0e705f843545fab, []int{101} } func (m *TemplateStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2914,7 @@ var xxx_messageInfo_TemplateStatus proto.InternalMessageInfo func (m *TraefikTrafficRouting) Reset() { *m = TraefikTrafficRouting{} } func (*TraefikTrafficRouting) ProtoMessage() {} func (*TraefikTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{101} + return fileDescriptor_e0e705f843545fab, []int{102} } func (m *TraefikTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2914,7 +2942,7 @@ var xxx_messageInfo_TraefikTrafficRouting proto.InternalMessageInfo func (m *TrafficWeights) Reset() { *m = TrafficWeights{} } func (*TrafficWeights) ProtoMessage() {} func (*TrafficWeights) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{102} + return fileDescriptor_e0e705f843545fab, []int{103} } func (m *TrafficWeights) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,7 +2970,7 @@ var xxx_messageInfo_TrafficWeights proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{103} + return fileDescriptor_e0e705f843545fab, []int{104} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2970,7 +2998,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *WavefrontMetric) Reset() { *m = WavefrontMetric{} } func (*WavefrontMetric) ProtoMessage() {} func (*WavefrontMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{104} + return fileDescriptor_e0e705f843545fab, []int{105} } func (m *WavefrontMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2998,7 +3026,7 @@ var xxx_messageInfo_WavefrontMetric proto.InternalMessageInfo func (m *WebMetric) Reset() { *m = WebMetric{} } func (*WebMetric) ProtoMessage() {} func (*WebMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{105} + return fileDescriptor_e0e705f843545fab, []int{106} } func (m *WebMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3026,7 +3054,7 @@ var xxx_messageInfo_WebMetric proto.InternalMessageInfo func (m *WebMetricHeader) Reset() { *m = WebMetricHeader{} } func (*WebMetricHeader) ProtoMessage() {} func (*WebMetricHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{106} + return fileDescriptor_e0e705f843545fab, []int{107} } func (m *WebMetricHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3054,7 +3082,7 @@ var xxx_messageInfo_WebMetricHeader proto.InternalMessageInfo func (m *WeightDestination) Reset() { *m = WeightDestination{} } func (*WeightDestination) ProtoMessage() {} func (*WeightDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{107} + return fileDescriptor_e0e705f843545fab, []int{108} } func (m *WeightDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3086,6 +3114,9 @@ func init() { proto.RegisterType((*AnalysisRun)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRun") proto.RegisterType((*AnalysisRunArgument)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunArgument") proto.RegisterType((*AnalysisRunList)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunList") + proto.RegisterType((*AnalysisRunMetadata)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata.AnnotationsEntry") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata.LabelsEntry") proto.RegisterType((*AnalysisRunSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec") proto.RegisterType((*AnalysisRunStatus)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus") proto.RegisterType((*AnalysisRunStrategy)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStrategy") @@ -3203,505 +3234,509 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 7967 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x24, 0xd9, - 0x75, 0xd8, 0x16, 0x9b, 0xaf, 0x3e, 0xe4, 0xf0, 0x71, 0x87, 0xa3, 0xe1, 0x72, 0x77, 0xa6, 0x57, - 0xb5, 0xc6, 0x66, 0x6d, 0xaf, 0x48, 0x69, 0x1f, 0xc9, 0x5a, 0xab, 0x6c, 0xd2, 0x4d, 0xce, 0xec, - 0x70, 0x96, 0x9c, 0xed, 0x3d, 0xcd, 0xd9, 0x91, 0x25, 0xad, 0xad, 0x62, 0xf7, 0x65, 0xb3, 0x86, - 0xdd, 0x55, 0xed, 0xaa, 0x6a, 0x72, 0xb8, 0x5a, 0x58, 0x2b, 0x0b, 0xab, 0x28, 0x86, 0x04, 0x2b, - 0xb1, 0x85, 0x20, 0x48, 0x10, 0x28, 0x86, 0x00, 0x3b, 0xb1, 0xbf, 0x8c, 0x04, 0xf9, 0x31, 0x10, - 0x23, 0x7e, 0x44, 0x3f, 0x0e, 0xe4, 0x8f, 0x44, 0x76, 0x00, 0xd3, 0x11, 0x95, 0x9f, 0x04, 0x09, - 0x8c, 0x00, 0x0e, 0x02, 0xcf, 0x47, 0x10, 0xdc, 0x67, 0xdd, 0xaa, 0xae, 0xe6, 0x74, 0xb3, 0x8b, - 0x23, 0x21, 0xf6, 0x5f, 0xf7, 0x3d, 0xe7, 0x9e, 0x73, 0xea, 0x3e, 0xcf, 0x3d, 0xf7, 0x9c, 0x73, - 0x61, 0xab, 0xe9, 0x46, 0xfb, 0xdd, 0xdd, 0xd5, 0xba, 0xdf, 0x5e, 0x73, 0x82, 0xa6, 0xdf, 0x09, - 0xfc, 0xfb, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xd5, 0xf2, 0xbb, 0x51, 0xb8, 0xd6, 0x39, 0x68, 0xae, - 0x39, 0x1d, 0x37, 0x5c, 0xd3, 0x25, 0x87, 0x9f, 0x70, 0x5a, 0x9d, 0x7d, 0xe7, 0x13, 0x6b, 0x4d, - 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x63, 0xb5, 0x13, 0xf8, 0x91, 0x4f, 0x3e, 0x15, 0x53, 0x5b, 0x55, - 0xd4, 0xf8, 0x8f, 0x9f, 0x55, 0x75, 0x57, 0x3b, 0x07, 0xcd, 0x55, 0x46, 0x6d, 0x55, 0x97, 0x28, - 0x6a, 0x2b, 0x1f, 0x33, 0x64, 0x69, 0xfa, 0x4d, 0x7f, 0x8d, 0x13, 0xdd, 0xed, 0xee, 0xf1, 0x7f, - 0xfc, 0x0f, 0xff, 0x25, 0x98, 0xad, 0x3c, 0x7b, 0xf0, 0x6a, 0xb8, 0xea, 0xfa, 0x4c, 0xb6, 0xb5, - 0x5d, 0x27, 0xaa, 0xef, 0xaf, 0x1d, 0xf6, 0x48, 0xb4, 0x62, 0x1b, 0x48, 0x75, 0x3f, 0xa0, 0x59, - 0x38, 0x2f, 0xc7, 0x38, 0x6d, 0xa7, 0xbe, 0xef, 0x7a, 0x34, 0x38, 0x8e, 0xbf, 0xba, 0x4d, 0x23, - 0x27, 0xab, 0xd6, 0x5a, 0xbf, 0x5a, 0x41, 0xd7, 0x8b, 0xdc, 0x36, 0xed, 0xa9, 0xf0, 0x37, 0x1f, - 0x55, 0x21, 0xac, 0xef, 0xd3, 0xb6, 0xd3, 0x53, 0xef, 0xa5, 0x7e, 0xf5, 0xba, 0x91, 0xdb, 0x5a, - 0x73, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0xf7, 0x0a, 0x50, 0x2c, 0x6f, 0x55, 0x6a, 0x91, - 0x13, 0x75, 0x43, 0xf2, 0x15, 0x0b, 0x66, 0x5b, 0xbe, 0xd3, 0xa8, 0x38, 0x2d, 0xc7, 0xab, 0xd3, - 0x60, 0xd9, 0x7a, 0xc6, 0x7a, 0x7e, 0xe6, 0xc5, 0xad, 0xd5, 0x51, 0xfa, 0x6b, 0xb5, 0x7c, 0x14, - 0x22, 0x0d, 0xfd, 0x6e, 0x50, 0xa7, 0x48, 0xf7, 0x2a, 0x4b, 0xdf, 0x39, 0x29, 0x3d, 0x71, 0x7a, - 0x52, 0x9a, 0xdd, 0x32, 0x38, 0x61, 0x82, 0x2f, 0xf9, 0xa6, 0x05, 0x8b, 0x75, 0xc7, 0x73, 0x82, - 0xe3, 0x1d, 0x27, 0x68, 0xd2, 0xe8, 0x8d, 0xc0, 0xef, 0x76, 0x96, 0xc7, 0x2e, 0x40, 0x9a, 0x27, - 0xa5, 0x34, 0x8b, 0xeb, 0x69, 0x76, 0xd8, 0x2b, 0x01, 0x97, 0x2b, 0x8c, 0x9c, 0xdd, 0x16, 0x35, - 0xe5, 0x2a, 0x5c, 0xa4, 0x5c, 0xb5, 0x34, 0x3b, 0xec, 0x95, 0xc0, 0xfe, 0xb0, 0x00, 0x8b, 0xe5, - 0xad, 0xca, 0x4e, 0xe0, 0xec, 0xed, 0xb9, 0x75, 0xf4, 0xbb, 0x91, 0xeb, 0x35, 0xc9, 0x8f, 0xc3, - 0x94, 0xeb, 0x35, 0x03, 0x1a, 0x86, 0xbc, 0x23, 0x8b, 0x95, 0x79, 0x49, 0x74, 0x6a, 0x53, 0x14, - 0xa3, 0x82, 0x93, 0x57, 0x60, 0x26, 0xa4, 0xc1, 0xa1, 0x5b, 0xa7, 0x55, 0x3f, 0x88, 0x78, 0x4b, - 0x4f, 0x54, 0x2e, 0x4b, 0xf4, 0x99, 0x5a, 0x0c, 0x42, 0x13, 0x8f, 0x55, 0x0b, 0x7c, 0x3f, 0x92, - 0x70, 0xde, 0x10, 0xc5, 0xb8, 0x1a, 0xc6, 0x20, 0x34, 0xf1, 0xc8, 0x37, 0x2c, 0x58, 0x08, 0x23, - 0xb7, 0x7e, 0xe0, 0x7a, 0x34, 0x0c, 0xd7, 0x7d, 0x6f, 0xcf, 0x6d, 0x2e, 0x4f, 0xf0, 0x56, 0xbc, - 0x33, 0x5a, 0x2b, 0xd6, 0x52, 0x54, 0x2b, 0x4b, 0xa7, 0x27, 0xa5, 0x85, 0x74, 0x29, 0xf6, 0x70, - 0x27, 0x1b, 0xb0, 0xe0, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, 0xd5, 0x80, 0xee, 0xb9, 0x0f, - 0x96, 0xc7, 0xf9, 0xe7, 0x2c, 0xcb, 0xcf, 0x59, 0x28, 0xa7, 0xe0, 0xd8, 0x53, 0xc3, 0xde, 0x80, - 0xe5, 0x72, 0x7b, 0xd7, 0x09, 0x43, 0xa7, 0xe1, 0x07, 0xa9, 0xde, 0x78, 0x1e, 0xa6, 0xdb, 0x4e, - 0xa7, 0xe3, 0x7a, 0x4d, 0xd6, 0x1d, 0x85, 0xe7, 0x8b, 0x95, 0xd9, 0xd3, 0x93, 0xd2, 0xf4, 0xb6, - 0x2c, 0x43, 0x0d, 0xb5, 0xff, 0x64, 0x0c, 0x66, 0xca, 0x9e, 0xd3, 0x3a, 0x0e, 0xdd, 0x10, 0xbb, - 0x1e, 0xf9, 0x3c, 0x4c, 0xb3, 0xd5, 0xa5, 0xe1, 0x44, 0x8e, 0x9c, 0x91, 0x1f, 0x5f, 0x15, 0x93, - 0x7d, 0xd5, 0x9c, 0xec, 0x71, 0xbb, 0x30, 0xec, 0xd5, 0xc3, 0x4f, 0xac, 0xbe, 0xb5, 0x7b, 0x9f, - 0xd6, 0xa3, 0x6d, 0x1a, 0x39, 0x15, 0x22, 0xbf, 0x02, 0xe2, 0x32, 0xd4, 0x54, 0x89, 0x0f, 0xe3, - 0x61, 0x87, 0xd6, 0xe5, 0x0c, 0xdb, 0x1e, 0x71, 0x24, 0xc7, 0xa2, 0xd7, 0x3a, 0xb4, 0x5e, 0x99, - 0x95, 0xac, 0xc7, 0xd9, 0x3f, 0xe4, 0x8c, 0xc8, 0x11, 0x4c, 0x86, 0x7c, 0xcd, 0x91, 0x93, 0xe7, - 0xad, 0xfc, 0x58, 0x72, 0xb2, 0x95, 0x39, 0xc9, 0x74, 0x52, 0xfc, 0x47, 0xc9, 0xce, 0xfe, 0xcf, - 0x16, 0x5c, 0x36, 0xb0, 0xcb, 0x41, 0xb3, 0xdb, 0xa6, 0x5e, 0x44, 0x9e, 0x81, 0x71, 0xcf, 0x69, - 0x53, 0x39, 0x51, 0xb4, 0xc8, 0x77, 0x9c, 0x36, 0x45, 0x0e, 0x21, 0xcf, 0xc2, 0xc4, 0xa1, 0xd3, - 0xea, 0x52, 0xde, 0x48, 0xc5, 0xca, 0x25, 0x89, 0x32, 0xf1, 0x0e, 0x2b, 0x44, 0x01, 0x23, 0xef, - 0x43, 0x91, 0xff, 0xb8, 0x19, 0xf8, 0xed, 0x9c, 0x3e, 0x4d, 0x4a, 0xf8, 0x8e, 0x22, 0x5b, 0xb9, - 0x74, 0x7a, 0x52, 0x2a, 0xea, 0xbf, 0x18, 0x33, 0xb4, 0xff, 0xcc, 0x82, 0x79, 0xe3, 0xe3, 0xb6, - 0xdc, 0x30, 0x22, 0x9f, 0xeb, 0x19, 0x3c, 0xab, 0x83, 0x0d, 0x1e, 0x56, 0x9b, 0x0f, 0x9d, 0x05, - 0xf9, 0xa5, 0xd3, 0xaa, 0xc4, 0x18, 0x38, 0x1e, 0x4c, 0xb8, 0x11, 0x6d, 0x87, 0xcb, 0x63, 0xcf, - 0x14, 0x9e, 0x9f, 0x79, 0x71, 0x33, 0xb7, 0x6e, 0x8c, 0xdb, 0x77, 0x93, 0xd1, 0x47, 0xc1, 0xc6, - 0xfe, 0xad, 0xf1, 0xc4, 0x17, 0xb2, 0x11, 0x45, 0x7c, 0x98, 0x6a, 0xd3, 0x28, 0x70, 0xeb, 0x62, - 0x5e, 0xcd, 0xbc, 0xb8, 0x31, 0x9a, 0x14, 0xdb, 0x9c, 0x58, 0xbc, 0x58, 0x8a, 0xff, 0x21, 0x2a, - 0x2e, 0x64, 0x1f, 0xc6, 0x9d, 0xa0, 0xa9, 0xbe, 0xf9, 0x66, 0x3e, 0xfd, 0x1b, 0x8f, 0xb9, 0x72, - 0xd0, 0x0c, 0x91, 0x73, 0x20, 0x6b, 0x50, 0x8c, 0x68, 0xd0, 0x76, 0x3d, 0x27, 0x12, 0xab, 0xeb, - 0x74, 0x65, 0x51, 0xa2, 0x15, 0x77, 0x14, 0x00, 0x63, 0x1c, 0xd2, 0x82, 0xc9, 0x46, 0x70, 0x8c, - 0x5d, 0x6f, 0x79, 0x3c, 0x8f, 0xa6, 0xd8, 0xe0, 0xb4, 0xe2, 0xc9, 0x24, 0xfe, 0xa3, 0xe4, 0x41, - 0xbe, 0x6d, 0xc1, 0x52, 0x9b, 0x3a, 0x61, 0x37, 0xa0, 0xec, 0x13, 0x90, 0x46, 0xd4, 0x63, 0xab, - 0xe1, 0xf2, 0x04, 0x67, 0x8e, 0xa3, 0xf6, 0x43, 0x2f, 0xe5, 0xca, 0xd3, 0x52, 0x94, 0xa5, 0x2c, - 0x28, 0x66, 0x4a, 0x63, 0xff, 0xc9, 0x38, 0x2c, 0xf6, 0xac, 0x10, 0xe4, 0x65, 0x98, 0xe8, 0xec, - 0x3b, 0xa1, 0x9a, 0xf2, 0xd7, 0xd5, 0x78, 0xab, 0xb2, 0xc2, 0x87, 0x27, 0xa5, 0x4b, 0xaa, 0x0a, - 0x2f, 0x40, 0x81, 0xcc, 0xf6, 0xd4, 0x36, 0x0d, 0x43, 0xa7, 0xa9, 0xd6, 0x01, 0x63, 0x98, 0xf0, - 0x62, 0x54, 0x70, 0xf2, 0xf7, 0x2c, 0xb8, 0x24, 0x86, 0x0c, 0xd2, 0xb0, 0xdb, 0x8a, 0xd8, 0x5a, - 0xc7, 0x9a, 0xe5, 0x76, 0x1e, 0xc3, 0x53, 0x90, 0xac, 0x5c, 0x91, 0xdc, 0x2f, 0x99, 0xa5, 0x21, - 0x26, 0xf9, 0x92, 0x7b, 0x50, 0x0c, 0x23, 0x27, 0x88, 0x68, 0xa3, 0x1c, 0xf1, 0x5d, 0x6d, 0xe6, - 0xc5, 0x9f, 0x18, 0x6c, 0x11, 0xd8, 0x71, 0xdb, 0x54, 0x2c, 0x38, 0x35, 0x45, 0x00, 0x63, 0x5a, - 0xe4, 0x7d, 0x80, 0xa0, 0xeb, 0xd5, 0xba, 0xed, 0xb6, 0x13, 0x1c, 0xcb, 0x1d, 0xfc, 0xd6, 0x68, - 0x9f, 0x87, 0x9a, 0x5e, 0xbc, 0x67, 0xc5, 0x65, 0x68, 0xf0, 0x23, 0x5f, 0xb2, 0xe0, 0x92, 0x18, - 0x89, 0x4a, 0x82, 0xc9, 0x9c, 0x25, 0x58, 0x64, 0x4d, 0xbb, 0x61, 0xb2, 0xc0, 0x24, 0x47, 0xfb, - 0x3f, 0x26, 0xf7, 0x93, 0x5a, 0xc4, 0xb4, 0xeb, 0xe6, 0x31, 0xf9, 0x2c, 0x3c, 0x19, 0x76, 0xeb, - 0x75, 0x1a, 0x86, 0x7b, 0xdd, 0x16, 0x76, 0xbd, 0x5b, 0x6e, 0x18, 0xf9, 0xc1, 0xf1, 0x96, 0xdb, - 0x76, 0x23, 0x3e, 0xe2, 0x26, 0x2a, 0xd7, 0x4e, 0x4f, 0x4a, 0x4f, 0xd6, 0xfa, 0x21, 0x61, 0xff, - 0xfa, 0xc4, 0x81, 0xa7, 0xba, 0x5e, 0x7f, 0xf2, 0x42, 0x7b, 0x2b, 0x9d, 0x9e, 0x94, 0x9e, 0xba, - 0xdb, 0x1f, 0x0d, 0xcf, 0xa2, 0x61, 0xff, 0x77, 0x0b, 0x16, 0xd4, 0x77, 0xed, 0xd0, 0x76, 0xa7, - 0xc5, 0x56, 0x97, 0x8b, 0x57, 0x44, 0xa2, 0x84, 0x22, 0x82, 0xf9, 0x6c, 0x27, 0x4a, 0xfe, 0x7e, - 0xda, 0x88, 0xfd, 0xdf, 0x2c, 0x58, 0x4a, 0x23, 0x3f, 0x86, 0xcd, 0x33, 0x4c, 0x6e, 0x9e, 0x77, - 0xf2, 0xfd, 0xda, 0x3e, 0x3b, 0xe8, 0x57, 0xc6, 0x7b, 0xbf, 0xf5, 0xff, 0xf7, 0x6d, 0x34, 0xde, - 0x15, 0x0b, 0x3f, 0xcc, 0x5d, 0x71, 0xfc, 0x47, 0x6a, 0x57, 0xfc, 0xf5, 0x71, 0x98, 0x2d, 0x7b, - 0x91, 0x5b, 0xde, 0xdb, 0x73, 0x3d, 0x37, 0x3a, 0x26, 0x5f, 0x1b, 0x83, 0xb5, 0x4e, 0x40, 0xf7, - 0x68, 0x10, 0xd0, 0xc6, 0x46, 0x37, 0x70, 0xbd, 0x66, 0xad, 0xbe, 0x4f, 0x1b, 0xdd, 0x96, 0xeb, - 0x35, 0x37, 0x9b, 0x9e, 0xaf, 0x8b, 0x6f, 0x3c, 0xa0, 0xf5, 0x2e, 0xff, 0x24, 0x31, 0x29, 0xda, - 0xa3, 0x7d, 0x52, 0x75, 0x38, 0xa6, 0x95, 0x97, 0x4e, 0x4f, 0x4a, 0x6b, 0x43, 0x56, 0xc2, 0x61, - 0x3f, 0x8d, 0x7c, 0x75, 0x0c, 0x56, 0x03, 0xfa, 0x73, 0x5d, 0x77, 0xf0, 0xd6, 0x10, 0xab, 0x56, - 0x6b, 0xc4, 0xed, 0x67, 0x28, 0x9e, 0x95, 0x17, 0x4f, 0x4f, 0x4a, 0x43, 0xd6, 0xc1, 0x21, 0xbf, - 0xcb, 0xae, 0xc2, 0x4c, 0xb9, 0xe3, 0x86, 0xee, 0x03, 0x76, 0x96, 0xa5, 0x03, 0x9c, 0x95, 0x4a, - 0x30, 0x11, 0x74, 0x5b, 0x54, 0xcc, 0xed, 0x62, 0xa5, 0xc8, 0x56, 0x21, 0x64, 0x05, 0x28, 0xca, - 0xed, 0x5f, 0x60, 0x2b, 0x2e, 0x27, 0x99, 0x3a, 0x25, 0xdf, 0x87, 0x89, 0x80, 0x31, 0x91, 0x23, - 0x6b, 0xd4, 0x03, 0x45, 0x2c, 0xb5, 0x14, 0x82, 0xfd, 0x44, 0xc1, 0xc2, 0xfe, 0xdd, 0x31, 0xb8, - 0x52, 0xee, 0x74, 0xb6, 0x69, 0xb8, 0x9f, 0x92, 0xe2, 0x97, 0x2c, 0x98, 0x3b, 0x74, 0x83, 0xa8, - 0xeb, 0xb4, 0x94, 0x6d, 0x43, 0xc8, 0x53, 0x1b, 0x55, 0x1e, 0xce, 0xed, 0x9d, 0x04, 0xe9, 0x0a, - 0x39, 0x3d, 0x29, 0xcd, 0x25, 0xcb, 0x30, 0xc5, 0x9e, 0xfc, 0x23, 0x0b, 0x16, 0x64, 0xd1, 0x1d, - 0xbf, 0x41, 0x4d, 0x83, 0xd8, 0xdd, 0x3c, 0x65, 0xd2, 0xc4, 0x85, 0xe5, 0x24, 0x5d, 0x8a, 0x3d, - 0x42, 0xd8, 0xff, 0x73, 0x0c, 0xae, 0xf6, 0xa1, 0x41, 0x7e, 0xcd, 0x82, 0x25, 0x61, 0x45, 0x33, - 0x40, 0x48, 0xf7, 0x64, 0x6b, 0xfe, 0x74, 0xde, 0x92, 0x23, 0x9b, 0xe2, 0xd4, 0xab, 0xd3, 0xca, - 0x32, 0x5b, 0x0d, 0xd7, 0x33, 0x58, 0x63, 0xa6, 0x40, 0x5c, 0x52, 0x61, 0x57, 0x4b, 0x49, 0x3a, - 0xf6, 0x58, 0x24, 0xad, 0x65, 0xb0, 0xc6, 0x4c, 0x81, 0xec, 0xbf, 0x03, 0x4f, 0x9d, 0x41, 0xee, - 0xd1, 0x93, 0xd3, 0x7e, 0x57, 0x8f, 0xfa, 0xe4, 0x98, 0x1b, 0x60, 0x5e, 0xdb, 0x30, 0xc9, 0xa7, - 0x8e, 0x9a, 0xd8, 0xc0, 0xb6, 0x3f, 0x3e, 0xa7, 0x42, 0x94, 0x10, 0xfb, 0x77, 0x2d, 0x98, 0x1e, - 0xc2, 0xac, 0x52, 0x4a, 0x9a, 0x55, 0x8a, 0x3d, 0x26, 0x95, 0xa8, 0xd7, 0xa4, 0xf2, 0xc6, 0x68, - 0xbd, 0x31, 0x88, 0x29, 0xe5, 0xcf, 0x2d, 0x58, 0xec, 0x31, 0xbd, 0x90, 0x7d, 0x58, 0xea, 0xf8, - 0x0d, 0xa5, 0x36, 0xdd, 0x72, 0xc2, 0x7d, 0x0e, 0x93, 0x9f, 0xf7, 0x32, 0xeb, 0xc9, 0x6a, 0x06, - 0xfc, 0xe1, 0x49, 0x69, 0x59, 0x13, 0x49, 0x21, 0x60, 0x26, 0x45, 0xd2, 0x81, 0xe9, 0x3d, 0x97, - 0xb6, 0x1a, 0xf1, 0x10, 0x1c, 0x51, 0x41, 0xba, 0x29, 0xa9, 0x09, 0xab, 0xa3, 0xfa, 0x87, 0x9a, - 0x8b, 0xfd, 0x45, 0x98, 0x4b, 0xda, 0xa0, 0x07, 0xe8, 0xbc, 0x6b, 0x50, 0x70, 0x02, 0x4f, 0x76, - 0xdd, 0x8c, 0x44, 0x28, 0x94, 0xf1, 0x0e, 0xb2, 0x72, 0xf2, 0x02, 0x4c, 0xef, 0x75, 0x5b, 0x2d, - 0x56, 0x41, 0xda, 0x86, 0xb5, 0x3a, 0x7c, 0x53, 0x96, 0xa3, 0xc6, 0xb0, 0xff, 0x72, 0x1c, 0xe6, - 0x2b, 0xad, 0x2e, 0x7d, 0x23, 0xa0, 0x54, 0x1d, 0xd2, 0xcb, 0x30, 0xdf, 0x09, 0xe8, 0xa1, 0x4b, - 0x8f, 0x6a, 0xb4, 0x45, 0xeb, 0x91, 0x1f, 0x48, 0x69, 0xae, 0x4a, 0x42, 0xf3, 0xd5, 0x24, 0x18, - 0xd3, 0xf8, 0xe4, 0x75, 0x98, 0x73, 0xea, 0x91, 0x7b, 0x48, 0x35, 0x05, 0x21, 0xee, 0x47, 0x24, - 0x85, 0xb9, 0x72, 0x02, 0x8a, 0x29, 0x6c, 0xf2, 0x39, 0x58, 0x0e, 0xeb, 0x4e, 0x8b, 0xde, 0xed, - 0x48, 0x56, 0xeb, 0xfb, 0xb4, 0x7e, 0x50, 0xf5, 0x5d, 0x2f, 0x92, 0x26, 0x99, 0x67, 0x24, 0xa5, - 0xe5, 0x5a, 0x1f, 0x3c, 0xec, 0x4b, 0x81, 0xfc, 0x5b, 0x0b, 0xae, 0x75, 0x02, 0x5a, 0x0d, 0xfc, - 0xb6, 0xcf, 0xf6, 0xda, 0x1e, 0x3b, 0x85, 0x3c, 0xaf, 0xbf, 0x33, 0xa2, 0x52, 0x21, 0x4a, 0x7a, - 0xed, 0xa4, 0x1f, 0x3d, 0x3d, 0x29, 0x5d, 0xab, 0x9e, 0x25, 0x00, 0x9e, 0x2d, 0x1f, 0xf9, 0x77, - 0x16, 0x5c, 0xef, 0xf8, 0x61, 0x74, 0xc6, 0x27, 0x4c, 0x5c, 0xe8, 0x27, 0xd8, 0xa7, 0x27, 0xa5, - 0xeb, 0xd5, 0x33, 0x25, 0xc0, 0x47, 0x48, 0x68, 0x9f, 0xce, 0xc0, 0xa2, 0x31, 0xf6, 0xe4, 0x21, - 0xfe, 0x35, 0xb8, 0xa4, 0x06, 0x43, 0xac, 0x04, 0x14, 0x63, 0xa3, 0x4b, 0xd9, 0x04, 0x62, 0x12, - 0x97, 0x8d, 0x3b, 0x3d, 0x14, 0x45, 0xed, 0xd4, 0xb8, 0xab, 0x26, 0xa0, 0x98, 0xc2, 0x26, 0x9b, - 0x70, 0x59, 0x96, 0x20, 0xed, 0xb4, 0xdc, 0xba, 0xb3, 0xee, 0x77, 0xe5, 0x90, 0x9b, 0xa8, 0x5c, - 0x3d, 0x3d, 0x29, 0x5d, 0xae, 0xf6, 0x82, 0x31, 0xab, 0x0e, 0xd9, 0x82, 0x25, 0xa7, 0x1b, 0xf9, - 0xfa, 0xfb, 0x6f, 0x78, 0x6c, 0x5f, 0x69, 0xf0, 0xa1, 0x35, 0x2d, 0x36, 0xa0, 0x72, 0x06, 0x1c, - 0x33, 0x6b, 0x91, 0x6a, 0x8a, 0x5a, 0x8d, 0xd6, 0x7d, 0xaf, 0x21, 0x7a, 0x79, 0x22, 0x3e, 0x8a, - 0x94, 0x33, 0x70, 0x30, 0xb3, 0x26, 0x69, 0xc1, 0x5c, 0xdb, 0x79, 0x70, 0xd7, 0x73, 0x0e, 0x1d, - 0xb7, 0xc5, 0x98, 0x48, 0x43, 0x4e, 0x7f, 0xeb, 0x42, 0x37, 0x72, 0x5b, 0xab, 0xe2, 0x4e, 0x73, - 0x75, 0xd3, 0x8b, 0xde, 0x0a, 0x6a, 0x11, 0x53, 0x59, 0x85, 0x2a, 0xb5, 0x9d, 0xa0, 0x85, 0x29, - 0xda, 0xe4, 0x2d, 0xb8, 0xc2, 0xa7, 0xe3, 0x86, 0x7f, 0xe4, 0x6d, 0xd0, 0x96, 0x73, 0xac, 0x3e, - 0x60, 0x8a, 0x7f, 0xc0, 0x93, 0xa7, 0x27, 0xa5, 0x2b, 0xb5, 0x2c, 0x04, 0xcc, 0xae, 0x47, 0x1c, - 0x78, 0x2a, 0x09, 0x40, 0x7a, 0xe8, 0x86, 0xae, 0xef, 0x09, 0x73, 0xcc, 0x74, 0x6c, 0x8e, 0xa9, - 0xf5, 0x47, 0xc3, 0xb3, 0x68, 0x90, 0x7f, 0x62, 0xc1, 0x52, 0xd6, 0x34, 0x5c, 0x2e, 0xe6, 0x71, - 0x63, 0x93, 0x9a, 0x5a, 0x62, 0x44, 0x64, 0x2e, 0x0a, 0x99, 0x42, 0x90, 0x0f, 0x2c, 0x98, 0x75, - 0x8c, 0xa3, 0xe4, 0x32, 0x70, 0xa9, 0x6e, 0x8f, 0x6a, 0xd0, 0x88, 0x29, 0x56, 0x16, 0x4e, 0x4f, - 0x4a, 0x89, 0xe3, 0x2a, 0x26, 0x38, 0x92, 0x7f, 0x66, 0xc1, 0x95, 0xcc, 0x39, 0xbe, 0x3c, 0x73, - 0x11, 0x2d, 0xc4, 0x07, 0x49, 0xf6, 0x9a, 0x93, 0x2d, 0x06, 0xf9, 0x86, 0xa5, 0xb7, 0xb2, 0x6d, - 0x65, 0x52, 0x9a, 0xe5, 0xa2, 0xbd, 0x3d, 0xe2, 0xe9, 0x39, 0x56, 0x1f, 0x14, 0xe1, 0xca, 0x65, - 0x63, 0x67, 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x6e, 0xa9, 0xad, 0x51, 0x4b, 0x74, 0xe9, 0xa2, - 0x24, 0x22, 0xf1, 0x4e, 0xab, 0x05, 0x4a, 0x31, 0x27, 0x3f, 0x03, 0x2b, 0xce, 0xae, 0x1f, 0x44, - 0x99, 0x93, 0x6f, 0x79, 0x8e, 0x4f, 0xa3, 0xeb, 0xa7, 0x27, 0xa5, 0x95, 0x72, 0x5f, 0x2c, 0x3c, - 0x83, 0x82, 0xfd, 0x9b, 0x13, 0x30, 0x2b, 0x8e, 0x04, 0x72, 0xeb, 0xfa, 0x6d, 0x0b, 0x9e, 0xae, - 0x77, 0x83, 0x80, 0x7a, 0x51, 0x2d, 0xa2, 0x9d, 0xde, 0x8d, 0xcb, 0xba, 0xd0, 0x8d, 0xeb, 0x99, - 0xd3, 0x93, 0xd2, 0xd3, 0xeb, 0x67, 0xf0, 0xc7, 0x33, 0xa5, 0x23, 0xff, 0xc1, 0x02, 0x5b, 0x22, - 0x54, 0x9c, 0xfa, 0x41, 0x33, 0xf0, 0xbb, 0x5e, 0xa3, 0xf7, 0x23, 0xc6, 0x2e, 0xf4, 0x23, 0x9e, - 0x3b, 0x3d, 0x29, 0xd9, 0xeb, 0x8f, 0x94, 0x02, 0x07, 0x90, 0x94, 0xbc, 0x01, 0x8b, 0x12, 0xeb, - 0xc6, 0x83, 0x0e, 0x0d, 0x5c, 0xa6, 0x7c, 0x4b, 0xc5, 0x31, 0xf6, 0xd3, 0x48, 0x23, 0x60, 0x6f, - 0x1d, 0x12, 0xc2, 0xd4, 0x11, 0x75, 0x9b, 0xfb, 0x91, 0x52, 0x9f, 0x46, 0x74, 0xce, 0x90, 0xe6, - 0x81, 0x7b, 0x82, 0x66, 0x65, 0xe6, 0xf4, 0xa4, 0x34, 0x25, 0xff, 0xa0, 0xe2, 0x44, 0xee, 0xc0, - 0x9c, 0x38, 0xb0, 0x55, 0x5d, 0xaf, 0x59, 0xf5, 0x3d, 0xe1, 0xd2, 0x50, 0xac, 0x3c, 0xa7, 0x36, - 0xfc, 0x5a, 0x02, 0xfa, 0xf0, 0xa4, 0x34, 0xab, 0x7e, 0xef, 0x1c, 0x77, 0x28, 0xa6, 0x6a, 0xdb, - 0x7f, 0x30, 0x09, 0xa0, 0x86, 0x2b, 0xed, 0x90, 0x9f, 0x84, 0x62, 0x48, 0x23, 0xc1, 0x55, 0xde, - 0x20, 0x88, 0x8b, 0x19, 0x55, 0x88, 0x31, 0x9c, 0x1c, 0xc0, 0x44, 0xc7, 0xe9, 0x86, 0x54, 0x76, - 0xfe, 0xed, 0x5c, 0x3a, 0xbf, 0xca, 0x28, 0x8a, 0x13, 0x1a, 0xff, 0x89, 0x82, 0x07, 0xf9, 0xb2, - 0x05, 0x40, 0x93, 0x1d, 0x36, 0xb2, 0xa5, 0x44, 0xb2, 0x8c, 0xfb, 0x94, 0xb5, 0x41, 0x65, 0xee, - 0xf4, 0xa4, 0x04, 0x46, 0xd7, 0x1b, 0x6c, 0xc9, 0x11, 0x4c, 0x3b, 0x6a, 0xcd, 0x1f, 0xbf, 0x88, - 0x35, 0x9f, 0x1f, 0x9c, 0xf4, 0xa0, 0xd5, 0xcc, 0xc8, 0x57, 0x2d, 0x98, 0x0b, 0x69, 0x24, 0xbb, - 0x8a, 0xad, 0x3c, 0x52, 0xe1, 0x1d, 0x71, 0xd0, 0xd5, 0x12, 0x34, 0xc5, 0x0a, 0x9a, 0x2c, 0xc3, - 0x14, 0x5f, 0x25, 0xca, 0x2d, 0xea, 0x34, 0x68, 0xc0, 0xcf, 0xe5, 0x52, 0x93, 0x1a, 0x5d, 0x14, - 0x83, 0xa6, 0x16, 0xc5, 0x28, 0xc3, 0x14, 0x5f, 0x25, 0xca, 0xb6, 0x1b, 0x04, 0xbe, 0x14, 0x65, - 0x3a, 0x27, 0x51, 0x0c, 0x9a, 0x5a, 0x14, 0xa3, 0x0c, 0x53, 0x7c, 0xed, 0x6f, 0x5d, 0x82, 0x39, - 0x35, 0x91, 0x62, 0xcd, 0x5e, 0x98, 0x81, 0xfa, 0x68, 0xf6, 0xeb, 0x26, 0x10, 0x93, 0xb8, 0xac, - 0xb2, 0x98, 0xaa, 0x49, 0xc5, 0x5e, 0x57, 0xae, 0x99, 0x40, 0x4c, 0xe2, 0x92, 0x36, 0x4c, 0x84, - 0x11, 0xed, 0xa8, 0xcb, 0xe0, 0x11, 0xef, 0x2a, 0xe3, 0xf5, 0x21, 0xbe, 0xee, 0x61, 0xff, 0x42, - 0x14, 0x5c, 0xb8, 0x25, 0x33, 0x4a, 0x18, 0x37, 0xe5, 0xe4, 0xc8, 0x67, 0x7e, 0x26, 0xed, 0xa6, - 0xa2, 0x37, 0x92, 0x65, 0x98, 0x62, 0x9f, 0xa1, 0xec, 0x4f, 0x5c, 0xa0, 0xb2, 0xff, 0x19, 0x98, - 0x6e, 0x3b, 0x0f, 0x6a, 0xdd, 0xa0, 0x79, 0xfe, 0x43, 0x85, 0xf4, 0xd3, 0x12, 0x54, 0x50, 0xd3, - 0x23, 0x5f, 0xb2, 0x8c, 0x25, 0x67, 0x8a, 0x13, 0xbf, 0x97, 0xef, 0x92, 0xa3, 0xf7, 0xca, 0xbe, - 0x8b, 0x4f, 0x8f, 0xea, 0x3d, 0xfd, 0xd8, 0x55, 0x6f, 0xa6, 0x46, 0x8a, 0x09, 0xa2, 0xd5, 0xc8, - 0xe2, 0x85, 0xaa, 0x91, 0xeb, 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, 0x11, 0x73, 0x4e, 0xcb, 0x03, - 0x17, 0x2a, 0x4f, 0x2d, 0xc1, 0x0c, 0x53, 0xcc, 0xfb, 0x9f, 0x37, 0x67, 0x2e, 0xe6, 0xbc, 0x39, - 0x9b, 0xc3, 0x79, 0xf3, 0x6c, 0x55, 0xfc, 0xd2, 0xa8, 0xaa, 0x38, 0xb9, 0x0d, 0xa4, 0x71, 0xec, - 0x39, 0x6d, 0xb7, 0x2e, 0x17, 0x4b, 0xbe, 0x6d, 0xce, 0x71, 0x7b, 0xc4, 0x8a, 0x5c, 0xc8, 0xc8, - 0x46, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x11, 0x4c, 0x77, 0x94, 0xc6, 0x35, 0x9f, 0xc7, 0xe8, 0x57, - 0x1a, 0x98, 0xf0, 0x17, 0x60, 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, 0xb6, 0x60, 0xa9, 0xed, 0x7a, - 0x55, 0xbf, 0x11, 0x56, 0x69, 0x20, 0xad, 0x2d, 0x35, 0x1a, 0x2d, 0x2f, 0xf0, 0xb6, 0xe1, 0x27, - 0xe8, 0xed, 0x0c, 0x38, 0x66, 0xd6, 0xb2, 0xff, 0xb7, 0x05, 0x0b, 0xeb, 0x2d, 0xbf, 0xdb, 0xb8, - 0xe7, 0x44, 0xf5, 0x7d, 0x71, 0x55, 0x4e, 0x5e, 0x87, 0x69, 0xd7, 0x8b, 0x68, 0x70, 0xe8, 0xb4, - 0xe4, 0xfe, 0x64, 0x2b, 0xf3, 0xe9, 0xa6, 0x2c, 0x7f, 0x78, 0x52, 0x9a, 0xdb, 0xe8, 0x06, 0xdc, - 0x07, 0x55, 0xac, 0x56, 0xa8, 0xeb, 0x90, 0x6f, 0x59, 0xb0, 0x28, 0x2e, 0xdb, 0x37, 0x9c, 0xc8, - 0x79, 0xbb, 0x4b, 0x03, 0x97, 0xaa, 0xeb, 0xf6, 0x11, 0x17, 0xaa, 0xb4, 0xac, 0x8a, 0xc1, 0x71, - 0xac, 0xa8, 0x6f, 0xa7, 0x39, 0x63, 0xaf, 0x30, 0xf6, 0x2f, 0x17, 0xe0, 0xc9, 0xbe, 0xb4, 0xc8, - 0x0a, 0x8c, 0xb9, 0x0d, 0xf9, 0xe9, 0x20, 0xe9, 0x8e, 0x6d, 0x36, 0x70, 0xcc, 0x6d, 0x90, 0x55, - 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0xcd, 0x6b, 0x51, 0xab, 0x87, 0xb2, 0x14, 0x0d, 0x0c, 0x52, - 0x82, 0x89, 0x96, 0xb3, 0x4b, 0x5b, 0xf2, 0x3c, 0xc1, 0xb5, 0xd8, 0x2d, 0x56, 0x80, 0xa2, 0x9c, - 0xfc, 0x82, 0x05, 0x20, 0x04, 0x64, 0xa7, 0x11, 0xb9, 0x4b, 0x62, 0xbe, 0xcd, 0xc4, 0x28, 0x0b, - 0x29, 0xe3, 0xff, 0x68, 0x70, 0x25, 0x3b, 0x30, 0xc9, 0x14, 0x5a, 0xbf, 0x71, 0xee, 0x4d, 0x91, - 0x5f, 0xc9, 0x54, 0x39, 0x0d, 0x94, 0xb4, 0x58, 0x5b, 0x05, 0x34, 0xea, 0x06, 0x1e, 0x6b, 0x5a, - 0xbe, 0x0d, 0x4e, 0x0b, 0x29, 0x50, 0x97, 0xa2, 0x81, 0x61, 0xff, 0x9b, 0x31, 0x58, 0xca, 0x12, - 0x9d, 0xed, 0x36, 0x93, 0x42, 0x5a, 0x79, 0x34, 0xfe, 0x74, 0xfe, 0xed, 0x23, 0xfd, 0x46, 0xb4, - 0x77, 0x85, 0xf4, 0x6c, 0x93, 0x7c, 0xc9, 0xa7, 0x75, 0x0b, 0x8d, 0x9d, 0xb3, 0x85, 0x34, 0xe5, - 0x54, 0x2b, 0x3d, 0x03, 0xe3, 0x21, 0xeb, 0xf9, 0x42, 0xf2, 0xba, 0x83, 0xf7, 0x11, 0x87, 0x30, - 0x8c, 0xae, 0xe7, 0x46, 0xd2, 0x31, 0x5c, 0x63, 0xdc, 0xf5, 0xdc, 0x08, 0x39, 0xc4, 0xfe, 0xe6, - 0x18, 0xac, 0xf4, 0xff, 0x28, 0xf2, 0x4d, 0x0b, 0xa0, 0xc1, 0x8e, 0x2b, 0x6c, 0x48, 0x2a, 0x3f, - 0x1b, 0xe7, 0xa2, 0xda, 0x70, 0x43, 0x71, 0x8a, 0x9d, 0xae, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, - 0x45, 0x35, 0xf4, 0xf9, 0x55, 0x8d, 0x98, 0x4c, 0xba, 0xce, 0xb6, 0x86, 0xa0, 0x81, 0xc5, 0xce, - 0xa3, 0x9e, 0xd3, 0xa6, 0x61, 0xc7, 0xd1, 0x9e, 0xff, 0xfc, 0x3c, 0x7a, 0x47, 0x15, 0x62, 0x0c, - 0xb7, 0x5b, 0xf0, 0xec, 0x00, 0x72, 0xe6, 0xe4, 0x85, 0x6d, 0xff, 0x2f, 0x0b, 0xae, 0xae, 0xb7, - 0xba, 0x61, 0x44, 0x83, 0xbf, 0x32, 0x3e, 0x6c, 0xff, 0xc7, 0x82, 0xa7, 0xfa, 0x7c, 0xf3, 0x63, - 0x70, 0x65, 0x7b, 0x2f, 0xe9, 0xca, 0x76, 0x77, 0xd4, 0x21, 0x9d, 0xf9, 0x1d, 0x7d, 0x3c, 0xda, - 0x7e, 0xdd, 0x82, 0x4b, 0x6c, 0xd9, 0x6a, 0xf8, 0xcd, 0x9c, 0x36, 0xce, 0x67, 0x61, 0xe2, 0xe7, - 0xd8, 0x06, 0x94, 0x1e, 0x64, 0x7c, 0x57, 0x42, 0x01, 0x63, 0x73, 0xc6, 0xe9, 0xb8, 0xef, 0xd0, - 0x80, 0x6f, 0x40, 0x85, 0xe4, 0x9c, 0x29, 0x6b, 0x08, 0x1a, 0x58, 0xf6, 0xa7, 0x40, 0x3a, 0x8b, - 0xa5, 0x66, 0x9c, 0x35, 0xc8, 0x8c, 0xb3, 0xff, 0xd3, 0x18, 0x18, 0xc6, 0x8f, 0xc7, 0x30, 0x92, - 0xbd, 0xc4, 0x48, 0x1e, 0xf1, 0xe0, 0x6e, 0x98, 0x72, 0xfa, 0x45, 0x85, 0x1c, 0xa6, 0xa2, 0x42, - 0xee, 0xe4, 0xc6, 0xf1, 0xec, 0xa0, 0x90, 0xef, 0x59, 0xf0, 0x54, 0x8c, 0xdc, 0x6b, 0x97, 0x7c, - 0xf4, 0xb2, 0xf4, 0x0a, 0xcc, 0x38, 0x71, 0x35, 0x39, 0x6e, 0x74, 0x20, 0x94, 0x41, 0x11, 0x4d, - 0xbc, 0xd8, 0x07, 0xbd, 0x70, 0x4e, 0x1f, 0xf4, 0xf1, 0xb3, 0x7d, 0xd0, 0xed, 0xbf, 0x18, 0x83, - 0x6b, 0xbd, 0x5f, 0xa6, 0x26, 0xd4, 0x60, 0x97, 0xfc, 0xaf, 0xc2, 0x6c, 0x24, 0x2b, 0x18, 0xdb, - 0x83, 0x0e, 0xe3, 0xdb, 0x31, 0x60, 0x98, 0xc0, 0x64, 0x35, 0xeb, 0x62, 0x2a, 0xd7, 0xea, 0x7e, - 0x47, 0x45, 0x30, 0xe8, 0x9a, 0xeb, 0x06, 0x0c, 0x13, 0x98, 0xda, 0x37, 0x74, 0xfc, 0xc2, 0x7d, - 0x43, 0x6b, 0x70, 0x45, 0x79, 0xc3, 0xdd, 0xf4, 0x83, 0x75, 0xbf, 0xdd, 0x69, 0x51, 0x19, 0xc3, - 0xc0, 0x84, 0xbd, 0x26, 0xab, 0x5c, 0xc1, 0x2c, 0x24, 0xcc, 0xae, 0x6b, 0x7f, 0xaf, 0x00, 0x97, - 0xe3, 0x66, 0x5f, 0xf7, 0xbd, 0x86, 0xcb, 0x7d, 0x0a, 0x5f, 0x83, 0xf1, 0xe8, 0xb8, 0xa3, 0x1a, - 0xfb, 0x6f, 0x28, 0x71, 0x76, 0x8e, 0x3b, 0xac, 0xb7, 0xaf, 0x66, 0x54, 0xe1, 0x96, 0x61, 0x5e, - 0x89, 0x6c, 0xe9, 0xd9, 0x21, 0x7a, 0xe0, 0xe5, 0xe4, 0x68, 0x7e, 0x78, 0x52, 0xca, 0x88, 0x62, - 0x5d, 0xd5, 0x94, 0x92, 0x63, 0x9e, 0xdc, 0x87, 0xb9, 0x96, 0x13, 0x46, 0x77, 0x3b, 0x0d, 0x27, - 0xa2, 0x3b, 0xae, 0xf4, 0xd0, 0x18, 0x2e, 0x30, 0x40, 0x5f, 0x65, 0x6f, 0x25, 0x28, 0x61, 0x8a, - 0x32, 0x39, 0x04, 0xc2, 0x4a, 0x76, 0x02, 0xc7, 0x0b, 0xc5, 0x57, 0x31, 0x7e, 0xc3, 0x07, 0x22, - 0xe8, 0x93, 0xe1, 0x56, 0x0f, 0x35, 0xcc, 0xe0, 0x40, 0x9e, 0x83, 0xc9, 0x80, 0x3a, 0xa1, 0xec, - 0xcc, 0x62, 0x3c, 0xff, 0x91, 0x97, 0xa2, 0x84, 0x9a, 0x13, 0x6a, 0xf2, 0x11, 0x13, 0xea, 0x4f, - 0x2d, 0x98, 0x8b, 0xbb, 0xe9, 0x31, 0xec, 0xac, 0xed, 0xe4, 0xce, 0x7a, 0x2b, 0xaf, 0x25, 0xb1, - 0xcf, 0x66, 0xfa, 0xef, 0x27, 0xcd, 0xef, 0xe3, 0x8e, 0xe1, 0x5f, 0x80, 0xa2, 0x9a, 0xd5, 0x4a, - 0x65, 0x1d, 0xf1, 0x80, 0x9d, 0x50, 0x66, 0x8c, 0x80, 0x26, 0xc9, 0x04, 0x63, 0x7e, 0x6c, 0x2b, - 0x6f, 0xc8, 0x6d, 0x5a, 0x0e, 0x7b, 0xbd, 0x95, 0xab, 0xed, 0x3b, 0x6b, 0x2b, 0x57, 0x75, 0xc8, - 0x5d, 0xb8, 0xda, 0x09, 0x7c, 0x1e, 0xe4, 0xba, 0x41, 0x9d, 0x46, 0xcb, 0xf5, 0xa8, 0xb2, 0x62, - 0x08, 0x4f, 0x8a, 0xa7, 0x4e, 0x4f, 0x4a, 0x57, 0xab, 0xd9, 0x28, 0xd8, 0xaf, 0x6e, 0x32, 0x30, - 0x6b, 0x7c, 0x80, 0xc0, 0xac, 0xbf, 0xaf, 0x6d, 0x85, 0x34, 0x94, 0xe1, 0x51, 0x9f, 0xcd, 0xab, - 0x2b, 0x33, 0x96, 0xf5, 0x78, 0x48, 0x95, 0x25, 0x53, 0xd4, 0xec, 0xfb, 0x1b, 0xa4, 0x26, 0xcf, - 0x69, 0x90, 0x8a, 0xfd, 0xeb, 0xa7, 0x7e, 0x98, 0xfe, 0xf5, 0xd3, 0x3f, 0x52, 0xfe, 0xf5, 0x1f, - 0x4e, 0xc0, 0x42, 0x5a, 0x03, 0xb9, 0xf8, 0xa0, 0xb3, 0x7f, 0x68, 0xc1, 0x82, 0x9a, 0x3d, 0x82, - 0x27, 0x55, 0x57, 0x0d, 0x5b, 0x39, 0x4d, 0x5a, 0xa1, 0x4b, 0xe9, 0xb0, 0xe8, 0x9d, 0x14, 0x37, - 0xec, 0xe1, 0x4f, 0xde, 0x85, 0x19, 0x6d, 0x91, 0x3f, 0x57, 0x04, 0xda, 0x3c, 0xd7, 0xa2, 0x62, - 0x12, 0x68, 0xd2, 0x23, 0x1f, 0x5a, 0x00, 0x75, 0xb5, 0xcd, 0xa9, 0xd9, 0xf5, 0x76, 0x5e, 0xb3, - 0x4b, 0x6f, 0xa0, 0xb1, 0xb2, 0xac, 0x8b, 0x42, 0x34, 0x18, 0x93, 0x5f, 0xe6, 0xb6, 0x78, 0xad, - 0xdd, 0xb1, 0xf9, 0x54, 0x18, 0xdd, 0x77, 0xf8, 0x0c, 0xc5, 0x34, 0x56, 0xa5, 0x0c, 0x50, 0x88, - 0x09, 0x21, 0xec, 0xd7, 0x40, 0x7b, 0x7b, 0xb2, 0x65, 0x8b, 0xfb, 0x7b, 0x56, 0x9d, 0x68, 0x5f, - 0x0e, 0x41, 0xbd, 0x6c, 0xdd, 0x54, 0x00, 0x8c, 0x71, 0xec, 0xcf, 0xc3, 0xdc, 0x1b, 0x81, 0xd3, - 0xd9, 0x77, 0xb9, 0xcd, 0x9b, 0x9d, 0xad, 0x7e, 0x1c, 0xa6, 0x9c, 0x46, 0x23, 0x2b, 0xa9, 0x40, - 0x59, 0x14, 0xa3, 0x82, 0x0f, 0x74, 0x8c, 0xb2, 0xff, 0xc0, 0x02, 0x12, 0xdf, 0x1b, 0xba, 0x5e, - 0x73, 0xdb, 0x89, 0xea, 0xfb, 0xec, 0x7c, 0xb4, 0xcf, 0x4b, 0xb3, 0xce, 0x47, 0xb7, 0x34, 0x04, - 0x0d, 0x2c, 0xf2, 0x3e, 0xcc, 0x88, 0x7f, 0xef, 0x68, 0x0b, 0xc1, 0xc8, 0x11, 0x04, 0x62, 0x43, - 0xe1, 0x32, 0x89, 0x51, 0x78, 0x2b, 0xe6, 0x80, 0x26, 0x3b, 0xd6, 0x54, 0x9b, 0xde, 0x5e, 0xab, - 0xfb, 0xa0, 0xb1, 0x1b, 0x37, 0x55, 0x27, 0xf0, 0xf7, 0xdc, 0x16, 0x4d, 0x37, 0x55, 0x55, 0x14, - 0xa3, 0x82, 0x0f, 0xd6, 0x54, 0xbf, 0x67, 0xc1, 0xd2, 0x66, 0x18, 0xb9, 0xfe, 0x06, 0x0d, 0x23, - 0xb6, 0xad, 0xb0, 0xc5, 0xa7, 0xdb, 0x1a, 0xc4, 0x71, 0x7b, 0x03, 0x16, 0xe4, 0x1d, 0x66, 0x77, - 0x37, 0xa4, 0x91, 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x9e, 0x82, 0x63, 0x4f, 0x0d, 0x46, 0x45, 0x5e, - 0x66, 0xc6, 0x54, 0x0a, 0x49, 0x2a, 0xb5, 0x14, 0x1c, 0x7b, 0x6a, 0xd8, 0xdf, 0x2d, 0xc0, 0x65, - 0xfe, 0x19, 0xa9, 0xa0, 0x8b, 0xaf, 0xf7, 0x0b, 0xba, 0x18, 0x71, 0x2a, 0x73, 0x5e, 0xe7, 0x08, - 0xb9, 0xf8, 0x07, 0x16, 0xcc, 0x37, 0x92, 0x2d, 0x9d, 0x8f, 0x4d, 0x27, 0xab, 0x0f, 0x85, 0xcb, - 0x56, 0xaa, 0x10, 0xd3, 0xfc, 0xc9, 0xaf, 0x58, 0x30, 0x9f, 0x14, 0x53, 0xad, 0xee, 0x17, 0xd0, - 0x48, 0xda, 0xc7, 0x3a, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x0f, 0xc7, 0x64, 0x97, 0x5e, 0x44, - 0x44, 0x01, 0x39, 0x82, 0x62, 0xd4, 0x0a, 0x45, 0xa1, 0xfc, 0xda, 0x11, 0x4f, 0x84, 0x3b, 0x5b, - 0x35, 0xe1, 0x3e, 0x10, 0x2b, 0x6d, 0xb2, 0x84, 0x29, 0x9f, 0x8a, 0x17, 0x67, 0x5c, 0xef, 0x48, - 0xc6, 0xb9, 0x1c, 0x45, 0x77, 0xd6, 0xab, 0x69, 0xc6, 0xb2, 0x84, 0x31, 0x56, 0xbc, 0xec, 0xdf, - 0xb0, 0xa0, 0x78, 0xdb, 0x57, 0xeb, 0xc8, 0xcf, 0xe4, 0x60, 0xe8, 0xd1, 0xfa, 0xa0, 0xbe, 0xa6, - 0x8c, 0x8f, 0x18, 0xaf, 0x27, 0xcc, 0x3c, 0x4f, 0x1b, 0xb4, 0x57, 0x79, 0xc2, 0x24, 0x46, 0xea, - 0xb6, 0xbf, 0xdb, 0xd7, 0xf4, 0xf8, 0xab, 0x13, 0x70, 0xe9, 0x4d, 0xe7, 0x98, 0x7a, 0x91, 0x33, - 0xfc, 0x26, 0xf1, 0x0a, 0xcc, 0x38, 0x1d, 0x7e, 0x0f, 0x66, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, - 0xa1, 0x89, 0x17, 0x2f, 0x68, 0x22, 0x7f, 0x4b, 0xd6, 0x52, 0xb4, 0x9e, 0x82, 0x63, 0x4f, 0x0d, - 0x72, 0x1b, 0x88, 0x8c, 0x46, 0x2d, 0xd7, 0xeb, 0x7e, 0xd7, 0x13, 0x4b, 0x9a, 0x30, 0xaa, 0xe8, - 0xc3, 0xe6, 0x76, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x9f, 0x83, 0xe5, 0x3a, 0xa7, 0x2c, 0x8f, 0x1e, - 0x26, 0x45, 0x71, 0xfc, 0xd4, 0x71, 0x02, 0xeb, 0x7d, 0xf0, 0xb0, 0x2f, 0x05, 0x26, 0x69, 0x18, - 0xf9, 0x81, 0xd3, 0xa4, 0x26, 0xdd, 0xc9, 0xa4, 0xa4, 0xb5, 0x1e, 0x0c, 0xcc, 0xa8, 0x45, 0xbe, - 0x08, 0xc5, 0x68, 0x3f, 0xa0, 0xe1, 0xbe, 0xdf, 0x6a, 0x48, 0xbf, 0x85, 0x11, 0x2d, 0x6d, 0xb2, - 0xf7, 0x77, 0x14, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, 0x79, 0x92, 0x00, 0x26, 0xc3, 0xba, 0xdf, - 0xa1, 0xa1, 0x54, 0xd9, 0x6f, 0xe7, 0xc2, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xe7, 0x80, 0x92, - 0x93, 0xfd, 0xfb, 0x63, 0x30, 0x6b, 0x22, 0x0e, 0xb0, 0x36, 0x7d, 0xd9, 0x82, 0xd9, 0xba, 0xef, - 0x45, 0x81, 0xdf, 0x12, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, 0x83, 0x46, 0x8e, 0xdb, 0x32, - 0x4c, 0x61, 0x06, 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb3, 0x60, 0x3e, 0x76, 0x73, 0x8b, 0x0d, 0x69, - 0xb9, 0x0a, 0xa2, 0x97, 0xfa, 0x1b, 0x49, 0x4e, 0x98, 0x66, 0x6d, 0xef, 0xc2, 0x42, 0xba, 0xb7, - 0x59, 0x53, 0x76, 0x1c, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0x56, 0x9d, 0x30, 0x44, 0x0e, 0x21, 0x2f, - 0xc0, 0x74, 0xdb, 0x09, 0x9a, 0xae, 0xe7, 0xb4, 0x78, 0x2b, 0x16, 0x8c, 0x05, 0x49, 0x96, 0xa3, - 0xc6, 0xb0, 0x3f, 0x0e, 0xb3, 0xdb, 0x8e, 0xd7, 0xa4, 0x0d, 0xb9, 0x0e, 0x3f, 0x3a, 0xa6, 0xed, - 0x07, 0xe3, 0x30, 0x63, 0x9c, 0xcd, 0x2e, 0xfe, 0x9c, 0x95, 0x48, 0xa9, 0x51, 0xc8, 0x31, 0xa5, - 0xc6, 0x67, 0x00, 0xf6, 0x5c, 0xcf, 0x0d, 0xf7, 0xcf, 0x99, 0xac, 0x83, 0xdf, 0xeb, 0xde, 0xd4, - 0x14, 0xd0, 0xa0, 0x16, 0x5f, 0x9e, 0x4d, 0x9c, 0x91, 0xc2, 0xe8, 0x43, 0xcb, 0xd8, 0x6e, 0x26, - 0xf3, 0x70, 0x16, 0x30, 0x3a, 0x66, 0x55, 0x6d, 0x3f, 0x37, 0xbc, 0x28, 0x38, 0x3e, 0x73, 0x57, - 0xda, 0x81, 0xe9, 0x80, 0x86, 0xdd, 0x36, 0x3b, 0x31, 0x4e, 0x0d, 0xdd, 0x0c, 0xdc, 0x6d, 0x03, - 0x65, 0x7d, 0xd4, 0x94, 0x56, 0x5e, 0x83, 0x4b, 0x09, 0x11, 0xc8, 0x02, 0x14, 0x0e, 0xe8, 0xb1, - 0x18, 0x27, 0xc8, 0x7e, 0x92, 0xa5, 0xc4, 0x15, 0xa3, 0x6c, 0x96, 0x4f, 0x8e, 0xbd, 0x6a, 0xd9, - 0x3e, 0x64, 0x1a, 0x00, 0xce, 0x73, 0x99, 0xc3, 0xfa, 0xa2, 0x65, 0x64, 0xeb, 0xd0, 0x7d, 0x21, - 0x9c, 0x73, 0x04, 0xcc, 0xfe, 0x8b, 0x49, 0x90, 0xf7, 0xdf, 0x03, 0x2c, 0x57, 0xe6, 0xad, 0xd7, - 0xd8, 0x39, 0x6e, 0xbd, 0x6e, 0xc3, 0xac, 0xeb, 0xb9, 0x91, 0xeb, 0xb4, 0xb8, 0x71, 0x47, 0x6e, - 0xa7, 0xca, 0x7b, 0x79, 0x76, 0xd3, 0x80, 0x65, 0xd0, 0x49, 0xd4, 0x25, 0x6f, 0xc3, 0x04, 0xdf, - 0x6f, 0xe4, 0x00, 0x1e, 0xfe, 0x92, 0x9e, 0xfb, 0x67, 0x88, 0x90, 0x26, 0x41, 0x89, 0x1f, 0x3e, - 0x44, 0xba, 0x12, 0x7d, 0xfc, 0x96, 0xe3, 0x38, 0x3e, 0x7c, 0xa4, 0xe0, 0xd8, 0x53, 0x83, 0x51, - 0xd9, 0x73, 0xdc, 0x56, 0x37, 0xa0, 0x31, 0x95, 0xc9, 0x24, 0x95, 0x9b, 0x29, 0x38, 0xf6, 0xd4, - 0x20, 0x7b, 0x30, 0x2b, 0xcb, 0x84, 0xcb, 0xd5, 0xd4, 0x39, 0xbf, 0x92, 0xbb, 0xd6, 0xdd, 0x34, - 0x28, 0x61, 0x82, 0x2e, 0xe9, 0xc2, 0xa2, 0xeb, 0xd5, 0x7d, 0xaf, 0xde, 0xea, 0x86, 0xee, 0x21, - 0x8d, 0xe3, 0x89, 0xce, 0xc3, 0xec, 0xca, 0xe9, 0x49, 0x69, 0x71, 0x33, 0x4d, 0x0e, 0x7b, 0x39, - 0x90, 0x2f, 0x59, 0x70, 0xa5, 0xee, 0x7b, 0x21, 0x8f, 0xff, 0x3f, 0xa4, 0x37, 0x82, 0xc0, 0x0f, - 0x04, 0xef, 0xe2, 0x39, 0x79, 0x73, 0x9b, 0xe2, 0x7a, 0x16, 0x49, 0xcc, 0xe6, 0x44, 0xde, 0x83, - 0xe9, 0x4e, 0xe0, 0x1f, 0xba, 0x0d, 0x1a, 0x48, 0xf7, 0xbd, 0xad, 0x3c, 0xf2, 0x91, 0x54, 0x25, - 0xcd, 0x78, 0xe9, 0x51, 0x25, 0xa8, 0xf9, 0xd9, 0xff, 0x77, 0x06, 0xe6, 0x92, 0xe8, 0xe4, 0xe7, - 0x01, 0x3a, 0x81, 0xdf, 0xa6, 0xd1, 0x3e, 0xd5, 0x71, 0x21, 0x77, 0x46, 0x4d, 0x7b, 0xa1, 0xe8, - 0x29, 0x97, 0x17, 0xb6, 0x5c, 0xc4, 0xa5, 0x68, 0x70, 0x24, 0x01, 0x4c, 0x1d, 0x88, 0x6d, 0x57, - 0x6a, 0x21, 0x6f, 0xe6, 0xa2, 0x33, 0x49, 0xce, 0x3c, 0xa0, 0x41, 0x16, 0xa1, 0x62, 0x44, 0x76, - 0xa1, 0x70, 0x44, 0x77, 0xf3, 0x89, 0xb9, 0xbe, 0x47, 0xe5, 0x69, 0xa6, 0x32, 0x75, 0x7a, 0x52, - 0x2a, 0xdc, 0xa3, 0xbb, 0xc8, 0x88, 0xb3, 0xef, 0x6a, 0x88, 0xbb, 0x7b, 0xb9, 0x54, 0x8c, 0xf8, - 0x5d, 0x09, 0x47, 0x00, 0xf1, 0x5d, 0xb2, 0x08, 0x15, 0x23, 0xf2, 0x1e, 0x14, 0x8f, 0x9c, 0x43, - 0xba, 0x17, 0xf8, 0x5e, 0x24, 0xfd, 0xac, 0x46, 0x0c, 0x15, 0xb8, 0xa7, 0xc8, 0x49, 0xbe, 0x7c, - 0x7b, 0xd7, 0x85, 0x18, 0xb3, 0x23, 0x87, 0x30, 0xed, 0xd1, 0x23, 0xa4, 0x2d, 0xb7, 0x9e, 0x8f, - 0x6b, 0xfe, 0x1d, 0x49, 0x4d, 0x72, 0xe6, 0xfb, 0x9e, 0x2a, 0x43, 0xcd, 0x8b, 0xf5, 0xe5, 0x7d, - 0x7f, 0x57, 0x2e, 0x54, 0x23, 0xf6, 0xa5, 0x3e, 0x99, 0x8a, 0xbe, 0xbc, 0xed, 0xef, 0x22, 0x23, - 0xce, 0xe6, 0x48, 0x5d, 0x3b, 0xf9, 0xc8, 0x65, 0xea, 0x4e, 0xbe, 0xce, 0x4d, 0x62, 0x8e, 0xc4, - 0xa5, 0x68, 0x70, 0x64, 0x6d, 0xdb, 0x94, 0xc6, 0x4a, 0xb9, 0x50, 0x8d, 0xd8, 0xb6, 0x49, 0xd3, - 0xa7, 0x68, 0x5b, 0x55, 0x86, 0x9a, 0x17, 0xe3, 0xeb, 0x4a, 0xcb, 0x5f, 0x3e, 0x4b, 0x55, 0xd2, - 0x8e, 0x28, 0xf8, 0xaa, 0x32, 0xd4, 0xbc, 0x58, 0x7b, 0x87, 0x07, 0xc7, 0x47, 0x4e, 0xeb, 0xc0, - 0xf5, 0x9a, 0x32, 0xce, 0x71, 0xd4, 0xfc, 0xa9, 0x07, 0xc7, 0xf7, 0x04, 0x3d, 0xb3, 0xbd, 0xe3, - 0x52, 0x34, 0x38, 0x92, 0x7f, 0x6a, 0xc1, 0x64, 0xa7, 0xd5, 0x6d, 0xba, 0xde, 0xf2, 0x2c, 0xd7, - 0x13, 0x3f, 0x9d, 0xe7, 0x0a, 0xbd, 0x5a, 0xe5, 0xa4, 0x85, 0xa2, 0xf8, 0x13, 0xda, 0x67, 0x8f, - 0x17, 0xfe, 0xe2, 0x9f, 0x95, 0x96, 0xa9, 0x57, 0xf7, 0x1b, 0xae, 0xd7, 0x5c, 0xbb, 0x1f, 0xfa, - 0xde, 0x2a, 0x3a, 0x47, 0x4a, 0x47, 0x97, 0x32, 0xad, 0xfc, 0x14, 0xcc, 0x18, 0x24, 0x1e, 0xa5, - 0xe8, 0xcd, 0x9a, 0x8a, 0xde, 0x6f, 0x4c, 0xc2, 0xac, 0x99, 0x51, 0x6f, 0x00, 0xed, 0x4b, 0x9f, - 0x38, 0xc6, 0x86, 0x39, 0x71, 0xb0, 0x23, 0xa6, 0x71, 0x7b, 0xa4, 0xcc, 0x5b, 0x9b, 0xb9, 0x29, - 0xdc, 0xf1, 0x11, 0xd3, 0x28, 0x0c, 0x31, 0xc1, 0x74, 0x08, 0x87, 0x12, 0xa6, 0xb6, 0x0a, 0xc5, - 0x6e, 0x22, 0xa9, 0xb6, 0x26, 0x54, 0xb5, 0x17, 0x01, 0xe2, 0xcc, 0x72, 0xf2, 0x56, 0x51, 0xeb, - 0xc3, 0x46, 0xc6, 0x3b, 0x03, 0x8b, 0x3c, 0x07, 0x93, 0x4c, 0xf5, 0xa1, 0x0d, 0x19, 0x86, 0xad, - 0xcf, 0xf1, 0x37, 0x79, 0x29, 0x4a, 0x28, 0x79, 0x95, 0x69, 0xa9, 0xb1, 0xc2, 0x22, 0xa3, 0xab, - 0x97, 0x62, 0x2d, 0x35, 0x86, 0x61, 0x02, 0x93, 0x89, 0x4e, 0x99, 0x7e, 0xc1, 0xd7, 0x06, 0x43, - 0x74, 0xae, 0x74, 0xa0, 0x80, 0x71, 0xbb, 0x52, 0x4a, 0x1f, 0xe1, 0x73, 0x7a, 0xc2, 0xb0, 0x2b, - 0xa5, 0xe0, 0xd8, 0x53, 0x83, 0x7d, 0x8c, 0xbc, 0x10, 0x9d, 0x11, 0xce, 0xb6, 0x7d, 0xae, 0x32, - 0xbf, 0x62, 0x9e, 0xb5, 0x72, 0x9c, 0x43, 0x62, 0xd4, 0x0e, 0x7e, 0xd8, 0x1a, 0xed, 0x58, 0xf4, - 0x79, 0x98, 0x4b, 0xee, 0x42, 0xb9, 0xdf, 0x7c, 0x7c, 0x75, 0x1c, 0x2e, 0xdf, 0x69, 0xba, 0x5e, - 0x3a, 0x5b, 0x54, 0x56, 0xd6, 0x66, 0x6b, 0xd8, 0xac, 0xcd, 0x71, 0x3c, 0x97, 0x4c, 0x8b, 0x9d, - 0x1d, 0xcf, 0xa5, 0x72, 0x66, 0x27, 0x71, 0xc9, 0x9f, 0x5a, 0xf0, 0xb4, 0xd3, 0x10, 0xe7, 0x02, - 0xa7, 0x25, 0x4b, 0x63, 0xa6, 0x6a, 0x46, 0x87, 0x23, 0xee, 0xf2, 0xbd, 0x1f, 0xbf, 0x5a, 0x3e, - 0x83, 0xab, 0xe8, 0xf1, 0x1f, 0x93, 0x5f, 0xf0, 0xf4, 0x59, 0xa8, 0x78, 0xa6, 0xf8, 0xe4, 0x6f, - 0xc3, 0x7c, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x28, 0x2e, 0x2c, 0x6a, 0x49, 0x10, 0xa6, 0x71, 0x57, - 0xde, 0x82, 0x8f, 0x3e, 0x52, 0xce, 0xa1, 0x06, 0xdb, 0x97, 0x2d, 0x28, 0x0a, 0xbb, 0x36, 0xd2, - 0xbd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, 0xae, 0x6e, 0x66, 0x38, 0x61, 0xb2, 0xb5, 0xfc, 0xc0, - 0xf5, 0x1a, 0xb2, 0x97, 0xf5, 0x5a, 0xfe, 0xa6, 0xeb, 0x35, 0x90, 0x43, 0xf4, 0x6a, 0x5f, 0xe8, - 0x6b, 0x6f, 0xfa, 0xb6, 0x05, 0x73, 0x3c, 0x06, 0x36, 0x3e, 0x13, 0xbe, 0xa2, 0x9d, 0x8d, 0x84, - 0x18, 0xd7, 0x92, 0xce, 0x46, 0x0f, 0x4f, 0x4a, 0x33, 0x22, 0x6a, 0x36, 0xe9, 0x7b, 0xf4, 0x59, - 0x69, 0x48, 0xe2, 0x2e, 0x51, 0x63, 0x43, 0xdb, 0x39, 0xb4, 0xa1, 0xb5, 0xa6, 0x88, 0x60, 0x4c, - 0xcf, 0x7e, 0x1f, 0x66, 0xcd, 0x60, 0x16, 0xf2, 0x0a, 0xcc, 0x74, 0x5c, 0xaf, 0x99, 0x0c, 0x7a, - 0xd4, 0xc6, 0xf6, 0x6a, 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, 0x29, 0x1b, 0x7d, 0xd5, - 0x37, 0xab, 0xc5, 0x7f, 0xec, 0x7f, 0x55, 0x80, 0xcb, 0x19, 0x41, 0x53, 0xe4, 0x43, 0x0b, 0x26, - 0x79, 0xcc, 0x85, 0x72, 0x27, 0x7a, 0x37, 0xf7, 0xc0, 0xac, 0x55, 0x1e, 0xda, 0x21, 0xa7, 0x81, - 0x5e, 0x7d, 0x45, 0x21, 0x4a, 0xe6, 0xe4, 0x1f, 0x5b, 0x30, 0xe3, 0x18, 0x33, 0x55, 0x78, 0x58, - 0xed, 0xe6, 0x2f, 0x4c, 0xcf, 0xc4, 0x34, 0x3c, 0x43, 0xe3, 0x79, 0x68, 0xca, 0xc2, 0x94, 0x17, - 0xe3, 0x13, 0x86, 0x99, 0x21, 0x2b, 0xaf, 0xc3, 0xc2, 0x48, 0x33, 0xec, 0xa7, 0x61, 0xd8, 0xe4, - 0x8a, 0x6c, 0xbf, 0x3b, 0x32, 0x03, 0xd3, 0x75, 0x8b, 0xcb, 0xc8, 0x74, 0x09, 0xb5, 0x77, 0x61, - 0x21, 0x7d, 0xea, 0xcd, 0xdd, 0xa1, 0xe0, 0xe3, 0x30, 0x64, 0x3a, 0x44, 0xfb, 0x06, 0x10, 0xf4, - 0x5b, 0xad, 0x5d, 0xa7, 0x7e, 0x70, 0xcf, 0xf5, 0x1a, 0xfe, 0x11, 0x9f, 0x2b, 0x6b, 0x50, 0x0c, - 0x64, 0x4c, 0x5c, 0x28, 0x3f, 0x4b, 0x4f, 0x36, 0x15, 0x2c, 0x17, 0x62, 0x8c, 0x63, 0xff, 0xe1, - 0x18, 0x4c, 0xc9, 0x00, 0xce, 0xc7, 0xe0, 0x9b, 0x7d, 0x90, 0xb8, 0xb4, 0xdb, 0xcc, 0x25, 0xee, - 0xb4, 0xaf, 0x63, 0x76, 0x98, 0x72, 0xcc, 0x7e, 0x33, 0x1f, 0x76, 0x67, 0x7b, 0x65, 0x7f, 0x7b, - 0x1c, 0xe6, 0x53, 0x01, 0xb1, 0x4c, 0x61, 0xea, 0x71, 0x46, 0xbc, 0x9b, 0x6b, 0xcc, 0xad, 0x0e, - 0x36, 0x38, 0xdb, 0x2f, 0x31, 0x4c, 0x24, 0xaf, 0x7d, 0x3b, 0xb7, 0xbc, 0xf7, 0x7f, 0x9d, 0xc7, - 0x76, 0x58, 0x3f, 0xbb, 0xff, 0x6a, 0xc1, 0x93, 0x7d, 0xe3, 0xa6, 0x79, 0xda, 0x9d, 0x20, 0x09, - 0x95, 0x13, 0x32, 0xe7, 0xec, 0x10, 0xfa, 0x06, 0x2d, 0x9d, 0x29, 0x25, 0xcd, 0x9e, 0xbc, 0x0c, - 0xb3, 0x7c, 0x87, 0x66, 0x4b, 0x53, 0x44, 0x3b, 0xf2, 0x02, 0x80, 0x9b, 0x82, 0x6b, 0x46, 0x39, - 0x26, 0xb0, 0xec, 0x6f, 0x59, 0xb0, 0xdc, 0x2f, 0x09, 0xcb, 0x00, 0xc7, 0xd3, 0xbf, 0x95, 0x72, - 0x1e, 0x2f, 0xf5, 0x38, 0x8f, 0xa7, 0x0e, 0xa8, 0xca, 0x4f, 0xdc, 0x38, 0x1b, 0x16, 0x1e, 0xe1, - 0x1b, 0xfd, 0x75, 0x0b, 0xae, 0xf6, 0x99, 0x4d, 0x3d, 0x41, 0x04, 0xd6, 0xb9, 0x83, 0x08, 0xc6, - 0x06, 0x0d, 0x22, 0xb0, 0xff, 0xa8, 0x00, 0x0b, 0x52, 0x9e, 0x58, 0x4d, 0x7b, 0x35, 0xe1, 0x82, - 0xff, 0x63, 0x29, 0x17, 0xfc, 0xa5, 0x34, 0xfe, 0x5f, 0xfb, 0xdf, 0xff, 0x68, 0xf9, 0xdf, 0xff, - 0xe5, 0x18, 0x5c, 0xc9, 0xcc, 0x0d, 0x43, 0xbe, 0x9a, 0xb1, 0x35, 0xdc, 0xcb, 0x39, 0x09, 0xcd, - 0x80, 0x9b, 0xc3, 0xa8, 0x4e, 0xeb, 0xbf, 0x62, 0x3a, 0x8b, 0x8b, 0xa5, 0x7e, 0xef, 0x02, 0xd2, - 0xe9, 0x0c, 0xe9, 0x37, 0x6e, 0xff, 0x62, 0x01, 0x9e, 0x1f, 0x94, 0xd0, 0x8f, 0x68, 0x5c, 0x51, - 0x98, 0x88, 0x2b, 0x7a, 0x4c, 0xdb, 0xf6, 0x85, 0x84, 0x18, 0xfd, 0xf3, 0x71, 0xbd, 0xed, 0xf5, - 0x8e, 0xcf, 0x81, 0x6e, 0x8b, 0xa7, 0x98, 0x6a, 0xa7, 0xf2, 0xcb, 0xc6, 0x4b, 0xe1, 0x54, 0x4d, - 0x14, 0x3f, 0x3c, 0x29, 0x2d, 0xc6, 0x19, 0x0a, 0x64, 0x21, 0xaa, 0x4a, 0xe4, 0x79, 0x98, 0x0e, - 0x04, 0x54, 0x45, 0x52, 0xc8, 0x2b, 0x77, 0x51, 0x86, 0x1a, 0x4a, 0xbe, 0x68, 0xe8, 0xc2, 0xe3, - 0x17, 0x95, 0x88, 0xe3, 0x2c, 0x4f, 0x82, 0x77, 0x61, 0x3a, 0x54, 0xb9, 0x5f, 0xc5, 0x75, 0xcf, - 0x4b, 0x03, 0x06, 0xe8, 0xb0, 0x13, 0x98, 0x4a, 0x04, 0x2b, 0xbe, 0x4f, 0xa7, 0x89, 0xd5, 0x24, - 0x89, 0xad, 0x0f, 0x3f, 0xc2, 0xd2, 0x09, 0xbd, 0x07, 0x1f, 0x12, 0xc1, 0x94, 0x7c, 0x37, 0x4d, - 0x5e, 0xc1, 0x6c, 0xe7, 0xe4, 0x8c, 0x2f, 0x5d, 0x35, 0xf9, 0x45, 0x97, 0x3a, 0x84, 0x2b, 0x56, - 0xf6, 0xf7, 0x2c, 0x98, 0x91, 0x63, 0xe4, 0x31, 0x44, 0x2a, 0xdd, 0x4f, 0x46, 0x2a, 0xdd, 0xc8, - 0x65, 0xc5, 0xea, 0x13, 0xa6, 0x74, 0x1f, 0x66, 0xcd, 0xa4, 0x64, 0xe4, 0x33, 0xc6, 0x8a, 0x6b, - 0x8d, 0x92, 0xe6, 0x47, 0xad, 0xc9, 0xf1, 0x6a, 0x6c, 0xff, 0x66, 0x51, 0xb7, 0x22, 0x3f, 0x18, - 0x9a, 0x23, 0xdf, 0x3a, 0x73, 0xe4, 0x9b, 0x03, 0x6f, 0x2c, 0xff, 0x81, 0xf7, 0x36, 0x4c, 0xab, - 0x65, 0x51, 0x2a, 0x0f, 0xcf, 0x9a, 0xbe, 0x9b, 0x4c, 0x03, 0x61, 0xc4, 0x8c, 0xe9, 0xc2, 0x0f, - 0x78, 0xba, 0x0f, 0xf5, 0x72, 0xad, 0xc9, 0x90, 0xf7, 0x60, 0xe6, 0xc8, 0x0f, 0x0e, 0x5a, 0xbe, - 0xc3, 0x33, 0x4f, 0x43, 0x1e, 0xd7, 0x85, 0xda, 0x5a, 0x27, 0x1c, 0xe8, 0xef, 0xc5, 0xf4, 0xd1, - 0x64, 0x46, 0xca, 0x30, 0xdf, 0x76, 0x3d, 0xa4, 0x4e, 0x43, 0x07, 0x24, 0x8d, 0x8b, 0x64, 0xb7, - 0x4a, 0xb5, 0xde, 0x4e, 0x82, 0x31, 0x8d, 0x4f, 0xbe, 0x66, 0xc1, 0x5c, 0x90, 0x38, 0xca, 0xcb, - 0x8c, 0x96, 0xd5, 0xd1, 0x07, 0x63, 0xd2, 0x3c, 0x20, 0x3c, 0xc8, 0x93, 0xe5, 0x98, 0xe2, 0x4d, - 0xbe, 0x00, 0xd3, 0xa1, 0xcc, 0x38, 0x96, 0xcf, 0x3d, 0xb3, 0x3e, 0x38, 0x0b, 0xa2, 0x71, 0x57, - 0xaa, 0x12, 0xd4, 0x0c, 0xc9, 0x16, 0x2c, 0x29, 0xdb, 0x44, 0xe2, 0x75, 0xa0, 0xc9, 0x38, 0x41, - 0x0d, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0x53, 0xe5, 0x78, 0xb2, 0x3f, 0x71, 0x3d, 0x63, 0xdc, 0x68, - 0xf0, 0xf9, 0xd7, 0x40, 0x09, 0x3d, 0x2b, 0xde, 0x6e, 0x7a, 0x84, 0x78, 0xbb, 0x1a, 0x5c, 0x49, - 0x83, 0x78, 0xe6, 0x21, 0x9e, 0xec, 0xc8, 0xd8, 0x42, 0xab, 0x59, 0x48, 0x98, 0x5d, 0x97, 0xdc, - 0x83, 0x62, 0x40, 0xf9, 0x21, 0xab, 0xac, 0x3c, 0x5b, 0x86, 0xf6, 0xe1, 0x43, 0x45, 0x00, 0x63, - 0x5a, 0xac, 0xdf, 0x9d, 0x64, 0xfa, 0xd9, 0xb7, 0x73, 0x7c, 0xdf, 0x50, 0xf6, 0x7d, 0x9f, 0x8c, - 0x60, 0xf6, 0xf7, 0xe7, 0xe0, 0x52, 0xc2, 0xc0, 0x42, 0x9e, 0x85, 0x09, 0x9e, 0x8a, 0x89, 0xaf, - 0x56, 0xd3, 0xf1, 0x8a, 0x2a, 0x1a, 0x47, 0xc0, 0xc8, 0x2f, 0x59, 0x30, 0xdf, 0x49, 0x58, 0xb4, - 0xd5, 0x42, 0x3e, 0xe2, 0x65, 0x76, 0xd2, 0x4c, 0x6e, 0x24, 0x6e, 0x4f, 0x32, 0xc3, 0x34, 0x77, - 0xb6, 0x1e, 0x48, 0x47, 0xd8, 0x16, 0x0d, 0x38, 0xb6, 0x54, 0xf4, 0x34, 0x89, 0xf5, 0x24, 0x18, - 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, 0x8d, 0xf2, 0xf0, 0x59, 0x59, 0x11, 0xc0, 0x98, 0x16, 0x79, - 0x1d, 0xe6, 0x64, 0xd6, 0xd1, 0xaa, 0xdf, 0xb8, 0xe5, 0x84, 0xfb, 0xf2, 0x84, 0xa3, 0x4f, 0x64, - 0xeb, 0x09, 0x28, 0xa6, 0xb0, 0xf9, 0xb7, 0xc5, 0xa9, 0x5d, 0x39, 0x81, 0xc9, 0x64, 0x5e, 0xfb, - 0xf5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x05, 0x63, 0x1b, 0x12, 0x57, 0xa6, 0x7a, 0x35, 0xc8, 0xd8, - 0x8a, 0xca, 0x30, 0xdf, 0xe5, 0x07, 0xc2, 0x86, 0x02, 0xca, 0xf9, 0xa8, 0x19, 0xde, 0x4d, 0x82, - 0x31, 0x8d, 0x4f, 0x5e, 0x83, 0x4b, 0x01, 0x5b, 0x6c, 0x35, 0x01, 0x71, 0x8f, 0xaa, 0xaf, 0xc9, - 0xd0, 0x04, 0x62, 0x12, 0x97, 0xbc, 0x01, 0x8b, 0x71, 0x92, 0x3e, 0x45, 0x40, 0x5c, 0xac, 0xea, - 0x8c, 0x51, 0xe5, 0x34, 0x02, 0xf6, 0xd6, 0x21, 0x7f, 0x17, 0x16, 0x8c, 0x96, 0xd8, 0xf4, 0x1a, - 0xf4, 0x81, 0x4c, 0xa4, 0xc6, 0x1f, 0x2c, 0x59, 0x4f, 0xc1, 0xb0, 0x07, 0x9b, 0x7c, 0x12, 0xe6, - 0xea, 0x7e, 0xab, 0xc5, 0xd7, 0x38, 0x91, 0x53, 0x5d, 0x64, 0x4c, 0x13, 0xb9, 0xe5, 0x12, 0x10, - 0x4c, 0x61, 0x92, 0xdb, 0x40, 0xfc, 0x5d, 0xa6, 0x5e, 0xd1, 0xc6, 0x1b, 0xe2, 0x29, 0x65, 0xa6, - 0x71, 0x5c, 0x4a, 0xba, 0xe1, 0xbf, 0xd5, 0x83, 0x81, 0x19, 0xb5, 0x78, 0xc2, 0x29, 0x23, 0x6c, - 0x71, 0x2e, 0x8f, 0x47, 0xc0, 0xd2, 0xe6, 0x8b, 0x47, 0xc6, 0x2c, 0x06, 0x30, 0x29, 0xa2, 0x22, - 0xf2, 0x49, 0x9d, 0x66, 0xa6, 0x57, 0x8e, 0xf7, 0x08, 0x51, 0x8a, 0x92, 0x13, 0xf9, 0x79, 0x28, - 0xee, 0xaa, 0x5c, 0xfb, 0x3c, 0x5f, 0xda, 0xc8, 0xfb, 0x62, 0xea, 0xd9, 0x88, 0xf8, 0x78, 0xae, - 0x01, 0x18, 0xb3, 0x24, 0xcf, 0xc1, 0xcc, 0xad, 0x6a, 0x59, 0x8f, 0xc2, 0x45, 0xde, 0xfb, 0xe3, - 0xac, 0x0a, 0x9a, 0x00, 0x36, 0xc3, 0xb4, 0xfa, 0x46, 0x92, 0xcf, 0x57, 0x64, 0x68, 0x63, 0x0c, - 0x9b, 0x5f, 0x7e, 0x62, 0x6d, 0xf9, 0x72, 0x0a, 0x5b, 0x96, 0xa3, 0xc6, 0x20, 0xef, 0xc2, 0x8c, - 0xdc, 0x2f, 0xf8, 0xda, 0xb4, 0x74, 0xbe, 0x90, 0x58, 0x8c, 0x49, 0xa0, 0x49, 0x8f, 0xdf, 0xd8, - 0xf1, 0x14, 0xe4, 0xf4, 0x66, 0xb7, 0xd5, 0x5a, 0xbe, 0xc2, 0xd7, 0xcd, 0xf8, 0xc6, 0x2e, 0x06, - 0xa1, 0x89, 0x47, 0x5e, 0x52, 0x4e, 0x2c, 0x1f, 0x49, 0x5c, 0x61, 0x6a, 0x27, 0x16, 0xad, 0x74, - 0xf7, 0xf1, 0x9a, 0xbf, 0xfa, 0x08, 0xef, 0x91, 0x5d, 0x58, 0x51, 0x1a, 0x5f, 0xef, 0x24, 0x59, - 0x5e, 0x4e, 0x98, 0x4a, 0x56, 0xee, 0xf5, 0xc5, 0xc4, 0x33, 0xa8, 0x90, 0x5d, 0x28, 0x38, 0xad, - 0xdd, 0xe5, 0x27, 0xf3, 0x50, 0x5d, 0xf5, 0xd3, 0xe8, 0xc2, 0xd3, 0xad, 0xbc, 0x55, 0x41, 0x46, - 0xdc, 0xfe, 0xd2, 0x98, 0xbe, 0x9a, 0xd0, 0x29, 0x65, 0xdf, 0x37, 0x47, 0xb5, 0x95, 0xc7, 0xd3, - 0xbf, 0x3d, 0x0f, 0x52, 0x88, 0x0d, 0x29, 0x73, 0x4c, 0x77, 0xf4, 0x3c, 0xce, 0x25, 0x59, 0x4f, - 0x32, 0x5d, 0xae, 0x38, 0xd2, 0x26, 0x67, 0xb1, 0xfd, 0x3b, 0xa0, 0x2d, 0x71, 0x29, 0xaf, 0x8c, - 0x00, 0x26, 0xdc, 0x30, 0x72, 0xfd, 0x1c, 0xc3, 0x37, 0x53, 0x79, 0x66, 0xb9, 0x77, 0x38, 0x07, - 0xa0, 0x60, 0xc5, 0x78, 0x7a, 0x4d, 0xd7, 0x7b, 0x20, 0x3f, 0xff, 0xed, 0xdc, 0xdd, 0x2d, 0x04, - 0x4f, 0x0e, 0x40, 0xc1, 0x8a, 0xdc, 0x17, 0x23, 0x2d, 0x9f, 0x67, 0x9e, 0xd3, 0xaf, 0xb7, 0x27, - 0x47, 0x1c, 0xe3, 0x15, 0xb6, 0x5d, 0xa9, 0xc3, 0x8c, 0xc8, 0xab, 0xb6, 0xbd, 0x99, 0xc5, 0xab, - 0xb6, 0xbd, 0x89, 0x8c, 0x09, 0xf9, 0x8a, 0x05, 0xe0, 0xe8, 0x67, 0xcc, 0xf3, 0x79, 0xbd, 0xa5, - 0xdf, 0xb3, 0xe8, 0xc2, 0xc1, 0x30, 0x86, 0xa2, 0xc1, 0x99, 0xbc, 0x07, 0x53, 0x8e, 0x78, 0xa9, - 0x4a, 0xfa, 0xca, 0xe6, 0xf3, 0xfc, 0x5a, 0x4a, 0x02, 0x6e, 0x3b, 0x91, 0x20, 0x54, 0x0c, 0x19, - 0xef, 0x28, 0x70, 0xe8, 0x9e, 0x7b, 0x20, 0x2d, 0x36, 0xb5, 0x91, 0x53, 0xc8, 0x33, 0x62, 0x59, - 0xbc, 0x25, 0x08, 0x15, 0x43, 0xf1, 0x72, 0xb0, 0xe3, 0x39, 0x3a, 0x02, 0x2a, 0x9f, 0x38, 0x39, - 0x33, 0xa6, 0xca, 0x78, 0x39, 0xd8, 0x64, 0x84, 0x49, 0xbe, 0xe4, 0x10, 0x26, 0x1d, 0xfe, 0x86, - 0x9e, 0x3c, 0x1f, 0x61, 0x1e, 0xef, 0xf1, 0xa5, 0xda, 0x80, 0x2f, 0x2e, 0xf2, 0xa5, 0x3e, 0xc9, - 0x8d, 0xfc, 0x9a, 0x05, 0x53, 0xc2, 0x8d, 0x93, 0x69, 0x89, 0xec, 0xdb, 0x3f, 0x7f, 0x01, 0xf9, - 0xaa, 0xa5, 0x8b, 0xa9, 0x74, 0xca, 0xf8, 0x49, 0xed, 0xa3, 0x26, 0x4a, 0xcf, 0x74, 0x32, 0x55, - 0xd2, 0xad, 0x7c, 0x12, 0x66, 0x4d, 0x2a, 0x43, 0xb9, 0x99, 0xfe, 0x79, 0x01, 0x80, 0x37, 0xb4, - 0xc8, 0x79, 0xd0, 0xe6, 0xc9, 0x35, 0xf7, 0xfd, 0x46, 0x3e, 0x8f, 0x1f, 0x9a, 0xa9, 0x0b, 0x40, - 0x66, 0xd2, 0xdc, 0xf7, 0x1b, 0x28, 0x99, 0x90, 0x26, 0x8c, 0x77, 0x9c, 0x68, 0x3f, 0xff, 0x3c, - 0x09, 0xd3, 0x22, 0xf8, 0x2f, 0xda, 0x47, 0xce, 0x80, 0x7c, 0x60, 0xc1, 0x94, 0xc8, 0x94, 0xa0, - 0x6e, 0x33, 0x46, 0xbe, 0xb2, 0x57, 0x6d, 0xb6, 0x2a, 0xd2, 0x31, 0xc8, 0x1e, 0xd4, 0x8a, 0x87, - 0x2c, 0x45, 0xc5, 0x76, 0xe5, 0x43, 0x0b, 0x66, 0x4d, 0xd4, 0x8c, 0x6e, 0xfa, 0x59, 0xb3, 0x9b, - 0xf2, 0x6c, 0x0f, 0xb3, 0xc7, 0xff, 0x87, 0x05, 0xc6, 0x6b, 0xd6, 0xb1, 0x37, 0xad, 0x35, 0xb0, - 0x37, 0xed, 0xd8, 0x90, 0xde, 0xb4, 0x85, 0xa1, 0xbc, 0x69, 0xc7, 0x87, 0xf7, 0xa6, 0x9d, 0xe8, - 0xef, 0x4d, 0x6b, 0x7f, 0xc3, 0x82, 0xc5, 0x9e, 0xdd, 0x86, 0x29, 0xa7, 0x81, 0xef, 0x47, 0x7d, - 0xbc, 0xd0, 0x30, 0x06, 0xa1, 0x89, 0x47, 0x36, 0x60, 0x41, 0xa6, 0x92, 0xaf, 0x75, 0x5a, 0x6e, - 0x66, 0x0e, 0x8b, 0x9d, 0x14, 0x1c, 0x7b, 0x6a, 0xd8, 0xbf, 0x63, 0xc1, 0x8c, 0x11, 0xf9, 0xca, - 0xbe, 0x83, 0x47, 0x08, 0x4b, 0x31, 0xe2, 0x2c, 0xfa, 0xfc, 0xf6, 0x48, 0xc0, 0xc4, 0x45, 0x66, - 0xd3, 0x48, 0x34, 0x1c, 0x5f, 0x64, 0xb2, 0x52, 0x94, 0x50, 0x91, 0x42, 0x96, 0x76, 0x78, 0xa3, - 0x17, 0xcc, 0x14, 0xb2, 0xb4, 0x83, 0x1c, 0xc2, 0xd9, 0x31, 0x2d, 0x5d, 0x3a, 0x5a, 0x1b, 0x49, - 0xfb, 0x9d, 0x20, 0x42, 0x01, 0x23, 0xd7, 0xa0, 0x40, 0xbd, 0x86, 0x34, 0x29, 0xe8, 0x67, 0xf5, - 0x6e, 0x78, 0x0d, 0x64, 0xe5, 0xf6, 0x5b, 0x30, 0x5b, 0xa3, 0xf5, 0x80, 0x46, 0x6f, 0xd2, 0xe3, - 0x81, 0xdf, 0xe9, 0x63, 0xa3, 0x3d, 0xf5, 0x4e, 0x1f, 0xab, 0xce, 0xca, 0xed, 0x7f, 0x69, 0x41, - 0xea, 0x65, 0x09, 0xe3, 0x52, 0xc3, 0xea, 0x7b, 0xa9, 0x61, 0x1a, 0xc2, 0xc7, 0xce, 0x34, 0x84, - 0xdf, 0x06, 0xd2, 0x66, 0x53, 0x21, 0xf1, 0x8e, 0x8a, 0xb4, 0xe6, 0xc4, 0x71, 0xf6, 0x3d, 0x18, - 0x98, 0x51, 0xcb, 0xfe, 0x17, 0x42, 0x58, 0xf3, 0xad, 0x89, 0x47, 0x37, 0x40, 0x17, 0x26, 0x38, - 0x29, 0x69, 0xd2, 0x1a, 0xd1, 0x1c, 0xdc, 0x9b, 0xaf, 0x26, 0xee, 0x48, 0x39, 0xe5, 0x39, 0x37, - 0xfb, 0x8f, 0x84, 0xac, 0xc6, 0x63, 0x14, 0x03, 0xc8, 0xda, 0x4e, 0xca, 0x7a, 0x2b, 0xaf, 0xb5, - 0x32, 0x5b, 0x46, 0xb2, 0x0a, 0xd0, 0xa1, 0x41, 0x9d, 0x7a, 0x91, 0xf2, 0xff, 0x9f, 0x90, 0x91, - 0x68, 0xba, 0x14, 0x0d, 0x0c, 0xfb, 0x57, 0x2d, 0x58, 0x48, 0x87, 0x89, 0xe4, 0xed, 0xc4, 0x97, - 0x88, 0x65, 0x2d, 0x0c, 0x1f, 0xcb, 0x6a, 0x7f, 0xc0, 0x84, 0x8c, 0xdc, 0xfa, 0x81, 0xeb, 0x89, - 0xf0, 0xcf, 0x3d, 0xb7, 0xc9, 0x84, 0xa4, 0xf2, 0xe5, 0x3b, 0x61, 0x09, 0xd5, 0x42, 0xaa, 0x07, - 0xef, 0x14, 0x9c, 0x94, 0x61, 0x5e, 0xdd, 0xff, 0x28, 0xf3, 0xb5, 0x08, 0x5b, 0xd7, 0xe6, 0xb2, - 0x8d, 0x24, 0x18, 0xd3, 0xf8, 0xf6, 0x17, 0x61, 0xc6, 0xd8, 0x04, 0xf8, 0x7a, 0xf9, 0xc0, 0xa9, - 0x47, 0xe9, 0x75, 0xe6, 0x06, 0x2b, 0x44, 0x01, 0xe3, 0x56, 0x76, 0xe1, 0xc5, 0x9e, 0x5a, 0x67, - 0xa4, 0xef, 0xba, 0x84, 0x32, 0x62, 0x01, 0x6d, 0xd2, 0x07, 0x2a, 0xef, 0xb2, 0x22, 0x86, 0xac, - 0x10, 0x05, 0xcc, 0x7e, 0x01, 0xa6, 0x55, 0x72, 0x11, 0x1e, 0xa1, 0xaf, 0x2c, 0xc0, 0x66, 0x84, - 0xbe, 0x1f, 0x44, 0xc8, 0x21, 0xf6, 0x3b, 0x30, 0xad, 0x72, 0xa0, 0x3c, 0x1a, 0x9b, 0x4d, 0xfd, - 0xd0, 0x73, 0x6f, 0xf9, 0x61, 0xa4, 0x12, 0xb7, 0x88, 0x4b, 0xaa, 0x3b, 0x9b, 0xbc, 0x0c, 0x35, - 0xd4, 0x7e, 0x09, 0xe6, 0x53, 0x97, 0x95, 0x03, 0x84, 0xf3, 0xff, 0x7e, 0x01, 0x66, 0x13, 0x8f, - 0xd3, 0x3f, 0x7a, 0xd6, 0x0c, 0xbe, 0x18, 0x65, 0xdc, 0x33, 0x15, 0x86, 0xbc, 0x67, 0x32, 0x2f, - 0xf6, 0xc6, 0x2f, 0xf6, 0x62, 0x6f, 0x22, 0x9f, 0x8b, 0x3d, 0xe3, 0x02, 0x7a, 0xf2, 0xf1, 0x5d, - 0x40, 0xff, 0xf6, 0x04, 0xcc, 0x25, 0xf3, 0xc3, 0x0d, 0xd0, 0x93, 0x2f, 0xf4, 0xf4, 0xe4, 0x90, - 0x86, 0xed, 0xc2, 0xa8, 0x86, 0xed, 0xf1, 0x51, 0x0d, 0xdb, 0x13, 0xe7, 0x30, 0x6c, 0xf7, 0x9a, - 0xa5, 0x27, 0x07, 0x36, 0x4b, 0x7f, 0x4a, 0xbb, 0xa6, 0x4d, 0x25, 0x7c, 0x39, 0x62, 0xd7, 0x34, - 0x92, 0xec, 0x86, 0x75, 0xbf, 0x91, 0xe9, 0xe2, 0x37, 0xfd, 0x08, 0x03, 0x5e, 0x90, 0xe9, 0x49, - 0x36, 0xfc, 0xdd, 0xd9, 0x47, 0x86, 0xf0, 0x22, 0x7b, 0x05, 0x66, 0xe4, 0x78, 0xe2, 0x2a, 0x1f, - 0x24, 0xd5, 0xc5, 0x5a, 0x0c, 0x42, 0x13, 0x8f, 0x3f, 0x1d, 0x9c, 0x7c, 0x59, 0x99, 0xdf, 0x13, - 0x98, 0x4f, 0x07, 0xa7, 0x5e, 0x62, 0x4e, 0xe3, 0xdb, 0x5f, 0x80, 0x2b, 0x99, 0xc7, 0x76, 0x6e, - 0xc7, 0xe4, 0xda, 0x08, 0x6d, 0x48, 0x04, 0x43, 0x8c, 0x54, 0xca, 0xf1, 0x95, 0x7b, 0x7d, 0x31, - 0xf1, 0x0c, 0x2a, 0xf6, 0x6f, 0x15, 0x60, 0x2e, 0xf9, 0xee, 0x1c, 0x39, 0xd2, 0x46, 0xbe, 0x5c, - 0xec, 0x8b, 0x82, 0xac, 0x91, 0x73, 0xac, 0xaf, 0xc5, 0xfe, 0x88, 0x8f, 0xaf, 0x5d, 0x9d, 0x00, - 0xed, 0xe2, 0x18, 0x4b, 0x53, 0xb9, 0x64, 0xc7, 0x9f, 0x96, 0x8b, 0xc3, 0x93, 0xe4, 0xe9, 0x31, - 0x77, 0xee, 0x71, 0xc4, 0x90, 0x66, 0x85, 0x06, 0x5b, 0xb6, 0xb7, 0x1c, 0xd2, 0xc0, 0xdd, 0x73, - 0xf5, 0x9b, 0xb9, 0x7c, 0xe5, 0x7e, 0x47, 0x96, 0xa1, 0x86, 0xda, 0x1f, 0x8c, 0x41, 0xfc, 0x9e, - 0x38, 0x7f, 0x9c, 0x29, 0x34, 0x34, 0x75, 0xd9, 0x6d, 0xb7, 0x47, 0x7d, 0x01, 0x2d, 0xa6, 0x28, - 0xdd, 0x86, 0x8d, 0x12, 0x4c, 0x70, 0xfc, 0x21, 0xbc, 0x23, 0xee, 0xc0, 0x7c, 0x2a, 0x1c, 0x3e, - 0xf7, 0x10, 0x8f, 0x1f, 0x14, 0xa0, 0xa8, 0x13, 0x0a, 0x90, 0x9f, 0x4a, 0x98, 0x4d, 0x8a, 0x95, - 0x8f, 0x1a, 0x2f, 0x87, 0xec, 0xfb, 0x8d, 0x87, 0x27, 0xa5, 0x79, 0x8d, 0x9c, 0x32, 0x81, 0x5c, - 0x83, 0x42, 0x37, 0x68, 0xa5, 0xcf, 0x45, 0x77, 0x71, 0x0b, 0x59, 0x39, 0x79, 0x90, 0xb6, 0x5b, - 0x6c, 0xe7, 0x94, 0x04, 0x41, 0x1c, 0x20, 0xfa, 0xdb, 0x2b, 0xd8, 0x2e, 0xb9, 0xeb, 0x37, 0x8e, - 0xd3, 0x2f, 0x8d, 0x54, 0xfc, 0xc6, 0x31, 0x72, 0x08, 0x79, 0x1d, 0xe6, 0x22, 0xb7, 0x4d, 0xfd, - 0x6e, 0x64, 0xbe, 0xbf, 0x5c, 0x88, 0x6f, 0xa0, 0x77, 0x12, 0x50, 0x4c, 0x61, 0xb3, 0x5d, 0xf6, - 0x7e, 0xe8, 0x7b, 0x3c, 0x13, 0xe8, 0x64, 0xf2, 0xba, 0xea, 0x76, 0xed, 0xad, 0x3b, 0xdc, 0x7c, - 0xa3, 0x31, 0x18, 0xb6, 0xcb, 0x63, 0x5c, 0x03, 0x2a, 0x1d, 0x40, 0x16, 0x62, 0x7d, 0x5c, 0x94, - 0xa3, 0xc6, 0x20, 0x1b, 0x82, 0x36, 0x93, 0x96, 0xef, 0x28, 0xb3, 0x95, 0xe7, 0x15, 0x5d, 0x56, - 0xf6, 0xf0, 0xe4, 0x0c, 0xc3, 0x9a, 0xae, 0x69, 0xdf, 0x85, 0xf9, 0x54, 0x83, 0xa9, 0x73, 0xac, - 0x95, 0x7d, 0x8e, 0x1d, 0xec, 0x71, 0x90, 0x7f, 0x6d, 0xc1, 0x62, 0xcf, 0x12, 0x30, 0x68, 0x04, - 0x53, 0x7a, 0x33, 0x1a, 0x3b, 0xff, 0x66, 0x54, 0x18, 0x6e, 0x33, 0xaa, 0xec, 0x7e, 0xe7, 0xfb, - 0xd7, 0x9f, 0xf8, 0xee, 0xf7, 0xaf, 0x3f, 0xf1, 0xc7, 0xdf, 0xbf, 0xfe, 0xc4, 0x07, 0xa7, 0xd7, - 0xad, 0xef, 0x9c, 0x5e, 0xb7, 0xbe, 0x7b, 0x7a, 0xdd, 0xfa, 0xe3, 0xd3, 0xeb, 0xd6, 0x7f, 0x39, - 0xbd, 0x6e, 0x7d, 0xe3, 0x07, 0xd7, 0x9f, 0xf8, 0xcc, 0xa7, 0xe2, 0x01, 0xba, 0xa6, 0x06, 0x28, - 0xff, 0xf1, 0x31, 0x35, 0x1c, 0xd7, 0x3a, 0x07, 0xcd, 0x35, 0x36, 0x40, 0xd7, 0x74, 0x89, 0x1a, - 0xa0, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x76, 0xad, 0x47, 0xe7, 0x99, 0x00, 0x00, + // 8026 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, + 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, + 0x9c, 0xfa, 0x8c, 0xcb, 0xd9, 0x3e, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, + 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xb6, 0x86, 0x7b, 0x2b, 0x4b, 0x3a, 0x5b, 0xcd, 0x99, 0xc7, 0x61, + 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, + 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x65, 0x24, 0xc8, 0x1f, + 0x03, 0x31, 0xe2, 0x2f, 0xfd, 0x71, 0x20, 0xff, 0x48, 0x64, 0x07, 0x30, 0x1d, 0x51, 0xf9, 0x93, + 0x20, 0x81, 0x11, 0xc0, 0x41, 0xe0, 0xfd, 0x11, 0x04, 0xef, 0xb3, 0x5f, 0xf7, 0xf4, 0x70, 0x67, + 0x38, 0xcd, 0xd5, 0x25, 0xd6, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, 0x55, + 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, 0xdf, + 0x0d, 0xfc, 0x7b, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, 0x6f, + 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x70, 0xda, 0xdd, 0x3d, 0xe7, 0x13, 0xab, + 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x1d, 0x53, 0x5b, + 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x51, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, 0x97, + 0x28, 0x6a, 0xcb, 0x1f, 0x33, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, 0xf2, + 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x6a, 0xb8, 0xe2, 0xfa, 0x4c, 0xb6, + 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, 0xa0, + 0x59, 0x38, 0x2f, 0xc7, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, 0x43, + 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, 0x37, + 0x1f, 0x55, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xa5, 0x41, 0xf5, 0x7a, 0x91, 0xdb, + 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0xf7, 0x0a, 0x50, 0xaa, 0x6c, 0x56, 0xeb, + 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x55, 0x0b, 0xe6, 0xda, 0xbe, 0xd3, 0xac, 0x3a, 0x6d, 0xc7, 0x6b, + 0xd0, 0x60, 0xc9, 0x7a, 0xc6, 0x7a, 0x7e, 0xf6, 0xc5, 0xcd, 0x95, 0x71, 0xfa, 0x6b, 0xa5, 0x72, + 0x3f, 0x44, 0x1a, 0xfa, 0xbd, 0xa0, 0x41, 0x91, 0xee, 0x56, 0x2f, 0x7e, 0xe7, 0xa8, 0xfc, 0xc4, + 0xf1, 0x51, 0x79, 0x6e, 0xd3, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0x5b, 0x16, 0x9c, 0x6f, 0x38, 0x9e, + 0x13, 0x1c, 0x6e, 0x3b, 0x41, 0x8b, 0x46, 0x6f, 0x04, 0x7e, 0xaf, 0xbb, 0x34, 0x71, 0x06, 0xd2, + 0x3c, 0x29, 0xa5, 0x39, 0xbf, 0x96, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, 0xd9, 0x69, + 0x53, 0x53, 0xae, 0xc2, 0x59, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xec, 0x0f, 0x0a, 0x70, + 0xbe, 0xb2, 0x59, 0xdd, 0x0e, 0x9c, 0xdd, 0x5d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x16, 0xf9, + 0x71, 0x98, 0x76, 0xbd, 0x56, 0x40, 0xc3, 0x90, 0x77, 0x64, 0xa9, 0xba, 0x20, 0x89, 0x4e, 0x6f, + 0x88, 0x62, 0x54, 0x70, 0xf2, 0x0a, 0xcc, 0x86, 0x34, 0x38, 0x70, 0x1b, 0xb4, 0xe6, 0x07, 0x11, + 0x6f, 0xe9, 0x62, 0xf5, 0x82, 0x44, 0x9f, 0xad, 0xc7, 0x20, 0x34, 0xf1, 0x58, 0xb5, 0xc0, 0xf7, + 0x23, 0x09, 0xe7, 0x0d, 0x51, 0x8a, 0xab, 0x61, 0x0c, 0x42, 0x13, 0x8f, 0x7c, 0xd3, 0x82, 0xc5, + 0x30, 0x72, 0x1b, 0xfb, 0xae, 0x47, 0xc3, 0x70, 0xcd, 0xf7, 0x76, 0xdd, 0xd6, 0x52, 0x91, 0xb7, + 0xe2, 0xad, 0xf1, 0x5a, 0xb1, 0x9e, 0xa2, 0x5a, 0xbd, 0x78, 0x7c, 0x54, 0x5e, 0x4c, 0x97, 0x62, + 0x1f, 0x77, 0xb2, 0x0e, 0x8b, 0x8e, 0xe7, 0xf9, 0x91, 0x13, 0xb9, 0xbe, 0x57, 0x0b, 0xe8, 0xae, + 0xfb, 0x60, 0x69, 0x92, 0x7f, 0xce, 0x92, 0xfc, 0x9c, 0xc5, 0x4a, 0x0a, 0x8e, 0x7d, 0x35, 0xec, + 0x75, 0x58, 0xaa, 0x74, 0x76, 0x9c, 0x30, 0x74, 0x9a, 0x7e, 0x90, 0xea, 0x8d, 0xe7, 0x61, 0xa6, + 0xe3, 0x74, 0xbb, 0xae, 0xd7, 0x62, 0xdd, 0x51, 0x78, 0xbe, 0x54, 0x9d, 0x3b, 0x3e, 0x2a, 0xcf, + 0x6c, 0xc9, 0x32, 0xd4, 0x50, 0xfb, 0x4f, 0x27, 0x60, 0xb6, 0xe2, 0x39, 0xed, 0xc3, 0xd0, 0x0d, + 0xb1, 0xe7, 0x91, 0x2f, 0xc0, 0x0c, 0x5b, 0x5d, 0x9a, 0x4e, 0xe4, 0xc8, 0x19, 0xf9, 0xf1, 0x15, + 0x31, 0xd9, 0x57, 0xcc, 0xc9, 0x1e, 0xb7, 0x0b, 0xc3, 0x5e, 0x39, 0xf8, 0xc4, 0xca, 0x5b, 0x3b, + 0xf7, 0x68, 0x23, 0xda, 0xa2, 0x91, 0x53, 0x25, 0xf2, 0x2b, 0x20, 0x2e, 0x43, 0x4d, 0x95, 0xf8, + 0x30, 0x19, 0x76, 0x69, 0x43, 0xce, 0xb0, 0xad, 0x31, 0x47, 0x72, 0x2c, 0x7a, 0xbd, 0x4b, 0x1b, + 0xd5, 0x39, 0xc9, 0x7a, 0x92, 0xfd, 0x43, 0xce, 0x88, 0xdc, 0x87, 0xa9, 0x90, 0xaf, 0x39, 0x72, + 0xf2, 0xbc, 0x95, 0x1f, 0x4b, 0x4e, 0xb6, 0x3a, 0x2f, 0x99, 0x4e, 0x89, 0xff, 0x28, 0xd9, 0xd9, + 0xff, 0xc9, 0x82, 0x0b, 0x06, 0x76, 0x25, 0x68, 0xf5, 0x3a, 0xd4, 0x8b, 0xc8, 0x33, 0x30, 0xe9, + 0x39, 0x1d, 0x2a, 0x27, 0x8a, 0x16, 0xf9, 0x96, 0xd3, 0xa1, 0xc8, 0x21, 0xe4, 0x59, 0x28, 0x1e, + 0x38, 0xed, 0x1e, 0xe5, 0x8d, 0x54, 0xaa, 0x9e, 0x93, 0x28, 0xc5, 0xb7, 0x59, 0x21, 0x0a, 0x18, + 0x79, 0x0f, 0x4a, 0xfc, 0xc7, 0xf5, 0xc0, 0xef, 0xe4, 0xf4, 0x69, 0x52, 0xc2, 0xb7, 0x15, 0xd9, + 0xea, 0xb9, 0xe3, 0xa3, 0x72, 0x49, 0xff, 0xc5, 0x98, 0xa1, 0xfd, 0xe7, 0x16, 0x2c, 0x18, 0x1f, + 0xb7, 0xe9, 0x86, 0x11, 0xf9, 0x7c, 0xdf, 0xe0, 0x59, 0x19, 0x6e, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, + 0x2c, 0xca, 0x2f, 0x9d, 0x51, 0x25, 0xc6, 0xc0, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4d, + 0x3c, 0x53, 0x78, 0x7e, 0xf6, 0xc5, 0x8d, 0xdc, 0xba, 0x31, 0x6e, 0xdf, 0x0d, 0x46, 0x1f, 0x05, + 0x1b, 0xfb, 0x5f, 0x15, 0x12, 0xdd, 0xb7, 0xa5, 0xe4, 0xf8, 0xc0, 0x82, 0xa9, 0xb6, 0xb3, 0x43, + 0xdb, 0x62, 0x6e, 0xcd, 0xbe, 0xf8, 0x4e, 0x6e, 0x92, 0x28, 0x1e, 0x2b, 0x9b, 0x9c, 0xfe, 0x35, + 0x2f, 0x0a, 0x0e, 0xe3, 0xe1, 0x25, 0x0a, 0x51, 0x32, 0x27, 0xff, 0xd8, 0x82, 0xd9, 0x78, 0x55, + 0x50, 0xcd, 0xb2, 0x93, 0xbf, 0x30, 0xf1, 0x62, 0x24, 0x25, 0xd2, 0xab, 0xae, 0x01, 0x41, 0x53, + 0x96, 0xe5, 0x4f, 0xc2, 0xac, 0xf1, 0x09, 0x64, 0x11, 0x0a, 0xfb, 0xf4, 0x50, 0x0c, 0x78, 0x64, + 0x3f, 0xc9, 0xc5, 0xc4, 0x08, 0x97, 0x43, 0xfa, 0x53, 0x13, 0xaf, 0x5a, 0xcb, 0xaf, 0xc3, 0x62, + 0x9a, 0xe1, 0x28, 0xf5, 0xed, 0xdf, 0x9a, 0x4c, 0x0c, 0x4c, 0xb6, 0x10, 0x10, 0x1f, 0xa6, 0x3b, + 0x34, 0x0a, 0xdc, 0x86, 0xea, 0xb2, 0xf5, 0xf1, 0x5a, 0x69, 0x8b, 0x13, 0x8b, 0xf7, 0x38, 0xf1, + 0x3f, 0x44, 0xc5, 0x85, 0xec, 0xc1, 0xa4, 0x13, 0xb4, 0x54, 0x9f, 0x5c, 0xcf, 0x67, 0x5a, 0xc6, + 0x4b, 0x45, 0x25, 0x68, 0x85, 0xc8, 0x39, 0x90, 0x55, 0x28, 0x45, 0x34, 0xe8, 0xb8, 0x9e, 0x13, + 0x89, 0x4d, 0x71, 0xa6, 0x7a, 0x5e, 0xa2, 0x95, 0xb6, 0x15, 0x00, 0x63, 0x1c, 0xd2, 0x86, 0xa9, + 0x66, 0x70, 0x88, 0x3d, 0x6f, 0x69, 0x32, 0x8f, 0xa6, 0x58, 0xe7, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, + 0xa3, 0xe4, 0x41, 0x7e, 0xd5, 0x82, 0x8b, 0x1d, 0xea, 0x84, 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, + 0x51, 0x8f, 0x75, 0xec, 0x52, 0x91, 0x33, 0xc7, 0x71, 0xfb, 0xa1, 0x9f, 0x72, 0xf5, 0x69, 0x29, + 0xca, 0xc5, 0x2c, 0x28, 0x66, 0x4a, 0x63, 0xff, 0xe9, 0x24, 0x9c, 0xef, 0x5b, 0xd8, 0xc9, 0xcb, + 0x50, 0xec, 0xee, 0x39, 0xa1, 0x5a, 0xa9, 0xaf, 0xaa, 0x65, 0xa2, 0xc6, 0x0a, 0x1f, 0x1e, 0x95, + 0xcf, 0xa9, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0x53, 0x85, 0x3a, 0x34, 0x0c, 0x9d, 0x96, 0x5a, 0xbe, + 0x8d, 0x61, 0xc2, 0x8b, 0x51, 0xc1, 0xc9, 0xdf, 0xb3, 0xe0, 0x9c, 0x18, 0x32, 0x48, 0xc3, 0x5e, + 0x3b, 0x62, 0x5b, 0x14, 0x6b, 0x96, 0x9b, 0x79, 0x0c, 0x4f, 0x41, 0xb2, 0x7a, 0x49, 0x72, 0x3f, + 0x67, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x42, 0x29, 0x8c, 0x9c, 0x20, 0xa2, 0xcd, 0x4a, 0xc4, + 0x95, 0x91, 0xd9, 0x17, 0x7f, 0x62, 0xb8, 0xb5, 0x7b, 0xdb, 0xed, 0x50, 0xb1, 0x4f, 0xd4, 0x15, + 0x01, 0x8c, 0x69, 0x91, 0xf7, 0x00, 0x82, 0x9e, 0x57, 0xef, 0x75, 0x3a, 0x4e, 0x70, 0x28, 0x15, + 0xaf, 0x1b, 0xe3, 0x7d, 0x1e, 0x6a, 0x7a, 0xb1, 0xaa, 0x11, 0x97, 0xa1, 0xc1, 0x8f, 0x7c, 0xd9, + 0x82, 0x73, 0x62, 0x24, 0x2a, 0x09, 0xa6, 0x72, 0x96, 0xe0, 0x3c, 0x6b, 0xda, 0x75, 0x93, 0x05, + 0x26, 0x39, 0xda, 0xff, 0x21, 0xa9, 0x06, 0xd4, 0x23, 0x76, 0x28, 0x6a, 0x1d, 0x92, 0xcf, 0xc1, + 0x93, 0x61, 0xaf, 0xd1, 0xa0, 0x61, 0xb8, 0xdb, 0x6b, 0x63, 0xcf, 0xbb, 0xe1, 0x86, 0x91, 0x1f, + 0x1c, 0x6e, 0xba, 0x1d, 0x37, 0xe2, 0x23, 0xae, 0x58, 0xbd, 0x72, 0x7c, 0x54, 0x7e, 0xb2, 0x3e, + 0x08, 0x09, 0x07, 0xd7, 0x27, 0x0e, 0x3c, 0xd5, 0xf3, 0x06, 0x93, 0x17, 0x4a, 0x77, 0xf9, 0xf8, + 0xa8, 0xfc, 0xd4, 0x9d, 0xc1, 0x68, 0x78, 0x12, 0x0d, 0xfb, 0xbf, 0x59, 0x6c, 0xa5, 0x16, 0xdf, + 0xb5, 0x4d, 0x3b, 0xdd, 0x36, 0x5b, 0x5d, 0xce, 0x5e, 0x7f, 0x8c, 0x12, 0xfa, 0x23, 0xe6, 0xb3, + 0xdd, 0x29, 0xf9, 0x07, 0x29, 0x91, 0xf6, 0x7f, 0xb5, 0xe0, 0x62, 0x1a, 0xf9, 0x31, 0xe8, 0x3c, + 0x61, 0x52, 0xe7, 0xb9, 0x95, 0xef, 0xd7, 0x0e, 0x50, 0x7c, 0xbe, 0x3a, 0xd9, 0xff, 0xad, 0xff, + 0xbf, 0x6f, 0xa3, 0xf1, 0xae, 0x58, 0xf8, 0x61, 0xee, 0x8a, 0x93, 0x1f, 0xaa, 0x5d, 0xf1, 0xd7, + 0x27, 0x61, 0xae, 0xe2, 0x45, 0x6e, 0x65, 0x77, 0xd7, 0xf5, 0xdc, 0xe8, 0x90, 0x7c, 0x7d, 0x02, + 0x56, 0xbb, 0x01, 0xdd, 0xa5, 0x41, 0x40, 0x9b, 0xeb, 0xbd, 0xc0, 0xf5, 0x5a, 0xf5, 0xc6, 0x1e, + 0x6d, 0xf6, 0xda, 0xae, 0xd7, 0xda, 0x68, 0x79, 0xbe, 0x2e, 0xbe, 0xf6, 0x80, 0x36, 0x7a, 0xfc, + 0x93, 0xc4, 0xa4, 0xe8, 0x8c, 0xf7, 0x49, 0xb5, 0xd1, 0x98, 0x56, 0x5f, 0x3a, 0x3e, 0x2a, 0xaf, + 0x8e, 0x58, 0x09, 0x47, 0xfd, 0x34, 0xf2, 0xb5, 0x09, 0x58, 0x09, 0xe8, 0xcf, 0xf6, 0xdc, 0xe1, + 0x5b, 0x43, 0xac, 0x5a, 0xed, 0x31, 0xb7, 0x9f, 0x91, 0x78, 0x56, 0x5f, 0x3c, 0x3e, 0x2a, 0x8f, + 0x58, 0x07, 0x47, 0xfc, 0x2e, 0xbb, 0x06, 0xb3, 0x95, 0xae, 0x1b, 0xba, 0x0f, 0xd0, 0xef, 0x45, + 0x74, 0x88, 0x23, 0x6e, 0x19, 0x8a, 0x41, 0xaf, 0x4d, 0xc5, 0xdc, 0x2e, 0x55, 0x4b, 0x6c, 0x15, + 0x42, 0x56, 0x80, 0xa2, 0xdc, 0xfe, 0x79, 0xb6, 0xe2, 0x72, 0x92, 0x29, 0xe3, 0xc6, 0x3d, 0x28, + 0x06, 0x8c, 0x89, 0x1c, 0x59, 0xe3, 0x9e, 0x03, 0x63, 0xa9, 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, + 0xf6, 0xef, 0x4e, 0xc0, 0xa5, 0x4a, 0xb7, 0xbb, 0x45, 0xc3, 0xbd, 0x94, 0x14, 0xbf, 0x68, 0xc1, + 0xfc, 0x81, 0x1b, 0x44, 0x3d, 0xa7, 0xad, 0x4c, 0x52, 0x42, 0x9e, 0xfa, 0xb8, 0xf2, 0x70, 0x6e, + 0x6f, 0x27, 0x48, 0x57, 0xc9, 0xf1, 0x51, 0x79, 0x3e, 0x59, 0x86, 0x29, 0xf6, 0xe4, 0x1f, 0x59, + 0xb0, 0x28, 0x8b, 0x6e, 0xf9, 0x4d, 0x6a, 0xda, 0x31, 0xef, 0xe4, 0x29, 0x93, 0x26, 0x2e, 0x0c, + 0x5e, 0xe9, 0x52, 0xec, 0x13, 0xc2, 0xfe, 0x1f, 0x13, 0x70, 0x79, 0x00, 0x0d, 0xf2, 0x6b, 0x16, + 0x5c, 0x14, 0xc6, 0x4f, 0x03, 0x84, 0x74, 0x57, 0xb6, 0xe6, 0x4f, 0xe5, 0x2d, 0x39, 0xb2, 0x29, + 0x4e, 0xbd, 0x06, 0xad, 0x2e, 0xb1, 0xd5, 0x70, 0x2d, 0x83, 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, + 0xe6, 0xd0, 0x94, 0xa4, 0x13, 0x8f, 0x45, 0xd2, 0x7a, 0x06, 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0x3b, + 0xf0, 0xd4, 0x09, 0xe4, 0x1e, 0x3d, 0x39, 0xed, 0x77, 0xf4, 0xa8, 0x4f, 0x8e, 0xb9, 0x21, 0xe6, + 0xb5, 0x0d, 0x53, 0x7c, 0xea, 0xa8, 0x89, 0x0d, 0x6c, 0xfb, 0xe3, 0x73, 0x2a, 0x44, 0x09, 0xb1, + 0x7f, 0xd7, 0x82, 0x99, 0x11, 0xac, 0x61, 0xe5, 0xa4, 0x35, 0xac, 0xd4, 0x67, 0x09, 0x8b, 0xfa, + 0x2d, 0x61, 0x6f, 0x8c, 0xd7, 0x1b, 0xc3, 0x58, 0xc0, 0xfe, 0xc2, 0x82, 0xf3, 0x7d, 0x16, 0x33, + 0xb2, 0x07, 0x17, 0xbb, 0x7e, 0x53, 0xa9, 0x4d, 0x37, 0x9c, 0x70, 0x8f, 0xc3, 0xe4, 0xe7, 0xbd, + 0xcc, 0x7a, 0xb2, 0x96, 0x01, 0x7f, 0x78, 0x54, 0x5e, 0xd2, 0x44, 0x52, 0x08, 0x98, 0x49, 0x91, + 0x74, 0x61, 0x66, 0xd7, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0xc7, 0x54, 0x90, 0xae, 0x4b, 0x6a, 0xc2, + 0x58, 0xac, 0xfe, 0xa1, 0xe6, 0x62, 0x7f, 0x09, 0xe6, 0x93, 0x57, 0x07, 0x43, 0x74, 0xde, 0x15, + 0x28, 0x38, 0x81, 0x27, 0xbb, 0x6e, 0x56, 0x22, 0x14, 0x2a, 0x78, 0x0b, 0x59, 0x39, 0x79, 0x01, + 0x66, 0x76, 0x7b, 0xed, 0x36, 0xab, 0x20, 0x4d, 0xfa, 0x5a, 0x1d, 0xbe, 0x2e, 0xcb, 0x51, 0x63, + 0xd8, 0x7f, 0x35, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x11, 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, + 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xeb, 0xb4, 0x4d, 0x1b, 0x91, 0x1f, 0x48, 0x69, 0x2e, 0x4b, + 0x42, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x75, 0x98, 0x77, 0x1a, 0x91, 0x7b, 0x40, 0x35, + 0x05, 0x21, 0xee, 0x47, 0x24, 0x85, 0xf9, 0x4a, 0x02, 0x8a, 0x29, 0x6c, 0xf2, 0x79, 0x58, 0x0a, + 0x1b, 0x4e, 0x9b, 0xde, 0xe9, 0x4a, 0x56, 0x6b, 0x7b, 0xb4, 0xb1, 0x5f, 0xf3, 0x5d, 0x2f, 0x92, + 0x26, 0x99, 0x67, 0x24, 0xa5, 0xa5, 0xfa, 0x00, 0x3c, 0x1c, 0x48, 0x81, 0xfc, 0x5b, 0x0b, 0xae, + 0x74, 0x03, 0x5a, 0x0b, 0xfc, 0x8e, 0xcf, 0xf6, 0xda, 0x3e, 0x3b, 0x85, 0x3c, 0xaf, 0xbf, 0x3d, + 0xa6, 0x52, 0x21, 0x4a, 0xfa, 0xcd, 0xdb, 0x1f, 0x3d, 0x3e, 0x2a, 0x5f, 0xa9, 0x9d, 0x24, 0x00, + 0x9e, 0x2c, 0x1f, 0xf9, 0x77, 0x16, 0x5c, 0xed, 0xfa, 0x61, 0x74, 0xc2, 0x27, 0x14, 0xcf, 0xf4, + 0x13, 0xec, 0xe3, 0xa3, 0xf2, 0xd5, 0xda, 0x89, 0x12, 0xe0, 0x23, 0x24, 0xb4, 0x8f, 0x67, 0xe1, + 0xbc, 0x31, 0xf6, 0xe4, 0x21, 0xfe, 0x35, 0x38, 0xa7, 0x06, 0x43, 0xac, 0x04, 0x94, 0x62, 0xa3, + 0x4b, 0xc5, 0x04, 0x62, 0x12, 0x97, 0x8d, 0x3b, 0x3d, 0x14, 0x45, 0xed, 0xd4, 0xb8, 0xab, 0x25, + 0xa0, 0x98, 0xc2, 0x26, 0x1b, 0x70, 0x41, 0x96, 0x20, 0xed, 0xb6, 0xdd, 0x86, 0xb3, 0xe6, 0xf7, + 0xe4, 0x90, 0x2b, 0x56, 0x2f, 0x1f, 0x1f, 0x95, 0x2f, 0xd4, 0xfa, 0xc1, 0x98, 0x55, 0x87, 0x6c, + 0xc2, 0x45, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, 0x79, 0x6c, 0x5f, 0x69, 0xf2, 0xa1, 0x35, 0x23, + 0x36, 0xa0, 0x4a, 0x06, 0x1c, 0x33, 0x6b, 0x91, 0x5a, 0x8a, 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, + 0x7a, 0xb9, 0x18, 0x1f, 0x45, 0x2a, 0x19, 0x38, 0x98, 0x59, 0x93, 0xb4, 0x61, 0xbe, 0xe3, 0x3c, + 0xb8, 0xe3, 0x39, 0x07, 0x8e, 0xdb, 0x66, 0x4c, 0xa4, 0x21, 0x67, 0xb0, 0x75, 0xa1, 0x17, 0xb9, + 0xed, 0x15, 0x71, 0x15, 0xbd, 0xb2, 0xe1, 0x45, 0x6f, 0x05, 0xf5, 0x88, 0xa9, 0xac, 0x42, 0x95, + 0xda, 0x4a, 0xd0, 0xc2, 0x14, 0x6d, 0xf2, 0x16, 0x5c, 0xe2, 0xd3, 0x71, 0xdd, 0xbf, 0xef, 0xad, + 0xd3, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x93, 0xc7, 0x47, 0xe5, 0x4b, 0xf5, 0x2c, + 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x2a, 0x09, 0x40, 0x7a, 0xe0, 0x86, 0xae, 0xef, 0x09, 0x73, + 0xcc, 0x4c, 0x6c, 0x8e, 0xa9, 0x0f, 0x46, 0xc3, 0x93, 0x68, 0x90, 0x7f, 0x62, 0xc1, 0xc5, 0xac, + 0x69, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0x35, 0xb5, 0xc4, 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, + 0x20, 0xef, 0x5b, 0x30, 0xe7, 0x18, 0x47, 0xc9, 0x25, 0xe0, 0x52, 0xdd, 0x1c, 0xd7, 0xa0, 0x11, + 0x53, 0xac, 0x2e, 0x1e, 0x1f, 0x95, 0x13, 0xc7, 0x55, 0x4c, 0x70, 0x24, 0xff, 0xcc, 0x82, 0x4b, + 0x99, 0x73, 0x7c, 0x69, 0xf6, 0x2c, 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, + 0x4d, 0x4b, 0x6f, 0x65, 0xea, 0xee, 0x65, 0x69, 0x8e, 0x8b, 0x76, 0x7b, 0xcc, 0xd3, 0x73, 0xac, + 0x3e, 0x28, 0xc2, 0xd5, 0x0b, 0xc6, 0xce, 0xa8, 0x0a, 0x31, 0xcd, 0x9e, 0x7c, 0xc3, 0x52, 0x5b, + 0xa3, 0x96, 0xe8, 0xdc, 0x59, 0x49, 0x44, 0xe2, 0x9d, 0x56, 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x1a, + 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, 0x9f, 0x46, 0x57, 0x8f, 0x8f, 0xca, + 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0x37, 0x8b, 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, + 0xfa, 0x6d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, + 0x3a, 0xd3, 0x8d, 0xeb, 0x99, 0xe3, 0xa3, 0xf2, 0xd3, 0x6b, 0x27, 0xf0, 0xc7, 0x13, 0xa5, 0x23, + 0xff, 0xde, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xc6, 0x7e, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, + 0x26, 0xce, 0xf4, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, 0xdb, 0x6b, 0x8f, 0x94, 0x02, 0x87, 0x90, 0x94, + 0xbc, 0x01, 0xe7, 0x25, 0xd6, 0xb5, 0x07, 0x5d, 0x1a, 0xb8, 0x4c, 0xf9, 0x96, 0x8a, 0x63, 0xec, + 0x5e, 0x93, 0x46, 0xc0, 0xfe, 0x3a, 0x24, 0x84, 0xe9, 0xfb, 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, + 0x1a, 0xd3, 0xa7, 0x46, 0x9a, 0x07, 0xee, 0x0a, 0x9a, 0xd5, 0xd9, 0xe3, 0xa3, 0xf2, 0xb4, 0xfc, + 0x83, 0x8a, 0x13, 0xb9, 0x05, 0xf3, 0xe2, 0xc0, 0x56, 0x73, 0xbd, 0x56, 0xcd, 0xf7, 0x84, 0x27, + 0x4a, 0xa9, 0xfa, 0x9c, 0xda, 0xf0, 0xeb, 0x09, 0xe8, 0xc3, 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, + 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xc1, 0x14, 0x80, 0x1a, 0xae, 0xb4, 0x4b, 0x7e, 0x12, 0x4a, + 0x21, 0x8d, 0x04, 0x57, 0x79, 0x83, 0x20, 0x2e, 0x66, 0x54, 0x21, 0xc6, 0x70, 0xb2, 0x0f, 0xc5, + 0xae, 0xd3, 0x0b, 0xa9, 0xec, 0xfc, 0x9b, 0xb9, 0x74, 0x7e, 0x8d, 0x51, 0x14, 0x27, 0x34, 0xfe, + 0x13, 0x05, 0x0f, 0xf2, 0x15, 0x0b, 0x80, 0x26, 0x3b, 0x6c, 0x6c, 0x4b, 0x89, 0x64, 0x19, 0xf7, + 0x29, 0x6b, 0x83, 0xea, 0xfc, 0xf1, 0x51, 0x19, 0x8c, 0xae, 0x37, 0xd8, 0x92, 0xfb, 0x30, 0xe3, + 0xa8, 0x35, 0x7f, 0xf2, 0x2c, 0xd6, 0x7c, 0x7e, 0x70, 0xd2, 0x83, 0x56, 0x33, 0x23, 0x5f, 0xb3, + 0x60, 0x3e, 0xa4, 0x91, 0xec, 0x2a, 0xb6, 0xf2, 0x48, 0x85, 0x77, 0xcc, 0x41, 0x57, 0x4f, 0xd0, + 0x14, 0x2b, 0x68, 0xb2, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0x37, 0xa8, 0xd3, 0xa4, 0x01, 0x3f, 0x97, + 0x4b, 0x4d, 0x6a, 0x7c, 0x51, 0x0c, 0x9a, 0x5a, 0x14, 0xa3, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0x5b, + 0x6e, 0x10, 0xf8, 0x52, 0x94, 0x99, 0x9c, 0x44, 0x31, 0x68, 0x6a, 0x51, 0x8c, 0x32, 0x4c, 0xf1, + 0xb5, 0xbf, 0x7d, 0x0e, 0xe6, 0xd5, 0x44, 0x8a, 0x35, 0x7b, 0x61, 0x06, 0x1a, 0xa0, 0xd9, 0xaf, + 0x99, 0x40, 0x4c, 0xe2, 0xb2, 0xca, 0x62, 0xaa, 0x26, 0x15, 0x7b, 0x5d, 0xb9, 0x6e, 0x02, 0x31, + 0x89, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x97, 0xc1, 0x63, 0xde, 0x55, 0xc6, 0xeb, 0x43, + 0x7c, 0xdd, 0xc3, 0xfe, 0x85, 0x28, 0xb8, 0x70, 0x4b, 0x66, 0x94, 0x30, 0x6e, 0xca, 0xc9, 0x91, + 0xcf, 0xfc, 0x4c, 0xda, 0x4d, 0x45, 0x6f, 0x24, 0xcb, 0x30, 0xc5, 0x3e, 0x43, 0xd9, 0x2f, 0x9e, + 0xa1, 0xb2, 0xff, 0x59, 0x98, 0xe9, 0x38, 0x0f, 0xea, 0xbd, 0xa0, 0x75, 0xfa, 0x43, 0x85, 0x74, + 0xaf, 0x13, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb6, 0x8c, 0x25, 0x67, 0x9a, 0x13, 0xbf, 0x9b, 0xef, + 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, 0xf3, 0xd8, 0x55, 0x6f, 0xa6, 0x46, + 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0x99, 0xaa, 0x91, 0x6b, 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, + 0x11, 0x73, 0x4e, 0xcb, 0x03, 0x67, 0x2a, 0x4f, 0x3d, 0xc1, 0x0c, 0x53, 0xcc, 0x07, 0x9f, 0x37, + 0x67, 0xcf, 0xe6, 0xbc, 0x39, 0x97, 0xc3, 0x79, 0xf3, 0x64, 0x55, 0xfc, 0xdc, 0xb8, 0xaa, 0x38, + 0xb9, 0x09, 0xa4, 0x79, 0xe8, 0x39, 0x1d, 0xb7, 0x21, 0x17, 0x4b, 0xbe, 0x6d, 0xce, 0x73, 0x7b, + 0xc4, 0xb2, 0x5c, 0xc8, 0xc8, 0x7a, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x11, 0xcc, 0x74, 0x95, 0xc6, + 0xb5, 0x90, 0xc7, 0xe8, 0x57, 0x1a, 0x98, 0xf0, 0x17, 0x60, 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, + 0x36, 0xe1, 0x62, 0xc7, 0xf5, 0x6a, 0x7e, 0x33, 0xac, 0xd1, 0x40, 0x5a, 0x5b, 0xea, 0x34, 0x5a, + 0x5a, 0xe4, 0x6d, 0xc3, 0x4f, 0xd0, 0x5b, 0x19, 0x70, 0xcc, 0xac, 0x65, 0xff, 0x2f, 0x0b, 0x16, + 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xd7, 0x89, 0x1a, 0x7b, 0xe2, 0xaa, 0x9c, 0xbc, 0x0e, 0x33, 0xae, + 0x17, 0xd1, 0xe0, 0xc0, 0x69, 0xcb, 0xfd, 0xc9, 0x56, 0xe6, 0xd3, 0x0d, 0x59, 0xfe, 0xf0, 0xa8, + 0x3c, 0xbf, 0xde, 0x0b, 0xb8, 0x3b, 0x9d, 0x58, 0xad, 0x50, 0xd7, 0x21, 0xdf, 0xb6, 0xe0, 0xbc, + 0xb8, 0x6c, 0x5f, 0x77, 0x22, 0xe7, 0x76, 0x8f, 0x06, 0x2e, 0x55, 0xd7, 0xed, 0x63, 0x2e, 0x54, + 0x69, 0x59, 0x15, 0x83, 0xc3, 0x58, 0x51, 0xdf, 0x4a, 0x73, 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2a, + 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, 0xd3, 0x41, 0xd2, 0x9d, 0xd8, 0x68, + 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, + 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x0c, 0x45, 0xee, 0x5a, 0x29, 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, + 0x8c, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, 0x1a, 0x91, 0xbb, 0x24, 0xe6, 0xdb, + 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, 0x0d, 0x53, 0x4c, 0xa1, 0xf5, 0x9b, + 0xa7, 0xde, 0x14, 0xf9, 0x95, 0x4c, 0x8d, 0xd3, 0x40, 0x49, 0x8b, 0xb5, 0x55, 0x40, 0xa3, 0x5e, + 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x8c, 0x90, 0x02, 0x75, 0x29, 0x1a, 0x18, 0xf6, 0xbf, 0x99, + 0x80, 0x8b, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x4a, 0x48, 0x2b, 0x8f, 0xc6, 0x9f, 0xc9, 0xbf, 0x7d, + 0xa4, 0xdf, 0x88, 0xf6, 0xae, 0x90, 0x9e, 0x6d, 0x92, 0x2f, 0xf9, 0x8c, 0x6e, 0xa1, 0x89, 0x53, + 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0x67, 0x60, 0x32, 0x64, 0x3d, 0x5f, 0x48, 0x5e, 0x77, 0xf0, + 0x3e, 0xe2, 0x10, 0x86, 0xd1, 0xf3, 0xdc, 0x48, 0xfa, 0xf3, 0x6b, 0x8c, 0x3b, 0x9e, 0x1b, 0x21, + 0x87, 0xd8, 0xdf, 0x9a, 0x80, 0xe5, 0xc1, 0x1f, 0x45, 0xbe, 0x65, 0x01, 0x34, 0xd9, 0x71, 0x25, + 0xe4, 0x4e, 0xbd, 0xc2, 0xcf, 0xc6, 0x39, 0xab, 0x36, 0x5c, 0x57, 0x9c, 0x62, 0xa7, 0x2b, 0x5d, + 0x14, 0xa2, 0x21, 0x08, 0x79, 0x51, 0x0d, 0x7d, 0x7e, 0x55, 0x23, 0x26, 0x93, 0xae, 0xb3, 0xa5, + 0x21, 0x68, 0x60, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, 0xc0, 0x06, 0x3f, 0x8f, + 0xde, 0x52, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3b, 0x84, 0x9c, 0x39, 0x39, 0xcf, 0xdb, 0xff, + 0xd3, 0x82, 0xcb, 0x6b, 0xed, 0x5e, 0x18, 0xd1, 0xe0, 0xaf, 0x8d, 0x0f, 0xdb, 0xff, 0xb6, 0xe0, + 0xa9, 0x01, 0xdf, 0xfc, 0x18, 0x5c, 0xd9, 0xde, 0x4d, 0xba, 0xb2, 0xdd, 0x19, 0x77, 0x48, 0x67, + 0x7e, 0xc7, 0x00, 0x8f, 0xb6, 0x5f, 0xb7, 0xe0, 0x1c, 0x5b, 0xb6, 0x9a, 0x7e, 0x2b, 0xa7, 0x8d, + 0xf3, 0x59, 0x28, 0xfe, 0x2c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0x6c, 0xce, + 0x38, 0x5d, 0xf7, 0x6d, 0x1a, 0xf0, 0x0d, 0xa8, 0x90, 0x9c, 0x33, 0x15, 0x0d, 0x41, 0x03, 0xcb, + 0xfe, 0x34, 0x48, 0x67, 0xb1, 0xd4, 0x8c, 0xb3, 0x86, 0x99, 0x71, 0xf6, 0x7f, 0x9c, 0x00, 0xc3, + 0xf8, 0xf1, 0x18, 0x46, 0xb2, 0x97, 0x18, 0xc9, 0x63, 0x1e, 0xdc, 0x0d, 0x53, 0xce, 0xa0, 0x60, + 0x9e, 0x83, 0x54, 0x30, 0xcf, 0xad, 0xdc, 0x38, 0x9e, 0x1c, 0xcb, 0xf3, 0x3d, 0x0b, 0x9e, 0x8a, + 0x91, 0xfb, 0xed, 0x92, 0x8f, 0x5e, 0x96, 0x5e, 0x81, 0x59, 0x27, 0xae, 0x26, 0xc7, 0x8d, 0x11, + 0x49, 0xa1, 0x41, 0x68, 0xe2, 0xc5, 0x3e, 0xe8, 0x85, 0x53, 0xfa, 0xa0, 0x4f, 0x9e, 0xec, 0x83, + 0x6e, 0xff, 0xe5, 0x04, 0x5c, 0xe9, 0xff, 0x32, 0x35, 0xa1, 0x86, 0xbb, 0xe4, 0x7f, 0x15, 0xe6, + 0x22, 0x59, 0xc1, 0xd8, 0x1e, 0x74, 0xf4, 0xe5, 0xb6, 0x01, 0xc3, 0x04, 0x26, 0xab, 0xd9, 0x10, + 0x53, 0xb9, 0xde, 0xf0, 0xbb, 0x2a, 0x82, 0x41, 0xd7, 0x5c, 0x33, 0x60, 0x98, 0xc0, 0xd4, 0xbe, + 0xa1, 0x93, 0x67, 0xee, 0x1b, 0x5a, 0x87, 0x4b, 0xca, 0x1b, 0xee, 0xba, 0x1f, 0xac, 0xf9, 0x9d, + 0x6e, 0x9b, 0xca, 0x18, 0x06, 0x26, 0xec, 0x15, 0x59, 0xe5, 0x12, 0x66, 0x21, 0x61, 0x76, 0x5d, + 0xfb, 0x7b, 0x05, 0xb8, 0x10, 0x37, 0xfb, 0x9a, 0xef, 0x35, 0x5d, 0xee, 0x53, 0xf8, 0x1a, 0x4c, + 0x46, 0x87, 0x5d, 0xd5, 0xd8, 0x7f, 0x43, 0x89, 0xb3, 0x7d, 0xd8, 0x65, 0xbd, 0x7d, 0x39, 0xa3, + 0x0a, 0xb7, 0x0c, 0xf3, 0x4a, 0x64, 0x53, 0xcf, 0x0e, 0xd1, 0x03, 0x2f, 0x27, 0x47, 0xf3, 0xc3, + 0xa3, 0x72, 0x46, 0xf0, 0xf1, 0x8a, 0xa6, 0x94, 0x1c, 0xf3, 0xe4, 0x1e, 0xcc, 0xb7, 0x9d, 0x30, + 0xba, 0xd3, 0x6d, 0x3a, 0x11, 0xdd, 0x76, 0xa5, 0x87, 0xc6, 0x68, 0x81, 0x01, 0xfa, 0x2a, 0x7b, + 0x33, 0x41, 0x09, 0x53, 0x94, 0xc9, 0x01, 0x10, 0x56, 0xb2, 0x1d, 0x38, 0x5e, 0x28, 0xbe, 0x8a, + 0xf1, 0x1b, 0x3d, 0x10, 0x41, 0x9f, 0x0c, 0x37, 0xfb, 0xa8, 0x61, 0x06, 0x07, 0xf2, 0x1c, 0x4c, + 0x05, 0xd4, 0x09, 0x65, 0x67, 0x96, 0xe2, 0xf9, 0x8f, 0xbc, 0x14, 0x25, 0xd4, 0x9c, 0x50, 0x53, + 0x8f, 0x98, 0x50, 0x7f, 0x66, 0xc1, 0x7c, 0xdc, 0x4d, 0x8f, 0x61, 0x67, 0xed, 0x24, 0x77, 0xd6, + 0x1b, 0x79, 0x2d, 0x89, 0x03, 0x36, 0xd3, 0x3f, 0x9c, 0x32, 0xbf, 0x8f, 0x3b, 0x86, 0x7f, 0x11, + 0x4a, 0x6a, 0x56, 0x2b, 0x95, 0x75, 0xcc, 0x03, 0x76, 0x42, 0x99, 0x31, 0x02, 0x9a, 0x24, 0x13, + 0x8c, 0xf9, 0xb1, 0xad, 0xbc, 0x29, 0xb7, 0x69, 0x39, 0xec, 0xf5, 0x56, 0xae, 0xb6, 0xef, 0xac, + 0xad, 0x5c, 0xd5, 0x21, 0x77, 0xe0, 0x72, 0x37, 0xf0, 0x79, 0x6c, 0xf2, 0x3a, 0x75, 0x9a, 0x6d, + 0xd7, 0xa3, 0xca, 0x8a, 0x21, 0x3c, 0x29, 0x9e, 0x3a, 0x3e, 0x2a, 0x5f, 0xae, 0x65, 0xa3, 0xe0, + 0xa0, 0xba, 0xc9, 0xc0, 0xac, 0xc9, 0x21, 0x02, 0xb3, 0xfe, 0xbe, 0xb6, 0x15, 0xd2, 0x50, 0x86, + 0x47, 0x7d, 0x2e, 0xaf, 0xae, 0xcc, 0x58, 0xd6, 0xe3, 0x21, 0x55, 0x91, 0x4c, 0x51, 0xb3, 0x1f, + 0x6c, 0x90, 0x9a, 0x3a, 0xa5, 0x41, 0x2a, 0xf6, 0xaf, 0x9f, 0xfe, 0x61, 0xfa, 0xd7, 0xcf, 0x7c, + 0xa8, 0xfc, 0xeb, 0x3f, 0x28, 0xc2, 0x62, 0x5a, 0x03, 0x39, 0xfb, 0xa0, 0xb3, 0x7f, 0x68, 0xc1, + 0xa2, 0x9a, 0x3d, 0x82, 0x27, 0x55, 0x57, 0x0d, 0x9b, 0x39, 0x4d, 0x5a, 0xa1, 0x4b, 0xe9, 0x68, + 0xf6, 0xed, 0x14, 0x37, 0xec, 0xe3, 0x4f, 0xde, 0x81, 0x59, 0x6d, 0x91, 0x3f, 0x55, 0x04, 0xda, + 0x02, 0xd7, 0xa2, 0x62, 0x12, 0x68, 0xd2, 0x23, 0x1f, 0x58, 0x00, 0x0d, 0xb5, 0xcd, 0xa9, 0xd9, + 0x75, 0x3b, 0xaf, 0xd9, 0xa5, 0x37, 0xd0, 0x58, 0x59, 0xd6, 0x45, 0x21, 0x1a, 0x8c, 0xc9, 0x2f, + 0x71, 0x5b, 0xbc, 0xd6, 0xee, 0xd8, 0x7c, 0x2a, 0x8c, 0xef, 0x3b, 0x7c, 0x82, 0x62, 0x1a, 0xab, + 0x52, 0x06, 0x28, 0xc4, 0x84, 0x10, 0xf6, 0x6b, 0xa0, 0xbd, 0x3d, 0xd9, 0xb2, 0xc5, 0xfd, 0x3d, + 0x6b, 0x4e, 0xb4, 0x27, 0x87, 0xa0, 0x5e, 0xb6, 0xae, 0x2b, 0x00, 0xc6, 0x38, 0xf6, 0x17, 0x60, + 0xfe, 0x8d, 0xc0, 0xe9, 0xee, 0xb9, 0xdc, 0xe6, 0xcd, 0xce, 0x56, 0x3f, 0x0e, 0xd3, 0x4e, 0xb3, + 0x99, 0x95, 0x0b, 0xa2, 0x22, 0x8a, 0x51, 0xc1, 0x87, 0x3a, 0x46, 0xd9, 0x7f, 0x60, 0x01, 0x89, + 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, 0x3e, 0xda, 0xe3, 0xa5, 0x59, 0xe7, + 0xa3, 0x1b, 0x1a, 0x82, 0x06, 0x16, 0x79, 0x0f, 0x66, 0xc5, 0xbf, 0xb7, 0xb5, 0x85, 0x60, 0xec, + 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x99, 0xc4, 0x28, 0xbc, 0x11, 0x73, 0x40, 0x93, 0x1d, 0x6b, 0xaa, + 0x0d, 0x6f, 0xb7, 0xdd, 0x7b, 0xd0, 0xdc, 0x89, 0x9b, 0xaa, 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, + 0x9b, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0x6b, 0xaa, 0xdf, 0xb3, 0xe0, 0xe2, 0x46, 0x18, 0xb9, + 0xfe, 0x3a, 0x0d, 0x23, 0xb6, 0xad, 0xb0, 0xc5, 0xa7, 0xd7, 0x1e, 0xc6, 0x71, 0x7b, 0x1d, 0x16, + 0xe5, 0x1d, 0x66, 0x6f, 0x27, 0xa4, 0x91, 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x96, 0x82, 0x63, 0x5f, + 0x0d, 0x46, 0x45, 0x5e, 0x66, 0xc6, 0x54, 0x0a, 0x49, 0x2a, 0xf5, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, + 0xdf, 0x2d, 0xc0, 0x05, 0xfe, 0x19, 0xa9, 0xa0, 0x8b, 0x6f, 0x0c, 0x0a, 0xba, 0x18, 0x73, 0x2a, + 0x73, 0x5e, 0xa7, 0x08, 0xb9, 0xf8, 0x07, 0x16, 0x2c, 0x34, 0x93, 0x2d, 0x9d, 0x8f, 0x4d, 0x27, + 0xab, 0x0f, 0x85, 0xcb, 0x56, 0xaa, 0x10, 0xd3, 0xfc, 0xc9, 0x2f, 0x5b, 0xb0, 0x90, 0x14, 0x53, + 0xad, 0xee, 0x67, 0xd0, 0x48, 0xda, 0xc7, 0x3a, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x8f, 0x26, + 0x64, 0x97, 0x9e, 0x45, 0x44, 0x01, 0xb9, 0x0f, 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, + 0x9e, 0x08, 0xb7, 0x37, 0xeb, 0xc2, 0x7d, 0x20, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2f, + 0xce, 0xb8, 0xd1, 0x95, 0x8c, 0x73, 0x39, 0x8a, 0x6e, 0xaf, 0xd5, 0xd2, 0x8c, 0x65, 0x09, 0x63, + 0xac, 0x78, 0xd9, 0xbf, 0x61, 0x41, 0xe9, 0xa6, 0xaf, 0xd6, 0x91, 0x9f, 0xce, 0xc1, 0xd0, 0xa3, + 0xf5, 0x41, 0x7d, 0x4d, 0x19, 0x1f, 0x31, 0x5e, 0x4f, 0x98, 0x79, 0x9e, 0x36, 0x68, 0xaf, 0xf0, + 0x3c, 0x57, 0x8c, 0xd4, 0x4d, 0x7f, 0x67, 0xa0, 0xe9, 0xf1, 0x57, 0x8a, 0x70, 0xee, 0x4d, 0xe7, + 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, 0xf1, 0x0a, 0xcc, 0x3a, 0x5d, 0x7e, 0x0f, 0x66, 0xe8, 0xf8, + 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, 0x2f, 0x68, 0x22, 0xed, 0x4e, 0xd6, 0x52, 0xb4, 0x96, + 0x82, 0x63, 0x5f, 0x0d, 0x72, 0x13, 0x88, 0x8c, 0x46, 0xad, 0x34, 0x1a, 0x7e, 0xcf, 0x13, 0x4b, + 0x9a, 0x30, 0xaa, 0xe8, 0xc3, 0xe6, 0x56, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x9f, 0x87, 0xa5, 0x06, + 0xa7, 0x2c, 0x8f, 0x1e, 0x26, 0x45, 0x71, 0xfc, 0xd4, 0x71, 0x02, 0x6b, 0x03, 0xf0, 0x70, 0x20, + 0x05, 0x26, 0x69, 0x18, 0xf9, 0x81, 0xd3, 0xa2, 0x26, 0xdd, 0xa9, 0xa4, 0xa4, 0xf5, 0x3e, 0x0c, + 0xcc, 0xa8, 0x45, 0xbe, 0x04, 0xa5, 0x68, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0xbf, 0x85, + 0x31, 0x2d, 0x6d, 0xb2, 0xf7, 0xb7, 0x15, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, 0x79, 0x92, 0x00, + 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, 0x6f, 0xe6, 0xc2, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, + 0x1f, 0xe7, 0x80, 0x92, 0x93, 0xfd, 0xfb, 0x13, 0x30, 0x67, 0x22, 0x0e, 0xb1, 0x36, 0x7d, 0xc5, + 0x82, 0xb9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, 0x9d, + 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb7, 0x60, 0x21, 0x76, + 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, 0x97, 0xfa, 0x6b, 0x49, 0x4e, 0x98, 0x66, 0x6d, 0xef, + 0xc0, 0x62, 0xba, 0xb7, 0x59, 0x53, 0x76, 0x1d, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0xd6, 0x9c, 0x30, + 0x44, 0x0e, 0x21, 0x2f, 0xc0, 0x4c, 0xc7, 0x09, 0x5a, 0xae, 0xe7, 0xb4, 0x79, 0x2b, 0x16, 0x8c, + 0x05, 0x49, 0x96, 0xa3, 0xc6, 0xb0, 0x3f, 0x0e, 0x73, 0x5b, 0x8e, 0xd7, 0xa2, 0x4d, 0xb9, 0x0e, + 0x3f, 0x3a, 0xa6, 0xed, 0x07, 0x93, 0x30, 0x6b, 0x9c, 0xcd, 0xce, 0xfe, 0x9c, 0x95, 0x48, 0xa9, + 0x51, 0xc8, 0x31, 0xa5, 0xc6, 0x67, 0x01, 0x76, 0x5d, 0xcf, 0x0d, 0xf7, 0x4e, 0x99, 0xac, 0x83, + 0xdf, 0xeb, 0x5e, 0xd7, 0x14, 0xd0, 0xa0, 0x16, 0x5f, 0x9e, 0x15, 0x4f, 0xc8, 0x3c, 0xf5, 0x81, + 0x65, 0x6c, 0x37, 0x53, 0x79, 0x38, 0x0b, 0x18, 0x1d, 0xb3, 0xa2, 0xb6, 0x1f, 0x91, 0x6b, 0xe8, + 0xa4, 0x5d, 0x69, 0x1b, 0x66, 0x02, 0x1a, 0xf6, 0x3a, 0xec, 0xc4, 0x38, 0x3d, 0x72, 0x33, 0x70, + 0xb7, 0x0d, 0x94, 0xf5, 0x51, 0x53, 0x5a, 0x7e, 0x0d, 0xce, 0x25, 0x44, 0x18, 0x29, 0xfb, 0x90, + 0x0f, 0x99, 0x06, 0x80, 0xd3, 0x5c, 0xe6, 0xb0, 0xbe, 0x68, 0x1b, 0xd9, 0x3a, 0x74, 0x5f, 0x08, + 0xe7, 0x1c, 0x01, 0xb3, 0xff, 0x72, 0x0a, 0xe4, 0xfd, 0xf7, 0x10, 0xcb, 0x95, 0x79, 0xeb, 0x35, + 0x71, 0x8a, 0x5b, 0xaf, 0x9b, 0x30, 0xe7, 0x7a, 0x6e, 0xe4, 0x3a, 0x6d, 0x6e, 0xdc, 0x91, 0xdb, + 0xa9, 0xf2, 0x5e, 0x9e, 0xdb, 0x30, 0x60, 0x19, 0x74, 0x12, 0x75, 0xc9, 0x6d, 0x28, 0xf2, 0xfd, + 0x46, 0x0e, 0xe0, 0xd1, 0x2f, 0xe9, 0xb9, 0x7f, 0x86, 0x08, 0x69, 0x12, 0x94, 0xf8, 0xe1, 0x43, + 0xa4, 0x2b, 0xd1, 0xc7, 0x6f, 0x39, 0x8e, 0xe3, 0xc3, 0x47, 0x0a, 0x8e, 0x7d, 0x35, 0x18, 0x95, + 0x5d, 0xc7, 0x6d, 0xf7, 0x02, 0x1a, 0x53, 0x99, 0x4a, 0x52, 0xb9, 0x9e, 0x82, 0x63, 0x5f, 0x0d, + 0xb2, 0x0b, 0x73, 0xb2, 0x4c, 0xb8, 0x5c, 0x4d, 0x9f, 0xf2, 0x2b, 0xb9, 0x6b, 0xdd, 0x75, 0x83, + 0x12, 0x26, 0xe8, 0x92, 0x1e, 0x9c, 0x77, 0xbd, 0x86, 0xef, 0x35, 0xda, 0xbd, 0xd0, 0x3d, 0xa0, + 0x71, 0x3c, 0xd1, 0x69, 0x98, 0x5d, 0x3a, 0x3e, 0x2a, 0x9f, 0xdf, 0x48, 0x93, 0xc3, 0x7e, 0x0e, + 0xe4, 0xcb, 0x16, 0x5c, 0x6a, 0xf8, 0x5e, 0xc8, 0xe3, 0xff, 0x0f, 0xe8, 0xb5, 0x20, 0xf0, 0x03, + 0xc1, 0xbb, 0x74, 0x4a, 0xde, 0xdc, 0xa6, 0xb8, 0x96, 0x45, 0x12, 0xb3, 0x39, 0x91, 0x77, 0x61, + 0xa6, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, 0x7d, 0x6f, 0x33, 0x8f, 0x7c, 0x24, 0x35, 0x49, + 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, 0x99, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x39, + 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, 0xc8, 0xad, 0x71, 0xd3, 0x5e, 0x28, 0x7a, + 0xca, 0xe5, 0x85, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, + 0x5a, 0xc8, 0x9b, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x0f, 0x68, 0x90, 0x45, 0xa8, 0x18, 0x91, 0x1d, + 0x28, 0xdc, 0xa7, 0x3b, 0xf9, 0xc4, 0x5c, 0xdf, 0xa5, 0xf2, 0x34, 0x53, 0x9d, 0x3e, 0x3e, 0x2a, + 0x17, 0xee, 0xd2, 0x1d, 0x64, 0xc4, 0xd9, 0x77, 0x35, 0xc5, 0xdd, 0xbd, 0x5c, 0x2a, 0xc6, 0xfc, + 0xae, 0x84, 0x23, 0x80, 0xf8, 0x2e, 0x59, 0x84, 0x8a, 0x11, 0x79, 0x17, 0x4a, 0xf7, 0x9d, 0x03, + 0xba, 0x1b, 0xf8, 0x5e, 0x24, 0xfd, 0xac, 0xc6, 0x0c, 0x15, 0xb8, 0xab, 0xc8, 0x49, 0xbe, 0x7c, + 0x7b, 0xd7, 0x85, 0x18, 0xb3, 0x23, 0x07, 0x30, 0xe3, 0xd1, 0xfb, 0x48, 0xdb, 0x6e, 0x23, 0x1f, + 0xd7, 0xfc, 0x5b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0x7b, + 0xfe, 0x8e, 0x5c, 0xa8, 0xc6, 0xec, 0x4b, 0x7d, 0x32, 0x15, 0x7d, 0x79, 0xd3, 0xdf, 0x41, 0x46, + 0x9c, 0xcd, 0x91, 0x86, 0x76, 0xf2, 0x91, 0xcb, 0xd4, 0xad, 0x7c, 0x9d, 0x9b, 0xc4, 0x1c, 0x89, + 0x4b, 0xd1, 0xe0, 0xc8, 0xda, 0xb6, 0x25, 0x8d, 0x95, 0x72, 0xa1, 0x1a, 0xb3, 0x6d, 0x93, 0xa6, + 0x4f, 0xd1, 0xb6, 0xaa, 0x0c, 0x35, 0x2f, 0xc6, 0xd7, 0x95, 0x96, 0xbf, 0x7c, 0x96, 0xaa, 0xa4, + 0x1d, 0x51, 0xf0, 0x55, 0x65, 0xa8, 0x79, 0xb1, 0xf6, 0x0e, 0xf7, 0x0f, 0xef, 0x3b, 0xed, 0x7d, + 0xd7, 0x6b, 0xc9, 0x38, 0xc7, 0x71, 0xd3, 0xde, 0xee, 0x1f, 0xde, 0x15, 0xf4, 0xcc, 0xf6, 0x8e, + 0x4b, 0xd1, 0xe0, 0x48, 0xfe, 0xa9, 0x05, 0x53, 0xdd, 0x76, 0xaf, 0xe5, 0x7a, 0x4b, 0x73, 0x5c, + 0x4f, 0xfc, 0x4c, 0x9e, 0x2b, 0xf4, 0x4a, 0x8d, 0x93, 0x16, 0x8a, 0xe2, 0x4f, 0x68, 0x9f, 0x3d, + 0x5e, 0xf8, 0x0b, 0x7f, 0x5e, 0x5e, 0xa2, 0x5e, 0xc3, 0x6f, 0xba, 0x5e, 0x6b, 0xf5, 0x5e, 0xe8, + 0x7b, 0x2b, 0xe8, 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x94, + 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x31, 0x05, 0x73, 0x66, 0x46, 0xbd, 0x21, 0xb4, 0x2f, 0x7d, + 0xe2, 0x98, 0x18, 0xe5, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0xed, 0x91, 0x32, 0x6f, 0x6d, 0xe4, 0xa6, + 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x11, 0x1c, 0x4a, 0x98, 0xda, 0x2a, 0x14, + 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x2f, 0x02, 0xc4, 0x99, 0xe5, 0xe4, 0xad, 0xa2, 0xd6, + 0x87, 0x8d, 0x8c, 0x77, 0x06, 0x16, 0x79, 0x0e, 0xa6, 0x98, 0xea, 0x43, 0x9b, 0x32, 0x0c, 0x5b, + 0x9f, 0xe3, 0xaf, 0xf3, 0x52, 0x94, 0x50, 0xf2, 0x2a, 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0x57, + 0x5f, 0x8c, 0xb5, 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, + 0xd1, 0xb9, 0xd2, 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, + 0x4a, 0xc1, 0xb1, 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x21, 0x3a, 0x2b, 0x9c, 0x6d, 0x07, 0x5c, 0x65, + 0x7e, 0xd5, 0x3c, 0x6b, 0xe5, 0x38, 0x87, 0xc4, 0xa8, 0x1d, 0xfe, 0xb0, 0x35, 0xde, 0xb1, 0xe8, + 0x0b, 0x30, 0x9f, 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, 0xda, 0x24, 0x5c, 0xb8, 0xd5, 0x72, 0xbd, + 0x74, 0xb6, 0xa8, 0xac, 0x64, 0xdb, 0xd6, 0xa8, 0xc9, 0xb6, 0xe3, 0x78, 0x2e, 0x99, 0xcd, 0x3c, + 0x3b, 0x9e, 0x4b, 0xa5, 0x3a, 0x4f, 0xe2, 0x92, 0x3f, 0xb3, 0xe0, 0x69, 0xa7, 0x29, 0xce, 0x05, + 0x4e, 0x5b, 0x96, 0x1a, 0x39, 0x6e, 0xe5, 0x8c, 0x0e, 0xc7, 0xdc, 0xe5, 0xfb, 0x3f, 0x7e, 0xa5, + 0x72, 0x02, 0x57, 0xd1, 0xe3, 0x3f, 0x26, 0xbf, 0xe0, 0xe9, 0x93, 0x50, 0xf1, 0x44, 0xf1, 0xc9, + 0xdf, 0x86, 0x85, 0xc4, 0x07, 0x4b, 0x4b, 0x78, 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xe3, + 0x2e, 0xbf, 0x05, 0x1f, 0x7d, 0xa4, 0x9c, 0x23, 0x0d, 0xb6, 0xaf, 0x58, 0x50, 0x12, 0x76, 0x6d, + 0xa4, 0xbb, 0x29, 0x27, 0xcc, 0xd4, 0xc9, 0xbb, 0x52, 0xdb, 0xc8, 0x70, 0xc2, 0x64, 0x6b, 0xf9, + 0xbe, 0xeb, 0x35, 0x65, 0x2f, 0xeb, 0xb5, 0xfc, 0x4d, 0xd7, 0x6b, 0x22, 0x87, 0xe8, 0xd5, 0xbe, + 0x30, 0xd0, 0xde, 0xf4, 0xab, 0x16, 0xcc, 0xf3, 0x18, 0xd8, 0xf8, 0x4c, 0xf8, 0x8a, 0x76, 0x36, + 0x12, 0x62, 0x5c, 0x49, 0x3a, 0x1b, 0x3d, 0x3c, 0x2a, 0xcf, 0x8a, 0xa8, 0xd9, 0xa4, 0xef, 0xd1, + 0xe7, 0xa4, 0x21, 0x89, 0xbb, 0x44, 0x4d, 0x8c, 0x6c, 0xe7, 0xd0, 0x86, 0xd6, 0xba, 0x22, 0x82, + 0x31, 0x3d, 0xfb, 0x3d, 0x98, 0x33, 0x83, 0x59, 0xc8, 0x2b, 0x30, 0xdb, 0x75, 0xbd, 0x56, 0x32, + 0xe8, 0x51, 0x1b, 0xdb, 0x6b, 0x31, 0x08, 0x4d, 0x3c, 0x5e, 0xcd, 0x8f, 0xab, 0xa5, 0x6c, 0xf4, + 0x35, 0xdf, 0xac, 0x16, 0xff, 0xe1, 0x39, 0xb6, 0x33, 0x82, 0xa6, 0x72, 0xcf, 0xb1, 0x9d, 0xc1, + 0xe3, 0x87, 0x97, 0x63, 0x3b, 0x4b, 0x98, 0xff, 0xb7, 0x72, 0x6c, 0xff, 0x14, 0x8c, 0x9a, 0x5c, + 0x91, 0xed, 0x77, 0xf7, 0xcd, 0xc0, 0x74, 0xdd, 0xe2, 0x32, 0x32, 0x5d, 0x42, 0xed, 0x1d, 0x58, + 0x4c, 0x9f, 0x7a, 0x73, 0x77, 0x28, 0xf8, 0x38, 0x8c, 0x98, 0x0e, 0xd1, 0xbe, 0x06, 0x04, 0xfd, + 0x76, 0x7b, 0xc7, 0x69, 0xec, 0xdf, 0x75, 0xbd, 0xa6, 0x7f, 0x9f, 0xcf, 0x95, 0x55, 0x28, 0x05, + 0x32, 0x26, 0x2e, 0x94, 0x9f, 0xa5, 0x27, 0x9b, 0x0a, 0x96, 0x0b, 0x31, 0xc6, 0xb1, 0xff, 0x68, + 0x02, 0xa6, 0x65, 0x00, 0xe7, 0x63, 0xf0, 0xcd, 0xde, 0x4f, 0x5c, 0xda, 0x6d, 0xe4, 0x12, 0x77, + 0x3a, 0xd0, 0x31, 0x3b, 0x4c, 0x39, 0x66, 0xbf, 0x99, 0x0f, 0xbb, 0x93, 0xbd, 0xb2, 0xff, 0xb0, + 0x08, 0x0b, 0xa9, 0x80, 0x58, 0xa6, 0x30, 0xf5, 0x39, 0x23, 0xde, 0xc9, 0x35, 0xe6, 0x56, 0x07, + 0x1b, 0x9c, 0xec, 0x97, 0x18, 0x26, 0x92, 0xd7, 0xde, 0xce, 0x2d, 0x2f, 0xff, 0x8f, 0xf2, 0xd8, + 0x8e, 0xe8, 0x67, 0x47, 0xbe, 0x6d, 0xc1, 0x05, 0xa7, 0xff, 0x61, 0x03, 0x69, 0xd8, 0xb9, 0x9d, + 0xfb, 0x8b, 0x09, 0xd5, 0xa7, 0xa4, 0x90, 0x59, 0xef, 0x47, 0x60, 0x96, 0x28, 0xf6, 0x7f, 0xb1, + 0xe0, 0xc9, 0x81, 0xa1, 0xdd, 0x3c, 0x33, 0x50, 0x90, 0x84, 0xca, 0x35, 0x23, 0xe7, 0x04, 0x16, + 0xfa, 0x92, 0x2f, 0x9d, 0xcc, 0x25, 0xcd, 0x9e, 0xbc, 0x0c, 0x73, 0x5c, 0x89, 0x60, 0xab, 0x67, + 0x44, 0xbb, 0xf2, 0x8e, 0x82, 0x5b, 0xab, 0xeb, 0x46, 0x39, 0x26, 0xb0, 0xec, 0x6f, 0x5b, 0xb0, + 0x34, 0x28, 0x4f, 0xcc, 0x10, 0x27, 0xe8, 0xbf, 0x95, 0xf2, 0x6f, 0x2f, 0xf7, 0xf9, 0xb7, 0xa7, + 0xce, 0xd0, 0xca, 0x95, 0xdd, 0x38, 0xbe, 0x16, 0x1e, 0xe1, 0xbe, 0xfd, 0x0d, 0x0b, 0x2e, 0x0f, + 0x98, 0xf0, 0x7d, 0x71, 0x0e, 0xd6, 0xa9, 0xe3, 0x1c, 0x26, 0x86, 0x8d, 0x73, 0xb0, 0xff, 0xb8, + 0x00, 0x8b, 0x52, 0x9e, 0x58, 0x93, 0x7c, 0x35, 0x11, 0x25, 0xf0, 0x63, 0xa9, 0x28, 0x81, 0x8b, + 0x69, 0xfc, 0x1f, 0x85, 0x08, 0x7c, 0xb8, 0x42, 0x04, 0xfe, 0x6a, 0x02, 0x2e, 0x65, 0xa6, 0xaf, + 0x21, 0x5f, 0xcb, 0xd8, 0xbd, 0xee, 0xe6, 0x9c, 0x27, 0x67, 0xc8, 0xfd, 0x6b, 0x5c, 0xbf, 0xfa, + 0x5f, 0x36, 0xfd, 0xd9, 0xc5, 0x6e, 0xb4, 0x7b, 0x06, 0x19, 0x7f, 0x46, 0x74, 0x6d, 0xb7, 0x7f, + 0xa1, 0x00, 0xcf, 0x0f, 0x4b, 0xe8, 0x43, 0x1a, 0xfa, 0x14, 0x26, 0x42, 0x9f, 0x1e, 0x93, 0x66, + 0x71, 0x26, 0x51, 0x50, 0xff, 0x7c, 0x52, 0x6f, 0x7b, 0xfd, 0xe3, 0x73, 0xa8, 0x0b, 0xed, 0x69, + 0xa6, 0x7d, 0xaa, 0x14, 0xb8, 0xf1, 0x52, 0x38, 0x5d, 0x17, 0xc5, 0x0f, 0x8f, 0xca, 0xe7, 0xe3, + 0x24, 0x0a, 0xb2, 0x10, 0x55, 0x25, 0xf2, 0x3c, 0xcc, 0x04, 0x02, 0xaa, 0x82, 0x3d, 0xa4, 0x57, + 0x80, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x32, 0xd4, 0xf5, 0xc9, 0xb3, 0xca, 0x15, 0x72, 0x92, 0xb3, + 0xc3, 0x3b, 0x30, 0x13, 0xaa, 0xf4, 0xb4, 0x42, 0x71, 0x79, 0x69, 0xc8, 0x18, 0x22, 0x76, 0x48, + 0x54, 0xb9, 0x6a, 0xc5, 0xf7, 0xe9, 0x4c, 0xb6, 0x9a, 0x24, 0xb1, 0xf5, 0xf9, 0x4c, 0x18, 0x63, + 0xa1, 0xff, 0x6c, 0x46, 0x22, 0x98, 0x96, 0x2f, 0xf2, 0xc9, 0x5b, 0xa2, 0xad, 0x9c, 0xe2, 0x05, + 0xa4, 0x37, 0x29, 0xbf, 0x8b, 0x53, 0x76, 0x02, 0xc5, 0xca, 0xfe, 0x9e, 0x05, 0xb3, 0x72, 0x8c, + 0x3c, 0x86, 0x60, 0xaa, 0x7b, 0xc9, 0x60, 0xaa, 0x6b, 0xb9, 0xac, 0x58, 0x03, 0x22, 0xa9, 0xee, + 0xc1, 0x9c, 0x99, 0x37, 0x8d, 0x7c, 0xd6, 0x58, 0x71, 0xad, 0x71, 0x32, 0x11, 0xa9, 0x35, 0x39, + 0x5e, 0x8d, 0xed, 0xdf, 0x2c, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x27, 0x8e, 0x7c, + 0x73, 0xe0, 0x4d, 0xe4, 0x3f, 0xf0, 0x6e, 0xc3, 0x8c, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xac, 0xe9, + 0x5e, 0xca, 0x34, 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0xaa, 0xfb, 0x50, 0x2f, 0xd7, 0x9a, + 0x0c, 0x79, 0x17, 0x66, 0xef, 0xfb, 0xc1, 0x7e, 0xdb, 0x77, 0x78, 0x72, 0x6c, 0xc8, 0xe3, 0x46, + 0x53, 0x1b, 0x14, 0x85, 0x8f, 0xff, 0xdd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0x16, 0x3a, 0xae, + 0x87, 0xd4, 0x69, 0xea, 0x98, 0xa9, 0x49, 0x91, 0x8f, 0x57, 0xa9, 0xd6, 0x5b, 0x49, 0x30, 0xa6, + 0xf1, 0xc9, 0xd7, 0x2d, 0x98, 0x0f, 0x12, 0xd6, 0x06, 0x99, 0x74, 0xb3, 0x36, 0xfe, 0x60, 0x4c, + 0x5a, 0x30, 0x84, 0x93, 0x7b, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0x17, 0x61, 0x26, 0x94, 0x49, 0xd1, + 0xf2, 0xb9, 0x0a, 0xd7, 0x67, 0x7b, 0x41, 0x34, 0xee, 0x4a, 0x55, 0x82, 0x9a, 0x21, 0xd9, 0x84, + 0x8b, 0xca, 0x7c, 0x92, 0x78, 0xc0, 0x68, 0x2a, 0xce, 0xa1, 0x83, 0x19, 0x70, 0xcc, 0xac, 0xc5, + 0x54, 0x39, 0x9e, 0x8f, 0x50, 0xdc, 0x20, 0x19, 0x97, 0x2e, 0x7c, 0xfe, 0x35, 0x51, 0x42, 0x4f, + 0x0a, 0x09, 0x9c, 0x19, 0x23, 0x24, 0xb0, 0x0e, 0x97, 0xd2, 0x20, 0x9e, 0x1c, 0x89, 0xe7, 0x63, + 0x32, 0xb6, 0xd0, 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x14, 0x50, 0x7e, 0xc8, 0xaa, + 0x28, 0xe7, 0x9b, 0x91, 0xdd, 0x0c, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, 0x21, + 0xf7, 0x76, 0x8e, 0x2f, 0x67, 0xca, 0xbe, 0x1f, 0x90, 0xb4, 0xcc, 0xfe, 0xfe, 0x3c, 0x9c, 0x4b, + 0xd8, 0x80, 0xc8, 0xb3, 0x50, 0xe4, 0xd9, 0xa2, 0xf8, 0x6a, 0x35, 0x13, 0xaf, 0xa8, 0xa2, 0x71, + 0x04, 0x8c, 0xfc, 0xa2, 0x05, 0x0b, 0xdd, 0x84, 0xd1, 0x5d, 0x2d, 0xe4, 0x63, 0xde, 0xb7, 0x27, + 0x2d, 0xf9, 0x46, 0x6e, 0xf9, 0x24, 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, 0xf4, 0xd5, 0x6d, 0xd3, + 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, 0x58, 0x4b, 0x82, 0x31, 0x8d, 0xcf, 0x7a, 0x98, 0x7f, 0xdd, + 0x38, 0x6f, 0xb3, 0x55, 0x14, 0x01, 0x8c, 0x69, 0x91, 0xd7, 0x61, 0x5e, 0x26, 0x46, 0xad, 0xf9, + 0xcd, 0x1b, 0x4e, 0xb8, 0x27, 0x4f, 0x38, 0xfa, 0x44, 0xb6, 0x96, 0x80, 0x62, 0x0a, 0x9b, 0x7f, + 0x5b, 0x9c, 0x7d, 0x96, 0x13, 0x98, 0x4a, 0xa6, 0xde, 0x5f, 0x4b, 0x82, 0x31, 0x8d, 0x4f, 0x5e, + 0x30, 0xb6, 0x21, 0x71, 0xab, 0xab, 0x57, 0x83, 0x8c, 0xad, 0xa8, 0x02, 0x0b, 0x3d, 0x7e, 0x20, + 0x6c, 0x2a, 0xa0, 0x9c, 0x8f, 0x9a, 0xe1, 0x9d, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x35, 0x38, 0x17, + 0xb0, 0xc5, 0x56, 0x13, 0x10, 0x57, 0xbd, 0xfa, 0x26, 0x0f, 0x4d, 0x20, 0x26, 0x71, 0xc9, 0x1b, + 0x70, 0x3e, 0xce, 0x23, 0xa8, 0x08, 0x88, 0xbb, 0x5f, 0x9d, 0xd4, 0xaa, 0x92, 0x46, 0xc0, 0xfe, + 0x3a, 0xe4, 0xef, 0xc2, 0xa2, 0xd1, 0x12, 0x1b, 0x5e, 0x93, 0x3e, 0x90, 0xb9, 0xde, 0xf8, 0x9b, + 0x2a, 0x6b, 0x29, 0x18, 0xf6, 0x61, 0x93, 0x4f, 0xc1, 0x7c, 0xc3, 0x6f, 0xb7, 0xf9, 0x1a, 0x27, + 0xd2, 0xbe, 0x8b, 0xa4, 0x6e, 0x22, 0xfd, 0x5d, 0x02, 0x82, 0x29, 0x4c, 0x72, 0x13, 0x88, 0xbf, + 0xc3, 0xd4, 0x2b, 0xda, 0x7c, 0x43, 0x3c, 0xd2, 0xcd, 0x34, 0x8e, 0x73, 0xc9, 0x48, 0x81, 0xb7, + 0xfa, 0x30, 0x30, 0xa3, 0x16, 0xcf, 0x89, 0x65, 0x44, 0x56, 0xce, 0xe7, 0xf1, 0x4e, 0x59, 0xda, + 0x7c, 0xf1, 0xc8, 0xb0, 0xca, 0x00, 0xa6, 0x44, 0xe0, 0x46, 0x3e, 0xd9, 0xdd, 0xcc, 0x0c, 0xd0, + 0xf1, 0x1e, 0x21, 0x4a, 0x51, 0x72, 0x22, 0x3f, 0x07, 0xa5, 0x1d, 0xf5, 0x1c, 0x00, 0x4f, 0xe9, + 0x36, 0xf6, 0xbe, 0x98, 0x7a, 0xd9, 0x22, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x2c, 0xc9, 0x73, 0x30, + 0x7b, 0xa3, 0x56, 0xd1, 0xa3, 0xf0, 0x3c, 0xef, 0xfd, 0x49, 0x56, 0x05, 0x4d, 0x00, 0x9b, 0x61, + 0x5a, 0x7d, 0x23, 0xc9, 0x17, 0x36, 0x32, 0xb4, 0x31, 0x86, 0xcd, 0xef, 0x67, 0xb1, 0xbe, 0x74, + 0x21, 0x85, 0x2d, 0xcb, 0x51, 0x63, 0x90, 0x77, 0x60, 0x56, 0xee, 0x17, 0x7c, 0x6d, 0xba, 0x78, + 0xba, 0xa8, 0x5d, 0x8c, 0x49, 0xa0, 0x49, 0x8f, 0x5f, 0x2a, 0xf2, 0x2c, 0xe9, 0xf4, 0x7a, 0xaf, + 0xdd, 0x5e, 0xba, 0xc4, 0xd7, 0xcd, 0xf8, 0x52, 0x31, 0x06, 0xa1, 0x89, 0x47, 0x5e, 0x52, 0x7e, + 0x36, 0x1f, 0x49, 0xdc, 0xb2, 0x6a, 0x3f, 0x1b, 0xad, 0x74, 0x0f, 0x70, 0xec, 0xbf, 0xfc, 0x08, + 0x07, 0x97, 0x1d, 0x58, 0x56, 0x1a, 0x5f, 0xff, 0x24, 0x59, 0x5a, 0x4a, 0x98, 0x4a, 0x96, 0xef, + 0x0e, 0xc4, 0xc4, 0x13, 0xa8, 0x90, 0x1d, 0x28, 0x38, 0xed, 0x9d, 0xa5, 0x27, 0xf3, 0x50, 0x5d, + 0xf5, 0xa3, 0xfb, 0xc2, 0x19, 0xaf, 0xb2, 0x59, 0x45, 0x46, 0xdc, 0xfe, 0xf2, 0x84, 0xbe, 0x3d, + 0xd1, 0x59, 0x6f, 0xdf, 0x33, 0x47, 0xb5, 0x95, 0xc7, 0xa3, 0xd2, 0x7d, 0x6f, 0x66, 0x88, 0x0d, + 0x29, 0x73, 0x4c, 0x77, 0xf5, 0x3c, 0xce, 0x25, 0x9f, 0x50, 0x32, 0xa3, 0xaf, 0x38, 0xd2, 0x26, + 0x67, 0xb1, 0xfd, 0x3b, 0xa0, 0x2d, 0x71, 0x29, 0xc7, 0x91, 0x00, 0x8a, 0x6e, 0x18, 0xb9, 0x7e, + 0x8e, 0x11, 0xa6, 0xa9, 0x54, 0xb8, 0xdc, 0x81, 0x9d, 0x03, 0x50, 0xb0, 0x62, 0x3c, 0xbd, 0x96, + 0xeb, 0x3d, 0x90, 0x9f, 0x7f, 0x3b, 0x77, 0x8f, 0x10, 0xc1, 0x93, 0x03, 0x50, 0xb0, 0x22, 0xf7, + 0xc4, 0x48, 0xcb, 0xe7, 0x01, 0xf1, 0xcd, 0x6a, 0x8a, 0x5f, 0x62, 0xc4, 0x31, 0x5e, 0x61, 0xc7, + 0x95, 0x3a, 0xcc, 0x98, 0xbc, 0xea, 0x5b, 0x1b, 0x59, 0xbc, 0xea, 0x5b, 0x1b, 0xc8, 0x98, 0x90, + 0xaf, 0x5a, 0x00, 0x8e, 0x7e, 0x20, 0x3f, 0x9f, 0x07, 0x66, 0x06, 0x3d, 0xb8, 0x2f, 0x7c, 0x20, + 0x63, 0x28, 0x1a, 0x9c, 0xc9, 0xbb, 0x30, 0xed, 0x88, 0xc7, 0xb4, 0xa4, 0x3b, 0x6f, 0x3e, 0x2f, + 0xc4, 0xa5, 0x24, 0xe0, 0xb6, 0x13, 0x09, 0x42, 0xc5, 0x90, 0xf1, 0x8e, 0x02, 0x87, 0xee, 0xba, + 0xfb, 0xd2, 0x62, 0x53, 0x1f, 0x3b, 0xcb, 0x3d, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, + 0x8f, 0x1b, 0x3b, 0x9e, 0xa3, 0x83, 0xb4, 0xf2, 0x09, 0xe5, 0x33, 0xc3, 0xbe, 0x8c, 0xc7, 0x8d, + 0x4d, 0x46, 0x98, 0xe4, 0x4b, 0x0e, 0x60, 0xca, 0xe1, 0xcf, 0xfc, 0xc9, 0xf3, 0x11, 0xe6, 0xf1, + 0x64, 0x60, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x1f, 0x13, 0x94, 0xdc, 0xc8, 0xaf, 0x59, 0x30, 0x2d, + 0x3c, 0x4d, 0x99, 0x96, 0xc8, 0xbe, 0xfd, 0x0b, 0x67, 0x90, 0x52, 0x5b, 0x7a, 0xc1, 0x4a, 0xbf, + 0x91, 0x9f, 0xd4, 0x6e, 0x74, 0xa2, 0xf4, 0x44, 0x3f, 0x58, 0x25, 0xdd, 0xf2, 0xa7, 0x60, 0xce, + 0xa4, 0x32, 0x92, 0x27, 0xec, 0x5f, 0x14, 0x00, 0x78, 0x43, 0x8b, 0xb4, 0x0c, 0x1d, 0x9e, 0xff, + 0x73, 0xcf, 0x6f, 0xe6, 0xf3, 0x3e, 0xa3, 0x99, 0x5d, 0x01, 0x64, 0xb2, 0xcf, 0x3d, 0xbf, 0x89, + 0x92, 0x09, 0x69, 0xc1, 0x64, 0xd7, 0x89, 0xf6, 0xf2, 0x4f, 0xe5, 0x30, 0x23, 0xe2, 0x13, 0xa3, + 0x3d, 0xe4, 0x0c, 0xc8, 0xfb, 0x16, 0x4c, 0x8b, 0x64, 0x0e, 0xea, 0x36, 0x63, 0x6c, 0xaf, 0x02, + 0xd5, 0x66, 0x2b, 0x22, 0x63, 0x84, 0xec, 0x41, 0xad, 0x78, 0xc8, 0x52, 0x54, 0x6c, 0x97, 0x3f, + 0xb0, 0x60, 0xce, 0x44, 0xcd, 0xe8, 0xa6, 0x9f, 0x31, 0xbb, 0x29, 0xcf, 0xf6, 0x30, 0x7b, 0xfc, + 0xbf, 0x5b, 0x60, 0x3c, 0xb8, 0x1d, 0x3b, 0xfc, 0x5a, 0x43, 0x3b, 0xfc, 0x4e, 0x8c, 0xe8, 0xf0, + 0x5b, 0x18, 0xc9, 0xe1, 0x77, 0x72, 0x74, 0x87, 0xdf, 0xe2, 0x60, 0x87, 0x5f, 0xfb, 0x9b, 0x16, + 0x9c, 0xef, 0xdb, 0x6d, 0x98, 0x72, 0x1a, 0xf8, 0x7e, 0x34, 0xc0, 0x51, 0x0e, 0x63, 0x10, 0x9a, + 0x78, 0x64, 0x1d, 0x16, 0x65, 0xb6, 0xfb, 0x7a, 0xb7, 0xed, 0x66, 0xa6, 0xd9, 0xd8, 0x4e, 0xc1, + 0xb1, 0xaf, 0x86, 0xfd, 0x3b, 0x16, 0xcc, 0x1a, 0xc1, 0xb9, 0xec, 0x3b, 0x78, 0x10, 0xb3, 0x14, + 0x23, 0x4e, 0xf4, 0xcf, 0x6f, 0x8f, 0x04, 0x4c, 0x5c, 0x64, 0xb6, 0x8c, 0x5c, 0xc8, 0xf1, 0x45, + 0x26, 0x2b, 0x45, 0x09, 0x15, 0x59, 0x6e, 0x69, 0x97, 0x37, 0x7a, 0xc1, 0xcc, 0x72, 0x4b, 0xbb, + 0xc8, 0x21, 0x9c, 0x1d, 0xd3, 0xd2, 0xa5, 0x2f, 0xb8, 0xf1, 0xae, 0x80, 0x13, 0x44, 0x28, 0x60, + 0xe4, 0x0a, 0x14, 0xa8, 0xd7, 0x94, 0x26, 0x05, 0xfd, 0xf2, 0xdf, 0x35, 0xaf, 0x89, 0xac, 0xdc, + 0x7e, 0x0b, 0xe6, 0xea, 0xb4, 0x11, 0xd0, 0xe8, 0x4d, 0x7a, 0x38, 0xf4, 0x53, 0x82, 0x6c, 0xb4, + 0xa7, 0x9e, 0x12, 0x64, 0xd5, 0x59, 0xb9, 0xfd, 0x2f, 0x2d, 0x48, 0x3d, 0x7e, 0x61, 0x5c, 0x6a, + 0x58, 0x03, 0x2f, 0x35, 0x4c, 0x43, 0xf8, 0xc4, 0x89, 0x86, 0xf0, 0x9b, 0x40, 0x3a, 0x6c, 0x2a, + 0x24, 0x9e, 0x7a, 0x91, 0xd6, 0x9c, 0x38, 0x15, 0x40, 0x1f, 0x06, 0x66, 0xd4, 0xb2, 0xff, 0x85, + 0x10, 0xd6, 0x7c, 0x0e, 0xe3, 0xd1, 0x0d, 0xd0, 0x83, 0x22, 0x27, 0x25, 0x4d, 0x5a, 0x63, 0x9a, + 0x83, 0xfb, 0x53, 0xea, 0xc4, 0x1d, 0x29, 0xa7, 0x3c, 0xe7, 0x66, 0xff, 0xb1, 0x90, 0xd5, 0x78, + 0x2f, 0x63, 0x08, 0x59, 0x3b, 0x49, 0x59, 0x6f, 0xe4, 0xb5, 0x56, 0x66, 0xcb, 0x48, 0x56, 0x00, + 0xba, 0x34, 0x68, 0x50, 0x2f, 0x52, 0x21, 0x0a, 0x45, 0x19, 0x2c, 0xa7, 0x4b, 0xd1, 0xc0, 0xb0, + 0x7f, 0xc5, 0x82, 0xc5, 0x74, 0x24, 0x4b, 0xde, 0x7e, 0x86, 0x89, 0x70, 0xdb, 0xc2, 0xe8, 0xe1, + 0xb6, 0xf6, 0xfb, 0x4c, 0xc8, 0xc8, 0x6d, 0xec, 0xbb, 0x9e, 0x88, 0x50, 0xdd, 0x75, 0x5b, 0x4c, + 0x48, 0x2a, 0x1f, 0xe7, 0x13, 0x96, 0x50, 0x2d, 0xa4, 0x7a, 0x93, 0x4f, 0xc1, 0x49, 0x05, 0x16, + 0xd4, 0xfd, 0x8f, 0x32, 0x5f, 0x8b, 0xc8, 0x7a, 0x6d, 0x2e, 0x5b, 0x4f, 0x82, 0x31, 0x8d, 0x6f, + 0x7f, 0x09, 0x66, 0x8d, 0x4d, 0x80, 0xaf, 0x97, 0x0f, 0x9c, 0x46, 0x94, 0x5e, 0x67, 0xae, 0xb1, + 0x42, 0x14, 0x30, 0x6e, 0x65, 0x17, 0x8e, 0xf6, 0xa9, 0x75, 0x46, 0xba, 0xd7, 0x4b, 0x28, 0x23, + 0x16, 0xd0, 0x16, 0x7d, 0xa0, 0x52, 0x43, 0x2b, 0x62, 0xc8, 0x0a, 0x51, 0xc0, 0xec, 0x17, 0x60, + 0x46, 0xe5, 0x3f, 0xe1, 0x49, 0x04, 0x94, 0x05, 0xd8, 0x4c, 0x22, 0xe0, 0x07, 0x11, 0x72, 0x88, + 0xfd, 0x36, 0xcc, 0xa8, 0x34, 0x2d, 0x8f, 0xc6, 0x66, 0x53, 0x3f, 0xf4, 0xdc, 0x1b, 0x7e, 0x18, + 0xa9, 0xdc, 0x32, 0xe2, 0x92, 0xea, 0xd6, 0x06, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x82, 0x85, 0xd4, + 0x65, 0xe5, 0x10, 0x19, 0x07, 0x7e, 0xbf, 0x00, 0x73, 0x89, 0xf7, 0xf3, 0x1f, 0x3d, 0x6b, 0x86, + 0x5f, 0x8c, 0x32, 0xee, 0x99, 0x0a, 0x23, 0xde, 0x33, 0x99, 0x17, 0x7b, 0x93, 0x67, 0x7b, 0xb1, + 0x57, 0xcc, 0xe7, 0x62, 0xcf, 0xb8, 0x80, 0x9e, 0x7a, 0x7c, 0x17, 0xd0, 0xbf, 0x5d, 0x84, 0xf9, + 0x64, 0x0a, 0xbb, 0x21, 0x7a, 0xf2, 0x85, 0xbe, 0x9e, 0x1c, 0xd1, 0xb0, 0x5d, 0x18, 0xd7, 0xb0, + 0x3d, 0x39, 0xae, 0x61, 0xbb, 0x78, 0x0a, 0xc3, 0x76, 0xbf, 0x59, 0x7a, 0x6a, 0x68, 0xb3, 0xf4, + 0xa7, 0xb5, 0x6b, 0xda, 0x74, 0xc2, 0x97, 0x23, 0x76, 0x4d, 0x23, 0xc9, 0x6e, 0x58, 0xf3, 0x9b, + 0x99, 0x2e, 0x7e, 0x33, 0x8f, 0x30, 0xe0, 0x05, 0x99, 0x9e, 0x64, 0xa3, 0xdf, 0x9d, 0x7d, 0x64, + 0x04, 0x2f, 0xb2, 0x57, 0x60, 0x56, 0x8e, 0x27, 0xae, 0xf2, 0x41, 0x52, 0x5d, 0xac, 0xc7, 0x20, + 0x34, 0xf1, 0xf8, 0xeb, 0xc6, 0xc9, 0xc7, 0x9f, 0xf9, 0x3d, 0x81, 0xf9, 0xba, 0x71, 0xea, 0xb1, + 0xe8, 0x34, 0xbe, 0xfd, 0x45, 0xb8, 0x94, 0x79, 0x6c, 0xe7, 0x76, 0x4c, 0xae, 0x8d, 0xd0, 0xa6, + 0x44, 0x30, 0xc4, 0x48, 0x65, 0x45, 0x5f, 0xbe, 0x3b, 0x10, 0x13, 0x4f, 0xa0, 0x62, 0xff, 0x56, + 0x01, 0xe6, 0x93, 0x4f, 0xe3, 0x91, 0xfb, 0xda, 0xc8, 0x97, 0x8b, 0x7d, 0x51, 0x90, 0x35, 0xd2, + 0xa2, 0x0d, 0xb4, 0xd8, 0xdf, 0xe7, 0xe3, 0x6b, 0x47, 0xe7, 0x68, 0x3b, 0x3b, 0xc6, 0xd2, 0x54, + 0x2e, 0xd9, 0xf1, 0xd7, 0xef, 0xe2, 0x08, 0x2a, 0x79, 0x7a, 0xcc, 0x9d, 0x7b, 0x1c, 0xd4, 0xa4, + 0x59, 0xa1, 0xc1, 0x96, 0xed, 0x2d, 0x07, 0x34, 0x70, 0x77, 0x5d, 0xfd, 0xac, 0x2f, 0x5f, 0xb9, + 0xdf, 0x96, 0x65, 0xa8, 0xa1, 0xf6, 0xfb, 0x13, 0x10, 0x3f, 0x79, 0xce, 0xdf, 0x8f, 0x0a, 0x0d, + 0x4d, 0x5d, 0x76, 0xdb, 0xcd, 0x71, 0x1f, 0x69, 0x8b, 0x29, 0x4a, 0xb7, 0x61, 0xa3, 0x04, 0x13, + 0x1c, 0x7f, 0x08, 0x4f, 0x9d, 0x3b, 0xb0, 0x90, 0x8a, 0xd8, 0xcf, 0x3d, 0x0a, 0xe5, 0x07, 0x05, + 0x28, 0xe9, 0x9c, 0x07, 0xe4, 0x93, 0x09, 0xb3, 0x49, 0xa9, 0xfa, 0x51, 0xe3, 0x71, 0x93, 0x3d, + 0xbf, 0xf9, 0xf0, 0xa8, 0xbc, 0xa0, 0x91, 0x53, 0x26, 0x90, 0x2b, 0x50, 0xe8, 0x05, 0xed, 0xf4, + 0xb9, 0xe8, 0x0e, 0x6e, 0x22, 0x2b, 0x27, 0x0f, 0xd2, 0x76, 0x8b, 0xad, 0x9c, 0xf2, 0x34, 0x88, + 0x03, 0xc4, 0x60, 0x7b, 0x05, 0xdb, 0x25, 0x77, 0xfc, 0xe6, 0x61, 0xfa, 0x31, 0x94, 0xaa, 0xdf, + 0x3c, 0x44, 0x0e, 0x21, 0xaf, 0xc3, 0x7c, 0xe4, 0x76, 0xa8, 0xdf, 0x8b, 0xcc, 0x27, 0xa2, 0x0b, + 0xf1, 0x0d, 0xf4, 0x76, 0x02, 0x8a, 0x29, 0x6c, 0xb6, 0xcb, 0xde, 0x0b, 0x7d, 0x8f, 0x27, 0x2b, + 0x9d, 0x4a, 0x5e, 0x57, 0xdd, 0xac, 0xbf, 0x75, 0x8b, 0x9b, 0x6f, 0x34, 0x06, 0xc3, 0x76, 0x79, + 0x18, 0x6e, 0x40, 0xa5, 0x03, 0xc8, 0x62, 0xac, 0x8f, 0x8b, 0x72, 0xd4, 0x18, 0x64, 0x5d, 0xd0, + 0x66, 0xd2, 0xf2, 0x1d, 0x65, 0xae, 0xfa, 0xbc, 0xa2, 0xcb, 0xca, 0x1e, 0x1e, 0x9d, 0x60, 0x58, + 0xd3, 0x35, 0xed, 0x3b, 0xb0, 0x90, 0x6a, 0x30, 0x75, 0x8e, 0xb5, 0xb2, 0xcf, 0xb1, 0xc3, 0xbd, + 0x5f, 0xf2, 0xaf, 0x2d, 0x38, 0xdf, 0xb7, 0x04, 0x0c, 0x1b, 0x64, 0x95, 0xde, 0x8c, 0x26, 0x4e, + 0xbf, 0x19, 0x15, 0x46, 0xdb, 0x8c, 0xaa, 0x3b, 0xdf, 0xf9, 0xfe, 0xd5, 0x27, 0xbe, 0xfb, 0xfd, + 0xab, 0x4f, 0xfc, 0xc9, 0xf7, 0xaf, 0x3e, 0xf1, 0xfe, 0xf1, 0x55, 0xeb, 0x3b, 0xc7, 0x57, 0xad, + 0xef, 0x1e, 0x5f, 0xb5, 0xfe, 0xe4, 0xf8, 0xaa, 0xf5, 0x9f, 0x8f, 0xaf, 0x5a, 0xdf, 0xfc, 0xc1, + 0xd5, 0x27, 0x3e, 0xfb, 0xe9, 0x78, 0x80, 0xae, 0xaa, 0x01, 0xca, 0x7f, 0x7c, 0x4c, 0x0d, 0xc7, + 0xd5, 0xee, 0x7e, 0x6b, 0x95, 0x0d, 0xd0, 0x55, 0x5d, 0xa2, 0x06, 0xe8, 0xff, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x07, 0x71, 0xea, 0xe7, 0x41, 0x9c, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -3987,6 +4022,77 @@ func (m *AnalysisRunList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AnalysisRunMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AnalysisRunMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AnalysisRunMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Annotations) > 0 { + keysForAnnotations := make([]string, 0, len(m.Annotations)) + for k := range m.Annotations { + keysForAnnotations = append(keysForAnnotations, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) + for iNdEx := len(keysForAnnotations) - 1; iNdEx >= 0; iNdEx-- { + v := m.Annotations[string(keysForAnnotations[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForAnnotations[iNdEx]) + copy(dAtA[i:], keysForAnnotations[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAnnotations[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Labels) > 0 { + keysForLabels := make([]string, 0, len(m.Labels)) + for k := range m.Labels { + keysForLabels = append(keysForLabels, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) + for iNdEx := len(keysForLabels) - 1; iNdEx >= 0; iNdEx-- { + v := m.Labels[string(keysForLabels[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForLabels[iNdEx]) + copy(dAtA[i:], keysForLabels[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForLabels[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *AnalysisRunSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7675,6 +7781,16 @@ func (m *RolloutAnalysis) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.AnalysisRunMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a if len(m.MeasurementRetention) > 0 { for iNdEx := len(m.MeasurementRetention) - 1; iNdEx >= 0; iNdEx-- { { @@ -9877,6 +9993,31 @@ func (m *AnalysisRunList) Size() (n int) { return n } +func (m *AnalysisRunMetadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Labels) > 0 { + for k, v := range m.Labels { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.Annotations) > 0 { + for k, v := range m.Annotations { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + func (m *AnalysisRunSpec) Size() (n int) { if m == nil { return 0 @@ -11276,6 +11417,8 @@ func (m *RolloutAnalysis) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + l = m.AnalysisRunMetadata.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -12103,6 +12246,37 @@ func (this *AnalysisRunList) String() string { }, "") return s } +func (this *AnalysisRunMetadata) String() string { + if this == nil { + return "nil" + } + keysForLabels := make([]string, 0, len(this.Labels)) + for k := range this.Labels { + keysForLabels = append(keysForLabels, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) + mapStringForLabels := "map[string]string{" + for _, k := range keysForLabels { + mapStringForLabels += fmt.Sprintf("%v: %v,", k, this.Labels[k]) + } + mapStringForLabels += "}" + keysForAnnotations := make([]string, 0, len(this.Annotations)) + for k := range this.Annotations { + keysForAnnotations = append(keysForAnnotations, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) + mapStringForAnnotations := "map[string]string{" + for _, k := range keysForAnnotations { + mapStringForAnnotations += fmt.Sprintf("%v: %v,", k, this.Annotations[k]) + } + mapStringForAnnotations += "}" + s := strings.Join([]string{`&AnalysisRunMetadata{`, + `Labels:` + mapStringForLabels + `,`, + `Annotations:` + mapStringForAnnotations + `,`, + `}`, + }, "") + return s +} func (this *AnalysisRunSpec) String() string { if this == nil { return "nil" @@ -13162,6 +13336,7 @@ func (this *RolloutAnalysis) String() string { `Args:` + repeatedStringForArgs + `,`, `DryRun:` + repeatedStringForDryRun + `,`, `MeasurementRetention:` + repeatedStringForMeasurementRetention + `,`, + `AnalysisRunMetadata:` + strings.Replace(strings.Replace(this.AnalysisRunMetadata.String(), "AnalysisRunMetadata", "AnalysisRunMetadata", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -14386,27 +14561,146 @@ func (m *AnalysisRunArgument) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", 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.ValueFrom == nil { + m.ValueFrom = &ArgumentValueFrom{} + } + if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AnalysisRunList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AnalysisRunList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AnalysisRunList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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 } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -14433,10 +14727,8 @@ func (m *AnalysisRunArgument) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ValueFrom == nil { - m.ValueFrom = &ArgumentValueFrom{} - } - if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, AnalysisRun{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -14461,7 +14753,7 @@ func (m *AnalysisRunArgument) Unmarshal(dAtA []byte) error { } return nil } -func (m *AnalysisRunList) Unmarshal(dAtA []byte) error { +func (m *AnalysisRunMetadata) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14484,15 +14776,15 @@ func (m *AnalysisRunList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AnalysisRunList: wiretype end group for non-group") + return fmt.Errorf("proto: AnalysisRunMetadata: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AnalysisRunList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AnalysisRunMetadata: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -14519,13 +14811,107 @@ func (m *AnalysisRunList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + if m.Labels == nil { + m.Labels = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.Labels[mapkey] = mapvalue iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Annotations", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -14552,10 +14938,103 @@ func (m *AnalysisRunList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, AnalysisRun{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + if m.Annotations == nil { + m.Annotations = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.Annotations[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -26312,6 +26791,39 @@ func (m *RolloutAnalysis) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AnalysisRunMetadata", 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 err := m.AnalysisRunMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex 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 30e6874d3c..186c4ccc41 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -101,6 +101,17 @@ message AnalysisRunList { repeated AnalysisRun items = 2; } +// AnalysisRunMetadata extra labels to add to the AnalysisRun +message AnalysisRunMetadata { + // Labels Additional labels to add to the AnalysisRun + // +optional + map labels = 1; + + // Annotations additional annotations to add to the AnalysisRun + // +optional + map annotations = 2; +} + // AnalysisRunSpec is the spec for a AnalysisRun resource message AnalysisRunSpec { // Metrics contains the list of metrics to query as part of an analysis run @@ -1154,6 +1165,10 @@ message RolloutAnalysis { // +patchStrategy=merge // +optional repeated MeasurementRetention measurementRetention = 4; + + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + optional AnalysisRunMetadata analysisRunMetadata = 5; } // RolloutAnalysisBackground defines a template that is used to create a background analysisRun diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 6cd83f8ed1..d857f05559 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -36,6 +36,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRun": schema_pkg_apis_rollouts_v1alpha1_AnalysisRun(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunArgument(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunList": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunList(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunMetadata(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunSpec": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunStatus": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunStatus(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunStrategy": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunStrategy(ref), @@ -388,6 +389,51 @@ func schema_pkg_apis_rollouts_v1alpha1_AnalysisRunList(ref common.ReferenceCallb } } +func schema_pkg_apis_rollouts_v1alpha1_AnalysisRunMetadata(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "AnalysisRunMetadata extra labels to add to the AnalysisRun", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "labels": { + SchemaProps: spec.SchemaProps{ + Description: "Labels Additional labels to add to the AnalysisRun", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "annotations": { + SchemaProps: spec.SchemaProps{ + Description: "Annotations additional annotations to add to the AnalysisRun", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_AnalysisRunSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3518,11 +3564,18 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysis(ref common.ReferenceCallb }, }, }, + "analysisRunMetadata": { + SchemaProps: spec.SchemaProps{ + Description: "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, } } @@ -3607,6 +3660,13 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref common.Refe }, }, }, + "analysisRunMetadata": { + SchemaProps: spec.SchemaProps{ + Description: "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata"), + }, + }, "startingStep": { SchemaProps: spec.SchemaProps{ Description: "StartingStep indicates which step the background analysis should start on If not listed, controller defaults to 0", @@ -3618,7 +3678,7 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref common.Refe }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, } } diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index 0e5c192be1..a3804ccddd 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -578,6 +578,16 @@ type PodTemplateMetadata struct { Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,2,rep,name=annotations"` } +// AnalysisRunMetadata extra labels to add to the AnalysisRun +type AnalysisRunMetadata struct { + // Labels Additional labels to add to the AnalysisRun + // +optional + Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,1,rep,name=labels"` + // Annotations additional annotations to add to the AnalysisRun + // +optional + Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,2,rep,name=annotations"` +} + // ReplicaSetSpecRef defines which RS that the experiment's template will use. type ReplicaSetSpecRef string @@ -701,6 +711,9 @@ type RolloutAnalysis struct { // +patchStrategy=merge // +optional MeasurementRetention []MeasurementRetention `json:"measurementRetention,omitempty" patchStrategy:"merge" patchMergeKey:"metricName" protobuf:"bytes,4,rep,name=measurementRetention"` + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + AnalysisRunMetadata AnalysisRunMetadata `json:"analysisRunMetadata,omitempty" protobuf:"bytes,5,opt,name=analysisRunMetadata"` } type RolloutAnalysisTemplate struct { diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index c787ce9216..e9f7e9a05e 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -172,6 +172,36 @@ func (in *AnalysisRunList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AnalysisRunMetadata) DeepCopyInto(out *AnalysisRunMetadata) { + *out = *in + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AnalysisRunMetadata. +func (in *AnalysisRunMetadata) DeepCopy() *AnalysisRunMetadata { + if in == nil { + return nil + } + out := new(AnalysisRunMetadata) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AnalysisRunSpec) DeepCopyInto(out *AnalysisRunSpec) { *out = *in @@ -1966,6 +1996,7 @@ func (in *RolloutAnalysis) DeepCopyInto(out *RolloutAnalysis) { *out = make([]MeasurementRetention, len(*in)) copy(*out, *in) } + in.AnalysisRunMetadata.DeepCopyInto(&out.AnalysisRunMetadata) return } diff --git a/rollout/analysis.go b/rollout/analysis.go index 339aa3fec6..912237d9c3 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -457,9 +457,15 @@ func (c *rolloutContext) newAnalysisRunFromRollout(rolloutAnalysis *v1alpha1.Rol return nil, err } run.Labels = labels + for k, v := range rolloutAnalysis.AnalysisRunMetadata.Labels { + run.Labels[k] = v + } run.Annotations = map[string]string{ annotations.RevisionAnnotation: revision, } + for k, v := range rolloutAnalysis.AnalysisRunMetadata.Annotations { + run.Annotations[k] = v + } run.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(c.rollout, controllerKind)} return run, nil } diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index 87a30123ff..f6fa6c4bf2 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -2336,3 +2336,54 @@ func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { newConditions := updateConditionsPatch(*r2, progressingFalseAborted) assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } + +func TestCreateAnalysisRunWithCustomAnalysisRunMetadata(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(10), + }} + at := analysisTemplate("bar") + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r2 := bumpVersion(r1) + ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) + r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ + RolloutAnalysis: v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.RolloutAnalysisTemplate{ + { + TemplateName: at.Name, + }, + }, + AnalysisRunMetadata: v1alpha1.AnalysisRunMetadata{ + Annotations: map[string]string{"testAnnotationKey": "testAnnotationValue"}, + Labels: map[string]string{"testLabelKey": "testLabelValue"}, + }, + }, + } + + rs1 := newReplicaSetWithStatus(r1, 10, 10) + rs2 := newReplicaSetWithStatus(r2, 0, 0) + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 10, 0, 10, false) + _, _ = newProgressingCondition(conditions.ReplicaSetUpdatedReason, rs2, "") + + f.rolloutLister = append(f.rolloutLister, r2) + f.analysisTemplateLister = append(f.analysisTemplateLister, at) + f.objects = append(f.objects, r2, at) + + createdIndex := f.expectCreateAnalysisRunAction(ar) + f.expectUpdateReplicaSetAction(rs2) + _ = f.expectPatchRolloutAction(r1) + + f.run(getKey(r2, t)) + createdAr := f.getCreatedAnalysisRun(createdIndex) + expectedArName := fmt.Sprintf("%s-%s-%s", r2.Name, rs2PodHash, "2") + assert.Equal(t, expectedArName, createdAr.Name) + assert.Equal(t, "testAnnotationValue", createdAr.Annotations["testAnnotationKey"]) + assert.Equal(t, "testLabelValue", createdAr.Labels["testLabelKey"]) +} diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 4146a6b4cc..a4064899f4 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -177,6 +177,25 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun */ valueFrom?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ArgumentValueFrom; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata { + /** + * + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata + */ + labels?: { [key: string]: string; }; + /** + * + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata + */ + annotations?: { [key: string]: string; }; +} /** * * @export @@ -1037,6 +1056,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnal * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysis */ measurementRetention?: Array; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysis + */ + analysisRunMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata; } /** * From c8c947bc0ed0ff3751409677cac69e290b6faeb4 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 5 May 2023 09:29:54 -0500 Subject: [PATCH 032/159] fix: istio dropping fields during removing of managed routes (#2692) * fix for dropping fields during removing routes Signed-off-by: zachaller * add comment and rename Signed-off-by: zachaller * add a light weight cast check Signed-off-by: zachaller * improve logic by adding type casting check Signed-off-by: zachaller * add docs Signed-off-by: zachaller --------- Signed-off-by: zachaller --- rollout/trafficrouting/istio/istio.go | 26 +++++++++++++--------- rollout/trafficrouting/istio/istio_test.go | 21 +++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index c13426782b..0449c62dff 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -1391,8 +1391,8 @@ func (r *Reconciler) orderRoutes(istioVirtualService *unstructured.Unstructured) // splitManagedRoutesAndNonManagedRoutes This splits the routes from an istio virtual service into two slices // one slice contains all the routes that are also in the rollouts managedRoutes object and one that contains routes // that where only in the virtual service (aka routes that where manually added by user) -func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes, httpRouteI []interface{}) (httpRoutesWithinManagedRoutes []VirtualServiceHTTPRoute, httpRoutesNotWithinManagedRoutes []VirtualServiceHTTPRoute, err error) { - var httpRoutes []VirtualServiceHTTPRoute +func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes, httpRouteI []interface{}) (httpRoutesWithinManagedRoutes []map[string]interface{}, httpRoutesNotWithinManagedRoutes []map[string]interface{}, err error) { + var httpRoutes []map[string]interface{} jsonHttpRoutes, err := json.Marshal(httpRouteI) if err != nil { @@ -1406,7 +1406,10 @@ func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes for _, route := range httpRoutes { var found bool = false for _, managedRoute := range managedRoutes { - if route.Name == managedRoute.Name { + // Not checking the cast success here is ok because it covers the case when the route has no name + // when there is no name the cast return an empty string and will just not match the managed route + name, _ := route["name"].(string) + if name == managedRoute.Name { httpRoutesWithinManagedRoutes = append(httpRoutesWithinManagedRoutes, route) found = true break @@ -1423,11 +1426,11 @@ func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes // getOrderedVirtualServiceRoutes This returns an []interface{} of istio virtual routes where the routes are ordered based // on the rollouts managedRoutes field. We take the routes from the rollouts managedRoutes field order them and place them on top // of routes that are manually defined within the virtual service (aka. routes that users have defined manually) -func getOrderedVirtualServiceRoutes(httpRouteI []interface{}, managedRoutes []v1alpha1.MangedRoutes, httpRoutesWithinManagedRoutes []VirtualServiceHTTPRoute, httpRoutesNotWithinManagedRoutes []VirtualServiceHTTPRoute) ([]interface{}, error) { - var orderedManagedRoutes []VirtualServiceHTTPRoute +func getOrderedVirtualServiceRoutes(httpRouteI []interface{}, managedRoutes []v1alpha1.MangedRoutes, httpRoutesWithinManagedRoutes []map[string]interface{}, httpRoutesNotWithinManagedRoutes []map[string]interface{}) ([]interface{}, error) { + var orderedManagedRoutes []map[string]interface{} for _, route := range managedRoutes { for _, managedRoute := range httpRoutesWithinManagedRoutes { - if route.Name == managedRoute.Name { + if route.Name == managedRoute["name"] { orderedManagedRoutes = append(orderedManagedRoutes, managedRoute) } } @@ -1436,13 +1439,16 @@ func getOrderedVirtualServiceRoutes(httpRouteI []interface{}, managedRoutes []v1 orderedVirtualServiceHTTPRoutes := append(orderedManagedRoutes, httpRoutesNotWithinManagedRoutes...) var orderedInterfaceVSVCHTTPRoutes []interface{} - for _, routeTyped := range orderedVirtualServiceHTTPRoutes { + for _, routeMap := range orderedVirtualServiceHTTPRoutes { for _, route := range httpRouteI { r := route.(map[string]interface{}) - // No need to check if exist because the empty string returned on cast failure is good for this check - name, _ := r["name"].(string) - if name == routeTyped.Name { + // Not checking the cast success here is ok because it covers the case when the route has no name + name, rNameOK := r["name"].(string) + routeMapName, RMapNameOK := routeMap["name"].(string) + // The second or clause is for the case when we have a route that has no name set because this field + // is optional in istio virtual service if there is only one route + if name == routeMapName || (!rNameOK && !RMapNameOK) { orderedInterfaceVSVCHTTPRoutes = append(orderedInterfaceVSVCHTTPRoutes, route) } } diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index fa4330f363..b13d472944 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -883,6 +883,27 @@ func TestHttpReconcileHeaderRouteWithExtra(t *testing.T) { _, found = r2["corsPolicy"] assert.True(t, found) + r.RemoveManagedRoutes() + iVirtualService, err = client.Resource(istioutil.GetIstioVirtualServiceGVR()).Namespace(r.rollout.Namespace).Get(context.TODO(), ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name, metav1.GetOptions{}) + assert.NoError(t, err) + + routes, found, err = unstructured.NestedSlice(iVirtualService.Object, "spec", "http") + assert.NoError(t, err) + assert.True(t, found) + + r0 = routes[0].(map[string]interface{}) + route, found = r0["route"].([]interface{}) + assert.True(t, found) + + port1 = route[0].(map[string]interface{})["destination"].(map[string]interface{})["port"].(map[string]interface{})["number"] + assert.True(t, port1 == float64(8443)) + + r2 = routes[1].(map[string]interface{}) + _, found = r2["retries"] + assert.True(t, found) + _, found = r2["corsPolicy"] + assert.True(t, found) + } func TestReconcileUpdateHeader(t *testing.T) { From d2f7ad44e23970f55ce0d1deff898aa9d91327ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 10:10:38 -0500 Subject: [PATCH 033/159] chore(deps): bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 (#2754) chore(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.15.0 to 1.15.1. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.15.0...v1.15.1) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a5f56e4961..e64fd9a5b2 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.15.0 + github.com/prometheus/client_golang v1.15.1 github.com/prometheus/client_model v0.3.0 github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 diff --git a/go.sum b/go.sum index 076313fc26..8fc0a138c7 100644 --- a/go.sum +++ b/go.sum @@ -593,8 +593,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= -github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= From 4e42def8f7e59d3e79992e19f2ec0f0bec8359dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 10:11:00 -0500 Subject: [PATCH 034/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 (#2757) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.10 to 1.19.11. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.10...service/efs/v1.19.11) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e64fd9a5b2..f55459aebd 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.18.0 github.com/aws/aws-sdk-go-v2/config v1.18.22 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index 8fc0a138c7..c42647f156 100644 --- a/go.sum +++ b/go.sum @@ -117,8 +117,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIo github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 h1:m7nFc1xk7O5vriDJc6lymQLbfIHbW4sjNTrjcnDpQlM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10 h1:RnL6Jg/DG9CAnY0MP9D0vJYQB3vv/gkKzJPw9nCqeo8= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.10/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLmhIEL5e3o+tY9JsLFSAxmjgM8gI7W2+CPrpw= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 h1:GAiaQWuQhQQui76KjuXeShmyXqECwQ0mGRMc/rwsL+c= From 1f89c16082bd62f48229b7a2452b0a52495d5b3d Mon Sep 17 00:00:00 2001 From: Dmitriy Mann <2284562+mdsjip@users.noreply.github.com> Date: Fri, 5 May 2023 18:04:49 +0200 Subject: [PATCH 035/159] fix(analysis): Graphite metric provider - index out of range [0] with length 0 (#2751) fix(analysis): graphite metric provider - index out of range [0] with length 0 Signed-off-by: mdsjip <2284562+mdsjip@users.noreply.github.com> --- metricproviders/graphite/api.go | 4 ++++ metricproviders/graphite/api_test.go | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/metricproviders/graphite/api.go b/metricproviders/graphite/api.go index b296295152..fc304395b1 100644 --- a/metricproviders/graphite/api.go +++ b/metricproviders/graphite/api.go @@ -68,6 +68,10 @@ func (api APIClient) Query(quer string) ([]dataPoint, error) { return []dataPoint{}, err } + if len(result) == 0 { + return []dataPoint{}, nil + } + return result[0].DataPoints, nil } diff --git a/metricproviders/graphite/api_test.go b/metricproviders/graphite/api_test.go index ce947da92f..bca62bbae2 100644 --- a/metricproviders/graphite/api_test.go +++ b/metricproviders/graphite/api_test.go @@ -82,6 +82,15 @@ func TestQuery(t *testing.T) { } ]`, value, timestamp), 200, + }, { + "graphite response with empty array", + query, + targetQuery, + fromQuery, + []dataPoint{}, + nil, + `[]`, + 200, }, { "graphite response body with invalid JSON", query, From 5910b3acf352019e1aed4a37a33a160edbee204a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 11:09:04 -0500 Subject: [PATCH 036/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 (#2755) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.25.10 to 1.26.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/polly/v1.25.10...service/s3/v1.26.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f55459aebd..79bb558096 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 github.com/aws/aws-sdk-go-v2/config v1.18.22 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index c42647f156..e9ee73315c 100644 --- a/go.sum +++ b/go.sum @@ -115,8 +115,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7im github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10 h1:m7nFc1xk7O5vriDJc6lymQLbfIHbW4sjNTrjcnDpQlM= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.25.10/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 h1:sSzrsKQULJmPtmu6By4wR6g0701nGqonssKOy35uOd0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLmhIEL5e3o+tY9JsLFSAxmjgM8gI7W2+CPrpw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= From deb48388857fd4f5eb220e1343f857638fcef1a2 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Sat, 6 May 2023 00:30:50 +0800 Subject: [PATCH 037/159] chore(deps): replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` (#2681) At the time of making this commit, the package `github.com/ghodss/yaml` is no longer actively maintained. `sigs.k8s.io/yaml` is a permanent fork of `ghodss/yaml` and is actively maintained by Kubernetes SIG. Signed-off-by: Eng Zer Jun Signed-off-by: zachaller Co-authored-by: zachaller --- controller/metrics/analysis_test.go | 2 +- controller/metrics/experiment_test.go | 2 +- controller/metrics/rollout_test.go | 2 +- go.mod | 7 +++---- hack/gen-crd-spec/main.go | 2 +- pkg/kubectl-argo-rollouts/cmd/create/create.go | 4 ++-- pkg/kubectl-argo-rollouts/cmd/lint/lint.go | 2 +- pkg/kubectl-argo-rollouts/info/testdata/testdata.go | 2 +- rollout/controller_test.go | 2 +- test/fixtures/common.go | 2 +- test/fixtures/given.go | 2 +- test/fixtures/when.go | 2 +- test/util/util.go | 2 +- utils/config/config.go | 2 +- utils/replicaset/replicaset_test.go | 2 +- utils/unstructured/unstructured.go | 2 +- 16 files changed, 19 insertions(+), 20 deletions(-) diff --git a/controller/metrics/analysis_test.go b/controller/metrics/analysis_test.go index 942c165209..fb033e776d 100644 --- a/controller/metrics/analysis_test.go +++ b/controller/metrics/analysis_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" - "github.com/ghodss/yaml" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) diff --git a/controller/metrics/experiment_test.go b/controller/metrics/experiment_test.go index 4335af6fe0..5694fc9830 100644 --- a/controller/metrics/experiment_test.go +++ b/controller/metrics/experiment_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/assert" - "github.com/ghodss/yaml" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/prometheus/client_golang/prometheus" diff --git a/controller/metrics/rollout_test.go b/controller/metrics/rollout_test.go index dd48969e52..17f86b011f 100644 --- a/controller/metrics/rollout_test.go +++ b/controller/metrics/rollout_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" - "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/conditions" diff --git a/go.mod b/go.mod index 79bb558096..a27485f04f 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 - github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 @@ -21,6 +20,7 @@ require ( github.com/hashicorp/go-plugin v1.4.9 github.com/influxdata/influxdb-client-go/v2 v2.12.3 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 v1.1.0 github.com/pkg/errors v0.9.1 @@ -53,7 +53,7 @@ require ( k8s.io/kubectl v0.25.8 k8s.io/kubernetes v1.25.8 k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 - + sigs.k8s.io/yaml v1.3.0 ) require ( @@ -104,6 +104,7 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.7.0 // indirect github.com/felixge/httpsnoop v1.0.3 // 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.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect @@ -136,7 +137,6 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lunixbochs/vtclean v1.0.0 // indirect - github.com/machinebox/graphql v0.2.2 github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect @@ -190,7 +190,6 @@ require ( sigs.k8s.io/kustomize/api v0.12.1 // indirect sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) replace ( diff --git a/hack/gen-crd-spec/main.go b/hack/gen-crd-spec/main.go index 89f8cb59a9..aa615687d9 100644 --- a/hack/gen-crd-spec/main.go +++ b/hack/gen-crd-spec/main.go @@ -13,11 +13,11 @@ import ( unstructuredutil "github.com/argoproj/argo-rollouts/utils/unstructured" "github.com/blang/semver" - "github.com/ghodss/yaml" extensionsobj "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kubeopenapiutil "k8s.io/kube-openapi/pkg/util" spec "k8s.io/kube-openapi/pkg/validation/spec" + "sigs.k8s.io/yaml" ) const metadataValidation = `properties: diff --git a/pkg/kubectl-argo-rollouts/cmd/create/create.go b/pkg/kubectl-argo-rollouts/cmd/create/create.go index f00f4ebd86..f5dccb4932 100644 --- a/pkg/kubectl-argo-rollouts/cmd/create/create.go +++ b/pkg/kubectl-argo-rollouts/cmd/create/create.go @@ -10,12 +10,12 @@ import ( "strings" "unicode" - "github.com/ghodss/yaml" "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/utils/pointer" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -54,7 +54,7 @@ const ( createAnalysisRunExample = ` # Create an AnalysisRun from a local AnalysisTemplate file %[1]s create analysisrun --from-file my-analysis-template.yaml - + # Create an AnalysisRun from a AnalysisTemplate in the cluster %[1]s create analysisrun --from my-analysis-template diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/lint.go b/pkg/kubectl-argo-rollouts/cmd/lint/lint.go index d31c5d3547..cf1b3cdb36 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/lint.go +++ b/pkg/kubectl-argo-rollouts/cmd/lint/lint.go @@ -11,7 +11,6 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/validation" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/options" ingressutil "github.com/argoproj/argo-rollouts/utils/ingress" - "github.com/ghodss/yaml" "github.com/spf13/cobra" goyaml "gopkg.in/yaml.v2" v1 "k8s.io/api/core/v1" @@ -19,6 +18,7 @@ import ( networkingv1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/yaml" ) type LintOptions struct { diff --git a/pkg/kubectl-argo-rollouts/info/testdata/testdata.go b/pkg/kubectl-argo-rollouts/info/testdata/testdata.go index a0f5911998..c455392f61 100644 --- a/pkg/kubectl-argo-rollouts/info/testdata/testdata.go +++ b/pkg/kubectl-argo-rollouts/info/testdata/testdata.go @@ -6,11 +6,11 @@ import ( "runtime" "time" - "github.com/ghodss/yaml" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" k8sruntime "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) diff --git a/rollout/controller_test.go b/rollout/controller_test.go index a0177abccc..00f811617c 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -11,7 +11,6 @@ import ( "testing" "time" - "github.com/ghodss/yaml" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" @@ -36,6 +35,7 @@ import ( "k8s.io/client-go/util/workqueue" corev1defaults "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/utils/pointer" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/controller/metrics" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" diff --git a/test/fixtures/common.go b/test/fixtures/common.go index 6ca0619d59..c16df649e3 100644 --- a/test/fixtures/common.go +++ b/test/fixtures/common.go @@ -14,7 +14,6 @@ import ( a6util "github.com/argoproj/argo-rollouts/utils/apisix" - "github.com/ghodss/yaml" smiv1alpha1 "github.com/servicemeshinterface/smi-sdk-go/pkg/apis/split/v1alpha1" smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned" "github.com/sirupsen/logrus" @@ -31,6 +30,7 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" diff --git a/test/fixtures/given.go b/test/fixtures/given.go index 5ecdcee3d3..19e7552f60 100644 --- a/test/fixtures/given.go +++ b/test/fixtures/given.go @@ -4,9 +4,9 @@ import ( "context" "strings" - "github.com/ghodss/yaml" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/yaml" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) diff --git a/test/fixtures/when.go b/test/fixtures/when.go index 40998dc73f..dbb90fc49e 100644 --- a/test/fixtures/when.go +++ b/test/fixtures/when.go @@ -9,7 +9,6 @@ import ( "strconv" "time" - "github.com/ghodss/yaml" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -23,6 +22,7 @@ import ( "k8s.io/client-go/tools/cache" watchutil "k8s.io/client-go/tools/watch" retryutil "k8s.io/client-go/util/retry" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apiclient/rollout" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" diff --git a/test/util/util.go b/test/util/util.go index 9868da6bff..071aca3f7b 100644 --- a/test/util/util.go +++ b/test/util/util.go @@ -3,11 +3,11 @@ package util import ( "os" - "github.com/ghodss/yaml" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" dynamicfake "k8s.io/client-go/dynamic/fake" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" diff --git a/utils/config/config.go b/utils/config/config.go index a7338cf2ab..7989374e8e 100644 --- a/utils/config/config.go +++ b/utils/config/config.go @@ -11,9 +11,9 @@ import ( "github.com/argoproj/argo-rollouts/utils/defaults" "github.com/argoproj/argo-rollouts/utils/plugin/types" - "github.com/ghodss/yaml" v1 "k8s.io/api/core/v1" k8errors "k8s.io/apimachinery/pkg/api/errors" + "sigs.k8s.io/yaml" ) // Config is the in memory representation of the configmap with some additional fields/functions for ease of use. diff --git a/utils/replicaset/replicaset_test.go b/utils/replicaset/replicaset_test.go index 5a7c7ff8c1..40c7d1ae2c 100644 --- a/utils/replicaset/replicaset_test.go +++ b/utils/replicaset/replicaset_test.go @@ -8,7 +8,6 @@ import ( "testing" "time" - "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -19,6 +18,7 @@ import ( k8sfake "k8s.io/client-go/kubernetes/fake" "k8s.io/kubernetes/pkg/controller" "k8s.io/utils/pointer" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/annotations" diff --git a/utils/unstructured/unstructured.go b/utils/unstructured/unstructured.go index 12e1034755..7c73812da3 100644 --- a/utils/unstructured/unstructured.go +++ b/utils/unstructured/unstructured.go @@ -3,10 +3,10 @@ package unstructured import ( "regexp" - "github.com/ghodss/yaml" log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" logutil "github.com/argoproj/argo-rollouts/utils/log" From 87f55e784fa8e79a4b6e9d560c11e15fa28d9d47 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 5 May 2023 11:42:44 -0500 Subject: [PATCH 038/159] chore: add zachaller as lead in owers file (#2759) add myself as owner Signed-off-by: zachaller --- OWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OWNERS b/OWNERS index 32b790229c..3596fb62b3 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,7 @@ owners: - alexmt - jessesuen +- zachaller approvers: - alexmt @@ -8,7 +9,6 @@ approvers: - jessesuen - khhirani - leoluz -- zachaller reviewers: - agrawroh From c74c464767ed1330f205da7f7f733c9328e151bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 14:20:44 -0500 Subject: [PATCH 039/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 (#2756) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.22 to 1.18.23. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.22...config/v1.18.23) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index a27485f04f..31b8c3084a 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.22 + github.com/aws/aws-sdk-go-v2/config v1.18.23 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.22 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.11 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index e9ee73315c..2c62cd57ff 100644 --- a/go.sum +++ b/go.sum @@ -103,10 +103,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.22 h1:7vkUEmjjv+giht4wIROqLs+49VWmiQMMHSduxmoNKLU= -github.com/aws/aws-sdk-go-v2/config v1.18.22/go.mod h1:mN7Li1wxaPxSSy4Xkr6stFuinJGf3VZW3ZSNvO0q6sI= -github.com/aws/aws-sdk-go-v2/credentials v1.13.21 h1:VRiXnPEaaPeGeoFcXvMZOB5K/yfIXOYE3q97Kgb0zbU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.21/go.mod h1:90Dk1lJoMyspa/EDUrldTxsPns0wn6+KpRKpdAWc0uA= +github.com/aws/aws-sdk-go-v2/config v1.18.23 h1:gc3lPsAnZpwfi2exupmgHfva0JiAY2BWDg5JWYlmA28= +github.com/aws/aws-sdk-go-v2/config v1.18.23/go.mod h1:rx0ruaQ+gk3OrLFHRRx56lA//XxP8K8uPzeNiKNuWVY= +github.com/aws/aws-sdk-go-v2/credentials v1.13.22 h1:Hp9rwJS4giQ48xqonRV/s7QcDf/wxF6UY7osRmBabvI= +github.com/aws/aws-sdk-go-v2/credentials v1.13.22/go.mod h1:BfNcm6A9nSd+bzejDcMJ5RE+k6WbkCwWkQil7q4heRk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= @@ -121,12 +121,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLm github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 h1:GAiaQWuQhQQui76KjuXeShmyXqECwQ0mGRMc/rwsL+c= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.9/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9 h1:TraLwncRJkWqtIBVKI/UqBymq4+hL+3MzUOtUATuzkA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.10 h1:6UbNM/KJhMBfOI5+lpVcJ/8OA7cBSz0O6OX37SRKlSw= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.10/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGXsLBI6al083tpjJzY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.11 h1:uBE+Zj478pfxV98L6SEpvxYiADNjTlMNY714PJLE7uo= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.11/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From a9fcd2d907ab29f417957b586cfdab0c444caa2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 11:48:14 -0500 Subject: [PATCH 040/159] docs: Update Changelog (#2765) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a248152a83..5b1c180bc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,24 @@ + +## [v1.5.0](https://github.com/argoproj/argo-rollouts/compare/v1.5.0-rc1...v1.5.0) (2023-05-05) + +### Chore + +* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) + +### Docs + +* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) +* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) + +### Fix + +* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) +* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) +* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) +* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) + + ## [v1.5.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.4.1...v1.5.0-rc1) (2023-03-27) From a7852bae84b6e72b2cbd634e28bb6805a46843bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 11:49:13 -0500 Subject: [PATCH 041/159] chore(deps): bump google.golang.org/grpc from 1.54.0 to 1.55.0 (#2763) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.54.0 to 1.55.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.54.0...v1.55.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 31b8c3084a..9131d5ce52 100644 --- a/go.mod +++ b/go.mod @@ -36,8 +36,8 @@ require ( github.com/stretchr/testify v1.8.2 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f - google.golang.org/grpc v1.54.0 + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 + google.golang.org/grpc v1.55.0 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 @@ -57,7 +57,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.15.1 // indirect + cloud.google.com/go/compute v1.18.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect @@ -111,7 +111,7 @@ require ( github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect github.com/golang-jwt/jwt/v4 v4.4.3 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect @@ -170,7 +170,7 @@ require ( golang.org/x/crypto v0.5.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.5.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect golang.org/x/sys v0.7.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect diff --git a/go.sum b/go.sum index 2c62cd57ff..a51ec8dd35 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -281,8 +281,8 @@ github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -817,8 +817,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= 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= @@ -1039,8 +1039,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= 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= @@ -1056,8 +1056,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= 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= From 39dbb4cf964576ef57d1b4c60564d092c71734a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bojanowski?= Date: Tue, 9 May 2023 15:44:46 +0200 Subject: [PATCH 042/159] feat(metricprovider): allow user to define metrics.provider.job.metadata (#2762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: add labels and annotations from metrics.provider.job.metadata to created Jobs metadata Signed-off-by: Paweł Bojanowski --- docs/analysis/job.md | 5 +++++ metricproviders/job/job.go | 20 ++++++++++++------- metricproviders/job/job_test.go | 17 ++++++++++++++++ test/e2e/experiment_test.go | 5 +++++ .../rollout-experiment-analysis.yaml | 5 +++++ 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/docs/analysis/job.md b/docs/analysis/job.md index a4688c0fa3..eae1e077ca 100644 --- a/docs/analysis/job.md +++ b/docs/analysis/job.md @@ -8,6 +8,11 @@ successful if the Job completes and had an exit code of zero, otherwise it is fa - name: test provider: job: + metadata: + annotations: + foo: bar # annotations defined here will be copied to the Job object + labels: + foo: bar # labels defined here will be copied to the Job object spec: backoffLimit: 1 template: diff --git a/metricproviders/job/job.go b/metricproviders/job/job.go index 046a9b098b..6a6d866a4c 100644 --- a/metricproviders/job/job.go +++ b/metricproviders/job/job.go @@ -79,18 +79,24 @@ func getJobIDSuffix(run *v1alpha1.AnalysisRun, metricName string) int { } func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) (*batchv1.Job, error) { + jobAnnotations := metric.Provider.Job.Metadata.GetAnnotations() + jobLabels := metric.Provider.Job.Metadata.GetLabels() + if jobAnnotations == nil { + jobAnnotations = make(map[string]string) + } + if jobLabels == nil { + jobLabels = make(map[string]string) + } + jobLabels[AnalysisRunUIDLabelKey] = string(run.UID) + jobAnnotations[AnalysisRunNameAnnotationKey] = run.Name + jobAnnotations[AnalysisRunMetricAnnotationKey] = metric.Name job := batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Name: newJobName(run, metric), Namespace: run.Namespace, OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(run, analysisRunGVK)}, - Annotations: map[string]string{ - AnalysisRunNameAnnotationKey: run.Name, - AnalysisRunMetricAnnotationKey: metric.Name, - }, - Labels: map[string]string{ - AnalysisRunUIDLabelKey: string(run.UID), - }, + Annotations: jobAnnotations, + Labels: jobLabels, }, Spec: metric.Provider.Job.Spec, } diff --git a/metricproviders/job/job_test.go b/metricproviders/job/job_test.go index 98d898f84d..fd278afec8 100644 --- a/metricproviders/job/job_test.go +++ b/metricproviders/job/job_test.go @@ -122,6 +122,16 @@ func TestRun(t *testing.T) { metric := run.Spec.Metrics[0] metricsMetadata := p.GetMetadata(metric) assert.Nil(t, metricsMetadata) + providerJobMetadataLabels := map[string]string{ + "foo-label": "bar", + } + providerJobMetadataAnnotations := map[string]string{ + "foo-annotation": "bar", + } + metric.Provider.Job.Metadata = metav1.ObjectMeta{ + Labels: providerJobMetadataLabels, + Annotations: providerJobMetadataAnnotations, + } measurement := p.Run(run, metric) @@ -138,6 +148,13 @@ func TestRun(t *testing.T) { assert.NoError(t, err) assert.Equal(t, expectedName, jobs.Items[0].Name) assert.Equal(t, string(run.UID), jobs.Items[0].ObjectMeta.Labels[AnalysisRunUIDLabelKey]) + for labelKey, labelVal := range providerJobMetadataLabels { + assert.Equal(t, labelVal, jobs.Items[0].ObjectMeta.Labels[labelKey]) + } + for annotationKey, annotationVal := range providerJobMetadataAnnotations { + assert.Equal(t, annotationVal, jobs.Items[0].ObjectMeta.Annotations[annotationKey]) + } + expectedOwnerRef := []metav1.OwnerReference{*metav1.NewControllerRef(run, analysisRunGVK)} assert.Equal(t, expectedOwnerRef, jobs.Items[0].ObjectMeta.OwnerReferences) diff --git a/test/e2e/experiment_test.go b/test/e2e/experiment_test.go index 7c88a4992f..da96b9c0f2 100644 --- a/test/e2e/experiment_test.go +++ b/test/e2e/experiment_test.go @@ -64,6 +64,11 @@ func (s *ExperimentSuite) TestRolloutWithExperimentAndAnalysis() { assert.Equal(s.T(), rs1Hash, envVars[1].Value) assert.Equal(s.T(), rs2Hash, envVars[0].Value) + // verify if labels and annotations from AnalysisTemplate's .spec.metrics[0].provider.job.metadata + // are added to the Job.metadata + assert.Equal(s.T(), "bar", job.GetLabels()["foo"]) + assert.Equal(s.T(), "bar2", job.GetAnnotations()["foo2"]) + // verify the `templates.XXXXX.podTemplateHash` variables are working expRSCanaryHash := expRSCanary.Spec.Template.Labels[rov1.DefaultRolloutUniqueLabelKey] expRSBaselineHash := expRSBaseline.Spec.Template.Labels[rov1.DefaultRolloutUniqueLabelKey] diff --git a/test/e2e/functional/rollout-experiment-analysis.yaml b/test/e2e/functional/rollout-experiment-analysis.yaml index ca4dc89da1..37113c0072 100644 --- a/test/e2e/functional/rollout-experiment-analysis.yaml +++ b/test/e2e/functional/rollout-experiment-analysis.yaml @@ -13,6 +13,11 @@ spec: - name: echo-pod-hash provider: job: + metadata: + labels: + foo: bar + annotations: + foo2: bar2 spec: backoffLimit: 0 template: From 43aa1dd93a5f7d22f00cc687ebe0cb50c788c2e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 08:45:22 -0500 Subject: [PATCH 043/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 (#2768) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.23 to 1.18.24. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.23...config/v1.18.24) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 9131d5ce52..06609ec8c8 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.23 + github.com/aws/aws-sdk-go-v2/config v1.18.24 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible @@ -82,7 +82,7 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.22 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.23 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect @@ -90,7 +90,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index a51ec8dd35..a9d9f15e90 100644 --- a/go.sum +++ b/go.sum @@ -103,10 +103,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.23 h1:gc3lPsAnZpwfi2exupmgHfva0JiAY2BWDg5JWYlmA28= -github.com/aws/aws-sdk-go-v2/config v1.18.23/go.mod h1:rx0ruaQ+gk3OrLFHRRx56lA//XxP8K8uPzeNiKNuWVY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.22 h1:Hp9rwJS4giQ48xqonRV/s7QcDf/wxF6UY7osRmBabvI= -github.com/aws/aws-sdk-go-v2/credentials v1.13.22/go.mod h1:BfNcm6A9nSd+bzejDcMJ5RE+k6WbkCwWkQil7q4heRk= +github.com/aws/aws-sdk-go-v2/config v1.18.24 h1:G0mJzpMjJFtK+7KtAky2kAjio21BdzNXblQSm2ZKsy0= +github.com/aws/aws-sdk-go-v2/config v1.18.24/go.mod h1:+9/RIaxGG2let2y9lIYEwOTBhaXqArOakom2TVytvFE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.23 h1:uKTIH4RmFIo04Pijn132WEMaboVLAg96H4l2KFRGzZU= +github.com/aws/aws-sdk-go-v2/credentials v1.13.23/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGX github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.11 h1:uBE+Zj478pfxV98L6SEpvxYiADNjTlMNY714PJLE7uo= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.11/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 h1:2DQLAKDteoEDI8zpCzqBMaZlJuoE9iTYD0gFmXVax9E= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 0b412b875af8a26fe37fd07bf41b87a39cca6bf8 Mon Sep 17 00:00:00 2001 From: Dmitriy Mann <2284562+mdsjip@users.noreply.github.com> Date: Tue, 9 May 2023 15:47:02 +0200 Subject: [PATCH 044/159] fix(analysis): Graphite query - remove whitespaces (#2752) * fix(analysis): Graphite query - remove whitespaces Signed-off-by: mdsjip <2284562+mdsjip@users.noreply.github.com> * refactor(analysis): Graphite query - proper naming and regexp usage Signed-off-by: mdsjip <2284562+mdsjip@users.noreply.github.com> --------- Signed-off-by: mdsjip <2284562+mdsjip@users.noreply.github.com> --- metricproviders/graphite/api.go | 9 +++++---- metricproviders/graphite/api_test.go | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/metricproviders/graphite/api.go b/metricproviders/graphite/api.go index fc304395b1..06833ac028 100644 --- a/metricproviders/graphite/api.go +++ b/metricproviders/graphite/api.go @@ -27,9 +27,11 @@ type APIClient struct { logCTX log.Entry } +var spaceRegex = regexp.MustCompile(`\s+`) + // Query performs a Graphite API query with the query it's passed func (api APIClient) Query(quer string) ([]dataPoint, error) { - query := api.trimQuery(quer) + query := api.sanitizeQuery(quer) u, err := url.Parse(fmt.Sprintf("./render?%s", query)) if err != nil { return []dataPoint{}, err @@ -75,9 +77,8 @@ func (api APIClient) Query(quer string) ([]dataPoint, error) { return result[0].DataPoints, nil } -func (api APIClient) trimQuery(q string) string { - space := regexp.MustCompile(`\s+`) - return space.ReplaceAllString(q, " ") +func (api APIClient) sanitizeQuery(q string) string { + return spaceRegex.ReplaceAllLiteralString(q, "") } type dataPoint struct { diff --git a/metricproviders/graphite/api_test.go b/metricproviders/graphite/api_test.go index bca62bbae2..74f0ef1176 100644 --- a/metricproviders/graphite/api_test.go +++ b/metricproviders/graphite/api_test.go @@ -91,6 +91,29 @@ func TestQuery(t *testing.T) { nil, `[]`, 200, + }, { + "query with surrounding whitespace", + fmt.Sprintf("\n %s \t \n", query), + targetQuery, + fromQuery, + goodResult, + nil, + fmt.Sprintf(`[ + { + "datapoints": [ + [ + %f, + %d + ] + ], + "target": "sumSeries(app.http.*.*.count)", + "tags": { + "aggregatedBy": "sum", + "name": "sumSeries(app.http.*.*.count)" + } + } + ]`, value, timestamp), + 200, }, { "graphite response body with invalid JSON", query, From 2e66cd45b22179cc332bc287b418b1db2418caac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 09:26:41 -0500 Subject: [PATCH 045/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 (#2770) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.24 to 1.18.25. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.24...config/v1.18.25) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 06609ec8c8..853009d31e 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.24 + github.com/aws/aws-sdk-go-v2/config v1.18.25 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible @@ -82,7 +82,7 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.23 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect diff --git a/go.sum b/go.sum index a9d9f15e90..29572a9543 100644 --- a/go.sum +++ b/go.sum @@ -103,10 +103,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.24 h1:G0mJzpMjJFtK+7KtAky2kAjio21BdzNXblQSm2ZKsy0= -github.com/aws/aws-sdk-go-v2/config v1.18.24/go.mod h1:+9/RIaxGG2let2y9lIYEwOTBhaXqArOakom2TVytvFE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.23 h1:uKTIH4RmFIo04Pijn132WEMaboVLAg96H4l2KFRGzZU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.23/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= +github.com/aws/aws-sdk-go-v2/config v1.18.25 h1:JuYyZcnMPBiFqn87L2cRppo+rNwgah6YwD3VuyvaW6Q= +github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= +github.com/aws/aws-sdk-go-v2/credentials v1.13.24 h1:PjiYyls3QdCrzqUN35jMWtUK1vqVZ+zLfdOa/UPFDp0= +github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= From fef9cdbb7a7f4562f67d3ed7a95d361d7ed301a5 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sun, 14 May 2023 05:58:33 +0200 Subject: [PATCH 046/159] fix: properly wrap Datadog API v2 request body (#2771) (#2775) * Datadog: properly wrap request body Signed-off-by: Alex Eftimie * Use milliseconds in v2 calls to datadog Signed-off-by: Alex Eftimie --------- Signed-off-by: Alex Eftimie --- metricproviders/datadog/datadog.go | 27 ++++++++++++++--------- metricproviders/datadog/datadogV2_test.go | 16 +++++++------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/metricproviders/datadog/datadog.go b/metricproviders/datadog/datadog.go index 232dc59083..00f9c8a8ac 100644 --- a/metricproviders/datadog/datadog.go +++ b/metricproviders/datadog/datadog.go @@ -56,6 +56,10 @@ type datadogQuery struct { QueryType string `json:"type"` } +type datadogRequest struct { + Data datadogQuery `json:"data"` +} + type datadogResponseV1 struct { Series []struct { Pointlist [][]float64 `json:"pointlist"` @@ -182,17 +186,18 @@ func (p *Provider) createRequest(query string, apiVersion string, now int64, int return &http.Request{Method: "GET"}, nil } else if apiVersion == "v2" { - queryBody, err := json.Marshal(datadogQuery{ - QueryType: "timeseries_request", - Attributes: datadogQueryAttributes{ - From: now - interval, - To: now, - Queries: []map[string]string{{ - "data_source": "metrics", - "query": query, - }}, - }, - }) + queryBody, err := json.Marshal(datadogRequest{ + Data: datadogQuery{ + QueryType: "timeseries_request", + Attributes: datadogQueryAttributes{ + From: (now - interval) * 1000, + To: now * 1000, + Queries: []map[string]string{{ + "data_source": "metrics", + "query": query, + }}, + }, + }}) if err != nil { return nil, fmt.Errorf("Could not parse your JSON request: %v", err) } diff --git a/metricproviders/datadog/datadogV2_test.go b/metricproviders/datadog/datadogV2_test.go index c6e04fab3d..11a82411c7 100644 --- a/metricproviders/datadog/datadogV2_test.go +++ b/metricproviders/datadog/datadogV2_test.go @@ -245,28 +245,28 @@ func TestRunSuiteV2(t *testing.T) { t.Errorf("\nreceived no bytes in request: %v", err) } - var reqBody datadogQuery + var reqBody datadogRequest err = json.Unmarshal(bodyBytes, &reqBody) if err != nil { t.Errorf("\nCould not parse JSON request body: %v", err) } - actualQuery := reqBody.Attributes.Queries[0]["query"] - actualFrom := reqBody.Attributes.From - actualTo := reqBody.Attributes.To + actualQuery := reqBody.Data.Attributes.Queries[0]["query"] + actualFrom := reqBody.Data.Attributes.From + actualTo := reqBody.Data.Attributes.To if actualQuery != "avg:kubernetes.cpu.user.total{*}" { t.Errorf("\nquery expected avg:kubernetes.cpu.user.total{*} but got %s", actualQuery) } - if actualFrom != unixNow()-test.expectedIntervalSeconds { - t.Errorf("\nfrom %d expected be equal to %d", actualFrom, unixNow()-test.expectedIntervalSeconds) + if actualFrom != (unixNow()-test.expectedIntervalSeconds)*1000 { + t.Errorf("\nfrom %d expected be equal to %d", actualFrom, (unixNow()-test.expectedIntervalSeconds)*1000) } else if err != nil { t.Errorf("\nfailed to parse from: %v", err) } - if actualTo != unixNow() { - t.Errorf("\nto %d was expected be equal to %d", actualTo, unixNow()) + if actualTo != unixNow()*1000 { + t.Errorf("\nto %d was expected be equal to %d", actualTo, unixNow()*1000) } else if err != nil { t.Errorf("\nfailed to parse to: %v", err) } From 13b988edca6e0cbd5ad93c7b01d04214286a4b7d Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Sun, 14 May 2023 10:06:41 -0400 Subject: [PATCH 047/159] docs: Add docs for Amazon Managed Prometheus (#2777) adding AMP doc Signed-off-by: Kevin Lewin --- docs/analysis/prometheus.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index a698626d10..9bc8890645 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -34,7 +34,26 @@ you validate your [PromQL expression](https://prometheus.io/docs/prometheus/late See the [Analysis Overview page](../../features/analysis) for more details on the available options. +## Utilizing Amazon Managed Prometheus + +Amazon Managed Prometheus can be used as the prometheus data source for analysis. In order to do this the namespace where you analysis is running will have to have the appropriate [IRSA attached](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-ingest-metrics-new-Prometheus.html#AMP-onboard-new-Prometheus-IRSA) to allow for prometheus queries. Once you ensure the proper permissions are in place to access AMP, you can use an AMP workspace url in your ```provider``` block: + +```yaml +provider: + prometheus: + address: https://aps-workspaces.$REGION.amazonaws.com/workspaces/$WORKSPACEID + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) +``` + # Additional Metadata Any additional metadata from the Prometheus controller, like the resolved queries after substituting the template's arguments, etc. will appear under the `Metadata` map in the `MetricsResult` object of `AnalysisRun`. + + From 497e69aa1799dbb2108c42dc390899962b62f0e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 20:28:34 -0500 Subject: [PATCH 048/159] chore(deps): bump codecov/codecov-action from 3.1.3 to 3.1.4 (#2782) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.3...v3.1.4) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index c4e4debbf1..26ff28b01c 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v3.1.3 + uses: codecov/codecov-action@v3.1.4 with: file: coverage.out From 5435982165a892e2e0421895b7e1294a513b2cf0 Mon Sep 17 00:00:00 2001 From: Justin Marquis <34fathombelow@protonmail.com> Date: Wed, 17 May 2023 10:01:31 -0700 Subject: [PATCH 049/159] ci: use keyless signing for main and release branches (#2783) * ci: use keyless signing for main and release branches Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> * fix typo Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> --------- Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> --- .github/workflows/docker-publish.yml | 162 +++++++++------------------ .github/workflows/image-reuse.yaml | 153 +++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 110 deletions(-) create mode 100644 .github/workflows/image-reuse.yaml diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 183c8ef4d6..28afaeb95f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -9,38 +9,32 @@ on: # Run tests for any PRs. pull_request: -permissions: - contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} jobs: - docker: + set-vars: + permissions: + contents: read runs-on: ubuntu-latest + outputs: + controller-meta-tags: ${{ steps.controller-meta.outputs.tags }} + plugin-meta-tags: ${{ steps.plugin-meta.outputs.tags }} + platforms: ${{ steps.platform-matrix.outputs.platform-matrix }} steps: - - name: Checkout - uses: actions/checkout@v3.1.0 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - config-inline: | - [worker.oci] - gc = false - - name: Docker meta (controller) id: controller-meta uses: docker/metadata-action@v4 with: images: | quay.io/argoproj/argo-rollouts - # ghcr.io/argoproj/argo-rollouts tags: | - type=ref,event=branch - flavor: | - latest=${{ github.ref == 'refs/heads/master' }} + type=ref,event=branch,enable=${{ github.ref != 'refs/heads/master'}} + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} - name: Docker meta (plugin) id: plugin-meta @@ -48,27 +42,9 @@ jobs: with: images: | quay.io/argoproj/kubectl-argo-rollouts - # ghcr.io/argoproj/kubectl-argo-rollouts tags: | - type=ref,event=branch - flavor: | - latest=${{ github.ref == 'refs/heads/master' }} - - # - name: Login to GitHub Container Registry - # if: github.event_name != 'pull_request' - # uses: docker/login-action@v2 - # with: - # registry: ghcr.io - # username: ${{ github.repository_owner }} - # password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to Quay.io - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_ROBOT_TOKEN }} + type=ref,event=branch,enable=${{ github.ref != 'refs/heads/master'}} + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} # avoid building linux/arm64 for PRs since it takes so long - name: Set Platform Matrix @@ -79,73 +55,39 @@ jobs: then PLATFORM_MATRIX=$PLATFORM_MATRIX,linux/arm64 fi - echo "::set-output name=platform-matrix::$PLATFORM_MATRIX" - - - name: Build and push (controller-image) - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 # v4.0.0 - with: - platforms: ${{ steps.platform-matrix.outputs.platform-matrix }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.controller-meta.outputs.tags }} - provenance: false - sbom: false - - - name: Build and push (plugin-image) - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 # v4.0.0 - with: - target: kubectl-argo-rollouts - platforms: ${{ steps.platform-matrix.outputs.platform-matrix }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.plugin-meta.outputs.tags }} - provenance: false - sbom: false - - - name: Install cosign - uses: sigstore/cosign-installer@main - with: - cosign-release: 'v1.13.1' - - - name: Install crane to get digest of image - uses: imjasonh/setup-crane@v0.3 - - - name: Get digest of controller-image - run: | - if [[ "${{ github.ref == 'refs/heads/master' }}" ]] - then - echo "CONTROLLER_DIGEST=$(crane digest quay.io/argoproj/argo-rollouts:latest)" >> $GITHUB_ENV - fi - if [[ "${{ github.ref != 'refs/heads/master' }}" ]] - then - echo "CONTROLLER_DIGEST=$(crane digest ${{ steps.controller-meta.outputs.tags }})" >> $GITHUB_ENV - fi - if: github.event_name != 'pull_request' - - - name: Get digest of plugin-image - run: | - if [[ "${{ github.ref == 'refs/heads/master' }}" ]] - then - echo "PLUGIN_DIGEST=$(crane digest quay.io/argoproj/kubectl-argo-rollouts:latest)" >> $GITHUB_ENV - fi - if [[ "${{ github.ref != 'refs/heads/master' }}" ]] - then - echo "PLUGIN_DIGEST=$(crane digest ${{ steps.plugin-meta.outputs.tags }})" >> $GITHUB_ENV - fi - if: github.event_name != 'pull_request' - - - name: Sign Argo Rollouts Images - run: | - cosign sign --key env://COSIGN_PRIVATE_KEY quay.io/argoproj/argo-rollouts@${{ env.CONTROLLER_DIGEST }} - cosign sign --key env://COSIGN_PRIVATE_KEY quay.io/argoproj/kubectl-argo-rollouts@${{ env.PLUGIN_DIGEST }} - env: - COSIGN_PRIVATE_KEY: ${{secrets.COSIGN_PRIVATE_KEY}} - COSIGN_PASSWORD: ${{secrets.COSIGN_PASSWORD}} - if: ${{ github.event_name == 'push' }} - - - name: Display the public key to share. - run: | - # Displays the public key to share - cosign public-key --key env://COSIGN_PRIVATE_KEY - env: - COSIGN_PRIVATE_KEY: ${{secrets.COSIGN_PRIVATE_KEY}} - COSIGN_PASSWORD: ${{secrets.COSIGN_PASSWORD}} - if: ${{ github.event_name == 'push' }} + echo "platform-matrix=$PLATFORM_MATRIX" >> $GITHUB_OUTPUT + + build-and-push-controller-image: + needs: [set-vars] + permissions: + contents: read + packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags + id-token: write # for creating OIDC tokens for signing. + uses: ./.github/workflows/image-reuse.yaml + 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.19 + platforms: ${{ needs.set-vars.outputs.platforms }} + push: ${{ github.event_name != 'pull_request' }} + secrets: + quay_username: ${{ secrets.QUAY_USERNAME }} + quay_password: ${{ secrets.QUAY_ROBOT_TOKEN }} + + build-and-push-plugin-image: + needs: [set-vars] + permissions: + contents: read + packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags + id-token: write # for creating OIDC tokens for signing. + uses: ./.github/workflows/image-reuse.yaml + 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.19 + platforms: ${{ needs.set-vars.outputs.platforms }} + push: ${{ github.event_name != 'pull_request' }} + target: kubectl-argo-rollouts + secrets: + quay_username: ${{ secrets.QUAY_USERNAME }} + quay_password: ${{ secrets.QUAY_ROBOT_TOKEN }} diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml new file mode 100644 index 0000000000..744d4f5f4c --- /dev/null +++ b/.github/workflows/image-reuse.yaml @@ -0,0 +1,153 @@ +name: Publish and Sign Container Image +on: + workflow_call: + inputs: + go-version: + required: true + type: string + quay_image_name: + required: false + type: string + ghcr_image_name: + required: false + type: string + docker_image_name: + required: false + type: string + platforms: + required: true + type: string + default: linux/amd64 + push: + required: true + type: boolean + default: false + target: + required: false + type: string + + secrets: + quay_username: + required: false + quay_password: + required: false + ghcr_username: + required: false + ghcr_password: + required: false + docker_username: + required: false + docker_password: + required: false + + outputs: + image-digest: + description: "sha256 digest of container image" + value: ${{ jobs.publish.outputs.image-digest }} + +permissions: {} + +jobs: + publish: + permissions: + contents: read + packages: write # Used to push images to `ghcr.io` if used. + id-token: write # Needed to create an OIDC token for keyless signing + runs-on: ubuntu-22.04 + outputs: + image-digest: ${{ steps.image.outputs.digest }} + steps: + - name: Checkout code + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + if: ${{ github.ref_type == 'tag'}} + + - name: Checkout code + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + if: ${{ github.ref_type != 'tag'}} + + - name: Setup Golang + uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 + with: + go-version: ${{ inputs.go-version }} + + - name: Install cosign + uses: sigstore/cosign-installer@204a51a57a74d190b284a0ce69b44bc37201f343 # v3.0.3 + with: + cosign-release: 'v2.0.2' + + - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 + - uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c # v2.5.0 + + - name: Setup tags for container image as a CSV type + run: | + IMAGE_TAGS=$(for str in \ + ${{ inputs.quay_image_name }} \ + ${{ inputs.ghcr_image_name }} \ + ${{ inputs.docker_image_name}}; do + echo -n "${str}",;done | sed 's/,$//') + + echo $IMAGE_TAGS + echo "TAGS=$IMAGE_TAGS" >> $GITHUB_ENV + + - name: Setup image namespace for signing, strip off the tag + run: | + TAGS=$(for tag in \ + ${{ inputs.quay_image_name }} \ + ${{ inputs.ghcr_image_name }} \ + ${{ inputs.docker_image_name}}; do + echo -n "${tag}" | awk -F ":" '{print $1}' -;done) + + echo $TAGS + echo 'SIGNING_TAGS<> $GITHUB_ENV + echo $TAGS >> $GITHUB_ENV + echo 'EOF' >> $GITHUB_ENV + + - name: Login to Quay.io + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + with: + registry: quay.io + username: ${{ secrets.quay_username }} + password: ${{ secrets.quay_password }} + if: ${{ inputs.quay_image_name && inputs.push }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + with: + registry: ghcr.io + username: ${{ secrets.ghcr_username }} + password: ${{ secrets.ghcr_password }} + if: ${{ inputs.ghcr_image_name && inputs.push }} + + - name: Login to dockerhub Container Registry + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + with: + username: ${{ secrets.docker_username }} + password: ${{ secrets.docker_password }} + if: ${{ inputs.docker_image_name && inputs.push }} + + - name: Build and push container image + id: image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 #v4.0.0 + with: + context: . + platforms: ${{ inputs.platforms }} + push: ${{ inputs.push }} + tags: ${{ env.TAGS }} + target: ${{ inputs.target }} + provenance: false + sbom: false + + - name: Sign container images + run: | + for signing_tag in $SIGNING_TAGS; do + cosign sign \ + -a "repo=${{ github.repository }}" \ + -a "workflow=${{ github.workflow }}" \ + -a "sha=${{ github.sha }}" \ + --yes \ + "$signing_tag"@${{ steps.image.outputs.digest }} + done + if: ${{ inputs.push }} From c683ade0a211e890ce8574ae4ebdb126c62fd669 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Wed, 17 May 2023 13:12:26 -0400 Subject: [PATCH 050/159] docs: Add some details around running locally to make things clearer new contributors (#2786) Add some details around running locally to make things clearer for people new to the project. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- docs/CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 694a94690a..a325587804 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -70,6 +70,8 @@ cd ~/go/src/github.com/argoproj/argo-rollouts go run ./cmd/rollouts-controller/main.go ``` +When running locally it will connect to whatever kubernetes cluster you have configured in your kubeconfig. You will need to make sure to install the Argo Rollout CRDs into your local cluster, and have the `argo-rollouts` namespace. + ## Running Unit Tests To run unit tests: From d2130743e406094f6c4dc5a14dde788c07ae7ce6 Mon Sep 17 00:00:00 2001 From: Dan Garfield Date: Wed, 17 May 2023 13:42:22 -0600 Subject: [PATCH 051/159] docs: Add gateway API link, fix Contour plugin naming (#2787) Add gateway API link, fix Contour plugin naming Signed-off-by: Dan Garfield --- docs/features/traffic-management/plugins.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index 660900e6ae..3e43d5234e 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -72,5 +72,8 @@ responsibility of the Argo Rollouts administrator to define the plugin installat * This is just a sample plugin that can be used as a starting point for creating your own plugin. It is not meant to be used in production. It is based on the built-in prometheus provider. -#### [rollouts-plugin-trafficrouter-contour](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-contour) +#### [Contour](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-contour) * This is a plugin for support Contour. + +#### [Gateway API](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/) +* Provide support for Gateway API, which includes Kuma, Traefix, cilium, Contour, GloodMesh, HAProxy, and [many others](https://gateway-api.sigs.k8s.io/implementations/#implementation-status). \ No newline at end of file From 05c3d9049428ae7ea6fb4c117db528db4b4b7557 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:42:46 -0500 Subject: [PATCH 052/159] chore(deps): bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 (#2784) Bumps [github.com/sirupsen/logrus](https://github.com/sirupsen/logrus) from 1.9.0 to 1.9.1. - [Release notes](https://github.com/sirupsen/logrus/releases) - [Changelog](https://github.com/sirupsen/logrus/blob/master/CHANGELOG.md) - [Commits](https://github.com/sirupsen/logrus/compare/v1.9.0...v1.9.1) --- updated-dependencies: - dependency-name: github.com/sirupsen/logrus dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 853009d31e..cc284b3457 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/servicemeshinterface/smi-sdk-go v0.5.0 - github.com/sirupsen/logrus v1.9.0 + github.com/sirupsen/logrus v1.9.1 github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 29572a9543..63e7aa7465 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.1 h1:Ou41VVR3nMWWmTiEUnj0OlsgOSCUFgsPAOl6jRIcVtQ= +github.com/sirupsen/logrus v1.9.1/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= From 09f6267c3217c618e6839eb9a9bb87f7abf65777 Mon Sep 17 00:00:00 2001 From: Zubair Haque Date: Sun, 21 May 2023 08:06:37 -0500 Subject: [PATCH 053/159] chore: Add tests for pause functionality in rollout package (#2772) Add tests for pause functionality in rollout package Signed-off-by: zhaque44 --- rollout/pause_test.go | 210 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 rollout/pause_test.go diff --git a/rollout/pause_test.go b/rollout/pause_test.go new file mode 100644 index 0000000000..71894ba04e --- /dev/null +++ b/rollout/pause_test.go @@ -0,0 +1,210 @@ +package rollout + +import ( + "testing" + "time" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" +) + +func TestHasAddPause(t *testing.T) { + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: false, + PauseConditions: []v1alpha1.PauseCondition{}, + }, + }, + log: log.WithFields(log.Fields{}), + + addPauseReasons: []v1alpha1.PauseReason{v1alpha1.PauseReasonCanaryPauseStep}, + removePauseReasons: []v1alpha1.PauseReason{}, + } + + result := work.HasAddPause() + assert.Equal(t, true, result) +} + +func TestHasAddPauseNoReasons(t *testing.T) { + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: false, + PauseConditions: []v1alpha1.PauseCondition{}, + }, + }, + log: log.WithFields(log.Fields{}), + + addPauseReasons: []v1alpha1.PauseReason{}, + removePauseReasons: []v1alpha1.PauseReason{}, + } + + result := work.HasAddPause() + assert.Equal(t, false, result) +} + +func TestCalculatePauseStatus(t *testing.T) { + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: false, + PauseConditions: []v1alpha1.PauseCondition{}, + }, + }, + log: log.WithFields(log.Fields{}), + + addPauseReasons: []v1alpha1.PauseReason{v1alpha1.PauseReasonCanaryPauseStep}, + removePauseReasons: []v1alpha1.PauseReason{}, + } + + newStatus := &v1alpha1.RolloutStatus{} + work.CalculatePauseStatus(newStatus) + + assert.Equal(t, true, newStatus.ControllerPause) + assert.Len(t, newStatus.PauseConditions, 1) + assert.Equal(t, v1alpha1.PauseReasonCanaryPauseStep, newStatus.PauseConditions[0].Reason) +} + +func TestCalculatePauseStatusRemovePause(t *testing.T) { + now := v1.NewTime(time.Now()) + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: true, + PauseConditions: []v1alpha1.PauseCondition{ + { + Reason: v1alpha1.PauseReasonCanaryPauseStep, + StartTime: v1.NewTime(now.Add(-1 * time.Minute)), + }, + }, + }, + }, + log: log.WithFields(log.Fields{}), + + addPauseReasons: []v1alpha1.PauseReason{}, + removePauseReasons: []v1alpha1.PauseReason{v1alpha1.PauseReasonCanaryPauseStep}, + } + + newStatus := &v1alpha1.RolloutStatus{} + work.CalculatePauseStatus(newStatus) + + assert.Equal(t, false, newStatus.ControllerPause) + assert.Len(t, newStatus.PauseConditions, 0) +} + +func TestCompletedBlueGreenPause(t *testing.T) { + now := v1.NewTime(time.Now()) + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{}, + }, + }, + Status: v1alpha1.RolloutStatus{ + ControllerPause: true, + PauseConditions: []v1alpha1.PauseCondition{ + { + Reason: v1alpha1.PauseReasonBlueGreenPause, + StartTime: now, + }, + }, + BlueGreen: v1alpha1.BlueGreenStatus{ + ScaleUpPreviewCheckPoint: true, + }, + }, + }, + log: log.WithFields(log.Fields{}), + } + + result := work.CompletedBlueGreenPause() + assert.Equal(t, true, result) +} + +func TestCompletedBlueGreenPauseAutoPromotionDisabled(t *testing.T) { + autoPromotionEnabled := false + now := v1.NewTime(time.Now()) + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AutoPromotionEnabled: &autoPromotionEnabled, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + ControllerPause: true, + PauseConditions: []v1alpha1.PauseCondition{ + { + Reason: v1alpha1.PauseReasonBlueGreenPause, + StartTime: now, + }, + }, + BlueGreen: v1alpha1.BlueGreenStatus{ + ScaleUpPreviewCheckPoint: false, + }, + }, + }, + log: log.WithFields(log.Fields{}), + } + + result := work.CompletedBlueGreenPause() + assert.Equal(t, false, result) +} + +func TestCompletedCanaryPauseStep(t *testing.T) { + now := v1.NewTime(time.Now()) + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: true, + PauseConditions: []v1alpha1.PauseCondition{ + { + Reason: v1alpha1.PauseReasonCanaryPauseStep, + StartTime: now, + }, + }, + }, + }, + log: log.WithFields(log.Fields{}), + } + + pause := v1alpha1.RolloutPause{ + Duration: &intstr.IntOrString{IntVal: intstr.FromInt(0).IntVal}, + } + + result := work.CompletedCanaryPauseStep(pause) + assert.Equal(t, true, result) +} + +func TestCompletedCanaryPauseStepInProgress(t *testing.T) { + now := v1.NewTime(time.Now()) + work := &pauseContext{ + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ControllerPause: true, + PauseConditions: []v1alpha1.PauseCondition{ + { + Reason: v1alpha1.PauseReasonCanaryPauseStep, + StartTime: now, + }, + }, + }, + }, + log: log.WithFields(log.Fields{}), + } + + pauseDuration := int((2 * time.Hour).Seconds()) + pause := v1alpha1.RolloutPause{ + Duration: &intstr.IntOrString{IntVal: intstr.FromInt(pauseDuration).IntVal}, + } + + result := work.CompletedCanaryPauseStep(pause) + assert.Equal(t, false, result) +} From 2c9d032ba90c2db62096465ed5d98538c8b1ca50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 08:07:23 -0500 Subject: [PATCH 054/159] chore(deps): bump sigstore/cosign-installer from 3.0.3 to 3.0.5 (#2788) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.0.3 to 3.0.5. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/204a51a57a74d190b284a0ce69b44bc37201f343...dd6b2e2b610a11fd73dd187a43d57cc1394e35f9) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 744d4f5f4c..834b97f291 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@204a51a57a74d190b284a0ce69b44bc37201f343 # v3.0.3 + uses: sigstore/cosign-installer@dd6b2e2b610a11fd73dd187a43d57cc1394e35f9 # v3.0.5 with: cosign-release: 'v2.0.2' From f1ae505598c72bc975ddcfc5d388fd4faebe9422 Mon Sep 17 00:00:00 2001 From: yyzxw <34639446+yyzxw@users.noreply.github.com> Date: Mon, 22 May 2023 09:29:32 +0800 Subject: [PATCH 055/159] chore: add unit test (#2798) Signed-off-by: yyzxw <1020938856@qq.com> --- utils/experiment/experiment.go | 2 +- utils/plugin/downloader_test.go | 20 +++ utils/replicaset/canary.go | 6 +- utils/replicaset/canary_test.go | 214 ++++++++++++++++++++++++++++++ utils/rollout/rolloututil_test.go | 65 ++++++++- 5 files changed, 301 insertions(+), 6 deletions(-) diff --git a/utils/experiment/experiment.go b/utils/experiment/experiment.go index 3bd3d07a96..9ddf771aae 100644 --- a/utils/experiment/experiment.go +++ b/utils/experiment/experiment.go @@ -200,7 +200,7 @@ var templateStatusOrder = []v1alpha1.TemplateStatusCode{ v1alpha1.TemplateStatusFailed, } -// TemplateIsWorse returns whether or not the new template status is a worser condition than the current. +// TemplateIsWorse returns whether the new template status is a worser condition than the current. func TemplateIsWorse(current, new v1alpha1.TemplateStatusCode) bool { currentIndex := 0 newIndex := 0 diff --git a/utils/plugin/downloader_test.go b/utils/plugin/downloader_test.go index 855b0a6510..75dc4cae71 100644 --- a/utils/plugin/downloader_test.go +++ b/utils/plugin/downloader_test.go @@ -255,3 +255,23 @@ func TestDownloadFile(t *testing.T) { assert.Error(t, err) assert.Contains(t, err.Error(), "failed to download file from") } + +func Test_copyFile(t *testing.T) { + t.Run("test copy file that does not exist", func(t *testing.T) { + err := copyFile("nonexistentfile", "nonexistentfile") + assert.Error(t, err) + }) + + t.Run("test copy file that does exist", func(t *testing.T) { + err := os.WriteFile("test-copy", []byte("test"), 0700) + assert.NoError(t, err) + err = copyFile("test-copy", "test-copy") + defer func() { + err = os.Remove("test-copy") + assert.NoError(t, err) + }() + + assert.NoError(t, err) + assert.FileExists(t, "test-copy") + }) +} diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index d143d91d50..a751cd2be2 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -13,7 +13,7 @@ import ( ) const ( - // EphemeralMetadataAnnotation denotes pod metadata which are ephemerally injected to canary/stable pods + // EphemeralMetadataAnnotation denotes pod metadata which is ephemerally injected to canary/stable pods EphemeralMetadataAnnotation = "rollout.argoproj.io/ephemeral-metadata" ) @@ -425,8 +425,8 @@ func GetReplicasForScaleDown(rs *appsv1.ReplicaSet, ignoreAvailability bool) int // The ReplicaSet is already going to scale down replicas since the availableReplica count is bigger // than the spec count. The controller uses the .Spec.Replicas to prevent the controller from // assuming the extra replicas (availableReplica - .Spec.Replicas) are going to remain available. - // Otherwise, the controller use those extra replicas to scale down more replicas and potentially - // violate the min available. + // Otherwise, the controller uses those extra replicas to scale down more replicas and potentially + // violates the min available. return *rs.Spec.Replicas } if ignoreAvailability { diff --git a/utils/replicaset/canary_test.go b/utils/replicaset/canary_test.go index 1251c3ae8d..375ca43ce4 100755 --- a/utils/replicaset/canary_test.go +++ b/utils/replicaset/canary_test.go @@ -1322,3 +1322,217 @@ func TestSyncEphemeralPodMetadata(t *testing.T) { } } + +func TestGetReplicasForScaleDown(t *testing.T) { + tests := []struct { + rs *appsv1.ReplicaSet + ignoreAvailability bool + name string + want int32 + }{ + { + name: "test rs is nil", + want: 0, + }, + { + name: "test expected replicas is less than actual replicas", + rs: &appsv1.ReplicaSet{ + Spec: appsv1.ReplicaSetSpec{ + Replicas: pointer.Int32Ptr(3), + }, + Status: appsv1.ReplicaSetStatus{ + AvailableReplicas: 5, + }, + }, + want: 3, + }, + { + name: "test ignore availability", + rs: &appsv1.ReplicaSet{ + Spec: appsv1.ReplicaSetSpec{ + Replicas: pointer.Int32Ptr(3), + }, + Status: appsv1.ReplicaSetStatus{ + AvailableReplicas: 2, + }, + }, + ignoreAvailability: true, + want: 3, + }, + { + name: "test not ignore availability", + rs: &appsv1.ReplicaSet{ + Spec: appsv1.ReplicaSetSpec{ + Replicas: pointer.Int32Ptr(3), + }, + Status: appsv1.ReplicaSetStatus{ + AvailableReplicas: 2, + }, + }, + ignoreAvailability: false, + want: 2, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, GetReplicasForScaleDown(tt.rs, tt.ignoreAvailability), "GetReplicasForScaleDown(%v, %v)", tt.rs, tt.ignoreAvailability) + }) + } +} + +func TestGetCanaryReplicasOrWeight(t *testing.T) { + tests := []struct { + name string + rollout *v1alpha1.Rollout + replicas *int32 + weight int32 + }{ + { + name: "test full promote rollout", + rollout: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + PromoteFull: true, + }, + }, + replicas: nil, + weight: 100, + }, + { + name: "test canary step weight", + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + Steps: []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32Ptr(10), + }, + { + SetCanaryScale: &v1alpha1.SetCanaryScale{ + Weight: pointer.Int32Ptr(20), + }, + }, + }, + TrafficRouting: &v1alpha1.RolloutTrafficRouting{}, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + CurrentStepIndex: pointer.Int32Ptr(1), + StableRS: "stable-rs", + }, + }, + replicas: nil, + weight: 20, + }, + { + name: "test canary step replicas", + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + Steps: []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32Ptr(10), + }, + { + SetCanaryScale: &v1alpha1.SetCanaryScale{ + Replicas: pointer.Int32Ptr(5), + }, + }, + }, + TrafficRouting: &v1alpha1.RolloutTrafficRouting{}, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + CurrentStepIndex: pointer.Int32Ptr(1), + StableRS: "stable-rs", + }, + }, + replicas: pointer.Int32(5), + weight: 0, + }, + { + name: "test get current step weight", + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{}, + }, + }, + Status: v1alpha1.RolloutStatus{ + Abort: true, + }, + }, + replicas: nil, + weight: 100, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotReplicas, gotWeight := GetCanaryReplicasOrWeight(tt.rollout) + assert.Equalf(t, tt.replicas, gotReplicas, "GetCanaryReplicasOrWeight(%v)", tt.rollout) + assert.Equalf(t, tt.weight, gotWeight, "GetCanaryReplicasOrWeight(%v)", tt.rollout) + }) + } +} + +func TestParseExistingPodMetadata(t *testing.T) { + tests := []struct { + name string + rs *appsv1.ReplicaSet + want *v1alpha1.PodTemplateMetadata + }{ + { + name: "test no metadata", + rs: &appsv1.ReplicaSet{}, + want: nil, + }, + { + name: "test no ephemeral metadata key", + rs: &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "foo": "bar", + }, + }, + }, + want: nil, + }, + { + name: "test invalid ephemeral metadata", + rs: &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + EphemeralMetadataAnnotation: "foo", + }, + }, + }, + want: nil, + }, + { + name: "test valid ephemeral metadata", + rs: &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + EphemeralMetadataAnnotation: `{"labels":{"foo":"bar"},"annotations":{"bar":"baz"}}`, + }, + }, + }, + want: &v1alpha1.PodTemplateMetadata{ + Labels: map[string]string{ + "foo": "bar", + }, + Annotations: map[string]string{ + "bar": "baz", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, ParseExistingPodMetadata(tt.rs), "ParseExistingPodMetadata(%v)", tt.rs) + }) + } +} diff --git a/utils/rollout/rolloututil_test.go b/utils/rollout/rolloututil_test.go index 572bd1cb51..37c1810f00 100644 --- a/utils/rollout/rolloututil_test.go +++ b/utils/rollout/rolloututil_test.go @@ -256,7 +256,7 @@ func TestRolloutStatusProgressing(t *testing.T) { assert.Equal(t, "rollout is restarting", message) } { - //Rollout observed workload generation is not updated + // Rollout observed workload generation is not updated ro := newCanaryRollout() ro.Spec.TemplateResolvedFromRef = true annotations.SetRolloutWorkloadRefGeneration(ro, "2") @@ -330,7 +330,7 @@ func TestRolloutStatusHealthy(t *testing.T) { assert.Equal(t, "", message) } { - //Rollout observed workload generation is updated + // Rollout observed workload generation is updated ro := newCanaryRollout() annotations.SetRolloutWorkloadRefGeneration(ro, "2") ro.Status.Replicas = 5 @@ -432,3 +432,64 @@ func TestShouldVerifyWeight(t *testing.T) { ro.Spec.Strategy.Canary.Steps = nil assert.Equal(t, false, ShouldVerifyWeight(ro)) } + +func Test_isGenerationObserved(t *testing.T) { + tests := []struct { + name string + ro *v1alpha1.Rollout + want bool + }{ + { + name: "test parse generation failed", + ro: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ObservedGeneration: "invalid", + }, + }, + want: true, + }, + { + name: "test status.generation more than spec.generation", + ro: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ObservedGeneration: "10", + }, + ObjectMeta: metav1.ObjectMeta{ + Generation: 9, + }, + }, + want: true, + }, + { + name: "test status.generation equal to spec.generation", + ro: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ObservedGeneration: "10", + }, + ObjectMeta: metav1.ObjectMeta{ + Generation: 10, + }, + }, + want: true, + }, + { + name: "test status.generation less than spec.generation", + ro: &v1alpha1.Rollout{ + Status: v1alpha1.RolloutStatus{ + ObservedGeneration: "10", + }, + ObjectMeta: metav1.ObjectMeta{ + Generation: 11, + }, + }, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isGenerationObserved(tt.ro); got != tt.want { + t.Errorf("isGenerationObserved() = %v, want %v", got, tt.want) + } + }) + } +} From 6ac153326c585a79555e3c5f5cfec0b22fce1f61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 20:30:00 -0500 Subject: [PATCH 056/159] chore(deps): bump github.com/stretchr/testify from 1.8.2 to 1.8.3 (#2796) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.8.3. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.8.3) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cc284b3457..139b025a36 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.3 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 diff --git a/go.sum b/go.sum index 63e7aa7465..e126532dd0 100644 --- a/go.sum +++ b/go.sum @@ -672,8 +672,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= From 2761629b315b5c548a866225745c74d4c8f67880 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Wed, 24 May 2023 00:36:20 +0300 Subject: [PATCH 057/159] docs: Show how plugins are loaded (#2801) Signed-off-by: Kostis Kapelonis --- docs/contributing-assets/plugin-loading.png | Bin 0 -> 64801 bytes .../release-action.png | Bin docs/plugins.md | 6 ++++++ docs/releasing.md | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/contributing-assets/plugin-loading.png rename docs/{ => contributing-assets}/release-action.png (100%) diff --git a/docs/contributing-assets/plugin-loading.png b/docs/contributing-assets/plugin-loading.png new file mode 100644 index 0000000000000000000000000000000000000000..db5d3a4641e14ae4f9068fe1565edad7976d6016 GIT binary patch literal 64801 zcmbTcV|-p+&@UXTv7IK3lg75~#4AV?%FF}> z<-`RAzslL$7@Jud0Rf2(S0=m2{aD5rzVJ9AB;*4ErpRUG=KwAUz<0OFLyqGUfTkxb z3CSEp)07t~p!m{8p0}kAr1pg<3=R0pJ-8a!oKvkX=>CH*;pzLq!^LWx_)v^S6V5u@U{Kr@=U=n^Z@jprL_6CMG@_ zq91^nxHsw3C&AxY;}2~IErD_n15nuYojLl7W9a+P!x(`1l!(07l~Vi6tOZr&15iUQ z*Ue^`Bp`eXq8`oEP7R3>%%J&q z)vvx}M>h%(e~>_SqdQ0;N!wJ3!=|{qX^}E}x6~H8#WlIg|9POAfql+PuuFIsPOSI) zxfO)q;mNDBu(LS)V}UlCLMweV{4()=GOaqBO83_x>adu_t}S=xfdNtBRiBj0k#=7L zq8S(Kgy=DbNucDSF%hJ_w^hh3UQx}fzyW4}FOx3#sUK(!Xcu3`s8%NXdVpwI?pZlPg<67+(B z@w0`%$`dMyefb?MMMxC_-^!;g2ZRbSC;%Nm?n+*YULIa`KI*-K@kiyz+7g4Iumvy&2=ws_ zP;Im5h0yUQkYOWdh9V81?vUzJ)cU!mJ_bB$i-?Gb4)K#J2GQ2b7bzaJ{8CBagKqHT@gbNzZf;F1742A6`dr$__`QN8=D==JFZ|fVU${jy9`%{RwrH8 zS!Y8I7RD3EuO>5ElprUgVEsdT9BB`Bk84lW{$!tWZ*t^rG;;jM{`YAR`wbo*BPm;f3pT9rhX zME)3eVs#ml679U=yjIynne6>CmB^!WjuO zyaswJCo3JRQ0GSH!&`UB>wqen&vc%WzTJBhWozU+bvs-Efgl^;_`I>X8Z_9sD^w4(=p}r(J`?FGsHJ$K?3b zA7!&h#jzwok}Z<(G+2%ccE;=~oDc2On#h{o&POiu&PJ^ZEj%u>PP;AhZE%bcSQHWY z5v=Fv=R^;)=h=`jtR!-?*hpS zM-Qupb*(|p!bIFabSs={rh^oBl!jk5AFLqL%&gZvX(|w6PMLfD_R0t z1sWL&9rO&eC^D&9Zw2;(D-mNYgI&Z~@5Z?IpxrL2gGlS-8qv9JoP&b=Z?QUu>+?PN zEUM~&hqQ}c+QV+?E9p{+rv&T_cXB7n?;Mr%c-dJo-Xb|)#n2oLO^qui{~)Eo+yuN) z;i;Ufv6Eh7%!d(PG1y5K5fO!1OGFU!ib2$A)=}2+REMcM**CtL_a3KPNG(`uFlL-( zzKyHjs^72NJ%E4Tx)Josvdki{wke-oC?lBRz4kd>G48CiTz&AAdA|b*{~7ml^z8I((WmaU z^tQMZPn@$2<_zZHV&EM0w4;06X>ptADep9|cipc&Jb4$Ofpq_d9rTQUi+yN<{@lI;%>|;G5g-`{_fmmbyKcTUPF~2 zztQS+?s)AhkmcX>DIJ!ZRI_VyI%IlxJ_W5u7Ns|_%5K(mI<<{gl^->|oh4ZZpD$#Q za36YTdC+cLbvW$P+?+>x@ISbpi*EQ#V{9&d_}=L5>8^WINa2-_5ISou^xzfVJ^Bb@CL?oRO(`D8pMe5l>s zY}4M-X6od3!^>8r4M-<>Grli8uYbJ6m)@3A5K0cD#e$F<_K1rEb#Ml}(hh*|ok94v zI4Vm{VKS9}m_WUM=-h6$1 zQBY8jk&zo38eU&tCnhGqz`zg@5p#2MpPrtos;ZEXkaTr*y}Z2G+1XK1QQ_d=^78WT z@9(FlrwV59v>h3`}=?V_;Go8>Fn&Bnwkm%0s;&SoRN{Sv$M0ZvT}HM z7#SJq@9%$da-yoL>gnlOQBeU22?-AmUtV6`*48E{D7d(|cyn{(=;+AJ&HeM|Pgq!3 zEG#Sv3JOU{$^HHPo}Qk%x;lD#dOA9~u&}WB`1mhhzQDl1xVgDqU0r2mWsQ%I)6&vH zKtRmS&N4AE#l^+l-QDr>@-j0s*Vos#wzft@L<|oP+uPgQ*x2y!@N8~w5)csZ@$q$a zbqNa#D<~+euC9)bj=sOY6B85v`t{4q%A&+Lo4$LPF~5>H-1+ zG&D5){QTnL;**n;tgNj1`udfXm1${dO-)TPF)`B8(i|KdT3TA}?(S-8YNn>9ot>Q~ zCMG#KIY~)L`1tsgl$5Tnu9%pZ8>AtAA~ zwf+A6I~NyMety26pP#0tCLtlAii!#&Bcp+VfwHo)oSYmU9$syB#wGyS(6(Y~4nRQg z{hxop!!{*`KtSj7;zIn2uG**T(3*-$FOZkvzBu=@b|R=qa6-bpXskkZf~XjpbQCl8 zg0lmf^@j|T_xOUsj`ZNUc4a?I zn4F*X|8hHDCJ}%l3_$#U|HP41gsHBE!~n?XQ>|w72PG34P?A6A%_g{mYaTJ|FaWOg zVWibeoj5Yl$xUeCkpLXksG?ywAeBM&unO|>*+c;JhNZ|E4JDfUN^I>pWr=KJP=p0^ zc9qInLd)`T^W5ew64uPyieJ#y2jv0N1AmI1aX6jKl}AHl?f4$8;ebS9*Y{LGr@7~1 z&GQ4MUS3*n2;hqjmLV?_i0}VEF{KcVs#I?-4Qx`r?>c+k0|n>>!_t258!mIWw^tw- zY>7~CeF5dDAn-Ez2ido3U30oK*d9P628_OhLbC#-{P8DmzSWmi#7OdP(N~*jK~YF9 zd2v&hId!9V2azx!=I2-uPe+Cysn>HC^!M_ghRq21BN}|XNRm-++e|>9PU^5QNWlO- zQKiy)ZKv}BE8B_T+&oIED1t(%q|jdB=`;u8P&q*OFF@4E9MMGoQtktrpwbczf9oxS z&)=JN?5zgL7yflEZ0Zs)*uw7rIYsns7k(%cDHD4Gtexm%xZy4_$GrQ8WKDMuGLtChtON`OmKS7^KwZMHer>LgY*D=J&EyV zki=N+2w>mulU*@rl%pPks==i8mtiWeB7t$5F?a02@rj6Y`oeGpvcaLTdNwK9ke^F5^@e-KUIZO5r-)q{kfBOzf+GnJ-@?>(3jN-k$EY&_nNyN z>~{)&hXe^t7_djsp42ne30U+c`HE;2%O)uTU*{Z%YEi3ZRHW_#Jb4kNyc6M!U-_$2TH*E)$wS`qS{T z!Uo#j*EIxWxwUxZonYL%PdQnwP9H|2P+FFy^BjaAlwLcMlpJ#Ymo$FhMp|~Xs zuBNT_(IaLckTO3zQJY8w&FIlV!>f5)-Qrzl$|E2j5^v50eNo0L|5*dJ6Og$B(i}cd zNh!{Indh04!B(bMqB#*`TmweLs#uVY?emET{nr-pyC zmD7)QfeAa!ew1-VU+xb(x7~m68>SUv*BveeyKv1BLXyriJ(LpPRnsUCv3IQ~lo zjK1R*CcxSq4e`~5Y_{uPeoPod>-p+|w8Cqh0N)5GHyJ22Du(A0|JbCBpP?g<_$_-bs zPnXF_M3Cazr_u3|LY&U~V_a+39yL)~gY?b^SQu=`yCE7d>!zT$S97`8^M z;hytCXi!zMUQC;1bH(hwhzWY_Wq>-U>uAb8B;*Oa+(=chxaenx+D|P04904FT%d*( znrlP2WiaoC=L_jZ{>KBkslYGqhU{N~5c=H&llrG^;#Km~hRd*;T^Y6$6OYH}^%%#$ zyO4|?lV?lko%}57fXVF_x<}OOK=DcoZb;b=M@XO`|Bf_GBGLB6WW#n)JDl;|d=g&A z@Tiy~EkF`Mwdx5%D+6-t^4q;aMlG?%7YIOpqEC*gs?Z#o27=6-%w;a8B45pOfl$B6 z{Ed~Rd2k7T_PE-^@uWUf#9$l2YTu~ex)otBwd9*?k6qWE&jr-a08LZlh!W{%E4Fh4 zJnFS=pbAo#C{RqucepiZ9V9+R<@zg59Pz!vIY>*Vj;frPy-@^1S&g#yL>RD%&VAiJ zKdY2rC$POUZKyL(^f+^ni1baJGwlBDf2Ni%Vs0=Gx&_6HJ7lfLwxbfaLz*W^jIfrx z!E0aUTKgniU4gsx)B04b4@8&!Wzkr=dat*|S=5&>Zm&tytxop9m2&uu3WQomNJW{~&IaSehQy{T?f7tvK{>{wHJUO9VvO=c8 zv`A`8thUKyeGlGsbY^Nw{``-t68`+Wfy?1-yL*7kIrhjqbnC{k+(Z*bexiSb@ev_Y z8wOh{NsK%-Rb`f&$8Ot6?~Vju3p6*rz{XCaVa3c1_0dCmxP6e|11jpaEx$cIJN>;e zG&wb^McI!WvPQf6C-%+)fDnb62orJL_>lT=R=rTQfX~t-9V!V7KZLE_m5hTRNf=O; zA(n;s9R)q7(ZnHt7C73>zT!jeJN4+GWJcSrpLN}os%~w0Nc}k6OO43DCkyCE2A_e$ z(q7nsQ-Y$1SQh*v$+qA`#FRs<;V|MN#E?i5_bK;R7IOh7mT3FivPEL8MUQd_nllC!ne zda0Yj2^Xf#+DhmC_qw22j1JQmyJDS&sitsAl}LA%?(IU1#_DE+Qh6j!(u*~AH=8_H zdVna@LYkwJyWZql&vMnrB_3V45V$Dc6#4b znAq2^_@>n09@Ik@g`fz9?$(aCvfmT)?w()QhcdX|9+{=F6KGJV;Q_kJGf(aNXjz|< z(d=;!mvlNbiG+LstT{LCwb;z<5~li{DESl~jSygx#NR4!4Qcry^ZlKgYC1^BfVss^ zR0hHYG@LT>5C8(^FDE?OLgus0OiqO;0wL~Cyk~?&cgyR2f zgoGdpgsi{{Mug0j$Qs!o0isJj6{TJ{M*{jn8u8N$PFKri2QVSTi5=KPL;#nR)jh?D z2pt_UX!!F{#GydU4v^N)IytU+3=EFDVI`H=eaZeGZDB zqTI=V$T#3nfdDv}BeTn#K@U_L{{=yb*dB5tSxk&@q0pzPgo$3l`8rpAfB-~53&W)W zx#N(421u_s0)jkZEAce|F;BoKErhQ#=^qJpy(-wTQ|MeAB>Pl>QXiN(rT~ZNQye06IZ*L7(tnS6gFhvS z!L4Ce&=D#V{*-)Oh@rmYV4sUorMn+Q_r zLX?j%-=`%6w5`aA=JUWlO@?}nL-H9I?0lar#iHas<%|19$g7PUYkrm^uli{ho?+`y zu|{WVMBq>3iBoH-2$ePZ8|MMA07HVW;scV~SOZ`j_^A%mDAK1f1?&g@Nt{vBwW9og zB{p4U|2L=$`)^hL|FvoYK)irGsDDEW#vK1H=<;X5kxJ1&Z{+jiWdAMV$NY~N>>rK5 zKR&7gAh~$Z&;U`W3H_MYVRre>E{{H*O744FBt6`PI08 z9D)89$N%i{za;x_vHymWV)#rc0Lf0C@Qc{jRgSQ~kWl3V5zl-3wD$itO29ua=6>3q zSoGMr@b3jArFHtZ|Lc*tCan3tb^yBj|C;lE&!qn9r^re2A7Y@1+lv2T5}X*ZTig9_ z&>;Y%na}^^l01)f9>AwMh<)Rcm@pkv0J^r~i*6E+M2cC}pUGSwQ<_i^Qf8GcMl6Lz>?f++i+~R+n{ie_UN$LCY ztLuM8@8SN90zX9lr%Wgok=#GoL?)<0`Tm7Iw(vg?p-8F#GS5GoN19QA-2DqqrlMr1 zxqoZVq|W@${K#NHCS&<)Ikd1-T97+z=}-78l3#~u3zaGP|HZT1ZmqfOSMOQ<|FWM= z2w&sQeM{)4>%#)@pipDg1HUVHeZv9dDUtikrcklUXKK{XuuxK~lK~`Pp4WhX33!WC znMi>wdgtaZCnZnHmvFJnFwgj}L;w(%?RXg$gv^=A2>(q&sRzYEITF?%XMZ=`#H&AZ zGD7BxhiQM|Iaw3zOr(&l%Jg^ejy-q9uWmb;%3Mh7)3Fjf%7=0r1C(cG=p2BYo7#1l zMUGS^{#Y=+K|~D5LNZm+8X0mLq9JcpqGFyb&v!? zz(bDPu3du(t5_)iG&I?->A1{KX@rG@e_DuUTd4cI+Q)~C$jnCZC$U)`GQ%DQI(nuI z#rp@oc#~9IE~JRkkN0sKx{3r(mG>HXW#NHfYS@C?UlZ*yvY$q_9`Z_j7-G4z0Q^7_o)0NwuIKOrzPJieb1ps!8v=_tZw z#J0mj>xQprfK9~`$3IcYlu_;Tv5|wt+TvgELycBhIaEngAyLwNP9TM;wEHN=h65S= zY+VirS>ROi&Og+P*@Xf|=_7Y@kMbeT-dvMg0L~0ZG5$_;ze#;9ZekbvIUH&cTBlr| z9&BktMFU8cgrv(57G|ynrPgqEsh{J45Bn2w2E+IYo1{BH0B!Wc;`}R!FDw=mvf=+d z_!)rygLt&aKRRK0_6IHzK$SW}UiWyBxO!Wfo6pKgEGZ}=?jy8pXYw7V`SPddr{bewoplJ$8%JDzs_S8K zw18@dkW|9GWcx#C1aQI(Kuam9V&caP`Q7Kp08^TV(Pt0^82Y~r(S4>{!e!kb6$zhl z7GrtICOS?Ika5(nhtiMeuZq1*$>skBRVR`a08t=NccP&3&w(?xf0KU9scE;)XKoi` zdBliB`K++w;PkjZclrRs;mO&C5TehzfxKSqFOjpR=C{vngBa(OmFI6g76+I6@%*_X zK#fAQi!A(Gm~hYWKdF}50~U5j08ByG(?S7z8`NmjeWK7`?xNMPpM{D*oq;3sKbd0K zSVV;W$}*rS`5$+S>i?$U75|$ye5Xw`VudY=geV#b1$c1*vgIg{t3@>Rd-}?HjdBbL^ZU9fokhY1&jP6xx!~>oL30`w*yF+eNFqH?x z09|qz_-x*ZL_YM~T&Nq-rFOnyxaA8k+wwEQytO(E-X;`4t&56lo$Mu)Fn&s~69;t@ zxXa`UToS)t_4)`(PS&@^0894pmr)dSc&Bhe=rje^Is1P5q_WV_lB}Q)Qrcwg>c|>) z`~H^>hI1?3sCG8pyyNQpYN+}J11$<9qXXEsSxX;4im0XHbt#PuVXS38X>?u3k==B; zj%bP5(B)#y@>|P3%t2XyK!8Qs9$$f0{2kE^Ox=tuD)j^G&$m8mv$4D`Xe&btd1}=F zK+^N3zX66t!C;u#&VynwpoAW8^Ir0-#n#cP^=cEi)_wuui=;EQ!RXdoQ21ji2)N;RyJ z{Dft*_C}yle?|IEQ{0TZd7fwq!mV9$+QQp!fRsk_jA9wL#tkCKtnjpHH?_BnVzHI@ z?lsqc_2*+QjasxCI$g45Q=7s7$m}F}S%T&LA9XTc z{dO6$&oFr7l?;8Kur|yAM{~TJd(%sGN9_V@WO|uU(u?QcEjK$#|75L_6o#LgO`Qy0 zRm=hLczxB+g@2E?z`sJUV^`$S$JX$~rs%7<8`yMmepqoR5Gm?+6xCNR!Xi!UoKI(( zk3r0XVe#LpV5IOQ28nD4(yaTM-iBu=WPWx7z@ysB@}eAT!ON4Q|B|u5<+*A56K_0T$w$i&Y`t0wvJ2AF?tZv-zq%_PY8nYE;%#rboDodAO z$)rzL5}MImC40!7fZ?8~l*$%KD^Api31LBR%zu{v03|Lv$klHjAs%@oD42-OcqF^W zs=4QO9^pj~$AdX_J3nUmSN{gu$e5xS#D+^7lDMPwj)vj!tR9$gO-a`nHmN7^YoO{^k zfCH-Y$?+0_U8~)c>#(4Fp|tcs(nwr2Qh7IF_r(O20}d_kPJa0I@JAdkW z2iw4p-OTwMp!cnf`LT35=O{#hU*8^;HhhiLL6((-!9)f+;C@9=`RObYKVfIAdn_b} zPddy8cih=z@+8yghP4oVk0$7?u31q|-F$vnZn8(xGK}>+&OGnE0#}8<>A{NPLYz~L{4Dl0dX{mMQ9d<+E0?~lffrEpUl}5onw!u+Bg&@J^Atv z7u|;-61MbS*yzU2<@JS&IEN(>YQ2xhbqA6N9sO!XbvFnbR#yLq-0Y5y1k{x;EeZVY z!~uv74i{vLyiyWh?;RMl!xueRE(hq5;6c^ITU=%4;jZlYFFtS|+gLceZ~_A?_Y4=qetdkESu%hQnP7( zqznec6`bH*Tdp@E^o~s@-a7QoB%>5gzUXAgtc^g?7^p+i{n~yXH=JxMzd&sEI@-#s%D2mr_wcP0PPywZG4@$F?>!Hje%2|tckG|bpX;4 zq+jeAfhcgjW)4fo?&r!n>WXT^x#gONS_gwU7A~-L$ln!b*bJ$PS!(tQT{K>KKhp#D zba2%AhRvjH@AcEG(vG(7m$b43f(xuB6e`Yq3z}T;I*~QybdJnnTZOK4=~jk$HsJiCzlkOms@?ofhW&}UU{$gC$P6NsrULnupB~AAG&+Lcigi|P!r=(x{H7&aV zBk~mtH?^U})PLQiU_%-;u7V{_EUv{alUbSiMMOT|$j|krAvnUPV zje&$8yNwu9EOt8~C;3ZeVwK2nNtE$cMxtul2DP5Xj(em#_jClklSt0vM8Z~Jct?xK z&|Q+Eo#?zkU;!^9MBUvv^YB8x;?M)}3vUcCHHqE)@G`if}^}2n~$Xf6F_>)4<(aG!8BW}QqD_`_|FIFh*a-OTBxrQ=BJ zO)r{yJ>0t=o-TnW*?MrQJCeKne-Msw2bl9enuIhHE9oIj;UsZ|)kg#_s(bctoGX+v zsrwMCI7`%au-lM%^uGQ?RY&O_iPRGW$~S<;_8G-5%xbr>xpeNxYZ+wtA?=xe%F~TX zP8O)CCu>`FiqI@TGiQqN&P^)G5_~y&p}PElt^B(HP}y`r85@z;Y{}C8Kn^*~#)`JB zOlBZyU$IbSHX1uO=<$C<^6j_j>^70D)#!>syW#R{c?rcoLG5oKSP_3tr*DX{ ze(WCQqCx8o8-eSwbVn+XYwglRf~kWi8DlZuvUxbzBAKK?5^m^_ZGPDV*lVtcVSx7QANAfv#X6a;d*eRDmdJJ$y{OuEgEn zNFl2zGrS?_isSsn{ocE*;D6aVqB!p>@x!;5>z-;7#>-6#$U}XD*!iK7{#Bu@{WMWi zzq#fl)W@oTyJKhP8L`t1p`#1_Qd`ROi!M&LQ6F5E{-HrF>Z8FAS{|o^-VeVdZQ_7E zj7Z|ZY9^A2;ynutGO*(X+2T36*W@$v?n|S;T-tnVfj`98|+t7x~jxuanjD#*7PXkubF+pH5pMuBQ(h2I14mXea z1tF{{>f|x`A?_JGr!I?!1N6FHl~xcm;Q-hfHXaj+Uj>i3BUi<*P9jcm%%{5L0e zU7rK7SG|7Tr$y?j1*G~ec*nWeISX~k)U{4YoS65{phVS~NUnzBcOaj%S8)PGkT;@U zsu#y9=O2B{pVa40it83}mjj)d;h$&}9e>*@GSmTo%suavUCQrK)5fKan3vqkifNEk zP`?w!$ay$Exbyp_tRUU0RRxPUSB@o#`^%t|Wo4^bP_~yrnp+$@piq<85)* zLhIHa$w~m}anEhC)&GSh4sr?uloYK}qf3nIf;+ZyMvOk*R|)A=JJV0t3&Uw!BlM5S zb>hxbOF?$`OX^#*Y0ch4{%`8SQvY(Z;_zW+K4ImX6!PZsMvpHz#4nL-$y}TpN$YRB z2pf7IooUvC)TM-+BNiN3aozSTDCCd zCn&|f?UR|+V}3;XWnbMfp{ID9k&_#T{o%KOc;a@CYstq~FrP9a9JjYGI@Ldvzcr=5 zpkq(0l-gC4bm*mPvyD_=km{uO)pBzvcK27S_FW7gv)C_u@6O!c>3WYlL(q8GUi0dz3tAz-IdYhsVtjT&QNTUP^@S}EVA=+$o< z;xwy)Y?K^t9@aDtS8Dq^I--mkqc;ie#m`s7&}OTVFZ`REZz_|RHfUO-d%7)v-E`d<`JdU?Me)?Jz4r8^f$ zql~B?t|7iPYN8w}g-dzYF`b4dEK@DW%-p(aW_2QXbn|4A4TO=|Hsk1gA7$NNW+LPv zd@XEwA*UrjqPlmpq@W!x?GQDn%^$kqZ?LCIcREYF!xHrJ+)F*h_j^q=w-l({@%i!W zDsd&RPhk^v4M|8$P#F{sk5Z34fubNlU8M&?Z!qnENc;A&^??-sC-21?Kgmuu42jTV z+|i?>S5PnxXEWwz?cTjv{>fJlC zO7yk$gvQ;ZH8c^jI=?}<*pm4J&=*|h4vL3Is5ci;i}gNpjN>E)!m=XDKK=DN(sHLfdrEK1*J>&oWZX$UWqtFcFaR{o zkzVe({BDtx8FudZhb*qJn?XU%Qj0VVxL@T}YJUMvno0s6sI&MuLL{-UoXGu;wnjm4 zvO~px^d*WfZ}{(lz)chaXk<*$viOWcC9zs(d2fu-ak^a3ZTpu)EPy4|O+I@z&fpsd z(8T3x_^U4=UqLON&}&U~r*YOYKHJHtmRG^9Af<#fMg;~~NQPT5ws*L4)J`&*V9a`e z{Ly=`nn@Ppy`uop(Vaq_2g@}aSu%aYca;Fk0Ic(Qy!YsOj&S_=T=jn+LY4X`-KyLvkjK0A=B(N zUImC~o+W-8pT@G@0nVxwY>isYD%NAAiv0rST5n0yC~8R+pH#3zzw1XMwNKP@{K^oJ zqyqF+2vIxg5<((YfLwEXk0~N6;hGAM!=A_BD}IoUz7dg_eTN5}1bXVnYF5*k!$^Le zq!wkvuvzwY3fWWJ2%8szFo^G9QN980Vco2^u-ab*bOR}*)_BGnI0bo&Mo+Zunf=+f zRL~KKN4?-Fua(OgdtM%Pv=)KA5^+9{+l8KA(+AZ%Hm2;J{j4_Crn;UA3O9)|Ohlvd zklTrD5vCa>!m!~r6|E&czZbyrq$;PmO!_nMUT){oFyqS059dMAP|*SWn_QX9>{j}! zzGq7B8V+zyf=cv!_)sVDRYQ)bFwp`&i(LX=$rXbLggJ0eAbvjIs!jDXo|2=xiVu3sTh!q|2>o45`J@38p1A861j>Zd^zNt?-u@?e+G zdexC6gn2xNMK-80CqpwOE86Qr0LM>2T^Hr4Q(Fj1fK}QLP8Pd~-Bi^a< z`~YK@FB|2xzgN|9WVN!B9Feqb4BvFS&@TS=!{dR+gU(FEn_M%zUUPI62nOAv`AHQ$ntM(n z_#|?VO<$HHTo{zn=`HE1Rf-L?G$GP)#+?c7gtsSj$MJTHo@!^MfZMC4NbwDIh_C zqHiZc5_Rj;J4TH!*3uG4zYP}>it--7&%bTMC*0|g{8AbH(TGA%xC}UD8?!zPK)eaD z81(3nZDw9VCzNdWlPB5}c(uuL2Y-CnXwuAl!nvl5N}tXV36XEM1~l;X(eXJKagC35 z*C&=WYTDRq)C1xS8TGKU&*;f0njfqjJfRYh?Sg(*vg;h%kR5^1RFDHy#{xS~o09OR zX3JimH0Rw4Kvp~39N^rFwdU#|oju~HUULXdhJi`Cm@*UA*D8*#`D&oBS5oXn6-l)m5?2UA9a4^c*^k+X78GNe?~BV+m2 zlbhDqkCklU)Te8;i9%mopqmkIsh78D6ywy&X1v)9?VHZ8)W%n&6&6;5GyiQ1>&nC z9Kx2+=yq5FFMv7B>imhH+L-lWU+}y9dQ1m~ca_)QO<=Uq7}%3UDz%xHzrlfY=HMq~ zGV?~5%lr|=!$2zi1;vtBx&w7iWNW6{xJzj|TsPgqCzI@dY9pih9(mQL!@U;iL*Er( zxX&Y!5($VwyxM?ddP!qjGXyU3bYUM+(3E9s>}Q))PV~}M6CKh8Lu{cs8->j>Aqp@w zH-m4SlkQZsWLLYjX+H})Dou=$n(Ue$aQD$5#r2h)v#GBH#YhSJ_#s;pvGC`(DdWm# zUz3XzX9sF}sD~%VNS(cbNSls>8W`u4hltU5v{sVdOrCN8PU0|8I>W9-A&{fs=uU8- zev(Yz;t`)ES!z)VIDKJ{@y3%82=VJYsZBBFGSr2$4hu0P^|l{a;Xx2hTU*?N#=S(U zEmLcz^EyW)43xb+Op(5eju_~k$#mzhGi1*FMvxZlQWg%Xb}f`HlKN0^R4!Vshb{A) zPdzm?1~&2oShnOnmatq>l}aEk7SW9r19ndDCtDnetmDjJ=u!($53)n$MK+vC(o;CV zAz2@)r_f0B^m(#rTC1T*eo9*rwAnsU{cP69Nj;&L0)}&`;hE#oBf1!S!qa(H@3aOj zR{HqVO@bjtFjxUf=rgF9He&`sAt82AZ>kLBE2I|5xZ4ctcOjXcn`s!H@beo&$E2z2Sn17nI{<&=us@n>aT5KM|uM#ihB@E%?M z@iK>~U&&(Fha^p3=t;bXbnOT?*%k^KU7<&NgmappLhWj!DSx1SXXN?dZ}_=_3O+PA z4#|i_Y7$Aqv971PbIR;8Zn89^w`pD32&JQ&y;4)q>`iAV(P%mwjA$bICpZys1T0Pk z0yuYy18zUlnU;$AwFW*J<|k3<8#O9ee!9+*u!@M4R^+_Bp08fw2oVff1Ixe{zFt^X zT)Ae(VEr8?10%Jqrf~Q7d%f|d+gEF^PR=Q@3rD(f(^9#mPq;&Hx@gL92dGhS#3GB4 zfIN!)Gy= zt#m>FtTZ>pWze1M?ibgS9oa$^MED$4Lq0|gd*8swc!*E=)hH8cn%5P(4{kNlI> z3xye1Mq)}NMyjs^9M_CizuB$)RMAHZ47#s?2TY;{0qqSLPCQJ4x%G2j!8X0#wFxNpO87((Xw2`Dj zmA5SP8DWa@eFnmc5^O8a6J_zGhlM@vOb6UkwRUCW4``3$4Dz6i?Si<%5?==XBqdgN zjZp6o$yWs1Cri}w^az33k8&Efdd{pkvg{=l3tsLA*^pz}y#E85KxMyKwuBf_8z0dk z4JKGb2_!RNz_auTq#T^k{fr#CmwUerdiZ|862L)B-P;RTE+2QT0_>0@F7YW)tOpCM zzGt~YO#XN<08e-gWWej}*rJ#cKvi~hE_>`JrTqP;ECBwElH&htjVa3QC40x*pR!Sf zmO>-M2-m9^EkcqB_dO^qyPxDptTS4tKM|?TsvRj)0OtVB_WukA7gYA;J>H|`aT}p6 zfe86}Ug)0yey_$aOo59IC6pbU8vliB?7whw(BV+L)D7q-Np6pLQx{hC21_K5^-{aT z_$XSwxmma#V3i<3NIIIiKq(QEOjMtE#MI?E3MKC*z}J1!4(8hhbW9n#c8evDGY2c^ z@FvSMAuCZ-P7k45fV(`n-n*g{+6hX_md9A=bPia}V=4A~{1C`eicX6k;v{LsW11t#N!}gU>OXugkBfC@d1W{I*Zx2B_DkG~_xV&rtNw5R z_Te?T&gZ`Xzm%6QLWgBL*~ReVxa{uTf~A_+R* zE8th~nc?mUT|WZGTCIi?`tg$(cUJLG24Ag!+=Lq52pv7+uL6(lLfTbf$)eYJmO&2j zv9pe2fsyQss)M{Ipk^%IiT3^(h>`5$_ipnIk-yK^(GX&j{y}Lfoez2uJ%wT<_1S zA2{tN%>X`8CW~wa&db4dV7k2&UxnupO)FOO*t#A#h}(gh3vj^?{KS6=P)-^IbXS_g z+5@{Be;=B5?0Gi?z>GUS?f6CngcKUS4~@m8koTQQ^b1uV}Mp3-?he6!*A|&cwvQz zbDyTpX%P`p7&rzdE#JbEhf{-=w>EhC`=qSy;2xT=e=)nF3j4iE)jy*1YSXyh|1nsE zBxB?ImgSY*gWDhPmoMA0ng#b>oq2Lg)3&Oj@~f$f#qzR;asRQ31}Be`-SzNj> z7eZ^WcwDG71pC@a_7l#Fgkd!cyIDThqDIOFno+T1SmG%!F6BP&`#nWONWtg!VDUHn zhxqULr4NkmQah~gG@x0aR37iP6NgBq5-?UoBvYZ`!7(v@iQKA#vTc7>BMm&xjXflEKb!`Ozn>?sbAOijUJ5s}>G zz58;<87o?Sm{=B%L=O zEq=qHZ2xi#r+T<9B9hDWQT{oZIX<2*uq7uCX8jm()I1VE?U$r5@VxgUFm;%xDI-q( zf5SdB5f@12#?o@$YUADK{?9ylyjOPJS~HIXnM?_U6asD)oq#H3#HB1nU?66Sm}DyW z>lWr~VJA5h>J~O{f3&svmpSbG8@2S3g3f>NO5jwI>GP#E8$m7mrkR|)2?Z&Po^;A^ zzgtJog;u#IY!xuDtaog%)A5P3%QoC6_Fu*sH==NJ1yXr{%OXAehJA}_H_Zwq7_NZ z=@e21@fJxcvtjk!z9&wc7+I%mFIm}&eK)V}6XRyasn8@pZTOBx@sa|{?jFk@_o(bL zr|4hDCHi>AH6Px;=7DdV`Q$Yt-gq><=kQ(8{)x2jR6$ekoCpXhV9J*U{+dDg!>m@I zM6Vx2o;dq-+@--086|W2~4A*xMsEuHCwg1ccEK^Z$ebOorjgNrJJlAeG(ELth+L{PVwvLh4%@kHX`eoKE-}LwUhPnCt&b#yR$^zoQ>lH{+ZQ40^l#qEfC zc*lotYkR0P`zuwRRVUar&2ARN(j*uigGY!Z@EI)c4K-r@*#3Q2Y`(jCZ5d|rhPKXV zaTQI`kj9XzmdB9I!z;7D-PH>_i-<$S0#!qthzPMTo2LWMYE%o3^S4vBY)dwqrxkR| z?&2jRPg%vgb?(_4_+oUqbbmi$G0IT_A(lzs6?h(DbhCrTPPM$yM_eFkX0vqgMBq`A z@|5i@Qj?A;JMZ4)x zkBnCluL#f*Zx+P6`2|)FnR+)H1GWk%BWl31IQB6O18{6LO;ooa^M1ZAB0?;O-4SdSAt^ZY(Hnok zR@&dta$Ns(n1~3m9D{K|M5I8mcijz)Ek*T53vvByu!sn;7!Poqx?2k4 zvJ5l2(+`nY8lMKBigUr`-u!dSqRw0Mkmry!P#6-p77t9h7 zA(kTX{jDA%Bn6XwJshBM*yd};O=g5JwFL3Bcg0#Z#Emm2c&Qh6`!mz;-gPX{$r&Q ze?w!U{Qcv^S0Fsj-`_vMm4OD@CaIE2c>E zrxsrT#?{8#&bM3r+nwXZ0a74L1}(o+7?l5efu9J?sMM8Jdrs`6KDC@_|8~JITm$>o zT;VTbV)-;Tu|kBTKs%2^A~GBAdjBjKVsu9UVv3%X3&Xa=i6d`Yi;!46$16w@VPWBz zSSaV!g-pW(5t@n3MpWG^Vv++>Hx`aaZ5CyR*W$ljl} ziKxKq@tv)Rh-C}??N}k3hHiBPC^SFRG-_k88BZ4MuB{aj$(h>U?+{VJcfCbnYxpRj zLjV50kR=fNqQC|b7cL1OUN+<3dUfIaP;=4d-}Z~B5NI--)=w%3Jn%(ftAUIK?uxi@ zv0wOAoCtGY$Wa=8^^#U>HQ%2{b=U;1W(9=8C@^(_Mb4j%9A>~e5)IdK~ifC#NBKo;_a>hqeN^P zyMi+8w;k$;DA$Etq1j2?u5Id~92U*(t2rXdb$uR+faFw>k7tUg zaA?0cKT4kPFM!;wg4oO`dND6gG3{Cc)kU0F9D6KcnM14N9GbGQ`=ZXuD2ULLU*~Z? zwvP{w9TpSkBQ6@Z4fw%KA5z@u?2W?mSqbbEv4yk#?OLJ;b6cHzA|N>xT*$iS)_yx) zM0qK0(#s?eJ0tb%zN|dW;VQ~magDKlF*OBl0rGfzADfv#g&r`og9t$-g=6v)ddS3YZW7z#YxrmWhY*yAp5&SLctmQzOiv(KcN zeB8`7yoS$TlRpn(K&DyrItJp5h;v!YM7))qQ=j;iLyh07g`+-YB4od98ts{ zGFy|GF)>r&0$dwn&=2epx8mU=IO%i&I9+Dm$CvZq^$ppzWL2IZU~D<@ zW$^7aGs9U^fxeM5;oz*)RG8dd{5kA3bT|1F#5;Wd^}}A;F5;D-t2l0<#-P1<25n!Y zJpo?Y^E};kSOt7bXH{(-257z5N#~O>xwiaikxz4;KtgK5D}5dQF$Us= z%)TP~FX*30m5<|9Be=5~yg>1hi~ z-%o%+x!cH=%oy)qTK2EgsSB056%kh%5wdrf?S8lHZOI$?D~@OULgH=DUs?b6 zpAC9QlGRlHQsgdwb{2%2ImFke85$amxIY`%9&nO`)-OcXv;o%jjsB0Gh)|$6Jha zx;EcmIOCg;X8BmX-{v}lE2XxGHox{E@PFTzH5}>Y?w!RscD2Jeox!5CR?%(cq%mM1 zHfkjQci5|7sl!D#;FTuVW5Nv|*WNoM(Zzncr4=Fwwcv!lwPq2w8o+5KneN$v`BY29vgKL4p9h1&tWQFW z%hgw(cfHl@vRiu9RT}b!_3mjpuT7?H~}5tphJ6Jwpc&H`+1Z=wgLCDYO=6%Yn+`iNjc@q637(E-Q9ZR z%t>;2$$ZI2)4Co49wyf*+qHj(eN2c*Z1-ksq;D1JF$qHh(9|IaHRbuB4~D{7>D~51 zvGTSpCQZ;wMT)VDA16;ibf3`kOLp$Ea(je0z^w&th%l{^EFC$qXa8r?sh%D9OG|3- z-yB;%KUTiaS8gHnxDOm0I`klWsy)r+1Yy++a+8~UqBNY>=k(>DoMjikZBZ#*tCxFt z`FUx21k1gTpdbujRh?TIH<0BL_Ycgp?!cWq7>H58b!}0I*5Xx^G%11j^#;axY~I3C z$g3N&J|W8-OCV2kIA%)I7CILg?xk1;6%vo9r^XqjQC2gYMiZ`z5>6Pg{Y@jyB_PSm%tVO6OccefBJE_*0GOkyd)b)GuPpy#nzdv z=4@w42vb8O*PHx$*%-r$h2zc}U+TW|Z-%o=$YCfxIlM zjf1k+msbFomOwn&PkREZ(Jy8H0$pG7Q(_6^Mh=H`*$;=VwUa@Qhs`-)i`n{*I|FT# z)8%TQeP?z?dW2;T-*@m@9xbN04cE-yyJ4Dg2#`xYx&^1M0c3bc0y35#u z9>x#xb>US3+Mx%B@O$|8gah!^KgSRK0)wfdEUR`BVH)ne;jF_qFP>1ann{b)V%POP zD)6;n=6BmUhy6tzFgjGyY+6w^f&lHeKRkR3sF(Ua+-9>kSZk=k za=@biCtTfD>OmFuP#45OvkCri93>ES3fxjdM1_ZG3B><6l-3BJI&YyV>Sm{<*R@Dg zx+=?fpk)q6-MaT<=eoW5&s-=6{A9j8z}Tr}`{ZA1@RMtPl24zKQ`oy1|9|))*G4sG zZVWn@WrT7Ltl<+Eb$ndzsX1lr9NqPLch^w)Z|lZ01D5*E;yK{gOEL1vzdJkI7;Sj2 z;XRdIJD>NO*qs8l`bknN_SbBvTq#9Y9DWL2CeFlwTJQIUR_@n|8pj^@_=<2Ft1wnZ zzm_s?p%1WFglR2346WDS?+#8sNre3&*Qa*7CH%%JDg$xBhgB>SnssLny+(?i2z)9Q zr}n75X?S%$;pn}pZmy1=#n2k1lxtWu>}v!mEnUl{z*yd55&IT<7c=>58}dhMY?5zf zM)OeCJg2$Tg!QtbDqj*&;bB?=NhqDN`suvx@Pff;XHBASRAx1RgxSl^i844jkCb9R z|CDBZ$8hUx^oQ_{M@~LIao6t7Jf*G|N9^dIvAFqv(E5$*-caD=B*Dhf9 zG1qvG6#G#%-3eJPp#<`>#_P?XPzAY{F@dBhDW9p_C?zFKD)kXgwlTz zvI-b3N0NQXvkooNZH_XAl`A?-kM>AydruYy>`6`-_LFb$CY^zo%~KI-_x2>UZ1YnG zZAKj0e%@${TKSbjwOv?ozjAd-?bN+DP(!&S_eVrEfX+!9^ybsbZ}YjSn_0qt3VfaV zm)F$iJs3?hP@Ic}Ill`Cs@QwGIQ_2m2cQ-PQr$ zi`UK0X1r^#Z_!-kB4f+S{c2PAY*cZ8iTM%uQ(0_aE~|LqePwt};1+0yVh#J-ySqwD zv5!?aBC${B@C&}Ke03n4y9DqiJ+r!w!7qLxa|0!imlb2Kwck|Cv;<|4*PIiX~2k{B|kEEMJ!-C z<}Ky&A^Ba8X9b67N-x6uY17TbU5%#ubXuH!c<*9FWZDt_?br#js8(4u13Py`)229S zmdPk_r9aP$*##zW?FBTnd7<(ltdYB~|1((Nh4+Cxkw2xFnR8h!>U#2kE3nTUW7!c6 zt7xoG9gJYl*Gkc%4m;gg%Q8zaJ3YX=N`FRqZ5zJ$Fz;_ zI{JVmknVDw#AkQ=Se`)ec51%2W)-JCli`Aq;sCRh{qdDC$iBS2ON(Ce3C&(~sqnYR zGwx&A`xq=$VQEv*lvRCpE7zIPDDx~EN(toUjrz;%rw^)QS^|mr00y)7nzQq_qpYSd zZ$6+^mOEl4LQ!^lI0jmLlG0qvEJc?9cC5ZW>>s&+>BbLkhJ3E)z2Ypq_>$y|7FeT{ z$ir9#N7?qGYD$xle%DICg_S-L_Sb;QDa|4pRuIfjJ|Sk0D*uv$4x=I~f?S(@$>+1l zkEFv-eR;E2qz=w}UKx8%zMowLD>KA^uC?qof2SM6&1xX*B`c5c*Vd_{Bi$v(9>e73 zv;9Cn<=on8E-ERI7`Y1^32@{;U*^^(E_^Z{$(p_w zC08_o!I**kRD_*H%$ire%(kW7b}yejsKlvpO9tN+XAAqc^1rWBfMN3rt5D!y{)_VQ z^1=?u`(zuwsZ);?9iGn~Sxx@*Y`(|PPf~l9Sd~SG5puP`W92?fw(0=f<|!cTG%Li5 zA7f9kNBM|Z0y!iH842AmRXz{tCo%~8ru;3>ELqNKMUvHUwEiQxxD33B0l4fM!Kxvt zdmHEa#KeW_SVhPS@GD&3(FVde>v#j)kvBDk>VUL(Y+_U$|_(V zTm`G$)rd^a2>OQD_a$$$Tn#6bl03g`ie~)$!6qcRUSRh%`$MEIYLj@9{hgH-Nt-=< zB6)wf?AzFQ%*>PQZ~IND#&57<{IZ-)?*dN^>N*DOD~g6IkEN`Bd^mZd6qfnr7Rs3K z&@IAhDh?R*p!~fb*mG)k2J>&%h$NPnmhei_ z_cc2$d<9PI>?wks28nq{p>`>~Kjsv&&|H(%D1p2r{o*Eh@)b}O(-KIj5ow3?v)|@u z`M7m{r_owj{vxVTQ!U0R5B``HKsDrIDdahHU0xAqY<{D@>v*MbS^kp zYe0a*KskAER}&>^*jU~MS+tZ-Khz3fMSF7N&>Hr4i;$wO{|Jn;lM=tIfMSOITI_TE zj@=^ld^-GZ;I!ydKM!nm--&%nYo-Gxwv*Gg7VEdMA87>eoAG*C%^3QZgfw6^ z`qT!Rd9SkbLrwMLtZI>RHstw75QapuU*l4FeWOoUg})N}(Jc&QMj1(MH)1Cr1G zH8!kLwU!l+ys#(-K8T2)*gEsYFz`RP8PxVR14Hve?m&X+G>e@MsAS&^J}FQmXntb9)G5_Z3r zI=rvPVZ0w>-$`Cam(?W4$xF5DlDoME^HkC${Umo`*k`S4;n2mH_`txpQ9rQEqm+ui ztKj8zsAeN}|HZs={D8d&IS=p^-ly>#Hj;hyt{E)ETL(?qH;_H`GkNm>+duhJZ_!AN z*-t^S%!!|WB()wI^l=`pfYjM+yHC)RJqdD)dL}@=svye9?o#e@Rw6dGeOr-|015FKIXP^X)%eP)5qW-l-y7rE=}2)eh2v`?S5i)7CB<98Ui=c)E`#^f28gk!YVymt5@L( zq>6lb1@J|Y4y;hN_P!V6mOHqsEXIy_mG>h@A1^D=lsE$C*)XozFo+A+8z;0AQ z$468+cY#<_t39;JZXlDCp}@BN8p#*&PWugVi&|q=t1=uKY|~1<`rV4+6si21?9x;A zKKw_nX?W!J@=6_0i#NL3-)C>Kcj^dm_v+E+95rWk>=%O%ELUwzPTqu=%)|uJpCu6G zeBLU$;m=rxXHim-tw?QMah%Cc=KLC?%_j+6>cp@3HG zpBj)yV>L%>=agD=%nz(c@MCovxx9|=#0#4W4)SwGqvD3n$AU5qxm+aJHH33GL;SA&J)OSxmk>*mq#)EG4vHy0duVjrwWgZ4o|f! zhUEH=Y~I_-Xtd72CRUbMf5AS1@W&Hb(b9C)&D1hASB0KVo#~Rlip)6EYSyS|zqCy# z-c48uS|Yh78a{q}>bkt=mDBw0%5GmFCE(oJp??u8d%e43^}aREeK#p$ELs_~j2f~# z!%KRb=uvf6w@WFJ^*#FCsLE@?Yl~03X}l$8-ZUUc=in6(;N`@gyq9Pa8_!+xoJ8ixPT82oWjTf?lr}E>U*vac=4ND+h+E}wwy={MCAiBA- zLYtq)c13H$0r8bs#`(ao5jTRJAl_1bYk{l(0=|k2`2acxCp2M2N(ig!eB(Bmw@S3F zwuG-uVSECy_Y&Z~LBo`9Z>8!{3An-vp7H~sWf>@8%!+c8&6GaaYuNI_nzrgP8MtP! zn7aX2b{79e{ZYxexp8-BTjR6o4R3ZR%~!qx8e6r?ZnvZOYiKgaJM8-(%S&mF^7{t||5Dlw{D3a(C(ItJB}*J0Q(2+EWK8h*o%LGs-`!2U{b-hJjO7i!eF&~?H*!zHo&+C}GP8)M+VNL~_Q?YHc0HI?6%3tyC=PKL?trNuQc->pOz%QuVv56OL}Hta_?iuWK4{F%2yMBpIHNT2@6?#zC7E7+}j{Et5(4hG;HOEgyf zd7sCiF*oFn_`u*{$-30FwPD7 zqbO>&sRoolUYcIxZe``|=#-QIlP1l7ngf$*`nj6B$g`RLir#wpV+ho$T* zgfB+Pjm^WsPU-u3d-9=u{n z%Wdj5{dn(mjn1r`58$VE^>|^eZwA~O1^gT z&!ttem`N`1tKH;W_wJQ@^=<5DzVr0F;0e5u(l@0k)wNT{4~|W1KcSt$K(5?ZhJCjy zu3IyzytO9x3nxk-FD1^pR8pN=o94_Z*|tXg`u+ON8gzSO|Ee3t$C~vUk?*ohAbh|h z_t}5r`rTTyBhJe3%r5l$@=jAvl_*>HjOaJ?yNu5+uwp*3Ue#eKH}pw4X>xpAqq-!y zHi206I(Xg8hu3aA9KFs>lqUAg>mN8>WmEEfU2pcr`Z4xZAF&tk=VGzel;f?f?O%i8 zx)TbY-8^j_RAwpgPJ6dzqsLvlF?M66VEM-u^?DanmtvP6nSbTdMbS*1c;Z&cIV|aA zID&D-qdA71wbiTCa7@7aFa-u3B+di*2^7E3`yE=ZM>DoJ0U9GposN*&@QuI zk#gD;RsKv$K^u~gkhcFh%FnP-$a)wru*aV{W4kw{$HP8&G%LRiIzW=eRXb7hJ*5&N zswX}P2`TL)QLhh`$BYI>r5z~r-DkFGlF>8I>( z@&3;reD|&LXL-SA$4(9I<`!q9$g+5C(@yO&Lhov$x;NeoRWiuw-mac~TD2c;Y-#nV z*P9wnI!NX|4Jaw%Yzt|KgS><0jn~DUAtPY=z)hKBKa=nNcU;{oaPcAmyy?8 z%MaK!*}Y_UOxBFE?wwymUApT$Hu$4L9$wE@<5% z_v8t2mc~0N2Lo!N{#U_R0&)8vkn^oPtj_Zt!Ud;sV%l2na-5`1Ged#oA5BsAcRrLT z>Dj-j%Zug*&p6v1SNH}vzxBzm{+un8KuqV6P_F*9v+|GLWV{y_6HDB*Hrt5*{Lt1S z6G)CEyp?9!bF!+ym6utCIbqG%_ISv@?pDHAt zN*T|eQ|{FpKbRM8#tzi|sA2iN&ILq09Mn2NhoLyDj-d^)Re!Y z98gPhcB#v_n$;|N6Ho#%h1KNIr>7@RYIqr^yA_BOQiu|W<3^yqh*Q|t2g<6xW2+Tk zgPf>>e(h6K(CWO>?|__-igdzbc1PF9K4CDq@f6|8+kognIAKY47ehDMif&MzSy;51Lf zIYkL1EAHhR0A2@`nP$0RD9|a%vVYlyDS?Fl2i#A)l#ur#V7Z7@%>JRl&M74S*#(<@ z3AF5q@0Gd}WDZdR$(;AFg`(WgJ-jY6sG21=WEG|aA}t4cr|mGe4FYzHSj~17oCOt$ zS%geO%a>c+m=Z{)ya%VQ2$;*3m}UA{-Y8TF#IH2&rER$`gCL8TV-fpH$K0B5ObRBq z(l7ZtE)KlRCMc9ZGUDAg z$Ft5&bI=7%2V3T}kV2k7q$pd!nc_5@-vs-nM$2r+KQOYK)k3B;)Q+FvPiHq41VL2F>Q1&-*Y1Y#k4-}xg?F#9NhyvTK?*~ab~ zQ47~{{^!dllt3&+wF;nK5RxhT(deJ!vy6+^ML?207=&7RR{fBzw6u;8N+9ZDm+=Zq zJ#k4ygcw)qFT{v2+ctL-0a1AOY4K6sHDAeE=uF&h^oZ)>eo0>#OdwFx6}(l zGNrGG8Y0X#N+4;uJy}>xlIgOGx$IHTWx?l=GhwCEGU7f&%6^i(AHQ}c1w&FQGT*dn=7K$ z9Qg6)@2Ad<6qiZ9+K)jwJb~>?2_#kY%?Fo7iJs?LqqcYz7Jw3n8rc!vX%drWXt|DY}l}BNLhVt>y2(zgS(mKYT;_2_0~cDgYW3v4p+Q9# zrEz=gxI?!$%`tTD^s_6&FQphh=)i#nUPGU~xzS*Oyui{Zo6$TGbK46qowg0;cuM;4 zT|XcQBYdSDsD-bU3G!A$u6$8cWgEQ~O2Ka(4;Nv!Py$g{^*d2BU)!&^Hh8z4cs=T- z>I4#!M!cIZr~H?(ZnuB0(2oCqo+#>N^Ljk!+S$PQ-Ip4sHN5|zu}4xZo;|xpugcR? zJfDAnnLmAmF#noj>h#k8GLt$roGCOsbhSZ)t9x#VJizonQnO~w+i46MbpJ_N155hX zsauC9o>aR_?p}93#fghIi}uDxMbGcB(uj|PYy4{t&o5tIDGbyN#0+IiF1riRVxv@! z<&o9$0Y>AVZo4j$FV-MO?H`mt6z6x<6Qy{5YJ;(czkAiH+gSvr(rff-*vmA6aw&zz zXMejCtc*XitG1zC=XV<_$R$?M3^0vK)9qUC;rIy z1}vegcumY5QOI_lekGsLzVdokerJ>~U4uV`1*mhsvpYQQ4x?XT@3hqetI; z{^eU=i&vYGeSdvw;EfT-KHoY`l<-_n+4AI?gLu}8UCU2NuUb+%wjxKR2n#EfkWSP~ z?2u!js*S9FXhypXyQ9ai#OL`^2PrZFm@Q&SvM-8#|0HY#ezT0W+QQ^9nu#boD1k76 z4R3Z)Oa8zwsoR6Bol#D4;>6Keiw%`6JE-(CLsu(5{i3&_?>nyldZK~PKltgbrwt4| zomBkl646=9b>g-xu956$dv5g1W{Q%cQD)7W-8+{4d-Q=A^dlS6E>zT0QiQ(1Rdh5P z5G`1#Xgp`mB;FiUw(9tdm*iz?10PNiab7CY9XOJ_F?;A^=+Mch1Mnp^VW~|_j&`r4 z1R_a}?XOQ2rMDVPOKHKj-O^EMuHQJke_9)MG~bcNw#n&L>%kk@Q}yW4&fn9Jzh|O& zp6v1%myh!b$P3z?>lvA8_TVl8ha>WSypzon1mK=LE5&t4OE_Retm`0jfn}{8S{Q_n zXb>gBY@h@pNquLx&({ec>0L?bNOu$`@9v^|Ifb}BpM)Gr=@lg^P=1IhvxrBruhtVg zaUt(4MUV@oKEBwj-%~Fv!^$y|T~U@tc8RNrTDbN?4)!IY1R}-H?5Y&ps-gD99VmfV zBtA~0Y@TNj$60{9>Xq#3F!uEs2Q5m9tBGpNz+@3+10@h?P1S3v=>SoDos;1Zc_`%2 z3=t7aQmrRYCC}%i`_Ft;e6N3+-?CAP{O+bdq68ih<-E+S$fJce{+->PvFXyHPV zp}{#A+EB<7NbD1STBbg&aYejBHKH1brSahVZhSC?Y9AyMdr?P3rYqbD#PL?jZkwu; z!##@g0@Xk)%$TcagW0rxA<0xQW{JpjzJ+>5Xym^qMRBb@PqJK`BHvH~u`GNJI!ao^ zMgb%rd9GX}BGdV1cV~x!#Qw_Ht>wa6g}hWeADx=8EJ`!}eWJAkNLKv6SY<6jlLa?X z?}@J2`F{R}Tv)478)W}%Ag@pj#FAV@06y(Q^$(Jjz@kVJp~;HWNM35W5W4qBl-BB` z+FlTh>0miQ4Pd& z-o4ON6x6Dv(pjFAKrBgf%+KHT6YBtTMVNCjz}0N7)a3CLh!!z1#VAY=k;w{g0tGq_B=xPkgO)4z?=IMHPVyBFwp1;Fza~)APL0 za#8;mQ-#NNpdbuC3va(@(DLfyf>}`l$%f5P?Igk!@8`+aCfh8h52X5K zNRCHwCtqiQ3_-{n2=zB;!dM~{%r)}T_30`;+&fd{E)7OA;ffPioe#(cn?}kPg6&+d#^Pj zMQld%rvEoZgyt|04)|c??l-XvWz9XUg%XI#+-r&=TIKGF*Q+X)kwE-@gjT1;>DnQB zDfIewcEJT}#dU?u()?T(C$ucETf{jR0bDj-jS6EY=QAY9dK`3EV0eZQ@=uq%7{)sT z_}7euXaswEtmYi{lqHfSX0Aw50x_9wfGD9=uBv#ws$v-lWIViBrK6aya>=tL%OI#* zIM);my@U_)Z3uzgZSVsAC3OR)8b1LahJ9c1#vT7&aKUpwN#p3QT;cQCK#W&HbE3JIiGR4QIQ@A6gA$9TpK7R|5;tzLW^_J{eL_VD_`MrI8PEtXVm)0 zjJ*@BfQ@oS4Cw$bbTVVAlKg-O5t^)!CJ?KQqJUPtmtO=T_gO{_#O@*5;I$BON%CL7 z63Dpxol=*7SSg!dJA%Yd%Z<^rGk_B@P5cS8i|eq%qHYjT0^GoTBURAN?Z zF!1B?l3rtPZ*PwJEi0+SESkWgIGhWOff*Zv>@Q_fNE1lNk4o{Ze&+nbLNYK8`K$-0Z_ZjY@cqTv%6n4Y1t!AMYm6E4dJJ z!@fVi_R;7sd+~+>TQCDjGPahJkFLYmivRy!>R~BnDLKz=3Vv{e%LH7 znWm5?kaEi3+X7rwVUcGk2_%jFJb`o*7Yd=+Nw{tPsc1$-Jw-0GB+X4d5l`naP$jt# zvv~_G!bV(Wo=ezfL?!WJ9c6N4m_MMsEK=Nn!47c zVI4A*CHhuy)88uz>W=W5r8kX2G=~atqph3r&hj2B2|Cwn;~2YABsB?JhOFx1pRKJkM0$ zKz|PMon40~C(H?UruKX<9t*r(f|=y<+J2m0SA;u*yH-o0_RE9zSOg$SzK(d8)V6n^ z<+xfbmQDgbdkhY1o^TNpw06SXM`z7~iz{i8ERDQuT@+CyDfCk8RKqxeXAa~1alePD zAu_QBd$H^@X*Z9S4$SNNcC%MPr2osk7c>O+xFA<@h6Dn+v=I-;@yhrB7%Pm$+=`1WT+3A40L2?kx*ThSoZ37tQMt; z!c`N0+tRf~5rw&^MhiX56$~7Y91FHbZy1Qcxhm$cZ~IQlF+6zpf*TLPR(|;?-`6M= z%?m#Gu{a`;uqFg){qy!a8{>kUyPxq^zF%L8rZx7!n7Tp$+eO+~|FofYHt|oq_so$t z4)DB51c(UGc`p4)?q7KgqW1G?Jv0jlpCul9ngWq4N=yk0F%2J4G^Mlh%XcyOGHUKc z3-qwLo3k=3bJJ#(6D9Vj12=}>Y=n*J1_+d6vE$;ov-hSCi=6H1j>%V;BM5YAz=(PWa4>5l9LsTW2JjQJgL zv$6Hw8YrrU*BMYjfY`AIyvu$cgQ_q4BeqUuwprViZyf}Y_elEs8|K`NQ9x0j;Q_n+ z-9PwPj!wH4Gu>oqW29oE0ByuqN={JGz@y4&e_k%Uzg4Ajnn%gmx{BBbU0f%wD7w{! zR%1QloW>>|(fIlLJkjgZZI${rI{0SL8=t0gE!LoiKvyn~+)pV+9!(4BKBpJI%o zY7e!fc5H~0`!ku5F5T50wJ&t*=&td+x|x7gn6lFg;rheiY2b+P36ZdoY3UZ)apOPu zGgd8dj$hNJU?PF0bpPdJorRk9Z_zo6H7iV$Q=5x)q3h!oE%^P1-d?D@dZvU{fMxeR9L9f6LAb!$1|LnKN;2iId8KVYeW?hmv2@yl-do5DvbB-N zwFoR-O1a+-`<(axoOz@o+cS8WHdH*<)w0y#+4zEwJ|IqGXP~oh0*3=7vF;Q?5Hvq< z)Azdtwd2Tg7%79bH8z-q#dl`*e*qf9-0nEVJ!&XFTuV9gVO*?2i`$+;XRMcL%zNFZ9O?H*ELvR6|TiH>d?;t>_Bf_ zvFLuX7Id62c<@a8&luv9@{t0#m?mqBDL@1BAmT0iF%xWcm< z+=0KgO8!!Y_iDAFq07lAsd;pD^({5x_A}_14&E3r9^?_U*ymL@qrSKIV{c2!(tH9rbd7wK1b?)y_fN~|?uWK!$w|`#+HUUSVCi&FPma|=Zfgc-!&OA=iJN-#4&E$rYbTAcWmQoG8{RXg0*oZnQJQd z8!>3R1!gwc?xZ*9va!tqk_8GCu$yP^`$D37jN9<f)Gd;U6nz6ncLN7K$b^6*4gFQR~?U|7klwIYBUx--s^5d+G($Pf; zGX;Ono$#ew{D5}$Ww<~vdS~3j5Q(#*S)_Un#$xpKL+0)1;5`d^B*-5Q2MP|kV0KTw zZ2+m(-5``E$E$6+JFLA0awt2ccYV=+5=O7-miDBvdeB(Zfuf;90fFAFe;qt1j?XWz zU(f_ru&1>jMhW11f3P)n-}HKPH~N+-c{uBnqC;I<5HN_OAFR!v4ee;9*J_thCBkUN zZG0@v%F0^vLx6SxwK?C+|J0F?^`YOPS((wyRDkWYN6pila+CICx5jF%_Dzv6U!u7A zJ^H-&cE*tW&d&OR4PB^?a*=2(PuM!qmfnxocsLi$OR)@wzf6RrRubO;Q}0y{UkBFU zC~7GupJ+rcdDqrL)~LS8}K4ELwQqt!byDI%sV8n~DH3He6uPD>CvE9zXT1QYQ{ut4qY*tTGx?Y4f+gk&L{hx}~{Ic$i@ZF_fMzuQvV zb2yXk?3TLzNn>!~GfxFgmMwH0@!9n0rN+9?vg1}2`0w?|vOKX1p`xK?s=G!akM0T4 zOFevv>z2Gbz2*-qx;}z@i@#~Nv+c~)3ug;L zx>d7Cy}N&5jS3K~{7Q2@Xipb}{p*^L;1+cHD5B=hvWE z{M%_P1bRl|ae58ffAoN6eVk%Jc3!q@B)y)_cw4(cWYFbSf+x(@+GYqXh2q;H>qThmZCv9xmOx( zHk0_~+w-IO5c!u0vqw8((9JE@^8V=U_*=;>hh^Z5OEiaZI9EH9BD%+)*dlNCN>ST! zB)tGfo@ktegto9(37jb4CsjT0(JIZOx{82{9Ie%b=Dxh-b5fiPrSbD-H zozKfGwHYn+NR|CX$H2nW`|N?JhrztbZ?GGWbt30|6DISB;^Gs!VmKitcBB!eXjG`W z5@_%_p3^s1Jmf2-yM@&?j67|IbvQikv@<7Nd~-?Y%_I`cU2WMViA@I0- z!8l7B>~yr+GZ>crCunvO+y2kz^4DunRq9$?9^LDRqhj|Q8&|zb_pDs=KOwCsOm!~n_+2a)E6wW70mdDnf#OW#;;X2_ zt&uPXMk!B2F1miS+`7%W-AHrdsAEt#h9A=azWZ@Z>bOBazQI7qJP-iXz!MAxkVAv| z&}H___iYJTS3F#Ph;Y=rOM25C7@V9WL!dc^V|c3iX`)juXry2c!H%E6d-dKTp!v)V z1>*Zo$LR7FSXiabhjglG zh>IfbuT`^S@vBEUJ?=e;^ZA_oc#RZtIPk+=QLOdUFlyMMhurti{Pl(l&laHp8 z#5Bc_)VxPzJMNxU*j}{=(A-T^IS9us%0v_|xJ#D=zxRKKf*{yP-KAH1ff6Yj4d%zf z4tX@p(dB31=Ol-#qmms&d_(f2nogGFBc5eSWom$ zVpvRE)rXp<3EV;tkaY3b7f{$WX=N1p^^7~Yp3rwVqXDr?lk=3%1g1-6v6CN%jaYZcX zl*Hc6{?UJHF@_SuE?DmF(C56d2~2D8SUBKgpe26y&}Xs8P#v=-zuE#+Tj`jZr=i)v z*%Qc|<+No{xz(y_0d`FgS;T-Ddp|K8)$h>V9&TcD)t+nC#3(3;407Iwn?jUMN5+AT zKK(s=F`k8X*YmBaW8`TC^9+=?if+(1S}v`p-{>2Bd)_6y{o}cuJCMh?;!TzDv@Vv8 zJ>mL{rYLx~6L{GKLseHc%g2w{)V2gsHfo2pjt{1=ccJ}A_%`DJBZD@pX zG0}nN^YHkppM^Wc;AoslYCsl;8bdx)W}-8E{JG>66b)40otb$vUd6J$Aw|z_Xu@4D zo*C7thnzPIIMpj2!ZS67xYnE3QR~+TP?u8vlowJmWPurdDPzRPg?!6rPnx&VnnIY9 z%22hmg4ywgK2-uLezPz)$U=u4fRC}vvn|=;CL-djRC=((r+tzo%5aBr)Y(|e9t;j(B`+zVCgwRG6PVCIM3!a~g$H-a?0^AZ_A6cA4dM7v~jCu#_V6muX& zhmftVf5T-ATN9wZS3PDzt_)6`NrlF(vQGPYl?ZByX*{Lw4%nNn=5TQ9L9H@z(Md_) zVfI+d_VK4kenUaZe3WS>4X-{ul5?HEB4iidDTHx*isJFRxRFmTxGeO5c)b!T_U}zM zz2fnrIIO(Zp~ff(6FoM5jJn1o3f4$|QX7;i{bGuft4k0?1gz12+LbXgg4II-S*=&D zgi9HtiSVHqGBf8H)~-lT9SA)?2;i%;BjprcYhbGVbavgzEV&E9e50);+Da z6YWvtonPlbnvq#97sGfG8B798&kAUpZ>vQ&)n|z&3^JOCBk#Bj;VD1?I)?T6AS^;f z2A@d(3f?^$SwyPx_ciAz)ihV&9Z6RtN(htGpEv$c$O2ubQ~`z-zwi5a{@Q3y-&&Ex zBGLqY7x>k0o-v{GSHukWR4)18GDsYc6GygtIaz;2F1RLQjSCcPTN_JR_3Bxpa8Hyv zNC4_=2v%berzL_+DY6a~K8$h2bJ$vv@|T-N)BJiTJ;MZyG6sjOPvG*9x~!I@Zg@Knt4pcXV-dRW>IpEKZgw#qU}*5?9m z=wEc|XmG;NFbBC&Bq~nPrfCUbKAgTZ8RvT6=%1 z%js|QRXofyF}tbPueJ%(S`P&U1eMJxE|zRsc0SZJ8`_T3vkgC^X6DooQo#S-MCG=T z^@7%oKp7|QE{mOOM3`l)ra8HPC9CJI(u zN*B69EeKFRbArLYQh%gpM!({DCR3c#FSkBCJU_nI@u7@&GfsO2n6Q!w zJ+gegvp_rwx-F`WC*4D*LNOri+TzN0v6bt2M!*mHwCn#It-=EbSW6&|9ITcCQp+N{ zUrfa`X-A*babx|&$`DJw>?S<98%Cop*gAKiFm$bzQzqusjFGVrQeTyX$)yD~PHNfu zL>a)M<{9IldzZ6TuAsu~W%Wz}VU100?Y}c8Uy4W=T#K)y#e1yo{SOAHU6G3 z^vws;XT#Tg47De&IQbIsXRM_)Mrv}6q`q2#*u00T44%V8nZ7EC5GQ?^kO#YVo`0Vk z{E6dk`jtem#n4@T@ff+93-o6l)H*^xX7%29+d0qD^Y+qw+&gDi-43gJ>*$bSqPXCa{%)?(|RrLrx_tzN*@PbhY`n5pTM{S<)j*?_RI$%&G^ITMo1_dGg?@CxHnx z=!J3=Hvv+J=66~HYnZRa$MoaoxB_y+fKxuhzT}*N7^gXTyrB2wCl3#2`&FON z5`d>+TgED!YIxw^=j4v%ni9}5!cfup!$$hv)8A1elxpsYnB;9$T(#VR{QJc+OAYBe z=RT4f{Ra6R%-DKF|9B1AGJ1FNN87dyS;ys|7oaLki~BLpiD3XFD_!XZWphny1KdZY zy+9#3STyo>@#tp3(a4{@opLelcBgt-EQ%jcJerU8zhR0pZ`F{!Pb75-s1rA8fG@({ z4utP!>R!WIUBgw#79(UHKOgkuFe8S~Ci~)r`bNZ@jr}DlQl89&6`LClW%i_&@sG{^&T){DrkYn1-2w#chPxiT2}D{V91Ha3x9K?jw)%7c~nB{B@z*G%QNEGh8lDI^yrIVkKF zGv&DhMZy3R&qtF;<$3h{7XcLpi3fckmqn%0(;@;A{e1g)#6Ghno4}uy`bJ-rYPf4* zM7oou;xZtv7_t z?+m^8z!YCxic#Rq0Z)3|nbwX*@=Fa%?LC~2hdCfF#TEOt?po4%KyM$d+z8$7isp?z z=BD{CArbgi>*~NQIGy$QMgId1pK>1A3nM77nTKY<7jeMX7V-46DrpwLAxGM`dr&b5 zI{g+nfz?~DEWaZwoYmc3LV`^Ds<7FuOCuC{KV$u;+w-BtN=R64I@!O%X(?;$gYKz` zf3c)mkkxJ&m@_4R9q;s3s2dw0Rv+zKAzjgwnPqpYOI7V{@(Lhr9BI1v=3ygR`$zG4 z!{&7PVZ4M<-3)U_eKfi<984yE|A7&9Hq4Nc4Bk|j{E`-L{_HpBHPxuF079RtaWBw! zom8+3cfb$fS%>-9of&x(v(7=MFMV2r?Tfve9bpVUB|X;N4qSbEcJ}Ws_QeieZ)A}go zGyCnA9F;9_&de@OvA%!~7_L~NEvFZ9z>!W4PssDEI}W1Go#wpDgu4qKAQm&E6B-^6 zB?n)yxjl+1yp~QlUy*ei3cNZG23TZ9|EYUXe{qC}pGGuC5)I8TQo^xl)`sp(6s;?t zyKlzuXH^F$KU^bx;;4H&#*!n&tw(I)D_V8ghMk){ofQZsSwcITS2evL_V#=!vuXb> zDd0zd6B>3dSDYb7TKCrX(kZh&HOUTQ5N~1pu4WO2s{wYEy-6=#ut({K;-zedN-)t# z0+vEoFGB2w&^nFuL{-yY72n{~jLDaJWx;%LE{62wTx$Z&4C&%x_2ZQ`OUeLFB>vNd zddAN)tY|wtp!JR#xi*910YqvR%U@`-t*{VNJ`}#qRT=s(sMQEk^+-S=9xu~M7v0?4ADG&vHaTO>^~s|@_ESy%V+~4tbVcFvE@b$$ ztTEkBC1G>+oNQ4W%$(iOr)S$E9cKqHXzlab5*N+(b#I2vkZEP!mBwXi&sg1Yrm7fS zF4Lg#O}54_@S<$SG?CMv-Ma?yyKrF3lP-h7&zkvQ{EUg$9M?nP+wNwB3!Y~F0n^4_ zA1fY7>F5sGTrPyaL!2CK4rFWkO;ba&q=wZ$;Jfxli9(zRoB2e@PdO17v~eZub4GibUd{l`?Mr3eH6) zi>6RWQqWR-l>VT^pNI8|skz65t2d%yxwi?9Kl%lAd&)w7rx1F2zGi$oDrxuh zoIeud1e&W5IJZG+Gs06_e>A`SGeeXxEP5!H*7Cj4=(EVaCeHh}qnF`ZP>{!7QI6}& z?hW1FA3w{IHz{cK&hZ(#$*qaT&nl==B$H&osMX!8tq}fWayeuL(VTEShA~ zJ?X{^w);ae2D?4~+t0)DHArzy^#xW`%B5(Q-&gyT?2{1Vrd-bO57XpEFbjHm-Pk{f zr&M7&YwDy{X3wyf<>^)4R6byhb3CBG2?S0)-*j?jG9s->lz5%Pm}Uv0X-nahpn61W z)lh@4u3dwY-E%^wOdo)u<_{E3Rz`#OMP8%lNE8UUcbhU@uSbdgM47K(QyzY zPS7qp9iN#aGlYIw*@^Xgk2_C>788JG8$v(9v0E7=lZ3AwBLaY6vefHO6u6H?h-)JB58RA4^z!ZF_;Tt;=85$3E7V3{9?1r3|Kd09J`N4y}pTQZx^^iMU%2kYXd$nZXo^Jf~>{Nc@c z+jC|7#p64HpLK!cf^z9I4qM0Xu~W&v`*>g!Ic@ zraVHHlMEli0xQ#84J54o%fD18mVh1Qw5s)IchEvs4gt=rf!{|J*^d$^bQ&V%kEOcbsXE8(BqJ*DwpSgeA>6%j#-oT!Cw*XU1+zZOi z@$%mwZlXWsIbx?MDEedZXcEYMo_VuN$3pPiTlM-(fEf_#&pm^6eTKsr?YO{*E4($S z>a7~ry$bY!aauaZ$-A7|59lKyA>xE+8{8WW=!G#l(auGNJnsjZ+%!->6}sP2J;<)Z zb3GA1{YN?!NeOP^WBcAvHyyo^AV-a~TX@PYXN_hF(ZsjSPOk79=qUG~KT6C~Slroz z!k+#(du1h82@o{!z;vi`%A3^(r=A5;VXcW!aNInQEISgXo2Z}0R!LXz zkc(Zx-;nspdPa_B2IOjvr;g#OtH^z$ay z6W1KI9+%s4T7T}TnW!GnrDBBk%kk4r7OWF1M;;nwWWPe`ToGQqQ+zCZ031(zF6dTo zM!;GC1T2(0CZ(3zVc>M)l3!bD!dXZ47ApZdo<+wR^`t_8OT+! z|G<#1hEgd|zulDbY^5T4$sVK-Mzr;$0i%?u zsFmZkRKz2cMY~HGr#TRaT?OF+6V9-h_>~=h~nWQ~w)G@*$%iQxI8A5f6FRD-hl;lOpfR?1QqbI>F zHSIA5#(mdT?VQFdY6t1839OsTseDpeZB8G()SlAVpoLZHkH$N`>JxQ{zakSAdj0Uz zq5TX_OYK@T!XI|9J#c;Gp2I(_=58+bjJ@`c!Uxyr=bw1$Ape#+N#x z;~Qn;xGzhlReWKFy9}b^M78s_ROo|5q?*6( zB$KszR;)kDiLL`p4K8g5^bl`pVbV4D;qExsPDr#S^E?q6*XC?mGb@iWw}jwpKh~~X z0#&O(uwj<2@An`OPZ|erw<=hlhZUv$n2o^2PDO{4Y~0VK?7{Ysb3UPTRzM@8^0}wjiO5jG zdDLgQBa*0Fr5lJglXTKlj-6G3p8c0qlQM$Lx=O)}<(BAWQhHrJL3<`3yEZsqN{fJh zcuCR-li`J2lt6|t<~?4^yX}^K)Hz>_A_&eDX_~ySDYuM1*x!;{D|q|1fc68<%>b&U zqW*1=9I(uiRzuhX6N3KiC}vW>hhsE(#j>a4>tR5&)3Ov5*x|muDd&Hp-+&e)ky?X6 zlh_Tcu61NMX6bwRZzI^_`cbz7Gj#+seWp@2Hrz){-bTK_R^v3pHV}jO-G4=rK*7-y zf4f{%^Ue^{PSzq?QL8hzx(x;R$N8P|H)CD8kXs4@MgipM_8!exAbHK?-OV8VrB^@n z=U@3WiK!lWiD)&kwUk^|_41XMTE1z@_v_3)w#n=DKa{+RwE_9;C{w;y2TzUj1fK#< zl&}RRI`$^n0U=mG3YklqjDw8pHK0(E(8XujHMAoE=HaAE zSinBAkjf46(j~fTWJi-Lx_dRFVdchu45{GgRIuh+8$d6qs2bX`m7}JL`fOj{)ah6q?C~1EcXlK}M)d?9E7_7c@<17U z)W?41e?0pY%u6sW*Wo!j^{WSNNP6_jfE(M0q1@6V1+PJiYfilC1CGJgS5o(?z9T^> zO)V(JnhD8Qqcb6ZFLiq$lp^h%M2Iltm`p#Fr3CX8(s#n9h?^>B+;H+qE*^o-6`bF0 zS>Q$fabEHH$5}b_?;cAV)~>f928w_JG>eD)#DjtRUhaK6^oF&^yCrJiH>KN1`rQXn z-^mp8&MNY?)UVS}PbCCE%btxSP@!KgNP)RgoJB#=4{^AG^qtTktOJgGRnwEl2R0Xv zMcn~>vA_r{C`g$}&42>FnXH@*#igUNFWy(NIhX<^|F zt)|Z4e7VqE-)=%9xP8S?Nr~j`eGba`ZwADtOz320l|J;oL#7(-X#l^3UKpnQQ91D+ z$VLoQ^-t>QXsJ6DE;T(?vRoy?*8u{u{lB&yR>?Jq_)tzAR1f$bS*p8bR9ENIipI*g}JJSevuJlMTfsV zK-NTS^|HLSjT7=S+)X7lL^H%U%1wI@H}Jzd4x7no`m}bpKBtvkO%PMSJ*~TK`@q{W zN56Hqt?$G(%+^9qen^k;slEy>dgI=S39jww?z)jq#Ou}gnnbkzm85xP)NtrWp(C9~ z_-8>f0Z`7k(6yPE_$%vAi2Bs^_k?XT#~MKw-a4vjVK@WOBrv})Bz+rLElWHFNIy`v ze(l@GVm3v0*cNhs+8`K!m&=&ONHJ>|#*xPZw?KjL@_^*&jn@sKP#hAj7 zH;gKV7dMFW(ErLsnU>+Q<8!kF?EjG{e?BR%ot13~ef{ZlwF7P2_bCz-D2M;tN3FW- z{9HtI?C2O_OFN`LWsk*8(LSla#yU5_HRJ-|VTx`^oTQ4m+2+aFTnFh=%#_~e%`#`A z65YM_iWJ<{DdoBT&CUIL|13xnc>VIVe0lWz?yX1UYV%E*rvG^uo@6e|bwH*2M>qZOD_k9g+Sg2v zZsRXbk@ZgwQq{&{DYLp_x)0sx$#a9AyM0+apMp0mFF%M#F|Ybbso{`Au0}8EB4(E& zFdmk7K5u&%AGe?Ie&H~Vz>w{|E%stB&dD zx!tP@cxZo|i#2E`vda#1ak8o27~>xQk+9!hehZj&J$JiG$r9IdpZ?4Q?LHIg2Wv$t z>pcP1n&)~~IRrI3ZWc9*Mv!ZroP=oeg3xzBS>vj2XQy9@;lGmGQnd1aeT*yTX=&fk zu4?$+USBNwlFS3>C*fa^v=@)cyOs@gtnY2-FLubO@-A3t-BajqUv_aQ2rDCScebAh zDJL%I;dNS?(Xey6nk90)=sc0WRW#n6Sb{xJRx@Db>DMavvE7Gq=M&w0j;!0$o$T~? zTp>;N`O9RAWUy%TDZdD5I{PZ;-nQ`#113^Izl01<3NsC|d_Z*D@_R)fQyM9#8~gtE zzrS+uA31@=62~b=!|)OW*!-o2gF30rH?s0eldyw>cW$YVyhryhZ#qsM!ZyFVj8fSg zMvTT1+ToAiOKdN|0qsY94mRfWacUv1n#E3~vo?YIY6u2#fkSV2Q5agU{)bbeA>H3) zqq=xX)mz_6J!0~9hKvv7e{p|V(*OpD@Y$M9zb+p9HR}_8Z;n&+;?$e)d=Vm*Lr>&% zzA>v_34I|jxM&_C6Ez?7eWM8Iw3Yn&7h{`_nPVzT+}3gCr*B@NdvrJ3{eG^_wri2^ z6U*h+x$z+(&+(s<3zfHZN*e=;tMY$aVeHC9EUg&6MmxR{@6Ht;)?f^s!7qMAl~Owf zJj7FI7|z!btxa|k-vU!Vw*j!(kJ$E^6@*_pWhWD z?Na#B3&&0FH8_RAM~0Gon&{;faR}EULP>m6TE{3zTr?7IV>fG;cZOrKW)^o-SFB}Fp>JP3ra6-P&}26$X)x!{XvXfZzO_LRz)wU zlL;i}t_GHazYWt;@;o>Ks~1D-w4W7?!EM$*{%LzNTA7Aito)*qIV4+2bvi)R6g$3U z;8UgO&5H3}k;f(>Jt+G8!$l?(_$tp329bn(m7{JR(HXt;K}c+S3)j8n4_JJ$5dNkSU@*5Uzh`Yy-h*kAUCW z&pp@d{jeCMMZSNQVfZBY{&Zq?p}|Djw|we$tJZQ&_+=PYD1XivxntIdUvJKHadq)S zKuK_VHndVsxN-sp=Ik`#AjwI-;To`>pG&xb;NJzZNP=2_Mwfu$N<1WkWNNGwYj*EE zmD>yvFrH-!Q{cUAVBgwx7xAF=se2XV;}r0}2g&qM>qtw#AZzwS`a;4)`tfc}Z6*;7 zG(_4-I1yyYL_#dOfP=R8asEPVH=Ix@+=AD%gy@0mj~EhZ)Nh_x_cSt5-mBO*i$sPQ zm~73zy%1AaP!dw6@XP#$Q21^kgiHRz8EpuOg2KD%_lh-(D-$mQ3z7&Jd;o>D2agBn z1rw3Xv&MZpJs6ojCY&wQr4UW3YnIU|GSMT-NAW5cXr4kSfccNpn{ch+??KoVTE7u* z;h3t1`Z4SxAd=EhS0;SgmEr7I3k*x_4e`Pu78^UDuu5PJZjOw?SH*)SWg@lal8gc0_`pcbjYY}$J! zddHrzGeE!)QbW7p@b%{F{OxiK4<+G|+qV3=K8_gMJWr}S_g@A7(4F$znZ$aAZG1VH zNMHvEMTVRQ0rYXzHx*nKcQR3wOc0kydqzZB+LZ_dB)Q1)3;l7re6?jw2ak)j;0TVpE>g)CZ!<| zNn}s`6B!v0FScLe4okrzYJx^&NcWE$!S{JGja>wTw5g?_p%oiHLzGi4u!|0AB=ef= zO~S|{{nz!p#w4lek<4naVfVCMP*F14GRI3w7zU{n73%TnGyC8MNe;vCWoS59tmxvo zq8QGpP*X#LC4_qzgCN-E&I?&YHubj1it>Wrmeqy9*Q~De%I_w_711m^*_O-<@a7ps z-2CikCyeLf+uYkoPlJY%C==9f&dh+2gy~W2{I452LkR}wO804>ctd=(%8Yrbpo!F1 z9C5rXh~yJasruk(2)fC03t+C(pk`#pf+qCGMjAGhL|xUJ{QFjbNW|K0oh5>4x3m)%JiZ z94|y$D^OkLhq7a{C98Ua-Ly=<(9Bza(LlFRd-n zlPv#2E~;SBO_5C_R{3zAK44Vi0+!~?CyeYc;-$ev)RykEe6ZTF3>#rz!F(cmPDmcO z9oc-yq7DG>9Q&_}%_==`3yrybOg_F?kfyk6NBL&i*AlG5EDp+y^$I!p8DQbCW1?B` zd{K*sRQi-cNG!+Ex0oNA|7RQeTYA#&(PL-5x4pSGJFr0zynqh7EN&qg5U}d#=T?R% zVnL}=HF~pu`sy)TLH*QA*hv}aoX>l^52XX7{H(!vMt&_brGr1yLV=nQU@6~1(xt1H z|JD%8@6!#QmfW=PVBqdW^+i{K?>TVdY3Cs8Mr`=WFkAoqCeK1|8x3x?N#o{p3I$5y zWw(?P?r7w-;}xHJg&b4O&2=;_lYfG zDh*FA96}{XyXd?JW+7Yb&N~gf(egJkLRkASA&X#Q&a3osouH>1M3f|XV#IL7C;VQ=$J?0;Bk`lac`uQfMQU^S?5az6Vc`*_i;L z5^0$_%>W@LNmxAl)N_#QcGT5s~jwrG!)39uLd@7f860;0TQc+ATcro3=SYsQ&iV6AYO6S$RA_vI<^4gH-9d;NS)DN~)wT-xGC-VN<*5hlZ(oE!1s!m&fSELx6i? zVqm$J17MIw7uiUz#Tf?SqWhkz3mXbwc)Iz}T8{VQwrwY3>ke^oK#iEA@p$aZDg1&^ zN#Bb&Qq3-FS8kK1W%=#$^MaSzvUued)NAx;pvFvuK}xNbz>hO8Zy_E;8+#{G!Fl!e zEK$4wSIIckgH_&Q01}#xhwNt8KQJ8z9a4e0Jo73>Ok_w;1SMgkdJfPw%x0#_wpO9L z@)zSnc4*$qT)FLdBlXSY69*r#)OQ4~i2i5fFp*0g%tZvUJ=_|#VG?;ZEFw_<+M>>? zbxt!nU}3WPEQugZo0bz$n5fG{5imxhcqPreZHhYPqxk(IkM|g&el@pr;nmNEK(GO# z&boV4d0`@Ny_Q(Yy={^~hZ5}C#5>zfxG=%aqF?sAd5s%&xREY zvq|^xRqn7&=oTeE5VYIrBucYOz-N2fQ=V_B?cpRkltl1Kr`y&M^FYg(L<$zn{=M%# z{2#GO>~t*2+a*Q>3^ghsFm6^9tSD18=}G8N$5$ft$hN3#eXP`BsVFnT8xgGgDRIa( zLkdHUs2@5Op&KAW7RlWC{!lbb9|&y~DJr3Nrdq_Vg!)(3DQ!L`H01~GvsFKOvr`uV z!(!u(V3pHCymeNh;Pk>b(JON&cG!MMt`K!m*f1L!(v-YDKTzYibcsw9+m>EM-VitR zc%0GUReVJ_B7ki_w6KT@BaUuVh!G|-s;8ZJEI|%DxcaM&pKP~0tOxnj&r|rK1(~A8 z%wW3*sFMY6tPGaLFbKA!ge%pSkyZ>+xiq)1y4UNCh88x70&Fybwe%}Bc)b9KKlG;f zdEbLl^9D?$F-XCLj{a?puEJ?AlieaG$LlrGn#(w^Ng`Gm)Lq{#5dnHTz<~*P6l#vr zijII#VczWH9J3}Gu{^*c7dOM9aKtpYK7lV=a_fmCE}2g7G$S;MUVXwOrM7M5b~27S z08g$)%QKpL2@Wy$k?4K+y3iovIOW_~{?6ySy{0Ky>TOGi6uIb>(xsBJA>B79iOGX8 zwU*!9k*EITw!ry>dl-G1E^|#~nN*6^(GB!tD^jQu6slQ4Rllp>A*7<%Oz-GEyhGhT z?YMhk?1$R*X$$^t0xnkQmA4% z`F#pL7W4Kk8j2u53ldF!v)BwVwpZif%dKSb{(%UB+c#($h( zkXqPGE!i7FLP^~8l%a3!=%Zjxc8=jGel=-j)|2UaNj zNUUuG%;9Pm7Lm#Jea#AFBw-~0WN=J-YT;i=4R<$R z#pWld^RGdn)c3J0)9E&!+(h7yf}mrtDTv?4Ar;-T`Q>oqn`6ED0sg-iuIcl1Q}aw8 zS2n$L>3}wC?V!UHn*1SQFXX`ES?>uT6tiMWYN%9#)q5F%;w!p#&2=+v4wz|NJVW@? zO#k7+M9SJ00A?6Og9g-MGOunx3~Y3f0e)AdX5%M4pNG{O;*0-ag-FT+Oa53az!7++ z`DZI{!EOdf^ugM}Gi3f#-O!I7%?2L>Sxf%h^$?IyxW-tS!gYWRoo3->OR3<=r?P*K zl{2riw+@Lv`^$h>d2v=2+JEU@#^a4I4&~B8m|zu?58VDnFJ}NuMNpWvz5WGMUO9R! z0nVht-5CboUyslQavs&(z;=5g%F)Nj^>uH*q^lpbj@&`{itUTvXtktuv&Q6INktW! z>@^_%BjVWhN@T`9bi|2`5I(Av#jtw%z|72LFp?r7v^+9ClXp<1ZDR@3FbfvaG&-?g zP_9wEPoGS*P=D6S0fXZU8{6FvWuKVe(b@?M5n&8A-T;{oa4=MCwAAF zMkZ|)$~s3;Me_Se%BMIzc+T;?+!K?dZL9{=Dq()@YZ`+(wd!MA*!k(QM7Jy>RZ>f1 zml0WicIO?IS{;S%9asEuI!@wWlDT(99I-Fpb0VNiUrK{_Yesj0$xvg2RP6ypb^B5g7v)@o$}7(TbU7AFUOgR5s+cT#cFotsQ3S z3`9UamqkA9ocQp)h#j{kX0ORmaY|5w{H0eK6uAF{P-$XSOW^OcX~xhF;kR#NYGhvC z%QH0n-Y$HHq69slbf2uh_IifV*S;j(z$mozJDN}BPrDUpIaUef2B9#y;hMSQhmOWJ zsMkb$VTlncPhcOyyWD;8Kyf4mgRDz@j0mK}BA@aOZoKZnzF}DcU(-Q(4pDL}W{{7n zOvn|niX4hg3Y`A(yjojM%^sXP{h=)fDh@try1v5QZ=NiRQ^OoAoG`|B;;2K$U(O#w zm>II3tlZ{!^Qx+`BeHJ#eNBDZU$wBMi0w1Df0w>lLF3KKeFPY{bZp7GcG;PJqHc?G;T-01}(L)a?=Uu#mUj3OmuO+ZR1ad6OuPIBV(?}5r zddp`o?wYHrL`O#c_zxfd0XU4fi!w!-9xa*i%6 zcf%^F#FgXPE9xM*#svZIEQKRRyKg>)QOLfgJTGyzNeMu%d3oIM23M@^$8Q2B+)8_! zKK~8^>cmdyz5b7Km&RZsA=|L7axj~DUed-lzlbdU^PWlZz$AOyeE0S;d)7%n)c1|U zl!v?eX2*36hf4bAT==dU5F1Nu=o<9dX`bp zHgb4vE4={Nm7P}cwbxKUBYY)`@PWAMe5~HHGc1Fki@|j_`+icD?4zgBIM-#Nv99Cn z+-EDJ-8ug8%$@qrDAkb32Z84*Kp)nhME|-GWHB&(Can ztEin(_(&=;^9r%z4mfRsltu2W?bUNS#yZ~L{rS#7aCeUKR;#%BCRva#3%snzB|Q~^ zyno-y{{z{#?bwK@-eC~$Yp!3)vTu{qN*5>;?J8jI7IJtumoDfR+L_h%5 zPLp~uGto;&qDeDb^HJ`&S(!rq7m5h&foqk7o9dp!6!L%!;|yUM=-iR6bC?eMba;$H zkG{!&f#qm+c=g!HzBG&iK5Za(ofASXJU=4X{5{f7xg*9ZLom*#JG=M|YmZQ8l0HgeWo|1OEupNS(8-y& zLIh1y)~4Tbzs>~CbPb3qb6N0JNw{0~{f@z;M~8&8@4T@ItF)8afmgsOof23>k7PyT zR!<2%UCQm^lq<6^d$}wd6q>qiUdBX=I%O@@{iU=FyYZ{e1{*fL9QZ8xU}@Gdu2Cku zh}cgf{_X<hG*T>y34qF%X2~!e5g;xbe+;6;|7s+OEa^qm{7GlIVkoEFtA0 z_-3(NXqs;Nz(&QNyQR0Z#b26FDGm2W*h*y`@vs3hT|_4d=*9aTY^4TAbTobWaWC3= zx1)F>oO+~SgI8edu2JpCQr{C1@;9EVL+rR;9gm&1m~YVx=o61LT%NhHMdP3_=x zD4b8TLtb~?Sr)cf9lR1WSj#9!xbtBnSkYXNOJX4KsE%4$qB;#Fywl|~_!LsZaxkOS zXmJqR1*S8|?9(h1)M)zrMESM3S4~t}u~%8wPt^2A^0s2S{3l!*lj*rRq_1sZ%O;Ff zUmf9=BPf+XG8Yc-smY7;8|9J{1?95YIOl@y$F8f^U80uJ@Q&Hc2w~@6*|*4kzj7)U ztNj<#SAOM2-J57R6n|B0kFb3Gz@$Mc#%|BQ>G0!N7R7^=dSRClwb@2bp}8~CWZjnD z@VHa5A#E;rd=?ICH`*S0T?O@>Y+uv=HhIFKb~(q z5bAO##?&uX$Acb!Z(5DE$ts+bolmEiNW+*HIR%Hb3sgVOb9I33;i9--rle=iI-_#5 z4&c>kE@*w|3+IsYjzX^}8x_28J zam8kzx7M6C?ex#36yIC3?z+t%#g&icm=Ka`>YytgB1BYz#{Eq)fWARU;n@@W5h~+n z8H`0AGiA)Y4EtmqtgMRtbQ;In2Kr_UG1DMK_kAzMkEc*cIT*L{g50cCVo|`pmk6yc zrjCJQE$m*9!wLpjS<6!2!muqrF1a12b6wOrw5fm|IS1Qh3d&%SyV?*V0-=f2iJ|sw z+ey7Ywpf(`6H_D$YJP;e*pQBSitSl-L|SjGeLii`m*{e zP;64ORDF(opD%7D+jXJ!Zhd=u`jugASJ4L*Ns;Eq2S(p@Ql~#d0)^maKRa8UA~M?a z*5ecO+-bms;;z@S(^$A!Sj|Y9#n@|(hmSwG z^NP)Gu0qnXe7hWyAP)NyF};9NpINe z&8b^K7x_K+p7}&}IPC72d~4K4w8t3%f=A2i4j!8m|th#XIz+G5l-tQm0 zAy;iwlk{7!eV0_}w#l>32{f$s2K`wWl>lNPvJlXattf<`WcS|9*U+VCMg@{*hvWG>_BMXm;!}`M_uWZ~9 zdjB>-K4W}C5-d{9fm4|uUP>Js^RtG-h->J+fg}FmR^hRkVZh4K+;rl!pl~nrtqQ%0 z_yW1ZXoEM_N0`U$K5*wO?eMC2j6ki7VWt;AEXh?6KqMGR7A1{RQW@m`rnq#H*LnJD zGh`~D5biSIT8NK_e(5LeV|Q_Qk!KFAcR9y2+K0*nrV1q8)zmE8W8w>`<&W^=WXMNf z8jFbbv9CY&t+hQmd(VZHKBb7>TI`1Trux-h94bATVo$$X3Er~Fp4@LH*KCpUp^Ygb zJD^Ml&wxAw+DFJs^c7OgL+eZ^#H<&YcPr049iRBwKC{FuyM-4eFFCqZ?qoz}EtRYS zCfdiw@Z3R={$Nwf-ubZ~W_^;>&RrcPnLXmuYiAuO*$H4n^$a6kxiIt>jny?_Vi_;9 zxI;TCg;lR>&u?ixf@4jr4xOky>y-Yw%}Vd8_VRtmPSdO9GEgav^NO*cFk1iR4>9HN zxhfV$QO7S8kZJ~(E?Z(^nW&}rzW{lYD(fB67ehn>aI&?uZm)aOQ^E5hVO2;CMYow5 z>RhMY@Gppf`Lwb3Nk?9cT4|3*3eGQQP0o@ZMIJo!q(ARfXq@#h?Kdw z8pP|X0}9!f!|B2!N=SlU- ziX&9ozMkDaWq#@7R{mtLLnnQwpI=FF=YPK@vR(N`@PMU)=G)*nDhZvGF-PEPlH0An z8HZ%Js&3ae(xdbZGE$AVjQcbmf4xGDxLJ-=161q0mgN zyHs5Vb6lHd>ks?4tT-zB0S3osV7jo(ZrQmNN+5nYD0%*k%C5a{?yT#D6$|t&kq$|4 zDPy>GDx@s$?H$e`2@;WawzDi4(V%WIc9cKa(N) zfA<`&VsK#c(e<>j`ipEDufisj!0#62JS6;9^x-lYsb_ zpBuGuqPWE`J!~YWXIA}~i(i;U^QvN6%U~69(@Xk&CEY(C3;8(Pw{wwyA^Y0Hpxr{! zcpsDQite_0y6wHit2XpGNL-`20~RFJ4q2!rl)R`qCBo=bTIHV)q*mjjQF3!t$`&A!^eTz^JFO1tlqSvBQ_nFn$;gFksGsJ3^O zg6+tN7{tF5PLO&0q~4h(+a1pB^Pw@y2j&Z{r7tv*)j|fXy!}wiE|s=ww!2zYj%8CE z-1G1?8#l2D6^KAlytAtlyuIjdW>%i5_Yx+dH_D~7{u%+tS{Nh{f)!zAa@6P&ILR@cmKU{8eV(% zmX!}f!VIt5Q{%l7FLIMue8U&`ks2K@G#c^O#zi}Aut_vdI_s9?H~PnpT#3|sSU&~s zF0(d7KO{?TP>(ziiD-v$|F}{ai}`$e+}F02+&R6%q0pZ6)mrZAolDL5b&ud|um06r zo&q}Hi)Ei0dc(V$2I!d39Upg5f753_8anTDIzTy7nNUsqFl*jY&0-gk zDAOA*oG@piA^ski5UM)evS=UP3c-YMM{1Xj{qC~$#tu+_7-{let1Nex)@aey-L;d6r||2v76h3iEHY4Z@4CPCK8(|dcrE1IzeM9xwLp_6 zKm%55D|bunqZ%<>Jo@M`QfFrntOg{BE+o7Ri@wAO^KhdQ+ogKKF6`DmKzJRFzw)9! zG25u7Ja=mQ(`>Z0V(}k5zI#Rw+BciOi6IR&OwwNk8_x((FuEkBLgo(yXv8vG%0zi` zJC`K~}sRVxa4Yy^GVLlNV&u>v6pm4`j4eUbXOGQn{++C=#zJUYL<1kZ0Vip)FA#@L5^LN=4llRU<VDTh8~xxL#1guZEUJ#%eM>EUq5H0Fq7giWB`c~Nm>*bO3bbp`aOEI?!rsZulLve~STD;1nPR5LVH(jTJ0n5B#{iv}8fWABhGMXe= zt-iT7oh_ALUShhYC%lm=q|P_=QA2Ae=9*5p-mSs{F5$|s*ios0QTra#;c{~DsP}jh zL+Qear0%$=4_M1IXvZ-yKl^RVJ`t@g|klR;W852+aP0l_IMbzQ_Lnpo`r`P(DbVur&<5 z;y?!KT)I2JY>q53cpTCxtNGPj`!10G*hGaaZ#*<|9$$f5{Zo5n^)_Op7voNA0f%@e=027vA+a@o$0Qv|#nsBSfyckz8Qtt%n2g?3_j>o;(R z7Fu6R+G-V;0G6)d*+wxtT@wfhN;^GFWABY`jVJuOBZC2hTpef=fzBN)wzEj$@?2z{{R3_za%m9C^ zN$-5`JN{PZwmCp)>3)9)X($d-ie(t!tRVZ>pPP`9EaVzF)!_JdETR&4;CQ%2HCxd7 zJ6IupQuEed`$$6r7fxlj)$6V})woXf_lCPkNnP767Tw2%Ke|?%OB?a2;B2b?(wNVy z^-()ddkR*@<05<>5avlXd_i}GMdb4aEY#v@-x-v$FC)W~p7}Zrui00BX=mbGWwnBo z_*MF`u#M4#G9S)EC48|e5p3ATS_TvU?)j&@bx}HPb1C8Zb8I_nU~9OuudJ|~c(qS@ zA(qE9`O+`rB4x4vPg;62DvL^dMz{qcpH@c8g{H&xJuW`*? z^jLLfr0w(H!df<$+a)O#x8rP7$vZ9W>{yY3rAP4vZ8hOsU%BXgfvu@-<4?BNM@d7Q zhuNwQFXB~wc$MA--&-l8bXj1mm{A!0@C`%?=SS8{UJ*-3De2-j?ewytrde0tXs8~S zXtw#w!eT*vEnj_jPXW0Uh77d2>9nhPBzb;#Su=6t>{T3L{O$nEMF(>FPQE$9H65>| zeW!ULB$(MLc+GX{N(u%Cy;W9nRv1zPj_(<%y!Qa{{hGS|8D6<2XK^tm=%V)h2Nw%_ zZW=UYqV)QWy|MVkSzM*36xJmfA(I7G=0T;{hr&F1UU6<2HTN}mqEEQ-@TV9J4`8)! zDlJ>K9r>Ybv|q}@Vj_Z<22L04TjbdRQ%a3#0R{BMCm;a~94_9j(b>a!cBztvG}Ell z3ytn?^W{!ZqPCZumq04>OOuzAeF>6V$BP_1-qjwu8$ZnMnaqKU)FS3zXuaPAkkiE0 zBhw=Q&)F~?BsaXwTZ@S^_sUuvz&hV@)8PqZO5xUO7}jTnoiZ^#=sX$I?I>SwZ8b4P z3BB68A!h6NHD*2&HjOcN?73EzkhWF6K(f_tYeys+;kw09N&VAYaDFi`UeqrKh zopAaj+i&gwjlPyaO9Q@5^p0u*#YyZB@5%t@^^K&X*tyU|_2<`{t+`L6L$P+g&6(Nw ze%@Z1hkAjFsz!`YYPBrB`gmRjyiz z+l$|(chE$^4qldD7@Fq*S&rDagFlfSqdM3X>DN|rH66QQ>V z`|io-FP3vQio(|->9ET)<4YeirIA|(zQ4v(j`$?-r!oGocivQG0$Z1?aVPj~I($k-ZA$L0A&>cdysEOn~{L9DQ z3UW{A$HYL+0%trYBc$rDd*IsjTO796ubGw=#Jk}V`WcwDowi6*Z#CX7q6tM>%MNzf zM+m$*GCcc5Bv_9y8VG;`purdL^Bkx1V0WwufZUd|#mstttb(dFmqL>aTO(ef;sD|( z#UpbKS{w4ND)>@;s%mGoP4Lxl$=GaUzu^AYjLW}1rp4@SxpZJ)nS6vy2#*NhN0jH7 zbdA(6d*1?OC8b2*OPVqt6=2W{L{xx0G?!8SQPIf(Upx>12!m!n=FV`;djtt%{cG%- zCmX9dLxN{QhE4=chFL%GG-jM4V`60buf6igkEvRm=)cywuQBTcJCcEbKtwpx_v2c# z4W0#;(3xRHZEze1cyb!&-$2++UgDd#iwy=n>)I0eFbv9LoZFD&R%6i2qvg?<@m=5+?tc5$*hldHx$q z>L2`(7*Anuq!21`fH*X-$a4A@us!(Kf5ZN|+NSfd<+A?=-U~=Rz(f!K4+QSH*tcK* zSIK{5g8-Tf_KY?A=vK^*6yJY6O+2cN=T7h<|0DR_&V+w^aNd6)EborV{+ld~?0`3K%5%kGzl{o;3tdiZ^E|Zm7@{SQtAPdZUmd z0zeu%yEvF=moiXM_zbNxaSx4r;K_goRwT* z26*$!V@sMer<}qAUOM2z7sMe74m=9qQ$|0uY?Jhzk$i!&YQoRtBTYl-1+p)~z0nWGd(x8v=R81Q%RphN`r zVKGBfUjaX%O7QL0x&7o^!&Bm8%P2(p6ZS6Y-KjE}Dn!?U^^zx<}mU9^sN;)QVxn)Nw8He)ClMu+u!7+Zqkzg`1oe4VJ@ zFANF%QJ*oQ6u7pCyhCwJZhZ{O z{s&vbB~bd{T*!Y*|8~19EC9Pj(6VwkMz_+}vaz-Hwk>A+*xj}iG46Wu}Fe(!*(9#@ATIn#C5pKe#VwTq^u`w|{Uyy8VXHE(_f)YM%7+h=?Am ziz&SXPx{d@1TtHmoNgb1dR7;B1R=0a>2L|)t)10V_XV&nan;(_R|RMp868D}56*3d zcmaq|ivswN^osImbjKe0og->A79K8LDSXTxeJc#QqEP7o29`8Ed0K?UvHP2&>sas2 zbocl-ZHG}_yRRYv=+oEWd%d+~9eOg!L6P9w#oFC=UF=+8JlOJ5SegChvlOZZ7A!sPy7CG6t1Ctr`I-SyVTMVT z1CDc(%=SZ2Vt{t0d%GqlRD;;j(c*saO!qgv^xMAub9Z4suCxhT$oz0XZK>bpUsEUl zlWA5=SJ$;d&F85l1Ho*$q8(liaNk5+1(RIfq`rS9O+4_8g}M^ZK;EDYWk?lf7unCS z14iqN*vRs7qHlaHeK=ueOuSGoG7HAmf*(In5oQGMz=-cpiE4`~~V5726 z`)8*udVYy#tw|m5QQ!Nyp4DE*eVjS2x={$dJppB;Q=)62eW!kiUJB8lV?7XS%=7xp z!f}3d&}S81>u}B0>^Fts8xQTbq~G)!4f)Ej>^CAzW@**|^O}_vM4}f}P1B*NL%}ed zI^i_$KIva(6UhsTChPsHYl2Jo!T4RzV)tUu4ak5F<97>kc!v{C^^opo6SQ_sJQ$Un zSU7VTQQkVUeOc&R$1pO2y~+~T@Fq)7@mX3! z;Y>X*@v4W04-DJY(Vwxvj6>F5UPUe?{nIPU^mw-d1iW!$0$Do~1&BM)#!bk457~$iFH*jNV;H z!Dc&iRw@D;bFnU#6L9d^l6fP^+w0Ep0}0Fh7UiSVe(JGkkI4g{DQ*pEwCUm10}?W& z51es56&-Da+&>F}PN4PsqbA>8AK$gX++67KO&<+nJX?=Iuk9 zYSdm%#Xu950kXP&lw?kPTn@}E7;*jW4LP$S-c-KNBoI($KvXbRElw@*dFt-@E8JQt znJk};u>ex|)Zu52kg&-nHTL#*e!LUZSk)~3m&As^!Doeqc39fSUp&!d+If|^XkVi9 zJ7Gr)Xb^WBsbCgv0b7me?}8I%S1T;S*dn2Ocsj;h16+jzp+R@yglCh%+FZ#lK-i8( zQ%o3szD5?Zo%@wquAjA+G-{C5&C`Z)LK$c<3F1oWVzW$!DbN6eI3(5@r&p=c=fc!T z4tF>%M$fAFGz`fEJ)VtCiBPaMC4%foM^1MD_+}IP8N8#31Nn06iLl#Dq?jQ;FKz}U z8}^3)VJ;r0sbUOiJ8%8GI67$>FQed=fER1YBhL)h!q|8`u<>Z$nAFuYvgO;|;$s#i zse7ZJT;ZT(PisI+Kns@0#!YV;lvm7GX-^Pd3BF7%R-ILU%TA`Jv|DxnzRlMz%KDZB3~On^Z19~>m^(c z+l`c9hsT8FoT%W{BpGe5KKWWaTi}wz!W0{nCUJquqX9Z`S^>{Zi>$KgkkIpQwXbEc zY~H2iEXcYAi&-YDzAPoy${X-65~;3(p+-{<7_`?lCzlQIxp|T-99o`zI@;1Xo~u?m zZbh$h54TjpP7R*xZaZ(RE@iW9=G2AW#)2&*fS9NHHJd=OkoMEup_$(M9~AnB`P<uhbmp9g+KPg(ESMetZ$l0TEs*(79bKc?-LXbdN8 zRyw~xAl#iS#=V;_<6w}<`#);ZkNT9xwkI&wgfH4LZ_W$Ld!%~%6FqPvlrq5YsWO=d zpjj4`=>&o&4!bv(*XRb&e@TF=LbZhQ)-i<}EMo0*t4~>TJ-IBG92b9Vg?Q|{HZC7Le9qa~m z%Dg!eCh)2|cNLqrqrm?))+zpULHMO?TIiIg2<#)tRQ051| zL{hT-$@;7VeB1|Zb}uEl=xAL+rWdef7eE?_MGCP(Dci@<;cEElb2l!i)LbL!?;CGv zYe=cu!c0!Ds7_`k;9~3}k3*vVK-e{p(HvoUgSs40Z`FQX2hNKqE;46l@R8eI!b#+V zsizBioQi-UhRPe|7FF(^-^3#E$nyC$2S8s(fQ=ywO$il7oU#N@G}6GkU8>O{>{8aH zQ#``@FuX6TPIUad1wm_F(wO`|>-qwhC;EzB4PpF4GyHr5qkR%xKsCv1M_0>tHaKnI z5prgMHo>>VGxC7v?on|pA0J#3{Y}{#ZCk%w&RoN9sCalLzqy#tbx zj%B+C%AnrHd~2syLC7U^CmZZhdY>>6FCvmfDkManB)V*gr_rEIkm6#r=n*dhW5c2A zhU*ll=uSuUQjN(`n5RJ5KZnWT)r4y8M}CQmc|cxKtTd59?RPL+Y+qh$Y%CTTSsTA# zr^M8Jy?v=D7LmOn&SoZG0Ii_yho6qWWFe=Dt5#=@i~veA+_p`8O4Za@f^V6)bx~RQ zm-phSKExCK&YA+pt`2r)5=C*~%wFGjl6&}vQfmosKZ72MP3I9@kwz&=*hbB)@X8Z& z%_DDrHe_NjbyUp4{6r=DH~Ee$&f3;;l40_BC?@wgaUIO$*N{zIk!rU9@ZSdT9Qowk zpv!6Q&o5J#t+eAJ*Q#0z3`_VKk`!-iKSg2>c1fk&F8uzrSgrJjK1+{tPK!hd06?cJ z2Sf;I|3HeHKJWayIm1(Li1m^#Sf2aaeXU^#vU4NFQb@IHUV6sd#Xx@ToN=Wd4n&2u zE;sr8<)0x8fI6o>Quua0ZhPGqZ|GB%S1rmLFVCBE-^Ek?w*j|hWO!SkJw)h!YZOZ| zYJ1zBAoO2LZqZvg6c7&RWRklI3yY=wtsHCv-XNe%-)8win2Zwdy*((+*{&3R|LjNT z1zK~C>^0Eqf<ST=p+}|ISAA}z}akbXjT(meFO;i^K z+wCpk5>_?5_DeKT+ZA7~zeU|Q&do=ri+{ya$;)Q`yfKczzd3RLEQIuJotlSC+=#4z zWpb1xIpatDZ%IZMm}b*DCs)8rm)KYzGSxE|g~p2P^xf-7OQEYUGe@|xvTeX-QSOzL z5@OW>vJ{`@O;fXKCAK>K#=an4TE$N9?HbU!L!qE4~?r9^IEbFI(Dwo1n{gD z<~{dz3Pj~$$kelt$(-qsNDoWmd6v+1z{DS~jltnMljesjP`makm<~{7nhQkht#Nzk zQL_yPGoH9y!1tmO3Vd<6GDRBr(sagxmtaXeolm>A)IBHb5uR=P13q!cmW>h-O=9HgL zCeZrc+s>x3;CdtY6pyd}dul}WxZ6<$RA(D_UFr@k0G0qS>LO8bB*M#iUCLy9B;U)i zsDmH3pW_S~@`0$T8QE7g;%f3+qnV22e$eZnP|`HvrE#b~^;?N-`Y~VGxE_^xS6agi zLJ~e@@Y0#g#$*&lQm`LnyX9}Y?z4A~j*cUNy6k#iIoTw6z)B7@D<5cF#DWP#ehI*Y zgZ*C1marFl1)#(d@=5zK1Kxt**KfYb#gNXQ3O3NI6T4^w4EPY4{WI_0ws)1T0Pwim7BBQyUJA> zHnE`*NjN}JBsGFG4)@+)j!a9SoiB$7>+j#A40Kms+f;shvn^eEm0%;WXqX39Z-K-1 za)9A2>y*VI->A@G7d!Of_DKB|rOhs@y_`{=Hrd${UI#gC7K`e1YuM={4Hx|dPDE;^ z-Rkl#kxvu3kca(ji6LL#Etb8y>q_qjJpu!A*~*`xngB{vp(Jujb#&_>SjYzMeCE$E zbg}EA=Gy`6`lHG~Kw!dy@OL5rZTap9ObQTD(_qF6dLv~7MgufzvjxKtHWVg`5`lp? zuuYg!{3rBcAS`b50T!KON5x_P7kv8vH9V~pIuFdbP2>HaA2k2-Lt)Ar?!$8&qxt9z z{-^o>4ZWH3f7<>(;t|o!4rDhRy@BndZ5**s@)t=#|A#NhDq-wExWEKZ%qmh~=_Du2 z0HMN3ePji2&D{Qp)dS?1GeGZ%!n4Oe(eP9Q#0L{R3Qy2~N)L0jdm#ZLXWhBj0Lu9- zAy=4y@K%;}q(GZ?*{W><0KMTa0~8=!n)wk1iZ>Df-P0W#+RiE0d*=jp z*+X)5g&&3x)kH>Hr*gF>6B;)F`w$g_>C}vnRH{SNi0ziCdi|oEAn{CbZQ*+!sq+w? zq2ay$V~=L!{%irggl12^Y@6v0j@BdQ^``*jirx7GS@Vs;Iaf9o54G+PBtR1V8_`^| zJ?P7)k3A_YJ^P0>aUiUUsWq%wlingcqYW{|&k%csneL}MOogQc10i8yQqL;D|NHL( b?bj0mSxtx=XGPIBSfhfBs&tj)hv5GQO}Ba@ literal 0 HcmV?d00001 diff --git a/docs/release-action.png b/docs/contributing-assets/release-action.png similarity index 100% rename from docs/release-action.png rename to docs/contributing-assets/release-action.png diff --git a/docs/plugins.md b/docs/plugins.md index f58e64ddbb..83048d4c2b 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -6,6 +6,12 @@ Argo Rollouts plugins depend on hashicorp's [go-plugin](https://github.com/hashi provides a way for a plugin to be compiled as a standalone executable and then loaded by the rollouts controller at runtime. This works by having the plugin executable act as a rpc server and the rollouts controller act as a client. The plugin executable is started by the rollouts controller and is a long-lived process and that the rollouts controller connects to over a unix socket. + +Here is an overview of how plugins are loaded: + +[![Loading of plugins](contributing-assets/plugin-loading.png)](contributing-assets/plugin-loading.png) + + The communication protocol uses golang built in net/rpc library so plugins have to be written in golang. ## Plugin Repository diff --git a/docs/releasing.md b/docs/releasing.md index fbac456902..688bc7a8f6 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -7,7 +7,7 @@ 1. To automatically update the stable tag, select `Update stable tag`. (false by default) -[![GitHub Release Action](release-action.png)](release-action.png) +[![GitHub Release Action](contributing-assets/release-action.png)](contributing-assets/release-action.png) 1. When the action completes, visit the generated draft [Github releases](https://github.com/argoproj/argo-rollouts/releases) and enter the details about the release: * Getting started (copy from previous release and new version) From c6a189a8af23e001e574924b34260bc6efaf0783 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Wed, 24 May 2023 17:51:51 +0300 Subject: [PATCH 058/159] docs: support for Google Cloud Load balancers (#2803) * docs: support for Google Cloud Load balancers Signed-off-by: Kostis Kapelonis * docs: minor fix Co-authored-by: Dan Garfield Signed-off-by: Kostis Kapelonis --------- Signed-off-by: Kostis Kapelonis Co-authored-by: Dan Garfield --- docs/analysis/plugins.md | 3 ++- .../traffic-management/google-cloud.md | 21 +++++++++++++++++++ docs/features/traffic-management/index.md | 2 ++ docs/features/traffic-management/plugins.md | 3 ++- mkdocs.yml | 1 + 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 docs/features/traffic-management/google-cloud.md diff --git a/docs/analysis/plugins.md b/docs/analysis/plugins.md index 89f8f7a782..a7fd159a4a 100644 --- a/docs/analysis/plugins.md +++ b/docs/analysis/plugins.md @@ -1,6 +1,7 @@ # Metric Plugins -!!! important Available since v1.5 - Status: Alpha +!!! important + Available since v1.5 - Status: Alpha Argo Rollouts supports getting analysis metrics via 3rd party plugin system. This allows users to extend the capabilities of Rollouts to support metric providers that are not natively supported. Rollout's uses a plugin library called diff --git a/docs/features/traffic-management/google-cloud.md b/docs/features/traffic-management/google-cloud.md new file mode 100644 index 0000000000..8f285ce9cf --- /dev/null +++ b/docs/features/traffic-management/google-cloud.md @@ -0,0 +1,21 @@ +# Google Cloud + +With the introduction of the Kubernetes Gateway API it is now possible to use Argo Rollouts with all compliant implementations that support it. The integration is available with the [Argo Rollouts Gateway API plugin](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/) currently hosted in Argo Labs. + +Useful resources: + +* [The Gateway API specification](https://gateway-api.sigs.k8s.io/) +* [Support of the Gateway API in Google Cloud](https://cloud.google.com/kubernetes-engine/docs/concepts/gateway-api) +* [Argo Rollouts Plugin capabilities](../plugins/) +* [Plugin for the Gateway API](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi) + +The process involves the following steps: + +1. Creating a Kubernetes cluster with support for the Gateway API in Google Cloud +1. Creating a Load balancer that is managed by the Gateway API in Google Cloud +1. Installing Argo Rollouts + gateway API plugin in the cluster +1. Defining a Rollout that takes advantage of the plugin + +For a full application that includes all manifests see the [plugin example](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/tree/main/examples/google-cloud). + + diff --git a/docs/features/traffic-management/index.md b/docs/features/traffic-management/index.md index 5048965414..6850b62fe9 100644 --- a/docs/features/traffic-management/index.md +++ b/docs/features/traffic-management/index.md @@ -21,6 +21,8 @@ Argo Rollouts enables traffic management by manipulating the Service Mesh resour - [AWS ALB Ingress Controller](alb.md) - [Ambassador Edge Stack](ambassador.md) - [Apache APISIX](apisix.md) +- [Google Cloud](google-cloud.md) +- [Gateway API](plugins.md) - [Istio](istio.md) - [Nginx Ingress Controller](nginx.md) - [Service Mesh Interface (SMI)](smi.md) diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index 3e43d5234e..26e1d6c1bf 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -1,6 +1,7 @@ # Traffic Router Plugins -!!! important Available since v1.5 - Status: Alpha +!!! important + Available since v1.5 - Status: Alpha Argo Rollouts supports getting analysis metrics via 3rd party plugin system. This allows users to extend the capabilities of Rollouts to support metric providers that are not natively supported. Rollout's uses a plugin library called diff --git a/mkdocs.yml b/mkdocs.yml index c7cdabc426..6e2f77f388 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,6 +49,7 @@ nav: - Ambassador: features/traffic-management/ambassador.md - APISIX: features/traffic-management/apisix.md - AWS ALB: features/traffic-management/alb.md + - Google Cloud: features/traffic-management/google-cloud.md - Istio: features/traffic-management/istio.md - NGINX: features/traffic-management/nginx.md - Plugins: features/traffic-management/plugins.md From 8512642b59a693d3d4861b134efae6561be9cad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 10:02:32 -0500 Subject: [PATCH 059/159] chore(deps): bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 (#2789) Bumps [github.com/sirupsen/logrus](https://github.com/sirupsen/logrus) from 1.9.1 to 1.9.2. - [Release notes](https://github.com/sirupsen/logrus/releases) - [Changelog](https://github.com/sirupsen/logrus/blob/master/CHANGELOG.md) - [Commits](https://github.com/sirupsen/logrus/compare/v1.9.1...v1.9.2) --- updated-dependencies: - dependency-name: github.com/sirupsen/logrus dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 139b025a36..26f332a12f 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/servicemeshinterface/smi-sdk-go v0.5.0 - github.com/sirupsen/logrus v1.9.1 + github.com/sirupsen/logrus v1.9.2 github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index e126532dd0..6a8c25b240 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.1 h1:Ou41VVR3nMWWmTiEUnj0OlsgOSCUFgsPAOl6jRIcVtQ= -github.com/sirupsen/logrus v1.9.1/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= From e8d11176bb7b0c7372c2988631fb0446dd4556ad Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 24 May 2023 13:20:21 -0500 Subject: [PATCH 060/159] fix: make new alb fullName field optional for backward compatability (#2806) fix: make new field optional Signed-off-by: zachaller --- manifests/crds/rollout-crd.yaml | 3 --- manifests/install.yaml | 3 --- pkg/apiclient/rollout/rollout.swagger.json | 3 ++- pkg/apis/rollouts/v1alpha1/generated.proto | 2 ++ pkg/apis/rollouts/v1alpha1/openapi_generated.go | 9 +++++---- pkg/apis/rollouts/v1alpha1/types.go | 6 ++++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 80fcbb69e3..48b5ba105b 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -3318,7 +3318,6 @@ spec: type: string required: - arn - - fullName - name type: object loadBalancer: @@ -3331,7 +3330,6 @@ spec: type: string required: - arn - - fullName - name type: object stableTargetGroup: @@ -3344,7 +3342,6 @@ spec: type: string required: - arn - - fullName - name type: object type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index b4f0bbffc3..3ffc26e139 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -14552,7 +14552,6 @@ spec: type: string required: - arn - - fullName - name type: object loadBalancer: @@ -14565,7 +14564,6 @@ spec: type: string required: - arn - - fullName - name type: object stableTargetGroup: @@ -14578,7 +14576,6 @@ spec: type: string required: - arn - - fullName - name type: object type: object diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 071eb37dbc..a34dbc3181 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -724,7 +724,8 @@ "type": "string" }, "fullName": { - "type": "string" + "type": "string", + "title": "FullName is the full name of the resource\n+optional" } } }, diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 186c4ccc41..1026e00176 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -302,6 +302,8 @@ message AwsResourceRef { optional string arn = 2; + // FullName is the full name of the resource + // +optional optional string fullName = 3; } diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index d857f05559..7ee5eb6403 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -1099,13 +1099,14 @@ func schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref common.ReferenceCallba }, "fullName": { SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", + Description: "FullName is the full name of the resource", + Default: "", + Type: []string{"string"}, + Format: "", }, }, }, - Required: []string{"name", "arn", "fullName"}, + Required: []string{"name", "arn"}, }, }, } diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index a3804ccddd..bf9209b994 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -1007,8 +1007,10 @@ type ALBStatus struct { } type AwsResourceRef struct { - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - ARN string `json:"arn" protobuf:"bytes,2,opt,name=arn"` + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + ARN string `json:"arn" protobuf:"bytes,2,opt,name=arn"` + // FullName is the full name of the resource + // +optional FullName string `json:"fullName" protobuf:"bytes,3,opt,name=fullName"` } From cf444ecfe1f9b619b025e30bdd5475c1bc528d32 Mon Sep 17 00:00:00 2001 From: Marshall Jones Date: Wed, 24 May 2023 14:54:33 -0700 Subject: [PATCH 061/159] docs: Fix typo in header routing specification docs (#2808) * Fix typo in header routing specification * Add VGS to USERS.md --- USERS.md | 1 + docs/features/specification.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/USERS.md b/USERS.md index 5fd37e15ed..587548a806 100644 --- a/USERS.md +++ b/USERS.md @@ -45,3 +45,4 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Ubie](https://ubie.life/) 1. [VISITS Technologies](https://visits.world/en) 1. [Yotpo](https://www.yotpo.com/) +1. [VGS](https://www.vgs.io) diff --git a/docs/features/specification.md b/docs/features/specification.md index 025ab529c4..900f71704c 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -276,8 +276,8 @@ spec: matchTrafficWeight: true # Sets header based route with specified header values - # Setting header based route will send all 100 traffic to the canary for the requests - # O with a specified header, in this case request header "version":"2" + # Setting header based route will send all traffic to the canary for the requests + # with a specified header, in this case request header "version":"2" # (supported only with trafficRouting, for Istio only at the moment) - setHeaderRoute: # Name of the route that will be created by argo rollouts this must also be configured From 9690329f4af93aa5423fba4445ea72e32f481f0b Mon Sep 17 00:00:00 2001 From: Kyle Smith Date: Wed, 24 May 2023 17:50:55 -0500 Subject: [PATCH 062/159] docs: use correct capitalization for "Datadog" in navigation sidebar (#2809) See datadog/documentation#8028 for more context. Signed-off-by: Kyle Smith --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 6e2f77f388..10ebef45ab 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -59,7 +59,7 @@ nav: - Overview: features/analysis.md - Plugins: analysis/plugins.md - Prometheus: analysis/prometheus.md - - DataDog: analysis/datadog.md + - Datadog: analysis/datadog.md - NewRelic: analysis/newrelic.md - Wavefront: analysis/wavefront.md - Job: analysis/job.md From c4b48f0f5c5c442b8066ca5ed7d02f7db747c47e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 May 2023 14:54:57 +0000 Subject: [PATCH 063/159] docs: Update Changelog (#2807) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b1c180bc2..c9255af062 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,17 @@ + +## [v1.5.1](https://github.com/argoproj/argo-rollouts/compare/v1.5.0...v1.5.1) (2023-05-24) + +### Ci + +* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) + +### Fix + +* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) +* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) + + ## [v1.5.0](https://github.com/argoproj/argo-rollouts/compare/v1.5.0-rc1...v1.5.0) (2023-05-05) From 6cc4d2a643c355505c799caf8aa931abcba0a8ce Mon Sep 17 00:00:00 2001 From: pfyod Date: Tue, 30 May 2023 17:31:27 +0200 Subject: [PATCH 064/159] feat: retain TLS configuration for canary ingresses in the nginx integration. Fixes #1134 (#2679) * Retain TLS configuration for canary ingresses in the nginx integration Signed-off-by: Pavels Fjodorovs * Retain TLS configuration for canary ingresses in the nginx integration Signed-off-by: Pavels Fjodorovs * fixed tests after multiple nginx ingress merge Signed-off-by: Pavels Fjodorovs --------- Signed-off-by: Pavels Fjodorovs Signed-off-by: Pavels Fjodorovs --- rollout/trafficrouting/nginx/nginx.go | 20 ++- rollout/trafficrouting/nginx/nginx_test.go | 195 +++++++++++++++++++++ 2 files changed, 211 insertions(+), 4 deletions(-) diff --git a/rollout/trafficrouting/nginx/nginx.go b/rollout/trafficrouting/nginx/nginx.go index 2964cd5f39..3d56c55f6a 100644 --- a/rollout/trafficrouting/nginx/nginx.go +++ b/rollout/trafficrouting/nginx/nginx.go @@ -66,8 +66,6 @@ func (r *Reconciler) buildCanaryIngress(stableIngress *networkingv1.Ingress, nam canaryServiceName := r.cfg.Rollout.Spec.Strategy.Canary.CanaryService annotationPrefix := defaults.GetCanaryIngressAnnotationPrefixOrDefault(r.cfg.Rollout) - // Set up canary ingress resource, we do *not* have to duplicate `spec.tls` in a canary, only - // `spec.rules` desiredCanaryIngress := &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -78,6 +76,14 @@ func (r *Reconciler) buildCanaryIngress(stableIngress *networkingv1.Ingress, nam }, } + // Preserve TLS from stable ingress + if stableIngress.Spec.TLS != nil { + desiredCanaryIngress.Spec.TLS = make([]networkingv1.IngressTLS, len(stableIngress.Spec.TLS)) + for it := 0; it < len(stableIngress.Spec.TLS); it++ { + stableIngress.Spec.TLS[it].DeepCopyInto(&desiredCanaryIngress.Spec.TLS[it]) + } + } + // Preserve ingressClassName from stable ingress if stableIngress.Spec.IngressClassName != nil { desiredCanaryIngress.Spec.IngressClassName = stableIngress.Spec.IngressClassName @@ -136,8 +142,6 @@ func (r *Reconciler) buildLegacyCanaryIngress(stableIngress *extensionsv1beta1.I canaryServiceName := r.cfg.Rollout.Spec.Strategy.Canary.CanaryService annotationPrefix := defaults.GetCanaryIngressAnnotationPrefixOrDefault(r.cfg.Rollout) - // Set up canary ingress resource, we do *not* have to duplicate `spec.tls` in a canary, only - // `spec.rules` desiredCanaryIngress := &extensionsv1beta1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -148,6 +152,14 @@ func (r *Reconciler) buildLegacyCanaryIngress(stableIngress *extensionsv1beta1.I }, } + // Preserve TLS from stable ingress + if stableIngress.Spec.TLS != nil { + desiredCanaryIngress.Spec.TLS = make([]extensionsv1beta1.IngressTLS, len(stableIngress.Spec.TLS)) + for it := 0; it < len(stableIngress.Spec.TLS); it++ { + stableIngress.Spec.TLS[it].DeepCopyInto(&desiredCanaryIngress.Spec.TLS[it]) + } + } + // Preserve ingressClassName from stable ingress if stableIngress.Spec.IngressClassName != nil { desiredCanaryIngress.Spec.IngressClassName = stableIngress.Spec.IngressClassName diff --git a/rollout/trafficrouting/nginx/nginx_test.go b/rollout/trafficrouting/nginx/nginx_test.go index d597b1187e..6930ce1e06 100644 --- a/rollout/trafficrouting/nginx/nginx_test.go +++ b/rollout/trafficrouting/nginx/nginx_test.go @@ -212,6 +212,48 @@ func checkBackendServiceLegacy(t *testing.T, ing *extensionsv1beta1.Ingress, ser assert.Fail(t, msg) } +func checkTLS(t *testing.T, ing *ingressutil.Ingress, hosts [][]string, secretNames []string) { + t.Helper() + switch ing.Mode() { + case ingressutil.IngressModeNetworking: + networkingIngress, err := ing.GetNetworkingIngress() + if err != nil { + t.Error(err) + } + checkIngressTLS(t, networkingIngress, hosts, secretNames) + case ingressutil.IngressModeExtensions: + extensionsIngress, err := ing.GetExtensionsIngress() + if err != nil { + t.Error(err) + } + checkTLSLegacy(t, extensionsIngress, hosts, secretNames) + } +} + +func checkIngressTLS(t *testing.T, ing *networkingv1.Ingress, hosts [][]string, secretNames []string) { + t.Helper() + assert.Equal(t, len(hosts), len(ing.Spec.TLS), "Count of TLS rules differs") + for it := 0; it < len(ing.Spec.TLS); it++ { + assert.Equal(t, secretNames[it], ing.Spec.TLS[it].SecretName, "Secret name differs") + assert.Equal(t, len(hosts[it]), len(ing.Spec.TLS[it].Hosts), "Count of hosts differs") + for ih := 0; ih < len(ing.Spec.TLS[it].Hosts); ih++ { + assert.Equal(t, hosts[it][ih], ing.Spec.TLS[it].Hosts[ih]) + } + } +} + +func checkTLSLegacy(t *testing.T, ing *extensionsv1beta1.Ingress, hosts [][]string, secretNames []string) { + t.Helper() + assert.Equal(t, len(hosts), len(ing.Spec.TLS), "Count of TLS rules differs") + for it := 0; it < len(ing.Spec.TLS); it++ { + assert.Equal(t, secretNames[it], ing.Spec.TLS[it].SecretName, "Secret name differs") + assert.Equal(t, len(hosts[it]), len(ing.Spec.TLS[it].Hosts), "Count of hosts differs") + for ih := 0; ih < len(ing.Spec.TLS[it].Hosts); ih++ { + assert.Equal(t, hosts[it][ih], ing.Spec.TLS[it].Hosts[ih]) + } + } +} + func TestCanaryIngressCreate(t *testing.T) { tests := generateMultiIngressTestData() for _, test := range tests { @@ -347,6 +389,159 @@ func TestCanaryIngressRetainIngressClass(t *testing.T) { } } +func TestCanaryIngressRetainTLS(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, StableIngress, nil), + }, + } + stable := networkingIngress(StableIngress, 80, stableService) + stable.Spec.TLS = []networkingv1.IngressTLS{ + { + Hosts: []string{"fakehost.example.com"}, + SecretName: "tls-secret-name", + }, + { + Hosts: []string{"fakehost.example.com", "*.example.com"}, + SecretName: "tls-secret-name-two", + }, + } + stableIngress := ingressutil.NewIngress(stable) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngress), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + checkTLS(t, desiredCanaryIngress, [][]string{ + {"fakehost.example.com"}, + {"fakehost.example.com", "*.example.com"}, + }, []string{ + "tls-secret-name", + "tls-secret-name-two", + }) +} + +func TestCanaryIngressRetainTLSWithMultipleStableIngresses(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, StableIngress, []string{StableIngresses}), + }, + } + + // main + stable := networkingIngress(StableIngress, 80, stableService) + stable.Spec.TLS = []networkingv1.IngressTLS{ + { + Hosts: []string{"fakehost.example.com"}, + SecretName: "tls-secret-name", + }, + } + stableIngress := ingressutil.NewIngress(stable) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngress), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + checkTLS(t, desiredCanaryIngress, [][]string{ + {"fakehost.example.com"}, + }, []string{ + "tls-secret-name", + }) + + // additional + stableAdditional := networkingIngress(StableIngresses, 80, stableService) + stableAdditional.Spec.TLS = []networkingv1.IngressTLS{ + { + Hosts: []string{"fakehost-additional.example.com"}, + SecretName: "tls-secret-name-additional", + }, + } + stableAdditionalIngress := ingressutil.NewIngress(stableAdditional) + + desiredAdditionalCanaryIngress, err := r.canaryIngress(stableAdditionalIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngresses), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + checkTLS(t, desiredAdditionalCanaryIngress, [][]string{ + {"fakehost-additional.example.com"}, + }, []string{ + "tls-secret-name-additional", + }) + +} + +func TestCanaryIngressRetainLegacyTLS(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, StableIngress, nil), + }, + } + stable := extensionsIngress(StableIngress, 80, stableService) + stable.Spec.TLS = []extensionsv1beta1.IngressTLS{ + { + Hosts: []string{"fakehost.example.com"}, + SecretName: "tls-secret-name", + }, + { + Hosts: []string{"fakehost.example.com", "*.example.com"}, + SecretName: "tls-secret-name-two", + }, + } + stableIngress := ingressutil.NewLegacyIngress(stable) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngress), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + checkTLS(t, desiredCanaryIngress, [][]string{ + {"fakehost.example.com"}, + {"fakehost.example.com", "*.example.com"}, + }, []string{ + "tls-secret-name", + "tls-secret-name-two", + }) +} + +func TestCanaryIngressNotAddTLS(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, StableIngress, nil), + }, + } + stable := networkingIngress(StableIngress, 80, stableService) + + stableIngress := ingressutil.NewIngress(stable) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngress), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + desired, err := desiredCanaryIngress.GetNetworkingIngress() + + if err != nil { + t.Fatal(err) + } + + assert.Nil(t, desired.Spec.TLS, "No TLS in the the canary ingress should be present") +} + +func TestCanaryIngressNotAddLegacyTLS(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, StableIngress, nil), + }, + } + stable := extensionsIngress(StableIngress, 80, stableService) + + stableIngress := ingressutil.NewLegacyIngress(stable) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), StableIngress), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + desired, err := desiredCanaryIngress.GetExtensionsIngress() + + if err != nil { + t.Fatal(err) + } + + assert.Nil(t, desired.Spec.TLS, "No TLS in the the canary ingress should be present") +} + func TestCanaryIngressAdditionalAnnotations(t *testing.T) { tests := generateMultiIngressTestData() for _, test := range tests { From 906f9a92ead9bcfbac3fc108369b1b6b8ca6f271 Mon Sep 17 00:00:00 2001 From: Joe Rice Date: Tue, 30 May 2023 10:39:36 -0500 Subject: [PATCH 065/159] docs: Fix AWS App Mesh getting started documentation to avoid connection pooling problems (#2814) Signed-off-by: Joe Rice --- docs/getting-started/appmesh/index.md | 9 ++++++--- examples/appmesh/canary-service.yaml | 12 ++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/getting-started/appmesh/index.md b/docs/getting-started/appmesh/index.md index 7378f85820..85399fe12f 100644 --- a/docs/getting-started/appmesh/index.md +++ b/docs/getting-started/appmesh/index.md @@ -57,7 +57,10 @@ respectively. In addition, there is a virtual-service named `rollout-demo-vsvc` virtual-router CR named `rollout-demo-vrouter`. This virtual-router need have at least one route with action to forward traffic to the canary and stable virtual-nodes. Initially weight for canary is set to 0% while for stable it is 100%. During rollout, controller will modify the weights on route(s) based on the configuraiton defined in -`steps[N].setWeight`. +`steps[N].setWeight`. + +The canary and stable services are configured to be headless. This is necessary to allow App Mesh to properly handle +conneciton pooling as pods are reassigned from canary to stable. To summarize, run the following commands to deploy a service: @@ -69,8 +72,8 @@ To summarize, run the following commands to deploy a service: * A rollout ```shell -kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/appmesh/canary-service.yaml -kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/appmesh/canary-rollout.yaml +kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/examples/appmesh/canary-service.yaml +kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/examples/appmesh/canary-rollout.yaml ``` ## 2. Verify service diff --git a/examples/appmesh/canary-service.yaml b/examples/appmesh/canary-service.yaml index 1523266471..bf1995db12 100644 --- a/examples/appmesh/canary-service.yaml +++ b/examples/appmesh/canary-service.yaml @@ -39,6 +39,7 @@ metadata: name: my-svc-canary namespace: argo-examples spec: + clusterIP: None ports: - port: 80 targetPort: http @@ -55,6 +56,7 @@ metadata: name: my-svc-stable namespace: argo-examples spec: + clusterIP: None ports: - port: 80 targetPort: http @@ -114,11 +116,12 @@ spec: rollouts-pod-template-hash: canary-tbd listeners: - portMapping: - port: 80 + port: 8080 protocol: http serviceDiscovery: dns: hostname: my-svc-canary.argo-examples.svc.cluster.local + responseType: ENDPOINTS --- apiVersion: appmesh.k8s.aws/v1beta2 @@ -133,11 +136,12 @@ spec: rollouts-pod-template-hash: stable-tbd listeners: - portMapping: - port: 80 + port: 8080 protocol: http serviceDiscovery: dns: hostname: my-svc-stable.argo-examples.svc.cluster.local + responseType: ENDPOINTS --- apiVersion: appmesh.k8s.aws/v1beta2 @@ -176,8 +180,8 @@ spec: containers: - name: wrk image: argoproj/load-tester:latest - command: + command: - /bin/sh - - -c + - -c - -x - "while true; do wrk -t10 -c40 -d2m -s report.lua http://my-svc.argo-examples/color; jq -e '.errors_ratio <= 0.35 and .latency_avg_ms < 100' report.json; done" From 0cbf6aee1478e226a43ecc83926748d28316f04e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 01:51:56 -0500 Subject: [PATCH 066/159] chore(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 (#2817) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.3 to 1.8.4. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 26f332a12f..51508c9e94 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 diff --git a/go.sum b/go.sum index 6a8c25b240..8136b0f8ed 100644 --- a/go.sum +++ b/go.sum @@ -672,8 +672,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= From 065d9eb0d339dcec32b703558ec42f2525416ce7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 09:17:26 -0500 Subject: [PATCH 067/159] chore(deps): bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 (#2822) Bumps [github.com/hashicorp/go-plugin](https://github.com/hashicorp/go-plugin) from 1.4.9 to 1.4.10. - [Release notes](https://github.com/hashicorp/go-plugin/releases) - [Changelog](https://github.com/hashicorp/go-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-plugin/compare/v1.4.9...v1.4.10) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 51508c9e94..b5240ee782 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-plugin v1.4.9 + github.com/hashicorp/go-plugin v1.4.10 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 diff --git a/go.sum b/go.sum index 8136b0f8ed..c3f6553452 100644 --- a/go.sum +++ b/go.sum @@ -397,8 +397,8 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj 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-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.4.9 h1:ESiK220/qE0aGxWdzKIvRH69iLiuN/PjoLTm69RoWtU= -github.com/hashicorp/go-plugin v1.4.9/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= +github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= +github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= 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= From d50ce719898400323baee62cd499d4b5b621e931 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 09:17:48 -0500 Subject: [PATCH 068/159] chore(deps): bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 (#2821) Bumps [github.com/sirupsen/logrus](https://github.com/sirupsen/logrus) from 1.9.2 to 1.9.3. - [Release notes](https://github.com/sirupsen/logrus/releases) - [Changelog](https://github.com/sirupsen/logrus/blob/master/CHANGELOG.md) - [Commits](https://github.com/sirupsen/logrus/compare/v1.9.2...v1.9.3) --- updated-dependencies: - dependency-name: github.com/sirupsen/logrus dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b5240ee782..483b262228 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/servicemeshinterface/smi-sdk-go v0.5.0 - github.com/sirupsen/logrus v1.9.2 + github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index c3f6553452..76e249181d 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= From 58af090f5aedcb5b452a019ced12d33c9296e756 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:19:37 +0300 Subject: [PATCH 069/159] docs: support for Kong ingress (#2820) Signed-off-by: Kostis Kapelonis --- docs/features/traffic-management/index.md | 3 ++- docs/features/traffic-management/kong.md | 22 ++++++++++++++++++++++ mkdocs.yml | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 docs/features/traffic-management/kong.md diff --git a/docs/features/traffic-management/index.md b/docs/features/traffic-management/index.md index 6850b62fe9..a5e3f851c6 100644 --- a/docs/features/traffic-management/index.md +++ b/docs/features/traffic-management/index.md @@ -16,7 +16,7 @@ Service Meshes fill this missing functionality in Kubernetes. They introduce new ## How does Argo Rollouts enable traffic management? -Argo Rollouts enables traffic management by manipulating the Service Mesh resources to match the intent of the Rollout. Argo Rollouts currently supports the following service meshes: +Argo Rollouts enables traffic management by manipulating the Service Mesh resources to match the intent of the Rollout. Argo Rollouts currently supports the following traffic providers: - [AWS ALB Ingress Controller](alb.md) - [Ambassador Edge Stack](ambassador.md) @@ -24,6 +24,7 @@ Argo Rollouts enables traffic management by manipulating the Service Mesh resour - [Google Cloud](google-cloud.md) - [Gateway API](plugins.md) - [Istio](istio.md) +- [Kong Ingress](kong.md) - [Nginx Ingress Controller](nginx.md) - [Service Mesh Interface (SMI)](smi.md) - [Traefik Proxy](traefik.md) diff --git a/docs/features/traffic-management/kong.md b/docs/features/traffic-management/kong.md new file mode 100644 index 0000000000..ad6e22bc84 --- /dev/null +++ b/docs/features/traffic-management/kong.md @@ -0,0 +1,22 @@ +# Kong Ingress + +With the introduction of the Kubernetes Gateway API it is now possible to use Argo Rollouts with all compliant implementations that support it. The integration is available with the [Argo Rollouts Gateway API plugin](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/) currently hosted in Argo Labs. + +Useful resources: + +* [The Gateway API specification](https://gateway-api.sigs.k8s.io/) +* [Support of the Gateway API in Kong](https://docs.konghq.com/kubernetes-ingress-controller/latest/concepts/gateway-api/) +* [Argo Rollouts Plugin capabilities](../plugins/) +* [Plugin for the Gateway API](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi) + +The process involves the following steps: + +1. Installing the Gateway API CRDs in your cluster +1. Installing Kong and enabling the Gateway API support feature +1. Creating a GatewayClass and Gateway resources +1. Installing Argo Rollouts + gateway API plugin in the cluster +1. Defining a Rollout that takes advantage of the plugin + +For a full application that includes all manifests see the [plugin example](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/tree/main/examples/kong). + + diff --git a/mkdocs.yml b/mkdocs.yml index 10ebef45ab..26552ae072 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -51,6 +51,7 @@ nav: - AWS ALB: features/traffic-management/alb.md - Google Cloud: features/traffic-management/google-cloud.md - Istio: features/traffic-management/istio.md + - Kong: features/traffic-management/kong.md - NGINX: features/traffic-management/nginx.md - Plugins: features/traffic-management/plugins.md - SMI: features/traffic-management/smi.md From b853c29b7b41dc03ec511af6f17fa58bda913d01 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Tue, 6 Jun 2023 16:20:29 +0200 Subject: [PATCH 070/159] docs: Update datadog.md - clarify formulas #2813 (#2819) Update datadog.md - clarify formulas Signed-off-by: Alex Eftimie --- docs/analysis/datadog.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index 8a80064914..3010c9a4df 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -23,14 +23,13 @@ spec: apiVersion: v2 interval: 5m query: | - sum:requests.error.count{service:{{args.service-name}}} / - sum:requests.request.count{service:{{args.service-name}}} + sum:requests.error.rate{service:{{args.service-name}}} ``` The field `apiVersion` refers to the API version of Datadog (v1 or v2). Default value is `v1` if this is omitted. !!! note - Datadog is moving away from the legacy v1 API. Rate limits imposed by Datadog are therefore stricter when using v1. It is recommended to switch to v2 soon. If you switch to v2, you will not need to change any other field aside from `apiVersion`. + Datadog is moving away from the legacy v1 API. Rate limits imposed by Datadog are therefore stricter when using v1. It is recommended to switch to v2 soon. If you switch to v2, you will not be able to use formulas (operations between individual queries). Datadog api and app tokens can be configured in a kubernetes secret in argo-rollouts namespace. From 07e630547dc3bef1fc02bc2c5467a707c2fae625 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 07:52:33 -0500 Subject: [PATCH 071/159] chore(deps): bump docker/build-push-action from 4.0.0 to 4.1.0 (#2832) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/3b5e8027fcad23fda98b2e3ac259d8d67585f671...44ea916f6c540f9302d50c2b1e5a8dc071f15cdf) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 834b97f291..adab037aca 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 #v4.0.0 + uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf #v4.1.0 with: context: . platforms: ${{ inputs.platforms }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 919cd7c51c..8485e97a02 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -84,7 +84,7 @@ jobs: password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Build and push (controller-image) - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 # v4.0.0 + uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf # v4.1.0 with: context: . platforms: linux/amd64,linux/arm64 @@ -94,7 +94,7 @@ jobs: sbom: false - name: Build and push (plugin-image) - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 # v4.0.0 + uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf # v4.1.0 with: context: . target: kubectl-argo-rollouts From 3308401c35cf7f7d74760b525bfa3cc15be43ba6 Mon Sep 17 00:00:00 2001 From: Andre Marcelo-Tanner Date: Mon, 12 Jun 2023 11:06:17 -0400 Subject: [PATCH 072/159] docs: Update docs of Rollout spec to add active/previewMetadata (#2833) Update docs for Rollout specification.md Add blueGreen activeMetadata / previewMetadata as its part of the spec. Signed-off-by: Andre Marcelo-Tanner --- docs/features/specification.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/features/specification.md b/docs/features/specification.md index 900f71704c..5f2a817c88 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -151,6 +151,18 @@ spec: requiredDuringSchedulingIgnoredDuringExecution: {} preferredDuringSchedulingIgnoredDuringExecution: weight: 1 # Between 1 - 100 + + # activeMetadata will be merged and updated in-place into the ReplicaSet's spec.template.metadata + # of the active pods. +optional + activeMetadata: + labels: + role: active + + # Metadata which will be attached to the preview pods only during their preview phase. + # +optional + previewMetadata: + labels: + role: preview # Canary update strategy canary: From 30770a29ede9881125f16b1a86a6ec8e09359032 Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Tue, 13 Jun 2023 10:41:50 -0400 Subject: [PATCH 073/159] fix(analysis): Adding field in YAML to provide region for Sigv4 signing. (#2794) * Add field for prometheus config Signed-off-by: Kevin Lewin * update doc Signed-off-by: Kevin Lewin * fixing newline Signed-off-by: Kevin Lewin * adding variable in doc Signed-off-by: Kevin Lewin * codegen Signed-off-by: zachaller * updating sigv4 struct Signed-off-by: Kevin Lewin * fixing sigv4 title Signed-off-by: Kevin Lewin * codegen Signed-off-by: zachaller * clean up bad codegen Signed-off-by: zachaller * move to authentication field Signed-off-by: zachaller * update docs Signed-off-by: zachaller --------- Signed-off-by: Kevin Lewin Signed-off-by: zachaller Co-authored-by: zachaller --- docs/analysis/prometheus.md | 7 +- .../features/kustomize/rollout_cr_schema.json | 57 + manifests/crds/analysis-run-crd.yaml | 12 + manifests/crds/analysis-template-crd.yaml | 12 + .../crds/cluster-analysis-template-crd.yaml | 12 + manifests/install.yaml | 36 + metricproviders/prometheus/prometheus.go | 6 +- pkg/apis/api-rules/violation_exceptions.list | 1 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 18 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1513 +++++++++++------ pkg/apis/rollouts/v1alpha1/generated.proto | 21 + .../rollouts/v1alpha1/openapi_generated.go | 65 + .../v1alpha1/zz_generated.deepcopy.go | 34 + 13 files changed, 1265 insertions(+), 529 deletions(-) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index 9bc8890645..9030d94403 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -36,7 +36,7 @@ See the [Analysis Overview page](../../features/analysis) for more details on th ## Utilizing Amazon Managed Prometheus -Amazon Managed Prometheus can be used as the prometheus data source for analysis. In order to do this the namespace where you analysis is running will have to have the appropriate [IRSA attached](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-ingest-metrics-new-Prometheus.html#AMP-onboard-new-Prometheus-IRSA) to allow for prometheus queries. Once you ensure the proper permissions are in place to access AMP, you can use an AMP workspace url in your ```provider``` block: +Amazon Managed Prometheus can be used as the prometheus data source for analysis. In order to do this the namespace where your analysis is running will have to have the appropriate [IRSA attached](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-ingest-metrics-new-Prometheus.html#AMP-onboard-new-Prometheus-IRSA) to allow for prometheus queries. Once you ensure the proper permissions are in place to access AMP, you can use an AMP workspace url in your ```provider``` block and add a SigV4 config for Sigv4 signing: ```yaml provider: @@ -49,6 +49,11 @@ provider: sum(irate( istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] )) + authentication: + sigv4: + region: $REGION + profile: $PROFILE + roleArn: $ROLEARN ``` # Additional Metadata diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 6e645d3a4c..d980188a93 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -4259,6 +4259,25 @@ "address": { "type": "string" }, + "authentication": { + "properties": { + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "query": { "type": "string" } @@ -8630,6 +8649,25 @@ "address": { "type": "string" }, + "authentication": { + "properties": { + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "query": { "type": "string" } @@ -13001,6 +13039,25 @@ "address": { "type": "string" }, + "authentication": { + "properties": { + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "query": { "type": "string" } diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 920eaff7b5..c17c338a13 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2765,6 +2765,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index e60e521f1f..1359dc1507 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2761,6 +2761,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 3849f1f3b8..f4023eda12 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2761,6 +2761,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index 3ffc26e139..4e8964c5f3 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2766,6 +2766,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object @@ -5713,6 +5725,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object @@ -8546,6 +8570,18 @@ spec: properties: address: type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object query: type: string type: object diff --git a/metricproviders/prometheus/prometheus.go b/metricproviders/prometheus/prometheus.go index 66b621183e..83c9ec83f2 100644 --- a/metricproviders/prometheus/prometheus.go +++ b/metricproviders/prometheus/prometheus.go @@ -171,7 +171,11 @@ func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { } //Check if using Amazon Managed Prometheus if true build sigv4 client if strings.Contains(metric.Provider.Prometheus.Address, "aps-workspaces") { - var cfg sigv4.SigV4Config + cfg := sigv4.SigV4Config{ + Region: metric.Provider.Prometheus.Authentication.Sigv4.Region, + Profile: metric.Provider.Prometheus.Authentication.Sigv4.Profile, + RoleARN: metric.Provider.Prometheus.Authentication.Sigv4.RoleARN, + } var next http.RoundTripper sigv4RoundTripper, err := sigv4.NewSigV4RoundTripper(&cfg, next) if err != nil { diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 248d6d4fa5..2b177e4ce3 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -45,3 +45,4 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,WebMetric,Headers API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,MetricProvider,SkyWalking API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,HPAReplicas +API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,Sigv4Config,RoleARN diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index e5db33137b..72364344de 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -210,6 +210,24 @@ type PrometheusMetric struct { Address string `json:"address,omitempty" protobuf:"bytes,1,opt,name=address"` // Query is a raw prometheus query to perform Query string `json:"query,omitempty" protobuf:"bytes,2,opt,name=query"` + // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // +optional + Authentication PrometheusAuth `json:"authentication,omitempty" protobuf:"bytes,3,opt,name=authentication"` +} + +// PrometheusMetric defines the prometheus query to perform canary analysis +type PrometheusAuth struct { + // +optional + Sigv4 Sigv4Config `json:"sigv4,omitempty" protobuf:"bytes,3,opt,name=sigv4"` +} + +type Sigv4Config struct { + // Region is the AWS Region to sign the SigV4 Request + Region string `json:"region,omitempty" protobuf:"bytes,1,opt,name=address"` + // Profile is the Credential Profile used to sign the SigV4 Request + Profile string `json:"profile,omitempty" protobuf:"bytes,2,opt,name=profile"` + // RoleARN is the IAM role used to sign the SIgV4 Request + RoleARN string `json:"roleArn,omitempty" protobuf:"bytes,3,opt,name=roleArn"` } // WavefrontMetric defines the wavefront query to perform canary analysis diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 998e3ea168..b2face819c 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -1955,10 +1955,38 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) XXX_DiscardUnknown() { var xxx_messageInfo_PreferredDuringSchedulingIgnoredDuringExecution proto.InternalMessageInfo +func (m *PrometheusAuth) Reset() { *m = PrometheusAuth{} } +func (*PrometheusAuth) ProtoMessage() {} +func (*PrometheusAuth) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{68} +} +func (m *PrometheusAuth) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PrometheusAuth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PrometheusAuth) XXX_Merge(src proto.Message) { + xxx_messageInfo_PrometheusAuth.Merge(m, src) +} +func (m *PrometheusAuth) XXX_Size() int { + return m.Size() +} +func (m *PrometheusAuth) XXX_DiscardUnknown() { + xxx_messageInfo_PrometheusAuth.DiscardUnknown(m) +} + +var xxx_messageInfo_PrometheusAuth proto.InternalMessageInfo + func (m *PrometheusMetric) Reset() { *m = PrometheusMetric{} } func (*PrometheusMetric) ProtoMessage() {} func (*PrometheusMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{68} + return fileDescriptor_e0e705f843545fab, []int{69} } func (m *PrometheusMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1988,7 +2016,7 @@ func (m *RequiredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*RequiredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*RequiredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{69} + return fileDescriptor_e0e705f843545fab, []int{70} } func (m *RequiredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2016,7 +2044,7 @@ var xxx_messageInfo_RequiredDuringSchedulingIgnoredDuringExecution proto.Interna func (m *RollbackWindowSpec) Reset() { *m = RollbackWindowSpec{} } func (*RollbackWindowSpec) ProtoMessage() {} func (*RollbackWindowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{70} + return fileDescriptor_e0e705f843545fab, []int{71} } func (m *RollbackWindowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2044,7 +2072,7 @@ var xxx_messageInfo_RollbackWindowSpec proto.InternalMessageInfo func (m *Rollout) Reset() { *m = Rollout{} } func (*Rollout) ProtoMessage() {} func (*Rollout) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{71} + return fileDescriptor_e0e705f843545fab, []int{72} } func (m *Rollout) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2072,7 +2100,7 @@ var xxx_messageInfo_Rollout proto.InternalMessageInfo func (m *RolloutAnalysis) Reset() { *m = RolloutAnalysis{} } func (*RolloutAnalysis) ProtoMessage() {} func (*RolloutAnalysis) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{72} + return fileDescriptor_e0e705f843545fab, []int{73} } func (m *RolloutAnalysis) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2100,7 +2128,7 @@ var xxx_messageInfo_RolloutAnalysis proto.InternalMessageInfo func (m *RolloutAnalysisBackground) Reset() { *m = RolloutAnalysisBackground{} } func (*RolloutAnalysisBackground) ProtoMessage() {} func (*RolloutAnalysisBackground) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{73} + return fileDescriptor_e0e705f843545fab, []int{74} } func (m *RolloutAnalysisBackground) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2128,7 +2156,7 @@ var xxx_messageInfo_RolloutAnalysisBackground proto.InternalMessageInfo func (m *RolloutAnalysisRunStatus) Reset() { *m = RolloutAnalysisRunStatus{} } func (*RolloutAnalysisRunStatus) ProtoMessage() {} func (*RolloutAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{74} + return fileDescriptor_e0e705f843545fab, []int{75} } func (m *RolloutAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2156,7 +2184,7 @@ var xxx_messageInfo_RolloutAnalysisRunStatus proto.InternalMessageInfo func (m *RolloutAnalysisTemplate) Reset() { *m = RolloutAnalysisTemplate{} } func (*RolloutAnalysisTemplate) ProtoMessage() {} func (*RolloutAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{75} + return fileDescriptor_e0e705f843545fab, []int{76} } func (m *RolloutAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2184,7 +2212,7 @@ var xxx_messageInfo_RolloutAnalysisTemplate proto.InternalMessageInfo func (m *RolloutCondition) Reset() { *m = RolloutCondition{} } func (*RolloutCondition) ProtoMessage() {} func (*RolloutCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{76} + return fileDescriptor_e0e705f843545fab, []int{77} } func (m *RolloutCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2212,7 +2240,7 @@ var xxx_messageInfo_RolloutCondition proto.InternalMessageInfo func (m *RolloutExperimentStep) Reset() { *m = RolloutExperimentStep{} } func (*RolloutExperimentStep) ProtoMessage() {} func (*RolloutExperimentStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{77} + return fileDescriptor_e0e705f843545fab, []int{78} } func (m *RolloutExperimentStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +2270,7 @@ func (m *RolloutExperimentStepAnalysisTemplateRef) Reset() { } func (*RolloutExperimentStepAnalysisTemplateRef) ProtoMessage() {} func (*RolloutExperimentStepAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{78} + return fileDescriptor_e0e705f843545fab, []int{79} } func (m *RolloutExperimentStepAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2270,7 +2298,7 @@ var xxx_messageInfo_RolloutExperimentStepAnalysisTemplateRef proto.InternalMessa func (m *RolloutExperimentTemplate) Reset() { *m = RolloutExperimentTemplate{} } func (*RolloutExperimentTemplate) ProtoMessage() {} func (*RolloutExperimentTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{79} + return fileDescriptor_e0e705f843545fab, []int{80} } func (m *RolloutExperimentTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2298,7 +2326,7 @@ var xxx_messageInfo_RolloutExperimentTemplate proto.InternalMessageInfo func (m *RolloutList) Reset() { *m = RolloutList{} } func (*RolloutList) ProtoMessage() {} func (*RolloutList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{80} + return fileDescriptor_e0e705f843545fab, []int{81} } func (m *RolloutList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2326,7 +2354,7 @@ var xxx_messageInfo_RolloutList proto.InternalMessageInfo func (m *RolloutPause) Reset() { *m = RolloutPause{} } func (*RolloutPause) ProtoMessage() {} func (*RolloutPause) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{81} + return fileDescriptor_e0e705f843545fab, []int{82} } func (m *RolloutPause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2354,7 +2382,7 @@ var xxx_messageInfo_RolloutPause proto.InternalMessageInfo func (m *RolloutSpec) Reset() { *m = RolloutSpec{} } func (*RolloutSpec) ProtoMessage() {} func (*RolloutSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{82} + return fileDescriptor_e0e705f843545fab, []int{83} } func (m *RolloutSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2382,7 +2410,7 @@ var xxx_messageInfo_RolloutSpec proto.InternalMessageInfo func (m *RolloutStatus) Reset() { *m = RolloutStatus{} } func (*RolloutStatus) ProtoMessage() {} func (*RolloutStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{83} + return fileDescriptor_e0e705f843545fab, []int{84} } func (m *RolloutStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2410,7 +2438,7 @@ var xxx_messageInfo_RolloutStatus proto.InternalMessageInfo func (m *RolloutStrategy) Reset() { *m = RolloutStrategy{} } func (*RolloutStrategy) ProtoMessage() {} func (*RolloutStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{84} + return fileDescriptor_e0e705f843545fab, []int{85} } func (m *RolloutStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2438,7 +2466,7 @@ var xxx_messageInfo_RolloutStrategy proto.InternalMessageInfo func (m *RolloutTrafficRouting) Reset() { *m = RolloutTrafficRouting{} } func (*RolloutTrafficRouting) ProtoMessage() {} func (*RolloutTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{85} + return fileDescriptor_e0e705f843545fab, []int{86} } func (m *RolloutTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2466,7 +2494,7 @@ var xxx_messageInfo_RolloutTrafficRouting proto.InternalMessageInfo func (m *RouteMatch) Reset() { *m = RouteMatch{} } func (*RouteMatch) ProtoMessage() {} func (*RouteMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{86} + return fileDescriptor_e0e705f843545fab, []int{87} } func (m *RouteMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2494,7 +2522,7 @@ var xxx_messageInfo_RouteMatch proto.InternalMessageInfo func (m *RunSummary) Reset() { *m = RunSummary{} } func (*RunSummary) ProtoMessage() {} func (*RunSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{87} + return fileDescriptor_e0e705f843545fab, []int{88} } func (m *RunSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2522,7 +2550,7 @@ var xxx_messageInfo_RunSummary proto.InternalMessageInfo func (m *SMITrafficRouting) Reset() { *m = SMITrafficRouting{} } func (*SMITrafficRouting) ProtoMessage() {} func (*SMITrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{88} + return fileDescriptor_e0e705f843545fab, []int{89} } func (m *SMITrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2550,7 +2578,7 @@ var xxx_messageInfo_SMITrafficRouting proto.InternalMessageInfo func (m *ScopeDetail) Reset() { *m = ScopeDetail{} } func (*ScopeDetail) ProtoMessage() {} func (*ScopeDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{89} + return fileDescriptor_e0e705f843545fab, []int{90} } func (m *ScopeDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2578,7 +2606,7 @@ var xxx_messageInfo_ScopeDetail proto.InternalMessageInfo func (m *SecretKeyRef) Reset() { *m = SecretKeyRef{} } func (*SecretKeyRef) ProtoMessage() {} func (*SecretKeyRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{90} + return fileDescriptor_e0e705f843545fab, []int{91} } func (m *SecretKeyRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2606,7 +2634,7 @@ var xxx_messageInfo_SecretKeyRef proto.InternalMessageInfo func (m *SetCanaryScale) Reset() { *m = SetCanaryScale{} } func (*SetCanaryScale) ProtoMessage() {} func (*SetCanaryScale) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{91} + return fileDescriptor_e0e705f843545fab, []int{92} } func (m *SetCanaryScale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2634,7 +2662,7 @@ var xxx_messageInfo_SetCanaryScale proto.InternalMessageInfo func (m *SetHeaderRoute) Reset() { *m = SetHeaderRoute{} } func (*SetHeaderRoute) ProtoMessage() {} func (*SetHeaderRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{92} + return fileDescriptor_e0e705f843545fab, []int{93} } func (m *SetHeaderRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2662,7 +2690,7 @@ var xxx_messageInfo_SetHeaderRoute proto.InternalMessageInfo func (m *SetMirrorRoute) Reset() { *m = SetMirrorRoute{} } func (*SetMirrorRoute) ProtoMessage() {} func (*SetMirrorRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{93} + return fileDescriptor_e0e705f843545fab, []int{94} } func (m *SetMirrorRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2687,10 +2715,38 @@ func (m *SetMirrorRoute) XXX_DiscardUnknown() { var xxx_messageInfo_SetMirrorRoute proto.InternalMessageInfo +func (m *Sigv4Config) Reset() { *m = Sigv4Config{} } +func (*Sigv4Config) ProtoMessage() {} +func (*Sigv4Config) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{95} +} +func (m *Sigv4Config) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sigv4Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Sigv4Config) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sigv4Config.Merge(m, src) +} +func (m *Sigv4Config) XXX_Size() int { + return m.Size() +} +func (m *Sigv4Config) XXX_DiscardUnknown() { + xxx_messageInfo_Sigv4Config.DiscardUnknown(m) +} + +var xxx_messageInfo_Sigv4Config proto.InternalMessageInfo + func (m *SkyWalkingMetric) Reset() { *m = SkyWalkingMetric{} } func (*SkyWalkingMetric) ProtoMessage() {} func (*SkyWalkingMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{94} + return fileDescriptor_e0e705f843545fab, []int{96} } func (m *SkyWalkingMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2718,7 +2774,7 @@ var xxx_messageInfo_SkyWalkingMetric proto.InternalMessageInfo func (m *StickinessConfig) Reset() { *m = StickinessConfig{} } func (*StickinessConfig) ProtoMessage() {} func (*StickinessConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{95} + return fileDescriptor_e0e705f843545fab, []int{97} } func (m *StickinessConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2746,7 +2802,7 @@ var xxx_messageInfo_StickinessConfig proto.InternalMessageInfo func (m *StringMatch) Reset() { *m = StringMatch{} } func (*StringMatch) ProtoMessage() {} func (*StringMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{96} + return fileDescriptor_e0e705f843545fab, []int{98} } func (m *StringMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2774,7 +2830,7 @@ var xxx_messageInfo_StringMatch proto.InternalMessageInfo func (m *TCPRoute) Reset() { *m = TCPRoute{} } func (*TCPRoute) ProtoMessage() {} func (*TCPRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{97} + return fileDescriptor_e0e705f843545fab, []int{99} } func (m *TCPRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2802,7 +2858,7 @@ var xxx_messageInfo_TCPRoute proto.InternalMessageInfo func (m *TLSRoute) Reset() { *m = TLSRoute{} } func (*TLSRoute) ProtoMessage() {} func (*TLSRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{98} + return fileDescriptor_e0e705f843545fab, []int{100} } func (m *TLSRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2830,7 +2886,7 @@ var xxx_messageInfo_TLSRoute proto.InternalMessageInfo func (m *TemplateService) Reset() { *m = TemplateService{} } func (*TemplateService) ProtoMessage() {} func (*TemplateService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{99} + return fileDescriptor_e0e705f843545fab, []int{101} } func (m *TemplateService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2858,7 +2914,7 @@ var xxx_messageInfo_TemplateService proto.InternalMessageInfo func (m *TemplateSpec) Reset() { *m = TemplateSpec{} } func (*TemplateSpec) ProtoMessage() {} func (*TemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{100} + return fileDescriptor_e0e705f843545fab, []int{102} } func (m *TemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2942,7 @@ var xxx_messageInfo_TemplateSpec proto.InternalMessageInfo func (m *TemplateStatus) Reset() { *m = TemplateStatus{} } func (*TemplateStatus) ProtoMessage() {} func (*TemplateStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{101} + return fileDescriptor_e0e705f843545fab, []int{103} } func (m *TemplateStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2914,7 +2970,7 @@ var xxx_messageInfo_TemplateStatus proto.InternalMessageInfo func (m *TraefikTrafficRouting) Reset() { *m = TraefikTrafficRouting{} } func (*TraefikTrafficRouting) ProtoMessage() {} func (*TraefikTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{102} + return fileDescriptor_e0e705f843545fab, []int{104} } func (m *TraefikTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,7 +2998,7 @@ var xxx_messageInfo_TraefikTrafficRouting proto.InternalMessageInfo func (m *TrafficWeights) Reset() { *m = TrafficWeights{} } func (*TrafficWeights) ProtoMessage() {} func (*TrafficWeights) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{103} + return fileDescriptor_e0e705f843545fab, []int{105} } func (m *TrafficWeights) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2970,7 +3026,7 @@ var xxx_messageInfo_TrafficWeights proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{104} + return fileDescriptor_e0e705f843545fab, []int{106} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2998,7 +3054,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *WavefrontMetric) Reset() { *m = WavefrontMetric{} } func (*WavefrontMetric) ProtoMessage() {} func (*WavefrontMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{105} + return fileDescriptor_e0e705f843545fab, []int{107} } func (m *WavefrontMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3026,7 +3082,7 @@ var xxx_messageInfo_WavefrontMetric proto.InternalMessageInfo func (m *WebMetric) Reset() { *m = WebMetric{} } func (*WebMetric) ProtoMessage() {} func (*WebMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{106} + return fileDescriptor_e0e705f843545fab, []int{108} } func (m *WebMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3054,7 +3110,7 @@ var xxx_messageInfo_WebMetric proto.InternalMessageInfo func (m *WebMetricHeader) Reset() { *m = WebMetricHeader{} } func (*WebMetricHeader) ProtoMessage() {} func (*WebMetricHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{107} + return fileDescriptor_e0e705f843545fab, []int{109} } func (m *WebMetricHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3082,7 +3138,7 @@ var xxx_messageInfo_WebMetricHeader proto.InternalMessageInfo func (m *WeightDestination) Reset() { *m = WeightDestination{} } func (*WeightDestination) ProtoMessage() {} func (*WeightDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{108} + return fileDescriptor_e0e705f843545fab, []int{110} } func (m *WeightDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3184,6 +3240,7 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PodTemplateMetadata.AnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PodTemplateMetadata.LabelsEntry") proto.RegisterType((*PreferredDuringSchedulingIgnoredDuringExecution)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution") + proto.RegisterType((*PrometheusAuth)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth") proto.RegisterType((*PrometheusMetric)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric") proto.RegisterType((*RequiredDuringSchedulingIgnoredDuringExecution)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution") proto.RegisterType((*RollbackWindowSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RollbackWindowSpec") @@ -3212,6 +3269,7 @@ func init() { proto.RegisterType((*SetCanaryScale)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetCanaryScale") proto.RegisterType((*SetHeaderRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetHeaderRoute") proto.RegisterType((*SetMirrorRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetMirrorRoute") + proto.RegisterType((*Sigv4Config)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config") proto.RegisterType((*SkyWalkingMetric)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SkyWalkingMetric") proto.RegisterType((*StickinessConfig)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StickinessConfig") proto.RegisterType((*StringMatch)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StringMatch") @@ -3234,509 +3292,516 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8026 bytes of a gzipped FileDescriptorProto + // 8134 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, - 0x9c, 0xfa, 0x8c, 0xcb, 0xd9, 0x3e, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, + 0x9c, 0xfa, 0x8c, 0xcb, 0xc9, 0x3e, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xb6, 0x86, 0x7b, 0x2b, 0x4b, 0x3a, 0x5b, 0xcd, 0x99, 0xc7, 0x61, 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x65, 0x24, 0xc8, 0x1f, 0x03, 0x31, 0xe2, 0x2f, 0xfd, 0x71, 0x20, 0xff, 0x48, 0x64, 0x07, 0x30, 0x1d, 0x51, 0xf9, 0x93, - 0x20, 0x81, 0x11, 0xc0, 0x41, 0xe0, 0xfd, 0x11, 0x04, 0xef, 0xb3, 0x5f, 0xf7, 0xf4, 0x70, 0x67, - 0x38, 0xcd, 0xd5, 0x25, 0xd6, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, 0x55, + 0x20, 0x81, 0x61, 0xc0, 0x41, 0xe0, 0xfd, 0x11, 0x04, 0xef, 0xb3, 0x5f, 0xf7, 0xf4, 0x70, 0x67, + 0x38, 0xcd, 0xd5, 0x25, 0xf1, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, 0x55, 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, 0xdf, - 0x0d, 0xfc, 0x7b, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, 0x6f, - 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x70, 0xda, 0xdd, 0x3d, 0xe7, 0x13, 0xab, - 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x1d, 0x53, 0x5b, - 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x51, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, 0x97, - 0x28, 0x6a, 0xcb, 0x1f, 0x33, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, 0xf2, + 0x0d, 0xfc, 0x7b, 0xfc, 0xc7, 0xc7, 0x03, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, 0x6f, + 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x74, 0xda, 0xdd, 0x3d, 0xe7, 0x93, 0xab, + 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x13, 0x53, 0x5b, + 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x56, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, 0x97, + 0x28, 0x6a, 0xcb, 0x1f, 0x37, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, 0xf2, 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x6a, 0xb8, 0xe2, 0xfa, 0x4c, 0xb6, 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, 0xa0, 0x59, 0x38, 0x2f, 0xc7, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, 0x43, 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, 0x37, 0x1f, 0x55, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xa5, 0x41, 0xf5, 0x7a, 0x91, 0xdb, - 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0xf7, 0x0a, 0x50, 0xaa, 0x6c, 0x56, 0xeb, - 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x55, 0x0b, 0xe6, 0xda, 0xbe, 0xd3, 0xac, 0x3a, 0x6d, 0xc7, 0x6b, + 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0x77, 0x0b, 0x50, 0xaa, 0x6c, 0x56, 0xeb, + 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x35, 0x0b, 0xe6, 0xda, 0xbe, 0xd3, 0xac, 0x3a, 0x6d, 0xc7, 0x6b, 0xd0, 0x60, 0xc9, 0x7a, 0xc6, 0x7a, 0x7e, 0xf6, 0xc5, 0xcd, 0x95, 0x71, 0xfa, 0x6b, 0xa5, 0x72, - 0x3f, 0x44, 0x1a, 0xfa, 0xbd, 0xa0, 0x41, 0x91, 0xee, 0x56, 0x2f, 0x7e, 0xe7, 0xa8, 0xfc, 0xc4, - 0xf1, 0x51, 0x79, 0x6e, 0xd3, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0x5b, 0x16, 0x9c, 0x6f, 0x38, 0x9e, + 0x3f, 0x44, 0x1a, 0xfa, 0xbd, 0xa0, 0x41, 0x91, 0xee, 0x56, 0x2f, 0x7e, 0xf7, 0xa8, 0xfc, 0xc4, + 0xf1, 0x51, 0x79, 0x6e, 0xd3, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0xdb, 0x16, 0x9c, 0x6f, 0x38, 0x9e, 0x13, 0x1c, 0x6e, 0x3b, 0x41, 0x8b, 0x46, 0x6f, 0x04, 0x7e, 0xaf, 0xbb, 0x34, 0x71, 0x06, 0xd2, 0x3c, 0x29, 0xa5, 0x39, 0xbf, 0x96, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, 0xd9, 0x69, 0x53, 0x53, 0xae, 0xc2, 0x59, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xec, 0x0f, 0x0a, 0x70, 0xbe, 0xb2, 0x59, 0xdd, 0x0e, 0x9c, 0xdd, 0x5d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x16, 0xf9, - 0x71, 0x98, 0x76, 0xbd, 0x56, 0x40, 0xc3, 0x90, 0x77, 0x64, 0xa9, 0xba, 0x20, 0x89, 0x4e, 0x6f, - 0x88, 0x62, 0x54, 0x70, 0xf2, 0x0a, 0xcc, 0x86, 0x34, 0x38, 0x70, 0x1b, 0xb4, 0xe6, 0x07, 0x11, - 0x6f, 0xe9, 0x62, 0xf5, 0x82, 0x44, 0x9f, 0xad, 0xc7, 0x20, 0x34, 0xf1, 0x58, 0xb5, 0xc0, 0xf7, - 0x23, 0x09, 0xe7, 0x0d, 0x51, 0x8a, 0xab, 0x61, 0x0c, 0x42, 0x13, 0x8f, 0x7c, 0xd3, 0x82, 0xc5, - 0x30, 0x72, 0x1b, 0xfb, 0xae, 0x47, 0xc3, 0x70, 0xcd, 0xf7, 0x76, 0xdd, 0xd6, 0x52, 0x91, 0xb7, - 0xe2, 0xad, 0xf1, 0x5a, 0xb1, 0x9e, 0xa2, 0x5a, 0xbd, 0x78, 0x7c, 0x54, 0x5e, 0x4c, 0x97, 0x62, - 0x1f, 0x77, 0xb2, 0x0e, 0x8b, 0x8e, 0xe7, 0xf9, 0x91, 0x13, 0xb9, 0xbe, 0x57, 0x0b, 0xe8, 0xae, - 0xfb, 0x60, 0x69, 0x92, 0x7f, 0xce, 0x92, 0xfc, 0x9c, 0xc5, 0x4a, 0x0a, 0x8e, 0x7d, 0x35, 0xec, - 0x75, 0x58, 0xaa, 0x74, 0x76, 0x9c, 0x30, 0x74, 0x9a, 0x7e, 0x90, 0xea, 0x8d, 0xe7, 0x61, 0xa6, - 0xe3, 0x74, 0xbb, 0xae, 0xd7, 0x62, 0xdd, 0x51, 0x78, 0xbe, 0x54, 0x9d, 0x3b, 0x3e, 0x2a, 0xcf, - 0x6c, 0xc9, 0x32, 0xd4, 0x50, 0xfb, 0x4f, 0x27, 0x60, 0xb6, 0xe2, 0x39, 0xed, 0xc3, 0xd0, 0x0d, - 0xb1, 0xe7, 0x91, 0x2f, 0xc0, 0x0c, 0x5b, 0x5d, 0x9a, 0x4e, 0xe4, 0xc8, 0x19, 0xf9, 0xf1, 0x15, - 0x31, 0xd9, 0x57, 0xcc, 0xc9, 0x1e, 0xb7, 0x0b, 0xc3, 0x5e, 0x39, 0xf8, 0xc4, 0xca, 0x5b, 0x3b, - 0xf7, 0x68, 0x23, 0xda, 0xa2, 0x91, 0x53, 0x25, 0xf2, 0x2b, 0x20, 0x2e, 0x43, 0x4d, 0x95, 0xf8, - 0x30, 0x19, 0x76, 0x69, 0x43, 0xce, 0xb0, 0xad, 0x31, 0x47, 0x72, 0x2c, 0x7a, 0xbd, 0x4b, 0x1b, - 0xd5, 0x39, 0xc9, 0x7a, 0x92, 0xfd, 0x43, 0xce, 0x88, 0xdc, 0x87, 0xa9, 0x90, 0xaf, 0x39, 0x72, - 0xf2, 0xbc, 0x95, 0x1f, 0x4b, 0x4e, 0xb6, 0x3a, 0x2f, 0x99, 0x4e, 0x89, 0xff, 0x28, 0xd9, 0xd9, - 0xff, 0xc9, 0x82, 0x0b, 0x06, 0x76, 0x25, 0x68, 0xf5, 0x3a, 0xd4, 0x8b, 0xc8, 0x33, 0x30, 0xe9, - 0x39, 0x1d, 0x2a, 0x27, 0x8a, 0x16, 0xf9, 0x96, 0xd3, 0xa1, 0xc8, 0x21, 0xe4, 0x59, 0x28, 0x1e, - 0x38, 0xed, 0x1e, 0xe5, 0x8d, 0x54, 0xaa, 0x9e, 0x93, 0x28, 0xc5, 0xb7, 0x59, 0x21, 0x0a, 0x18, - 0x79, 0x0f, 0x4a, 0xfc, 0xc7, 0xf5, 0xc0, 0xef, 0xe4, 0xf4, 0x69, 0x52, 0xc2, 0xb7, 0x15, 0xd9, - 0xea, 0xb9, 0xe3, 0xa3, 0x72, 0x49, 0xff, 0xc5, 0x98, 0xa1, 0xfd, 0xe7, 0x16, 0x2c, 0x18, 0x1f, - 0xb7, 0xe9, 0x86, 0x11, 0xf9, 0x7c, 0xdf, 0xe0, 0x59, 0x19, 0x6e, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, - 0x2c, 0xca, 0x2f, 0x9d, 0x51, 0x25, 0xc6, 0xc0, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4d, - 0x3c, 0x53, 0x78, 0x7e, 0xf6, 0xc5, 0x8d, 0xdc, 0xba, 0x31, 0x6e, 0xdf, 0x0d, 0x46, 0x1f, 0x05, - 0x1b, 0xfb, 0x5f, 0x15, 0x12, 0xdd, 0xb7, 0xa5, 0xe4, 0xf8, 0xc0, 0x82, 0xa9, 0xb6, 0xb3, 0x43, - 0xdb, 0x62, 0x6e, 0xcd, 0xbe, 0xf8, 0x4e, 0x6e, 0x92, 0x28, 0x1e, 0x2b, 0x9b, 0x9c, 0xfe, 0x35, - 0x2f, 0x0a, 0x0e, 0xe3, 0xe1, 0x25, 0x0a, 0x51, 0x32, 0x27, 0xff, 0xd8, 0x82, 0xd9, 0x78, 0x55, - 0x50, 0xcd, 0xb2, 0x93, 0xbf, 0x30, 0xf1, 0x62, 0x24, 0x25, 0xd2, 0xab, 0xae, 0x01, 0x41, 0x53, - 0x96, 0xe5, 0x4f, 0xc2, 0xac, 0xf1, 0x09, 0x64, 0x11, 0x0a, 0xfb, 0xf4, 0x50, 0x0c, 0x78, 0x64, - 0x3f, 0xc9, 0xc5, 0xc4, 0x08, 0x97, 0x43, 0xfa, 0x53, 0x13, 0xaf, 0x5a, 0xcb, 0xaf, 0xc3, 0x62, - 0x9a, 0xe1, 0x28, 0xf5, 0xed, 0xdf, 0x9a, 0x4c, 0x0c, 0x4c, 0xb6, 0x10, 0x10, 0x1f, 0xa6, 0x3b, - 0x34, 0x0a, 0xdc, 0x86, 0xea, 0xb2, 0xf5, 0xf1, 0x5a, 0x69, 0x8b, 0x13, 0x8b, 0xf7, 0x38, 0xf1, - 0x3f, 0x44, 0xc5, 0x85, 0xec, 0xc1, 0xa4, 0x13, 0xb4, 0x54, 0x9f, 0x5c, 0xcf, 0x67, 0x5a, 0xc6, - 0x4b, 0x45, 0x25, 0x68, 0x85, 0xc8, 0x39, 0x90, 0x55, 0x28, 0x45, 0x34, 0xe8, 0xb8, 0x9e, 0x13, - 0x89, 0x4d, 0x71, 0xa6, 0x7a, 0x5e, 0xa2, 0x95, 0xb6, 0x15, 0x00, 0x63, 0x1c, 0xd2, 0x86, 0xa9, - 0x66, 0x70, 0x88, 0x3d, 0x6f, 0x69, 0x32, 0x8f, 0xa6, 0x58, 0xe7, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, - 0xa3, 0xe4, 0x41, 0x7e, 0xd5, 0x82, 0x8b, 0x1d, 0xea, 0x84, 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, - 0x51, 0x8f, 0x75, 0xec, 0x52, 0x91, 0x33, 0xc7, 0x71, 0xfb, 0xa1, 0x9f, 0x72, 0xf5, 0x69, 0x29, - 0xca, 0xc5, 0x2c, 0x28, 0x66, 0x4a, 0x63, 0xff, 0xe9, 0x24, 0x9c, 0xef, 0x5b, 0xd8, 0xc9, 0xcb, - 0x50, 0xec, 0xee, 0x39, 0xa1, 0x5a, 0xa9, 0xaf, 0xaa, 0x65, 0xa2, 0xc6, 0x0a, 0x1f, 0x1e, 0x95, - 0xcf, 0xa9, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0x53, 0x85, 0x3a, 0x34, 0x0c, 0x9d, 0x96, 0x5a, 0xbe, - 0x8d, 0x61, 0xc2, 0x8b, 0x51, 0xc1, 0xc9, 0xdf, 0xb3, 0xe0, 0x9c, 0x18, 0x32, 0x48, 0xc3, 0x5e, - 0x3b, 0x62, 0x5b, 0x14, 0x6b, 0x96, 0x9b, 0x79, 0x0c, 0x4f, 0x41, 0xb2, 0x7a, 0x49, 0x72, 0x3f, - 0x67, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x42, 0x29, 0x8c, 0x9c, 0x20, 0xa2, 0xcd, 0x4a, 0xc4, - 0x95, 0x91, 0xd9, 0x17, 0x7f, 0x62, 0xb8, 0xb5, 0x7b, 0xdb, 0xed, 0x50, 0xb1, 0x4f, 0xd4, 0x15, - 0x01, 0x8c, 0x69, 0x91, 0xf7, 0x00, 0x82, 0x9e, 0x57, 0xef, 0x75, 0x3a, 0x4e, 0x70, 0x28, 0x15, - 0xaf, 0x1b, 0xe3, 0x7d, 0x1e, 0x6a, 0x7a, 0xb1, 0xaa, 0x11, 0x97, 0xa1, 0xc1, 0x8f, 0x7c, 0xd9, - 0x82, 0x73, 0x62, 0x24, 0x2a, 0x09, 0xa6, 0x72, 0x96, 0xe0, 0x3c, 0x6b, 0xda, 0x75, 0x93, 0x05, - 0x26, 0x39, 0xda, 0xff, 0x21, 0xa9, 0x06, 0xd4, 0x23, 0x76, 0x28, 0x6a, 0x1d, 0x92, 0xcf, 0xc1, - 0x93, 0x61, 0xaf, 0xd1, 0xa0, 0x61, 0xb8, 0xdb, 0x6b, 0x63, 0xcf, 0xbb, 0xe1, 0x86, 0x91, 0x1f, - 0x1c, 0x6e, 0xba, 0x1d, 0x37, 0xe2, 0x23, 0xae, 0x58, 0xbd, 0x72, 0x7c, 0x54, 0x7e, 0xb2, 0x3e, - 0x08, 0x09, 0x07, 0xd7, 0x27, 0x0e, 0x3c, 0xd5, 0xf3, 0x06, 0x93, 0x17, 0x4a, 0x77, 0xf9, 0xf8, - 0xa8, 0xfc, 0xd4, 0x9d, 0xc1, 0x68, 0x78, 0x12, 0x0d, 0xfb, 0xbf, 0x59, 0x6c, 0xa5, 0x16, 0xdf, - 0xb5, 0x4d, 0x3b, 0xdd, 0x36, 0x5b, 0x5d, 0xce, 0x5e, 0x7f, 0x8c, 0x12, 0xfa, 0x23, 0xe6, 0xb3, - 0xdd, 0x29, 0xf9, 0x07, 0x29, 0x91, 0xf6, 0x7f, 0xb5, 0xe0, 0x62, 0x1a, 0xf9, 0x31, 0xe8, 0x3c, - 0x61, 0x52, 0xe7, 0xb9, 0x95, 0xef, 0xd7, 0x0e, 0x50, 0x7c, 0xbe, 0x3a, 0xd9, 0xff, 0xad, 0xff, - 0xbf, 0x6f, 0xa3, 0xf1, 0xae, 0x58, 0xf8, 0x61, 0xee, 0x8a, 0x93, 0x1f, 0xaa, 0x5d, 0xf1, 0xd7, - 0x27, 0x61, 0xae, 0xe2, 0x45, 0x6e, 0x65, 0x77, 0xd7, 0xf5, 0xdc, 0xe8, 0x90, 0x7c, 0x7d, 0x02, - 0x56, 0xbb, 0x01, 0xdd, 0xa5, 0x41, 0x40, 0x9b, 0xeb, 0xbd, 0xc0, 0xf5, 0x5a, 0xf5, 0xc6, 0x1e, - 0x6d, 0xf6, 0xda, 0xae, 0xd7, 0xda, 0x68, 0x79, 0xbe, 0x2e, 0xbe, 0xf6, 0x80, 0x36, 0x7a, 0xfc, - 0x93, 0xc4, 0xa4, 0xe8, 0x8c, 0xf7, 0x49, 0xb5, 0xd1, 0x98, 0x56, 0x5f, 0x3a, 0x3e, 0x2a, 0xaf, - 0x8e, 0x58, 0x09, 0x47, 0xfd, 0x34, 0xf2, 0xb5, 0x09, 0x58, 0x09, 0xe8, 0xcf, 0xf6, 0xdc, 0xe1, - 0x5b, 0x43, 0xac, 0x5a, 0xed, 0x31, 0xb7, 0x9f, 0x91, 0x78, 0x56, 0x5f, 0x3c, 0x3e, 0x2a, 0x8f, - 0x58, 0x07, 0x47, 0xfc, 0x2e, 0xbb, 0x06, 0xb3, 0x95, 0xae, 0x1b, 0xba, 0x0f, 0xd0, 0xef, 0x45, - 0x74, 0x88, 0x23, 0x6e, 0x19, 0x8a, 0x41, 0xaf, 0x4d, 0xc5, 0xdc, 0x2e, 0x55, 0x4b, 0x6c, 0x15, - 0x42, 0x56, 0x80, 0xa2, 0xdc, 0xfe, 0x79, 0xb6, 0xe2, 0x72, 0x92, 0x29, 0xe3, 0xc6, 0x3d, 0x28, - 0x06, 0x8c, 0x89, 0x1c, 0x59, 0xe3, 0x9e, 0x03, 0x63, 0xa9, 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, - 0xf6, 0xef, 0x4e, 0xc0, 0xa5, 0x4a, 0xb7, 0xbb, 0x45, 0xc3, 0xbd, 0x94, 0x14, 0xbf, 0x68, 0xc1, - 0xfc, 0x81, 0x1b, 0x44, 0x3d, 0xa7, 0xad, 0x4c, 0x52, 0x42, 0x9e, 0xfa, 0xb8, 0xf2, 0x70, 0x6e, - 0x6f, 0x27, 0x48, 0x57, 0xc9, 0xf1, 0x51, 0x79, 0x3e, 0x59, 0x86, 0x29, 0xf6, 0xe4, 0x1f, 0x59, - 0xb0, 0x28, 0x8b, 0x6e, 0xf9, 0x4d, 0x6a, 0xda, 0x31, 0xef, 0xe4, 0x29, 0x93, 0x26, 0x2e, 0x0c, - 0x5e, 0xe9, 0x52, 0xec, 0x13, 0xc2, 0xfe, 0x1f, 0x13, 0x70, 0x79, 0x00, 0x0d, 0xf2, 0x6b, 0x16, - 0x5c, 0x14, 0xc6, 0x4f, 0x03, 0x84, 0x74, 0x57, 0xb6, 0xe6, 0x4f, 0xe5, 0x2d, 0x39, 0xb2, 0x29, - 0x4e, 0xbd, 0x06, 0xad, 0x2e, 0xb1, 0xd5, 0x70, 0x2d, 0x83, 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, - 0xe6, 0xd0, 0x94, 0xa4, 0x13, 0x8f, 0x45, 0xd2, 0x7a, 0x06, 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0x3b, - 0xf0, 0xd4, 0x09, 0xe4, 0x1e, 0x3d, 0x39, 0xed, 0x77, 0xf4, 0xa8, 0x4f, 0x8e, 0xb9, 0x21, 0xe6, - 0xb5, 0x0d, 0x53, 0x7c, 0xea, 0xa8, 0x89, 0x0d, 0x6c, 0xfb, 0xe3, 0x73, 0x2a, 0x44, 0x09, 0xb1, - 0x7f, 0xd7, 0x82, 0x99, 0x11, 0xac, 0x61, 0xe5, 0xa4, 0x35, 0xac, 0xd4, 0x67, 0x09, 0x8b, 0xfa, - 0x2d, 0x61, 0x6f, 0x8c, 0xd7, 0x1b, 0xc3, 0x58, 0xc0, 0xfe, 0xc2, 0x82, 0xf3, 0x7d, 0x16, 0x33, - 0xb2, 0x07, 0x17, 0xbb, 0x7e, 0x53, 0xa9, 0x4d, 0x37, 0x9c, 0x70, 0x8f, 0xc3, 0xe4, 0xe7, 0xbd, - 0xcc, 0x7a, 0xb2, 0x96, 0x01, 0x7f, 0x78, 0x54, 0x5e, 0xd2, 0x44, 0x52, 0x08, 0x98, 0x49, 0x91, - 0x74, 0x61, 0x66, 0xd7, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0xc7, 0x54, 0x90, 0xae, 0x4b, 0x6a, 0xc2, - 0x58, 0xac, 0xfe, 0xa1, 0xe6, 0x62, 0x7f, 0x09, 0xe6, 0x93, 0x57, 0x07, 0x43, 0x74, 0xde, 0x15, - 0x28, 0x38, 0x81, 0x27, 0xbb, 0x6e, 0x56, 0x22, 0x14, 0x2a, 0x78, 0x0b, 0x59, 0x39, 0x79, 0x01, - 0x66, 0x76, 0x7b, 0xed, 0x36, 0xab, 0x20, 0x4d, 0xfa, 0x5a, 0x1d, 0xbe, 0x2e, 0xcb, 0x51, 0x63, - 0xd8, 0x7f, 0x35, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x11, 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, - 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xeb, 0xb4, 0x4d, 0x1b, 0x91, 0x1f, 0x48, 0x69, 0x2e, 0x4b, - 0x42, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x75, 0x98, 0x77, 0x1a, 0x91, 0x7b, 0x40, 0x35, - 0x05, 0x21, 0xee, 0x47, 0x24, 0x85, 0xf9, 0x4a, 0x02, 0x8a, 0x29, 0x6c, 0xf2, 0x79, 0x58, 0x0a, - 0x1b, 0x4e, 0x9b, 0xde, 0xe9, 0x4a, 0x56, 0x6b, 0x7b, 0xb4, 0xb1, 0x5f, 0xf3, 0x5d, 0x2f, 0x92, - 0x26, 0x99, 0x67, 0x24, 0xa5, 0xa5, 0xfa, 0x00, 0x3c, 0x1c, 0x48, 0x81, 0xfc, 0x5b, 0x0b, 0xae, - 0x74, 0x03, 0x5a, 0x0b, 0xfc, 0x8e, 0xcf, 0xf6, 0xda, 0x3e, 0x3b, 0x85, 0x3c, 0xaf, 0xbf, 0x3d, - 0xa6, 0x52, 0x21, 0x4a, 0xfa, 0xcd, 0xdb, 0x1f, 0x3d, 0x3e, 0x2a, 0x5f, 0xa9, 0x9d, 0x24, 0x00, - 0x9e, 0x2c, 0x1f, 0xf9, 0x77, 0x16, 0x5c, 0xed, 0xfa, 0x61, 0x74, 0xc2, 0x27, 0x14, 0xcf, 0xf4, - 0x13, 0xec, 0xe3, 0xa3, 0xf2, 0xd5, 0xda, 0x89, 0x12, 0xe0, 0x23, 0x24, 0xb4, 0x8f, 0x67, 0xe1, - 0xbc, 0x31, 0xf6, 0xe4, 0x21, 0xfe, 0x35, 0x38, 0xa7, 0x06, 0x43, 0xac, 0x04, 0x94, 0x62, 0xa3, - 0x4b, 0xc5, 0x04, 0x62, 0x12, 0x97, 0x8d, 0x3b, 0x3d, 0x14, 0x45, 0xed, 0xd4, 0xb8, 0xab, 0x25, - 0xa0, 0x98, 0xc2, 0x26, 0x1b, 0x70, 0x41, 0x96, 0x20, 0xed, 0xb6, 0xdd, 0x86, 0xb3, 0xe6, 0xf7, - 0xe4, 0x90, 0x2b, 0x56, 0x2f, 0x1f, 0x1f, 0x95, 0x2f, 0xd4, 0xfa, 0xc1, 0x98, 0x55, 0x87, 0x6c, - 0xc2, 0x45, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, 0x79, 0x6c, 0x5f, 0x69, 0xf2, 0xa1, 0x35, 0x23, - 0x36, 0xa0, 0x4a, 0x06, 0x1c, 0x33, 0x6b, 0x91, 0x5a, 0x8a, 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, - 0x7a, 0xb9, 0x18, 0x1f, 0x45, 0x2a, 0x19, 0x38, 0x98, 0x59, 0x93, 0xb4, 0x61, 0xbe, 0xe3, 0x3c, - 0xb8, 0xe3, 0x39, 0x07, 0x8e, 0xdb, 0x66, 0x4c, 0xa4, 0x21, 0x67, 0xb0, 0x75, 0xa1, 0x17, 0xb9, - 0xed, 0x15, 0x71, 0x15, 0xbd, 0xb2, 0xe1, 0x45, 0x6f, 0x05, 0xf5, 0x88, 0xa9, 0xac, 0x42, 0x95, - 0xda, 0x4a, 0xd0, 0xc2, 0x14, 0x6d, 0xf2, 0x16, 0x5c, 0xe2, 0xd3, 0x71, 0xdd, 0xbf, 0xef, 0xad, - 0xd3, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x93, 0xc7, 0x47, 0xe5, 0x4b, 0xf5, 0x2c, - 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x2a, 0x09, 0x40, 0x7a, 0xe0, 0x86, 0xae, 0xef, 0x09, 0x73, - 0xcc, 0x4c, 0x6c, 0x8e, 0xa9, 0x0f, 0x46, 0xc3, 0x93, 0x68, 0x90, 0x7f, 0x62, 0xc1, 0xc5, 0xac, - 0x69, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0x35, 0xb5, 0xc4, 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, - 0x20, 0xef, 0x5b, 0x30, 0xe7, 0x18, 0x47, 0xc9, 0x25, 0xe0, 0x52, 0xdd, 0x1c, 0xd7, 0xa0, 0x11, - 0x53, 0xac, 0x2e, 0x1e, 0x1f, 0x95, 0x13, 0xc7, 0x55, 0x4c, 0x70, 0x24, 0xff, 0xcc, 0x82, 0x4b, - 0x99, 0x73, 0x7c, 0x69, 0xf6, 0x2c, 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, - 0x4d, 0x4b, 0x6f, 0x65, 0xea, 0xee, 0x65, 0x69, 0x8e, 0x8b, 0x76, 0x7b, 0xcc, 0xd3, 0x73, 0xac, - 0x3e, 0x28, 0xc2, 0xd5, 0x0b, 0xc6, 0xce, 0xa8, 0x0a, 0x31, 0xcd, 0x9e, 0x7c, 0xc3, 0x52, 0x5b, - 0xa3, 0x96, 0xe8, 0xdc, 0x59, 0x49, 0x44, 0xe2, 0x9d, 0x56, 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x1a, - 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, 0x9f, 0x46, 0x57, 0x8f, 0x8f, 0xca, - 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0x37, 0x8b, 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, - 0xfa, 0x6d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, - 0x3a, 0xd3, 0x8d, 0xeb, 0x99, 0xe3, 0xa3, 0xf2, 0xd3, 0x6b, 0x27, 0xf0, 0xc7, 0x13, 0xa5, 0x23, - 0xff, 0xde, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xc6, 0x7e, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, - 0x26, 0xce, 0xf4, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, 0xdb, 0x6b, 0x8f, 0x94, 0x02, 0x87, 0x90, 0x94, - 0xbc, 0x01, 0xe7, 0x25, 0xd6, 0xb5, 0x07, 0x5d, 0x1a, 0xb8, 0x4c, 0xf9, 0x96, 0x8a, 0x63, 0xec, - 0x5e, 0x93, 0x46, 0xc0, 0xfe, 0x3a, 0x24, 0x84, 0xe9, 0xfb, 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, - 0x1a, 0xd3, 0xa7, 0x46, 0x9a, 0x07, 0xee, 0x0a, 0x9a, 0xd5, 0xd9, 0xe3, 0xa3, 0xf2, 0xb4, 0xfc, - 0x83, 0x8a, 0x13, 0xb9, 0x05, 0xf3, 0xe2, 0xc0, 0x56, 0x73, 0xbd, 0x56, 0xcd, 0xf7, 0x84, 0x27, - 0x4a, 0xa9, 0xfa, 0x9c, 0xda, 0xf0, 0xeb, 0x09, 0xe8, 0xc3, 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, - 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xc1, 0x14, 0x80, 0x1a, 0xae, 0xb4, 0x4b, 0x7e, 0x12, 0x4a, - 0x21, 0x8d, 0x04, 0x57, 0x79, 0x83, 0x20, 0x2e, 0x66, 0x54, 0x21, 0xc6, 0x70, 0xb2, 0x0f, 0xc5, - 0xae, 0xd3, 0x0b, 0xa9, 0xec, 0xfc, 0x9b, 0xb9, 0x74, 0x7e, 0x8d, 0x51, 0x14, 0x27, 0x34, 0xfe, - 0x13, 0x05, 0x0f, 0xf2, 0x15, 0x0b, 0x80, 0x26, 0x3b, 0x6c, 0x6c, 0x4b, 0x89, 0x64, 0x19, 0xf7, - 0x29, 0x6b, 0x83, 0xea, 0xfc, 0xf1, 0x51, 0x19, 0x8c, 0xae, 0x37, 0xd8, 0x92, 0xfb, 0x30, 0xe3, - 0xa8, 0x35, 0x7f, 0xf2, 0x2c, 0xd6, 0x7c, 0x7e, 0x70, 0xd2, 0x83, 0x56, 0x33, 0x23, 0x5f, 0xb3, - 0x60, 0x3e, 0xa4, 0x91, 0xec, 0x2a, 0xb6, 0xf2, 0x48, 0x85, 0x77, 0xcc, 0x41, 0x57, 0x4f, 0xd0, - 0x14, 0x2b, 0x68, 0xb2, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0x37, 0xa8, 0xd3, 0xa4, 0x01, 0x3f, 0x97, - 0x4b, 0x4d, 0x6a, 0x7c, 0x51, 0x0c, 0x9a, 0x5a, 0x14, 0xa3, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0x5b, - 0x6e, 0x10, 0xf8, 0x52, 0x94, 0x99, 0x9c, 0x44, 0x31, 0x68, 0x6a, 0x51, 0x8c, 0x32, 0x4c, 0xf1, - 0xb5, 0xbf, 0x7d, 0x0e, 0xe6, 0xd5, 0x44, 0x8a, 0x35, 0x7b, 0x61, 0x06, 0x1a, 0xa0, 0xd9, 0xaf, - 0x99, 0x40, 0x4c, 0xe2, 0xb2, 0xca, 0x62, 0xaa, 0x26, 0x15, 0x7b, 0x5d, 0xb9, 0x6e, 0x02, 0x31, - 0x89, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x97, 0xc1, 0x63, 0xde, 0x55, 0xc6, 0xeb, 0x43, - 0x7c, 0xdd, 0xc3, 0xfe, 0x85, 0x28, 0xb8, 0x70, 0x4b, 0x66, 0x94, 0x30, 0x6e, 0xca, 0xc9, 0x91, - 0xcf, 0xfc, 0x4c, 0xda, 0x4d, 0x45, 0x6f, 0x24, 0xcb, 0x30, 0xc5, 0x3e, 0x43, 0xd9, 0x2f, 0x9e, - 0xa1, 0xb2, 0xff, 0x59, 0x98, 0xe9, 0x38, 0x0f, 0xea, 0xbd, 0xa0, 0x75, 0xfa, 0x43, 0x85, 0x74, - 0xaf, 0x13, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb6, 0x8c, 0x25, 0x67, 0x9a, 0x13, 0xbf, 0x9b, 0xef, - 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, 0xf3, 0xd8, 0x55, 0x6f, 0xa6, 0x46, - 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0x99, 0xaa, 0x91, 0x6b, 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, - 0x11, 0x73, 0x4e, 0xcb, 0x03, 0x67, 0x2a, 0x4f, 0x3d, 0xc1, 0x0c, 0x53, 0xcc, 0x07, 0x9f, 0x37, - 0x67, 0xcf, 0xe6, 0xbc, 0x39, 0x97, 0xc3, 0x79, 0xf3, 0x64, 0x55, 0xfc, 0xdc, 0xb8, 0xaa, 0x38, - 0xb9, 0x09, 0xa4, 0x79, 0xe8, 0x39, 0x1d, 0xb7, 0x21, 0x17, 0x4b, 0xbe, 0x6d, 0xce, 0x73, 0x7b, - 0xc4, 0xb2, 0x5c, 0xc8, 0xc8, 0x7a, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x11, 0xcc, 0x74, 0x95, 0xc6, - 0xb5, 0x90, 0xc7, 0xe8, 0x57, 0x1a, 0x98, 0xf0, 0x17, 0x60, 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, - 0x36, 0xe1, 0x62, 0xc7, 0xf5, 0x6a, 0x7e, 0x33, 0xac, 0xd1, 0x40, 0x5a, 0x5b, 0xea, 0x34, 0x5a, - 0x5a, 0xe4, 0x6d, 0xc3, 0x4f, 0xd0, 0x5b, 0x19, 0x70, 0xcc, 0xac, 0x65, 0xff, 0x2f, 0x0b, 0x16, - 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xd7, 0x89, 0x1a, 0x7b, 0xe2, 0xaa, 0x9c, 0xbc, 0x0e, 0x33, 0xae, - 0x17, 0xd1, 0xe0, 0xc0, 0x69, 0xcb, 0xfd, 0xc9, 0x56, 0xe6, 0xd3, 0x0d, 0x59, 0xfe, 0xf0, 0xa8, - 0x3c, 0xbf, 0xde, 0x0b, 0xb8, 0x3b, 0x9d, 0x58, 0xad, 0x50, 0xd7, 0x21, 0xdf, 0xb6, 0xe0, 0xbc, - 0xb8, 0x6c, 0x5f, 0x77, 0x22, 0xe7, 0x76, 0x8f, 0x06, 0x2e, 0x55, 0xd7, 0xed, 0x63, 0x2e, 0x54, - 0x69, 0x59, 0x15, 0x83, 0xc3, 0x58, 0x51, 0xdf, 0x4a, 0x73, 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2a, - 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, 0xd3, 0x41, 0xd2, 0x9d, 0xd8, 0x68, - 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, - 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x0c, 0x45, 0xee, 0x5a, 0x29, 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, - 0x8c, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, 0x1a, 0x91, 0xbb, 0x24, 0xe6, 0xdb, - 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, 0x0d, 0x53, 0x4c, 0xa1, 0xf5, 0x9b, - 0xa7, 0xde, 0x14, 0xf9, 0x95, 0x4c, 0x8d, 0xd3, 0x40, 0x49, 0x8b, 0xb5, 0x55, 0x40, 0xa3, 0x5e, - 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x8c, 0x90, 0x02, 0x75, 0x29, 0x1a, 0x18, 0xf6, 0xbf, 0x99, - 0x80, 0x8b, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x4a, 0x48, 0x2b, 0x8f, 0xc6, 0x9f, 0xc9, 0xbf, 0x7d, - 0xa4, 0xdf, 0x88, 0xf6, 0xae, 0x90, 0x9e, 0x6d, 0x92, 0x2f, 0xf9, 0x8c, 0x6e, 0xa1, 0x89, 0x53, - 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0x67, 0x60, 0x32, 0x64, 0x3d, 0x5f, 0x48, 0x5e, 0x77, 0xf0, - 0x3e, 0xe2, 0x10, 0x86, 0xd1, 0xf3, 0xdc, 0x48, 0xfa, 0xf3, 0x6b, 0x8c, 0x3b, 0x9e, 0x1b, 0x21, - 0x87, 0xd8, 0xdf, 0x9a, 0x80, 0xe5, 0xc1, 0x1f, 0x45, 0xbe, 0x65, 0x01, 0x34, 0xd9, 0x71, 0x25, - 0xe4, 0x4e, 0xbd, 0xc2, 0xcf, 0xc6, 0x39, 0xab, 0x36, 0x5c, 0x57, 0x9c, 0x62, 0xa7, 0x2b, 0x5d, - 0x14, 0xa2, 0x21, 0x08, 0x79, 0x51, 0x0d, 0x7d, 0x7e, 0x55, 0x23, 0x26, 0x93, 0xae, 0xb3, 0xa5, - 0x21, 0x68, 0x60, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, 0xc0, 0x06, 0x3f, 0x8f, - 0xde, 0x52, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3b, 0x84, 0x9c, 0x39, 0x39, 0xcf, 0xdb, 0xff, - 0xd3, 0x82, 0xcb, 0x6b, 0xed, 0x5e, 0x18, 0xd1, 0xe0, 0xaf, 0x8d, 0x0f, 0xdb, 0xff, 0xb6, 0xe0, - 0xa9, 0x01, 0xdf, 0xfc, 0x18, 0x5c, 0xd9, 0xde, 0x4d, 0xba, 0xb2, 0xdd, 0x19, 0x77, 0x48, 0x67, - 0x7e, 0xc7, 0x00, 0x8f, 0xb6, 0x5f, 0xb7, 0xe0, 0x1c, 0x5b, 0xb6, 0x9a, 0x7e, 0x2b, 0xa7, 0x8d, - 0xf3, 0x59, 0x28, 0xfe, 0x2c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0x6c, 0xce, - 0x38, 0x5d, 0xf7, 0x6d, 0x1a, 0xf0, 0x0d, 0xa8, 0x90, 0x9c, 0x33, 0x15, 0x0d, 0x41, 0x03, 0xcb, - 0xfe, 0x34, 0x48, 0x67, 0xb1, 0xd4, 0x8c, 0xb3, 0x86, 0x99, 0x71, 0xf6, 0x7f, 0x9c, 0x00, 0xc3, - 0xf8, 0xf1, 0x18, 0x46, 0xb2, 0x97, 0x18, 0xc9, 0x63, 0x1e, 0xdc, 0x0d, 0x53, 0xce, 0xa0, 0x60, - 0x9e, 0x83, 0x54, 0x30, 0xcf, 0xad, 0xdc, 0x38, 0x9e, 0x1c, 0xcb, 0xf3, 0x3d, 0x0b, 0x9e, 0x8a, - 0x91, 0xfb, 0xed, 0x92, 0x8f, 0x5e, 0x96, 0x5e, 0x81, 0x59, 0x27, 0xae, 0x26, 0xc7, 0x8d, 0x11, - 0x49, 0xa1, 0x41, 0x68, 0xe2, 0xc5, 0x3e, 0xe8, 0x85, 0x53, 0xfa, 0xa0, 0x4f, 0x9e, 0xec, 0x83, - 0x6e, 0xff, 0xe5, 0x04, 0x5c, 0xe9, 0xff, 0x32, 0x35, 0xa1, 0x86, 0xbb, 0xe4, 0x7f, 0x15, 0xe6, - 0x22, 0x59, 0xc1, 0xd8, 0x1e, 0x74, 0xf4, 0xe5, 0xb6, 0x01, 0xc3, 0x04, 0x26, 0xab, 0xd9, 0x10, - 0x53, 0xb9, 0xde, 0xf0, 0xbb, 0x2a, 0x82, 0x41, 0xd7, 0x5c, 0x33, 0x60, 0x98, 0xc0, 0xd4, 0xbe, - 0xa1, 0x93, 0x67, 0xee, 0x1b, 0x5a, 0x87, 0x4b, 0xca, 0x1b, 0xee, 0xba, 0x1f, 0xac, 0xf9, 0x9d, - 0x6e, 0x9b, 0xca, 0x18, 0x06, 0x26, 0xec, 0x15, 0x59, 0xe5, 0x12, 0x66, 0x21, 0x61, 0x76, 0x5d, - 0xfb, 0x7b, 0x05, 0xb8, 0x10, 0x37, 0xfb, 0x9a, 0xef, 0x35, 0x5d, 0xee, 0x53, 0xf8, 0x1a, 0x4c, - 0x46, 0x87, 0x5d, 0xd5, 0xd8, 0x7f, 0x43, 0x89, 0xb3, 0x7d, 0xd8, 0x65, 0xbd, 0x7d, 0x39, 0xa3, - 0x0a, 0xb7, 0x0c, 0xf3, 0x4a, 0x64, 0x53, 0xcf, 0x0e, 0xd1, 0x03, 0x2f, 0x27, 0x47, 0xf3, 0xc3, - 0xa3, 0x72, 0x46, 0xf0, 0xf1, 0x8a, 0xa6, 0x94, 0x1c, 0xf3, 0xe4, 0x1e, 0xcc, 0xb7, 0x9d, 0x30, - 0xba, 0xd3, 0x6d, 0x3a, 0x11, 0xdd, 0x76, 0xa5, 0x87, 0xc6, 0x68, 0x81, 0x01, 0xfa, 0x2a, 0x7b, - 0x33, 0x41, 0x09, 0x53, 0x94, 0xc9, 0x01, 0x10, 0x56, 0xb2, 0x1d, 0x38, 0x5e, 0x28, 0xbe, 0x8a, - 0xf1, 0x1b, 0x3d, 0x10, 0x41, 0x9f, 0x0c, 0x37, 0xfb, 0xa8, 0x61, 0x06, 0x07, 0xf2, 0x1c, 0x4c, - 0x05, 0xd4, 0x09, 0x65, 0x67, 0x96, 0xe2, 0xf9, 0x8f, 0xbc, 0x14, 0x25, 0xd4, 0x9c, 0x50, 0x53, - 0x8f, 0x98, 0x50, 0x7f, 0x66, 0xc1, 0x7c, 0xdc, 0x4d, 0x8f, 0x61, 0x67, 0xed, 0x24, 0x77, 0xd6, - 0x1b, 0x79, 0x2d, 0x89, 0x03, 0x36, 0xd3, 0x3f, 0x9c, 0x32, 0xbf, 0x8f, 0x3b, 0x86, 0x7f, 0x11, - 0x4a, 0x6a, 0x56, 0x2b, 0x95, 0x75, 0xcc, 0x03, 0x76, 0x42, 0x99, 0x31, 0x02, 0x9a, 0x24, 0x13, - 0x8c, 0xf9, 0xb1, 0xad, 0xbc, 0x29, 0xb7, 0x69, 0x39, 0xec, 0xf5, 0x56, 0xae, 0xb6, 0xef, 0xac, - 0xad, 0x5c, 0xd5, 0x21, 0x77, 0xe0, 0x72, 0x37, 0xf0, 0x79, 0x6c, 0xf2, 0x3a, 0x75, 0x9a, 0x6d, - 0xd7, 0xa3, 0xca, 0x8a, 0x21, 0x3c, 0x29, 0x9e, 0x3a, 0x3e, 0x2a, 0x5f, 0xae, 0x65, 0xa3, 0xe0, - 0xa0, 0xba, 0xc9, 0xc0, 0xac, 0xc9, 0x21, 0x02, 0xb3, 0xfe, 0xbe, 0xb6, 0x15, 0xd2, 0x50, 0x86, - 0x47, 0x7d, 0x2e, 0xaf, 0xae, 0xcc, 0x58, 0xd6, 0xe3, 0x21, 0x55, 0x91, 0x4c, 0x51, 0xb3, 0x1f, - 0x6c, 0x90, 0x9a, 0x3a, 0xa5, 0x41, 0x2a, 0xf6, 0xaf, 0x9f, 0xfe, 0x61, 0xfa, 0xd7, 0xcf, 0x7c, - 0xa8, 0xfc, 0xeb, 0x3f, 0x28, 0xc2, 0x62, 0x5a, 0x03, 0x39, 0xfb, 0xa0, 0xb3, 0x7f, 0x68, 0xc1, - 0xa2, 0x9a, 0x3d, 0x82, 0x27, 0x55, 0x57, 0x0d, 0x9b, 0x39, 0x4d, 0x5a, 0xa1, 0x4b, 0xe9, 0x68, - 0xf6, 0xed, 0x14, 0x37, 0xec, 0xe3, 0x4f, 0xde, 0x81, 0x59, 0x6d, 0x91, 0x3f, 0x55, 0x04, 0xda, - 0x02, 0xd7, 0xa2, 0x62, 0x12, 0x68, 0xd2, 0x23, 0x1f, 0x58, 0x00, 0x0d, 0xb5, 0xcd, 0xa9, 0xd9, - 0x75, 0x3b, 0xaf, 0xd9, 0xa5, 0x37, 0xd0, 0x58, 0x59, 0xd6, 0x45, 0x21, 0x1a, 0x8c, 0xc9, 0x2f, - 0x71, 0x5b, 0xbc, 0xd6, 0xee, 0xd8, 0x7c, 0x2a, 0x8c, 0xef, 0x3b, 0x7c, 0x82, 0x62, 0x1a, 0xab, - 0x52, 0x06, 0x28, 0xc4, 0x84, 0x10, 0xf6, 0x6b, 0xa0, 0xbd, 0x3d, 0xd9, 0xb2, 0xc5, 0xfd, 0x3d, - 0x6b, 0x4e, 0xb4, 0x27, 0x87, 0xa0, 0x5e, 0xb6, 0xae, 0x2b, 0x00, 0xc6, 0x38, 0xf6, 0x17, 0x60, - 0xfe, 0x8d, 0xc0, 0xe9, 0xee, 0xb9, 0xdc, 0xe6, 0xcd, 0xce, 0x56, 0x3f, 0x0e, 0xd3, 0x4e, 0xb3, - 0x99, 0x95, 0x0b, 0xa2, 0x22, 0x8a, 0x51, 0xc1, 0x87, 0x3a, 0x46, 0xd9, 0x7f, 0x60, 0x01, 0x89, - 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, 0x3e, 0xda, 0xe3, 0xa5, 0x59, 0xe7, - 0xa3, 0x1b, 0x1a, 0x82, 0x06, 0x16, 0x79, 0x0f, 0x66, 0xc5, 0xbf, 0xb7, 0xb5, 0x85, 0x60, 0xec, - 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x99, 0xc4, 0x28, 0xbc, 0x11, 0x73, 0x40, 0x93, 0x1d, 0x6b, 0xaa, - 0x0d, 0x6f, 0xb7, 0xdd, 0x7b, 0xd0, 0xdc, 0x89, 0x9b, 0xaa, 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, - 0x9b, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0x6b, 0xaa, 0xdf, 0xb3, 0xe0, 0xe2, 0x46, 0x18, 0xb9, - 0xfe, 0x3a, 0x0d, 0x23, 0xb6, 0xad, 0xb0, 0xc5, 0xa7, 0xd7, 0x1e, 0xc6, 0x71, 0x7b, 0x1d, 0x16, - 0xe5, 0x1d, 0x66, 0x6f, 0x27, 0xa4, 0x91, 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x96, 0x82, 0x63, 0x5f, - 0x0d, 0x46, 0x45, 0x5e, 0x66, 0xc6, 0x54, 0x0a, 0x49, 0x2a, 0xf5, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, - 0xdf, 0x2d, 0xc0, 0x05, 0xfe, 0x19, 0xa9, 0xa0, 0x8b, 0x6f, 0x0c, 0x0a, 0xba, 0x18, 0x73, 0x2a, - 0x73, 0x5e, 0xa7, 0x08, 0xb9, 0xf8, 0x07, 0x16, 0x2c, 0x34, 0x93, 0x2d, 0x9d, 0x8f, 0x4d, 0x27, - 0xab, 0x0f, 0x85, 0xcb, 0x56, 0xaa, 0x10, 0xd3, 0xfc, 0xc9, 0x2f, 0x5b, 0xb0, 0x90, 0x14, 0x53, - 0xad, 0xee, 0x67, 0xd0, 0x48, 0xda, 0xc7, 0x3a, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x8f, 0x26, - 0x64, 0x97, 0x9e, 0x45, 0x44, 0x01, 0xb9, 0x0f, 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, - 0x9e, 0x08, 0xb7, 0x37, 0xeb, 0xc2, 0x7d, 0x20, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2f, - 0xce, 0xb8, 0xd1, 0x95, 0x8c, 0x73, 0x39, 0x8a, 0x6e, 0xaf, 0xd5, 0xd2, 0x8c, 0x65, 0x09, 0x63, - 0xac, 0x78, 0xd9, 0xbf, 0x61, 0x41, 0xe9, 0xa6, 0xaf, 0xd6, 0x91, 0x9f, 0xce, 0xc1, 0xd0, 0xa3, - 0xf5, 0x41, 0x7d, 0x4d, 0x19, 0x1f, 0x31, 0x5e, 0x4f, 0x98, 0x79, 0x9e, 0x36, 0x68, 0xaf, 0xf0, - 0x3c, 0x57, 0x8c, 0xd4, 0x4d, 0x7f, 0x67, 0xa0, 0xe9, 0xf1, 0x57, 0x8a, 0x70, 0xee, 0x4d, 0xe7, - 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, 0xf1, 0x0a, 0xcc, 0x3a, 0x5d, 0x7e, 0x0f, 0x66, 0xe8, 0xf8, - 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, 0x2f, 0x68, 0x22, 0xed, 0x4e, 0xd6, 0x52, 0xb4, 0x96, - 0x82, 0x63, 0x5f, 0x0d, 0x72, 0x13, 0x88, 0x8c, 0x46, 0xad, 0x34, 0x1a, 0x7e, 0xcf, 0x13, 0x4b, - 0x9a, 0x30, 0xaa, 0xe8, 0xc3, 0xe6, 0x56, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x9f, 0x87, 0xa5, 0x06, - 0xa7, 0x2c, 0x8f, 0x1e, 0x26, 0x45, 0x71, 0xfc, 0xd4, 0x71, 0x02, 0x6b, 0x03, 0xf0, 0x70, 0x20, - 0x05, 0x26, 0x69, 0x18, 0xf9, 0x81, 0xd3, 0xa2, 0x26, 0xdd, 0xa9, 0xa4, 0xa4, 0xf5, 0x3e, 0x0c, - 0xcc, 0xa8, 0x45, 0xbe, 0x04, 0xa5, 0x68, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0xbf, 0x85, - 0x31, 0x2d, 0x6d, 0xb2, 0xf7, 0xb7, 0x15, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, 0x79, 0x92, 0x00, - 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, 0x6f, 0xe6, 0xc2, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, - 0x1f, 0xe7, 0x80, 0x92, 0x93, 0xfd, 0xfb, 0x13, 0x30, 0x67, 0x22, 0x0e, 0xb1, 0x36, 0x7d, 0xc5, - 0x82, 0xb9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, 0x9d, - 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb7, 0x60, 0x21, 0x76, - 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, 0x97, 0xfa, 0x6b, 0x49, 0x4e, 0x98, 0x66, 0x6d, 0xef, - 0xc0, 0x62, 0xba, 0xb7, 0x59, 0x53, 0x76, 0x1d, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0xd6, 0x9c, 0x30, - 0x44, 0x0e, 0x21, 0x2f, 0xc0, 0x4c, 0xc7, 0x09, 0x5a, 0xae, 0xe7, 0xb4, 0x79, 0x2b, 0x16, 0x8c, - 0x05, 0x49, 0x96, 0xa3, 0xc6, 0xb0, 0x3f, 0x0e, 0x73, 0x5b, 0x8e, 0xd7, 0xa2, 0x4d, 0xb9, 0x0e, - 0x3f, 0x3a, 0xa6, 0xed, 0x07, 0x93, 0x30, 0x6b, 0x9c, 0xcd, 0xce, 0xfe, 0x9c, 0x95, 0x48, 0xa9, - 0x51, 0xc8, 0x31, 0xa5, 0xc6, 0x67, 0x01, 0x76, 0x5d, 0xcf, 0x0d, 0xf7, 0x4e, 0x99, 0xac, 0x83, - 0xdf, 0xeb, 0x5e, 0xd7, 0x14, 0xd0, 0xa0, 0x16, 0x5f, 0x9e, 0x15, 0x4f, 0xc8, 0x3c, 0xf5, 0x81, - 0x65, 0x6c, 0x37, 0x53, 0x79, 0x38, 0x0b, 0x18, 0x1d, 0xb3, 0xa2, 0xb6, 0x1f, 0x91, 0x6b, 0xe8, - 0xa4, 0x5d, 0x69, 0x1b, 0x66, 0x02, 0x1a, 0xf6, 0x3a, 0xec, 0xc4, 0x38, 0x3d, 0x72, 0x33, 0x70, - 0xb7, 0x0d, 0x94, 0xf5, 0x51, 0x53, 0x5a, 0x7e, 0x0d, 0xce, 0x25, 0x44, 0x18, 0x29, 0xfb, 0x90, - 0x0f, 0x99, 0x06, 0x80, 0xd3, 0x5c, 0xe6, 0xb0, 0xbe, 0x68, 0x1b, 0xd9, 0x3a, 0x74, 0x5f, 0x08, - 0xe7, 0x1c, 0x01, 0xb3, 0xff, 0x72, 0x0a, 0xe4, 0xfd, 0xf7, 0x10, 0xcb, 0x95, 0x79, 0xeb, 0x35, - 0x71, 0x8a, 0x5b, 0xaf, 0x9b, 0x30, 0xe7, 0x7a, 0x6e, 0xe4, 0x3a, 0x6d, 0x6e, 0xdc, 0x91, 0xdb, - 0xa9, 0xf2, 0x5e, 0x9e, 0xdb, 0x30, 0x60, 0x19, 0x74, 0x12, 0x75, 0xc9, 0x6d, 0x28, 0xf2, 0xfd, - 0x46, 0x0e, 0xe0, 0xd1, 0x2f, 0xe9, 0xb9, 0x7f, 0x86, 0x08, 0x69, 0x12, 0x94, 0xf8, 0xe1, 0x43, - 0xa4, 0x2b, 0xd1, 0xc7, 0x6f, 0x39, 0x8e, 0xe3, 0xc3, 0x47, 0x0a, 0x8e, 0x7d, 0x35, 0x18, 0x95, - 0x5d, 0xc7, 0x6d, 0xf7, 0x02, 0x1a, 0x53, 0x99, 0x4a, 0x52, 0xb9, 0x9e, 0x82, 0x63, 0x5f, 0x0d, - 0xb2, 0x0b, 0x73, 0xb2, 0x4c, 0xb8, 0x5c, 0x4d, 0x9f, 0xf2, 0x2b, 0xb9, 0x6b, 0xdd, 0x75, 0x83, - 0x12, 0x26, 0xe8, 0x92, 0x1e, 0x9c, 0x77, 0xbd, 0x86, 0xef, 0x35, 0xda, 0xbd, 0xd0, 0x3d, 0xa0, - 0x71, 0x3c, 0xd1, 0x69, 0x98, 0x5d, 0x3a, 0x3e, 0x2a, 0x9f, 0xdf, 0x48, 0x93, 0xc3, 0x7e, 0x0e, - 0xe4, 0xcb, 0x16, 0x5c, 0x6a, 0xf8, 0x5e, 0xc8, 0xe3, 0xff, 0x0f, 0xe8, 0xb5, 0x20, 0xf0, 0x03, - 0xc1, 0xbb, 0x74, 0x4a, 0xde, 0xdc, 0xa6, 0xb8, 0x96, 0x45, 0x12, 0xb3, 0x39, 0x91, 0x77, 0x61, - 0xa6, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, 0x7d, 0x6f, 0x33, 0x8f, 0x7c, 0x24, 0x35, 0x49, - 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, 0x99, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x39, - 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, 0xc8, 0xad, 0x71, 0xd3, 0x5e, 0x28, 0x7a, - 0xca, 0xe5, 0x85, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, - 0x5a, 0xc8, 0x9b, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x0f, 0x68, 0x90, 0x45, 0xa8, 0x18, 0x91, 0x1d, - 0x28, 0xdc, 0xa7, 0x3b, 0xf9, 0xc4, 0x5c, 0xdf, 0xa5, 0xf2, 0x34, 0x53, 0x9d, 0x3e, 0x3e, 0x2a, - 0x17, 0xee, 0xd2, 0x1d, 0x64, 0xc4, 0xd9, 0x77, 0x35, 0xc5, 0xdd, 0xbd, 0x5c, 0x2a, 0xc6, 0xfc, - 0xae, 0x84, 0x23, 0x80, 0xf8, 0x2e, 0x59, 0x84, 0x8a, 0x11, 0x79, 0x17, 0x4a, 0xf7, 0x9d, 0x03, - 0xba, 0x1b, 0xf8, 0x5e, 0x24, 0xfd, 0xac, 0xc6, 0x0c, 0x15, 0xb8, 0xab, 0xc8, 0x49, 0xbe, 0x7c, - 0x7b, 0xd7, 0x85, 0x18, 0xb3, 0x23, 0x07, 0x30, 0xe3, 0xd1, 0xfb, 0x48, 0xdb, 0x6e, 0x23, 0x1f, - 0xd7, 0xfc, 0x5b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0x7b, - 0xfe, 0x8e, 0x5c, 0xa8, 0xc6, 0xec, 0x4b, 0x7d, 0x32, 0x15, 0x7d, 0x79, 0xd3, 0xdf, 0x41, 0x46, - 0x9c, 0xcd, 0x91, 0x86, 0x76, 0xf2, 0x91, 0xcb, 0xd4, 0xad, 0x7c, 0x9d, 0x9b, 0xc4, 0x1c, 0x89, - 0x4b, 0xd1, 0xe0, 0xc8, 0xda, 0xb6, 0x25, 0x8d, 0x95, 0x72, 0xa1, 0x1a, 0xb3, 0x6d, 0x93, 0xa6, - 0x4f, 0xd1, 0xb6, 0xaa, 0x0c, 0x35, 0x2f, 0xc6, 0xd7, 0x95, 0x96, 0xbf, 0x7c, 0x96, 0xaa, 0xa4, - 0x1d, 0x51, 0xf0, 0x55, 0x65, 0xa8, 0x79, 0xb1, 0xf6, 0x0e, 0xf7, 0x0f, 0xef, 0x3b, 0xed, 0x7d, - 0xd7, 0x6b, 0xc9, 0x38, 0xc7, 0x71, 0xd3, 0xde, 0xee, 0x1f, 0xde, 0x15, 0xf4, 0xcc, 0xf6, 0x8e, - 0x4b, 0xd1, 0xe0, 0x48, 0xfe, 0xa9, 0x05, 0x53, 0xdd, 0x76, 0xaf, 0xe5, 0x7a, 0x4b, 0x73, 0x5c, - 0x4f, 0xfc, 0x4c, 0x9e, 0x2b, 0xf4, 0x4a, 0x8d, 0x93, 0x16, 0x8a, 0xe2, 0x4f, 0x68, 0x9f, 0x3d, - 0x5e, 0xf8, 0x0b, 0x7f, 0x5e, 0x5e, 0xa2, 0x5e, 0xc3, 0x6f, 0xba, 0x5e, 0x6b, 0xf5, 0x5e, 0xe8, - 0x7b, 0x2b, 0xe8, 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x94, - 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x31, 0x05, 0x73, 0x66, 0x46, 0xbd, 0x21, 0xb4, 0x2f, 0x7d, - 0xe2, 0x98, 0x18, 0xe5, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0xed, 0x91, 0x32, 0x6f, 0x6d, 0xe4, 0xa6, - 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x11, 0x1c, 0x4a, 0x98, 0xda, 0x2a, 0x14, - 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x2f, 0x02, 0xc4, 0x99, 0xe5, 0xe4, 0xad, 0xa2, 0xd6, - 0x87, 0x8d, 0x8c, 0x77, 0x06, 0x16, 0x79, 0x0e, 0xa6, 0x98, 0xea, 0x43, 0x9b, 0x32, 0x0c, 0x5b, - 0x9f, 0xe3, 0xaf, 0xf3, 0x52, 0x94, 0x50, 0xf2, 0x2a, 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0x57, - 0x5f, 0x8c, 0xb5, 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, - 0xd1, 0xb9, 0xd2, 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, - 0x4a, 0xc1, 0xb1, 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x21, 0x3a, 0x2b, 0x9c, 0x6d, 0x07, 0x5c, 0x65, - 0x7e, 0xd5, 0x3c, 0x6b, 0xe5, 0x38, 0x87, 0xc4, 0xa8, 0x1d, 0xfe, 0xb0, 0x35, 0xde, 0xb1, 0xe8, - 0x0b, 0x30, 0x9f, 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, 0xda, 0x24, 0x5c, 0xb8, 0xd5, 0x72, 0xbd, - 0x74, 0xb6, 0xa8, 0xac, 0x64, 0xdb, 0xd6, 0xa8, 0xc9, 0xb6, 0xe3, 0x78, 0x2e, 0x99, 0xcd, 0x3c, - 0x3b, 0x9e, 0x4b, 0xa5, 0x3a, 0x4f, 0xe2, 0x92, 0x3f, 0xb3, 0xe0, 0x69, 0xa7, 0x29, 0xce, 0x05, - 0x4e, 0x5b, 0x96, 0x1a, 0x39, 0x6e, 0xe5, 0x8c, 0x0e, 0xc7, 0xdc, 0xe5, 0xfb, 0x3f, 0x7e, 0xa5, - 0x72, 0x02, 0x57, 0xd1, 0xe3, 0x3f, 0x26, 0xbf, 0xe0, 0xe9, 0x93, 0x50, 0xf1, 0x44, 0xf1, 0xc9, - 0xdf, 0x86, 0x85, 0xc4, 0x07, 0x4b, 0x4b, 0x78, 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xe3, - 0x2e, 0xbf, 0x05, 0x1f, 0x7d, 0xa4, 0x9c, 0x23, 0x0d, 0xb6, 0xaf, 0x58, 0x50, 0x12, 0x76, 0x6d, - 0xa4, 0xbb, 0x29, 0x27, 0xcc, 0xd4, 0xc9, 0xbb, 0x52, 0xdb, 0xc8, 0x70, 0xc2, 0x64, 0x6b, 0xf9, - 0xbe, 0xeb, 0x35, 0x65, 0x2f, 0xeb, 0xb5, 0xfc, 0x4d, 0xd7, 0x6b, 0x22, 0x87, 0xe8, 0xd5, 0xbe, - 0x30, 0xd0, 0xde, 0xf4, 0xab, 0x16, 0xcc, 0xf3, 0x18, 0xd8, 0xf8, 0x4c, 0xf8, 0x8a, 0x76, 0x36, - 0x12, 0x62, 0x5c, 0x49, 0x3a, 0x1b, 0x3d, 0x3c, 0x2a, 0xcf, 0x8a, 0xa8, 0xd9, 0xa4, 0xef, 0xd1, - 0xe7, 0xa4, 0x21, 0x89, 0xbb, 0x44, 0x4d, 0x8c, 0x6c, 0xe7, 0xd0, 0x86, 0xd6, 0xba, 0x22, 0x82, - 0x31, 0x3d, 0xfb, 0x3d, 0x98, 0x33, 0x83, 0x59, 0xc8, 0x2b, 0x30, 0xdb, 0x75, 0xbd, 0x56, 0x32, - 0xe8, 0x51, 0x1b, 0xdb, 0x6b, 0x31, 0x08, 0x4d, 0x3c, 0x5e, 0xcd, 0x8f, 0xab, 0xa5, 0x6c, 0xf4, - 0x35, 0xdf, 0xac, 0x16, 0xff, 0xe1, 0x39, 0xb6, 0x33, 0x82, 0xa6, 0x72, 0xcf, 0xb1, 0x9d, 0xc1, - 0xe3, 0x87, 0x97, 0x63, 0x3b, 0x4b, 0x98, 0xff, 0xb7, 0x72, 0x6c, 0xff, 0x14, 0x8c, 0x9a, 0x5c, - 0x91, 0xed, 0x77, 0xf7, 0xcd, 0xc0, 0x74, 0xdd, 0xe2, 0x32, 0x32, 0x5d, 0x42, 0xed, 0x1d, 0x58, - 0x4c, 0x9f, 0x7a, 0x73, 0x77, 0x28, 0xf8, 0x38, 0x8c, 0x98, 0x0e, 0xd1, 0xbe, 0x06, 0x04, 0xfd, - 0x76, 0x7b, 0xc7, 0x69, 0xec, 0xdf, 0x75, 0xbd, 0xa6, 0x7f, 0x9f, 0xcf, 0x95, 0x55, 0x28, 0x05, - 0x32, 0x26, 0x2e, 0x94, 0x9f, 0xa5, 0x27, 0x9b, 0x0a, 0x96, 0x0b, 0x31, 0xc6, 0xb1, 0xff, 0x68, - 0x02, 0xa6, 0x65, 0x00, 0xe7, 0x63, 0xf0, 0xcd, 0xde, 0x4f, 0x5c, 0xda, 0x6d, 0xe4, 0x12, 0x77, - 0x3a, 0xd0, 0x31, 0x3b, 0x4c, 0x39, 0x66, 0xbf, 0x99, 0x0f, 0xbb, 0x93, 0xbd, 0xb2, 0xff, 0xb0, - 0x08, 0x0b, 0xa9, 0x80, 0x58, 0xa6, 0x30, 0xf5, 0x39, 0x23, 0xde, 0xc9, 0x35, 0xe6, 0x56, 0x07, - 0x1b, 0x9c, 0xec, 0x97, 0x18, 0x26, 0x92, 0xd7, 0xde, 0xce, 0x2d, 0x2f, 0xff, 0x8f, 0xf2, 0xd8, - 0x8e, 0xe8, 0x67, 0x47, 0xbe, 0x6d, 0xc1, 0x05, 0xa7, 0xff, 0x61, 0x03, 0x69, 0xd8, 0xb9, 0x9d, - 0xfb, 0x8b, 0x09, 0xd5, 0xa7, 0xa4, 0x90, 0x59, 0xef, 0x47, 0x60, 0x96, 0x28, 0xf6, 0x7f, 0xb1, - 0xe0, 0xc9, 0x81, 0xa1, 0xdd, 0x3c, 0x33, 0x50, 0x90, 0x84, 0xca, 0x35, 0x23, 0xe7, 0x04, 0x16, - 0xfa, 0x92, 0x2f, 0x9d, 0xcc, 0x25, 0xcd, 0x9e, 0xbc, 0x0c, 0x73, 0x5c, 0x89, 0x60, 0xab, 0x67, - 0x44, 0xbb, 0xf2, 0x8e, 0x82, 0x5b, 0xab, 0xeb, 0x46, 0x39, 0x26, 0xb0, 0xec, 0x6f, 0x5b, 0xb0, - 0x34, 0x28, 0x4f, 0xcc, 0x10, 0x27, 0xe8, 0xbf, 0x95, 0xf2, 0x6f, 0x2f, 0xf7, 0xf9, 0xb7, 0xa7, - 0xce, 0xd0, 0xca, 0x95, 0xdd, 0x38, 0xbe, 0x16, 0x1e, 0xe1, 0xbe, 0xfd, 0x0d, 0x0b, 0x2e, 0x0f, - 0x98, 0xf0, 0x7d, 0x71, 0x0e, 0xd6, 0xa9, 0xe3, 0x1c, 0x26, 0x86, 0x8d, 0x73, 0xb0, 0xff, 0xb8, - 0x00, 0x8b, 0x52, 0x9e, 0x58, 0x93, 0x7c, 0x35, 0x11, 0x25, 0xf0, 0x63, 0xa9, 0x28, 0x81, 0x8b, - 0x69, 0xfc, 0x1f, 0x85, 0x08, 0x7c, 0xb8, 0x42, 0x04, 0xfe, 0x6a, 0x02, 0x2e, 0x65, 0xa6, 0xaf, - 0x21, 0x5f, 0xcb, 0xd8, 0xbd, 0xee, 0xe6, 0x9c, 0x27, 0x67, 0xc8, 0xfd, 0x6b, 0x5c, 0xbf, 0xfa, - 0x5f, 0x36, 0xfd, 0xd9, 0xc5, 0x6e, 0xb4, 0x7b, 0x06, 0x19, 0x7f, 0x46, 0x74, 0x6d, 0xb7, 0x7f, - 0xa1, 0x00, 0xcf, 0x0f, 0x4b, 0xe8, 0x43, 0x1a, 0xfa, 0x14, 0x26, 0x42, 0x9f, 0x1e, 0x93, 0x66, - 0x71, 0x26, 0x51, 0x50, 0xff, 0x7c, 0x52, 0x6f, 0x7b, 0xfd, 0xe3, 0x73, 0xa8, 0x0b, 0xed, 0x69, - 0xa6, 0x7d, 0xaa, 0x14, 0xb8, 0xf1, 0x52, 0x38, 0x5d, 0x17, 0xc5, 0x0f, 0x8f, 0xca, 0xe7, 0xe3, - 0x24, 0x0a, 0xb2, 0x10, 0x55, 0x25, 0xf2, 0x3c, 0xcc, 0x04, 0x02, 0xaa, 0x82, 0x3d, 0xa4, 0x57, - 0x80, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x32, 0xd4, 0xf5, 0xc9, 0xb3, 0xca, 0x15, 0x72, 0x92, 0xb3, - 0xc3, 0x3b, 0x30, 0x13, 0xaa, 0xf4, 0xb4, 0x42, 0x71, 0x79, 0x69, 0xc8, 0x18, 0x22, 0x76, 0x48, - 0x54, 0xb9, 0x6a, 0xc5, 0xf7, 0xe9, 0x4c, 0xb6, 0x9a, 0x24, 0xb1, 0xf5, 0xf9, 0x4c, 0x18, 0x63, - 0xa1, 0xff, 0x6c, 0x46, 0x22, 0x98, 0x96, 0x2f, 0xf2, 0xc9, 0x5b, 0xa2, 0xad, 0x9c, 0xe2, 0x05, - 0xa4, 0x37, 0x29, 0xbf, 0x8b, 0x53, 0x76, 0x02, 0xc5, 0xca, 0xfe, 0x9e, 0x05, 0xb3, 0x72, 0x8c, - 0x3c, 0x86, 0x60, 0xaa, 0x7b, 0xc9, 0x60, 0xaa, 0x6b, 0xb9, 0xac, 0x58, 0x03, 0x22, 0xa9, 0xee, - 0xc1, 0x9c, 0x99, 0x37, 0x8d, 0x7c, 0xd6, 0x58, 0x71, 0xad, 0x71, 0x32, 0x11, 0xa9, 0x35, 0x39, - 0x5e, 0x8d, 0xed, 0xdf, 0x2c, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x27, 0x8e, 0x7c, - 0x73, 0xe0, 0x4d, 0xe4, 0x3f, 0xf0, 0x6e, 0xc3, 0x8c, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xac, 0xe9, - 0x5e, 0xca, 0x34, 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0xaa, 0xfb, 0x50, 0x2f, 0xd7, 0x9a, - 0x0c, 0x79, 0x17, 0x66, 0xef, 0xfb, 0xc1, 0x7e, 0xdb, 0x77, 0x78, 0x72, 0x6c, 0xc8, 0xe3, 0x46, - 0x53, 0x1b, 0x14, 0x85, 0x8f, 0xff, 0xdd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0x16, 0x3a, 0xae, - 0x87, 0xd4, 0x69, 0xea, 0x98, 0xa9, 0x49, 0x91, 0x8f, 0x57, 0xa9, 0xd6, 0x5b, 0x49, 0x30, 0xa6, - 0xf1, 0xc9, 0xd7, 0x2d, 0x98, 0x0f, 0x12, 0xd6, 0x06, 0x99, 0x74, 0xb3, 0x36, 0xfe, 0x60, 0x4c, - 0x5a, 0x30, 0x84, 0x93, 0x7b, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0x17, 0x61, 0x26, 0x94, 0x49, 0xd1, - 0xf2, 0xb9, 0x0a, 0xd7, 0x67, 0x7b, 0x41, 0x34, 0xee, 0x4a, 0x55, 0x82, 0x9a, 0x21, 0xd9, 0x84, - 0x8b, 0xca, 0x7c, 0x92, 0x78, 0xc0, 0x68, 0x2a, 0xce, 0xa1, 0x83, 0x19, 0x70, 0xcc, 0xac, 0xc5, - 0x54, 0x39, 0x9e, 0x8f, 0x50, 0xdc, 0x20, 0x19, 0x97, 0x2e, 0x7c, 0xfe, 0x35, 0x51, 0x42, 0x4f, - 0x0a, 0x09, 0x9c, 0x19, 0x23, 0x24, 0xb0, 0x0e, 0x97, 0xd2, 0x20, 0x9e, 0x1c, 0x89, 0xe7, 0x63, - 0x32, 0xb6, 0xd0, 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x14, 0x50, 0x7e, 0xc8, 0xaa, - 0x28, 0xe7, 0x9b, 0x91, 0xdd, 0x0c, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, 0x21, - 0xf7, 0x76, 0x8e, 0x2f, 0x67, 0xca, 0xbe, 0x1f, 0x90, 0xb4, 0xcc, 0xfe, 0xfe, 0x3c, 0x9c, 0x4b, - 0xd8, 0x80, 0xc8, 0xb3, 0x50, 0xe4, 0xd9, 0xa2, 0xf8, 0x6a, 0x35, 0x13, 0xaf, 0xa8, 0xa2, 0x71, - 0x04, 0x8c, 0xfc, 0xa2, 0x05, 0x0b, 0xdd, 0x84, 0xd1, 0x5d, 0x2d, 0xe4, 0x63, 0xde, 0xb7, 0x27, - 0x2d, 0xf9, 0x46, 0x6e, 0xf9, 0x24, 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, 0xf4, 0xd5, 0x6d, 0xd3, - 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, 0x58, 0x4b, 0x82, 0x31, 0x8d, 0xcf, 0x7a, 0x98, 0x7f, 0xdd, - 0x38, 0x6f, 0xb3, 0x55, 0x14, 0x01, 0x8c, 0x69, 0x91, 0xd7, 0x61, 0x5e, 0x26, 0x46, 0xad, 0xf9, - 0xcd, 0x1b, 0x4e, 0xb8, 0x27, 0x4f, 0x38, 0xfa, 0x44, 0xb6, 0x96, 0x80, 0x62, 0x0a, 0x9b, 0x7f, - 0x5b, 0x9c, 0x7d, 0x96, 0x13, 0x98, 0x4a, 0xa6, 0xde, 0x5f, 0x4b, 0x82, 0x31, 0x8d, 0x4f, 0x5e, - 0x30, 0xb6, 0x21, 0x71, 0xab, 0xab, 0x57, 0x83, 0x8c, 0xad, 0xa8, 0x02, 0x0b, 0x3d, 0x7e, 0x20, - 0x6c, 0x2a, 0xa0, 0x9c, 0x8f, 0x9a, 0xe1, 0x9d, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x35, 0x38, 0x17, - 0xb0, 0xc5, 0x56, 0x13, 0x10, 0x57, 0xbd, 0xfa, 0x26, 0x0f, 0x4d, 0x20, 0x26, 0x71, 0xc9, 0x1b, - 0x70, 0x3e, 0xce, 0x23, 0xa8, 0x08, 0x88, 0xbb, 0x5f, 0x9d, 0xd4, 0xaa, 0x92, 0x46, 0xc0, 0xfe, - 0x3a, 0xe4, 0xef, 0xc2, 0xa2, 0xd1, 0x12, 0x1b, 0x5e, 0x93, 0x3e, 0x90, 0xb9, 0xde, 0xf8, 0x9b, - 0x2a, 0x6b, 0x29, 0x18, 0xf6, 0x61, 0x93, 0x4f, 0xc1, 0x7c, 0xc3, 0x6f, 0xb7, 0xf9, 0x1a, 0x27, - 0xd2, 0xbe, 0x8b, 0xa4, 0x6e, 0x22, 0xfd, 0x5d, 0x02, 0x82, 0x29, 0x4c, 0x72, 0x13, 0x88, 0xbf, - 0xc3, 0xd4, 0x2b, 0xda, 0x7c, 0x43, 0x3c, 0xd2, 0xcd, 0x34, 0x8e, 0x73, 0xc9, 0x48, 0x81, 0xb7, - 0xfa, 0x30, 0x30, 0xa3, 0x16, 0xcf, 0x89, 0x65, 0x44, 0x56, 0xce, 0xe7, 0xf1, 0x4e, 0x59, 0xda, - 0x7c, 0xf1, 0xc8, 0xb0, 0xca, 0x00, 0xa6, 0x44, 0xe0, 0x46, 0x3e, 0xd9, 0xdd, 0xcc, 0x0c, 0xd0, - 0xf1, 0x1e, 0x21, 0x4a, 0x51, 0x72, 0x22, 0x3f, 0x07, 0xa5, 0x1d, 0xf5, 0x1c, 0x00, 0x4f, 0xe9, - 0x36, 0xf6, 0xbe, 0x98, 0x7a, 0xd9, 0x22, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x2c, 0xc9, 0x73, 0x30, - 0x7b, 0xa3, 0x56, 0xd1, 0xa3, 0xf0, 0x3c, 0xef, 0xfd, 0x49, 0x56, 0x05, 0x4d, 0x00, 0x9b, 0x61, - 0x5a, 0x7d, 0x23, 0xc9, 0x17, 0x36, 0x32, 0xb4, 0x31, 0x86, 0xcd, 0xef, 0x67, 0xb1, 0xbe, 0x74, - 0x21, 0x85, 0x2d, 0xcb, 0x51, 0x63, 0x90, 0x77, 0x60, 0x56, 0xee, 0x17, 0x7c, 0x6d, 0xba, 0x78, - 0xba, 0xa8, 0x5d, 0x8c, 0x49, 0xa0, 0x49, 0x8f, 0x5f, 0x2a, 0xf2, 0x2c, 0xe9, 0xf4, 0x7a, 0xaf, - 0xdd, 0x5e, 0xba, 0xc4, 0xd7, 0xcd, 0xf8, 0x52, 0x31, 0x06, 0xa1, 0x89, 0x47, 0x5e, 0x52, 0x7e, - 0x36, 0x1f, 0x49, 0xdc, 0xb2, 0x6a, 0x3f, 0x1b, 0xad, 0x74, 0x0f, 0x70, 0xec, 0xbf, 0xfc, 0x08, - 0x07, 0x97, 0x1d, 0x58, 0x56, 0x1a, 0x5f, 0xff, 0x24, 0x59, 0x5a, 0x4a, 0x98, 0x4a, 0x96, 0xef, - 0x0e, 0xc4, 0xc4, 0x13, 0xa8, 0x90, 0x1d, 0x28, 0x38, 0xed, 0x9d, 0xa5, 0x27, 0xf3, 0x50, 0x5d, - 0xf5, 0xa3, 0xfb, 0xc2, 0x19, 0xaf, 0xb2, 0x59, 0x45, 0x46, 0xdc, 0xfe, 0xf2, 0x84, 0xbe, 0x3d, - 0xd1, 0x59, 0x6f, 0xdf, 0x33, 0x47, 0xb5, 0x95, 0xc7, 0xa3, 0xd2, 0x7d, 0x6f, 0x66, 0x88, 0x0d, - 0x29, 0x73, 0x4c, 0x77, 0xf5, 0x3c, 0xce, 0x25, 0x9f, 0x50, 0x32, 0xa3, 0xaf, 0x38, 0xd2, 0x26, - 0x67, 0xb1, 0xfd, 0x3b, 0xa0, 0x2d, 0x71, 0x29, 0xc7, 0x91, 0x00, 0x8a, 0x6e, 0x18, 0xb9, 0x7e, - 0x8e, 0x11, 0xa6, 0xa9, 0x54, 0xb8, 0xdc, 0x81, 0x9d, 0x03, 0x50, 0xb0, 0x62, 0x3c, 0xbd, 0x96, - 0xeb, 0x3d, 0x90, 0x9f, 0x7f, 0x3b, 0x77, 0x8f, 0x10, 0xc1, 0x93, 0x03, 0x50, 0xb0, 0x22, 0xf7, - 0xc4, 0x48, 0xcb, 0xe7, 0x01, 0xf1, 0xcd, 0x6a, 0x8a, 0x5f, 0x62, 0xc4, 0x31, 0x5e, 0x61, 0xc7, - 0x95, 0x3a, 0xcc, 0x98, 0xbc, 0xea, 0x5b, 0x1b, 0x59, 0xbc, 0xea, 0x5b, 0x1b, 0xc8, 0x98, 0x90, - 0xaf, 0x5a, 0x00, 0x8e, 0x7e, 0x20, 0x3f, 0x9f, 0x07, 0x66, 0x06, 0x3d, 0xb8, 0x2f, 0x7c, 0x20, - 0x63, 0x28, 0x1a, 0x9c, 0xc9, 0xbb, 0x30, 0xed, 0x88, 0xc7, 0xb4, 0xa4, 0x3b, 0x6f, 0x3e, 0x2f, - 0xc4, 0xa5, 0x24, 0xe0, 0xb6, 0x13, 0x09, 0x42, 0xc5, 0x90, 0xf1, 0x8e, 0x02, 0x87, 0xee, 0xba, - 0xfb, 0xd2, 0x62, 0x53, 0x1f, 0x3b, 0xcb, 0x3d, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, - 0x8f, 0x1b, 0x3b, 0x9e, 0xa3, 0x83, 0xb4, 0xf2, 0x09, 0xe5, 0x33, 0xc3, 0xbe, 0x8c, 0xc7, 0x8d, - 0x4d, 0x46, 0x98, 0xe4, 0x4b, 0x0e, 0x60, 0xca, 0xe1, 0xcf, 0xfc, 0xc9, 0xf3, 0x11, 0xe6, 0xf1, - 0x64, 0x60, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x1f, 0x13, 0x94, 0xdc, 0xc8, 0xaf, 0x59, 0x30, 0x2d, - 0x3c, 0x4d, 0x99, 0x96, 0xc8, 0xbe, 0xfd, 0x0b, 0x67, 0x90, 0x52, 0x5b, 0x7a, 0xc1, 0x4a, 0xbf, - 0x91, 0x9f, 0xd4, 0x6e, 0x74, 0xa2, 0xf4, 0x44, 0x3f, 0x58, 0x25, 0xdd, 0xf2, 0xa7, 0x60, 0xce, - 0xa4, 0x32, 0x92, 0x27, 0xec, 0x5f, 0x14, 0x00, 0x78, 0x43, 0x8b, 0xb4, 0x0c, 0x1d, 0x9e, 0xff, - 0x73, 0xcf, 0x6f, 0xe6, 0xf3, 0x3e, 0xa3, 0x99, 0x5d, 0x01, 0x64, 0xb2, 0xcf, 0x3d, 0xbf, 0x89, - 0x92, 0x09, 0x69, 0xc1, 0x64, 0xd7, 0x89, 0xf6, 0xf2, 0x4f, 0xe5, 0x30, 0x23, 0xe2, 0x13, 0xa3, - 0x3d, 0xe4, 0x0c, 0xc8, 0xfb, 0x16, 0x4c, 0x8b, 0x64, 0x0e, 0xea, 0x36, 0x63, 0x6c, 0xaf, 0x02, - 0xd5, 0x66, 0x2b, 0x22, 0x63, 0x84, 0xec, 0x41, 0xad, 0x78, 0xc8, 0x52, 0x54, 0x6c, 0x97, 0x3f, - 0xb0, 0x60, 0xce, 0x44, 0xcd, 0xe8, 0xa6, 0x9f, 0x31, 0xbb, 0x29, 0xcf, 0xf6, 0x30, 0x7b, 0xfc, - 0xbf, 0x5b, 0x60, 0x3c, 0xb8, 0x1d, 0x3b, 0xfc, 0x5a, 0x43, 0x3b, 0xfc, 0x4e, 0x8c, 0xe8, 0xf0, - 0x5b, 0x18, 0xc9, 0xe1, 0x77, 0x72, 0x74, 0x87, 0xdf, 0xe2, 0x60, 0x87, 0x5f, 0xfb, 0x9b, 0x16, - 0x9c, 0xef, 0xdb, 0x6d, 0x98, 0x72, 0x1a, 0xf8, 0x7e, 0x34, 0xc0, 0x51, 0x0e, 0x63, 0x10, 0x9a, - 0x78, 0x64, 0x1d, 0x16, 0x65, 0xb6, 0xfb, 0x7a, 0xb7, 0xed, 0x66, 0xa6, 0xd9, 0xd8, 0x4e, 0xc1, - 0xb1, 0xaf, 0x86, 0xfd, 0x3b, 0x16, 0xcc, 0x1a, 0xc1, 0xb9, 0xec, 0x3b, 0x78, 0x10, 0xb3, 0x14, - 0x23, 0x4e, 0xf4, 0xcf, 0x6f, 0x8f, 0x04, 0x4c, 0x5c, 0x64, 0xb6, 0x8c, 0x5c, 0xc8, 0xf1, 0x45, - 0x26, 0x2b, 0x45, 0x09, 0x15, 0x59, 0x6e, 0x69, 0x97, 0x37, 0x7a, 0xc1, 0xcc, 0x72, 0x4b, 0xbb, - 0xc8, 0x21, 0x9c, 0x1d, 0xd3, 0xd2, 0xa5, 0x2f, 0xb8, 0xf1, 0xae, 0x80, 0x13, 0x44, 0x28, 0x60, - 0xe4, 0x0a, 0x14, 0xa8, 0xd7, 0x94, 0x26, 0x05, 0xfd, 0xf2, 0xdf, 0x35, 0xaf, 0x89, 0xac, 0xdc, - 0x7e, 0x0b, 0xe6, 0xea, 0xb4, 0x11, 0xd0, 0xe8, 0x4d, 0x7a, 0x38, 0xf4, 0x53, 0x82, 0x6c, 0xb4, - 0xa7, 0x9e, 0x12, 0x64, 0xd5, 0x59, 0xb9, 0xfd, 0x2f, 0x2d, 0x48, 0x3d, 0x7e, 0x61, 0x5c, 0x6a, - 0x58, 0x03, 0x2f, 0x35, 0x4c, 0x43, 0xf8, 0xc4, 0x89, 0x86, 0xf0, 0x9b, 0x40, 0x3a, 0x6c, 0x2a, - 0x24, 0x9e, 0x7a, 0x91, 0xd6, 0x9c, 0x38, 0x15, 0x40, 0x1f, 0x06, 0x66, 0xd4, 0xb2, 0xff, 0x85, - 0x10, 0xd6, 0x7c, 0x0e, 0xe3, 0xd1, 0x0d, 0xd0, 0x83, 0x22, 0x27, 0x25, 0x4d, 0x5a, 0x63, 0x9a, - 0x83, 0xfb, 0x53, 0xea, 0xc4, 0x1d, 0x29, 0xa7, 0x3c, 0xe7, 0x66, 0xff, 0xb1, 0x90, 0xd5, 0x78, - 0x2f, 0x63, 0x08, 0x59, 0x3b, 0x49, 0x59, 0x6f, 0xe4, 0xb5, 0x56, 0x66, 0xcb, 0x48, 0x56, 0x00, - 0xba, 0x34, 0x68, 0x50, 0x2f, 0x52, 0x21, 0x0a, 0x45, 0x19, 0x2c, 0xa7, 0x4b, 0xd1, 0xc0, 0xb0, - 0x7f, 0xc5, 0x82, 0xc5, 0x74, 0x24, 0x4b, 0xde, 0x7e, 0x86, 0x89, 0x70, 0xdb, 0xc2, 0xe8, 0xe1, - 0xb6, 0xf6, 0xfb, 0x4c, 0xc8, 0xc8, 0x6d, 0xec, 0xbb, 0x9e, 0x88, 0x50, 0xdd, 0x75, 0x5b, 0x4c, - 0x48, 0x2a, 0x1f, 0xe7, 0x13, 0x96, 0x50, 0x2d, 0xa4, 0x7a, 0x93, 0x4f, 0xc1, 0x49, 0x05, 0x16, - 0xd4, 0xfd, 0x8f, 0x32, 0x5f, 0x8b, 0xc8, 0x7a, 0x6d, 0x2e, 0x5b, 0x4f, 0x82, 0x31, 0x8d, 0x6f, - 0x7f, 0x09, 0x66, 0x8d, 0x4d, 0x80, 0xaf, 0x97, 0x0f, 0x9c, 0x46, 0x94, 0x5e, 0x67, 0xae, 0xb1, - 0x42, 0x14, 0x30, 0x6e, 0x65, 0x17, 0x8e, 0xf6, 0xa9, 0x75, 0x46, 0xba, 0xd7, 0x4b, 0x28, 0x23, - 0x16, 0xd0, 0x16, 0x7d, 0xa0, 0x52, 0x43, 0x2b, 0x62, 0xc8, 0x0a, 0x51, 0xc0, 0xec, 0x17, 0x60, - 0x46, 0xe5, 0x3f, 0xe1, 0x49, 0x04, 0x94, 0x05, 0xd8, 0x4c, 0x22, 0xe0, 0x07, 0x11, 0x72, 0x88, - 0xfd, 0x36, 0xcc, 0xa8, 0x34, 0x2d, 0x8f, 0xc6, 0x66, 0x53, 0x3f, 0xf4, 0xdc, 0x1b, 0x7e, 0x18, - 0xa9, 0xdc, 0x32, 0xe2, 0x92, 0xea, 0xd6, 0x06, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x82, 0x85, 0xd4, - 0x65, 0xe5, 0x10, 0x19, 0x07, 0x7e, 0xbf, 0x00, 0x73, 0x89, 0xf7, 0xf3, 0x1f, 0x3d, 0x6b, 0x86, - 0x5f, 0x8c, 0x32, 0xee, 0x99, 0x0a, 0x23, 0xde, 0x33, 0x99, 0x17, 0x7b, 0x93, 0x67, 0x7b, 0xb1, - 0x57, 0xcc, 0xe7, 0x62, 0xcf, 0xb8, 0x80, 0x9e, 0x7a, 0x7c, 0x17, 0xd0, 0xbf, 0x5d, 0x84, 0xf9, - 0x64, 0x0a, 0xbb, 0x21, 0x7a, 0xf2, 0x85, 0xbe, 0x9e, 0x1c, 0xd1, 0xb0, 0x5d, 0x18, 0xd7, 0xb0, - 0x3d, 0x39, 0xae, 0x61, 0xbb, 0x78, 0x0a, 0xc3, 0x76, 0xbf, 0x59, 0x7a, 0x6a, 0x68, 0xb3, 0xf4, - 0xa7, 0xb5, 0x6b, 0xda, 0x74, 0xc2, 0x97, 0x23, 0x76, 0x4d, 0x23, 0xc9, 0x6e, 0x58, 0xf3, 0x9b, - 0x99, 0x2e, 0x7e, 0x33, 0x8f, 0x30, 0xe0, 0x05, 0x99, 0x9e, 0x64, 0xa3, 0xdf, 0x9d, 0x7d, 0x64, - 0x04, 0x2f, 0xb2, 0x57, 0x60, 0x56, 0x8e, 0x27, 0xae, 0xf2, 0x41, 0x52, 0x5d, 0xac, 0xc7, 0x20, - 0x34, 0xf1, 0xf8, 0xeb, 0xc6, 0xc9, 0xc7, 0x9f, 0xf9, 0x3d, 0x81, 0xf9, 0xba, 0x71, 0xea, 0xb1, - 0xe8, 0x34, 0xbe, 0xfd, 0x45, 0xb8, 0x94, 0x79, 0x6c, 0xe7, 0x76, 0x4c, 0xae, 0x8d, 0xd0, 0xa6, - 0x44, 0x30, 0xc4, 0x48, 0x65, 0x45, 0x5f, 0xbe, 0x3b, 0x10, 0x13, 0x4f, 0xa0, 0x62, 0xff, 0x56, - 0x01, 0xe6, 0x93, 0x4f, 0xe3, 0x91, 0xfb, 0xda, 0xc8, 0x97, 0x8b, 0x7d, 0x51, 0x90, 0x35, 0xd2, - 0xa2, 0x0d, 0xb4, 0xd8, 0xdf, 0xe7, 0xe3, 0x6b, 0x47, 0xe7, 0x68, 0x3b, 0x3b, 0xc6, 0xd2, 0x54, - 0x2e, 0xd9, 0xf1, 0xd7, 0xef, 0xe2, 0x08, 0x2a, 0x79, 0x7a, 0xcc, 0x9d, 0x7b, 0x1c, 0xd4, 0xa4, - 0x59, 0xa1, 0xc1, 0x96, 0xed, 0x2d, 0x07, 0x34, 0x70, 0x77, 0x5d, 0xfd, 0xac, 0x2f, 0x5f, 0xb9, - 0xdf, 0x96, 0x65, 0xa8, 0xa1, 0xf6, 0xfb, 0x13, 0x10, 0x3f, 0x79, 0xce, 0xdf, 0x8f, 0x0a, 0x0d, - 0x4d, 0x5d, 0x76, 0xdb, 0xcd, 0x71, 0x1f, 0x69, 0x8b, 0x29, 0x4a, 0xb7, 0x61, 0xa3, 0x04, 0x13, - 0x1c, 0x7f, 0x08, 0x4f, 0x9d, 0x3b, 0xb0, 0x90, 0x8a, 0xd8, 0xcf, 0x3d, 0x0a, 0xe5, 0x07, 0x05, - 0x28, 0xe9, 0x9c, 0x07, 0xe4, 0x93, 0x09, 0xb3, 0x49, 0xa9, 0xfa, 0x51, 0xe3, 0x71, 0x93, 0x3d, - 0xbf, 0xf9, 0xf0, 0xa8, 0xbc, 0xa0, 0x91, 0x53, 0x26, 0x90, 0x2b, 0x50, 0xe8, 0x05, 0xed, 0xf4, - 0xb9, 0xe8, 0x0e, 0x6e, 0x22, 0x2b, 0x27, 0x0f, 0xd2, 0x76, 0x8b, 0xad, 0x9c, 0xf2, 0x34, 0x88, - 0x03, 0xc4, 0x60, 0x7b, 0x05, 0xdb, 0x25, 0x77, 0xfc, 0xe6, 0x61, 0xfa, 0x31, 0x94, 0xaa, 0xdf, - 0x3c, 0x44, 0x0e, 0x21, 0xaf, 0xc3, 0x7c, 0xe4, 0x76, 0xa8, 0xdf, 0x8b, 0xcc, 0x27, 0xa2, 0x0b, - 0xf1, 0x0d, 0xf4, 0x76, 0x02, 0x8a, 0x29, 0x6c, 0xb6, 0xcb, 0xde, 0x0b, 0x7d, 0x8f, 0x27, 0x2b, - 0x9d, 0x4a, 0x5e, 0x57, 0xdd, 0xac, 0xbf, 0x75, 0x8b, 0x9b, 0x6f, 0x34, 0x06, 0xc3, 0x76, 0x79, - 0x18, 0x6e, 0x40, 0xa5, 0x03, 0xc8, 0x62, 0xac, 0x8f, 0x8b, 0x72, 0xd4, 0x18, 0x64, 0x5d, 0xd0, - 0x66, 0xd2, 0xf2, 0x1d, 0x65, 0xae, 0xfa, 0xbc, 0xa2, 0xcb, 0xca, 0x1e, 0x1e, 0x9d, 0x60, 0x58, - 0xd3, 0x35, 0xed, 0x3b, 0xb0, 0x90, 0x6a, 0x30, 0x75, 0x8e, 0xb5, 0xb2, 0xcf, 0xb1, 0xc3, 0xbd, - 0x5f, 0xf2, 0xaf, 0x2d, 0x38, 0xdf, 0xb7, 0x04, 0x0c, 0x1b, 0x64, 0x95, 0xde, 0x8c, 0x26, 0x4e, - 0xbf, 0x19, 0x15, 0x46, 0xdb, 0x8c, 0xaa, 0x3b, 0xdf, 0xf9, 0xfe, 0xd5, 0x27, 0xbe, 0xfb, 0xfd, - 0xab, 0x4f, 0xfc, 0xc9, 0xf7, 0xaf, 0x3e, 0xf1, 0xfe, 0xf1, 0x55, 0xeb, 0x3b, 0xc7, 0x57, 0xad, - 0xef, 0x1e, 0x5f, 0xb5, 0xfe, 0xe4, 0xf8, 0xaa, 0xf5, 0x9f, 0x8f, 0xaf, 0x5a, 0xdf, 0xfc, 0xc1, - 0xd5, 0x27, 0x3e, 0xfb, 0xe9, 0x78, 0x80, 0xae, 0xaa, 0x01, 0xca, 0x7f, 0x7c, 0x4c, 0x0d, 0xc7, - 0xd5, 0xee, 0x7e, 0x6b, 0x95, 0x0d, 0xd0, 0x55, 0x5d, 0xa2, 0x06, 0xe8, 0xff, 0x0d, 0x00, 0x00, - 0xff, 0xff, 0x07, 0x71, 0xea, 0xe7, 0x41, 0x9c, 0x00, 0x00, + 0x18, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xc8, 0x3b, 0xb2, 0x54, 0x5d, 0x90, 0x44, 0xa7, 0x37, + 0x44, 0x31, 0x2a, 0x38, 0x79, 0x05, 0x66, 0x43, 0x1a, 0x1c, 0xb8, 0x0d, 0x5a, 0xf3, 0x83, 0x88, + 0xb7, 0x74, 0xb1, 0x7a, 0x41, 0xa2, 0xcf, 0xd6, 0x63, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, + 0x91, 0x84, 0xf3, 0x86, 0x28, 0xc5, 0xd5, 0x30, 0x06, 0xa1, 0x89, 0x47, 0xbe, 0x65, 0xc1, 0x62, + 0x18, 0xb9, 0x8d, 0x7d, 0xd7, 0xa3, 0x61, 0xb8, 0xe6, 0x7b, 0xbb, 0x6e, 0x6b, 0xa9, 0xc8, 0x5b, + 0xf1, 0xd6, 0x78, 0xad, 0x58, 0x4f, 0x51, 0xad, 0x5e, 0x3c, 0x3e, 0x2a, 0x2f, 0xa6, 0x4b, 0xb1, + 0x8f, 0x3b, 0x59, 0x87, 0x45, 0xc7, 0xf3, 0xfc, 0xc8, 0x89, 0x5c, 0xdf, 0xab, 0x05, 0x74, 0xd7, + 0x7d, 0xb0, 0x34, 0xc9, 0x3f, 0x67, 0x49, 0x7e, 0xce, 0x62, 0x25, 0x05, 0xc7, 0xbe, 0x1a, 0xf6, + 0x3a, 0x2c, 0x55, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0xf5, 0xc6, 0xf3, 0x30, 0xd3, + 0x71, 0xba, 0x5d, 0xd7, 0x6b, 0xb1, 0xee, 0x28, 0x3c, 0x5f, 0xaa, 0xce, 0x1d, 0x1f, 0x95, 0x67, + 0xb6, 0x64, 0x19, 0x6a, 0xa8, 0xfd, 0x27, 0x13, 0x30, 0x5b, 0xf1, 0x9c, 0xf6, 0x61, 0xe8, 0x86, + 0xd8, 0xf3, 0xc8, 0x17, 0x61, 0x86, 0xad, 0x2e, 0x4d, 0x27, 0x72, 0xe4, 0x8c, 0xfc, 0xc4, 0x8a, + 0x98, 0xec, 0x2b, 0xe6, 0x64, 0x8f, 0xdb, 0x85, 0x61, 0xaf, 0x1c, 0x7c, 0x72, 0xe5, 0xad, 0x9d, + 0x7b, 0xb4, 0x11, 0x6d, 0xd1, 0xc8, 0xa9, 0x12, 0xf9, 0x15, 0x10, 0x97, 0xa1, 0xa6, 0x4a, 0x7c, + 0x98, 0x0c, 0xbb, 0xb4, 0x21, 0x67, 0xd8, 0xd6, 0x98, 0x23, 0x39, 0x16, 0xbd, 0xde, 0xa5, 0x8d, + 0xea, 0x9c, 0x64, 0x3d, 0xc9, 0xfe, 0x21, 0x67, 0x44, 0xee, 0xc3, 0x54, 0xc8, 0xd7, 0x1c, 0x39, + 0x79, 0xde, 0xca, 0x8f, 0x25, 0x27, 0x5b, 0x9d, 0x97, 0x4c, 0xa7, 0xc4, 0x7f, 0x94, 0xec, 0xec, + 0xff, 0x64, 0xc1, 0x05, 0x03, 0xbb, 0x12, 0xb4, 0x7a, 0x1d, 0xea, 0x45, 0xe4, 0x19, 0x98, 0xf4, + 0x9c, 0x0e, 0x95, 0x13, 0x45, 0x8b, 0x7c, 0xcb, 0xe9, 0x50, 0xe4, 0x10, 0xf2, 0x2c, 0x14, 0x0f, + 0x9c, 0x76, 0x8f, 0xf2, 0x46, 0x2a, 0x55, 0xcf, 0x49, 0x94, 0xe2, 0xdb, 0xac, 0x10, 0x05, 0x8c, + 0xbc, 0x07, 0x25, 0xfe, 0xe3, 0x7a, 0xe0, 0x77, 0x72, 0xfa, 0x34, 0x29, 0xe1, 0xdb, 0x8a, 0x6c, + 0xf5, 0xdc, 0xf1, 0x51, 0xb9, 0xa4, 0xff, 0x62, 0xcc, 0xd0, 0xfe, 0x33, 0x0b, 0x16, 0x8c, 0x8f, + 0xdb, 0x74, 0xc3, 0x88, 0x7c, 0xa1, 0x6f, 0xf0, 0xac, 0x0c, 0x37, 0x78, 0x58, 0x6d, 0x3e, 0x74, + 0x16, 0xe5, 0x97, 0xce, 0xa8, 0x12, 0x63, 0xe0, 0x78, 0x50, 0x74, 0x23, 0xda, 0x09, 0x97, 0x26, + 0x9e, 0x29, 0x3c, 0x3f, 0xfb, 0xe2, 0x46, 0x6e, 0xdd, 0x18, 0xb7, 0xef, 0x06, 0xa3, 0x8f, 0x82, + 0x8d, 0xfd, 0xaf, 0x0a, 0x89, 0xee, 0xdb, 0x52, 0x72, 0x7c, 0x60, 0xc1, 0x54, 0xdb, 0xd9, 0xa1, + 0x6d, 0x31, 0xb7, 0x66, 0x5f, 0x7c, 0x27, 0x37, 0x49, 0x14, 0x8f, 0x95, 0x4d, 0x4e, 0xff, 0x9a, + 0x17, 0x05, 0x87, 0xf1, 0xf0, 0x12, 0x85, 0x28, 0x99, 0x93, 0x7f, 0x6c, 0xc1, 0x6c, 0xbc, 0x2a, + 0xa8, 0x66, 0xd9, 0xc9, 0x5f, 0x98, 0x78, 0x31, 0x92, 0x12, 0xe9, 0x55, 0xd7, 0x80, 0xa0, 0x29, + 0xcb, 0xf2, 0xa7, 0x60, 0xd6, 0xf8, 0x04, 0xb2, 0x08, 0x85, 0x7d, 0x7a, 0x28, 0x06, 0x3c, 0xb2, + 0x9f, 0xe4, 0x62, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0xe9, 0x89, 0x57, 0xad, 0xe5, 0xd7, 0x61, 0x31, + 0xcd, 0x70, 0x94, 0xfa, 0xf6, 0x6f, 0x4e, 0x26, 0x06, 0x26, 0x5b, 0x08, 0x88, 0x0f, 0xd3, 0x1d, + 0x1a, 0x05, 0x6e, 0x43, 0x75, 0xd9, 0xfa, 0x78, 0xad, 0xb4, 0xc5, 0x89, 0xc5, 0x7b, 0x9c, 0xf8, + 0x1f, 0xa2, 0xe2, 0x42, 0xf6, 0x60, 0xd2, 0x09, 0x5a, 0xaa, 0x4f, 0xae, 0xe7, 0x33, 0x2d, 0xe3, + 0xa5, 0xa2, 0x12, 0xb4, 0x42, 0xe4, 0x1c, 0xc8, 0x2a, 0x94, 0x22, 0x1a, 0x74, 0x5c, 0xcf, 0x89, + 0xc4, 0xa6, 0x38, 0x53, 0x3d, 0x2f, 0xd1, 0x4a, 0xdb, 0x0a, 0x80, 0x31, 0x0e, 0x69, 0xc3, 0x54, + 0x33, 0x38, 0xc4, 0x9e, 0xb7, 0x34, 0x99, 0x47, 0x53, 0xac, 0x73, 0x5a, 0xf1, 0x20, 0x15, 0xff, + 0x51, 0xf2, 0x20, 0xbf, 0x62, 0xc1, 0xc5, 0x0e, 0x75, 0xc2, 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, + 0xa8, 0xc7, 0x3a, 0x76, 0xa9, 0xc8, 0x99, 0xe3, 0xb8, 0xfd, 0xd0, 0x4f, 0xb9, 0xfa, 0xb4, 0x14, + 0xe5, 0x62, 0x16, 0x14, 0x33, 0xa5, 0xb1, 0xff, 0x64, 0x12, 0xce, 0xf7, 0x2d, 0xec, 0xe4, 0x65, + 0x28, 0x76, 0xf7, 0x9c, 0x50, 0xad, 0xd4, 0x57, 0xd5, 0x32, 0x51, 0x63, 0x85, 0x0f, 0x8f, 0xca, + 0xe7, 0x54, 0x15, 0x5e, 0x80, 0x02, 0x99, 0xa9, 0x42, 0x1d, 0x1a, 0x86, 0x4e, 0x4b, 0x2d, 0xdf, + 0xc6, 0x30, 0xe1, 0xc5, 0xa8, 0xe0, 0xe4, 0xef, 0x59, 0x70, 0x4e, 0x0c, 0x19, 0xa4, 0x61, 0xaf, + 0x1d, 0xb1, 0x2d, 0x8a, 0x35, 0xcb, 0xcd, 0x3c, 0x86, 0xa7, 0x20, 0x59, 0xbd, 0x24, 0xb9, 0x9f, + 0x33, 0x4b, 0x43, 0x4c, 0xf2, 0x25, 0x77, 0xa1, 0x14, 0x46, 0x4e, 0x10, 0xd1, 0x66, 0x25, 0xe2, + 0xca, 0xc8, 0xec, 0x8b, 0x3f, 0x3e, 0xdc, 0xda, 0xbd, 0xed, 0x76, 0xa8, 0xd8, 0x27, 0xea, 0x8a, + 0x00, 0xc6, 0xb4, 0xc8, 0x7b, 0x00, 0x41, 0xcf, 0xab, 0xf7, 0x3a, 0x1d, 0x27, 0x38, 0x94, 0x8a, + 0xd7, 0x8d, 0xf1, 0x3e, 0x0f, 0x35, 0xbd, 0x58, 0xd5, 0x88, 0xcb, 0xd0, 0xe0, 0x47, 0xbe, 0x62, + 0xc1, 0x39, 0x31, 0x12, 0x95, 0x04, 0x53, 0x39, 0x4b, 0x70, 0x9e, 0x35, 0xed, 0xba, 0xc9, 0x02, + 0x93, 0x1c, 0xed, 0xff, 0x90, 0x54, 0x03, 0xea, 0x11, 0x3b, 0x14, 0xb5, 0x0e, 0xc9, 0xe7, 0xe1, + 0xc9, 0xb0, 0xd7, 0x68, 0xd0, 0x30, 0xdc, 0xed, 0xb5, 0xb1, 0xe7, 0xdd, 0x70, 0xc3, 0xc8, 0x0f, + 0x0e, 0x37, 0xdd, 0x8e, 0x1b, 0xf1, 0x11, 0x57, 0xac, 0x5e, 0x39, 0x3e, 0x2a, 0x3f, 0x59, 0x1f, + 0x84, 0x84, 0x83, 0xeb, 0x13, 0x07, 0x9e, 0xea, 0x79, 0x83, 0xc9, 0x0b, 0xa5, 0xbb, 0x7c, 0x7c, + 0x54, 0x7e, 0xea, 0xce, 0x60, 0x34, 0x3c, 0x89, 0x86, 0xfd, 0xdf, 0x2c, 0xb6, 0x52, 0x8b, 0xef, + 0xda, 0xa6, 0x9d, 0x6e, 0x9b, 0xad, 0x2e, 0x67, 0xaf, 0x3f, 0x46, 0x09, 0xfd, 0x11, 0xf3, 0xd9, + 0xee, 0x94, 0xfc, 0x83, 0x94, 0x48, 0xfb, 0xbf, 0x5a, 0x70, 0x31, 0x8d, 0xfc, 0x18, 0x74, 0x9e, + 0x30, 0xa9, 0xf3, 0xdc, 0xca, 0xf7, 0x6b, 0x07, 0x28, 0x3e, 0x5f, 0x9b, 0xec, 0xff, 0xd6, 0xff, + 0xd7, 0xb7, 0xd1, 0x78, 0x57, 0x2c, 0xfc, 0x28, 0x77, 0xc5, 0xc9, 0x0f, 0xd5, 0xae, 0xf8, 0x6b, + 0x93, 0x30, 0x57, 0xf1, 0x22, 0xb7, 0xb2, 0xbb, 0xeb, 0x7a, 0x6e, 0x74, 0x48, 0xbe, 0x31, 0x01, + 0xab, 0xdd, 0x80, 0xee, 0xd2, 0x20, 0xa0, 0xcd, 0xf5, 0x5e, 0xe0, 0x7a, 0xad, 0x7a, 0x63, 0x8f, + 0x36, 0x7b, 0x6d, 0xd7, 0x6b, 0x6d, 0xb4, 0x3c, 0x5f, 0x17, 0x5f, 0x7b, 0x40, 0x1b, 0x3d, 0xfe, + 0x49, 0x62, 0x52, 0x74, 0xc6, 0xfb, 0xa4, 0xda, 0x68, 0x4c, 0xab, 0x2f, 0x1d, 0x1f, 0x95, 0x57, + 0x47, 0xac, 0x84, 0xa3, 0x7e, 0x1a, 0xf9, 0xfa, 0x04, 0xac, 0x04, 0xf4, 0x67, 0x7a, 0xee, 0xf0, + 0xad, 0x21, 0x56, 0xad, 0xf6, 0x98, 0xdb, 0xcf, 0x48, 0x3c, 0xab, 0x2f, 0x1e, 0x1f, 0x95, 0x47, + 0xac, 0x83, 0x23, 0x7e, 0x97, 0x5d, 0x83, 0xd9, 0x4a, 0xd7, 0x0d, 0xdd, 0x07, 0xe8, 0xf7, 0x22, + 0x3a, 0xc4, 0x11, 0xb7, 0x0c, 0xc5, 0xa0, 0xd7, 0xa6, 0x62, 0x6e, 0x97, 0xaa, 0x25, 0xb6, 0x0a, + 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x1c, 0x5b, 0x71, 0x39, 0xc9, 0x94, 0x71, 0xe3, 0x1e, 0x14, + 0x03, 0xc6, 0x44, 0x8e, 0xac, 0x71, 0xcf, 0x81, 0xb1, 0xd4, 0x52, 0x08, 0xf6, 0x13, 0x05, 0x0b, + 0xfb, 0x77, 0x26, 0xe0, 0x52, 0xa5, 0xdb, 0xdd, 0xa2, 0xe1, 0x5e, 0x4a, 0x8a, 0x5f, 0xb0, 0x60, + 0xfe, 0xc0, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, 0x26, 0x29, 0x21, 0x4f, 0x7d, 0x5c, 0x79, 0x38, 0xb7, + 0xb7, 0x13, 0xa4, 0xab, 0xe4, 0xf8, 0xa8, 0x3c, 0x9f, 0x2c, 0xc3, 0x14, 0x7b, 0xf2, 0x8f, 0x2c, + 0x58, 0x94, 0x45, 0xb7, 0xfc, 0x26, 0x35, 0xed, 0x98, 0x77, 0xf2, 0x94, 0x49, 0x13, 0x17, 0x06, + 0xaf, 0x74, 0x29, 0xf6, 0x09, 0x61, 0xff, 0x8f, 0x09, 0xb8, 0x3c, 0x80, 0x06, 0xf9, 0x55, 0x0b, + 0x2e, 0x0a, 0xe3, 0xa7, 0x01, 0x42, 0xba, 0x2b, 0x5b, 0xf3, 0x27, 0xf3, 0x96, 0x1c, 0xd9, 0x14, + 0xa7, 0x5e, 0x83, 0x56, 0x97, 0xd8, 0x6a, 0xb8, 0x96, 0xc1, 0x1a, 0x33, 0x05, 0xe2, 0x92, 0x0a, + 0x73, 0x68, 0x4a, 0xd2, 0x89, 0xc7, 0x22, 0x69, 0x3d, 0x83, 0x35, 0x66, 0x0a, 0x64, 0xff, 0x1d, + 0x78, 0xea, 0x04, 0x72, 0x8f, 0x9e, 0x9c, 0xf6, 0x3b, 0x7a, 0xd4, 0x27, 0xc7, 0xdc, 0x10, 0xf3, + 0xda, 0x86, 0x29, 0x3e, 0x75, 0xd4, 0xc4, 0x06, 0xb6, 0xfd, 0xf1, 0x39, 0x15, 0xa2, 0x84, 0xd8, + 0xbf, 0x63, 0xc1, 0xcc, 0x08, 0xd6, 0xb0, 0x72, 0xd2, 0x1a, 0x56, 0xea, 0xb3, 0x84, 0x45, 0xfd, + 0x96, 0xb0, 0x37, 0xc6, 0xeb, 0x8d, 0x61, 0x2c, 0x60, 0x7f, 0x6e, 0xc1, 0xf9, 0x3e, 0x8b, 0x19, + 0xd9, 0x83, 0x8b, 0x5d, 0xbf, 0xa9, 0xd4, 0xa6, 0x1b, 0x4e, 0xb8, 0xc7, 0x61, 0xf2, 0xf3, 0x5e, + 0x66, 0x3d, 0x59, 0xcb, 0x80, 0x3f, 0x3c, 0x2a, 0x2f, 0x69, 0x22, 0x29, 0x04, 0xcc, 0xa4, 0x48, + 0xba, 0x30, 0xb3, 0xeb, 0xd2, 0x76, 0x33, 0x1e, 0x82, 0x63, 0x2a, 0x48, 0xd7, 0x25, 0x35, 0x61, + 0x2c, 0x56, 0xff, 0x50, 0x73, 0xb1, 0xbf, 0x0c, 0xf3, 0xc9, 0xab, 0x83, 0x21, 0x3a, 0xef, 0x0a, + 0x14, 0x9c, 0xc0, 0x93, 0x5d, 0x37, 0x2b, 0x11, 0x0a, 0x15, 0xbc, 0x85, 0xac, 0x9c, 0xbc, 0x00, + 0x33, 0xbb, 0xbd, 0x76, 0x9b, 0x55, 0x90, 0x26, 0x7d, 0xad, 0x0e, 0x5f, 0x97, 0xe5, 0xa8, 0x31, + 0xec, 0xbf, 0x9a, 0x84, 0x85, 0x6a, 0xbb, 0x47, 0xdf, 0x08, 0x28, 0x55, 0x87, 0xf4, 0x0a, 0x2c, + 0x74, 0x03, 0x7a, 0xe0, 0xd2, 0xfb, 0x75, 0xda, 0xa6, 0x8d, 0xc8, 0x0f, 0xa4, 0x34, 0x97, 0x25, + 0xa1, 0x85, 0x5a, 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0x3a, 0xcc, 0x3b, 0x8d, 0xc8, 0x3d, 0xa0, 0x9a, + 0x82, 0x10, 0xf7, 0x23, 0x92, 0xc2, 0x7c, 0x25, 0x01, 0xc5, 0x14, 0x36, 0xf9, 0x02, 0x2c, 0x85, + 0x0d, 0xa7, 0x4d, 0xef, 0x74, 0x25, 0xab, 0xb5, 0x3d, 0xda, 0xd8, 0xaf, 0xf9, 0xae, 0x17, 0x49, + 0x93, 0xcc, 0x33, 0x92, 0xd2, 0x52, 0x7d, 0x00, 0x1e, 0x0e, 0xa4, 0x40, 0xfe, 0xad, 0x05, 0x57, + 0xba, 0x01, 0xad, 0x05, 0x7e, 0xc7, 0x67, 0x7b, 0x6d, 0x9f, 0x9d, 0x42, 0x9e, 0xd7, 0xdf, 0x1e, + 0x53, 0xa9, 0x10, 0x25, 0xfd, 0xe6, 0xed, 0x8f, 0x1e, 0x1f, 0x95, 0xaf, 0xd4, 0x4e, 0x12, 0x00, + 0x4f, 0x96, 0x8f, 0xfc, 0x3b, 0x0b, 0xae, 0x76, 0xfd, 0x30, 0x3a, 0xe1, 0x13, 0x8a, 0x67, 0xfa, + 0x09, 0xf6, 0xf1, 0x51, 0xf9, 0x6a, 0xed, 0x44, 0x09, 0xf0, 0x11, 0x12, 0xda, 0xc7, 0xb3, 0x70, + 0xde, 0x18, 0x7b, 0xf2, 0x10, 0xff, 0x1a, 0x9c, 0x53, 0x83, 0x21, 0x56, 0x02, 0x4a, 0xb1, 0xd1, + 0xa5, 0x62, 0x02, 0x31, 0x89, 0xcb, 0xc6, 0x9d, 0x1e, 0x8a, 0xa2, 0x76, 0x6a, 0xdc, 0xd5, 0x12, + 0x50, 0x4c, 0x61, 0x93, 0x0d, 0xb8, 0x20, 0x4b, 0x90, 0x76, 0xdb, 0x6e, 0xc3, 0x59, 0xf3, 0x7b, + 0x72, 0xc8, 0x15, 0xab, 0x97, 0x8f, 0x8f, 0xca, 0x17, 0x6a, 0xfd, 0x60, 0xcc, 0xaa, 0x43, 0x36, + 0xe1, 0xa2, 0xd3, 0x8b, 0x7c, 0xfd, 0xfd, 0xd7, 0x3c, 0xb6, 0xaf, 0x34, 0xf9, 0xd0, 0x9a, 0x11, + 0x1b, 0x50, 0x25, 0x03, 0x8e, 0x99, 0xb5, 0x48, 0x2d, 0x45, 0xad, 0x4e, 0x1b, 0xbe, 0xd7, 0x14, + 0xbd, 0x5c, 0x8c, 0x8f, 0x22, 0x95, 0x0c, 0x1c, 0xcc, 0xac, 0x49, 0xda, 0x30, 0xdf, 0x71, 0x1e, + 0xdc, 0xf1, 0x9c, 0x03, 0xc7, 0x6d, 0x33, 0x26, 0xd2, 0x90, 0x33, 0xd8, 0xba, 0xd0, 0x8b, 0xdc, + 0xf6, 0x8a, 0xb8, 0x8a, 0x5e, 0xd9, 0xf0, 0xa2, 0xb7, 0x82, 0x7a, 0xc4, 0x54, 0x56, 0xa1, 0x4a, + 0x6d, 0x25, 0x68, 0x61, 0x8a, 0x36, 0x79, 0x0b, 0x2e, 0xf1, 0xe9, 0xb8, 0xee, 0xdf, 0xf7, 0xd6, + 0x69, 0xdb, 0x39, 0x54, 0x1f, 0x30, 0xcd, 0x3f, 0xe0, 0xc9, 0xe3, 0xa3, 0xf2, 0xa5, 0x7a, 0x16, + 0x02, 0x66, 0xd7, 0x23, 0x0e, 0x3c, 0x95, 0x04, 0x20, 0x3d, 0x70, 0x43, 0xd7, 0xf7, 0x84, 0x39, + 0x66, 0x26, 0x36, 0xc7, 0xd4, 0x07, 0xa3, 0xe1, 0x49, 0x34, 0xc8, 0x3f, 0xb1, 0xe0, 0x62, 0xd6, + 0x34, 0x5c, 0x2a, 0xe5, 0x71, 0xd1, 0x96, 0x9a, 0x5a, 0x62, 0x44, 0x64, 0x2e, 0x0a, 0x99, 0x42, + 0x90, 0xf7, 0x2d, 0x98, 0x73, 0x8c, 0xa3, 0xe4, 0x12, 0x70, 0xa9, 0x6e, 0x8e, 0x6b, 0xd0, 0x88, + 0x29, 0x56, 0x17, 0x8f, 0x8f, 0xca, 0x89, 0xe3, 0x2a, 0x26, 0x38, 0x92, 0x7f, 0x66, 0xc1, 0xa5, + 0xcc, 0x39, 0xbe, 0x34, 0x7b, 0x16, 0x2d, 0xc4, 0x07, 0x49, 0xf6, 0x9a, 0x93, 0x2d, 0x06, 0xf9, + 0x96, 0xa5, 0xb7, 0x32, 0x75, 0xf7, 0xb2, 0x34, 0xc7, 0x45, 0xbb, 0x3d, 0xe6, 0xe9, 0x39, 0x56, + 0x1f, 0x14, 0xe1, 0xea, 0x05, 0x63, 0x67, 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x69, 0xa9, 0xad, + 0x51, 0x4b, 0x74, 0xee, 0xac, 0x24, 0x22, 0xf1, 0x4e, 0xab, 0x05, 0x4a, 0x31, 0x27, 0x3f, 0x05, + 0xcb, 0xce, 0x8e, 0x1f, 0x44, 0x99, 0x93, 0x6f, 0x69, 0x9e, 0x4f, 0xa3, 0xab, 0xc7, 0x47, 0xe5, + 0xe5, 0xca, 0x40, 0x2c, 0x3c, 0x81, 0x82, 0xfd, 0x1b, 0x45, 0x98, 0x13, 0x47, 0x02, 0xb9, 0x75, + 0xfd, 0x96, 0x05, 0x4f, 0x37, 0x7a, 0x41, 0x40, 0xbd, 0xa8, 0x1e, 0xd1, 0x6e, 0xff, 0xc6, 0x65, + 0x9d, 0xe9, 0xc6, 0xf5, 0xcc, 0xf1, 0x51, 0xf9, 0xe9, 0xb5, 0x13, 0xf8, 0xe3, 0x89, 0xd2, 0x91, + 0x7f, 0x6f, 0x81, 0x2d, 0x11, 0xaa, 0x4e, 0x63, 0xbf, 0x15, 0xf8, 0x3d, 0xaf, 0xd9, 0xff, 0x11, + 0x13, 0x67, 0xfa, 0x11, 0xcf, 0x1d, 0x1f, 0x95, 0xed, 0xb5, 0x47, 0x4a, 0x81, 0x43, 0x48, 0x4a, + 0xde, 0x80, 0xf3, 0x12, 0xeb, 0xda, 0x83, 0x2e, 0x0d, 0x5c, 0xa6, 0x7c, 0x4b, 0xc5, 0x31, 0x76, + 0xaf, 0x49, 0x23, 0x60, 0x7f, 0x1d, 0x12, 0xc2, 0xf4, 0x7d, 0xea, 0xb6, 0xf6, 0x22, 0xa5, 0x3e, + 0x8d, 0xe9, 0x53, 0x23, 0xcd, 0x03, 0x77, 0x05, 0xcd, 0xea, 0xec, 0xf1, 0x51, 0x79, 0x5a, 0xfe, + 0x41, 0xc5, 0x89, 0xdc, 0x82, 0x79, 0x71, 0x60, 0xab, 0xb9, 0x5e, 0xab, 0xe6, 0x7b, 0xc2, 0x13, + 0xa5, 0x54, 0x7d, 0x4e, 0x6d, 0xf8, 0xf5, 0x04, 0xf4, 0xe1, 0x51, 0x79, 0x4e, 0xfd, 0xde, 0x3e, + 0xec, 0x52, 0x4c, 0xd5, 0xb6, 0x7f, 0x7f, 0x0a, 0x40, 0x0d, 0x57, 0xda, 0x25, 0x3f, 0x01, 0xa5, + 0x90, 0x46, 0x82, 0xab, 0xbc, 0x41, 0x10, 0x17, 0x33, 0xaa, 0x10, 0x63, 0x38, 0xd9, 0x87, 0x62, + 0xd7, 0xe9, 0x85, 0x54, 0x76, 0xfe, 0xcd, 0x5c, 0x3a, 0xbf, 0xc6, 0x28, 0x8a, 0x13, 0x1a, 0xff, + 0x89, 0x82, 0x07, 0xf9, 0xaa, 0x05, 0x40, 0x93, 0x1d, 0x36, 0xb6, 0xa5, 0x44, 0xb2, 0x8c, 0xfb, + 0x94, 0xb5, 0x41, 0x75, 0xfe, 0xf8, 0xa8, 0x0c, 0x46, 0xd7, 0x1b, 0x6c, 0xc9, 0x7d, 0x98, 0x71, + 0xd4, 0x9a, 0x3f, 0x79, 0x16, 0x6b, 0x3e, 0x3f, 0x38, 0xe9, 0x41, 0xab, 0x99, 0x91, 0xaf, 0x5b, + 0x30, 0x1f, 0xd2, 0x48, 0x76, 0x15, 0x5b, 0x79, 0xa4, 0xc2, 0x3b, 0xe6, 0xa0, 0xab, 0x27, 0x68, + 0x8a, 0x15, 0x34, 0x59, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x1b, 0xd4, 0x69, 0xd2, 0x80, 0x9f, 0xcb, + 0xa5, 0x26, 0x35, 0xbe, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x2d, + 0x37, 0x08, 0x7c, 0x29, 0xca, 0x4c, 0x4e, 0xa2, 0x18, 0x34, 0xb5, 0x28, 0x46, 0x19, 0xa6, 0xf8, + 0xda, 0xdf, 0x39, 0x07, 0xf3, 0x6a, 0x22, 0xc5, 0x9a, 0xbd, 0x30, 0x03, 0x0d, 0xd0, 0xec, 0xd7, + 0x4c, 0x20, 0x26, 0x71, 0x59, 0x65, 0x31, 0x55, 0x93, 0x8a, 0xbd, 0xae, 0x5c, 0x37, 0x81, 0x98, + 0xc4, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, 0xcb, 0xe0, 0x31, 0xef, 0x2a, 0xe3, 0xf5, 0x21, + 0xbe, 0xee, 0x61, 0xff, 0x42, 0x14, 0x5c, 0xb8, 0x25, 0x33, 0x4a, 0x18, 0x37, 0xe5, 0xe4, 0xc8, + 0x67, 0x7e, 0x26, 0xed, 0xa6, 0xa2, 0x37, 0x92, 0x65, 0x98, 0x62, 0x9f, 0xa1, 0xec, 0x17, 0xcf, + 0x50, 0xd9, 0xff, 0x1c, 0xcc, 0x74, 0x9c, 0x07, 0xf5, 0x5e, 0xd0, 0x3a, 0xfd, 0xa1, 0x42, 0xba, + 0xd7, 0x09, 0x2a, 0xa8, 0xe9, 0x91, 0xaf, 0x58, 0xc6, 0x92, 0x33, 0xcd, 0x89, 0xdf, 0xcd, 0x77, + 0xc9, 0xd1, 0x7b, 0xe5, 0xc0, 0xc5, 0xa7, 0x4f, 0xf5, 0x9e, 0x79, 0xec, 0xaa, 0x37, 0x53, 0x23, + 0xc5, 0x04, 0xd1, 0x6a, 0x64, 0xe9, 0x4c, 0xd5, 0xc8, 0xb5, 0x04, 0x33, 0x4c, 0x31, 0xe7, 0xf2, + 0x88, 0x39, 0xa7, 0xe5, 0x81, 0x33, 0x95, 0xa7, 0x9e, 0x60, 0x86, 0x29, 0xe6, 0x83, 0xcf, 0x9b, + 0xb3, 0x67, 0x73, 0xde, 0x9c, 0xcb, 0xe1, 0xbc, 0x79, 0xb2, 0x2a, 0x7e, 0x6e, 0x5c, 0x55, 0x9c, + 0xdc, 0x04, 0xd2, 0x3c, 0xf4, 0x9c, 0x8e, 0xdb, 0x90, 0x8b, 0x25, 0xdf, 0x36, 0xe7, 0xb9, 0x3d, + 0x62, 0x59, 0x2e, 0x64, 0x64, 0xbd, 0x0f, 0x03, 0x33, 0x6a, 0x91, 0x08, 0x66, 0xba, 0x4a, 0xe3, + 0x5a, 0xc8, 0x63, 0xf4, 0x2b, 0x0d, 0x4c, 0xf8, 0x0b, 0xb0, 0x89, 0xa7, 0x4a, 0x50, 0x73, 0x22, + 0x9b, 0x70, 0xb1, 0xe3, 0x7a, 0x35, 0xbf, 0x19, 0xd6, 0x68, 0x20, 0xad, 0x2d, 0x75, 0x1a, 0x2d, + 0x2d, 0xf2, 0xb6, 0xe1, 0x27, 0xe8, 0xad, 0x0c, 0x38, 0x66, 0xd6, 0xb2, 0xff, 0xa7, 0x05, 0x8b, + 0x6b, 0x6d, 0xbf, 0xd7, 0xbc, 0xeb, 0x44, 0x8d, 0x3d, 0x71, 0x55, 0x4e, 0x5e, 0x87, 0x19, 0xd7, + 0x8b, 0x68, 0x70, 0xe0, 0xb4, 0xe5, 0xfe, 0x64, 0x2b, 0xf3, 0xe9, 0x86, 0x2c, 0x7f, 0x78, 0x54, + 0x9e, 0x5f, 0xef, 0x05, 0xdc, 0x9d, 0x4e, 0xac, 0x56, 0xa8, 0xeb, 0x90, 0xef, 0x58, 0x70, 0x5e, + 0x5c, 0xb6, 0xaf, 0x3b, 0x91, 0x73, 0xbb, 0x47, 0x03, 0x97, 0xaa, 0xeb, 0xf6, 0x31, 0x17, 0xaa, + 0xb4, 0xac, 0x8a, 0xc1, 0x61, 0xac, 0xa8, 0x6f, 0xa5, 0x39, 0x63, 0xbf, 0x30, 0xf6, 0x2f, 0x16, + 0xe0, 0xc9, 0x81, 0xb4, 0xc8, 0x32, 0x4c, 0xb8, 0x4d, 0xf9, 0xe9, 0x20, 0xe9, 0x4e, 0x6c, 0x34, + 0x71, 0xc2, 0x6d, 0x92, 0x15, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0xcd, 0x6b, 0x49, 0xab, 0x87, + 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x86, 0x22, 0x77, 0xad, 0x94, 0xe7, 0x09, 0xae, 0xc5, 0x72, 0x2f, + 0x46, 0x14, 0xe5, 0xe4, 0xe7, 0x2c, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, 0x5d, 0x12, 0xf3, 0x6d, + 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x86, 0x29, 0xa6, 0xd0, 0xfa, 0xcd, + 0x53, 0x6f, 0x8a, 0xfc, 0x4a, 0xa6, 0xc6, 0x69, 0xa0, 0xa4, 0xc5, 0xda, 0x2a, 0xa0, 0x51, 0x2f, + 0xf0, 0x58, 0xd3, 0xf2, 0x6d, 0x70, 0x46, 0x48, 0x81, 0xba, 0x14, 0x0d, 0x0c, 0xfb, 0xdf, 0x4c, + 0xc0, 0xc5, 0x2c, 0xd1, 0xd9, 0x6e, 0x33, 0x25, 0xa4, 0x95, 0x47, 0xe3, 0xcf, 0xe6, 0xdf, 0x3e, + 0xd2, 0x6f, 0x44, 0x7b, 0x57, 0x48, 0xcf, 0x36, 0xc9, 0x97, 0x7c, 0x56, 0xb7, 0xd0, 0xc4, 0x29, + 0x5b, 0x48, 0x53, 0x4e, 0xb5, 0xd2, 0x33, 0x30, 0x19, 0xb2, 0x9e, 0x2f, 0x24, 0xaf, 0x3b, 0x78, + 0x1f, 0x71, 0x08, 0xc3, 0xe8, 0x79, 0x6e, 0x24, 0xfd, 0xf9, 0x35, 0xc6, 0x1d, 0xcf, 0x8d, 0x90, + 0x43, 0xec, 0x6f, 0x4f, 0xc0, 0xf2, 0xe0, 0x8f, 0x22, 0xdf, 0xb6, 0x00, 0x9a, 0xec, 0xb8, 0x12, + 0x72, 0xa7, 0x5e, 0xe1, 0x67, 0xe3, 0x9c, 0x55, 0x1b, 0xae, 0x2b, 0x4e, 0xb1, 0xd3, 0x95, 0x2e, + 0x0a, 0xd1, 0x10, 0x84, 0xbc, 0xa8, 0x86, 0x3e, 0xbf, 0xaa, 0x11, 0x93, 0x49, 0xd7, 0xd9, 0xd2, + 0x10, 0x34, 0xb0, 0xd8, 0x79, 0xd4, 0x73, 0x3a, 0x34, 0xec, 0x3a, 0x3a, 0x60, 0x83, 0x9f, 0x47, + 0x6f, 0xa9, 0x42, 0x8c, 0xe1, 0x76, 0x1b, 0x9e, 0x1d, 0x42, 0xce, 0x9c, 0x9c, 0xe7, 0xed, 0xbf, + 0xb0, 0xe0, 0xf2, 0x5a, 0xbb, 0x17, 0x46, 0x34, 0xf8, 0xff, 0xc6, 0x87, 0xed, 0x7f, 0x59, 0xf0, + 0xd4, 0x80, 0x6f, 0x7e, 0x0c, 0xae, 0x6c, 0xef, 0x26, 0x5d, 0xd9, 0xee, 0x8c, 0x3b, 0xa4, 0x33, + 0xbf, 0x63, 0x80, 0x47, 0xdb, 0xaf, 0x59, 0x70, 0x8e, 0x2d, 0x5b, 0x4d, 0xbf, 0x95, 0xd3, 0xc6, + 0xf9, 0x2c, 0x14, 0x7f, 0x86, 0x6d, 0x40, 0xe9, 0x41, 0xc6, 0x77, 0x25, 0x14, 0x30, 0x36, 0x67, + 0x9c, 0xae, 0xfb, 0x36, 0x0d, 0xf8, 0x06, 0x54, 0x48, 0xce, 0x99, 0x8a, 0x86, 0xa0, 0x81, 0x65, + 0x7f, 0x06, 0xa4, 0xb3, 0x58, 0x6a, 0xc6, 0x59, 0xc3, 0xcc, 0x38, 0xfb, 0x3f, 0x4e, 0x80, 0x61, + 0xfc, 0x78, 0x0c, 0x23, 0xd9, 0x4b, 0x8c, 0xe4, 0x31, 0x0f, 0xee, 0x86, 0x29, 0x67, 0x50, 0x30, + 0xcf, 0x41, 0x2a, 0x98, 0xe7, 0x56, 0x6e, 0x1c, 0x4f, 0x8e, 0xe5, 0xf9, 0xbe, 0x05, 0x4f, 0xc5, + 0xc8, 0xfd, 0x76, 0xc9, 0x47, 0x2f, 0x4b, 0xaf, 0xc0, 0xac, 0x13, 0x57, 0x93, 0xe3, 0xc6, 0x88, + 0xa4, 0xd0, 0x20, 0x34, 0xf1, 0x62, 0x1f, 0xf4, 0xc2, 0x29, 0x7d, 0xd0, 0x27, 0x4f, 0xf6, 0x41, + 0xb7, 0xff, 0x72, 0x02, 0xae, 0xf4, 0x7f, 0x99, 0x9a, 0x50, 0xc3, 0x5d, 0xf2, 0xbf, 0x0a, 0x73, + 0x91, 0xac, 0x60, 0x6c, 0x0f, 0x3a, 0xfa, 0x72, 0xdb, 0x80, 0x61, 0x02, 0x93, 0xd5, 0x6c, 0x88, + 0xa9, 0x5c, 0x6f, 0xf8, 0x5d, 0x15, 0xc1, 0xa0, 0x6b, 0xae, 0x19, 0x30, 0x4c, 0x60, 0x6a, 0xdf, + 0xd0, 0xc9, 0x33, 0xf7, 0x0d, 0xad, 0xc3, 0x25, 0xe5, 0x0d, 0x77, 0xdd, 0x0f, 0xd6, 0xfc, 0x4e, + 0xb7, 0x4d, 0x65, 0x0c, 0x03, 0x13, 0xf6, 0x8a, 0xac, 0x72, 0x09, 0xb3, 0x90, 0x30, 0xbb, 0xae, + 0xfd, 0xfd, 0x02, 0x5c, 0x88, 0x9b, 0x7d, 0xcd, 0xf7, 0x9a, 0x2e, 0xf7, 0x29, 0x7c, 0x0d, 0x26, + 0xa3, 0xc3, 0xae, 0x6a, 0xec, 0xbf, 0xa1, 0xc4, 0xd9, 0x3e, 0xec, 0xb2, 0xde, 0xbe, 0x9c, 0x51, + 0x85, 0x5b, 0x86, 0x79, 0x25, 0xb2, 0xa9, 0x67, 0x87, 0xe8, 0x81, 0x97, 0x93, 0xa3, 0xf9, 0xe1, + 0x51, 0x39, 0x23, 0xf8, 0x78, 0x45, 0x53, 0x4a, 0x8e, 0x79, 0x72, 0x0f, 0xe6, 0xdb, 0x4e, 0x18, + 0xdd, 0xe9, 0x36, 0x9d, 0x88, 0x6e, 0xbb, 0xd2, 0x43, 0x63, 0xb4, 0xc0, 0x00, 0x7d, 0x95, 0xbd, + 0x99, 0xa0, 0x84, 0x29, 0xca, 0xe4, 0x00, 0x08, 0x2b, 0xd9, 0x0e, 0x1c, 0x2f, 0x14, 0x5f, 0xc5, + 0xf8, 0x8d, 0x1e, 0x88, 0xa0, 0x4f, 0x86, 0x9b, 0x7d, 0xd4, 0x30, 0x83, 0x03, 0x79, 0x0e, 0xa6, + 0x02, 0xea, 0x84, 0xb2, 0x33, 0x4b, 0xf1, 0xfc, 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, 0xa8, 0xa9, + 0x47, 0x4c, 0xa8, 0x3f, 0xb5, 0x60, 0x3e, 0xee, 0xa6, 0xc7, 0xb0, 0xb3, 0x76, 0x92, 0x3b, 0xeb, + 0x8d, 0xbc, 0x96, 0xc4, 0x01, 0x9b, 0xe9, 0x1f, 0x4c, 0x99, 0xdf, 0xc7, 0x1d, 0xc3, 0xbf, 0x04, + 0x25, 0x35, 0xab, 0x95, 0xca, 0x3a, 0xe6, 0x01, 0x3b, 0xa1, 0xcc, 0x18, 0x01, 0x4d, 0x92, 0x09, + 0xc6, 0xfc, 0xd8, 0x56, 0xde, 0x94, 0xdb, 0xb4, 0x1c, 0xf6, 0x7a, 0x2b, 0x57, 0xdb, 0x77, 0xd6, + 0x56, 0xae, 0xea, 0x90, 0x3b, 0x70, 0xb9, 0x1b, 0xf8, 0x3c, 0x36, 0x79, 0x9d, 0x3a, 0xcd, 0xb6, + 0xeb, 0x51, 0x65, 0xc5, 0x10, 0x9e, 0x14, 0x4f, 0x1d, 0x1f, 0x95, 0x2f, 0xd7, 0xb2, 0x51, 0x70, + 0x50, 0xdd, 0x64, 0x60, 0xd6, 0xe4, 0x10, 0x81, 0x59, 0x7f, 0x5f, 0xdb, 0x0a, 0x69, 0x28, 0xc3, + 0xa3, 0x3e, 0x9f, 0x57, 0x57, 0x66, 0x2c, 0xeb, 0xf1, 0x90, 0xaa, 0x48, 0xa6, 0xa8, 0xd9, 0x0f, + 0x36, 0x48, 0x4d, 0x9d, 0xd2, 0x20, 0x15, 0xfb, 0xd7, 0x4f, 0xff, 0x28, 0xfd, 0xeb, 0x67, 0x3e, + 0x54, 0xfe, 0xf5, 0x1f, 0x14, 0x61, 0x31, 0xad, 0x81, 0x9c, 0x7d, 0xd0, 0xd9, 0x3f, 0xb4, 0x60, + 0x51, 0xcd, 0x1e, 0xc1, 0x93, 0xaa, 0xab, 0x86, 0xcd, 0x9c, 0x26, 0xad, 0xd0, 0xa5, 0x74, 0x34, + 0xfb, 0x76, 0x8a, 0x1b, 0xf6, 0xf1, 0x27, 0xef, 0xc0, 0xac, 0xb6, 0xc8, 0x9f, 0x2a, 0x02, 0x6d, + 0x81, 0x6b, 0x51, 0x31, 0x09, 0x34, 0xe9, 0x91, 0x0f, 0x2c, 0x80, 0x86, 0xda, 0xe6, 0xd4, 0xec, + 0xba, 0x9d, 0xd7, 0xec, 0xd2, 0x1b, 0x68, 0xac, 0x2c, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, 0x17, + 0xb9, 0x2d, 0x5e, 0x6b, 0x77, 0x6c, 0x3e, 0x15, 0xc6, 0xf7, 0x1d, 0x3e, 0x41, 0x31, 0x8d, 0x55, + 0x29, 0x03, 0x14, 0x62, 0x42, 0x08, 0xfb, 0x35, 0xd0, 0xde, 0x9e, 0x6c, 0xd9, 0xe2, 0xfe, 0x9e, + 0x35, 0x27, 0xda, 0x93, 0x43, 0x50, 0x2f, 0x5b, 0xd7, 0x15, 0x00, 0x63, 0x1c, 0xfb, 0x8b, 0x30, + 0xff, 0x46, 0xe0, 0x74, 0xf7, 0x5c, 0x6e, 0xf3, 0x66, 0x67, 0xab, 0x8f, 0xc1, 0xb4, 0xd3, 0x6c, + 0x66, 0xe5, 0x82, 0xa8, 0x88, 0x62, 0x54, 0xf0, 0xa1, 0x8e, 0x51, 0xf6, 0xef, 0x5b, 0x40, 0xe2, + 0x7b, 0x43, 0xd7, 0x6b, 0x6d, 0x39, 0x51, 0x63, 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, + 0xe8, 0x86, 0x86, 0xa0, 0x81, 0x45, 0xde, 0x83, 0x59, 0xf1, 0xef, 0x6d, 0x6d, 0x21, 0x18, 0x3b, + 0x82, 0x40, 0x6c, 0x28, 0x5c, 0x26, 0x31, 0x0a, 0x6f, 0xc4, 0x1c, 0xd0, 0x64, 0xc7, 0x9a, 0x6a, + 0xc3, 0xdb, 0x6d, 0xf7, 0x1e, 0x34, 0x77, 0xe2, 0xa6, 0xea, 0x06, 0xfe, 0xae, 0xdb, 0xa6, 0xe9, + 0xa6, 0xaa, 0x89, 0x62, 0x54, 0xf0, 0xe1, 0x9a, 0xea, 0x77, 0x2d, 0xb8, 0xb8, 0x11, 0x46, 0xae, + 0xbf, 0x4e, 0xc3, 0x88, 0x6d, 0x2b, 0x6c, 0xf1, 0xe9, 0xb5, 0x87, 0x71, 0xdc, 0x5e, 0x87, 0x45, + 0x79, 0x87, 0xd9, 0xdb, 0x09, 0x69, 0x64, 0xe8, 0xf1, 0x7a, 0x1e, 0xaf, 0xa5, 0xe0, 0xd8, 0x57, + 0x83, 0x51, 0x91, 0x97, 0x99, 0x31, 0x95, 0x42, 0x92, 0x4a, 0x3d, 0x05, 0xc7, 0xbe, 0x1a, 0xf6, + 0xf7, 0x0a, 0x70, 0x81, 0x7f, 0x46, 0x2a, 0xe8, 0xe2, 0x9b, 0x83, 0x82, 0x2e, 0xc6, 0x9c, 0xca, + 0x9c, 0xd7, 0x29, 0x42, 0x2e, 0xfe, 0x81, 0x05, 0x0b, 0xcd, 0x64, 0x4b, 0xe7, 0x63, 0xd3, 0xc9, + 0xea, 0x43, 0xe1, 0xb2, 0x95, 0x2a, 0xc4, 0x34, 0x7f, 0xf2, 0x4b, 0x16, 0x2c, 0x24, 0xc5, 0x54, + 0xab, 0xfb, 0x19, 0x34, 0x92, 0xf6, 0xb1, 0x4e, 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xc3, 0x09, + 0xd9, 0xa5, 0x67, 0x11, 0x51, 0x40, 0xee, 0x43, 0x29, 0x6a, 0x87, 0xa2, 0x50, 0x7e, 0xed, 0x98, + 0x27, 0xc2, 0xed, 0xcd, 0xba, 0x70, 0x1f, 0x88, 0x95, 0x36, 0x59, 0xc2, 0x94, 0x4f, 0xc5, 0x8b, + 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x8e, 0xa2, 0xdb, 0x6b, 0xb5, 0x34, 0x63, 0x59, 0xc2, 0x18, + 0x2b, 0x5e, 0xf6, 0xaf, 0x5b, 0x50, 0xba, 0xe9, 0xab, 0x75, 0xe4, 0xa7, 0x72, 0x30, 0xf4, 0x68, + 0x7d, 0x50, 0x5f, 0x53, 0xc6, 0x47, 0x8c, 0xd7, 0x13, 0x66, 0x9e, 0xa7, 0x0d, 0xda, 0x2b, 0x3c, + 0xcf, 0x15, 0x23, 0x75, 0xd3, 0xdf, 0x19, 0x68, 0x7a, 0xfc, 0xe5, 0x22, 0x9c, 0x7b, 0xd3, 0x39, + 0xa4, 0x5e, 0xe4, 0x8c, 0xbe, 0x49, 0xbc, 0x02, 0xb3, 0x4e, 0x97, 0xdf, 0x83, 0x19, 0x3a, 0x7e, + 0x6c, 0x39, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x48, 0xbb, 0x93, 0xb5, 0x14, 0xad, 0xa5, + 0xe0, 0xd8, 0x57, 0x83, 0xdc, 0x04, 0x22, 0xa3, 0x51, 0x2b, 0x8d, 0x86, 0xdf, 0xf3, 0xc4, 0x92, + 0x26, 0x8c, 0x2a, 0xfa, 0xb0, 0xb9, 0xd5, 0x87, 0x81, 0x19, 0xb5, 0xc8, 0x17, 0x60, 0xa9, 0xc1, + 0x29, 0xcb, 0xa3, 0x87, 0x49, 0x51, 0x1c, 0x3f, 0x75, 0x9c, 0xc0, 0xda, 0x00, 0x3c, 0x1c, 0x48, + 0x81, 0x49, 0x1a, 0x46, 0x7e, 0xe0, 0xb4, 0xa8, 0x49, 0x77, 0x2a, 0x29, 0x69, 0xbd, 0x0f, 0x03, + 0x33, 0x6a, 0x91, 0x2f, 0x43, 0x29, 0xda, 0x0b, 0x68, 0xb8, 0xe7, 0xb7, 0x9b, 0xd2, 0x6f, 0x61, + 0x4c, 0x4b, 0x9b, 0xec, 0xfd, 0x6d, 0x45, 0xd5, 0x18, 0xde, 0xaa, 0x08, 0x63, 0x9e, 0x24, 0x80, + 0xa9, 0xb0, 0xe1, 0x77, 0x69, 0x28, 0x55, 0xf6, 0x9b, 0xb9, 0x70, 0xe7, 0x96, 0x23, 0xc3, 0xc6, + 0xc7, 0x39, 0xa0, 0xe4, 0x64, 0xff, 0xde, 0x04, 0xcc, 0x99, 0x88, 0x43, 0xac, 0x4d, 0x5f, 0xb5, + 0x60, 0xae, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0x85, 0xfd, 0x2a, 0x1f, 0x8d, 0x82, 0x91, 0x5a, 0xa7, + 0x91, 0xe3, 0xb6, 0x0d, 0x53, 0x98, 0xc1, 0x06, 0x13, 0x4c, 0xc9, 0x37, 0x2c, 0x58, 0x88, 0xdd, + 0xdc, 0x62, 0x43, 0x5a, 0xae, 0x82, 0xe8, 0xa5, 0xfe, 0x5a, 0x92, 0x13, 0xa6, 0x59, 0xdb, 0x3b, + 0xb0, 0x98, 0xee, 0x6d, 0xd6, 0x94, 0x5d, 0x47, 0xce, 0xf5, 0x42, 0xdc, 0x94, 0x35, 0x27, 0x0c, + 0x91, 0x43, 0xc8, 0x0b, 0x30, 0xd3, 0x71, 0x82, 0x96, 0xeb, 0x39, 0x6d, 0xde, 0x8a, 0x05, 0x63, + 0x41, 0x92, 0xe5, 0xa8, 0x31, 0xec, 0x4f, 0xc0, 0xdc, 0x96, 0xe3, 0xb5, 0x68, 0x53, 0xae, 0xc3, + 0x8f, 0x8e, 0x69, 0xfb, 0xe1, 0x24, 0xcc, 0x1a, 0x67, 0xb3, 0xb3, 0x3f, 0x67, 0x25, 0x52, 0x6a, + 0x14, 0x72, 0x4c, 0xa9, 0xf1, 0x39, 0x80, 0x5d, 0xd7, 0x73, 0xc3, 0xbd, 0x53, 0x26, 0xeb, 0xe0, + 0xf7, 0xba, 0xd7, 0x35, 0x05, 0x34, 0xa8, 0xc5, 0x97, 0x67, 0xc5, 0x13, 0x32, 0x4f, 0x7d, 0x60, + 0x19, 0xdb, 0xcd, 0x54, 0x1e, 0xce, 0x02, 0x46, 0xc7, 0xac, 0xa8, 0xed, 0x47, 0xe4, 0x1a, 0x3a, + 0x69, 0x57, 0xda, 0x86, 0x99, 0x80, 0x86, 0xbd, 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0c, 0xdc, + 0x6d, 0x03, 0x65, 0x7d, 0xd4, 0x94, 0x96, 0x5f, 0x83, 0x73, 0x09, 0x11, 0x46, 0xca, 0x3e, 0xe4, + 0x43, 0xa6, 0x01, 0xe0, 0x34, 0x97, 0x39, 0xac, 0x2f, 0xda, 0x46, 0xb6, 0x0e, 0xdd, 0x17, 0xc2, + 0x39, 0x47, 0xc0, 0xec, 0xbf, 0x9c, 0x02, 0x79, 0xff, 0x3d, 0xc4, 0x72, 0x65, 0xde, 0x7a, 0x4d, + 0x9c, 0xe2, 0xd6, 0xeb, 0x26, 0xcc, 0xb9, 0x9e, 0x1b, 0xb9, 0x4e, 0x9b, 0x1b, 0x77, 0xe4, 0x76, + 0xaa, 0xbc, 0x97, 0xe7, 0x36, 0x0c, 0x58, 0x06, 0x9d, 0x44, 0x5d, 0x72, 0x1b, 0x8a, 0x7c, 0xbf, + 0x91, 0x03, 0x78, 0xf4, 0x4b, 0x7a, 0xee, 0x9f, 0x21, 0x42, 0x9a, 0x04, 0x25, 0x7e, 0xf8, 0x10, + 0xe9, 0x4a, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, + 0xd7, 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0xa6, 0x92, 0x54, 0xae, 0xa7, 0xe0, 0xd8, 0x57, 0x83, + 0xec, 0xc2, 0x9c, 0x2c, 0x13, 0x2e, 0x57, 0xd3, 0xa7, 0xfc, 0x4a, 0xee, 0x5a, 0x77, 0xdd, 0xa0, + 0x84, 0x09, 0xba, 0xa4, 0x07, 0xe7, 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, + 0x1c, 0x4f, 0x74, 0x1a, 0x66, 0x97, 0x8e, 0x8f, 0xca, 0xe7, 0x37, 0xd2, 0xe4, 0xb0, 0x9f, 0x03, + 0xf9, 0x8a, 0x05, 0x97, 0x1a, 0xbe, 0x17, 0xf2, 0xf8, 0xff, 0x03, 0x7a, 0x2d, 0x08, 0xfc, 0x40, + 0xf0, 0x2e, 0x9d, 0x92, 0x37, 0xb7, 0x29, 0xae, 0x65, 0x91, 0xc4, 0x6c, 0x4e, 0xe4, 0x5d, 0x98, + 0xe9, 0x06, 0xfe, 0x81, 0xdb, 0xa4, 0x81, 0x74, 0xdf, 0xdb, 0xcc, 0x23, 0x1f, 0x49, 0x4d, 0xd2, + 0x8c, 0x97, 0x1e, 0x55, 0x82, 0x9a, 0x9f, 0xfd, 0xbf, 0x67, 0x61, 0x3e, 0x89, 0x4e, 0x7e, 0x16, + 0xa0, 0x1b, 0xf8, 0x1d, 0x1a, 0xed, 0x51, 0x1d, 0x17, 0x72, 0x6b, 0xdc, 0xb4, 0x17, 0x8a, 0x9e, + 0x72, 0x79, 0x61, 0xcb, 0x45, 0x5c, 0x8a, 0x06, 0x47, 0x12, 0xc0, 0xf4, 0xbe, 0xd8, 0x76, 0xa5, + 0x16, 0xf2, 0x66, 0x2e, 0x3a, 0x93, 0xe4, 0xcc, 0x03, 0x1a, 0x64, 0x11, 0x2a, 0x46, 0x64, 0x07, + 0x0a, 0xf7, 0xe9, 0x4e, 0x3e, 0x31, 0xd7, 0x77, 0xa9, 0x3c, 0xcd, 0x54, 0xa7, 0x8f, 0x8f, 0xca, + 0x85, 0xbb, 0x74, 0x07, 0x19, 0x71, 0xf6, 0x5d, 0x4d, 0x71, 0x77, 0x2f, 0x97, 0x8a, 0x31, 0xbf, + 0x2b, 0xe1, 0x08, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x62, 0x44, 0xde, 0x85, 0xd2, 0x7d, 0xe7, 0x80, + 0xee, 0x06, 0xbe, 0x17, 0x49, 0x3f, 0xab, 0x31, 0x43, 0x05, 0xee, 0x2a, 0x72, 0x92, 0x2f, 0xdf, + 0xde, 0x75, 0x21, 0xc6, 0xec, 0xc8, 0x01, 0xcc, 0x78, 0xf4, 0x3e, 0xd2, 0xb6, 0xdb, 0xc8, 0xc7, + 0x35, 0xff, 0x96, 0xa4, 0x26, 0x39, 0xf3, 0x7d, 0x4f, 0x95, 0xa1, 0xe6, 0xc5, 0xfa, 0xf2, 0x9e, + 0xbf, 0x23, 0x17, 0xaa, 0x31, 0xfb, 0x52, 0x9f, 0x4c, 0x45, 0x5f, 0xde, 0xf4, 0x77, 0x90, 0x11, + 0x67, 0x73, 0xa4, 0xa1, 0x9d, 0x7c, 0xe4, 0x32, 0x75, 0x2b, 0x5f, 0xe7, 0x26, 0x31, 0x47, 0xe2, + 0x52, 0x34, 0x38, 0xb2, 0xb6, 0x6d, 0x49, 0x63, 0xa5, 0x5c, 0xa8, 0xc6, 0x6c, 0xdb, 0xa4, 0xe9, + 0x53, 0xb4, 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, 0xe5, 0x2f, 0x9f, 0xa5, 0x2a, 0x69, + 0x47, 0x14, 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, 0xfd, 0xc3, 0xfb, 0x4e, 0x7b, 0xdf, + 0xf5, 0x5a, 0x32, 0xce, 0x71, 0xdc, 0xb4, 0xb7, 0xfb, 0x87, 0x77, 0x05, 0x3d, 0xb3, 0xbd, 0xe3, + 0x52, 0x34, 0x38, 0x92, 0x7f, 0x6a, 0xc1, 0x54, 0xb7, 0xdd, 0x6b, 0xb9, 0xde, 0xd2, 0x1c, 0xd7, + 0x13, 0x3f, 0x9b, 0xe7, 0x0a, 0xbd, 0x52, 0xe3, 0xa4, 0x85, 0xa2, 0xf8, 0xe3, 0xda, 0x67, 0x8f, + 0x17, 0xfe, 0xfc, 0x9f, 0x95, 0x97, 0xa8, 0xd7, 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xbd, 0x17, 0xfa, + 0xde, 0x0a, 0x3a, 0xf7, 0x95, 0x8e, 0x2e, 0x65, 0x5a, 0xfe, 0x14, 0xcc, 0x1a, 0x24, 0x1e, 0xa5, + 0xe8, 0xcd, 0x99, 0x8a, 0xde, 0xaf, 0x4f, 0xc1, 0x9c, 0x99, 0x51, 0x6f, 0x08, 0xed, 0x4b, 0x9f, + 0x38, 0x26, 0x46, 0x39, 0x71, 0xb0, 0x23, 0xa6, 0x71, 0x7b, 0xa4, 0xcc, 0x5b, 0x1b, 0xb9, 0x29, + 0xdc, 0xf1, 0x11, 0xd3, 0x28, 0x0c, 0x31, 0xc1, 0x74, 0x04, 0x87, 0x12, 0xa6, 0xb6, 0x0a, 0xc5, + 0xae, 0x98, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x8b, 0x00, 0x71, 0x66, 0x39, 0x79, 0xab, 0xa8, 0xf5, + 0x61, 0x23, 0xe3, 0x9d, 0x81, 0x45, 0x9e, 0x83, 0x29, 0xa6, 0xfa, 0xd0, 0xa6, 0x0c, 0xc3, 0xd6, + 0xe7, 0xf8, 0xeb, 0xbc, 0x14, 0x25, 0x94, 0xbc, 0xca, 0xb4, 0xd4, 0x58, 0x61, 0x91, 0xd1, 0xd5, + 0x17, 0x63, 0x2d, 0x35, 0x86, 0x61, 0x02, 0x93, 0x89, 0x4e, 0x99, 0x7e, 0xc1, 0xd7, 0x06, 0x43, + 0x74, 0xae, 0x74, 0xa0, 0x80, 0x71, 0xbb, 0x52, 0x4a, 0x1f, 0xe1, 0x73, 0xba, 0x68, 0xd8, 0x95, + 0x52, 0x70, 0xec, 0xab, 0xc1, 0x3e, 0x46, 0x5e, 0x88, 0xce, 0x0a, 0x67, 0xdb, 0x01, 0x57, 0x99, + 0x5f, 0x33, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, 0x87, 0x3f, 0x6c, 0x8d, 0x77, 0x2c, 0xfa, + 0x22, 0xcc, 0x27, 0x77, 0xa1, 0xdc, 0x6f, 0x3e, 0xbe, 0x3e, 0x09, 0x17, 0x6e, 0xb5, 0x5c, 0x2f, + 0x9d, 0x2d, 0x2a, 0x2b, 0xd9, 0xb6, 0x35, 0x6a, 0xb2, 0xed, 0x38, 0x9e, 0x4b, 0x66, 0x33, 0xcf, + 0x8e, 0xe7, 0x52, 0xa9, 0xce, 0x93, 0xb8, 0xe4, 0x4f, 0x2d, 0x78, 0xda, 0x69, 0x8a, 0x73, 0x81, + 0xd3, 0x96, 0xa5, 0x46, 0x8e, 0x5b, 0x39, 0xa3, 0xc3, 0x31, 0x77, 0xf9, 0xfe, 0x8f, 0x5f, 0xa9, + 0x9c, 0xc0, 0x55, 0xf4, 0xf8, 0x8f, 0xc9, 0x2f, 0x78, 0xfa, 0x24, 0x54, 0x3c, 0x51, 0x7c, 0xf2, + 0xb7, 0x61, 0x21, 0xf1, 0xc1, 0xd2, 0x12, 0x5e, 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0xb8, + 0xcb, 0x6f, 0xc1, 0x47, 0x1f, 0x29, 0xe7, 0x48, 0x83, 0xed, 0xab, 0x16, 0x94, 0x84, 0x5d, 0x1b, + 0xe9, 0x6e, 0xca, 0x09, 0x33, 0x75, 0xf2, 0xae, 0xd4, 0x36, 0x32, 0x9c, 0x30, 0xd9, 0x5a, 0xbe, + 0xef, 0x7a, 0x4d, 0xd9, 0xcb, 0x7a, 0x2d, 0x7f, 0xd3, 0xf5, 0x9a, 0xc8, 0x21, 0x7a, 0xb5, 0x2f, + 0x0c, 0xb4, 0x37, 0xfd, 0x8a, 0x05, 0xf3, 0x3c, 0x06, 0x36, 0x3e, 0x13, 0xbe, 0xa2, 0x9d, 0x8d, + 0x84, 0x18, 0x57, 0x92, 0xce, 0x46, 0x0f, 0x8f, 0xca, 0xb3, 0x22, 0x6a, 0x36, 0xe9, 0x7b, 0xf4, + 0x79, 0x69, 0x48, 0xe2, 0x2e, 0x51, 0x13, 0x23, 0xdb, 0x39, 0xb4, 0xa1, 0xb5, 0xae, 0x88, 0x60, + 0x4c, 0xcf, 0x7e, 0x0f, 0xe6, 0xcc, 0x60, 0x16, 0xf2, 0x0a, 0xcc, 0x76, 0x5d, 0xaf, 0x95, 0x0c, + 0x7a, 0xd4, 0xc6, 0xf6, 0x5a, 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, 0x29, 0x1b, 0x7d, + 0xcd, 0x37, 0xab, 0xc5, 0x7f, 0x78, 0x8e, 0xed, 0x8c, 0xa0, 0xa9, 0xdc, 0x73, 0x6c, 0x67, 0xf0, + 0xf8, 0xd1, 0xe5, 0xd8, 0xce, 0x12, 0xe6, 0xff, 0xae, 0x1c, 0xdb, 0x3f, 0x09, 0xa3, 0x26, 0x57, + 0x64, 0xfb, 0xdd, 0x7d, 0x33, 0x30, 0x5d, 0xb7, 0xb8, 0x8c, 0x4c, 0x97, 0x50, 0xfb, 0x7d, 0x36, + 0x6d, 0xf4, 0xa1, 0xb6, 0xd2, 0x8b, 0xf6, 0x88, 0x07, 0xc5, 0xd0, 0x6d, 0x1d, 0xbc, 0x9c, 0x93, + 0x4d, 0x9b, 0x91, 0x92, 0x2f, 0x36, 0xc4, 0x01, 0xb1, 0xac, 0x10, 0x05, 0x1b, 0xfb, 0x2f, 0x2c, + 0x58, 0x4c, 0x9f, 0xbc, 0xf3, 0x76, 0x6a, 0x20, 0xdf, 0xb0, 0x60, 0xde, 0xe9, 0x45, 0x7b, 0xd4, + 0x8b, 0xd4, 0xc5, 0x56, 0x2e, 0x6f, 0x7b, 0x24, 0xdb, 0xce, 0x48, 0x61, 0x95, 0xe0, 0x85, 0x29, + 0xde, 0xf6, 0x27, 0x60, 0xc4, 0x0c, 0x91, 0xf6, 0x35, 0x20, 0xe8, 0xb7, 0xdb, 0x3b, 0x4e, 0x63, + 0xff, 0xae, 0xeb, 0x35, 0xfd, 0xfb, 0x7c, 0xf9, 0x58, 0x85, 0x52, 0x20, 0xc3, 0x04, 0x43, 0xd9, + 0xd3, 0x7a, 0xfd, 0x51, 0xf1, 0x83, 0x21, 0xc6, 0x38, 0xf6, 0x1f, 0x4e, 0xc0, 0xb4, 0x8c, 0x69, + 0x7d, 0x0c, 0xee, 0xea, 0xfb, 0x89, 0x7b, 0xcc, 0x8d, 0x5c, 0x42, 0x71, 0x07, 0xfa, 0xaa, 0x87, + 0x29, 0x5f, 0xf5, 0x37, 0xf3, 0x61, 0x77, 0xb2, 0xa3, 0xfa, 0x1f, 0x14, 0x61, 0x21, 0x15, 0x23, + 0xcc, 0x74, 0xc8, 0x3e, 0xff, 0xcc, 0x3b, 0xb9, 0x86, 0x21, 0xeb, 0xf8, 0x8b, 0x93, 0x5d, 0x35, + 0xc3, 0x44, 0x3e, 0xdf, 0xdb, 0xb9, 0x3d, 0x55, 0xf0, 0xd7, 0xa9, 0x7d, 0x47, 0x74, 0x3d, 0x24, + 0xdf, 0xb1, 0xe0, 0x82, 0xd3, 0xff, 0xd6, 0x83, 0xb4, 0x75, 0xdd, 0xce, 0xfd, 0x11, 0x89, 0xea, + 0x53, 0x52, 0xc8, 0xac, 0x27, 0x35, 0x30, 0x4b, 0x14, 0xfb, 0xbf, 0x58, 0xf0, 0xe4, 0xc0, 0x68, + 0x77, 0x9e, 0x2c, 0x29, 0x48, 0x42, 0xe5, 0x9a, 0x91, 0x73, 0x4e, 0x0f, 0x7d, 0xef, 0x99, 0xce, + 0x6f, 0x93, 0x66, 0x4f, 0x5e, 0x86, 0x39, 0xae, 0x57, 0xb1, 0xd5, 0x33, 0xa2, 0x5d, 0x79, 0x6d, + 0xc3, 0x0d, 0xf8, 0x75, 0xa3, 0x1c, 0x13, 0x58, 0xf6, 0x77, 0x2c, 0x58, 0x1a, 0x94, 0x3a, 0x67, + 0x08, 0xa3, 0xc2, 0xdf, 0x4a, 0xb9, 0xfc, 0x97, 0xfb, 0x5c, 0xfe, 0x53, 0x66, 0x05, 0xe5, 0xdd, + 0x6f, 0x9c, 0xe8, 0x0b, 0x8f, 0xf0, 0x68, 0xff, 0xa6, 0x05, 0x97, 0x07, 0x4c, 0xf8, 0xbe, 0xd0, + 0x0f, 0xeb, 0xd4, 0xa1, 0x1f, 0x13, 0xc3, 0x86, 0x7e, 0xd8, 0x7f, 0x54, 0x80, 0x45, 0x29, 0x4f, + 0xac, 0x5c, 0xbf, 0x9a, 0x08, 0x9c, 0xf8, 0xb1, 0x54, 0xe0, 0xc4, 0xc5, 0x34, 0xfe, 0x5f, 0x47, + 0x4d, 0x7c, 0xb8, 0xa2, 0x26, 0xfe, 0x6a, 0x02, 0x2e, 0x65, 0x66, 0xf4, 0x21, 0x5f, 0xcf, 0xd8, + 0xbd, 0xee, 0xe6, 0x9c, 0x3a, 0x68, 0xc8, 0xfd, 0x6b, 0xdc, 0x50, 0x83, 0x5f, 0x32, 0x5d, 0xfc, + 0xc5, 0x6e, 0xb4, 0x7b, 0x06, 0x49, 0x90, 0x46, 0xf4, 0xf6, 0xb7, 0x7f, 0xbe, 0x00, 0xcf, 0x0f, + 0x4b, 0xe8, 0x43, 0x1a, 0x0d, 0x16, 0x26, 0xa2, 0xc1, 0x1e, 0x93, 0x66, 0x71, 0x26, 0x81, 0x61, + 0xff, 0x7c, 0x52, 0x6f, 0x7b, 0xfd, 0xe3, 0x73, 0xa8, 0x3b, 0xfe, 0x69, 0xa6, 0x7d, 0xaa, 0xac, + 0xc0, 0xf1, 0x52, 0x38, 0x5d, 0x17, 0xc5, 0x0f, 0x8f, 0xca, 0xe7, 0xe3, 0xbc, 0x12, 0xb2, 0x10, + 0x55, 0x25, 0xf2, 0x3c, 0xcc, 0x04, 0x02, 0xaa, 0xe2, 0x5f, 0xa4, 0xa3, 0x84, 0x28, 0x43, 0x0d, + 0x25, 0x5f, 0x36, 0xd4, 0xf5, 0xc9, 0xb3, 0x4a, 0x9f, 0x72, 0x92, 0xff, 0xc7, 0x3b, 0x30, 0x13, + 0xaa, 0x8c, 0xbd, 0x42, 0x71, 0x79, 0x69, 0xc8, 0xb0, 0x2a, 0x76, 0x6e, 0x56, 0xe9, 0x7b, 0xc5, + 0xf7, 0xe9, 0xe4, 0xbe, 0x9a, 0x24, 0xb1, 0xf5, 0x91, 0x55, 0xd8, 0xa7, 0xa1, 0xff, 0xb8, 0x4a, + 0x22, 0x98, 0x96, 0x8f, 0x14, 0xca, 0x8b, 0xb3, 0xad, 0x9c, 0x42, 0x28, 0xa4, 0x83, 0x2d, 0xbf, + 0x9e, 0x54, 0xa6, 0x13, 0xc5, 0xca, 0xfe, 0xbe, 0x05, 0xb3, 0x72, 0x8c, 0x3c, 0x86, 0xf8, 0xb2, + 0x7b, 0xc9, 0xf8, 0xb2, 0x6b, 0xb9, 0xac, 0x58, 0x03, 0x82, 0xcb, 0xee, 0xc1, 0x9c, 0x99, 0x4a, + 0x8e, 0x7c, 0xce, 0x58, 0x71, 0xad, 0x71, 0x92, 0x33, 0xa9, 0x35, 0x39, 0x5e, 0x8d, 0xed, 0xdf, + 0x28, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x27, 0x8e, 0x7c, 0x73, 0xe0, 0x4d, 0xe4, + 0x3f, 0xf0, 0x6e, 0xc3, 0x8c, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xac, 0xe9, 0x71, 0xcb, 0x34, 0x10, + 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0xaa, 0xfb, 0x50, 0x2f, 0xd7, 0x9a, 0x0c, 0x79, 0x17, 0x66, + 0xef, 0xfb, 0xc1, 0x7e, 0xdb, 0x77, 0x78, 0xbe, 0x70, 0xc8, 0xe3, 0x92, 0x57, 0xdb, 0x58, 0x45, + 0xd8, 0xc3, 0xdd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0x16, 0x3a, 0xae, 0x87, 0xd4, 0x69, 0xea, + 0x30, 0xb2, 0x49, 0x91, 0xa2, 0x58, 0xa9, 0xd6, 0x5b, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0xb5, 0x24, + 0x48, 0x58, 0x1b, 0x64, 0x1e, 0xd2, 0xda, 0xf8, 0x83, 0x31, 0x69, 0xc1, 0x10, 0x7e, 0xff, 0xc9, + 0x72, 0x4c, 0xf1, 0x26, 0x5f, 0x82, 0x99, 0x50, 0xe6, 0x89, 0xcb, 0xc7, 0x3b, 0x40, 0x9f, 0xed, + 0x05, 0xd1, 0xb8, 0x2b, 0x55, 0x09, 0x6a, 0x86, 0x64, 0x13, 0x2e, 0x2a, 0xf3, 0x49, 0xe2, 0x4d, + 0xa7, 0xa9, 0x38, 0xad, 0x10, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0x53, 0xe5, 0x78, 0x8a, 0x46, 0x71, + 0xa9, 0x66, 0xdc, 0x43, 0xf1, 0xf9, 0xd7, 0x44, 0x09, 0x3d, 0x29, 0x4a, 0x72, 0x66, 0x8c, 0x28, + 0xc9, 0x3a, 0x5c, 0x4a, 0x83, 0x78, 0xbe, 0x28, 0x9e, 0xa2, 0xca, 0xd8, 0x42, 0x6b, 0x59, 0x48, + 0x98, 0x5d, 0x97, 0xdc, 0x85, 0x52, 0x40, 0xf9, 0x21, 0xab, 0xa2, 0xfc, 0x91, 0x46, 0xf6, 0xbc, + 0x44, 0x45, 0x00, 0x63, 0x5a, 0xac, 0xdf, 0x9d, 0x64, 0xd2, 0xe0, 0xdb, 0x39, 0x3e, 0x26, 0x2a, + 0xfb, 0x7e, 0x40, 0x1e, 0x37, 0xfb, 0x07, 0xf3, 0x70, 0x2e, 0x61, 0x03, 0x22, 0xcf, 0x42, 0x91, + 0x27, 0xd0, 0xe2, 0xab, 0xd5, 0x4c, 0xbc, 0xa2, 0x8a, 0xc6, 0x11, 0x30, 0xf2, 0x0b, 0x16, 0x2c, + 0x74, 0x13, 0xf7, 0x10, 0x6a, 0x21, 0x1f, 0xd7, 0xd2, 0x98, 0x20, 0x6a, 0xa4, 0xdb, 0x4f, 0x32, + 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0xf7, 0xe5, 0x36, 0x0d, 0x38, 0xb6, 0x54, 0xf4, 0x34, 0x89, + 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, 0x8d, 0xf3, 0x5c, 0x5d, 0x45, 0x11, 0xc0, + 0x98, 0x16, 0x79, 0x1d, 0xe6, 0x65, 0xae, 0xd8, 0x9a, 0xdf, 0xbc, 0xe1, 0x84, 0x7b, 0xf2, 0x84, + 0xa3, 0x4f, 0x64, 0x6b, 0x09, 0x28, 0xa6, 0xb0, 0xf9, 0xb7, 0xc5, 0x09, 0x79, 0x39, 0x81, 0xa9, + 0xe4, 0x6b, 0x04, 0x6b, 0x49, 0x30, 0xa6, 0xf1, 0xc9, 0x0b, 0xc6, 0x36, 0x24, 0x2e, 0xba, 0xf5, + 0x6a, 0x90, 0xb1, 0x15, 0x55, 0x60, 0xa1, 0xc7, 0x0f, 0x84, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, + 0xbc, 0x93, 0x04, 0x63, 0x1a, 0x9f, 0xbc, 0x06, 0xe7, 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xe2, 0xf6, + 0x5b, 0x5f, 0x6e, 0xa2, 0x09, 0xc4, 0x24, 0x2e, 0x79, 0x03, 0xce, 0xc7, 0xa9, 0x15, 0x15, 0x01, + 0x71, 0x1d, 0xae, 0xf3, 0x7c, 0x55, 0xd2, 0x08, 0xd8, 0x5f, 0x87, 0xfc, 0x5d, 0x58, 0x34, 0x5a, + 0x62, 0xc3, 0x6b, 0xd2, 0x07, 0x32, 0xfd, 0x1d, 0x7f, 0x66, 0x66, 0x2d, 0x05, 0xc3, 0x3e, 0x6c, + 0xf2, 0x69, 0x98, 0x6f, 0xf8, 0xed, 0x36, 0x5f, 0xe3, 0x44, 0x26, 0x7c, 0x91, 0xe7, 0x4e, 0x64, + 0x04, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x02, 0xf1, 0x77, 0x98, 0x7a, 0x45, 0x9b, 0x6f, 0x88, + 0x77, 0xcb, 0x99, 0xc6, 0x71, 0x2e, 0x19, 0x3c, 0xf1, 0x56, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x69, + 0xc2, 0x8c, 0x60, 0xd3, 0xf9, 0x3c, 0x9e, 0x6e, 0x4b, 0x9b, 0x2f, 0x1e, 0x19, 0x69, 0x1a, 0xc0, + 0x94, 0x88, 0x65, 0xc9, 0x27, 0xe1, 0x9d, 0x99, 0x14, 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, + 0xe4, 0x67, 0xa1, 0xb4, 0xa3, 0x5e, 0x48, 0xe0, 0x59, 0xee, 0xc6, 0xde, 0x17, 0x53, 0x8f, 0x7d, + 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x0e, 0x66, 0x6f, 0xd4, 0x2a, 0x7a, 0x14, 0x9e, + 0xe7, 0xbd, 0x3f, 0xc9, 0xaa, 0xa0, 0x09, 0x60, 0x33, 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0xe8, 0x48, + 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0x95, 0x35, 0xd6, 0x97, 0x2e, 0xa4, 0xb0, 0x65, 0x39, 0x6a, 0x0c, + 0xf2, 0x0e, 0xcc, 0xca, 0xfd, 0x82, 0xaf, 0x4d, 0x17, 0x4f, 0x17, 0xc8, 0x8c, 0x31, 0x09, 0x34, + 0xe9, 0xf1, 0x7b, 0x56, 0x9e, 0x38, 0x9e, 0x5e, 0xef, 0xb5, 0xdb, 0x4b, 0x97, 0xf8, 0xba, 0x19, + 0xdf, 0xb3, 0xc6, 0x20, 0x34, 0xf1, 0xc8, 0x4b, 0xca, 0xf5, 0xe8, 0x23, 0x89, 0x8b, 0x67, 0xed, + 0x7a, 0xa4, 0x95, 0xee, 0x01, 0xb1, 0x0e, 0x97, 0x1f, 0xe1, 0xf3, 0xb3, 0x03, 0xcb, 0x4a, 0xe3, + 0xeb, 0x9f, 0x24, 0x4b, 0x4b, 0x09, 0x53, 0xc9, 0xf2, 0xdd, 0x81, 0x98, 0x78, 0x02, 0x15, 0xb2, + 0x03, 0x05, 0xa7, 0xbd, 0xb3, 0xf4, 0x64, 0x1e, 0xaa, 0x6b, 0x65, 0xb3, 0x2a, 0x47, 0x14, 0xf7, + 0x4f, 0xac, 0x6c, 0x56, 0x91, 0x11, 0xb7, 0xbf, 0x32, 0xa1, 0x6f, 0x4f, 0x74, 0x22, 0xe0, 0xf7, + 0xcc, 0x51, 0x6d, 0xe5, 0xf1, 0xce, 0x76, 0xdf, 0x33, 0x22, 0x62, 0x43, 0xca, 0x1c, 0xd3, 0x5d, + 0x3d, 0x8f, 0x73, 0x49, 0xb1, 0x94, 0x4c, 0x72, 0x2c, 0x8e, 0xb4, 0xc9, 0x59, 0x6c, 0xff, 0x36, + 0x68, 0x4b, 0x5c, 0xca, 0x97, 0x26, 0x80, 0xa2, 0x1b, 0x46, 0xae, 0x9f, 0x63, 0xd0, 0x6d, 0x2a, + 0x3b, 0x30, 0xf7, 0xe9, 0xe7, 0x00, 0x14, 0xac, 0x18, 0x4f, 0xaf, 0xe5, 0x7a, 0x0f, 0xe4, 0xe7, + 0xdf, 0xce, 0xdd, 0x49, 0x46, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, 0x3d, 0x31, 0xd2, 0xf2, 0x79, + 0x53, 0x7d, 0xb3, 0x9a, 0xe2, 0x97, 0x18, 0x71, 0x8c, 0x57, 0xd8, 0x71, 0xa5, 0x0e, 0x33, 0x26, + 0xaf, 0xfa, 0xd6, 0x46, 0x16, 0xaf, 0xfa, 0xd6, 0x06, 0x32, 0x26, 0xe4, 0x6b, 0x16, 0x80, 0xd3, + 0xd9, 0x71, 0xc2, 0xd0, 0x69, 0x6a, 0x93, 0xc9, 0x98, 0x59, 0xff, 0x2b, 0x9a, 0x5e, 0x8a, 0x35, + 0x77, 0x0b, 0x8d, 0xa1, 0x68, 0x70, 0x26, 0xef, 0xc2, 0xb4, 0x23, 0xde, 0x17, 0x93, 0x1e, 0xce, + 0xf9, 0x3c, 0x9a, 0x97, 0x92, 0x80, 0xdb, 0x4e, 0x24, 0x08, 0x15, 0x43, 0xc6, 0x3b, 0x0a, 0x1c, + 0xba, 0xeb, 0xee, 0x4b, 0x8b, 0x4d, 0x7d, 0xec, 0xc4, 0xff, 0x8c, 0x58, 0x16, 0x6f, 0x09, 0x42, + 0xc5, 0x50, 0xbc, 0xf7, 0xec, 0x78, 0x8e, 0x8e, 0x5b, 0xcb, 0x27, 0xba, 0xd1, 0x8c, 0x84, 0x33, + 0xde, 0x7b, 0x36, 0x19, 0x61, 0x92, 0x2f, 0x39, 0x80, 0x29, 0x87, 0xbf, 0x7c, 0x28, 0xcf, 0x47, + 0x98, 0xc7, 0x2b, 0x8a, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, 0x5f, 0x51, 0x72, 0x23, 0xbf, 0x6a, + 0xc1, 0xb4, 0x70, 0xbe, 0x65, 0x5a, 0x22, 0xfb, 0xf6, 0x2f, 0x9e, 0x41, 0x96, 0x71, 0xe9, 0x18, + 0x2c, 0x5d, 0x69, 0x7e, 0x42, 0x7b, 0x16, 0x8a, 0xd2, 0x13, 0x5d, 0x83, 0x95, 0x74, 0xcb, 0x9f, + 0x86, 0x39, 0x93, 0xca, 0x48, 0xce, 0xc1, 0x7f, 0x5e, 0x00, 0xe0, 0x0d, 0x2d, 0x32, 0x55, 0x74, + 0x78, 0x4a, 0xd4, 0x3d, 0xbf, 0x99, 0xcf, 0x93, 0x95, 0x66, 0xc2, 0x09, 0x90, 0xf9, 0x4f, 0xf7, + 0xfc, 0x26, 0x4a, 0x26, 0xa4, 0x05, 0x93, 0x5d, 0x27, 0xda, 0xcb, 0x3f, 0xbb, 0xc5, 0x8c, 0x08, + 0xd9, 0x8c, 0xf6, 0x90, 0x33, 0x20, 0xef, 0x5b, 0x30, 0x2d, 0xf2, 0x5b, 0xa8, 0xdb, 0x8c, 0xb1, + 0xbd, 0x0a, 0x54, 0x9b, 0xad, 0x88, 0x24, 0x1a, 0xb2, 0x07, 0xb5, 0xe2, 0x21, 0x4b, 0x51, 0xb1, + 0x5d, 0xfe, 0xc0, 0x82, 0x39, 0x13, 0x35, 0xa3, 0x9b, 0x7e, 0xda, 0xec, 0xa6, 0x3c, 0xdb, 0xc3, + 0xec, 0xf1, 0xff, 0x6e, 0x81, 0xf1, 0x06, 0x79, 0xec, 0x03, 0x6d, 0x0d, 0xed, 0x03, 0x3d, 0x31, + 0xa2, 0x0f, 0x74, 0x61, 0x24, 0x1f, 0xe8, 0xc9, 0xd1, 0x7d, 0xa0, 0x8b, 0x83, 0x7d, 0xa0, 0xed, + 0x6f, 0x59, 0x70, 0xbe, 0x6f, 0xb7, 0x61, 0xca, 0x69, 0xe0, 0xfb, 0xd1, 0x00, 0xdf, 0x41, 0x8c, + 0x41, 0x68, 0xe2, 0x91, 0x75, 0x58, 0x94, 0x0f, 0x00, 0xd4, 0xbb, 0x6d, 0x37, 0x33, 0xf3, 0xc8, + 0x76, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb6, 0x60, 0xd6, 0x88, 0x57, 0x66, 0xdf, 0xc1, 0xe3, + 0xba, 0xa5, 0x18, 0xb1, 0xab, 0x17, 0xbf, 0x3d, 0x12, 0x30, 0x71, 0x91, 0xd9, 0x32, 0xd2, 0x43, + 0xc7, 0x17, 0x99, 0xac, 0x14, 0x25, 0x54, 0x24, 0xfe, 0xa5, 0x5d, 0xde, 0xe8, 0x05, 0x33, 0xf1, + 0x2f, 0xed, 0x22, 0x87, 0x70, 0x76, 0x4c, 0x4b, 0x97, 0xee, 0xf1, 0xc6, 0x53, 0x0b, 0x4e, 0x10, + 0xa1, 0x80, 0x91, 0x2b, 0x50, 0xa0, 0x5e, 0x53, 0x9a, 0x14, 0xf4, 0x63, 0x88, 0xd7, 0xbc, 0x26, + 0xb2, 0x72, 0xfb, 0x2d, 0x98, 0xab, 0xd3, 0x46, 0x40, 0xa3, 0x37, 0xe9, 0xe1, 0xd0, 0xaf, 0x2b, + 0xb2, 0xd1, 0x9e, 0x7a, 0x5d, 0x91, 0x55, 0x67, 0xe5, 0xf6, 0xbf, 0xb4, 0x20, 0xf5, 0x1e, 0x88, + 0x71, 0xa9, 0x61, 0x0d, 0xbc, 0xd4, 0x30, 0x0d, 0xe1, 0x13, 0x27, 0x1a, 0xc2, 0x6f, 0x02, 0xe9, + 0xb0, 0xa9, 0x90, 0x78, 0xfd, 0x46, 0x5a, 0x73, 0xe2, 0xec, 0x08, 0x7d, 0x18, 0x98, 0x51, 0xcb, + 0xfe, 0x17, 0x42, 0x58, 0xf3, 0x85, 0x90, 0x47, 0x37, 0x40, 0x0f, 0x8a, 0x9c, 0x94, 0x34, 0x69, + 0x8d, 0x69, 0x0e, 0xee, 0xcf, 0x32, 0x14, 0x77, 0xa4, 0x9c, 0xf2, 0x9c, 0x9b, 0xfd, 0x47, 0x42, + 0x56, 0xe3, 0x09, 0x91, 0x21, 0x64, 0xed, 0x24, 0x65, 0xbd, 0x91, 0xd7, 0x5a, 0x99, 0x2d, 0x23, + 0x59, 0x01, 0xe8, 0xd2, 0xa0, 0x41, 0xbd, 0x48, 0x45, 0x6d, 0x14, 0x65, 0xfc, 0xa0, 0x2e, 0x45, + 0x03, 0xc3, 0xfe, 0x26, 0x9b, 0x40, 0xb1, 0x73, 0x24, 0x79, 0x3e, 0xed, 0xf1, 0x98, 0x9e, 0x1c, + 0xda, 0xe1, 0xd1, 0xf0, 0xe5, 0x9f, 0x78, 0x84, 0x2f, 0xff, 0xc7, 0x60, 0x3a, 0xf0, 0xdb, 0xb4, + 0x12, 0x78, 0x69, 0xaf, 0x13, 0x64, 0xc5, 0x78, 0x0b, 0x15, 0xdc, 0xfe, 0x65, 0x0b, 0x16, 0xd3, + 0xc1, 0x46, 0xb9, 0xbb, 0x61, 0x9a, 0x11, 0xd1, 0x85, 0xd1, 0x23, 0xa2, 0xed, 0xf7, 0x99, 0x90, + 0x91, 0xdb, 0xd8, 0x77, 0x3d, 0x11, 0x44, 0xcc, 0x5a, 0xee, 0x63, 0x30, 0x4d, 0xe5, 0xfb, 0x89, + 0xc2, 0x32, 0xab, 0x85, 0x54, 0xcf, 0x26, 0x2a, 0x38, 0xa9, 0xc0, 0x82, 0xba, 0x8f, 0x52, 0xe6, + 0x74, 0x91, 0xfc, 0x40, 0x9b, 0xef, 0xd6, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x5f, 0x86, 0x59, 0x63, + 0x53, 0xe2, 0xeb, 0xf7, 0x03, 0xa7, 0x11, 0xa5, 0xd7, 0xbd, 0x6b, 0xac, 0x10, 0x05, 0x8c, 0x5b, + 0xfd, 0x45, 0x2c, 0x44, 0x6a, 0xdd, 0x93, 0x11, 0x10, 0x12, 0xca, 0x88, 0x05, 0xb4, 0x45, 0x1f, + 0xa8, 0xec, 0xdd, 0x8a, 0x18, 0xb2, 0x42, 0x14, 0x30, 0xfb, 0x05, 0x98, 0x51, 0x29, 0x6a, 0x78, + 0x9e, 0x07, 0x65, 0x91, 0x36, 0xf3, 0x3c, 0xf8, 0x41, 0x84, 0x1c, 0x62, 0xbf, 0x0d, 0x33, 0x2a, + 0x93, 0xce, 0xa3, 0xb1, 0xd9, 0x52, 0x14, 0x7a, 0xee, 0x0d, 0x3f, 0x8c, 0x54, 0xfa, 0x1f, 0x71, + 0x69, 0x76, 0x6b, 0x83, 0x97, 0xa1, 0x86, 0xda, 0x2f, 0xc1, 0x42, 0xea, 0xf2, 0x74, 0x88, 0xa4, + 0x10, 0xbf, 0x57, 0x80, 0x39, 0xf3, 0x0e, 0x6d, 0x88, 0x59, 0x3c, 0xfc, 0xe2, 0x98, 0x71, 0xef, + 0x55, 0x18, 0xf1, 0xde, 0xcb, 0xbc, 0x68, 0x9c, 0x3c, 0xdb, 0x8b, 0xc6, 0x62, 0x3e, 0x17, 0x8d, + 0xc6, 0x85, 0xf8, 0xd4, 0xe3, 0xbb, 0x10, 0xff, 0xad, 0x22, 0xcc, 0x27, 0xb3, 0x0c, 0x0e, 0xd1, + 0x93, 0x2f, 0xf4, 0xf5, 0xe4, 0x88, 0x86, 0xf6, 0xc2, 0xb8, 0x86, 0xf6, 0xc9, 0x71, 0x0d, 0xed, + 0xc5, 0x53, 0x18, 0xda, 0xfb, 0xcd, 0xe4, 0x53, 0x43, 0x9b, 0xc9, 0x3f, 0xa3, 0x5d, 0xe5, 0xa6, + 0x13, 0xbe, 0x25, 0xb1, 0xab, 0x1c, 0x49, 0x76, 0xc3, 0x9a, 0xdf, 0xcc, 0x74, 0x39, 0x9c, 0x79, + 0x84, 0x41, 0x31, 0xc8, 0xf4, 0x6c, 0x1b, 0xfd, 0x2e, 0xef, 0x23, 0x23, 0x78, 0xb5, 0xbd, 0x02, + 0xb3, 0x72, 0x3c, 0x71, 0x15, 0x14, 0x92, 0xea, 0x6b, 0x3d, 0x06, 0xa1, 0x89, 0xc7, 0x1f, 0xa0, + 0x4e, 0xbe, 0xcf, 0xcd, 0xef, 0x2d, 0xcc, 0x07, 0xa8, 0x53, 0xef, 0x79, 0xa7, 0xf1, 0xed, 0x2f, + 0xc1, 0xa5, 0x4c, 0x33, 0x02, 0xb7, 0xab, 0x72, 0xed, 0x88, 0x36, 0x25, 0x82, 0x21, 0x46, 0x2a, + 0x71, 0xfd, 0xf2, 0xdd, 0x81, 0x98, 0x78, 0x02, 0x15, 0xfb, 0x37, 0x0b, 0x30, 0x9f, 0x7c, 0xbd, + 0x90, 0xdc, 0xd7, 0x46, 0xc7, 0x5c, 0xec, 0x9d, 0x82, 0xac, 0x91, 0xb9, 0x6e, 0xe0, 0x0d, 0xc2, + 0x7d, 0x3e, 0xbe, 0x76, 0x74, 0x1a, 0xbd, 0xb3, 0x63, 0x2c, 0x4d, 0xf7, 0x92, 0x1d, 0x7f, 0xa0, + 0x30, 0x0e, 0x72, 0x93, 0xa7, 0xd9, 0xdc, 0xb9, 0xc7, 0x71, 0x67, 0x9a, 0x15, 0x1a, 0x6c, 0xd9, + 0xde, 0x72, 0x40, 0x03, 0x77, 0xd7, 0xd5, 0x2f, 0x2f, 0xf3, 0x95, 0xfb, 0x6d, 0x59, 0x86, 0x1a, + 0x6a, 0xbf, 0x3f, 0x01, 0xf1, 0xab, 0xf4, 0xfc, 0x89, 0xaf, 0xd0, 0x38, 0x39, 0xc8, 0x6e, 0xbb, + 0x39, 0xee, 0x3b, 0x7a, 0x31, 0x45, 0xe9, 0xc6, 0x6c, 0x94, 0x60, 0x82, 0xe3, 0x8f, 0xe0, 0x35, + 0x7a, 0x07, 0x16, 0x52, 0x49, 0x15, 0x72, 0xcf, 0x3c, 0xfa, 0xc3, 0x02, 0x94, 0x74, 0x5a, 0x0a, + 0xf2, 0xa9, 0x84, 0x19, 0xa7, 0x54, 0xfd, 0xa8, 0xf1, 0xfe, 0xcc, 0x9e, 0xdf, 0x7c, 0x78, 0x54, + 0x5e, 0xd0, 0xc8, 0x29, 0x93, 0xcc, 0x15, 0x28, 0xf4, 0x82, 0x76, 0xfa, 0x9c, 0x76, 0x07, 0x37, + 0x91, 0x95, 0x93, 0x07, 0x69, 0x3b, 0xca, 0x56, 0x4e, 0xa9, 0x34, 0xc4, 0x81, 0x66, 0xb0, 0xfd, + 0x84, 0xed, 0x92, 0x3b, 0x7e, 0xf3, 0x30, 0xfd, 0x5e, 0x4d, 0xd5, 0x6f, 0x1e, 0x22, 0x87, 0x90, + 0xd7, 0x61, 0x3e, 0x72, 0x3b, 0xd4, 0xef, 0x45, 0xe6, 0x2b, 0xde, 0x85, 0xf8, 0x46, 0x7c, 0x3b, + 0x01, 0xc5, 0x14, 0x36, 0xdb, 0x65, 0xef, 0x85, 0xbe, 0xc7, 0xf3, 0xc9, 0x4e, 0x25, 0xaf, 0xcf, + 0x6e, 0xd6, 0xdf, 0xba, 0xc5, 0xcd, 0x49, 0x1a, 0x83, 0x61, 0xbb, 0x3c, 0x52, 0x3a, 0xa0, 0xd2, + 0x21, 0x65, 0x31, 0xd6, 0xc7, 0x45, 0x39, 0x6a, 0x0c, 0xb2, 0x2e, 0x68, 0x33, 0x69, 0xf9, 0x8e, + 0x32, 0x57, 0x7d, 0x5e, 0xd1, 0x65, 0x65, 0x0f, 0x8f, 0x4e, 0x30, 0xf4, 0xe9, 0x9a, 0xf6, 0x1d, + 0x58, 0x48, 0x35, 0x98, 0x3a, 0x57, 0x5b, 0xd9, 0xe7, 0xea, 0xe1, 0x9e, 0x98, 0xf9, 0xd7, 0x16, + 0x9c, 0xef, 0x5b, 0x02, 0x86, 0x8d, 0x83, 0x4b, 0x6f, 0x46, 0x13, 0xa7, 0xdf, 0x8c, 0x0a, 0xa3, + 0x6d, 0x46, 0xd5, 0x9d, 0xef, 0xfe, 0xe0, 0xea, 0x13, 0xdf, 0xfb, 0xc1, 0xd5, 0x27, 0xfe, 0xf8, + 0x07, 0x57, 0x9f, 0x78, 0xff, 0xf8, 0xaa, 0xf5, 0xdd, 0xe3, 0xab, 0xd6, 0xf7, 0x8e, 0xaf, 0x5a, + 0x7f, 0x7c, 0x7c, 0xd5, 0xfa, 0xcf, 0xc7, 0x57, 0xad, 0x6f, 0xfd, 0xf0, 0xea, 0x13, 0x9f, 0xfb, + 0x4c, 0x3c, 0x40, 0x57, 0xd5, 0x00, 0xe5, 0x3f, 0x3e, 0xae, 0x86, 0xe3, 0x6a, 0x77, 0xbf, 0xb5, + 0xca, 0x06, 0xe8, 0xaa, 0x2e, 0x51, 0x03, 0xf4, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x73, + 0x4f, 0x0a, 0xe4, 0x9d, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7626,6 +7691,39 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) MarshalToSizedBuffer(d return len(dAtA) - i, nil } +func (m *PrometheusAuth) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PrometheusAuth) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PrometheusAuth) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Sigv4.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + return len(dAtA) - i, nil +} + func (m *PrometheusMetric) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7646,6 +7744,16 @@ func (m *PrometheusMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Authentication.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a i -= len(m.Query) copy(dAtA[i:], m.Query) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Query))) @@ -9218,6 +9326,44 @@ func (m *SetMirrorRoute) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Sigv4Config) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sigv4Config) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sigv4Config) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.RoleARN) + copy(dAtA[i:], m.RoleARN) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.RoleARN))) + i-- + dAtA[i] = 0x1a + i -= len(m.Profile) + copy(dAtA[i:], m.Profile) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Profile))) + i-- + dAtA[i] = 0x12 + i -= len(m.Region) + copy(dAtA[i:], m.Region) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Region))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *SkyWalkingMetric) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11340,6 +11486,17 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Size() (n int) { return n } +func (m *PrometheusAuth) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Sigv4.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PrometheusMetric) Size() (n int) { if m == nil { return 0 @@ -11350,6 +11507,8 @@ func (m *PrometheusMetric) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Query) n += 1 + l + sovGenerated(uint64(l)) + l = m.Authentication.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -11912,6 +12071,21 @@ func (m *SetMirrorRoute) Size() (n int) { return n } +func (m *Sigv4Config) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Region) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Profile) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.RoleARN) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *SkyWalkingMetric) Size() (n int) { if m == nil { return 0 @@ -13265,6 +13439,16 @@ func (this *PreferredDuringSchedulingIgnoredDuringExecution) String() string { }, "") return s } +func (this *PrometheusAuth) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PrometheusAuth{`, + `Sigv4:` + strings.Replace(strings.Replace(this.Sigv4.String(), "Sigv4Config", "Sigv4Config", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *PrometheusMetric) String() string { if this == nil { return "nil" @@ -13272,6 +13456,7 @@ func (this *PrometheusMetric) String() string { s := strings.Join([]string{`&PrometheusMetric{`, `Address:` + fmt.Sprintf("%v", this.Address) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, + `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "PrometheusAuth", "PrometheusAuth", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -13701,6 +13886,18 @@ func (this *SetMirrorRoute) String() string { }, "") return s } +func (this *Sigv4Config) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Sigv4Config{`, + `Region:` + fmt.Sprintf("%v", this.Region) + `,`, + `Profile:` + fmt.Sprintf("%v", this.Profile) + `,`, + `RoleARN:` + fmt.Sprintf("%v", this.RoleARN) + `,`, + `}`, + }, "") + return s +} func (this *SkyWalkingMetric) String() string { if this == nil { return "nil" @@ -26244,6 +26441,89 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Unmarshal(dAtA []byte) } return nil } +func (m *PrometheusAuth) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PrometheusAuth: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PrometheusAuth: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sigv4", 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 err := m.Sigv4.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -26337,6 +26617,39 @@ func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { } m.Query = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authentication", 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 err := m.Authentication.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -31203,6 +31516,152 @@ func (m *SetMirrorRoute) Unmarshal(dAtA []byte) error { } return nil } +func (m *Sigv4Config) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sigv4Config: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sigv4Config: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Region = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Profile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Profile = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RoleARN", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RoleARN = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SkyWalkingMetric) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 1026e00176..639bee70ed 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1120,6 +1120,12 @@ message PreferredDuringSchedulingIgnoredDuringExecution { optional int32 weight = 1; } +// PrometheusMetric defines the prometheus query to perform canary analysis +message PrometheusAuth { + // +optional + optional Sigv4Config sigv4 = 3; +} + // PrometheusMetric defines the prometheus query to perform canary analysis message PrometheusMetric { // Address is the HTTP address and port of the prometheus server @@ -1127,6 +1133,10 @@ message PrometheusMetric { // Query is a raw prometheus query to perform optional string query = 2; + + // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // +optional + optional PrometheusAuth authentication = 3; } // RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution @@ -1618,6 +1628,17 @@ message SetMirrorRoute { optional int32 percentage = 4; } +message Sigv4Config { + // Region is the AWS Region to sign the SigV4 Request + optional string address = 1; + + // Profile is the Credential Profile used to sign the SigV4 Request + optional string profile = 2; + + // RoleARN is the IAM role used to sign the SIgV4 Request + optional string roleArn = 3; +} + message SkyWalkingMetric { optional string address = 1; diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 7ee5eb6403..f4bf7ead1d 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -98,6 +98,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PingPongSpec": schema_pkg_apis_rollouts_v1alpha1_PingPongSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PodTemplateMetadata": schema_pkg_apis_rollouts_v1alpha1_PodTemplateMetadata(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExecution(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth": schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusMetric": schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_RequiredDuringSchedulingIgnoredDuringExecution(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RollbackWindowSpec": schema_pkg_apis_rollouts_v1alpha1_RollbackWindowSpec(ref), @@ -124,6 +125,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetCanaryScale": schema_pkg_apis_rollouts_v1alpha1_SetCanaryScale(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetHeaderRoute": schema_pkg_apis_rollouts_v1alpha1_SetHeaderRoute(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetMirrorRoute": schema_pkg_apis_rollouts_v1alpha1_SetMirrorRoute(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config": schema_pkg_apis_rollouts_v1alpha1_Sigv4Config(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SkyWalkingMetric": schema_pkg_apis_rollouts_v1alpha1_SkyWalkingMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StickinessConfig": schema_pkg_apis_rollouts_v1alpha1_StickinessConfig(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StringMatch": schema_pkg_apis_rollouts_v1alpha1_StringMatch(ref), @@ -3380,6 +3382,27 @@ func schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExe } } +func schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "PrometheusMetric defines the prometheus query to perform canary analysis", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "sigv4": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, + } +} + func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3401,9 +3424,18 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall Format: "", }, }, + "authentication": { + SchemaProps: spec.SchemaProps{ + Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"), + }, + }, }, }, }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"}, } } @@ -4793,6 +4825,39 @@ func schema_pkg_apis_rollouts_v1alpha1_SetMirrorRoute(ref common.ReferenceCallba } } +func schema_pkg_apis_rollouts_v1alpha1_Sigv4Config(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "region": { + SchemaProps: spec.SchemaProps{ + Description: "Region is the AWS Region to sign the SigV4 Request", + Type: []string{"string"}, + Format: "", + }, + }, + "profile": { + SchemaProps: spec.SchemaProps{ + Description: "Profile is the Credential Profile used to sign the SigV4 Request", + Type: []string{"string"}, + Format: "", + }, + }, + "roleArn": { + SchemaProps: spec.SchemaProps{ + Description: "RoleARN is the IAM role used to sign the SIgV4 Request", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_SkyWalkingMetric(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index e9f7e9a05e..ed84121b94 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1895,9 +1895,27 @@ func (in *PreferredDuringSchedulingIgnoredDuringExecution) DeepCopy() *Preferred return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PrometheusAuth) DeepCopyInto(out *PrometheusAuth) { + *out = *in + out.Sigv4 = in.Sigv4 + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusAuth. +func (in *PrometheusAuth) DeepCopy() *PrometheusAuth { + if in == nil { + return nil + } + out := new(PrometheusAuth) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PrometheusMetric) DeepCopyInto(out *PrometheusMetric) { *out = *in + out.Authentication = in.Authentication return } @@ -2614,6 +2632,22 @@ func (in *SetMirrorRoute) DeepCopy() *SetMirrorRoute { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Sigv4Config) DeepCopyInto(out *Sigv4Config) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Sigv4Config. +func (in *Sigv4Config) DeepCopy() *Sigv4Config { + if in == nil { + return nil + } + out := new(Sigv4Config) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SkyWalkingMetric) DeepCopyInto(out *SkyWalkingMetric) { *out = *in From e29713f498a2017e8b83459c4dff610fa8c6d234 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 08:47:45 -0500 Subject: [PATCH 074/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 (#2841) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.25 to 1.18.26. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.25...config/v1.18.26) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 41 ++++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 483b262228..204841b650 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.12.5 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.25 + github.com/aws/aws-sdk-go-v2 v1.18.1 + github.com/aws/aws-sdk-go-v2/config v1.18.26 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.25 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 76e249181d..2dadb09918 100644 --- a/go.sum +++ b/go.sum @@ -101,32 +101,35 @@ 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.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.25 h1:JuYyZcnMPBiFqn87L2cRppo+rNwgah6YwD3VuyvaW6Q= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24 h1:PjiYyls3QdCrzqUN35jMWtUK1vqVZ+zLfdOa/UPFDp0= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= +github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= +github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/config v1.18.26 h1:ivCHcSmKd1+9rBlqVsxZHB35eCW88KWbMdG2VL3BuBw= +github.com/aws/aws-sdk-go-v2/config v1.18.26/go.mod h1:NVmd//z/PNl7U+ZU2EnuffxOA060JWzgbH3BnqQrUoY= +github.com/aws/aws-sdk-go-v2/credentials v1.13.25 h1:5wROoMcUC7nAE66e0b3IIht6Tos76M4HC+GQw8MeqxU= +github.com/aws/aws-sdk-go-v2/credentials v1.13.25/go.mod h1:W9I2660WXSwZQ23mM1Ks72+UGeyirIxuU7/KzN7daeA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 h1:sSzrsKQULJmPtmu6By4wR6g0701nGqonssKOy35uOd0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLmhIEL5e3o+tY9JsLFSAxmjgM8gI7W2+CPrpw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGXsLBI6al083tpjJzY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 h1:2DQLAKDteoEDI8zpCzqBMaZlJuoE9iTYD0gFmXVax9E= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 h1:cNrMc266RsZJ8V1u1OQQONKcf9HmfxQFqgcpY7ZJBhY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.11/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 h1:h2VhtCE5PBiJefmlVCjJRSzBfFcQeAE10SXIGkXw1jQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 h1:ehPTnLR/es8TL1fpBfq8qw9cAwOpQr47fLmZD9yhHjk= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.1/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 9d98d14ae63ead2b27e665987581fbc63a991928 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 08:49:39 -0500 Subject: [PATCH 075/159] chore(deps): bump docker/build-push-action from 4.1.0 to 4.1.1 (#2837) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/44ea916f6c540f9302d50c2b1e5a8dc071f15cdf...2eb1c1961a95fc15694676618e422e8ba1d63825) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index adab037aca..f2171f099f 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf #v4.1.0 + uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 #v4.1.1 with: context: . platforms: ${{ inputs.platforms }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8485e97a02..8afadbcc11 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -84,7 +84,7 @@ jobs: password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Build and push (controller-image) - uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf # v4.1.0 + uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 with: context: . platforms: linux/amd64,linux/arm64 @@ -94,7 +94,7 @@ jobs: sbom: false - name: Build and push (plugin-image) - uses: docker/build-push-action@44ea916f6c540f9302d50c2b1e5a8dc071f15cdf # v4.1.0 + uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 with: context: . target: kubectl-argo-rollouts From 194c656929f018530d033139269d9f7eeb53306f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 09:25:36 -0500 Subject: [PATCH 076/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 (#2840) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.26.0 to 1.26.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.0...service/s3/v1.26.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 204841b650..dfaa3f03e8 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.1 github.com/aws/aws-sdk-go-v2/config v1.18.26 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 2dadb09918..7769931816 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKK github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0 h1:sSzrsKQULJmPtmu6By4wR6g0701nGqonssKOy35uOd0= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.0/go.mod h1:t5mizLPjCYafXoHCXOHJU7z4OvLbY70Echvb1ciBTV4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 h1:UArzbycq+0HyRYuJvEXrFGMuc6yB/p58H1BAUsjkvuM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLmhIEL5e3o+tY9JsLFSAxmjgM8gI7W2+CPrpw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= From ded934bdaaee0dbaf16585d5a5cbafe6ec4212f5 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 14 Jun 2023 12:11:40 -0500 Subject: [PATCH 077/159] feat: add merge key to analysis template (#2842) add merge key to analysis templates Signed-off-by: zachaller --- .../features/kustomize/rollout_cr_schema.json | 48 +++++++++++++++++++ pkg/apiclient/rollout/rollout.swagger.json | 2 +- pkg/apis/rollouts/v1alpha1/generated.proto | 2 + .../rollouts/v1alpha1/openapi_generated.go | 12 +++++ pkg/apis/rollouts/v1alpha1/types.go | 6 ++- 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index d980188a93..9d11edb202 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -17124,6 +17124,22 @@ "type": "array", "x-kubernetes-patch-merge-key": "metricName", "x-kubernetes-patch-strategy": "merge" + }, + "templates": { + "items": { + "properties": { + "clusterScope": { + "type": "boolean" + }, + "templateName": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" @@ -17204,6 +17220,22 @@ "type": "array", "x-kubernetes-patch-merge-key": "metricName", "x-kubernetes-patch-strategy": "merge" + }, + "templates": { + "items": { + "properties": { + "clusterScope": { + "type": "boolean" + }, + "templateName": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" @@ -17292,6 +17324,22 @@ "type": "array", "x-kubernetes-patch-merge-key": "metricName", "x-kubernetes-patch-strategy": "merge" + }, + "templates": { + "items": { + "properties": { + "clusterScope": { + "type": "boolean" + }, + "templateName": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index a34dbc3181..68b207b930 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1224,7 +1224,7 @@ "items": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisTemplate" }, - "title": "Templates reference to a list of analysis templates to combine for an AnalysisRun" + "title": "Templates reference to a list of analysis templates to combine for an AnalysisRun\n+patchMergeKey=templateName\n+patchStrategy=merge" }, "args": { "type": "array", diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 639bee70ed..ab5c65258e 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1159,6 +1159,8 @@ message Rollout { // RolloutAnalysis defines a template that is used to create a analysisRun message RolloutAnalysis { // Templates reference to a list of analysis templates to combine for an AnalysisRun + // +patchMergeKey=templateName + // +patchStrategy=merge repeated RolloutAnalysisTemplate templates = 1; // Args the arguments that will be added to the AnalysisRuns diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index f4bf7ead1d..79251e03a0 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3524,6 +3524,12 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysis(ref common.ReferenceCallb Type: []string{"object"}, Properties: map[string]spec.Schema{ "templates": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge", + }, + }, SchemaProps: spec.SchemaProps{ Description: "Templates reference to a list of analysis templates to combine for an AnalysisRun", Type: []string{"array"}, @@ -3620,6 +3626,12 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref common.Refe Type: []string{"object"}, Properties: map[string]spec.Schema{ "templates": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge", + }, + }, SchemaProps: spec.SchemaProps{ Description: "Templates reference to a list of analysis templates to combine for an AnalysisRun", Type: []string{"array"}, diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index bf9209b994..6f93585fd9 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -695,8 +695,10 @@ type RolloutAnalysisBackground struct { // RolloutAnalysis defines a template that is used to create a analysisRun type RolloutAnalysis struct { - //Templates reference to a list of analysis templates to combine for an AnalysisRun - Templates []RolloutAnalysisTemplate `json:"templates,omitempty" protobuf:"bytes,1,rep,name=templates"` + // Templates reference to a list of analysis templates to combine for an AnalysisRun + // +patchMergeKey=templateName + // +patchStrategy=merge + Templates []RolloutAnalysisTemplate `json:"templates,omitempty" patchStrategy:"merge" patchMergeKey:"templateName" protobuf:"bytes,1,rep,name=templates"` // Args the arguments that will be added to the AnalysisRuns // +patchMergeKey=name // +patchStrategy=merge From 9bd26c6b78ddd3140155fc908b987703c9c3896f Mon Sep 17 00:00:00 2001 From: George Miroshnykov Date: Thu, 15 Jun 2023 17:36:23 +0300 Subject: [PATCH 078/159] docs: fix minor mistakes in Migrating to Deployments (#2270) Signed-off-by: George Miroshnykov --- docs/migrating.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/migrating.md b/docs/migrating.md index ee603a2999..62e3494e3d 100644 --- a/docs/migrating.md +++ b/docs/migrating.md @@ -50,11 +50,11 @@ spec: ## Reference Deployment From Rollout -Instead of removing Deployment you can scale-down in to zero and reference from the Rollout resource: +Instead of removing Deployment you can scale it down to zero and reference it from the Rollout resource: 1. Create a Rollout resource. 1. Reference an existing Deployment using `workloadRef` field. -1. Scale-down existing Deployment by changing `replicas` field of an existing Deployment to zero. +1. Scale-down an existing Deployment by changing `replicas` field of an existing Deployment to zero. 1. To perform an update, the change should be made to the Pod template field of the Deployment. Below is an example of a Rollout resource referencing a Deployment. @@ -150,7 +150,8 @@ When converting a Rollout to a Deployment, it involves changing three fields: When a rollout is referencing to a deployment: -1. Scale-up the Deployment by changing `replicas` field of an existing Rollout to zero. -1. Scale-down existing Rollout by changing `replicas` field of an existing Rollout to zero. +1. Scale-up an existing Deployment by changing its `replicas` field to a desired number of pods. +1. Wait for the Deployment pods to become Ready. +1. Scale-down an existing Rollout by changing its `replicas` field to zero. Please refer to [Running Rollout and Deployment side-by-side](#running-rollout-and-deployment-side-by-side) and [Traffic Management During Migration](#traffic-management-during-migration) for caveats. From 4e28aebd6bd94bdada401d0a3ab462dc00aa120a Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 15 Jun 2023 11:21:37 -0500 Subject: [PATCH 079/159] fix: resolve args to metric in garbage collection function (#2843) * resolve args to metric in garbage collection function Signed-off-by: zachaller * remove incorrectly added test, this moved to a function Signed-off-by: zachaller * re-trigger Signed-off-by: zachaller * add context to errors Signed-off-by: zachaller * better error message Signed-off-by: zachaller * better error message Signed-off-by: zachaller --------- Signed-off-by: zachaller --- analysis/analysis.go | 7 ++- analysis/analysis_test.go | 98 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/analysis/analysis.go b/analysis/analysis.go index c826280d19..fb307e62e0 100644 --- a/analysis/analysis.go +++ b/analysis/analysis.go @@ -711,8 +711,13 @@ func calculateNextReconcileTime(run *v1alpha1.AnalysisRun, metrics []v1alpha1.Me func (c *Controller) garbageCollectMeasurements(run *v1alpha1.AnalysisRun, measurementRetentionMetricNamesMap map[string]*v1alpha1.MeasurementRetention, limit int) error { var errors []error + resolvedArgsMetric, err := getResolvedMetricsWithoutSecrets(run.Spec.Metrics, run.Spec.Args) + if err != nil { + return fmt.Errorf("failed to resolve args on metrics during garbage collection: %w", err) + } + metricsByName := make(map[string]v1alpha1.Metric) - for _, metric := range run.Spec.Metrics { + for _, metric := range resolvedArgsMetric { metricsByName[metric.Name] = metric } diff --git a/analysis/analysis_test.go b/analysis/analysis_test.go index ed12da2dca..cec3446b89 100644 --- a/analysis/analysis_test.go +++ b/analysis/analysis_test.go @@ -8,6 +8,8 @@ import ( "testing" "time" + "github.com/argoproj/argo-rollouts/metric" + log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -1099,6 +1101,102 @@ func TestTrimMeasurementHistory(t *testing.T) { } } +func TestGarbageCollectArgResolution(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + c.newProvider = func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { + assert.Equal(t, "https://prometheus.kubeaddons:8080", metric.Provider.Prometheus.Address) + return f.provider, nil + } + + f.provider.On("GarbageCollect", mock.Anything, mock.Anything, mock.Anything).Return(nil) + run := &v1alpha1.AnalysisRun{ + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: []v1alpha1.Metric{ + { + Name: "metric1", + Interval: "60s", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: "https://prometheus.kubeaddons:{{args.port}}", + }, + }, + }, + { + Name: "metric2", + Interval: "60s", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: "https://prometheus.kubeaddons:{{args.port}}", + }, + }, + }, + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseRunning, + MetricResults: []v1alpha1.MetricResult{ + { + Name: "metric1", + Phase: v1alpha1.AnalysisPhaseRunning, + Measurements: []v1alpha1.Measurement{ + { + Value: "1", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }, + { + Value: "2", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }, + }, + }, + { + Name: "metric2", + Measurements: []v1alpha1.Measurement{ + { + Value: "2", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }, + { + Value: "3", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-30 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-30 * time.Second))), + }, + { + Value: "4", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-30 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-30 * time.Second))), + }, + }, + }, + }, + }, + } + run.Spec.Args = append(run.Spec.Args, v1alpha1.Argument{ + Name: "port", + Value: pointer.String("8080"), + }) + var measurementRetentionMetricsMap = map[string]*v1alpha1.MeasurementRetention{} + measurementRetentionMetricsMap["metric2"] = &v1alpha1.MeasurementRetention{MetricName: "metric2", Limit: 2} + err := c.garbageCollectMeasurements(run, measurementRetentionMetricsMap, 1) + assert.Nil(t, err) + assert.Len(t, run.Status.MetricResults[0].Measurements, 1) + assert.Equal(t, "2", run.Status.MetricResults[0].Measurements[0].Value) + assert.Len(t, run.Status.MetricResults[1].Measurements, 2) + assert.Equal(t, "3", run.Status.MetricResults[1].Measurements[0].Value) + assert.Equal(t, "4", run.Status.MetricResults[1].Measurements[1].Value) +} + func TestResolveMetricArgsUnableToSubstitute(t *testing.T) { f := newFixture(t) defer f.Close() From 2cd6e04e9ffda5e1a9a6e28f283649835a9397c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 12:22:09 -0500 Subject: [PATCH 080/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 (#2839) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.11 to 1.19.12. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.11...service/efs/v1.19.12) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index dfaa3f03e8..7a30083d29 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.18.1 github.com/aws/aws-sdk-go-v2/config v1.18.26 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index 7769931816..d612e00d9c 100644 --- a/go.sum +++ b/go.sum @@ -101,7 +101,6 @@ 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.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.26 h1:ivCHcSmKd1+9rBlqVsxZHB35eCW88KWbMdG2VL3BuBw= @@ -110,18 +109,16 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.25 h1:5wROoMcUC7nAE66e0b3IIht6Tos github.com/aws/aws-sdk-go-v2/credentials v1.13.25/go.mod h1:W9I2660WXSwZQ23mM1Ks72+UGeyirIxuU7/KzN7daeA= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 h1:UArzbycq+0HyRYuJvEXrFGMuc6yB/p58H1BAUsjkvuM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11 h1:IN2XMTLmhIEL5e3o+tY9JsLFSAxmjgM8gI7W2+CPrpw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.11/go.mod h1:oPHYtcocUcfHOE7qygtvyZMw82nedCKZSop/R9jxlAM= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 h1:CeJNl5G6Y3+VYbZHczL/I2rsvQDBsNkhEOm98eo2eVo= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 h1:cNrMc266RsZJ8V1u1OQQONKcf9HmfxQFqgcpY7ZJBhY= From 78f5214ab730772d5da432b7d88aa7170da55239 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 07:50:00 -0500 Subject: [PATCH 081/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 (#2848) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.26.1 to 1.26.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.1...service/s3/v1.26.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7a30083d29..a5d13a521d 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.1 github.com/aws/aws-sdk-go-v2/config v1.18.26 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index d612e00d9c..a597a15d9c 100644 --- a/go.sum +++ b/go.sum @@ -115,8 +115,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKK github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1 h1:UArzbycq+0HyRYuJvEXrFGMuc6yB/p58H1BAUsjkvuM= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.1/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 h1:PWGu2JhCb/XJlJ7SSFJq76pxk4xWsN76nZxh7TzMHx0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 h1:CeJNl5G6Y3+VYbZHczL/I2rsvQDBsNkhEOm98eo2eVo= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= From d0d498a89e1eb23e09917b947ad6c83a7efd48ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 07:52:32 -0500 Subject: [PATCH 082/159] chore(deps): bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 (#2846) chore(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.15.1 to 1.16.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.15.1...v1.16.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index a5d13a521d..3e7b7ffadb 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.15.1 + github.com/prometheus/client_golang v1.16.0 github.com/prometheus/client_model v0.3.0 github.com/prometheus/common v0.42.0 github.com/prometheus/common/sigv4 v0.1.0 @@ -157,7 +157,7 @@ require ( github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/slack-go/slack v0.12.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -171,7 +171,7 @@ require ( golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.6.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/go.sum b/go.sum index a597a15d9c..96e40d32bd 100644 --- a/go.sum +++ b/go.sum @@ -593,8 +593,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -613,8 +613,8 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -830,7 +830,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -896,8 +896,8 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From 51c867d6524524817466e627ece585a71774dabf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 22:19:10 -0500 Subject: [PATCH 083/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 (#2844) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.26 to 1.18.27. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.26...config/v1.18.27) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 3e7b7ffadb..6f08deb83b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.1 - github.com/aws/aws-sdk-go-v2/config v1.18.26 + github.com/aws/aws-sdk-go-v2/config v1.18.27 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.25 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 96e40d32bd..ff90462f03 100644 --- a/go.sum +++ b/go.sum @@ -103,10 +103,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.26 h1:ivCHcSmKd1+9rBlqVsxZHB35eCW88KWbMdG2VL3BuBw= -github.com/aws/aws-sdk-go-v2/config v1.18.26/go.mod h1:NVmd//z/PNl7U+ZU2EnuffxOA060JWzgbH3BnqQrUoY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.25 h1:5wROoMcUC7nAE66e0b3IIht6Tos76M4HC+GQw8MeqxU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.25/go.mod h1:W9I2660WXSwZQ23mM1Ks72+UGeyirIxuU7/KzN7daeA= +github.com/aws/aws-sdk-go-v2/config v1.18.27 h1:Az9uLwmssTE6OGTpsFqOnaGpLnKDqNYOJzWuC6UAYzA= +github.com/aws/aws-sdk-go-v2/config v1.18.27/go.mod h1:0My+YgmkGxeqjXZb5BYme5pc4drjTnM+x1GJ3zv42Nw= +github.com/aws/aws-sdk-go-v2/credentials v1.13.26 h1:qmU+yhKmOCyujmuPY7tf5MxR/RKyZrOPO3V4DobiTUk= +github.com/aws/aws-sdk-go-v2/credentials v1.13.26/go.mod h1:GoXt2YC8jHUBbA4jr+W3JiemnIbkXOfxSXcisUsZ3os= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= @@ -121,12 +121,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 h1:CeJNl5G6 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.11 h1:cNrMc266RsZJ8V1u1OQQONKcf9HmfxQFqgcpY7ZJBhY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.11/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11 h1:h2VhtCE5PBiJefmlVCjJRSzBfFcQeAE10SXIGkXw1jQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.11/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.1 h1:ehPTnLR/es8TL1fpBfq8qw9cAwOpQr47fLmZD9yhHjk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.1/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.12/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 h1:2qTR7IFk7/0IN/adSFhYu9Xthr0zVFTgBrmPldILn80= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 h1:XFJ2Z6sNUUcAz9poj+245DMkrHE4h2j5I9/xD50RHfE= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.2/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 8ee638e5d753ec1ed94f29bade0f88dac5e5a989 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 15:12:32 -0500 Subject: [PATCH 084/159] chore(deps): bump actions/setup-go from 3.5.0 to 4.0.1 (#2849) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3.5.0 to 4.0.1. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3.5.0...v4.0.1) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 6 +++--- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 9559c4fde9..80637ab009 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 with: go-version: 1.19 - uses: actions/checkout@v3.1.0 diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index c3fce6b8bc..89df548ebd 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -24,7 +24,7 @@ jobs: with: python-version: 3.x - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 with: go-version: 1.19 - name: build diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 26ff28b01c..87d385a9d6 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} - name: Checkout code @@ -51,7 +51,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -103,7 +103,7 @@ jobs: - name: Checkout code uses: actions/checkout@v3.1.0 - name: Setup Golang - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 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 f2171f099f..5a091da3a5 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@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 + uses: actions/setup-go@v4.0.1 # v3.5.0 with: go-version: ${{ inputs.go-version }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8afadbcc11..2bac1b57af 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -118,7 +118,7 @@ jobs: ref: ${{ github.event.inputs.tag }} - name: Setup Golang - uses: actions/setup-go@v4 + uses: actions/setup-go@v4.0.1 with: go-version: 1.19 From 1d53b251e1e1139f5e94314b5b121829edc5c88a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 15:13:04 -0500 Subject: [PATCH 085/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 (#2847) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.12 to 1.19.13. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.12...service/efs/v1.19.13) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6f08deb83b..4cd9ca9fee 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.18.1 github.com/aws/aws-sdk-go-v2/config v1.18.27 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index ff90462f03..8e0ed9a6d4 100644 --- a/go.sum +++ b/go.sum @@ -117,8 +117,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdt github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 h1:PWGu2JhCb/XJlJ7SSFJq76pxk4xWsN76nZxh7TzMHx0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12 h1:CeJNl5G6Y3+VYbZHczL/I2rsvQDBsNkhEOm98eo2eVo= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.12/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13 h1:g/Kzed9qNdvz5p7Av3ffavD19eN11deWqlHgR2JuXuw= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= From bf2cc7dd9426332d235c097ac275d3a945ca3da0 Mon Sep 17 00:00:00 2001 From: yyzxw <34639446+yyzxw@users.noreply.github.com> Date: Wed, 21 Jun 2023 21:03:03 +0800 Subject: [PATCH 086/159] chore: add make help cmd (#2854) Signed-off-by: yyzxw <1020938856@qq.com> --- Makefile | 122 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index 2ebb183635..638498ff85 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ ifdef IMAGE_NAMESPACE IMAGE_PREFIX=${IMAGE_NAMESPACE}/ endif -# protoc,my.proto +## protoc,my.proto define protoc # protoc $(1) PATH=${DIST_DIR}:$$PATH protoc \ @@ -66,22 +66,26 @@ endef .PHONY: all all: controller image -# downloads vendor files needed by tools.go (i.e. go_install) +##@ Development .PHONY: go-mod-vendor -go-mod-vendor: +go-mod-vendor: ## downloads vendor files needed by tools.go (i.e. go_install) go mod tidy go mod vendor +.PHONY: lint +lint: go-mod-vendor ## run all linters + golangci-lint run --fix + .PHONY: install-go-tools-local -install-go-tools-local: go-mod-vendor +install-go-tools-local: go-mod-vendor ## install all go tools ./hack/installers/install-codegen-go-tools.sh .PHONY: install-protoc-local -install-protoc-local: +install-protoc-local: ## install protoc tool ./hack/installers/install-protoc.sh .PHONY: install-devtools-local -install-devtools-local: +install-devtools-local: ## install dev tools ./hack/installers/install-dev-tools.sh # Installs all tools required to build and test locally @@ -94,6 +98,8 @@ APIMACHINERY_PKGS=k8s.io/apimachinery/pkg/util/intstr,+k8s.io/apimachinery/pkg/a .PHONY: install-toolchain install-toolchain: install-go-tools-local install-protoc-local +##@ Code Generation + # generates all auto-generated code .PHONY: codegen codegen: go-mod-vendor gen-proto gen-k8scodegen gen-openapi gen-mocks gen-crd manifests docs @@ -104,7 +110,7 @@ gen-proto: k8s-proto api-proto ui-proto # generates the .proto files affected by changes to types.go .PHONY: k8s-proto -k8s-proto: go-mod-vendor $(TYPES) +k8s-proto: go-mod-vendor $(TYPES) ## generate kubernetes protobuf files PATH=${DIST_DIR}:$$PATH go-to-protobuf \ --go-header-file=./hack/custom-boilerplate.go.txt \ --packages=github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ @@ -117,44 +123,42 @@ k8s-proto: go-mod-vendor $(TYPES) # generates *.pb.go, *.pb.gw.go, swagger from .proto files .PHONY: api-proto -api-proto: go-mod-vendor k8s-proto +api-proto: go-mod-vendor k8s-proto ## generate api protobuf files $(call protoc,pkg/apiclient/rollout/rollout.proto) # generates ui related proto files .PHONY: ui-proto -ui-proto: +ui-proto: ## generate ui protobuf files yarn --cwd ui run protogen # generates k8s client, informer, lister, deepcopy from types.go .PHONY: gen-k8scodegen -gen-k8scodegen: go-mod-vendor +gen-k8scodegen: go-mod-vendor ## generate kubernetes codegen files ./hack/update-codegen.sh # generates ./manifests/crds/ .PHONY: gen-crd -gen-crd: install-go-tools-local +gen-crd: install-go-tools-local ## generate crd manifests go run ./hack/gen-crd-spec/main.go # generates mock files from interfaces .PHONY: gen-mocks -gen-mocks: install-go-tools-local +gen-mocks: install-go-tools-local ## generate mock files ./hack/update-mocks.sh # generates openapi_generated.go .PHONY: gen-openapi -gen-openapi: $(DIST_DIR)/openapi-gen +gen-openapi: $(DIST_DIR)/openapi-gen ## generate openapi files PATH=${DIST_DIR}:$$PATH openapi-gen \ --go-header-file ${CURRENT_DIR}/hack/custom-boilerplate.go.txt \ --input-dirs github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ --output-package github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ --report-filename pkg/apis/api-rules/violation_exceptions.list -.PHONY: controller -controller: - CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/rollouts-controller ./cmd/rollouts-controller +##@ Plugins .PHONY: plugin -plugin: ui/dist +plugin: ui/dist ## build plugin cp -r ui/dist/app/* server/static CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME} ./cmd/kubectl-argo-rollouts @@ -163,28 +167,30 @@ ui/dist: yarn --cwd ui build .PHONY: plugin-linux -plugin-linux: ui/dist +plugin-linux: ui/dist ## build plugin for linux cp -r ui/dist/app/* server/static CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME}-linux-amd64 ./cmd/kubectl-argo-rollouts CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME}-linux-arm64 ./cmd/kubectl-argo-rollouts .PHONY: plugin-darwin -plugin-darwin: ui/dist +plugin-darwin: ui/dist ## build plugin for darwin cp -r ui/dist/app/* server/static CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME}-darwin-amd64 ./cmd/kubectl-argo-rollouts CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME}-darwin-arm64 ./cmd/kubectl-argo-rollouts .PHONY: plugin-windows -plugin-windows: ui/dist +plugin-windows: ui/dist ## build plugin for windows cp -r ui/dist/app/* server/static CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${PLUGIN_CLI_NAME}-windows-amd64 ./cmd/kubectl-argo-rollouts -.PHONY: docs -docs: - go run ./hack/gen-docs/main.go +##@ Build + +.PHONY: controller +controller: ## build controller binary + CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/rollouts-controller ./cmd/rollouts-controller .PHONY: builder-image -builder-image: +builder-image: ## build builder image DOCKER_BUILDKIT=1 docker build -t $(IMAGE_PREFIX)argo-rollouts-ci-builder:$(IMAGE_TAG) --target builder . @if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)argo-rollouts:$(IMAGE_TAG) ; fi @@ -198,25 +204,34 @@ else endif @if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)argo-rollouts:$(IMAGE_TAG) ; fi + +# Build sample plugin with debug info +# https://www.jetbrains.com/help/go/attach-to-running-go-processes-with-debugger.html +.PHONY: build-sample-metric-plugin-debug +build-sample-metric-plugin-debug: ## build sample metric plugin with debug info + go build -gcflags="all=-N -l" -o metric-plugin test/cmd/metrics-plugin-sample/main.go + +.PHONY: build-sample-traffic-plugin-debug +build-sample-traffic-plugin-debug: ## build sample traffic plugin with debug info + go build -gcflags="all=-N -l" -o traffic-plugin test/cmd/trafficrouter-plugin-sample/main.go + .PHONY: plugin-image -plugin-image: +plugin-image: ## build plugin image DOCKER_BUILDKIT=1 docker build --target kubectl-argo-rollouts -t $(IMAGE_PREFIX)kubectl-argo-rollouts:$(IMAGE_TAG) . if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)kubectl-argo-rollouts:$(IMAGE_TAG) ; fi -.PHONY: lint -lint: go-mod-vendor - golangci-lint run --fix +##@ Test .PHONY: test -test: test-kustomize +test: test-kustomize ## run all tests @make test-unit .PHONY: test-kustomize -test-kustomize: +test-kustomize: ## run kustomize tests ./test/kustomize/test.sh .PHONY: start-e2e -start-e2e: +start-e2e: ## start e2e test environment go run ./cmd/rollouts-controller/main.go --instance-id ${E2E_INSTANCE_ID} --loglevel debug --kloglevel 6 .PHONY: test-e2e @@ -224,55 +239,63 @@ test-e2e: install-devtools-local ${DIST_DIR}/gotestsum --rerun-fails-report=rerunreport.txt --junitfile=junit.xml --format=testname --packages="./test/e2e" --rerun-fails=5 -- -timeout 60m -count 1 --tags e2e -p ${E2E_PARALLEL} -parallel ${E2E_PARALLEL} -v --short ./test/e2e ${E2E_TEST_OPTIONS} .PHONY: test-unit - test-unit: install-devtools-local + test-unit: install-devtools-local ## run unit tests ${DIST_DIR}/gotestsum --junitfile=junit.xml --format=testname -- -covermode=count -coverprofile=coverage.out `go list ./... | grep -v ./test/cmd/metrics-plugin-sample` .PHONY: coverage -coverage: test +coverage: test ## run coverage tests go tool cover -html=coverage.out -o coverage.html open coverage.html .PHONY: manifests -manifests: +manifests: ## generate manifests e.g. CRD, RBAC etc. ./hack/update-manifests.sh .PHONY: clean -clean: +clean: ## clean up build artifacts -rm -rf ${CURRENT_DIR}/dist -rm -rf ${CURRENT_DIR}/ui/dist .PHONY: precheckin precheckin: test lint +##@ Docs + +# convenience target to run `mkdocs serve` using a docker container +.PHONY: serve-docs +serve-docs: docs ## serve docs locally + docker run --rm -it -p 8000:8000 -v ${CURRENT_DIR}:/docs squidfunk/mkdocs-material serve -a 0.0.0.0:8000 + +.PHONY: docs +docs: ## build docs + go run ./hack/gen-docs/main.go + +##@ Release + .PHONY: release-docs -release-docs: docs +release-docs: docs ## build and deploy docs docker run --rm -it \ -v ~/.ssh:/root/.ssh \ -v ${CURRENT_DIR}:/docs \ -v ~/.gitconfig:/root/.gitconfig \ squidfunk/mkdocs-material gh-deploy -r ${GIT_REMOTE_REPO} -# convenience target to run `mkdocs serve` using a docker container -.PHONY: serve-docs -serve-docs: docs - docker run --rm -it -p 8000:8000 -v ${CURRENT_DIR}:/docs squidfunk/mkdocs-material serve -a 0.0.0.0:8000 - .PHONY: release-precheck -release-precheck: manifests +release-precheck: manifests ## precheck release @if [ "$(GIT_TREE_STATE)" != "clean" ]; then echo 'git tree state is $(GIT_TREE_STATE)' ; exit 1; fi @if [ -z "$(GIT_TAG)" ]; then echo 'commit must be tagged to perform release' ; exit 1; fi @if [ "$(GIT_TAG)" != "v`cat VERSION`" ]; then echo 'VERSION does not match git tag'; exit 1; fi .PHONY: release-plugins -release-plugins: +release-plugins: ## build and push plugins ./hack/build-release-plugins.sh .PHONY: release release: release-precheck precheckin image plugin-image release-plugins .PHONY: trivy -trivy: +trivy: ## run trivy scan @trivy fs --clear-cache @trivy fs . @@ -280,13 +303,6 @@ trivy: checksums: shasum -a 256 ./dist/kubectl-argo-rollouts-* | awk -F './dist/' '{print $$1 $$2}' > ./dist/argo-rollouts-checksums.txt -# Build sample plugin with debug info -# https://www.jetbrains.com/help/go/attach-to-running-go-processes-with-debugger.html -.PHONY: build-sample-metric-plugin-debug -build-sample-metric-plugin-debug: - go build -gcflags="all=-N -l" -o metric-plugin test/cmd/metrics-plugin-sample/main.go - -.PHONY: build-sample-traffic-plugin-debug -build-sample-traffic-plugin-debug: - go build -gcflags="all=-N -l" -o traffic-plugin test/cmd/trafficrouter-plugin-sample/main.go +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) From cdf8d2bd661dc28ea15702d90244e8515c6e522c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:58:02 -0500 Subject: [PATCH 087/159] chore(deps): bump google.golang.org/grpc from 1.55.0 to 1.56.1 (#2856) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.55.0 to 1.56.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.55.0...v1.56.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 4cd9ca9fee..7f51278188 100644 --- a/go.mod +++ b/go.mod @@ -36,8 +36,8 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 - google.golang.org/grpc v1.55.0 + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 + google.golang.org/grpc v1.56.1 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 @@ -57,7 +57,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect @@ -169,11 +169,11 @@ require ( go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/crypto v0.5.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/net v0.9.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect diff --git a/go.sum b/go.sum index 8e0ed9a6d4..fd2c3a2e05 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -809,16 +809,16 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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= @@ -901,8 +901,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= 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= @@ -912,8 +912,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1039,8 +1039,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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= @@ -1056,8 +1056,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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= From 6fb244a0ca84f6a814785d8a7dd5b43ad0d74e5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:08:59 -0500 Subject: [PATCH 088/159] chore(deps): bump sigstore/cosign-installer from 3.0.5 to 3.1.0 (#2858) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.0.5 to 3.1.0. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/dd6b2e2b610a11fd73dd187a43d57cc1394e35f9...d13028333d784fcc802b67ec924bcebe75aa0a5f) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 5a091da3a5..fad6bd771d 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@dd6b2e2b610a11fd73dd187a43d57cc1394e35f9 # v3.0.5 + uses: sigstore/cosign-installer@d13028333d784fcc802b67ec924bcebe75aa0a5f # v3.1.0 with: cosign-release: 'v2.0.2' From a25d377425c998810e3d9cbde7cae092fd520a2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 08:00:05 -0500 Subject: [PATCH 089/159] chore(deps): bump google.golang.org/protobuf from 1.30.0 to 1.31.0 (#2859) Bumps google.golang.org/protobuf from 1.30.0 to 1.31.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7f51278188..52e9c7b244 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 k8s.io/apiextensions-apiserver v0.25.8 diff --git a/go.sum b/go.sum index fd2c3a2e05..fcb015bd94 100644 --- a/go.sum +++ b/go.sum @@ -1072,8 +1072,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/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= From bf6fb11d8aa195bfe810d25bb07e734666827039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 08:00:32 -0500 Subject: [PATCH 090/159] chore(deps): bump sigstore/cosign-installer from 3.1.0 to 3.1.1 (#2860) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/d13028333d784fcc802b67ec924bcebe75aa0a5f...6e04d228eb30da1757ee4e1dd75a0ec73a653e06) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index fad6bd771d..cc5dc45c11 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@d13028333d784fcc802b67ec924bcebe75aa0a5f # v3.1.0 + uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 # v3.1.1 with: cosign-release: 'v2.0.2' From eb26809dd66e550015f894f1bbaa580d45c03392 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Wed, 5 Jul 2023 10:23:30 -0400 Subject: [PATCH 091/159] docs(example): Add example on how to execute subset of e2e tests (#2867) Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- docs/CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index a325587804..a37ad29fc0 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -104,6 +104,12 @@ Then run the e2e tests: make test-e2e ``` +To run a subset of e2e tests, you need to specify the suite with `-run`, and the specific test regex with `-testify.m`. + +``` +E2E_TEST_OPTIONS="-run 'TestCanarySuite' -testify.m 'TestCanaryScaleDownOnAbortNoTrafficRouting'" make test-e2e +``` + ## Controller architecture Argo Rollouts is actually a collection of individual controllers From 65fbefe5232c38be04a4daaeb557bade3111379a Mon Sep 17 00:00:00 2001 From: Ben Kochie Date: Fri, 7 Jul 2023 16:17:25 +0200 Subject: [PATCH 092/159] fix(controller): Remove name label from some k8s client metrics on events and replicasets (#2851) BREAKING CHANGE The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. Remove name label from k8s some client metrics The `name` label in the `controller_clientset_k8s_request_total` metric produce an excessive amount of cardinality for `events` and `replicasets`. This can lead to hundreds of thousands of unique metrics over a couple weeks in a large deployment. Set the name to "N/A" for these client request types. Signed-off-by: SuperQ --- controller/metrics/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/metrics/client.go b/controller/metrics/client.go index 01367745ef..b800a74bd8 100644 --- a/controller/metrics/client.go +++ b/controller/metrics/client.go @@ -27,7 +27,7 @@ func (m *K8sRequestsCountProvider) IncKubernetesRequest(resourceInfo kubeclientm namespace := resourceInfo.Namespace kind := resourceInfo.Kind statusCode := strconv.Itoa(resourceInfo.StatusCode) - if resourceInfo.Verb == kubeclientmetrics.List { + if resourceInfo.Verb == kubeclientmetrics.List || kind == "events" || kind == "replicasets" { name = "N/A" } if resourceInfo.Verb == kubeclientmetrics.Unknown { From f1de890c6501da0866db994e8323d4f5fc29342a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 09:46:06 -0500 Subject: [PATCH 093/159] chore(deps): bump google.golang.org/grpc from 1.56.1 to 1.56.2 (#2872) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.56.1 to 1.56.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.56.1...v1.56.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 52e9c7b244..465afc74fa 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 - google.golang.org/grpc v1.56.1 + google.golang.org/grpc v1.56.2 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 diff --git a/go.sum b/go.sum index fcb015bd94..d21daece7d 100644 --- a/go.sum +++ b/go.sum @@ -1056,8 +1056,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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= From 3c5ac368649527940b33a7bc08f3c45f14ec0c77 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Tue, 11 Jul 2023 10:53:30 -0400 Subject: [PATCH 094/159] fix(trafficrouting): apply stable selectors on canary service on rollout abort #2781 (#2818) * Re-apply stable to simple canary service on abort when no traffic routing is used fixes #2781 * remove redundant block of code Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Add an e2e covering the fix. Basically a copy/pasta of test that was checking for this when using traffic routing Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --------- Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- rollout/canary_test.go | 134 ++++++++++++++++-- rollout/service.go | 9 ++ rollout/trafficrouting.go | 6 +- test/e2e/canary_test.go | 25 +++- ...nary-scaledownonabortnotrafficrouting.yaml | 91 ++++++++++++ 5 files changed, 247 insertions(+), 18 deletions(-) create mode 100644 test/e2e/functional/canary-scaledownonabortnotrafficrouting.yaml diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 56445f3978..1811f6a4c4 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -427,7 +427,6 @@ func TestResetCurrentStepIndexOnStepChange(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, expectedCurrentStepHash, newConditions) assert.Equal(t, calculatePatch(r2, expectedPatch), patch) - } func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { @@ -469,7 +468,6 @@ func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, newConditions) assert.Equal(t, calculatePatch(r2, expectedPatch), patch) - } func TestCanaryRolloutCreateFirstReplicasetNoSteps(t *testing.T) { @@ -708,7 +706,6 @@ func TestCanaryRolloutScaleDownOldRsDontScaleDownTooMuch(t *testing.T) { assert.Equal(t, int32(0), *updatedRS1.Spec.Replicas) updatedRS2 := f.getUpdatedReplicaSet(updatedRS2Index) assert.Equal(t, int32(4), *updatedRS2.Spec.Replicas) - } // TestCanaryDontScaleDownOldRsDuringInterruptedUpdate tests when we need to prevent scale down an @@ -1019,9 +1016,8 @@ func TestSyncRolloutWaitAddToQueue(t *testing.T) { c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) f.runController(key, true, false, c, i, k8sI) - //When the controller starts, it will enqueue the rollout while syncing the informer and during the reconciliation step + // When the controller starts, it will enqueue the rollout while syncing the informer and during the reconciliation step assert.Equal(t, 2, f.enqueuedObjects[key]) - } func TestSyncRolloutIgnoreWaitOutsideOfReconciliationPeriod(t *testing.T) { @@ -1034,7 +1030,7 @@ func TestSyncRolloutIgnoreWaitOutsideOfReconciliationPeriod(t *testing.T) { }, { Pause: &v1alpha1.RolloutPause{ - Duration: v1alpha1.DurationFromInt(3600), //1 hour + Duration: v1alpha1.DurationFromInt(3600), // 1 hour }, }, } @@ -1068,9 +1064,8 @@ func TestSyncRolloutIgnoreWaitOutsideOfReconciliationPeriod(t *testing.T) { key := fmt.Sprintf("%s/%s", r2.Namespace, r2.Name) c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) f.runController(key, true, false, c, i, k8sI) - //When the controller starts, it will enqueue the rollout so we expect the rollout to enqueue at least once. + // When the controller starts, it will enqueue the rollout so we expect the rollout to enqueue at least once. assert.Equal(t, 1, f.enqueuedObjects[key]) - } func TestSyncRolloutWaitIncrementStepIndex(t *testing.T) { @@ -1084,7 +1079,8 @@ func TestSyncRolloutWaitIncrementStepIndex(t *testing.T) { Pause: &v1alpha1.RolloutPause{ Duration: v1alpha1.DurationFromInt(5), }, - }, { + }, + { Pause: &v1alpha1.RolloutPause{}, }, } @@ -1236,6 +1232,7 @@ func TestCanarySVCSelectors(t *testing.T) { }, }, } + rc := rolloutContext{ log: logutil.WithRollout(rollout), reconcilerBase: reconcilerBase{ @@ -1266,6 +1263,7 @@ func TestCanarySVCSelectors(t *testing.T) { }, }, } + stopchan := make(chan struct{}) defer close(stopchan) informers.Start(stopchan) @@ -1286,6 +1284,124 @@ func TestCanarySVCSelectors(t *testing.T) { } } +func TestCanarySVCSelectorsBasicCanaryAbortServiceSwitchBack(t *testing.T) { + for _, tc := range []struct { + canaryReplicas int32 + canaryAvailReplicas int32 + shouldAbortRollout bool + shouldTargetNewRS bool + }{ + {2, 2, false, true}, // Rollout, canaryService should point at the canary RS + {2, 2, true, false}, // Rollout aborted, canaryService should point at the stable RS + } { + namespace := "namespace" + selectorLabel := "selector-labels-test" + selectorNewRSVal := "new-rs-xxx" + selectorStableRSVal := "stable-rs-xxx" + stableService := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "stable", + Namespace: namespace, + Annotations: map[string]string{v1alpha1.ManagedByRolloutsKey: selectorLabel}, + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: selectorStableRSVal, + }, + }, + } + canaryService := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "canary", + Namespace: namespace, + Annotations: map[string]string{v1alpha1.ManagedByRolloutsKey: selectorLabel}, + }, + } + kubeclient := k8sfake.NewSimpleClientset(stableService, canaryService) + informers := k8sinformers.NewSharedInformerFactory(kubeclient, 0) + servicesLister := informers.Core().V1().Services().Lister() + + rollout := &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: selectorLabel, + Namespace: namespace, + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + StableService: stableService.Name, + CanaryService: canaryService.Name, + }, + }, + }, + } + + pc := pauseContext{ + rollout: rollout, + } + if tc.shouldAbortRollout { + pc.AddAbort("Add Abort") + } + + rc := rolloutContext{ + log: logutil.WithRollout(rollout), + pauseContext: &pc, + reconcilerBase: reconcilerBase{ + servicesLister: servicesLister, + kubeclientset: kubeclient, + recorder: record.NewFakeEventRecorder(), + }, + rollout: rollout, + newRS: &v1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "canary", + Namespace: namespace, + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: selectorNewRSVal, + }, + }, + Spec: v1.ReplicaSetSpec{ + Replicas: pointer.Int32Ptr(tc.canaryReplicas), + }, + Status: v1.ReplicaSetStatus{ + AvailableReplicas: tc.canaryAvailReplicas, + }, + }, + stableRS: &v1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "stable", + Namespace: namespace, + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: selectorStableRSVal, + }, + }, + Spec: v1.ReplicaSetSpec{ + Replicas: pointer.Int32Ptr(tc.canaryReplicas), + }, + Status: v1.ReplicaSetStatus{ + AvailableReplicas: tc.canaryAvailReplicas, + }, + }, + } + + stopchan := make(chan struct{}) + defer close(stopchan) + informers.Start(stopchan) + informers.WaitForCacheSync(stopchan) + err := rc.reconcileStableAndCanaryService() + assert.NoError(t, err, "unable to reconcileStableAndCanaryService") + updatedCanarySVC, err := servicesLister.Services(rc.rollout.Namespace).Get(canaryService.Name) + assert.NoError(t, err, "unable to get updated canary service") + if tc.shouldTargetNewRS { + assert.Equal(t, selectorNewRSVal, updatedCanarySVC.Spec.Selector[v1alpha1.DefaultRolloutUniqueLabelKey], + "canary SVC should have newRS selector label when newRS has %d replicas and %d AvailableReplicas", + tc.canaryReplicas, tc.canaryAvailReplicas) + } else { + assert.Equal(t, selectorStableRSVal, updatedCanarySVC.Spec.Selector[v1alpha1.DefaultRolloutUniqueLabelKey], + "canary SVC should have stableRS selector label when newRS has %d replicas and %d AvailableReplicas", + tc.canaryReplicas, tc.canaryAvailReplicas) + } + } +} + func TestCanaryRolloutWithInvalidCanaryServiceName(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/rollout/service.go b/rollout/service.go index de63f527b3..f808cb55fc 100644 --- a/rollout/service.go +++ b/rollout/service.go @@ -257,6 +257,15 @@ func (c *rolloutContext) reconcileStableAndCanaryService() error { if err != nil { return err } + + if c.pauseContext != nil && c.pauseContext.IsAborted() && c.rollout.Spec.Strategy.Canary.TrafficRouting == nil { + err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.stableRS, true) + if err != nil { + return err + } + return nil + } + err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.newRS, true) if err != nil { return err diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index c00eb66e1b..1b694d517a 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -143,11 +143,7 @@ func (c *rolloutContext) reconcileTrafficRouting() error { c.newStatus.Canary.Weights = nil return nil } - if reconcilers == nil { - // Not using traffic routing - c.newStatus.Canary.Weights = nil - return nil - } + c.log.Infof("Found %d TrafficRouting Reconcilers", len(reconcilers)) // iterate over the list of trafficReconcilers for _, reconciler := range reconcilers { diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index 00b588c598..fe22175074 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -443,7 +443,7 @@ spec: port: 80 periodSeconds: 30 strategy: - canary: + canary: steps: - setWeight: 20 - pause: {} @@ -539,7 +539,24 @@ func (s *CanarySuite) TestCanaryScaleDownOnAbort() { AbortRollout(). WaitForRolloutStatus("Degraded"). Then(). - //Expect that the canary service selector has been moved back to stable + // Expect that the canary service selector has been moved back to stable + ExpectServiceSelector("canary-scaledowndelay-canary", map[string]string{"app": "canary-scaledowndelay", "rollouts-pod-template-hash": "66597877b7"}, false). + When(). + Sleep(3*time.Second). + Then(). + ExpectRevisionPodCount("2", 0) +} + +func (s *CanarySuite) TestCanaryScaleDownOnAbortNoTrafficRouting() { + s.Given(). + HealthyRollout(`@functional/canary-scaledownonabortnotrafficrouting.yaml`). + When(). + UpdateSpec(). // update to revision 2 + WaitForRolloutStatus("Paused"). + AbortRollout(). + WaitForRolloutStatus("Degraded"). + Then(). + // Expect that the canary service selector has been moved back to stable ExpectServiceSelector("canary-scaledowndelay-canary", map[string]string{"app": "canary-scaledowndelay", "rollouts-pod-template-hash": "66597877b7"}, false). When(). Sleep(3*time.Second). @@ -590,7 +607,7 @@ func (s *CanarySuite) TestCanaryDynamicStableScale() { WaitForRevisionPodCount("2", 1). Then(). ExpectRevisionPodCount("1", 4). - //Assert that the canary service selector is still not set to stable rs because of dynamic stable scale still in progress + // Assert that the canary service selector is still not set to stable rs because of dynamic stable scale still in progress Assert(func(t *fixtures.Then) { canarySvc, stableSvc := t.GetServices() assert.NotEqual(s.T(), canarySvc.Spec.Selector["rollouts-pod-template-hash"], stableSvc.Spec.Selector["rollouts-pod-template-hash"]) @@ -599,7 +616,7 @@ func (s *CanarySuite) TestCanaryDynamicStableScale() { MarkPodsReady("1", 1). // mark last remaining stable pod as ready (4/4 stable are ready) WaitForRevisionPodCount("2", 0). Then(). - //Expect that the canary service selector is now set to stable because of dynamic stable scale is over and we have all pods up on stable rs + // Expect that the canary service selector is now set to stable because of dynamic stable scale is over and we have all pods up on stable rs ExpectServiceSelector("dynamic-stable-scale-canary", map[string]string{"app": "dynamic-stable-scale", "rollouts-pod-template-hash": "868d98995b"}, false). ExpectRevisionPodCount("1", 4) } diff --git a/test/e2e/functional/canary-scaledownonabortnotrafficrouting.yaml b/test/e2e/functional/canary-scaledownonabortnotrafficrouting.yaml new file mode 100644 index 0000000000..0c42735db3 --- /dev/null +++ b/test/e2e/functional/canary-scaledownonabortnotrafficrouting.yaml @@ -0,0 +1,91 @@ +apiVersion: v1 +kind: Service +metadata: + name: canary-scaledowndelay-root +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: canary-scaledowndelay +--- +apiVersion: v1 +kind: Service +metadata: + name: canary-scaledowndelay-canary +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: canary-scaledowndelay +--- +apiVersion: v1 +kind: Service +metadata: + name: canary-scaledowndelay-stable +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: canary-scaledowndelay +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: canary-scaledowndelay-ingress + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: Prefix + backend: + service: + name: canary-scaledowndelay-root + port: + name: use-annotation +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: canary-scaledownd-on-abort +spec: + selector: + matchLabels: + app: canary-scaledowndelay + template: + metadata: + labels: + app: canary-scaledowndelay + spec: + containers: + - name: canary-scaledowndelay + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + canaryService: canary-scaledowndelay-canary + stableService: canary-scaledowndelay-stable + steps: + - setWeight: 50 + - pause: {} From 48e9aa31e49d1b6c58c44a18c09508c59e49b0e7 Mon Sep 17 00:00:00 2001 From: Justin Marquis <34fathombelow@protonmail.com> Date: Wed, 12 Jul 2023 12:14:36 -0700 Subject: [PATCH 095/159] ci: generate attestations during a release (#2785) * ci: use keyless signing for main and release branches Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> * fix typo Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> * ci: generate attestations during a release Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> * add release trigger script Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> --------- Signed-off-by: Justin Marquis <34fathombelow@protonmail.com> Signed-off-by: zachaller Co-authored-by: zachaller --- .github/workflows/README.md | 39 +++ .github/workflows/release.yaml | 368 +++++++++++--------- docs/contributing-assets/release-action.png | Bin 48610 -> 0 bytes docs/releasing.md | 27 +- docs/{ => security}/security.md | 0 docs/security/signed-release-assets.md | 116 ++++++ hack/trigger-release.sh | 56 +++ mkdocs.yml | 4 +- 8 files changed, 439 insertions(+), 171 deletions(-) create mode 100644 .github/workflows/README.md delete mode 100644 docs/contributing-assets/release-action.png rename docs/{ => security}/security.md (100%) create mode 100644 docs/security/signed-release-assets.md create mode 100755 hack/trigger-release.sh diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000000..158a90d4c1 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,39 @@ +# Workflows + +| Workflow | Description | +|---------------------|-----------------------------------------------------------------| +| changelog.yml | Updates changelog when a release is published | +| codeql.yaml | CodeQL analysis | +| docker-publish.yaml | Build container image for PR's & publish for push events | +| image-reuse.yaml | Build, push, and Sign container images | +| go.yaml | lint, build, codegen | +| pr-title-check.yaml | Lint PR for semantic information | +| init-release.yaml | Build manifests and version then create a PR for release branch | +| release.yaml | Build images, cli-binaries, provenances, and post actions | + + +# Reusable workflows + +## image-reuse.yaml + +- The resuable workflow can be used to publish or build images with multiple container registries(Quay,GHCR, dockerhub), and then sign them with cosign when an image is published. +- A GO version `must` be specified e.g. 1.19 +- The image name for each registry *must* contain the tag. Note: multiple tags are allowed for each registry using a CSV type. +- Multiple platforms can be specified e.g. linux/amd64,linux/arm64 +- Images are not published by default. A boolean value must be set to `true` to push images. +- An optional target can be specified. + +| Inputs | Description | Type | Required | Defaults | +|-------------------|-------------------------------------|-------------|----------|-----------------| +| go-version | Version of Go to be used | string | true | none | +| quay_image_name | Full image name and tag | CSV, string | false | none | +| ghcr_image_name | Full image name and tag | CSV, string | false | none | +| docker_image_name | Full image name and tag | CSV, string | false | none | +| platforms | Platforms to build (linux/amd64) | CSV, string | false | linux/amd64 | +| push | Whether to push image/s to registry | boolean | false | false | +| target | Target build stage | string | false | none | + +| Outputs | Description | Type | +|-------------|------------------------------------------|-------| +|image-digest | Image digest of image container created | string| + diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2bac1b57af..87d4aa6335 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,132 +1,178 @@ name: Release - on: - workflow_dispatch: - inputs: - tag: - description: Git tag to build release from - required: true - update_stable_tag: - description: 'Update stable tag' - required: true - type: boolean - default: 'false' -permissions: - contents: read + push: + tags: + - 'v*' + +permissions: {} + +env: + GOLANG_VERSION: '1.19' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. jobs: - release-images: + controller-image: + permissions: + contents: read + packages: write # Required and used to push images to `ghcr.io` if used. + id-token: write # For creating OIDC tokens for signing. + uses: ./.github/workflows/image-reuse.yaml + 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.19 + platforms: linux/amd64,linux/arm64 + push: true + secrets: + quay_username: ${{ secrets.QUAY_USERNAME }} + quay_password: ${{ secrets.QUAY_ROBOT_TOKEN }} + + plugin-image: + permissions: + contents: read + packages: write # Required and used to push images to `ghcr.io` if used. + id-token: write # For creating OIDC tokens for signing. + uses: ./.github/workflows/image-reuse.yaml + 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.19 + platforms: linux/amd64,linux/arm64 + push: true + target: kubectl-argo-rollouts + secrets: + quay_username: ${{ secrets.QUAY_USERNAME }} + quay_password: ${{ secrets.QUAY_ROBOT_TOKEN }} + + controller-image-provenance: + needs: + - controller-image + permissions: + actions: read # for detecting the Github Actions environment. + id-token: write # for creating OIDC tokens for signing. + packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) + # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.6.0 + with: + image: quay.io/argoproj/argo-rollouts + digest: ${{ needs.controller-image.outputs.image-digest }} + secrets: + registry-username: ${{ secrets.QUAY_USERNAME }} + registry-password: ${{ secrets.QUAY_ROBOT_TOKEN }} + + plugin-image-provenance: + needs: + - plugin-image + permissions: + actions: read # for detecting the Github Actions environment. + id-token: write # for creating OIDC tokens for signing. + packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) + # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.6.0 + with: + image: quay.io/argoproj/kubectl-argo-rollouts + digest: ${{ needs.plugin-image.outputs.image-digest }} + secrets: + registry-username: ${{ secrets.QUAY_USERNAME }} + registry-password: ${{ secrets.QUAY_ROBOT_TOKEN }} + + + release-artifacts: + permissions: + contents: write # for softprops/action-gh-release to create GitHub release runs-on: ubuntu-latest + outputs: + hashes: ${{ steps.hash.outputs.hashes }} steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: - ref: ${{ github.event.inputs.tag }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} - - name: Get SHA - id: get-sha - run: echo "::set-output name=sha::$(git log -1 --format='%H')" + - name: Setup Golang + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + with: + go-version: ${{ env.GOLANG_VERSION }} - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - config-inline: | - [worker.oci] - gc = false + uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c # v2.5.0 - - name: Print Disk Usage + - name: Generate release artifacts run: | - df -ah - docker buildx du + make release-plugins + make checksums + make manifests IMAGE_TAG=${{ github.ref_name }} - - name: Docker meta (controller) - id: controller-meta - uses: docker/metadata-action@v4 - with: - images: | - quay.io/argoproj/argo-rollouts - # ghcr.io/argoproj/argo-rollouts - tags: | - type=semver,pattern={{version}},prefix=v,value=${{ github.event.inputs.tag }} - flavor: | - latest=false - - - name: Docker meta (plugin) - id: plugin-meta - uses: docker/metadata-action@v4 - with: - images: | - quay.io/argoproj/kubectl-argo-rollouts - # ghcr.io/argoproj/kubectl-argo-rollouts - tags: | - type=semver,pattern={{version}},prefix=v,value=${{ github.event.inputs.tag }} - flavor: | - latest=false - - # - name: Login to GitHub Container Registry - # if: github.event_name != 'pull_request' - # uses: docker/login-action@v2 - # with: - # registry: ghcr.io - # username: ${{ github.repository_owner }} - # password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to Quay.io - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 + - name: Draft release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15 with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_ROBOT_TOKEN }} + tag_name: ${{ github.event.inputs.tag }} + draft: true + files: | + dist/kubectl-argo-rollouts-linux-amd64 + dist/kubectl-argo-rollouts-linux-arm64 + dist/kubectl-argo-rollouts-darwin-amd64 + dist/kubectl-argo-rollouts-darwin-arm64 + dist/kubectl-argo-rollouts-windows-amd64 + dist/argo-rollouts-checksums.txt + manifests/dashboard-install.yaml + manifests/install.yaml + manifests/namespace-install.yaml + manifests/notifications-install.yaml + docs/features/kustomize/rollout_cr_schema.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push (controller-image) - uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.controller-meta.outputs.tags }} - provenance: false - sbom: false - - - name: Build and push (plugin-image) - uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 - with: - context: . - target: kubectl-argo-rollouts - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.plugin-meta.outputs.tags }} - provenance: false - sbom: false + - name: Generate hashes for provenance + id: hash + run: | + echo "hashes=$(sha256sum ./dist/kubectl-argo-rollouts-* ./manifests/*.yaml | base64 -w0)" >> "$GITHUB_OUTPUT" - release-artifacts: + release-artifacts-provenance: + needs: + - release-artifacts permissions: - contents: write # for softprops/action-gh-release to create GitHub release + actions: read # for detecting the Github Actions environment + id-token: write # Needed for provenance signing and ID + contents: write # Needed for release uploads + # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.6.0 + with: + base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" + provenance-name: "argo-rollouts.intoto.jsonl" + upload-assets: true + draft-release: true + + generate-sbom: + name: Create Sbom and sign assets + needs: + - release-artifacts + - release-artifacts-provenance + permissions: + contents: write # Needed for release uploads + id-token: write # Needed for signing Sbom runs-on: ubuntu-latest - needs: release-images - steps: - - name: Checkout - uses: actions/checkout@v3.1.0 + - name: Checkout code + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 with: - ref: ${{ github.event.inputs.tag }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: - go-version: 1.19 + go-version: ${{ env.GOLANG_VERSION }} - - name: Generate release artifacts - run: | - make release-plugins - make checksums - make manifests IMAGE_TAG=${{ github.event.inputs.tag }} + - name: Install cosign + uses: sigstore/cosign-installer@204a51a57a74d190b284a0ce69b44bc37201f343 # v3.0.3 + with: + cosign-release: 'v2.0.2' - name: Generate SBOM (spdx) id: spdx-builder @@ -138,8 +184,8 @@ jobs: # comma delimited list of project relative folders to inspect for package # managers (gomod, yarn, npm). PROJECT_FOLDERS: ".,./ui" - # full qualified name of the docker image to be inspected - DOCKER_IMAGE: quay.io/argoproj/argo-rollouts:${{ github.event.inputs.tag }} + # full qualified name of the container image to be inspected + CONTAINER_IMAGE: quay.io/argoproj/argo-rollouts:${{ github.event.inputs.tag }} run: | yarn install --cwd ./ui @@ -152,82 +198,74 @@ jobs: generator -p $folder -o /tmp done - # Generate SPDX for binaries analyzing the docker image - if [[ ! -z $DOCKER_IMAGE ]]; then - bom generate -o /tmp/bom-docker-image.spdx -i $DOCKER_IMAGE + # Generate SPDX for binaries analyzing the container image + if [[ ! -z CONTAINER_IMAGE ]]; then + bom generate -o /tmp/bom-docker-image.spdx -i $CONTAINER_IMAGE fi cd /tmp && tar -zcf sbom.tar.gz *.spdx - - name: Login to Quay.io - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_ROBOT_TOKEN }} + - name: Sign SBOM + run: | + cosign sign-blob \ + --output-certificate=/tmp/sbom.tar.gz.pem \ + --output-signature=/tmp/sbom.tar.gz.sig \ + --yes \ + /tmp/sbom.tar.gz - - name: Install cosign - uses: sigstore/cosign-installer@main + - name: Upload SBOM and signature assets + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - cosign-release: 'v1.13.1' + tag_name: ${{ github.ref_name }} + draft: true + files: | + /tmp/sbom.tar.* - - name: Install crane to get digest of image - uses: imjasonh/setup-crane@v0.3 + post-release: + needs: + - release-artifacts + - generate-sbom + permissions: + contents: write # Needed to push commit to update stable tag + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} - - name: Get digest of controller-image + - name: Setup Git author information run: | - echo "CONTROLLER_DIGEST=$(crane digest quay.io/argoproj/argo-rollouts:${{ github.event.inputs.tag }})" >> $GITHUB_ENV + set -ue + git config --global user.email 'ci@argoproj.com' + git config --global user.name 'CI' - - name: Get digest of plugin-image + - name: Check if tag is the latest version and not a pre-release run: | - echo "PLUGIN_DIGEST=$(crane digest quay.io/argoproj/kubectl-argo-rollouts:${{ github.event.inputs.tag }})" >> $GITHUB_ENV + set -xue + # Fetch all tag information + git fetch --prune --tags --force - - name: Sign Argo Rollouts Images - run: | - cosign sign --key env://COSIGN_PRIVATE_KEY quay.io/argoproj/argo-rollouts@${{ env.CONTROLLER_DIGEST }} - cosign sign --key env://COSIGN_PRIVATE_KEY quay.io/argoproj/kubectl-argo-rollouts@${{ env.PLUGIN_DIGEST }} - env: - COSIGN_PRIVATE_KEY: ${{secrets.COSIGN_PRIVATE_KEY}} - COSIGN_PASSWORD: ${{secrets.COSIGN_PASSWORD}} + LATEST_TAG=$(git -c 'versionsort.suffix=-rc' tag --list --sort=version:refname | tail -n1) - - name: Sign checksums and create public key for release assets - run: | - cosign sign-blob --key env://COSIGN_PRIVATE_KEY ./dist/argo-rollouts-checksums.txt > ./dist/argo-rollouts-checksums.sig - cosign public-key --key env://COSIGN_PRIVATE_KEY > ./dist/argo-rollouts-cosign.pub - cosign sign-blob --key env://COSIGN_PRIVATE_KEY /tmp/sbom.tar.gz > /tmp/sbom.tar.gz.sig - # Displays the public key to share. - cosign public-key --key env://COSIGN_PRIVATE_KEY - env: - COSIGN_PRIVATE_KEY: ${{secrets.COSIGN_PRIVATE_KEY}} - COSIGN_PASSWORD: ${{secrets.COSIGN_PASSWORD}} + PRE_RELEASE=false + # Check if latest tag is a pre-release + if echo $LATEST_TAG | grep -E -- '-rc[0-9]+$';then + PRE_RELEASE=true + fi - - name: update stable tag for docs + # Ensure latest tag matches github.ref_name & not a pre-release + if [[ $LATEST_TAG == ${{ github.ref_name }} ]] && [[ $PRE_RELEASE != 'true' ]];then + echo "TAG_STABLE=true" >> $GITHUB_ENV + else + echo "TAG_STABLE=false" >> $GITHUB_ENV + fi + + - name: Update stable tag to latest version run: | - git tag -f stable ${{ github.event.inputs.tag }} + git tag -f stable ${{ github.ref_name }} git push -f origin stable - if: ${{ inputs.update_stable_tag }} - - - name: Draft release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ github.event.inputs.tag }} - draft: true - files: | - dist/kubectl-argo-rollouts-linux-amd64 - dist/kubectl-argo-rollouts-linux-arm64 - dist/kubectl-argo-rollouts-darwin-amd64 - dist/kubectl-argo-rollouts-darwin-arm64 - dist/kubectl-argo-rollouts-windows-amd64 - dist/argo-rollouts-checksums.txt - dist/argo-rollouts-checksums.sig - dist/argo-rollouts-cosign.pub - manifests/dashboard-install.yaml - manifests/install.yaml - manifests/namespace-install.yaml - manifests/notifications-install.yaml - docs/features/kustomize/rollout_cr_schema.json - /tmp/sbom.tar.gz - /tmp/sbom.tar.gz.sig - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + if: ${{ env.TAG_STABLE == 'true' }} diff --git a/docs/contributing-assets/release-action.png b/docs/contributing-assets/release-action.png deleted file mode 100644 index 6c0dc61f5ffbee0e7065fd3dcf3c73cdf5b3113e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48610 zcmdqIgHGz{HHH_{EFba#iq&?Vgu`JY8p&3`MR!OQWgNf5Vvr8 ztnBQ0_Tk{REV< zDjM;Sp#1MUdXKNhBDrJe#ulYRd?=Nk!Kj+mNe{y$e8mu9jn0j^p;X>8rTz8;0cnr= zc;I{8E2MnsMHUee^DH?`KFQ-yn1sYb7~idYf4Zmspu$7rA{mOvoUbP^tX)D-QAJk@Oen*)@#7o{no4C7zT`6ob^);HV)L1QT;^;n=w$h|->BYRWKK6_b|MAYo>tx7w80H@s=CDR z@V#7Ev0kSG+OdBHr<~F%p(ZZ7&HM!Ux@fn$JJPwn+FJ+%*k^o3LCQ48fd2`DcJs^` zBkZdu%&=&32a}s1X6=jDaS{1nM?stkD+9%x2o9*+S+S|Hyf8CfURSR=(X!i;6I}N? z*@|8Y44ft20|jdpSr9)|Bf+HJUkY}0!Kk6Y+MHM^O6xTUg29N-BHqH`1T#&-w|_#) zct-pU#_%oT4_H_V0_nH9A4xvKqJy4c4n4m$6=8s*H6>nzt@tFWhI-ih`VCHFaPqeo zuh7}vAARHVhI!tL&JmCf$@?`N)v!P{SHj2G4#Ap$|(UI2R>AyP7N;Q1u_M4 z3cBN4g%4b1D9h-);$l+tAGjxF%E;Rh(Im_#iTAl<-pPNYs)8l{l*U17^(pubeCG?5 zFrCkBZzwwvYC`P4NxfnAf8PCKBMfm9{|7wE2Me_k2FDbEsJIJBgrY4qc?L{7vP z;0g)eB0;sTvg|U6S;bj;9z124naS@q_>E$MSYxua(zO!KvN{DvQ`P%qU}Z3dFUbR% z)IgcJ66ZJp9o_TfnBf7O*GwFU9D|&D94(yG8P~cj+JyEI9$)Uv&FdH!g^#U{$sACd zQCH$g2UNbjd8L)ZIF5@SW4_7dBGYQrD%CpEO5BRMD%bhK7}fdxb^qWd!VR21LO13{ zWKVEVSU$}VCK!1<#1t+(L26N&Sx1GH%E)fiUS-8c30u&NHk_D30pY=jtGeuP>LJI54iOW1@ z-DWXmstOCJG&p7Iq|ZN^!b$YBWBXk+%t{HorQ$#)L+#R!^a5K|%RuDdp^9v5WS0aY=nixK)%@n^o!e z3_Pt-<>*?i8V~&=0p-Yn55-eVwjzx#jvkIdj*(Y^C!#0vq*A$nT)14kT)B2>qjskx zr#7dS)7HGSb+a!2F1oJ!JNSThQPrT*z}iQ|XHxHN-p4+7d|njB6sFW?*hkkFE^9&U zRg@~rE87xNH{ialxh*oVplpimhn*+iG|a29INO`z+&J8|n>0jvwHq^H$G*mSBnpT^Vni`p|y?z)N_!8!*;pjG+ z=5S=+G2gs))s$OKy5Lm1X5?4#V0IsSwRUAfNl_ z#s_%#CkJHv4?Y|}T>NbR$@v)kSp4`*35_m$=@SY1n-{vIlh^>17wAb*$*g>0np9D4 z>ts86>x_llu-R^@f7fnwCM{oILa$ffg#|VlBX=_6M=0*sir30CT-aXpaSdIILQCwg z$Z}lA2^LZf1_IJ{vNY3pvW~MlMSNoR#w)*d?f9Kn-qdRR)VM142cW5lWC*6><<2L? zsj33RDAh1PD85`g+}f64ROL{a&%LSR%wAO__y|!iBPh?gT>MI?rfG~43FNzzUs$$T zYFP(-jT;edRtQWrol7N2&QTVaa1C$^8j;$oyKKK~x?I>puePdM?|H7D+*;ySeY*U) ziTdd0{9G-4jjB;l)2E6LRo~Xa_R&Z~i9(N1!h0_7Ysvx508O5cQz}1qek7(F!3lzh_$UIyhNwK2pT3J@jm{_84`7tYv!!E%q(B znb!`ke-9wKSGWpzOnlm2dkDNYuzz94WLMXu*Q9z>c<38c_%!=Q{6u^>xE2us5%H++ z(2t0On22bOxP`A*IjN*h>O8!L{7Q6n-C@16N2aZK2k8}+z{StKko+?eG~wldn82!A z{09?H@=`K(r%-)2{lOJ)$M+|7ClB;+D(+sb?j%ohTMO^$n^d*)fr3p<$%}f60v>|b zVCnRaN4uFj+}y;X4TL6!UR_6JvT-_ z@6!`Mm+q9}PBiB6#w^F=kzA5?Jo+D8CgOj_PiBvPql_3}Jxrro97yDhjWIvl)H1*>-D7m0~we|>y+54@ebu^(*ttf@xoZD^B@LMFH;Hm;{JF4&iMSc=td21?Gb%%-aZI zn0GaBA1hI8tudc)c9bzBCBSSj%}uFsL6NV9=dI@Phe>Uf$&{75c;R4lP(Ce8mzNJO zmzUQz0Y0L`?2lxg9F)pn`MCdOp=;{3d?tiu6Kp&p{?;iFLS_UJbAtf&ly=s`dT3R}}**Lq) zn`&!AA0WR0=()kb;L-j%Vda4|KcM~3+iL2%>nbY=nmaqPy|!>Rvt;vjeDkXx7-4Tg z=&hrr`)dksM+YZ2L2nVN-!%lG_rD&qQ&Ie`;%+ZOrK_w)A?569Nx{d)!Nx%)ib6p_ zA?#{lB?y$3{iiwfmk5=OyZakKc6Ki>FE%f3HfL9Bc1{5S0d@{9b}lYfXbo03A1C+M z-mFe;)PFkpUq8~8ZsxAGZ`^I2ohW|w``XOe!(D`m>eoR3e*VnU(%bgGk(}KAAqz?% z`>zsqPBsqqfBS|u75?>9P|eoc(m_w!))C4x=oq3r0vy7>>;HdB{u}YHmb(A7z~Gd7yi>wnEe;!e{tdun}0ur@>vu`nEhXwiK0xl zQ0zd(NMb9kstLV9mF)Ki0{w=@V=%w2(9?*JPA!HS21Xo4URpxa8}>LC@hy(ba#)Y0 z*AnfXgY1K97dQPE?r1$u`V=Wl%x9*bbDj~XVQ>^g5K@27q0MY4&HF$@Yn`TiY~l>j zRQ6C^&t1#S47j%_=>Y18iR7W1=xFUdG=nM>S`%TA6aGEKMKFho66Ude^3vb|Z~u3Q zV}D4v2p5N=`S(z(g=YXkqVnnKVX-LwcR(xg|62ok^Z(aM2`=yzOrs#zHKuYFBWf+& z;v^j{MlCHZ!Ua{&2zb{}abx2=&D~u^V~NBaeBR`rTX;$78?EDP@sj%1Wj<8D85S%J zPf@sAi9dXolo}bul@Aa2kcP}-Hw{F|_A0~XEKZoe7_+$i!|-9uGQ$o-ChZ4D>H_6# zp45R@V#UNejj~4^92}Yj3`M8}K}sJA3nfQJM?jhnj2c1nX;pKM6t4P{g$+CWj=8Sc z<(eN7N+hE#<$uf6E>yffi&jAv|F9YL0u>|`{t~FEsmZ)&Rs1+l&|#%zM|B>HiS5@rLmTZ^v@udQWuY?ffuFB6 zVOLCNO`faNIf%n)J_gz+0#R%q*6s6he<>6Z4{Qt}tAVhFSc&sgVR72jbF>hARX9R` z>3I^ZzQQ?v|G)`gv|i9xtX*F9mN-%&K=k*qqVJq_R`9;3T|HG=M>l1l~M7I1--DlEI?bp43^6{viz_{(&vD z5m=qydU-0cZA=?tTbk>c0Q)eJqGDGU=yX778q&D(d~IhAKVP+d%ExVQ7`ZgB#&W*e zA_UyFXOfZ~9zUtqvhH6*vU()mLU3_-k}Q@!3FKHO0z*h<YN-$PZ|9v*_eFe@m(I<1QKmB~A zRx^=|;*6j^BX9~%sb)^jw5vOlBM&hAQRC#`xYC&DweGJ>#A|0U>Qd?pU%?EbcIwf{ z3;eDZFwI$XmX;^tdF}C5@~}_c8WCq&P-+bOkHw!w2)@GtN{es!pX^2`8rHj)llXwo zuQ1QKRYfQb9M;#;Dl00c?|poH_*h%9E0s7%rH}&i1r(Jh8PnKuI{<-EwJK=Mdso!P zWFxdA?2LNMLF0LqR9}e8<)!3nYI77|!$l>;T(-A@Xyl`}O%crxv|9ym^pk_E`mFSd6Dly|>Eo6BHNDQGM%hxg<3(i8o^JQ@r|(;_A&+%~;IvA%9;LGm@^JEiD$`YJ zs*f6?z7tltfwDojkN4!@^Tv3w1Y##bHs{XUw6VeQe*Bk-$ttfTB5k)K9C{v~?PNRm z%s|BauUT#9DpDPf)~+|w6~l}Q;#CDVy$L;sW%$sAN^|CQ0w2%V1y3$*^A#i{g4fyg zT2$ynuUfxmoM$=`6RtS7R3F#fpH5$cMW{j$cj#TTq=cE2}oFiedepN<-4%%D*^Hfh_7p6*CRsl1z|<{2M! zR;1dpiSn$4hf{}h@TUY2>5$CR1SyA_S6Z5yLo$7A$?;;3v(4D6y&(nJPOakVD`*+wCCH3ap3e|-+4BR= zL%W&z*WTokcnbB?KqW9eA|vD zLHE@;Q%?>?J5`U+u^JE;w-CuaK`gqhlVs-FLSJxJ_DuX4pN$LXoS~EY2j{Hs;dBMX z`tm%EFxMUiq=-Ovl6S}roG3S*ek9`!6c@NO0pw^F9BLA%(6D@mdJ%`y4BXR&AwAS_ zuMF{H@hD|1a51$VYGSr-7B(K~E48ar5Xt-(*Q1GRI%L~D52~o!R~$Q7qioOPct^Vh z7j_;kce?9}EL)7c=JsywA5C2M)#Z)?{Ncm>g@1gLay@&7e)w~c+();0$;#e<58sOc z)aI?@qx{SMO}<68h)OV9-NrWwpsnq`Ywx^kzs?|R*?sS|o-|+GHMn_zHT`Y-@#4Z& zpzyj*o65xdigC$3S$X@BNzHme{O?+gOo@6(H&jj&kglcVe14-4HE*Y(cF)c=jZp%rNU&3j`;TzJsf(*8Nvb?IkV@S zU4E#6=1pzt0Q+RN6}sOJO_>`Ugcj7QCVlzUit6omf(<8koIxlD=*a@4o7WG?ZKj=0 zZ@#!($0U(;oLOC(ofx_waQHmEk9WU{VI)5~&$Y^=sVcpz4RR{lCBhsvaOyNp7rK7e z>+3-GY|}J(m7x)3^(pTrJDuOjf?|BIM>vn6 z$C$^(GO=?7XZPUf%2{Wnj#=wn)aY(TQ9RZ)J0ijSTZr0BotB)!k)*7PBhIw@>g#5S z-~N08C;XuXz+6HcWx*RrjMexfhEe z;XC;X;^9Vt#hnkQes}6W(+r##F&NqHuH%?=EKOd#+1U&qhAbFYAGNE`Y__b@Ad-5& zb;EPU=R#rZ_gpH*AB`L&FTFORlu2>h%k`W+=tZXn^@4Ti#OR6LS12+Z;wza!ylr%S z7`dN7>@4??vjFtjB*DXRp`G{fVt5f^>nNea$^^tQoSzq+TE8<1DM`@J{-DNXtY#+c zr-e$?+g$Irp9!F7K$=ZYkenVrJ(Guz@aM9u@IT+xA&O(RXRC%%n9f}yTjh8dXQZSJ zSR1^w3VSrRE8(YOqa11XxjvmfQgeQ>rx7n!!M?jAT6%Pr?cAyIQe=^s*bmaQu<{xu zUKsoqYU@v%g6656L$Y#`7j8A{Ogxp3i< zZs@l!8l6Mz>lnO_1MY3$dSqU0L^XT2lU5$;Jo*Qn?V~sT-voRvPm>V6k@#n027E~FndD_+bM;?;z?H$^; zS?dfj(^yfQ*s^ua0m-<)7_We*zWALB<}S)-uXL(159V;EvkbBCX6_fU!6S$S*zNi< zIhd5)-&Q52&%}&FmVP2Uv)!Jn*NITb_dFbS-NbM{pl?h(Wz9;N50BYuX8;{^cR0lV z_BK8kBU>aTn3dB=lZ@fz7={3r#yhTgmM-p?lLNR%)-ty}XhGxwKO$l$UOey5?izoHi#A9qC>PX2tt0j7BP|Xl=rfl}U zP~r3`+!Nprzu&AUdc`LV=6NfKr6F=V#4G1~z&{=A*84sjdqpQS3kRv}Xank-a7A@% z0CI(FjHh;KT+)9}mSPlXwkhFs+FVr`2@X6^$u2Yb*&yqyVpYcyBV?@BGWCCU5+#( z;}vt2C&cfRu4YtC1?Zh6@d}$o9=qa)r#G(60>+Fy&x?)xw#Ph4fgc5KLD&#xjiB3I ze4n4gr6<%^qNO=I(Qs67LYtV*{)c_&>*Q`P4)X3vK3Eb+-i@G69Jr;YrpiCTK4Zma zISoqB;@RmgAA#C5c42IfCHl?-xqKx)=8%FLZ%s`rtZ zn^wfG=d|7Y9Lnn3ito=#2MuD`x{qB=1T;4M&EckFqrz7_l|yh&%sRg#(_hzhBBGH{ zJWL>|^0^grY5lU+1t#8SB6Mb%XbXW2zVh#uCY$vT@oYOzI~#mQXGQ3Q%zI{Ns|A=r zIFm6CC-uLhGPO$hLq)(Ez~~3uIn!6pYhTnc>iVnYQT98UdM|2_lLfDS2#&h!5GkMV-N}-+Ybdr9JI8>MxUhe2=>;!CLk)czAes6K+L(x$G zM6mh8j;jB@M9266gnx~Sz3XQbTX^XCdqrtVeVg@Jo~`+8Fi@%e&3=*Kg2iEn^D&&p zk;E7yrE-4AcgrmitNee0V+yr&$t-CvAXB~n zEs9>NO``khEa#y?7|@QT4~1ItmGk4qbhW`kgpFO82k*h@&K9o^zDX+2dv64d#F-on zV3bW~{ zrnK~BH3>xW%7}-Z8)=|G!r^Eey9@a#r9oCp;$I$C0x2{}w&aq(IJ!!yhPEBu>a7D% zwi5ipV@VmyUWB9O=60j}dkx0OhY95oCI6lz?ucC$_dymL2yQ3=W+f#Iq)jbSjg(nC zKIJTm{+g`?J#@C7>-<;kuQ4KMEAtYxu>cpBje_ve!Uo-jKD zL&T6Z9CCuVD|`j@+u^2T_Rtp1u}mQyu{`!eFgkt1ce6w6=`V%&w>I5;(mXC=B+plA ze>+h_3UEhwk976jl7b%l49Z#akA9yTu&{)b;cO`q*j}^hb!g+U=rc^0iAM=KU=~|X z_0QtOETFT3A`v)%(o^2;7Ch&-W5qwR{}?qLq!hMXRxL|=kn$1VbcI%>VH=AvBC>^W zu(ugO?Ip8zRRT1PAaA^F1)TMyhJ;XSA7l`=OEzBaJ+ylVXllAet& zJkvZ&Vw4tYvEGc;bb(ZOn8$giKGqNi+!PJxV!zCxN1Oe8P2xK|(&7(#LfJ;7oM?IM zVF@Lw(%c&2MJD;QqojWVa(#L=Ej_y8=)i^TDX3G<6dD@Z6sVH-7M?3vJZI5V#N!o1 z%( zE6F9VHLSqM;J{+k;a+~O9|lr@Ym@)*xMuzM^A>2V&K8^1m;%jo_4gY>r-y926FOfT zB6~I1;TmPNY68RkE58R_3n&!yyS+=|+8b?_6qcK9lPz^VohFIXVV02w=|cnkD*dME zY$I}NL853$cY#>204?aT(1X2D!aFfH#v@VbPf~X%5H8g|U9o?p2OP>{zb>h0TO=D> z|Mb}#fhIv69(Y|1Ia(NriW*h^Pf2Wyu=wOxJRA^%7eB9+9Nx!m7(r|HcaWZCsX3n_YiTjf?GcqR9M&m2? z-zluEe3PbgLoSc7b!U`O)G7>Zypoyi+W&}_9W8(FbSy}U@diVep5M;=b?P51I*aYiETyg3CYp+?R15n!{GsWYFPE`(jR|gm4cyMkJD8 zn^wIj`NN1=0oVxJ-F7WtIo^0}1w(RY#fTle>|y7MFeNe#O+x*O%Bk22AOC zCU%nxlqit8I`=TUQ-O5jkS+7=WdX3lj7S5ZfvtWG)HwRsJ>3d-*c{6|%j-|Bp5zc{ zxA3~s<#z($k8wSW6&Eguw$sOq#6;e-m$$4csoq`I&S`e^ai(AQXqBN3;o%MD&QrWrQzA3Dcq_Mk^m>ZBi>HQyglV%uBLJh7?WR6M= zKGB1Q*gb1rW^w;)?5RZo~|N zVrDYJjE1m^1~+3~YX84|b49-8q#Cl>9%*W~x4c!RwPfT)>u+sMG2&DZl0`ZxKYodF z{}Py@VJ;KQw*{umC=TVRL!t|!@_UEG{i12}sX`lPcA@bgOT=aNb%_d_*S{SDC<5Rq zib54+4VoNkh>hx8n^JV-6wKWjE4~Xv&Lz$*x*qbxJc4Fh6YIr^gO9lOJd>qrUwS0J zyC3GQvAMb-M= z@rOE9`qZ)t%&8f49WvNW7Ki!|4MOEUAc5LyvbJpxYDR&kX6UB#_f7@^IY6?rTBty7 z@?G^*^A__qj+dt+W)QYYftm*NxT7rtzAyM`z zDN$xky0v1aHHhEW;JeaeeRmOoOhra`(GPO;x$-9>^fZS-O^$u z=p$uqR?Nk*Spb>W?u=vHj}}asXEZ!4S(Svn++(d9&GJpjF&bIT?jkMqwmg}#V93%) zNy!=U9x_t-RP_z6xs0@7Tdj_mHv3G}J}k zX=+lm2NHl9eDhwDBmP*#Ut_S|aGM=8J6DE!ZnYJc*G4~QE}ZgCg~-QdE{!w~;{O;f5tP^`xrt&+GH!^ZDtK%!*)Cuc2$vPj1*sJr2Hmoi-;I5w`)!4O zQ5lELP^M-syWoeNVJ0K{9_cf1S(6DRi|(q$^qEUsY!fYWxh&fnoig#8C2yz5b|*cP z5I$p>04{Tfx&uq8FBLeuZgPW0D<~yZPq( z3|As1tRq8hB}WZU`tB*B-Ug8uCb_;A&YI)4EIDTI2Q z*q!y&3GMg^VIdv}tU}7)ICfbJds7Td5q{f4=*k~VLjO%hb~~O>IpmXqZ4PH~J$trKaX>e#g9&&{%66oyj%SGuhZ z4wR6k4;4EP*a?cY!(XTlBl4G(6(n<+*7YXO-V8cstw(AvntblsH+>oZmlYric9)iY ze=?9hP4r5c$NWXPMk5Otb*YZ3bPh`+Ky+}yELT^mx5?MC2(=tnOpD`-j85G_JMP14 z3m#3D6e~fj8WKgx0Oj`B540w9SkSF<&P}{3+)BwW2WGeyg8wSgIQEbZb_S8o+%abW z3jnIZ(B3eD!wN)gfM)wmhnt9WvtI#R8$ml}s6acT`u9S+8%$uc{z!!3NsOAEJN z3U{qaEr(kdb15ohi~3P?t5$KRz)e%gZcJD}a+7uU9Z?GSxg8#vl`XrcA*hizc>Y%w(g z;$G2z9tM|;TZPVAzd1DP3`$Cx(xqCq2`I+VOqDk-zSGd6jJ-(73%j#y|K$8XrGdp7 zqJhgxkYANKo0&7AF8-c#V8=h_Nl|iCIa{ydg8)q3&}F(H8oiUfb?Mh+&b^DEYvR+l zL&IAE6|k6P`g6!fqyvJnW$ zG%N6IOQSL?rX+=9&8 z8Y#T2q?G4hd1*lBmb2B{qJ{kG>R_bAsm~*G?QV_+Eh*o}vO)w$*#DCNMX&?SM_=Vg z7Nc&USC{Zcbjp_aAXBbQc_J{kl*`CVS|5r?)&L-v`=)p86+u@Fl_j-qokeLGi2Q8E z)K-+`9jAyTj`Uw30&yn{4j>A>q0Xdi#jFLr!}>G#R05RPd1(a*h;B}^$r4BPESgFC z&t7hgvf`S2;4f4CzhmclFzu-J;ox<~zNY@n6aa<*mth$>>4H>+@-A*oJ|w64fqTt6)wN zg7+S-=?ivIQQP_ZZLNRDO%UgSqf^i?NPEXLxKa!U`*l*uON&={3i$+n4a;_uv)EW| zmLAlL;t7YHci{I7{$mmGyuEPwLt#DcbXkR=V52>&a#XatsMvqY>|1!(Xz}58pkAXz zTh#<}%Je{WXLMz7%HiPovRvw?EDwP47mbcmK^ZPC6mCagw-T=L#2};%lD$3m-?ZMw zzYTE6UjQhetb`1D(NPvto`KPj(d6W{G_(P8j2fxxvo`wOx^hbVhx5Y=wq*acgod_w z!AqBTHsyu}i^fJ7=7r-mUi~9XQh0V&8{3nuB?V?6P1JIOPq8uWib9!46;7YX%8+cA zuyUm-d2Me0M5e#Jk~Vo5$*5|Oix334%Ux-oLoQJaq zjwM7R7dH=;tYG}{{&xWP8*Jd3|JDTH(lwU=lr!`|)d$RV9D8W!%XWpW@pBN$$*8Ew zs@G;<0%OC-|F!5e2}kfT2{js+Kz5!;W)+I!JX<@S@0eZ0x^t|HoS*^WDXV=PI{6k; z^v)SStV$}-uD?a??f*4s&Rfjsq|ct4@)vhm=8ENb+ST!!yC2?^rE-5^cD}H_oclPX zR!?1|?HB7)fsz*$MueobRA&(E6lD&OlD?Js?`;!M_=I$zbIBykshPKbDP_n%@J^O4 zY?_2o%ktu)^PMQA2l?Dl7ztr$*s{DzS>=Qlt&j)v><}Y}=-FSoKw*tcK>6Tm+y?AT z@LpzTjazRbW|T=yU7)^J0Dtz+58`1y$?TM;71+)|mUz zh$FNZouWR(Om^89^Q1q-2_oY9duD^kA)z?QS(0XiSaRFhg03jpFEY!{)hC!-c96;i zC8MyW6*4RVqSf!i;Y)$q6sJ=Naw#3YJW7|H5>3ViNZOR*a@sLWOTuogm0n(Poz{!%LqLrBJcD5k1>+JU0NP z>;K`nF69Y^Z@NffcEN{I+_41RJF>O#5!e_!wX>y;xOys9o-oahVnNBIWfDp>pVIM$ zDfKm+k#ZzP@+EtVpZ}toD1r^?G4O!6lpbHWmy7)J6X0T~i|5U>sOVnFpx9Co%5*nt zq6LpQBjBj;E{N7qX ztx+u@i2WP2AI$b&QGkHzCnQ^X$dG831JM*%Y(TDJIme~slv7Dd4)7pJr2Aby(y>tv zlA!K@1B?y+`^~w8H>B+Ew_}vS;AyOVpAqLxB+;~~p8D3o!O7Uzr%j*0L{3Ab7c44O z492fd1wAL5v!~Pw#b@~rq7&c!YX)s9pHOW5lRmN?_9etT@!!$9@w!%bq`ind)#D!DyBr=k0s7A6c4R zqnGKbdnHdF@?ut6G_jY+wN{o-%Sl?QFAQospXCZ;T~ zQ)E;iQUqwV(>E26ZhZBne`lu>Lz9y)83nbV|ChC62I&(@VX6ZP?sduT1zQO*X|-Y! z!qC{tJw1e=X(4^qu81-PO}W$V=5e*Ga)%ks%}_-s^=_MgQNQyFmKsF5QZ9G(QNFd9 zPvPwIgE}y|7#QoFg;D_T|5~HrxKGlKCtY1}M&RVzk!=ti#@642sD8o)R!399@~Q)eUjL};Qb7%ule)!_*Lnp` z)hVIpWqjMN(bW6fYl`toYJO!6?ZRPuoL8#d6xlx%?-Fe0xka2Kt3UO#*B8mO*U zZqLi+z;b&V3v}pZ?l#+1(5o{GZM2(H&~I`m$7a^*IP|KxMny#di9Za_qb*!qzYCo% zQ_pj^*$}O)r8PK%z5lbUs|CQlrtGhjl9B*=m#1kYV+e+cGZ8|l%8VzuaWEhw;TMo} zTwr5?(u}4g9pA$TvP5-=82^OurwJTNnT?=)fzjx16@kv3Q(?crEdgk~@lcRYCS)+5 z&!<6|zq(m`NtWnlTyHOjo;(m7S@LFWPG_i`K0kv8bLg1VD>fp z;_8U~=mCmOVd``4(KsV_RbwX%SU8by$z?=%x*uhCg?R7}^KS%Nceqcic@6b;y=)v@ zrTm?5rU+J||AxYNjN!EZfF1WP%RGRUQg4o|d>5zb=jSMR=NIMaMG9qGo*V21f~4dX zuQg{SE4uMn$71BJDs^fTNj=y4)(7$P0~8+H#^$dU*D?j%(n#FBowIo$Mb}VVrwT=JR1A?s&hyZ6oA$H?Dz5z%tB!r+UUs4TsVN{!841iHlftSPsMd8 zvOd`2RdADwrIPU(+L>mj$lsE;08dXQXyQ9xXqU^!cA9 zAylD|1W2hM4Z9=YoR-BG6EeNxe*lRtCN8c zL<4n~Iv(|)RkRcB^6uC6P=u-TPv!yWA3OUH5JIOreYjgH*5v>{(RstJ*lFLdI6%-v zf*A_c7+%j+%mMZE3gYz}Z3@Oy*^lN^M^we0s;*mBu1o~k6BF741{T)~3(fSJ?25nU zK*Dpp?M(dcCQ1WA*Xkvidt+mCg* zO&qK@v_X-FhLHQC^#F|rq59kxC#EdmiKhpdeDkB~=BSnQ-O=siFi8{*k|Pff$&pbj1x|pgc-i6$ui3IzPjD7yB-lSKbvucr$7Hj zB6RlXyz=-ZoIF9qb7PE5?Cy((>-Jb5(|PQ4I+1(fdhpf8SgKdf4&BG1bC4o2VXNi-n-um=b<0NTS>Vl7Gs4oB2f>DogZfJqp=EIL z9T*BSx|1b02^vfFjd(l!<&~~s^iubOSr)E2DA#Qr!{_<|-TmsLB3sJi!(CP(=0@qY zkYdT$4GYy8jgqff;c;uKLF&Z8V=D& ztw`EK0?N=gpXHTlXOOxfVneeE(KzgAmTt-b%m+c4$RuXI-h5(dM6UB71E<#w7`#7K zpJ27!9l{!BYR_z4`#(nKrtEjjSo^b;LN4Lq;W!><&>bWI@K%l4C#!DHhY~LP;CR7X zueBrCd%$J_+hU~$g%OKT7=wvW^xCXf54uQedQuW*cUd7bNa&7z*A&E!M9T>Kh@^NUxwk)OW0-(x1dsL(KZ6URHM+8e=dKki9#VC7fcWG{v87KeHNss61-1nfH)9mSLd;9>B6n5#FyZ|PW z;kAH?fNJ+{@K2hDR*!>eOS`n|NNv~29w?Yqn{UkmJCnUomaSZ9?_R=rUS?f`82&`*y3c z7K)jAnsTJ(x*0~?JURRZ7Nh~n*cckp!slh3rC4SuXcw!7%2ATijb&wZop;N` z-96H;ZCRuj>JUP4Y$NiD9wxePrtukN$eL&7&OSf^_J{2J&JhPf)8__#4|{(c!buKj zEbdrqwPcW~$?z=fO)h+&RRAueV;Hj%@vv>-r&X12@G1G)Tdw!W3yoZOiH5tn&97y6@aBbP^UT;ss zD5QxImsQQduw z>v3d&1JAiw>2)GAdk2jnWh1}+Jo)s|$0CQjiH!ilI$eKZN)Lq21=#!H40YKg!Wa~T3P?voVWiVW>$!bCh8&bhmSb>E%~h~KqMQy!?hE^8LIivvNVQ@QvNM5z*bK$^;SE+s!~C5v|_&88MnL= zm`r@^B|qF=(L_tD_1$l5IjKTy@3H!+?CIm&QORSUUem4i%CZ;~jBEb&@#o{clEF(4 zJT^m%(Tc$)KIe{HKTXEOGRc+mX8sM|!Flzmxrjo$>8P>6+q7C;Om(^pj`MSRM^fHA zRqIMXsd5K6s`BJ9oII%TQtQi9iIMOz%E}HD6k|6tcOk{Mc3h=#y=ZxT;Z z-I;D%_q9Dw%|2Gvs}JbQTn~tO_DPkq=FZtQ7D}a+bp?E5yOjechyJvud{1ro#*L1& z%e`G351M@lR8bv0^p6V$9CZcg`hhJc+8=| zG?N8h+HvKx2Tk5eIXvci#a`{6|4!chLeX%nBO=q@x^;+9zPEI288+E_GnT^0 z&jo-ttFId)$-kpXGdwMZoYzA^>!$qQ!;k^t*P<$W*@G7uU%B>w76_i?@*7VjGLyX6 z4+=AM-86k@rsfv@7KhnVHrQr7J0I{OVB15dau8zN(OxhaZZMF$zby+mYc~%e3Eb~> z;_WztCcw;W_Ifsga4)Akm8n3d-uluZJ-5QHh87>cF61juU7rq@<|o?E!Sgs+k+2P@ zm{AcI#+%E*!4?XVzMkYA5Za%+wG^mx~A;|f9 zbvMdhrUl=AKY}pYDR?U&GA;m3^f`>kP0Nl|@e`9>n`7bf@l!cm)V5ze=fqy(XhSjA z|0gu&QG)A5DtD2@et1Fl9@yCVCIsiT_HNe4SsTd;;#mQP(yuejwG}psO@o>39Nj`t zjLa%4LvAlW?`t3?&F5U*t@**7xbRc*(t$;f$>Gzl_AQ20515B82b^-@2;s6Pk)!DqMM8bU*PwbtWp#5rP`&mob2c8`y)(RKNL}u`T;;J8p=1 zZ^(sn-ZI?7U#`A0wc#Mp`OTAWF52pGm5>+(FKj7s=sPO%72`CiFWs7$SK8Ym;vt|n+hvgIA z!SrL|g20KbwdaG(V+iMkS=w#mhR}>(_uEyMVhrYt9(Y|KM-;L;TfD~+*!C~n6OxRL%f~uJ1WXPTMadT3 zDf__o7VAEsJhI*F()jsi0muEJ4-L?GWA1$ zxajG_IH72q3ehSkuEsif`rg=ySoQ6Oz|v52Iu&QgR97yx>_UTi%SW628dM9;SXz*A zg1}%dJV#UQ(Fkm`W*7;x-n?xx0yZk@a^2GE2Y`yybU+W+bhdv`vrOBQZW?t|t1`Q? zZS$_6>*sIkmSF_=;0Ku*2z5b*4I%Y-TP)cT)t@)gmp;p!eheshjChK!kT?SyN}Sb- z_Q4kF_!rHNdm=~En05y-Svq;GbwIF(7x=CXF&(aF-dPoX?RGeAUT;_Y3g5VHEbWzB z_{m{#tfgn6btHup5(itu*0nniM`WSKOn3RARX6?3PaSga@UCAq$-z|3Jkv$$g$r0# z18{(10dxP+5l0EbD7^VPoMfGg)4ca;|*B)a+P&A1P(u$%^eqN94Ppq zI>TNFI?J}i{M=d~l_EHdV_p7ra>aZT)1(&L@)W7X^;3d896p`)XAl8TP;M;O!3y;i zt;EO5!-ZNCe_rK6chwJ&Ay6z#*Ii&C5yqeYmmU{-^BNh?Yz3{OTkf4)edaAwN&ZHT zkU#m4lYk8pq;a-cQVQ8%{d_ubfEaqD?;pW~8^&_=xp5EyQLDIH-C<5y^2e=Oas6&d zK|mnQ2-|JG1~rOa`5L9*hh)PVQEH4VV%lQ4(&$dFef>}o`s2|US!o)lz1UM-lp@)n zKB3?#RqJj}wy`h>eh(VFu2dAg`G6}dwe3DJOFF$JXksGD8+$x4`>(>yX~-J{Lw*oz zcwMr&;^&n1Cnb%66^uwSlRaP;tNJyopdU#vMyHfgh$6i=bk#o5K{N|1VBqir%!!w3 zW9h2|<{*gD6;zE)ov+js2eJKeRCsV<{#}e%1w&n^VG|G zEf~@vx*aNjIQQ#1^jCA(dmSZO1tc8_9kcxFpCICkx)vopuf6t<501?{PTs>cU5nMU zksna>WToJ~j#hSyGmL>6SBTRco3P3E`mM!%QBI6bvXA`}O?}VnH*ieIK!yn9u!~kR zB!>b^S&v;ED7K2|Tq>3j;Den#O6rwxSgvXBSnero5+)rQd{Bs!f6bu>8GPx-EPms# zY#;o|$pY(_nsXa2Pp9ntj8;R%)MreyH#o+k-Cuf)t5_KZ)-x!5*u8u4)GKokD(6=cDkYY$AQ@M@2gWZ)47e5W8Sr+n{yU`D35^LXF6X$gZ z`E=w$k9^h!exl2{bNGZbKwlr7>cxvB)_Bu>AXeV_p2=a3i9*j9Kr&pm(WLRzt2|3Dz_Zn4EerUJTg!z7E(R!YiUoB}i zwck|Gi}fB!+z{ZOyM4U|v-n!7RC#CyISKE_v&d*1lA5o7hUms=G0OGzFv43b>Z!Z+ z&4+m{CWl_gaSgXe@pf{9atMM`p$?amDV3brYEj+2H~#~|8NPt^!4y~tfpb-75WSaq zM+H|>TI38^2F$&90f^@96c7QaGMjMTqdmbpl2p=zi0(UnE-Ck?TXe?HnIcb;Ln8J# zbKO5SayP1z4c{QiSB69-#y#&9 z#rgl#SutHHqw`8?Bd9Z|OB+sQ%Ex!I ziA64z2xXfgQhFoyxSR^~GuvEaw~swV{_KHg|8facN*0Njey<^yW7rk1IJU7};6K7d z20*HAi6B$TG%SF2oK_Oz#V_*xGC=@>JFWdG`bU@bn~b7@hlnDx;UmB_R2wN_Q^YFk zh9^Ho>mp2E6c)a(V`J?qD`c|eUMc+_{MP#gtlU?QGoyAG%Aqs+X46M57LKC=!6?st z5@8J#0S3nW-*<66_n}Dhjo3p!;uU*F80*Ln(ew1<5dVW-0P^#9U;xn@{Q^Ie2>(YI zkK_!%^w<4C2+H?S-jgN(CCqQ??QWBT;5Hz83qSu!OutZQ@_8`mBnfg$BDBqHKIr*G z_+jtyl18FmM!HD}*{wyK{`4aSJ#ha8nspE$DhlzI7yC=+=JKbAMN??w$I0V-5Rl9mltaN)?flNoMNd{c7S^fe@iB3L~fF45sgSlQof9Czplk|=-?tkdSpW-mSs0Mfk{Qi6O zckn1YKvnPee&BDq#v}&7?Jv&M>-Z0H;sWbK1a$elfqH+_N{mARo%!@=h1P#1#P!q# zWc$&XopgWSTrB`7_TN+ipksycrLl6OeQ`{|V}HL$bG`>$k}e=G_ryT#l`X{I+1U}@ z_{jrk@e8U9m(^gVIR1Ei%T_2bhxQuvz+-{r2jccvP#69*pAZ4i9xycVRH{V5@f2f>xM?r57Jd>B zGKC0G27mDBVpZZ`G|Cuj!XLBqwI;-X7QUbZ`&8~v6Z~m8;aF~6+xDNn4OQ;ovn9>A z`}i_BSvkT?Ked5x*$HqxACNj#xIa28SJ(z(X-^dB2nvWC98#U~y*wo16HtQpDKz>Q z;eaq$=PqtPQqzSn8)fWsTR9Z8?yJ`Xxxr}E<1#_5Lgp1?0-t1)USIpE|7H#VfnY4u zdHZD24)%yc$CkTd=?y182*J`1WZ-dCp;lMsF88Ioo1APeH(c1ZcE<~3Yi!dWUnURF z6k?zuErXG;QZIMX8{}$BmOw({YFQyf-@8rU_i}+njN2J!O+2)2A1s?S{OS&g(qDDc zjt2q+g9s?D*S$Fr9V$Ai=uC zFI5hMV>MD~dOOu>s zCwe^KDJ_&mV^~bf6@UF*r$*=^>!uOwhV`KvSSCGuS5rbo^_b59~%<8>#8Zc7CEnN;|gbap~ z2wR^yMCYq5h#hBY<}euF?~T_7GZ>9`e%?B~?rl7Y%p+na@W-+)Q*#)K{pyn1RCf2` zrJ?!6#`-dgf&=gO<^$`oBL%5iH0rD#K6QvsHrBde)wQO09Dj{U&o;?gwwx$FyPzNG zZ->MpA+W$%gKW#r2X}uw@{lQ*o~EFnh#6|MK&yU-{0NlM9h(jRC9v*(mk|=slqEBo z=)2VD4`DQhr?R_TMMx8z^!5di`c66&Mzhd(M7CRO1I7lQr={K*!I2sT-y zqQJC4&|jq4ssTX7WWeASc7l3!C!?T1^pZF*WLDr277i?u_n5CX!z>Ko14L6cdlh=) zE$WR4m&Q@j^71)_J6l_OCw2!Sdbt=Q3*|cg0XANHi%#d0)$s%R$>vcgwbdpw{ppoE zLIY?+Iim4Y<51pS$fjRL(kq|kN{dnF90@MxRW6q=SM~3jhwNGRDENdplkduxnP=V? zdE28?DCIlZub58wNZZ@MPhcP4<9Ixf9!-7Ofj?S+Odd(nfiaq1B(skJ#Au!`^LX7@ z;%CtAzLPg~41j(}!OwbV0!Vji&GiV|b<-mKw#JbsH}zt4Yng^+-Ya2l#cLaI~qq z(5O*f8vdKRbbt-SpBwb(_ewnBCZFxsB)tkK@-^O)d81j*iBVoZ6{`!K9$6g^i|wfs z-Ptki*PUl%Xr%RC~EdJngj3MB3UpjmakijS4}dXF4f_%>5r%}q*f z0@>|Ihn4#_g$1J?EZv(SX2Zx%-NHt}@F_Q1h%nBp5B1wW1_(M)@UO=QN_*?>djf=FCjgkX)#MIR@|=RTHNmPO-_R=2DYPt{LDaUlgd)C zQNuoMb9fYBJ~7P@Z3nC?iW>C}X@2wcUpk~6=#ZS89P87y=IU8>>oKXlnQMlHd;i#r zC99pK3czkhC^E?JiNhv$$j0{~EHZm@O^|55X?0kb_){swfH-rwPdM8;jni%H%pyf2 z4vMZWSAR+Uv4GQ4S6_{qC8V?lpUaTGk8KZDO|)-t+>P#VOgkgTuU_79Zho4f8tW;t zxz?FXl~LTl8BLeizMy-z^**;vAdbfMXu#J~9hQSho&ih_4-#ilRDkqjXbtyO`|MIl z-JMF}!#FwMrGR7oI7_gh7cI_Iz9*Y25nuThzM^N$zB{x<^=i(5Iu%t?$lHysHQdk) zzxc$+O?Q?M{jNft=|iolE{gAa=)GC1>w($(rN(EdF>MU9M0w8T(eUlz(DG+pUl}HT=v!%tML5D zVX#;h<3}(UX!pOIR&)h85qhiNpMc*-OaM@SEXp>pXt@j@_NLsF1SbF}q3EPJ%iO$uoQd{gL;Iow>&0*QNR1#xojmc==qA4Hut z#{|t{E{|q3r)PY;1cb`N4c7xy&0|vS=cP}3Z}=Jg>^qMLA_)yr=Oq2$IW$i;bml`w zHU}%;?(6ho<2(16me^*pbru2eq3-sevh@Pia=jR9DvMnd_nVRTuB~}l`6C?9UVTy2 z24dymtsb|R%wO;7knONb*3Puh2jWys@hbHn@c_4qX$^;G`nx_~-k&oxt0^{=qP=TK z{#ZnSnlP?***f`BG2-Q@1kWT&hA2gax>NK+@I8znvND1+U|}@ zJ0F)fn$u4U+JUO5bWt92BDxz)ek=Gq?_L&}ZOt4$DC%Bvi9>FkK_pwZ-fu-}&6mV# zp6q>XJ1Lp_ko2YT8O$ll-l0w^xO0`jiEPF)AMjs4`WxPA?}$70Th3Jp+AEou_k zvia(St;(tV5ya~D>#yDKZu$Y7QkFOTfp*$5PyKpyFJdLK7GXxF0C}<}t1I}@QHd?c zVQU<9JYzNM*f;(ia=`g<<1s!$ID+6RuDWu*0l9 z3dt9THv7MBDX(sdXEdYWm}jMM2<~8Cr#;Q>+|3@5k8|AhCLe|AHK+;qs8sr6*%g&+ z^b`7F9#*MJriN`bYj|w&H(PMvw%TkDPWbPnEUf^f_rXU`Q-NeX55AKP(@xj%={z7J}3C=K*X(!6%SEX)eN@rK)QqBX@! zES|{}+|LJ*M<6b$U(XJNL3c^{5rltPBz`WRXS(h&8;S8f-5BGjdAwQ@><&2-bc=NF znwlwCgGdXIxWC}VbaI$uyS(9R|1!OA+9zbB-cM5E$)l3W+Q;&;AeM3gmJ`sk)BX|o z&d_@d3;R=r^0uZWVyPTUVQZa^J(0C=wb4c)5$omq!6V{y^4abL>v!4CV$TyJoQ29a zqIy&N@)g=$Ft@uKl6JRBJQyYg1%S;Fh!_lyC5VKSiNYMAK7>fPfhzKL3+_Is><9w1Z zR&lN2a@W89?UX-$w~wnN0>1S~0&w3V-qc($rHoEH6II}QBjJTKu4G|+2LOVbi?DwC z7<*{rI4!q7(bbDfBI4o;QK2WnD|^yi`|B%umog%>i%#=hy8CbZiTThJNb71HmcITJ zh!)QT_Ttqhr48H8vJ7jrtZE&oZarA&G48gSPrj{ z2?pMfK3=oS#RtMC1e4*2VQ+XgF6zt426+>sl4*SQW=)S|bhFvl-7D^QeJHm8!{;Jl zh4bk_HogbakFKfEkE^bOaUFUOz-RPE{9QO~Pa$e3D`iz0B&v5pVVAAXkL@qLY+*@< zcSMZb`bh4$@gN|6W5f|(UxM%w1goYYopT9PTt2vi@3<)dZs*mw+ z2sp|(>7EQ%^z^^#uxJ?*#5nN7wi|?Y7MHK(1Txj&NTa*kC`kZ;F-yJp$;%>j=PhXobxlFw(&#{=FTV zzC)B5)aT5-j;t{V_@NbfBgv79k09>Ynd@;oCx@vl2GmJOlHnEY+?D3@awRW(o(l(R@^5lCw_I4njRls?Zc32j0A4QoT|t- z(Y&ID7t#+VR-ZzWNwHbYIN#E-D=pL7ZHG2qd(IV4%4ZbFo3~Sr+=1Bx>=N}(9$oO1 zEtHT^g2$N6=EZXJYYEidrx;nV>~h^7S}eSfrr8*gbILxUp>?fj2M-;orqXz0)9;mM zJ~7_4A4Tx{;>>O-3n%a6&JY_`a{~FSn0k*N$QNYfn z-K-b^PkfZHndTm#UmbMqiO=c!phSTy(_wCc4}fWP%ytrqC+}|sj1z(q_#nm@VULr~ z0XA4#_HuvrQ$leA4~yB|yRWjLo?U1reIz#U*Q`KaDhe$HDjwIDA?&Hvm?mx?!;qep z-MAG&i}&`RxmKc%A2&a9*BcahWT~8ri@!Lp39Qh=cV(OJ4rC*Ds|NCCI+|uNMezrs zj8ilyACduK=l$Z@XqgNkqQC4j%xWL=(EK*SzN$2P7NnN$I35Nu!*(U>g~QNu-1D@O zFNIj~Vc=USYH)~|H#yabr822EhxWEE=R4_otkk(&BqvGrES;j^Ho@fs?r#IA@#^dP zdnAhholn++#Cf=%8YUxM2@xlFyK!Ntb~$$i!)_N3vJZ>E+^+HhU`M!Rp||yTvJPO6 zwa7}IUU3NnOYLvKHPfry@tfeO%7x_e0Aa{=uxiaCK)oufT{6@ z<)Mc4(Cb1-@M$YviXffAT|#vA4|bGNe52`(#!+mH zd&>9IIff?{JwG53!qUI>WM!$F)-g4C_G29cT{xOXqz_^GG9;g1-%9`qp5Wh8hp{@a ztuFyFV(NT}&#xt{Hd)b7sWFV4uE}QfV;k@jfD@gkwx{Cu=my-PUqA-!(fyt-9OaF$tM00et^!%U0hc;d#z6)iy$gW zsnH}9S7>KYUI9jwoG5saE5>`18^Pq$IA{VSe|m{tW?%<$MIhGn=##;%lYpqpv!JF1 z+&+J&FOU}*{$J%KNI}rAUJ^SI!1G`&FdD^xx=*~+-JBZOkmCY5A~e7NRDVreC;lba zUtZgOlmpCNoj}To2PhOplhGj^5L*9_$(HNd6%WM$7KJ`POj8mF2nc8qpdLW(0Q#Hw z;)_q5oeF>hvrjY*JpJBW{4Z2J(iug8HqMdlkszfsP0LW$2j}w(veb; z$&`vN(Ihtvx4b0UxrSeSPV1^+(Va?_O{c38Z4YN@xs6`lrpw~#3ya>LRBZyXD^wUS z=k*smp}GfLQvn}Auit~ed!xDDG0#yW&Gukk9MFFvPkwtzO69&Mp{9;^I^Wr|TEnzG z>eu>`=$t(Zh%7zd3ce(n;x;(H!OF#;XwTP`mD|ccBYCG-11pDKDzJnUsE=K(6XMBC zu@Yn~{jJ~hXV`TuUOFKD<%P}at?tc5%9R373gNe>I8||!sxOpJ> zc@@ZCPSU@A$g%Dl>}BwLEEF`E}EjHCRBRlIZmbK>Ra>$@mm8#*3P9{!vW`y=s+ zT(NjuJ4hSi_7*Tt5hSIe3X=}*16t=&JOc#cL!;LCjB32cWQsTzN2wwdnWQz+Dm8t* zw08SD2?%({V(23|AOsr`$TSFq5~}CMg|=_Fn11k9kdrIwsuBh~%H%efI>ms3s}M+) zJh7|Snx{U!{QN(&21jcxI$&0ts?sysqdX6v5u#Vy!_ES`_*c+!!9Ytvm?FvqkUkYj zjme1FzQ{fz=D-0Hj@Y0e9-d$R01@)uz1-oYA79c>UH9hrIr)B%)%%gS*gFJt-h%f; z)=Aox6fg6^Td)A1b!pek_mXUJ7D0JvnTk(zbV+a9On*C&8owC4Vtm6(b4(@iiFwIj z>LY)T*e;}9`9z;IcOBRabgSVkFsvBso(05^Q1xu9-r_39f{zQe@d^JDM-nGcV)`vD ztOk;lD#4a>4F91f5nS59FzXCa`r~!_KlT+G5a%XHRLTG0J+I#j0d1L-fF$~VU
zW|H!!-ULv~fBynse!1zjq5p;nRDg75F@K$D(tps35H2lnv$g=mA49-D50HA98LOe< z#a{y9pTEy93BaMZLPxS@3(XUHwS(!2mkNZ2rf!s# zMBIT=-t*g7)IHZosRM%E5cCSdDBF^j_V0EOMb5xA zGs>d)<1+WZewGF&5yJEh4tyCa|NN;W0e6cc>pA_~p}>bw{83{s+x1N&IP?3>69~dU zuq9-X_+uAVUew(h$r|*#-=&Lt z1yMlQPVjei6`-UdsCW(?7VS!1ANKN8bhx=Q*{(((0mtzwDAl$fLK#-z%WfxcK60#k z;!fnCtK$}yREStgApGwkRp7vT^rcdmEm~~%C;I~We};&BeJrxsidED^7=OBWR0KpJ zpHe1x!Kgd|h=F(6d1ndNa29@H;CoIy{4l!jPG6p2AAh_ClHBD@2Z3%j9OT=bY5M(o zblv%jy(@kXwYZ_f?vD_UOcqRlYDyFuC+8l@40q@CvR7_?dAW2q z+@Cbd`kA&Qva5gY5rfzpZagt-d3Z)&$YnLJm#$ecPoAx_^{f*}Hjf;1nMCsMt2anZ zqf#C2(zJODrCV}ktIs=KN180gJQ3mjs*Iu8fAC@Y(OdILmg zh2VED2HvY^BFQ*e2~O3P$K(5$uS{4?fo!(V?4%pX_(H!3{ix{=(meD*MfKhLS5@+1 zf;b*gP0#Iu+;go@*NtuIl4-FDn#8-q3aaptz!`CrUq&DhAPS%$jHng^%?jbt-LL9D zId7JeVv2Joy@w+Z!Yu?w2z?u8UXz-iDZAYEeFsND1qc~*()^tH@YI8&VSoO`lK`Gw z2?iDu`#29*oWJpQ4F$CK@#p^SFXH7U1JJV3EPRDytNSJ0I%G)orq0D`AaOeU_$UwA zSx5LYs#yE?4yex988w{KOkW1BG5j>v6Kty5MRx-!Gx}+$Sndh{>s-mcO(HX*|bF-QHUEO!w_lY_Sqrun?$7@PRqR? zMfuJ8Rn-y}aV=v zvLwVUKIv|2U87|d#kaVQP8WdCa+SMC3vz&DJ9Qo1WwJfWxLEw8>AEFIJ$buxBRo>? z?YpwPip}?;y&0kV)O67AbywRLXU9sLk*dzk3EG|?Ow=OI8w#JXZq}3yiW&88x8h-a z*F>+PB{}0)LQ$cfzUnWV%$P3?qH}Xjw7}_Qd%lsSdiuHkrf9p{Hh?g0*8r{fT@>E) zyqG}p*O)0rMwOBE+>~u9{X{msAXk7S&)qok_4yg>If$Hsy62M}pCvp31-X^Y(5S`( zl;kM)`?e!acJM*; z3&m=i7s)}}oQCG22Pw>(<=P;4wHYZogj)?vt@K6EWHGuhaH8_Di>vR%+>hD^DOr!tA_4<`}k zV6lpnYBUc%R+cPtsyEn{4;4CmGC8gu8M@bB2MNn?IFx8059(>U95L!O+f7HBFEvaL zc)wEe;=DBtc{rI_*&N|~9=~R~F|AsAn>kW8I~e+|a|cqOVinuP732yyqH;qksyRp6 zGCcZ<>fxCUyV01S-QCtxW!&ALcvM;3uzhIi>%KgGQ^tq!#nn7}8BnGyxh|WPoJcp7 zYQB(@7#C(KmKW@Hw32GRQrn@%o?Xs+R|mx6G|BddkmL|}s(t3-PTKy_bbHlky-wQ4 zkD|17KiDg%W21!^ai8ORUOj_@l8okApfJZ=#r0Wb)_%d15a5p4Fw{x!+^o-9o<@Y6 ztC^yG`(%oyt#o~nzq1KQDJ%2Jd*G%u6}y~m*Q9>jYA7{XKfghM&@-dewW&WjE{kOe z7#w|L<*^u;r=Os**=3L(HKnM^D5R;VNF1I--RPm|rjEGn{MNjzWfAbXq|^@$gc&~{ z=8!dSJxCi3CzuR3v08I7@aNmY^T(k~5B=52+}T~LN#wuud=fRVRbY??m-IB15S}ym z;8UvqmX0|w9DN;2sO)JkTB2w}`C zmc{Uw_^&t_aG1!SOIwcpaF;JHn0QW-$f?m|(07vXg_2c>-5J)-L3sXGVISP%i^}he zGj$R9d(tdLEOC7CACW04I(IjAkofz#x4=3j;X;_z; za~WBh*gVTx2*wSSAQyswMC+{_5rX+iDx3S`@~gZvGaEWMsZalrL#{@Z-_^S4cJYjc zgb}0leatWpDhMto{7J}A)C)x+`w@YqDDxP?s+d&BTSS|!1h@IhFPWD!PCLqER0kn6 z0IS(B2-nOwb>(>na?WPujVvQAl%~rNqwb_^xW9mD7ViqTcF!A=(>EO*VA#|BI+AQ% z!l)dIZrKVP@Ymgj@R<$^rrXo1l>wb|S3Sua-?5P!moi6TS%7 z%<7XgdGe~FA5C#Q2dL!rDcv}l1osvE^XlR4D*1xSP5y0ur&>ddHbo>RAsW^UvD zbVT#Tg%E|J6hm%DL3x*{g6EaFbL4k~!2mtI<95B=(S$P{1FWZT%iQr^*Lb^VO-8pf zmM3D63nk0up@I2wps?Z;=@HaU-8K9beNErS# z@a!&6ZdIzm&g)eLtnd9WOmeW|1kxRtWTR`Atznn^QL{;p*GGXGsNYf7`|wX}ZqSc# zP}A!VPCih#Jc#T*I-Ujg2n+j1WgOPI38}*th|i9?eIL0>wO=5YLl7u@o2Yda&hhm5 zBJK5k9=3-PdRc=P${OTxYiWwxvTuz@Dv?hCXS}A9IAYws3%<~*V=mii!h_qTIEIY& z@ycuT^laXX;|MoM`X%kf9L0gA@)g5|3UOuy>3tMlYG_?wVEKS?_@Shytl7?@>C9_5 zy|XEub@0?^63hA2lVyhjBkbID=?YpiA(ho34v<4nA29jVEg{S>3$}hRjRK|^Z(dCa zbF~quMwaT-ngd#%PCl;tsJdiHP_nSgYMWk-H~YrQR=IhSW| z9v6===QCPmgQM!In{6nWTDP&xi#RlpRW?+5({s(STX6jl4&a8{jXhGQyB=z_+oH}eDnu~lNemXI&}eBJ?gyF;czE0? z+b`K@x{w|3BKSoyFPjeF!te%gl2x1(;RQyFI40dpbqPtpA7IILZ1CD^VhK{3oW?z5#d*T6 zA98{`jD1bFUCs0W+wIhyp4he{!WTuYt*82U*{z3?Y*|r*z-gpYoVILBAbbk&knUtX zjy56?gpgK;EI|(#88#^*gLQxS8gRg5m_cDTOgi2*2$@UZX$oxB#BCt5T&!Cj?*>?m zu+Gm zlLv2uRBU3#eK&-jE;3V6fPQmWKk_;gf<9qJO=g@sSy3^5w9DK9p>>5xu?*MpTHOJD zc+IE?*UUUMf#3-^f}n4vdme6px#-by?3#!oFfYZishgh?1l8$cORb}~WLhb%2S;B! zuMU-$I0!3%b^MXzXBx~ld+9a;r1!|8lZ_pxLGr7{ST&RFg&L3vGi9I@5zaB3)~|=INdkFTD=8GA@pv+zTgq-9{Rqz@cWCI3T5=qInS1zN z>b6IdZY`HpZyNIi+{}_aRY6T7j^)I5k3(0MIl=vXFBz~cWVoSjUMF*M-IV1fW5o&Z zV&Iao*k%7HyW((9$=o}7R1?byoIg{uVpNOEEf?^u*P`$!np~`sQiyrQnzfzG?F+?I zn^e&O&1OiZ!NIq^wq^ezD{1Z^YI9dlRexf?BahRyE4f7{kQsl3z)tvjAph*!zJ`3% zQbq`)MZ4;wvYvdxA-_BpZN-oY2@YD6B_;0p6qf8@I$pTIly6p_j`0pk0M!?L?2fbx z28(vdMa%tR&a}7#-i~ly>c@H1&oQLi;2qNiXo20IM@aJPy%?hJSG|I%P{okTjt^)7 zXY5cxoZW98Vhy}kSC1jrG|K~)_TXUCMvbd|SYInH^_){&PrT1Y;A;J&9G1SRD{n=* zfWC)I!da~eUqMSnB(uCGgPfAFMg&$&TD=boQr!22t$&uMO|=w5jgv5&j#Z{3u}o{# zxh7`{!|Is8jN9Hr=_GZk99ZZk$Bq4p@P-GprC*q1YG}QxzS^xf*N)|0I*hbUhPMP? zjxp8S%xkrK6OOQm<<%`Ky{0`PitWfs&Kt_YGNH69b}KlmTT4KG+%D`}vtuqPc-jUY zfBkwMHTC-8+@l5l1Frk=qEp3F2IvxL0bIMWjh|46-2I-HXwlJs(EZ+xAuo+w-Tb5S z-2*-7KJFJQ_vAp^tM^LaFKZ#Luploif9;ad%S^T7(zz=lp=_KdrCzINc89m;!r8nf z3K7~`of$(lzzL!&10$TsDXo{ojn+T=@*sES&_KruYF3(ANN1B+K%L8g|Pvu)z45$c3zqIi66-GiV`)8-NTB)2E)?LA=o6(#G36lM84`^ZMy< zUyH`0>U8!g^$&}W-^vZhYBDQIfDk0QPPo_bFY8G8<+teE4HjUn?*Fyt4fCxcBKT`~ zytIDC>fv4Xz_W5~O#Ju9=^jMAaSKQJ?oE6U1)*)`A7<%}&S^FK{q@_!SRo*d7Dt+P zcV3t1Sy`1+{#Y)TJkiLc+}tNLF;%`vc6+8Cc)t&*)3lKyPo~y{_1ks>^ z$>OW1MkpkjFz$t|(H-^en972m^X-IvEZk9_*5KXtc-BGmzs(U%&b+5Ou!J{y<(pQ7 zWJt+PreCe6y~cCCgEQos<8xb`UM6^cz$z^*ov0)w9jR2-_Hf&C+s$e5y93i-G83JaDvk7CSI@=EyzYvg7rKF7ptEkm}zlWsr4fr>=vyi zO!=M)-Dv`{1pHLsK}3dFiOe;fXScA~>PUnpc@Oxhbm})(eh6ANvN?KjqRaTys8< z1VBCg=P^Ry zILya|$3Bm#l6qjASwRW1I1U^jiFSE+RO!?-feZbEH><3-tFzAo5?j3aJ)I486Rdl z#h>JGtp(Xo`HLODq4!{w6TGmYmVekYNJrmvxvEF6QocDXzg)PEzfV2u!SOI|5Yr%9 zx|UiWK%JRrJz>I3O1Qkb4^%l%HSXAUy)e>lFKs1u=eSA0edo^dz83;a;hOsm4{XCc z;)#wSlA)lYD35G|3i5nqzpI42d?Ke!QAvsLW+-kKKV6}kH^Mtt%hljrfWj!0pmh(< zVR_^a9Y#qhgtxkQHd4Qu<>SO6Rk+N0qiub_U}Grj{;L6}tXGG^n0sN6iQ=*|92F#F zyZv>?f4?2_JTE<5nC+rhC(|+}xi6ki%E}L02McCO$FFUOW9%0`*gG{M#3O|ezSdc3 zb28c}tqBHYxri+HN{EE+$E*93%h?9}kLw*~rH^Oyu$4S(LKEX&C`XnD%cj9*)k{`l z#>U3`mmNw<)!`nYn2OX?3tkt~tj92yM_Hn!G&o7HJn^WUMYuol$YcWXXskXa%CC`5 zFjY%5p)awVYE;87s%Hk}(J-XLxZK$C{9io>OB^M|hyi3B@02!lS! zS$2A~jGop_p)FJ!>IPEY14*~D3ZJmt%h#*~9d2NPtZ)495MSV z7~{i-w{?&$pOqb*q>fQHNn-%tmhDamM#ARXE}DJ}!rANZZm81BE!Mh+0T- z3pk*zY-taA7x@ON2Gj`5nGYVez02EOF|QqtaeijIX3antm6c|xC-~YNEaJIPOk4V& zXI~c$K;DLPoLRQJ7nO9>FtZ*usWvk;IN^Bc`V^Hl^`IeO25?}JmW1aMEbv}A#+)+o zI=~DC3$&Jf$>a6czFnf2wmCs^SW%BhvKMTlf|fQ|(b-9HQYrghTwo`V$C^PUcH5SP z#TGZi(Kk?o$D(VI2eYbT`Ynx#;al4{3-QAv0>?Y`g`%}&uq=j;i<$v@qBg~jcpH3EB-0&Lcx+xTO2eL2f|J*Fuf^&D(U;=5fb zw$`T)=OkUbpIDgF)tgrR7^i@}`VCJw44u@Oh&u zME$QZb;!jpH=6EGMwM0%WPs~jU*lo9r0Gf)KFfj^3S1af=ePvOQJ7F@;<4B6y53A8 zwI|&+>E(PVQWbP~2|}Tcf}aMnFfgiPcGTps_+=*r<#%0AH_-2I(`qP$tX8mXXCv{f zu#a%S_p|jmoWil$8H}ZYJq;$td(c=F8?mP;up2i6cRNfBFw0ncBr&sx;ytYQM=(49 zHjPKvwoI+;aU-eZlF0_)t-q#OjoqyH`>qzu2pkrzv&HAN1urfE&yslRZg)bD zyVCt{Ek0x2QB6-~C4_^k!~z>-->*GzpE|LDPj6}N_$kQtDBC~ay$FjAM7JnNSb`DNtt(NU$-i<=5#SM%Yysc z$sW^j+()U;w&K(kaD)?nnA5k81stu==BcKy%gIE!`e^@Pn|s%jd*s*)hD}zM(8?&y zv=Cil?uwS+8&2o`z$v37m)|k&HkAFbd`sD+K6f%O_Hm>8nR08(MsF)tVUk!&Z=T~Y zfYxqauDyJ|N%Pn47-75;TiG3>96Sf?x8k0ipRP94S9?pU&dITtk9Sva?3V?Zbn`r) zN}zpMk9}W@Qszux9x5oAWj>k`KyQKpdmgnqn4>y4N7LmblcJIZur=>b@Tvog&utx< zc&(Tv%_8(^mIv;o$$>zjJcf!|5 z&Y-zcDMb~X_AWYo4JyAg1bWGzd&|xD_{MOB|LWj+-vT$9N*Sd7jTXKJuDya_|NGJ$ zE|6G;+b{ad$x;XxxQ3CD@t4oD5H2RLK(FLZwfj#z3Fu~kYj034{za>S54zq!=rHA1 zO8isJ7hc47;M#XD?7uIWA_9%{)^7SQed1?C;2NCNDDQuG`sWBZ0L`1r7-sn!rUe78 zy@qlA7q$gHRB!_T8Rn$&UlP&?E-v627xzD~=1VELm;h{4-<##&Kh5at_fWvKwJ<^q&N)Ze|t?g`Bmqh7leLNCbgK$ z2SBk_OEqV%AjJvvS(X+8MK--byh&C?i8=_R19^##hW0^PCI1ObMF`WcSLvTF_2d`8 zU86QF5S>i4qguv~|KU3&!(q`L`BZFm<{FkzRl93)N7N6JJ0s`vB1 zai~oA%F5Wc05zv9n{upHQeu!a2X|=oDuLD}jOyD@8uo3qZ&NCfx7mNU7GK8nA(W50 zC(T*#nhS;P{!*dKbmI$1^1h9Q#j4*{d}=_gY&{DT+5fft*yBVt}Cd<3##P47%;%m2>i?2*kpS>NLrj<#Bl#(WG3|d{%S9Aib*yix1Ce# zjG>^oIGRJht_7G(_1uyuLjL2K05U`=0JWYNDsz*T&b-icEibBx_hNv1Y9*E!n|hh7 zw$rkWlxY7Yl4Kkqwk?BXbBAfNTk%Dy=co(e02tPL1x#fTN(O!=&$H{_N_aByzUsJ& z4#oAw98LF<19z!jFG${oqJA}$uw}-RPX0ZPhJ1AQ->4G8O@|UYb9mp6+C0^0kcjaL z54M=8v%Jj(I!u9e-ZJIjJn(e=K%^5@PF|i{@vSc*BBqT7XNng?y1DI@??2Ir>j0!g z?!aQb7#u8QYC`_K+zMQliP*lz8eaaF3jwql4A2uPt-^C$|Fpd40}&Uu2zSzo!xxv| ztgx4Oi8u!)9a15iCnCKUWc*K&&yrt3kU|)_udE$n{X>NSEO0Y$fiSvFj)D7kxc6EB za|a6O*3G~2g`V{1@2li@uNW_e9Sa$zi2uKk{~u{dBTOWahhz$Vpil4n$GgpItiJz( zsfra05d;D8XH2-^aB2ljuK;0eBJPT^!|%2{Cn`~H|?NPP8c`<4ime>OT$Dgg89$(lZUqo3!1?{hYoz&lX+Yt0mK zbE6qA5&NzFm4%^y_9#l$l&QSs_S8z!+6&|OrhA_^O_e{Okb-RzPV;Br^q-MSWN#_u z@ALn&f72MO+F7YWaAttgYTe<7Iw;`<{z)9oE~KL7T>X;;L+z+9o#=nI;S~Kdu^jhR zgKrGX)ldp@{yHXBKyga>)0!<^D930?ipdIqPB@9=pCs(ct7TYTrTa%)EVXCI(f?AV!Jr(M1P+-V|7TlcpeG5S z=zl+77Tbg#I71h^yL2! z-T#q}?|(aV;mkA_DN=ItCkKp_djm(ir@e0c?jKwVG)9H8nC$6;YUDEWGqrs^x9K_d z;Yzq%m>QRc;gw34=yTVc9hbXTtMgKp4RvjO8${IT*SpAnl6aJYN;QE&oAGX#+Np^J z3Tti&TV*|v?{feljZ}?zTdt5r2BA>FI*$NTnJ~o0%FfWE z@-<-DxrT^7OLNckQNuCEMQgD}$DUZbGNG`V^#1a{rHf(;z|Ds^aiNJPBhFOD&)A)e z9HOFPqRgliNu`4w`&u@DIKQYce!Y(1Er6~PPu7{kx`(K@6D`wiAO2pI@O0ox5&FWK zvT=XTRLIjUkA!V)TIb_!1!vL@-8f!D#t+yCGZNev2Vqn%dij1KhgLGpU3KrMvdZCd4-GB=<0K&KyG=c@hRu9qB=K;a zb1aK`X$VXebbk52e$J zsp`caZgOH2@vr#noHV{{9Qha-YQwN-FhwSW*wtHVBu)^Wdckgis>OI|hc zxOi2-rJJqwJaUK$8Zw5XYi_~jFMbqv6zz+=_cw$TL^$#(>Jkh%uMv=kK$fD>UMU``|9!= zkY&g5jO8M5t;(EpaQ`C2k1|HJM0SL>2@MA`iY@HeoLQ8!v3v$O={&3=mIhd)tP%*} zz&Q#W&y-(n7%n^Jcm#rLpbQNRgdFKHW2jj~hknZ0LbI+tGIjw&SII zR;k72Z#=F*R(lQbf0jpNwk)g}OO%WWa7(@oi9^PDQQ%iw0{FXiG+niNwR*^acTV|J zV(4mAE*8Mu9|0Frao%sgp%Vr`x*#C~Fpke|mw?1661!iUpLQ=DkJwpYj?meMFGG>l zQkMRQSC!bQ07ffFSf$7Y6R~{!*M~)l#n}t{i@UKaT9J`9#sc_H{l4tki$_dJRFx{> zzM3u4d23!hv{SjaYpU9rP10v%Ql*V6g(*8Jqj{RLSv^a>9=Mc8vD{HcryuC&odtEh zWt8lHc^U*IFaoDV=yEm*`fkXbrJi3IPUS*G>ZB_gF$B_$CIM+Xrq7)ylf|$&U^~W> zgi71VZXNE|Y42Vy1_YCh9I&$a{TowmQ-Mxrq|NUcCSEnl#0h6;vBLI_*DD`hjma*s zqegi9?#dxj;i>uYvGb?3PsP`$sXyKqzyoxIO*J!*Oe)nZOOB((F1qGEN5@&(U$8B9 zvmkB*+SXcsL`T%8;;RpO1q^0x-Q*MzdJ?>mTSfrm5y z6e{EXkf)53nexr45PGNKf^|*XxEQnjqm_@}?R-?5;PUFBAOh0*y|8sJ_iK1ZWLGFO z1jpkS%lfT5JfHoYd>-V@cr-D>y-vc6dKvYVQiq(BRW=h z@`RqFkqZ_B&oNCELcbh4MLiL+&)R8R4(+sm*(N{uwVZ>0f24*3ZV~;;j^A+yvwS4B zxLiB6i0Se`jwS?s{7G*$&^&!1cChF>RhRdowiIyZdO6*qoP4N3DRAtU?3&amW?E(% zmRg$iGjw5=AKpDcf11GX>G5UnGyMU2q2ZqHu7b)gh;|K3FCKHSb3NEtlz#0l)1>n& z(e-KNW=-q(I^A)PW1an`|9UM?(GgruY5U9D^!HZvE*EDy!m83UM=BrK-QIC2-N{}{ z_*Q95bn8~|_bEC{mL!KM)W%Rn>eKRxoD^GY*LauxCF!iCoX|OTjss(*wrm1_-m@s{ zNAJW8_LeLMXwU)gZ)`S%rqzDst8_8BXko`!+wJWZ+kN9S1F@XFgT~O-S~fI4u9SSY zWq>^V5S1aJ^CVymbdX1aCUP6N*?X)4lO-`Y!jZlHPkgDUxZ*`$p3nE6sM;j2NWi}d4$&5P+|;W}D#=Pl{7H{8v= zCju{I?ECzeK6>69bXVUKJ)i4Az8l}wM%9p;BwSUy0|IT3f_ApB_rK^pB9bHazW?Q)JCo*#mw$Sp>rbix*UeC%70}UexA_eJI%(u_G zRpcm@i<`pI>gVZw&!^B2m*08u7+kPRB?>ScA=^pD z)BS-hBFbrq%m*eg<*9qi9u@h~LZvGVl|b$lXXMprWJRg5Twc_w$#W-91{<|KCq*}m zChDM;!C0bPqvkofNfjRA_2;PCSDa|g6E%Cn!Gz^=}NX(VWz3PJ(p)h&>6#} z8OC?zH8iCC=6Gl2>(Xfi9s%BscL^kDRsxRW&$lnaizoe`MOaE`k&u51lyWbRqu#Jn z=!f))1n!kf?ptcL$dSp>m{6prJh~7z>I(feKKw0Gx5H)2bNBbzx^Y%dOWx-^81U?GVe~u!y)zSe0?Jyj<53G>s*{N>86we3^cDuxZVo^SCC|^4*YI<$$Wf zSTu!^%i`IH{~KNzBJs8&Q{60?|Lq_lq3yJZr={TxN}yS+|(wtp_HY9o+`CBp>65c%bMwTbhN_k}HB!aUu&D!g0 ze8Jn>N#$*osXaoe%wbDmNls)*M!u)y7c3Y2d%j;wPZ7bA=X*WtUhQ1igKq%n&+05y zdJ$j)Vw>HMFsVFn4=ZZMSpLsdW3Pb9R@rWaG(g*35gx`(Z$WFv8M91f=LcD)@$dGe zt%Ir)+O-*0LF2tVhk@{tux&H#294pes?JZ~j+2Oh#@*G^$6xbmztI@>9tXE+3x%G1 zrJXvTZUOsl)JAvzB_mz*bvsgm@LKAyDM2O&jOY05rq9=-+Buh?&k!`v+0Ls?%)%3@ z>wNV`MR_>cGF@N%QrKb9aCaUtpF0l&Hfu)$5)?j5^1!RXhImHr)HG%?L|i`yB=;@V z_w^6+O1#Cov9-YdBGB2oMuz54(7(IK;RPCAmND)88WBzc**v5IvaX zADnSKgu$XVLOrlqG2`ZS=UGgHpoiWuey-Q<(EP*YZ{wZxQ<4pW)!X7ej?LVOeJHBG1t&) z{OZ$NJ8R#$-$SzE-5aBC^b@$owmG?HhZwX zN~YdoUNG{N*(z9fqSbN4Y6eX_V^NSd&hE50j9;6Jr^_ka`bdI?^Qo~(^Vl%;hOpA} z3~AW}4pUW&$*C%&4c5q~4Vrwz{%?Cr<^*e4Wf_puu2FSPbTS|>Rr87n#t6aOKuj`=lcb$J;S@$m-+4)IuDJ`!q|mbG$8108eL99TYeF zaPgJTYWLC!m9mk%uk-)jx(a4j)`-r zV~~X>sVs@kvpE{BJ|%8ws4HP1=auViH}SI1&Z!(ovObTD;b6#@$%QUyu}^cNcbqDQ z&(Z^>6WR9iHbRe+lpW`Qr%*1dtE~{Gbu1!WiJb04wPq9aly1!a5+VjlE|O_+`;Hjn zvZMyM&IdlXTJ%NV*;!<*+nVY8V&DLX%K;H;dsF)N%^levE!SRHxg^{AI1t$HM(GKr(*Ef4_7J`2^)Yjj_P313+ z1bb4?rznGm$I(5Nmo_cv#TD1itz&{!#GI%#%tDN*m4BTmeTzxnCiTglL$X#x=b7mP zJLPpwWblvbY`#-zh#;isw4z&Po!>`yC~; zWKTfQS*K*rxyN48_`8zAA877Jn48hj?b*y5<e*Y*i(IMcEH501snE|-!^ z8TD$sB)hjk&*$UU?cC?gcbJDKABc9at)D*W^D~%4`Gm(*VYF`qA4xA-p zdGIhz1Jvc_)hLNxVOM?$00MJ1g80>!N?*hFp4O|${C+i=fYZe38sK`e0p4}US`%Hi zL&>TFH&(VGZ{q*w{<$$L-76{ZUK8vW2a}6Ak~|bNxwM9)$Yu-EdsY>p0sB~!gpWsq z{fGYFZaZ70ON&EmVPUY3cU@9vJKif_68Be+By~DE7*!ZzP?S~OnCq8;%lB(6LT786 zzc|T;%!$L~RIF=KKKQC+_7TDK$5iHK5o>b=VNW0JcL|R?5dLjLh5CVj^QVaTVC}h* z-ZW$NT|xUs_q|b7ky5B7XpLSg{jR0fu?|=Qq9V7tuxZXVu8!>*ENdedHEJ;0ee!D@ zrF__!6;++m_uKy3#T;Y^K^uwT|9EV9L9IwK*vp80u1rIY4*0!BS+rq^36TRmCZ_b7 zqV&-$ko2A#Jp8@$g6aDEN1;fzb!!mYYRm$67Gsb%w*9%|)+T~95ykSPL1mn_9R5^1 z^l!WJGX<*{@Nm8?275GgX3wk=)t}KU%k6!N>*Fx%z^)WopZF~eCyc%k;6G3+C1FIL z4Re87*LaT$gORIyg2&o$vdceKqafg(i%IfT()rA=o}M(JWDJxSai$OX5o|Xm)v3ab zKb(>RKRzs@Tke|ZpBOvDd8?>98RD)oGH;?jxQ#d3R~B>6uB5b-uA*(Ma=X$Q=H{l; zu-J0*_lyg^kySvFrHmky996yta^UIe+l1sxt#s4qR=f14J@z^56j{oxxb;OJEG{3H z!UH!Lq54Qc;@Ax8rGEDypoEEhoc*}~E-k%ZX+@*QcZ>0Wqm1)tMqm@b|{xfGK~ zQ-0Dv+~D;PuDrLdS|xC0yr>6NGQi9u^9>ru`4Q1|w)E|H^YioLc6T3B{yM$>c*E${ z+K)zy6#1MndeuIi+fyA;7i8c%ZrG=CNGQz2B-vwK zKc)7@B;S?EEhv1W75a>T=LsyR0w`eMGFGjCHoa-r4|(g9@oF>GcvAsEIwO|t z`(QLbAmq4HR4zg{cOWgNvG1_sC--B{M=2r?-<(N#RZ5;L63ol9h+zF<8oY^bg*EcQ zd6QYq%has?$yRrW`qmFxtIM1xu*^D8F?4IBsDTZvI+U-($i79~q5ho=G5k}*HWFV~ zf~}>hBFRSTZDIUsHWY{4nJt8_bw8)MIqqTZITK*x>DuhxMK6=#e}h2>@LEWwbE?%7 z*nrBG2j&{Wmc9y*>~G9mIX+J+rmjj+7zcx>$k2{q7^{@~;&Kt*mct#UFpMR0NS;Jr zk>xw7i5$y&rC{BCEO*t_fefDb`1t9&fU?t%SsM;V6la@@I#f%225nv?j1`QPEru#4 zH(kS|@cC>To4D}T(F!)HQEamj)1jI-$`{26;7LxqiM0VlDN&@X%`k2 zq5+Hcg$qqI6RHdZxD!EvckkXEuDGuZ9(vk1_&Y5)r#yBk6ay#fL|+qf5PwicGD`aL zMd;(v3retVTtSuc9t@SO<#D+%{`2Z%93+!lR~rE$iyj*2>t_10V@gb5sbO#G{`4`) zLNU;&S|q$Ee^||lUdSg$;jrrqSUVqnWY)Q(5hN;~R1-q)w;%q8yabl%1Ik8{Ax98x z@2roR!MX#7YhZ2g@QS(U${)&wr}Tp!atOg(?xzu{3W)5&!oKaPNoO+nXyQ9Ud|eK0 z*ON7Yo_IIzErk>wiu7N<-9VSWgUlFEWN7crYMqc6Yj0=bkOU8|T*LbejkU(oqENLq zq`uzmEGialz~R4kXl430GF+~m1AJR{SV`zdosfcu`@QNY`D}6QQF2^4Fjjfg;PBQ9wlMRducPN)RfVKEd7dSRQS+KDU8eJ)(t+hUjT z@VG92U7c@NDlFS*S$CWQus-Hdiu7$RL`fbS4jYNFHGDuGFCIkdNGj5 z80gp4Yc~-{0TG$(FlEY>9~p1Mi8fR#{I<`9cETy>3m&Ey*{ZwQC$XZVza8~?kyTzU zrCH>T-yfxOxv`8;@@Db`g-}HXiP{mGuNXLq^7rQER_SqhxIxLGW-30;b>wJma6PuZ zYYx0_0uQWfh9&;TqXuH{AV*0vbb{bk!FgkG^l}Kz*D0fV7#ssOPyvHydqJN5bEFQ| zjl9|0G8Ye}5C4%pJOjzLfQO~+yPD)U^7CXNa47;Od*rAELNs974uG?j$utNsfL%1Ij0V#sqVHRgJ32NJUBg;{kO13@j=A z>l;z8s;P$H3RxUk^f}1U^=>p&Q9Kr`a44)>8@Q`hPCf+fr^sx2GM1u4f#Y=A#5Z-7 zsQPNv94bJWU_-7iRNS?HIpH`GeZkX>1-q-dF5rR+9CoVl>0vq{kX&{{ArX0XOw(?< z@cma7IMU+!d_VpXr#u7gCS1t!?On>dD9oK6asW6)^WOt~xl;!r>FnHuq2IuM&RzN+)(Ld`RyoFy>xinY*zjkY z)i}<~dP$gIrA5i`^{M-8u)T|w`?vlb#cLolx%DX#sb6?{d1En#nZC#o+lY^M!#1S2 z3K)bfP`<-sU|lj$OoY3H6GS=f5uI*Z&>vfL8Y@T^mExMA52K25#AHFT2VWWn7d{gN zlU-yoj)h64Fe#xJ7;PHsvYRabdM__kX8F8;QW~r)oB4;D>QFB84OFq#^ReTwZXv_a zH&vs|>AJTs)Zj3Gd!k|k`>uKW;FjQS!jA>v@`9;#K&w%x}i+{ z>U5xGb>XYvyZY|O^5ixn6a^}B>yhfFnL_b!EQDH1-F?>hDfg92r5@*aLzoBqR?@@G zDY}363KUBrGy8FtdMcl(I2nan^tO44puUDvNIsRIKXKuTCM1h+fX=|2${1!Yx6az{ zi_~9K*I0QG2!RmT%_CKTMB}kKJ$CP{{=s744~YE`$l!9Nd30cJ)@^^E_`A{*ox4NJXXB^n^Q(c6W+Qb z6iGvbyD{Y1qo)~Z_X|UHWgcwL;^>+fXmGGu{V9leLtH*SH2nJJaEYk{BP-vH?`tXp zbZ@i@=Z>N>wKEWM2bf&AR?JL<&PP)@#9lCku#Z>?)IiJ`nQf{tHpXnblJ+>=6g)PI zQOlETxUqS4r?|Wx0Ky3^?7bDEZ;qn-_sh2Jbd5nO_z)-W{8IIk#xGF$ku}GLPn%(g zqzpdMU?9>W_c)AGXUM4y>5U#$N|IbLc4DsY7Xs8etOhs!6x|4Gv_$B5WT*0pCZynO zA}05RGS?L>B|2_RIFx7N`;u!RDoH3>hhxj$Ozxl2D&y&#)mp!?61tnDPUXM=k_JuLN7tnZsQ@|mrM>t~&DNfLdHGS&{bs$Ee0NsyLoMHYL8ALYei7-cnxCd*l zC=Ssdi@8ed86x3C{fD(%+oiJ(WQKcy9cfBz4eg9Z!w;pl`SqfAt9RoMGIV` zuaWb53Y$toASsZ8LYflK(S1dsydi&f+CH&YzOc}{p7}9Z%#*RG09+Z_NJZ(Yg2tiO zL23J(sa>|M#g&+#lx_+%^Yp{#_P5T2Z!K&fHeRxp=wi$x#b0VGivA zS>ANf4TDVl_o8}1N1yT4R*s$q$o#U3eXr8*sul~jV*byR1_^7);uw+oVtLw{Lzi5h z1yfCBr3H8iZ*l6Ep=lgzTZdD^k|M193oZRulaXh!xEzvyv8b)sc zoc&7rFD~TJ!maDNWVFVxnBJamLR~%g<*Vr}mh=0_Z_1JXjM8%6Z5xd?CfzjHYG=H~ zuKZ41<4d?!b9g{`UcULz>arsHQY}u>?vVAW87as~-S>MlZs*&owOHk{n`t?LI*Bi% zI(`79I({>V%tn&@vfEHOvoWGX26Z*XH~7PG=aGc&dPcI}!R&;U zg}5V!%q&{Aq0xh?sIHo)5bFBgYgGJ95>{e9Uin2t=p=w^AgbC)5D4ZH)zMiE*LB4~ zo`LndjvMjrr5IICV9As`>F5h1(axg7&A8rE)*tMLzaFW|LCdAi6cX85vqnUr5y`vp z-Xr(!d?2;i_iqVCJg>3-g}cFf*zBPDyYjj|(>(%R?MwxEZnKry(_Lc<55(h&R^ObA zB8syH)g0QHhvoQv>IWhDrIs@{VjO5%cj&C)%{z`s6l2*_vx%s{T34bW598uTEw7%%3c{A|BAiE!(l0t_Wt2(IXau5Xa91AY*BX~6) z-c8CI)}J~48bEKMtJReJG2o8HG9_GO~Ln&523_$VYuSJ~}CGP2P%y<=WLl76Nk2RNv!6I_{ba z651?qKj2qh^mp?VG*f*SMVM#Dd5M#P=`Fn`Rdyd48SPp>eyRxBU!PKVC21SD*1WV( zv2%kd=uic!El24olP=qvPb8zm9z{~ZsJZ8u;vr9#t>KxPr>K8D#l7sQmOk##E9Lgw z2-DOK8h>JZ|J87v5qz?ZL4qs5+Ex$`+R*F)3?jdqL^31_~PC)npd%W;-@XPAFUTwY{7#616otf zr>a-ie%S}4-diO{OP+fZC<&{KIlIA@11i;4QGnmulQ3+QR9N? z1UYPtZZZqiBYu^35*)SXSSBI`0=DwmK6R3T?zP3xn(QD&J%wZNZ*T{Pmk$N7NA2yd zJEO)s7H=;Zd4BH*{v~WK8uweJBaGjhCZx6<*kuf3(TLcR9iWw3id&3E0Xc{|Is^bN zoau=NlIK_4F^vBBmZ0^erY;}Fkg&FbA%~AsUvi?h^T?7MDp8!2FM_{XvKjkl3GOIZ zyF7QNNZ_RJ7LsR*oyB|*T0LNENKoKQoarMOZ4{%j5cU^JcsfFn>zX1{o4HK4Dl;J% zKR9nfQieuD?l^$9S~;Dog^b(`O8V7ki=|SfQ9G^(C;55b;@kX-^^WTlbpiaLmuISM zD)W!&)bC)<+(!~F4R1Hg=L}uzWn3ijtL?C(hG>I?`Fy(&8PMLKFHY<{Es-JxF<7nL zUWWJY?wy|WF%t|=+)}13+A(V;-!h^Nc2=|)gQHovpI@6{61nNKL7*FVlOB)Q@!Uyj zzJP`5*CW?p{98ndBR_415vn}tY<>93lom2)C+al)J4oB0s*ucW?R%)~H=Vg7yF||T zx67i65({v!;Z>XDjh4GYUpr1)q9d;GsoEC}7RxMH+J*IKE2nd0^f*WBz*?Kce zt79;YXAx0A^yI>=4*_5ea{q8OIy62W4t)?y3eSt*u`Z9}T7tu4mnJ@6@COE_G|Ql~ zvvp0U3-k(#t6O(h9*XVN7MqM#-+OiVtdAk6My-W3jBUDX`cq^iA|Z6Q-HC>$k*%G4 z$&vElL`OJ1ujT!caKXBetEO)L^!u*7>04O&3I`N71Dwx(*m|I3)n2NF;gzwL-I#H> zPd^ss>#HacZ!$&+$MHMBQ%F}k=%!Jb3?n-v+=!s2~G%@QDHtyd0^*U}V$-*8+kM2SiG7ZkiEa%E|#18$d-x(rq}{5)!!NV5$d5<$(e&FE)SyeNPBZK^uU)x z^7&HNcb0JvIa<;OXLvp8FGEMNU|iFX632{$wGN*k3#nXbykRtz5PqZX)96HElRtkU?G;aPn+kC>P`q6^2Vah(T-?&?5!O=`B%p{m4)#89Uvy6S~opNjMSv^_DcP zv7XoL1Lr9>zkU%{5^Z~iATkjD7_AClIP#^cTSx@tUcjBh(e5nUdGr{micmURXM`-- zx(Q!;7j*t3{a@<`)amNZtv16`OU&c;JM3fCctYH;rNoEG!R?Fd+b9NYZ#Lh^Yrv0+ MqUOC)c`M}q0?L$ym;e9( diff --git a/docs/releasing.md b/docs/releasing.md index 688bc7a8f6..939fd6d098 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -1,18 +1,35 @@ # Releasing -1. Tag a commit to release from using semantic versioning (e.g. v1.0.0-rc1) +1. Ensure that the `release branch` already exist. -1. Visit the [Release GitHub Action](https://github.com/argoproj/argo-rollouts/actions/workflows/release.yaml) - and enter the tag. +1. Checkout the release branch. Example: `git fetch upstream && git + checkout release-1.5` -1. To automatically update the stable tag, select `Update stable tag`. (false by default) +1. Run the script found at `hack/trigger-release.sh` as follows: -[![GitHub Release Action](contributing-assets/release-action.png)](contributing-assets/release-action.png) +```shell +./hack/trigger-release.sh +``` + +Example: +```shell +./hack/trigger-release.sh v1.6.0-rc1 upstream +``` + +!!! tip + The tag must be in one of the following formats to trigger the GH workflow:
+ * GA: `v..`
+ * Pre-release: `v..-rc` + +Once the script is executed successfully, a GitHub workflow will start +execution. You can follow its progress under the [Actions](https://github.com/argoproj/argo-rollouts/actions/workflows/release.yaml) tab, the name of the action is `Release`. 1. When the action completes, visit the generated draft [Github releases](https://github.com/argoproj/argo-rollouts/releases) and enter the details about the release: * Getting started (copy from previous release and new version) * Changelog +### Update Brew formula + 1. Update Brew formula: * Fork the repo https://github.com/argoproj/homebrew-tap diff --git a/docs/security.md b/docs/security/security.md similarity index 100% rename from docs/security.md rename to docs/security/security.md diff --git a/docs/security/signed-release-assets.md b/docs/security/signed-release-assets.md new file mode 100644 index 0000000000..7f6bf3bbfd --- /dev/null +++ b/docs/security/signed-release-assets.md @@ -0,0 +1,116 @@ +# Verification of Argo Rollouts Artifacts + +## Prerequisites +- cosign `v2.0.0` or higher [installation instructions](https://docs.sigstore.dev/cosign/installation) +- slsa-verifier [installation instructions](https://github.com/slsa-framework/slsa-verifier#installation) + +*** +## Release Assets +| Asset | Description | +|-------------------------------------|--------------------------------------------------| +| argo-rollouts-checksums.txt | Checksums of binaries | +| argo-rollouts-cli.intoto.jsonl | Attestation of CLI binaries & manifiest | +| dashboard-install.yaml | Dashboard install | +| install.yaml | Standard installation method | +| kubectl-argo-rollouts-darwin-amd64 | CLI Binary | +| kubectl-argo-rollouts-darwin-arm64 | CLI Binary | +| kubectl-argo-rollouts-linux-amd64 | CLI Binary | +| kubectl-argo-rollouts-linux-arm64 | CLI Binary | +| kubectl-argo-rollouts-windows-amd64 | CLI Binary | +| namespace-install.yaml | Namespace installation | +| notifications-install.yaml | Notification installation | +| rollout_cr_schema.json | Schema | +| sbom.tar.gz | Sbom | +| sbom.tar.gz.pem | Certificate used to sign sbom | +| sbom.tar.gz.sig | Signature of sbom | + +*** +## Verification of container images + +Argo Rollouts container images are signed by [cosign](https://github.com/sigstore/cosign) using identity-based ("keyless") signing and transparency. Executing the following command can be used to verify the signature of a container image: + +```bash +cosign verify \ +--certificate-identity-regexp https://github.com/argoproj/argo-rollouts/.github/workflows/image-reuse.yaml@refs/tags/v \ +--certificate-oidc-issuer https://token.actions.githubusercontent.com \ +quay.io/argoproj/argo-rollouts:v1.5.0 | jq +``` +The command should output the following if the container image was correctly verified: +```bash +The following checks were performed on each of these signatures: + - The cosign claims were validated + - Existence of the claims in the transparency log was verified offline + - The code-signing certificate was verified using trusted certificate authority certificates +[ + { + "critical": { + "identity": { + "docker-reference": "quay.io/argoproj/argo-rollouts" + }, + "image": { + "docker-manifest-digest": "sha256:519522f8c66c7b4c468f360ebe6c8ba07b8d64f5f948e71ae52c01b9953e1eb9" + }, + "type": "cosign container image signature" + }, + "optional": { + "1.3.6.1.4.1.57264.1.1": "https://token.actions.githubusercontent.com", + "1.3.6.1.4.1.57264.1.2": "push", + "1.3.6.1.4.1.57264.1.3": "aa1afcb418fcebcc68b063377c48225f5a9d1511", + "1.3.6.1.4.1.57264.1.4": "Release", + "1.3.6.1.4.1.57264.1.5": "argoproj/argo-rollouts", + "1.3.6.1.4.1.57264.1.6": "refs/tags/v1.5.0", + ... +``` + +*** +## Verification of container image attestations + +A [SLSA](https://slsa.dev/) Level 3 provenance is generated using [slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). + +The following command will verify the signature of an attestation and how it was issued. It will contain the payloadType, payload, and signature. +```bash +cosign verify-attestation --type slsaprovenance \ +--certificate-identity-regexp https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@refs/tags/v \ +--certificate-oidc-issuer https://token.actions.githubusercontent.com \ +quay.io/argoproj/argo-rollouts:v1.5.0 | jq +``` +The payload is a non-falsifiable provenance which is base64 encoded and can be viewed by using the command below: +```bash +cosign verify-attestation --type slsaprovenance \ +--certificate-identity-regexp https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@refs/tags/v \ +--certificate-oidc-issuer https://token.actions.githubusercontent.com \ +quay.io/argoproj/argo-rollouts:v1.5.0 | jq -r .payload | base64 -d | jq +``` +!!! tip + `cosign` or `slsa-verifier` can both be used to verify image attestations. + Check the documentation of each binary for detailed instructions. + +*** +## Verification of CLI artifacts with attestations + +A single attestation (`argo-rollouts.intoto.jsonl`) from each release is provided. This can be used with [slsa-verifier](https://github.com/slsa-framework/slsa-verifier#verification-for-github-builders) to verify that a CLI binary or manifest was generated using Argo Rollouts workflows on GitHub and ensures it was cryptographically signed. +```bash +slsa-verifier verify-artifact kubectl-argo-rollouts-linux-amd64 --provenance-path kubectl-argo-rollouts.intoto.jsonl --source-uri github.com/argoproj/argo-rollouts +``` +## Verifying an artifact and output the provenance + +```bash +slsa-verifier verify-artifact kubectl-argo-rollouts-linux-amd64 --provenance-path kubectl-argo-rollouts.intoto.jsonl --source-uri github.com/argoproj/argo-rollouts --print-provenance | jq +``` +## Verification of Sbom + +```bash +cosign verify-blob --signature sbom.tar.gz.sig --certificate sbom.tar.gz.pem \ +--certificate-identity-regexp ^https://github.com/argoproj/argo-rollouts/.github/workflows/release.yaml@refs/tags/v \ +--certificate-oidc-issuer https://token.actions.githubusercontent.com \ + ~/Downloads/sbom.tar.gz | jq +``` + +*** +## Verification on Kubernetes + +### Policy controllers +!!! note + We encourage all users to verify signatures and provenances with your admission/policy controller of choice. Doing so will verify that an image was built by us before it's deployed on your Kubernetes cluster. + +Cosign signatures and SLSA provenances are compatible with several types of admission controllers. Please see the [cosign documentation](https://docs.sigstore.dev/cosign/overview/#kubernetes-integrations) and [slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#verification) for supported controllers. diff --git a/hack/trigger-release.sh b/hack/trigger-release.sh new file mode 100755 index 0000000000..b7f843fad7 --- /dev/null +++ b/hack/trigger-release.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# This script requires bash shell - sorry. + +NEW_TAG="${1}" +GIT_REMOTE="${2}" + +set -ue + +if test "${NEW_TAG}" = "" -o "${GIT_REMOTE}" = ""; then + echo "!! Usage: $0 " >&2 + exit 1 +fi + +# Target (version) tag must match version scheme vMAJOR.MINOR.PATCH with an +# optional pre-release tag. +if ! echo "${NEW_TAG}" | egrep -q '^v[0-9]+\.[0-9]+\.[0-9]+(-rc[0-9]+)*$'; then + echo "!! Malformed version tag: '${NEW_TAG}', must match 'vMAJOR.MINOR.PATCH(-rcX)'" >&2 + exit 1 +fi + +# Check whether we are in correct branch of local repository +RELEASE_BRANCH="${NEW_TAG%\.[0-9]*}" +RELEASE_BRANCH="release-${RELEASE_BRANCH#*v}" + +currentBranch=$(git branch --show-current) +if test "$currentBranch" != "${RELEASE_BRANCH}"; then + echo "!! Please checkout branch '${RELEASE_BRANCH}' (currently in branch: '${currentBranch}')" >&2 + exit 1 +fi + +echo ">> Working in release branch '${RELEASE_BRANCH}'" + +echo ">> Ensuring release branch is up to date." +# make sure release branch is up to date +git pull ${GIT_REMOTE} ${RELEASE_BRANCH} + +# Check for target (version) tag in local repo +if git tag -l | grep -q -E "^${NEW_TAG}$"; then + echo "!! Target version tag '${NEW_TAG}' already exists in local repository" >&2 + exit 1 +fi + +# Check for target (version) tag in remote repo +if git ls-remote ${GIT_REMOTE} refs/tags/${NEW_TAG} | grep -q -E "${NEW_TAG}$"; then + echo "!! Target version tag '${NEW_TAG}' already exists in remote '${GIT_REMOTE}'" >&2 + exit 1 +fi + +echo ">> Creating new release '${NEW_TAG}' by pushing '${NEW_TAG}' to '${GIT_REMOTE}'" + +# Create new tag in local repository +git tag ${NEW_TAG} + +# Push the new tag to remote repository +git push ${GIT_REMOTE} ${NEW_TAG} diff --git a/mkdocs.yml b/mkdocs.yml index 26552ae072..6f851fa425 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -131,7 +131,9 @@ nav: - Best Practices: best-practices.md - Migrating: migrating.md - FAQ: FAQ.md -- Security: security.md +- Security: + - Security Policy: security/security.md + - Verify Release Artifacts: security/signed-release-assets.md - Roadmap/Release Schedule: roadmap.md - Contributing: - Contribution Guide: CONTRIBUTING.md From c8cd96856971e0bbc8f6ea1af479cc82d5dbed83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 15:11:38 -0500 Subject: [PATCH 096/159] chore(deps): bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 (#2882) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.12.5 to 1.12.6. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.12.5...v1.12.6) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 465afc74fa..6a14814ee3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.19 require ( - github.com/antonmedv/expr v1.12.5 + github.com/antonmedv/expr v1.12.6 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.1 diff --git a/go.sum b/go.sum index d21daece7d..019efc8124 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.12.5 h1:Fq4okale9swwL3OeLLs9WD9H6GbgBLJyN/NUHRv+n0E= -github.com/antonmedv/expr v1.12.5/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.12.6 h1:qtgMHOFissxhePwokx0xB9eqS6PUy0SbhDRPD67PInA= +github.com/antonmedv/expr v1.12.6/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.0 h1:XyE4jAw0oeRQKL9vlDQBnycmqhN7EIqUdWgPsSUqnkQ= github.com/argoproj/notifications-engine v0.4.0/go.mod h1:uGas18+DbCCwjif1zSwWWuwR0xJ18FXF+c2dkhPbF2k= From 3ddb9ef220e67ff9a926e486344c98e6aea68464 Mon Sep 17 00:00:00 2001 From: xinpure Date: Fri, 14 Jul 2023 21:37:04 +0800 Subject: [PATCH 097/159] fix: get new httpRoutesI after removeRoute() to avoid duplicates. Fixes #2769 (#2887) fix: get new httpRoutesI after removeRoute() to avoid duplicates Signed-off-by: xinpureZhu --- rollout/trafficrouting/istio/istio.go | 11 +++--- rollout/trafficrouting/istio/istio_test.go | 43 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index 0449c62dff..70b0cc0e68 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -712,11 +712,6 @@ func (r *Reconciler) getVirtualService(namespace string, vsvcName string, client } func (r *Reconciler) reconcileVirtualServiceHeaderRoutes(virtualService v1alpha1.IstioVirtualService, obj *unstructured.Unstructured, headerRouting *v1alpha1.SetHeaderRoute) error { - // HTTP Routes - httpRoutesI, err := GetHttpRoutesI(obj) - if err != nil { - return err - } destRuleHost, err := r.getDestinationRuleHost() if err != nil { return err @@ -746,6 +741,12 @@ func (r *Reconciler) reconcileVirtualServiceHeaderRoutes(virtualService v1alpha1 return fmt.Errorf("[reconcileVirtualServiceHeaderRoutes] failed to remove http route from virtual service: %w", err) } + // HTTP Routes + httpRoutesI, err := GetHttpRoutesI(obj) + if err != nil { + return err + } + httpRoutesI = append(httpRoutesI, createHeaderRoute(virtualService, obj, headerRouting, canarySvc, canarySubset)) err = unstructured.SetNestedSlice(obj.Object, httpRoutesI, "spec", Http) diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index b13d472944..ea6474ef5f 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -2857,3 +2857,46 @@ func AssertReconcileUpdateMirror(t *testing.T, vsvc string, ro *v1alpha1.Rollout assert.Equal(t, "update", actions[0].GetVerb()) return client } + +func TestReconcileHeaderRouteAvoidDuplicates(t *testing.T) { + ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) + obj := unstructuredutil.StrToUnstructuredUnsafe(regularVsvc) + client := testutil.NewFakeDynamicClient(obj) + vsvcLister, druleLister := getIstioListers(client) + r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) + client.ClearActions() + + const headerName = "test-header-route" + r.rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = append(r.rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes, []v1alpha1.MangedRoutes{{ + Name: headerName, + }, + }...) + + var setHeader = &v1alpha1.SetHeaderRoute{ + Name: headerName, + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "browser", + HeaderValue: &v1alpha1.StringMatch{ + Prefix: "Firefox", + }, + }, + }, + } + + err := r.SetHeaderRoute(setHeader) + assert.Nil(t, err) + + err = r.SetHeaderRoute(setHeader) + assert.Nil(t, err) + + iVirtualService, err := client.Resource(istioutil.GetIstioVirtualServiceGVR()).Namespace(r.rollout.Namespace).Get(context.TODO(), ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name, metav1.GetOptions{}) + assert.NoError(t, err) + // HTTP Routes + httpRoutes := extractHttpRoutes(t, iVirtualService) + + // Assertions + assert.Equal(t, httpRoutes[0].Name, headerName) + assert.Equal(t, httpRoutes[1].Name, "primary") + assert.Equal(t, httpRoutes[2].Name, "secondary") +} From 0082592077fbd267057c6ea3fda6bb4f450118c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:38:01 -0500 Subject: [PATCH 098/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 (#2886) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.13 to 1.19.14. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.19.13...service/sqs/v1.19.14) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 6a14814ee3..cd63abf8bc 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/antonmedv/expr v1.12.6 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.18.1 + github.com/aws/aws-sdk-go-v2 v1.19.0 github.com/aws/aws-sdk-go-v2/config v1.18.27 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 @@ -84,8 +84,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 // indirect diff --git a/go.sum b/go.sum index 019efc8124..74896e863e 100644 --- a/go.sum +++ b/go.sum @@ -101,24 +101,27 @@ 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.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= +github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.27 h1:Az9uLwmssTE6OGTpsFqOnaGpLnKDqNYOJzWuC6UAYzA= github.com/aws/aws-sdk-go-v2/config v1.18.27/go.mod h1:0My+YgmkGxeqjXZb5BYme5pc4drjTnM+x1GJ3zv42Nw= github.com/aws/aws-sdk-go-v2/credentials v1.13.26 h1:qmU+yhKmOCyujmuPY7tf5MxR/RKyZrOPO3V4DobiTUk= github.com/aws/aws-sdk-go-v2/credentials v1.13.26/go.mod h1:GoXt2YC8jHUBbA4jr+W3JiemnIbkXOfxSXcisUsZ3os= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 h1:PWGu2JhCb/XJlJ7SSFJq76pxk4xWsN76nZxh7TzMHx0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13 h1:g/Kzed9qNdvz5p7Av3ffavD19eN11deWqlHgR2JuXuw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.13/go.mod h1:BNkuX97Xp8meRKwZkWlXajo3u4cP/B3TC+YsadbOfaM= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= From 287b716850a62c098be6884364142a7199d7318b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:39:23 -0500 Subject: [PATCH 099/159] chore(deps): bump docker/login-action from 2.1.0 to 2.2.0 (#2877) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/f4ef78c080cd8ba55a85445d5b36e214a81df20a...465a07811f14bebb1938fbed4728c6a1ff8901fc) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index cc5dc45c11..41715fd92c 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -106,7 +106,7 @@ jobs: echo 'EOF' >> $GITHUB_ENV - name: Login to Quay.io - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: registry: quay.io username: ${{ secrets.quay_username }} @@ -114,7 +114,7 @@ jobs: if: ${{ inputs.quay_image_name && inputs.push }} - name: Login to GitHub Container Registry - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: registry: ghcr.io username: ${{ secrets.ghcr_username }} @@ -122,7 +122,7 @@ jobs: if: ${{ inputs.ghcr_image_name && inputs.push }} - name: Login to dockerhub Container Registry - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: username: ${{ secrets.docker_username }} password: ${{ secrets.docker_password }} From 00858e76e72225f4d390bf9463f045fbc159883d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:43:43 -0500 Subject: [PATCH 100/159] chore(deps): bump docker/setup-buildx-action from 2.5.0 to 2.9.1 (#2879) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.5.0 to 2.9.1. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c...4c0219f9ac95b02789c1075625400b2acbff50b1) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 41715fd92c..85a614fb45 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -79,7 +79,7 @@ jobs: cosign-release: 'v2.0.2' - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 - - uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c # v2.5.0 + - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 - name: Setup tags for container image as a CSV type run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 87d4aa6335..78b3ca2813 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -99,7 +99,7 @@ jobs: uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c # v2.5.0 + uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 - name: Generate release artifacts run: | From 810dffc872b5cf6c8ecd84a1e279b6e2907aa753 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:44:21 -0500 Subject: [PATCH 101/159] chore(deps): bump actions/setup-go from 4.0.0 to 4.0.1 (#2881) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4...v4.0.1) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 78b3ca2813..5ab65a59db 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -91,7 +91,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@v4.0.1 # v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} @@ -165,7 +165,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 + uses: actions/setup-go@v4.0.1 # v4.0.0 with: go-version: ${{ env.GOLANG_VERSION }} From b2393089ac9924892ba4ec74c1bf6157aa8af4ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:45:27 -0500 Subject: [PATCH 102/159] chore(deps): bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 (#2880) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.6.0 to 1.7.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.6.0...v1.7.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5ab65a59db..ea9b00aef4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.6.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.7.0 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.6.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.7.0 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} @@ -141,7 +141,7 @@ jobs: id-token: write # Needed for provenance signing and ID contents: write # Needed for release uploads # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.6.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.7.0 with: base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" provenance-name: "argo-rollouts.intoto.jsonl" From d36835759b237c89b55258c8d7dfa032c92ddd94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 14:15:55 +0000 Subject: [PATCH 103/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 (#2883) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.27 to 1.18.28. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.27...config/v1.18.28) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index cd63abf8bc..2f025fda2c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.19.0 - github.com/aws/aws-sdk-go-v2/config v1.18.27 + github.com/aws/aws-sdk-go-v2/config v1.18.28 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 74896e863e..60e46760f8 100644 --- a/go.sum +++ b/go.sum @@ -104,32 +104,32 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.27 h1:Az9uLwmssTE6OGTpsFqOnaGpLnKDqNYOJzWuC6UAYzA= -github.com/aws/aws-sdk-go-v2/config v1.18.27/go.mod h1:0My+YgmkGxeqjXZb5BYme5pc4drjTnM+x1GJ3zv42Nw= -github.com/aws/aws-sdk-go-v2/credentials v1.13.26 h1:qmU+yhKmOCyujmuPY7tf5MxR/RKyZrOPO3V4DobiTUk= -github.com/aws/aws-sdk-go-v2/credentials v1.13.26/go.mod h1:GoXt2YC8jHUBbA4jr+W3JiemnIbkXOfxSXcisUsZ3os= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= +github.com/aws/aws-sdk-go-v2/config v1.18.28 h1:TINEaKyh1Td64tqFvn09iYpKiWjmHYrG1fa91q2gnqw= +github.com/aws/aws-sdk-go-v2/config v1.18.28/go.mod h1:nIL+4/8JdAuNHEjn/gPEXqtnS02Q3NXB/9Z7o5xE4+A= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27 h1:dz0yr/yR1jweAnsCx+BmjerUILVPQ6FS5AwF/OyG1kA= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 h1:8r5m1BoAWkn0TDC34lUculryf7nUF25EgIMdjvGCkgo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36/go.mod h1:Rmw2M1hMVTwiUhjwMoIBFWFJMhvJbct06sSidxInkhY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 h1:PWGu2JhCb/XJlJ7SSFJq76pxk4xWsN76nZxh7TzMHx0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.12/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 h1:2qTR7IFk7/0IN/adSFhYu9Xthr0zVFTgBrmPldILn80= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 h1:XFJ2Z6sNUUcAz9poj+245DMkrHE4h2j5I9/xD50RHfE= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.2/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 h1:sWDv7cMITPcZ21QdreULwxOOAmE05JjEsT6fCDtDA9k= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 h1:BFubHS/xN5bjl818QaroN6mQdjneYQ+AOx44KNXlyH4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 h1:e5mnydVdCVWxP+5rPAGi2PYxC7u2OZgH1ypC114H04U= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From e94a380e2b104b1117ef8bf6e4785fe4ece5b425 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 09:49:36 -0500 Subject: [PATCH 104/159] chore(deps): bump docker/setup-qemu-action from 2.1.0 to 2.2.0 (#2878) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/e81a89b1732b9c48d79cd809d8d81d79c4647a18...2b82ce82d56a2a04d2637cd93a637ae1b359c0a7) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 85a614fb45..4aab75e472 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -78,7 +78,7 @@ jobs: with: cosign-release: 'v2.0.2' - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 - name: Setup tags for container image as a CSV type diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ea9b00aef4..e6abe3e90b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -96,7 +96,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Set up QEMU - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 From 8144fb8514dc389b09f612016a85d5650ef02b62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:22:58 +0000 Subject: [PATCH 105/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 (#2884) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.26.2 to 1.26.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.2...service/s3/v1.26.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2f025fda2c..623fd4384d 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.19.0 github.com/aws/aws-sdk-go-v2/config v1.18.28 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 60e46760f8..a1395d4b25 100644 --- a/go.sum +++ b/go.sum @@ -101,7 +101,6 @@ 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.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.28 h1:TINEaKyh1Td64tqFvn09iYpKiWjmHYrG1fa91q2gnqw= @@ -110,16 +109,14 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.27 h1:dz0yr/yR1jweAnsCx+BmjerUILV github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 h1:8r5m1BoAWkn0TDC34lUculryf7nUF25EgIMdjvGCkgo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36/go.mod h1:Rmw2M1hMVTwiUhjwMoIBFWFJMhvJbct06sSidxInkhY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2 h1:PWGu2JhCb/XJlJ7SSFJq76pxk4xWsN76nZxh7TzMHx0= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.2/go.mod h1:2KOZkkzMDZCo/aLzPhys06mHNkiU74u85aMJA3PLRvg= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 h1:sAqtjjMc1DdA0JnYKKuqJVt/eHLTuN7bDf2T4UQ9sDs= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3/go.mod h1:r6kXYdL8M2/BnZatWvQ8yC/3UQvPrXTQnJtZ0xEbKRM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= From 8db151fc9555949bf5d37f597c73b32c4e7b6c0c Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 17 Jul 2023 10:44:02 -0500 Subject: [PATCH 106/159] feat: Send informer add k8s event (#2834) * add event for reconcilation Signed-off-by: zachaller * add sprig Signed-off-by: zachaller * fmt Signed-off-by: zachaller * fix tests Signed-off-by: zachaller * move event to add informer event Signed-off-by: zachaller * remove bad code Signed-off-by: zachaller * handel bad ro objects Signed-off-by: zachaller * add new event Signed-off-by: zachaller * typo Signed-off-by: zachaller * switch to built in eventf Signed-off-by: zachaller * remove sprig Signed-off-by: zachaller * refactor Signed-off-by: zachaller --------- Signed-off-by: zachaller --- rollout/controller.go | 15 ++++++++++++++- test/e2e/functional_test.go | 34 ++++++++++++++++++---------------- utils/conditions/conditions.go | 2 ++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/rollout/controller.go b/rollout/controller.go index b5d8122ac3..c7e51611c2 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -228,7 +228,20 @@ func NewController(cfg ControllerConfig) *Controller { log.Info("Setting up event handlers") // Set up an event handler for when rollout resources change cfg.RolloutsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: controller.enqueueRollout, + AddFunc: func(obj interface{}) { + controller.enqueueRollout(obj) + ro := unstructuredutil.ObjectToRollout(obj) + if ro != nil { + if cfg.Recorder != nil { + cfg.Recorder.Eventf(ro, record.EventOptions{ + EventType: corev1.EventTypeNormal, + EventReason: conditions.RolloutAddedToInformerReason, + }, "Rollout resource added to informer: %s/%s", ro.Namespace, ro.Name) + } else { + log.Warnf("Recorder is not configured") + } + } + }, UpdateFunc: func(old, new interface{}) { oldRollout := unstructuredutil.ObjectToRollout(old) newRollout := unstructuredutil.ObjectToRollout(new) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 71907414e8..d4b27d3e3f 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -90,11 +90,12 @@ spec: ExpectRevisionPodCount("1", 0). ExpectRevisionPodCount("2", 1). ExpectRolloutEvents([]string{ - "RolloutNotCompleted", // Rollout not completed, started update to revision 0 (7fd9b5545c) - "RolloutUpdated", // Rollout updated to revision 1 - "NewReplicaSetCreated", // Created ReplicaSet abort-retry-promote-698fbfb9dc (revision 1) - "ScalingReplicaSet", // Scaled up ReplicaSet abort-retry-promote-698fbfb9dc (revision 1) from 0 to 1 - "RolloutCompleted", // Rollout completed update to revision 1 (698fbfb9dc): Initial deploy + "RolloutAddedToInformer", // Rollout added to informer cache + "RolloutNotCompleted", // Rollout not completed, started update to revision 0 (7fd9b5545c) + "RolloutUpdated", // Rollout updated to revision 1 + "NewReplicaSetCreated", // Created ReplicaSet abort-retry-promote-698fbfb9dc (revision 1) + "ScalingReplicaSet", // Scaled up ReplicaSet abort-retry-promote-698fbfb9dc (revision 1) from 0 to 1 + "RolloutCompleted", // Rollout completed update to revision 1 (698fbfb9dc): Initial deploy "RolloutNotCompleted", "RolloutUpdated", // Rollout updated to revision 2 "NewReplicaSetCreated", // Created ReplicaSet abort-retry-promote-75dcb5ddd6 (revision 2) @@ -701,17 +702,18 @@ func (s *FunctionalSuite) TestBlueGreenUpdate() { Then(). ExpectReplicaCounts(3, 6, 3, 3, 3). ExpectRolloutEvents([]string{ - "RolloutUpdated", // Rollout updated to revision 1 - "NewReplicaSetCreated", // Created ReplicaSet bluegreen-7dcd8f8869 (revision 1) - "ScalingReplicaSet", // Scaled up ReplicaSet bluegreen-7dcd8f8869 (revision 1) from 0 to 3 - "RolloutCompleted", // Rollout completed update to revision 1 (7dcd8f8869): Initial deploy - "SwitchService", // Switched selector for service 'bluegreen' from '' to '7dcd8f8869' - "RolloutUpdated", // Rollout updated to revision 2 - "NewReplicaSetCreated", // Created ReplicaSet bluegreen-5498785cd6 (revision 2) - "RolloutNotCompleted", // Rollout went to not completed state started update to revision 2 (85c6899) - "ScalingReplicaSet", // Scaled up ReplicaSet bluegreen-5498785cd6 (revision 2) from 0 to 3 - "SwitchService", // Switched selector for service 'bluegreen' from '7dcd8f8869' to '6c779b88b6' - "RolloutCompleted", // Rollout completed update to revision 2 (6c779b88b6): Completed blue-green update + "RolloutAddedToInformer", // Rollout added to informer cache + "RolloutUpdated", // Rollout updated to revision 1 + "NewReplicaSetCreated", // Created ReplicaSet bluegreen-7dcd8f8869 (revision 1) + "ScalingReplicaSet", // Scaled up ReplicaSet bluegreen-7dcd8f8869 (revision 1) from 0 to 3 + "RolloutCompleted", // Rollout completed update to revision 1 (7dcd8f8869): Initial deploy + "SwitchService", // Switched selector for service 'bluegreen' from '' to '7dcd8f8869' + "RolloutUpdated", // Rollout updated to revision 2 + "NewReplicaSetCreated", // Created ReplicaSet bluegreen-5498785cd6 (revision 2) + "RolloutNotCompleted", // Rollout went to not completed state started update to revision 2 (85c6899) + "ScalingReplicaSet", // Scaled up ReplicaSet bluegreen-5498785cd6 (revision 2) from 0 to 3 + "SwitchService", // Switched selector for service 'bluegreen' from '7dcd8f8869' to '6c779b88b6' + "RolloutCompleted", // Rollout completed update to revision 2 (6c779b88b6): Completed blue-green update }) } diff --git a/utils/conditions/conditions.go b/utils/conditions/conditions.go index c2aaece787..77cd401c63 100644 --- a/utils/conditions/conditions.go +++ b/utils/conditions/conditions.go @@ -174,6 +174,8 @@ const ( // LoadBalancerNotFoundReason is emitted when load balancer can not be found LoadBalancerNotFoundReason = "LoadBalancerNotFound" LoadBalancerNotFoundMessage = "Failed to find load balancer: %s" + + RolloutAddedToInformerReason = "RolloutAddedToInformer" ) // NewRolloutCondition creates a new rollout condition. From 20e00e4ae20bd5036f32ab670157825bfd219cda Mon Sep 17 00:00:00 2001 From: n888 Date: Tue, 18 Jul 2023 10:26:04 -0700 Subject: [PATCH 107/159] feat: Support Multiple ALB Ingresses (#2639) * Support Multi ALB Ingress Signed-off-by: n888 * Fix comments and alb_test ARNs Signed-off-by: n888 * Fix e2e alb-canary-rollout: rm wildcard ingress path for alb controller Signed-off-by: n888 * Add e2e TestALBCanaryUpdateMultiIngress Signed-off-by: n888 * Add e2e TestALBCanaryUpdateMultiIngress Signed-off-by: n888 * e2e alb-canary-rollout use ImplementationSpecific wildcard path Signed-off-by: n888 * add e2e TestALBPingPongUpdateMultiIngress Signed-off-by: n888 * add e2e TestALBExperimentStepMultiIngress, TestALBExperimentStepNoSetWeightMultiIngress Signed-off-by: n888 * e2e alb headerroute: fix existing ing.class and simplify alb annotations Signed-off-by: n888 * add e2e TestAlbHeaderRouteMultiIngress Signed-off-by: n888 * fix lint alb_test.go Signed-off-by: n888 * update codegen Signed-off-by: n888 * TestAlbHeaderRouteMultiIngress use unique multi ingress resource names Signed-off-by: n888 * Initial Status.ALBs support Signed-off-by: n888 * clean up comments Signed-off-by: n888 * codegen Signed-off-by: n888 * only set ingress field for status.albs, and not status.alb Signed-off-by: n888 * add status.alb.ingress, but keep as optional Signed-off-by: n888 * improve determining whether to update status.albs or status.alb Signed-off-by: n888 * codegen Signed-off-by: n888 * codegen Signed-off-by: n888 * update both ALB and ALBs status Signed-off-by: Tung Huynh * fix ALBs status does not update when number of ingresses changes Signed-off-by: Tung Huynh * update tests Signed-off-by: Tung Huynh * add a little docs Signed-off-by: zachaller * github trigger re-run Signed-off-by: zachaller --------- Signed-off-by: n888 Signed-off-by: Tung Huynh Signed-off-by: zachaller Co-authored-by: Tung Huynh Co-authored-by: zachaller --- docs/features/traffic-management/alb.md | 5 + manifests/crds/rollout-crd.yaml | 50 +- manifests/install.yaml | 50 +- pkg/apiclient/rollout/rollout.swagger.json | 25 +- pkg/apis/api-rules/violation_exceptions.list | 3 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1165 +++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 15 +- .../rollouts/v1alpha1/openapi_generated.go | 48 +- pkg/apis/rollouts/v1alpha1/types.go | 14 +- .../v1alpha1/zz_generated.deepcopy.go | 10 + .../validation/validation_references.go | 52 +- .../validation/validation_references_test.go | 250 +++- rollout/controller.go | 32 +- rollout/controller_test.go | 92 ++ rollout/trafficrouting/alb/alb.go | 451 ++++--- rollout/trafficrouting/alb/alb_test.go | 1192 ++++++++++++++++- ...multi-ingress-experiment-no-setweight.yaml | 123 ++ .../rollout-alb-multi-ingress-experiment.yaml | 120 ++ test/e2e/aws_test.go | 208 +++ .../alb-canary-multi-ingress-rollout.yaml | 118 ++ test/e2e/functional/alb-canary-rollout.yaml | 4 +- .../alb-pingpong-multi-ingress-rollout.yaml | 106 ++ .../alb-header-route-multi-ingress.yaml | 112 ++ test/e2e/header-routing/alb-header-route.yaml | 16 +- test/fixtures/common.go | 12 + ui/src/models/rollout/generated/api.ts | 22 +- utils/ingress/ingress.go | 22 + utils/ingress/ingress_test.go | 77 +- 28 files changed, 3567 insertions(+), 827 deletions(-) create mode 100644 test/e2e/alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml create mode 100644 test/e2e/alb/rollout-alb-multi-ingress-experiment.yaml create mode 100644 test/e2e/functional/alb-canary-multi-ingress-rollout.yaml create mode 100644 test/e2e/functional/alb-pingpong-multi-ingress-rollout.yaml create mode 100644 test/e2e/header-routing/alb-header-route-multi-ingress.yaml diff --git a/docs/features/traffic-management/alb.md b/docs/features/traffic-management/alb.md index 5530d27ea2..0ac0ff6173 100644 --- a/docs/features/traffic-management/alb.md +++ b/docs/features/traffic-management/alb.md @@ -51,6 +51,11 @@ spec: # the AWS Load Balancer Controller to split traffic between the canary and stable # Service, according to the desired traffic weight (required). ingress: ingress + # If you want to controll multiple ingress resources you can use the ingresses field, if ingresses is specified + # the ingress field will need to be omitted. + ingresses: + - ingress-1 + - ingress-2 # Reference to a Service that the Ingress must target in one of the rules (optional). # If omitted, uses canary.stableService. rootService: root-service diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 48b5ba105b..5428a3a2e4 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -732,6 +732,10 @@ spec: type: string ingress: type: string + ingresses: + items: + type: string + type: array rootService: type: string servicePort: @@ -749,7 +753,6 @@ spec: - enabled type: object required: - - ingress - servicePort type: object ambassador: @@ -3320,6 +3323,8 @@ spec: - arn - name type: object + ingress: + type: string loadBalancer: properties: arn: @@ -3345,6 +3350,49 @@ spec: - name type: object type: object + albs: + items: + properties: + canaryTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + ingress: + type: string + loadBalancer: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + stableTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + type: object + type: array availableReplicas: format: int32 type: integer diff --git a/manifests/install.yaml b/manifests/install.yaml index 4e8964c5f3..b93a60d32b 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -12002,6 +12002,10 @@ spec: type: string ingress: type: string + ingresses: + items: + type: string + type: array rootService: type: string servicePort: @@ -12019,7 +12023,6 @@ spec: - enabled type: object required: - - ingress - servicePort type: object ambassador: @@ -14590,6 +14593,8 @@ spec: - arn - name type: object + ingress: + type: string loadBalancer: properties: arn: @@ -14615,6 +14620,49 @@ spec: - name type: object type: object + albs: + items: + properties: + canaryTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + ingress: + type: string + loadBalancer: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + stableTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + type: object + type: array availableReplicas: format: int32 type: integer diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 68b207b930..fb30b4b62e 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -507,6 +507,9 @@ }, "stableTargetGroup": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AwsResourceRef" + }, + "ingress": { + "type": "string" } } }, @@ -526,13 +529,20 @@ "type": "string", "title": "RootService references the service in the ingress to the controller should add the action to" }, - "stickinessConfig": { - "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StickinessConfig", - "title": "AdditionalForwardConfig allows to specify further settings on the ForwaredConfig\n+optional" - }, "annotationPrefix": { "type": "string", "title": "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller\n+optional" + }, + "stickinessConfig": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StickinessConfig", + "title": "StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress`\n+optional" + }, + "ingresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario\n+optional" } }, "title": "ALBTrafficRouting configuration for ALB ingress controller to control traffic routing" @@ -1600,6 +1610,13 @@ "alb": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ALBStatus", "title": "/ ALB keeps information regarding the ALB and TargetGroups" + }, + "albs": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ALBStatus" + }, + "title": "/ ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario" } }, "title": "RolloutStatus is the status for a Rollout resource" diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 2b177e4ce3..33491b0435 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -1,3 +1,4 @@ +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,ALBTrafficRouting,Ingresses API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AmbassadorTrafficRouting,Mappings API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisRunSpec,Args API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisRunSpec,DryRun @@ -35,6 +36,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStep,Analyses API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStep,Templates API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStepAnalysisTemplateRef,Args +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,ALBs API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,Conditions API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,PauseConditions API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutTrafficRouting,ManagedRoutes @@ -44,5 +46,6 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,TrafficWeights,Additional API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,WebMetric,Headers API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,MetricProvider,SkyWalking +API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,ALBs API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,HPAReplicas API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,Sigv4Config,RoleARN diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index b2face819c..f4bf7a3e67 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3292,516 +3292,519 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8134 bytes of a gzipped FileDescriptorProto + // 8179 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, - 0x9c, 0xfa, 0x8c, 0xcb, 0xc9, 0x3e, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, + 0x9c, 0xfa, 0x8c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xb6, 0x86, 0x7b, 0x2b, 0x4b, 0x3a, 0x5b, 0xcd, 0x99, 0xc7, 0x61, 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, - 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x65, 0x24, 0xc8, 0x1f, - 0x03, 0x31, 0xe2, 0x2f, 0xfd, 0x71, 0x20, 0xff, 0x48, 0x64, 0x07, 0x30, 0x1d, 0x51, 0xf9, 0x93, - 0x20, 0x81, 0x61, 0xc0, 0x41, 0xe0, 0xfd, 0x11, 0x04, 0xef, 0xb3, 0x5f, 0xf7, 0xf4, 0x70, 0x67, - 0x38, 0xcd, 0xd5, 0x25, 0xf1, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, 0x55, - 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, 0xdf, - 0x0d, 0xfc, 0x7b, 0xfc, 0xc7, 0xc7, 0x03, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, 0x6f, - 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x74, 0xda, 0xdd, 0x3d, 0xe7, 0x93, 0xab, - 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x13, 0x53, 0x5b, - 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x56, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, 0x97, - 0x28, 0x6a, 0xcb, 0x1f, 0x37, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, 0xf2, - 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x6a, 0xb8, 0xe2, 0xfa, 0x4c, 0xb6, - 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, 0xa0, - 0x59, 0x38, 0x2f, 0xc7, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, 0x43, - 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, 0x37, - 0x1f, 0x55, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xa5, 0x41, 0xf5, 0x7a, 0x91, 0xdb, - 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0x77, 0x0b, 0x50, 0xaa, 0x6c, 0x56, 0xeb, - 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x35, 0x0b, 0xe6, 0xda, 0xbe, 0xd3, 0xac, 0x3a, 0x6d, 0xc7, 0x6b, - 0xd0, 0x60, 0xc9, 0x7a, 0xc6, 0x7a, 0x7e, 0xf6, 0xc5, 0xcd, 0x95, 0x71, 0xfa, 0x6b, 0xa5, 0x72, - 0x3f, 0x44, 0x1a, 0xfa, 0xbd, 0xa0, 0x41, 0x91, 0xee, 0x56, 0x2f, 0x7e, 0xf7, 0xa8, 0xfc, 0xc4, - 0xf1, 0x51, 0x79, 0x6e, 0xd3, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0xdb, 0x16, 0x9c, 0x6f, 0x38, 0x9e, - 0x13, 0x1c, 0x6e, 0x3b, 0x41, 0x8b, 0x46, 0x6f, 0x04, 0x7e, 0xaf, 0xbb, 0x34, 0x71, 0x06, 0xd2, - 0x3c, 0x29, 0xa5, 0x39, 0xbf, 0x96, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, 0xd9, 0x69, - 0x53, 0x53, 0xae, 0xc2, 0x59, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xec, 0x0f, 0x0a, 0x70, - 0xbe, 0xb2, 0x59, 0xdd, 0x0e, 0x9c, 0xdd, 0x5d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x16, 0xf9, - 0x18, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xc8, 0x3b, 0xb2, 0x54, 0x5d, 0x90, 0x44, 0xa7, 0x37, - 0x44, 0x31, 0x2a, 0x38, 0x79, 0x05, 0x66, 0x43, 0x1a, 0x1c, 0xb8, 0x0d, 0x5a, 0xf3, 0x83, 0x88, - 0xb7, 0x74, 0xb1, 0x7a, 0x41, 0xa2, 0xcf, 0xd6, 0x63, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, - 0x91, 0x84, 0xf3, 0x86, 0x28, 0xc5, 0xd5, 0x30, 0x06, 0xa1, 0x89, 0x47, 0xbe, 0x65, 0xc1, 0x62, - 0x18, 0xb9, 0x8d, 0x7d, 0xd7, 0xa3, 0x61, 0xb8, 0xe6, 0x7b, 0xbb, 0x6e, 0x6b, 0xa9, 0xc8, 0x5b, - 0xf1, 0xd6, 0x78, 0xad, 0x58, 0x4f, 0x51, 0xad, 0x5e, 0x3c, 0x3e, 0x2a, 0x2f, 0xa6, 0x4b, 0xb1, - 0x8f, 0x3b, 0x59, 0x87, 0x45, 0xc7, 0xf3, 0xfc, 0xc8, 0x89, 0x5c, 0xdf, 0xab, 0x05, 0x74, 0xd7, - 0x7d, 0xb0, 0x34, 0xc9, 0x3f, 0x67, 0x49, 0x7e, 0xce, 0x62, 0x25, 0x05, 0xc7, 0xbe, 0x1a, 0xf6, - 0x3a, 0x2c, 0x55, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0xf5, 0xc6, 0xf3, 0x30, 0xd3, - 0x71, 0xba, 0x5d, 0xd7, 0x6b, 0xb1, 0xee, 0x28, 0x3c, 0x5f, 0xaa, 0xce, 0x1d, 0x1f, 0x95, 0x67, - 0xb6, 0x64, 0x19, 0x6a, 0xa8, 0xfd, 0x27, 0x13, 0x30, 0x5b, 0xf1, 0x9c, 0xf6, 0x61, 0xe8, 0x86, - 0xd8, 0xf3, 0xc8, 0x17, 0x61, 0x86, 0xad, 0x2e, 0x4d, 0x27, 0x72, 0xe4, 0x8c, 0xfc, 0xc4, 0x8a, - 0x98, 0xec, 0x2b, 0xe6, 0x64, 0x8f, 0xdb, 0x85, 0x61, 0xaf, 0x1c, 0x7c, 0x72, 0xe5, 0xad, 0x9d, - 0x7b, 0xb4, 0x11, 0x6d, 0xd1, 0xc8, 0xa9, 0x12, 0xf9, 0x15, 0x10, 0x97, 0xa1, 0xa6, 0x4a, 0x7c, - 0x98, 0x0c, 0xbb, 0xb4, 0x21, 0x67, 0xd8, 0xd6, 0x98, 0x23, 0x39, 0x16, 0xbd, 0xde, 0xa5, 0x8d, - 0xea, 0x9c, 0x64, 0x3d, 0xc9, 0xfe, 0x21, 0x67, 0x44, 0xee, 0xc3, 0x54, 0xc8, 0xd7, 0x1c, 0x39, - 0x79, 0xde, 0xca, 0x8f, 0x25, 0x27, 0x5b, 0x9d, 0x97, 0x4c, 0xa7, 0xc4, 0x7f, 0x94, 0xec, 0xec, - 0xff, 0x64, 0xc1, 0x05, 0x03, 0xbb, 0x12, 0xb4, 0x7a, 0x1d, 0xea, 0x45, 0xe4, 0x19, 0x98, 0xf4, - 0x9c, 0x0e, 0x95, 0x13, 0x45, 0x8b, 0x7c, 0xcb, 0xe9, 0x50, 0xe4, 0x10, 0xf2, 0x2c, 0x14, 0x0f, - 0x9c, 0x76, 0x8f, 0xf2, 0x46, 0x2a, 0x55, 0xcf, 0x49, 0x94, 0xe2, 0xdb, 0xac, 0x10, 0x05, 0x8c, - 0xbc, 0x07, 0x25, 0xfe, 0xe3, 0x7a, 0xe0, 0x77, 0x72, 0xfa, 0x34, 0x29, 0xe1, 0xdb, 0x8a, 0x6c, - 0xf5, 0xdc, 0xf1, 0x51, 0xb9, 0xa4, 0xff, 0x62, 0xcc, 0xd0, 0xfe, 0x33, 0x0b, 0x16, 0x8c, 0x8f, - 0xdb, 0x74, 0xc3, 0x88, 0x7c, 0xa1, 0x6f, 0xf0, 0xac, 0x0c, 0x37, 0x78, 0x58, 0x6d, 0x3e, 0x74, - 0x16, 0xe5, 0x97, 0xce, 0xa8, 0x12, 0x63, 0xe0, 0x78, 0x50, 0x74, 0x23, 0xda, 0x09, 0x97, 0x26, - 0x9e, 0x29, 0x3c, 0x3f, 0xfb, 0xe2, 0x46, 0x6e, 0xdd, 0x18, 0xb7, 0xef, 0x06, 0xa3, 0x8f, 0x82, - 0x8d, 0xfd, 0xaf, 0x0a, 0x89, 0xee, 0xdb, 0x52, 0x72, 0x7c, 0x60, 0xc1, 0x54, 0xdb, 0xd9, 0xa1, - 0x6d, 0x31, 0xb7, 0x66, 0x5f, 0x7c, 0x27, 0x37, 0x49, 0x14, 0x8f, 0x95, 0x4d, 0x4e, 0xff, 0x9a, - 0x17, 0x05, 0x87, 0xf1, 0xf0, 0x12, 0x85, 0x28, 0x99, 0x93, 0x7f, 0x6c, 0xc1, 0x6c, 0xbc, 0x2a, - 0xa8, 0x66, 0xd9, 0xc9, 0x5f, 0x98, 0x78, 0x31, 0x92, 0x12, 0xe9, 0x55, 0xd7, 0x80, 0xa0, 0x29, - 0xcb, 0xf2, 0xa7, 0x60, 0xd6, 0xf8, 0x04, 0xb2, 0x08, 0x85, 0x7d, 0x7a, 0x28, 0x06, 0x3c, 0xb2, - 0x9f, 0xe4, 0x62, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0xe9, 0x89, 0x57, 0xad, 0xe5, 0xd7, 0x61, 0x31, - 0xcd, 0x70, 0x94, 0xfa, 0xf6, 0x6f, 0x4e, 0x26, 0x06, 0x26, 0x5b, 0x08, 0x88, 0x0f, 0xd3, 0x1d, - 0x1a, 0x05, 0x6e, 0x43, 0x75, 0xd9, 0xfa, 0x78, 0xad, 0xb4, 0xc5, 0x89, 0xc5, 0x7b, 0x9c, 0xf8, - 0x1f, 0xa2, 0xe2, 0x42, 0xf6, 0x60, 0xd2, 0x09, 0x5a, 0xaa, 0x4f, 0xae, 0xe7, 0x33, 0x2d, 0xe3, - 0xa5, 0xa2, 0x12, 0xb4, 0x42, 0xe4, 0x1c, 0xc8, 0x2a, 0x94, 0x22, 0x1a, 0x74, 0x5c, 0xcf, 0x89, - 0xc4, 0xa6, 0x38, 0x53, 0x3d, 0x2f, 0xd1, 0x4a, 0xdb, 0x0a, 0x80, 0x31, 0x0e, 0x69, 0xc3, 0x54, - 0x33, 0x38, 0xc4, 0x9e, 0xb7, 0x34, 0x99, 0x47, 0x53, 0xac, 0x73, 0x5a, 0xf1, 0x20, 0x15, 0xff, - 0x51, 0xf2, 0x20, 0xbf, 0x62, 0xc1, 0xc5, 0x0e, 0x75, 0xc2, 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, - 0xa8, 0xc7, 0x3a, 0x76, 0xa9, 0xc8, 0x99, 0xe3, 0xb8, 0xfd, 0xd0, 0x4f, 0xb9, 0xfa, 0xb4, 0x14, - 0xe5, 0x62, 0x16, 0x14, 0x33, 0xa5, 0xb1, 0xff, 0x64, 0x12, 0xce, 0xf7, 0x2d, 0xec, 0xe4, 0x65, - 0x28, 0x76, 0xf7, 0x9c, 0x50, 0xad, 0xd4, 0x57, 0xd5, 0x32, 0x51, 0x63, 0x85, 0x0f, 0x8f, 0xca, - 0xe7, 0x54, 0x15, 0x5e, 0x80, 0x02, 0x99, 0xa9, 0x42, 0x1d, 0x1a, 0x86, 0x4e, 0x4b, 0x2d, 0xdf, - 0xc6, 0x30, 0xe1, 0xc5, 0xa8, 0xe0, 0xe4, 0xef, 0x59, 0x70, 0x4e, 0x0c, 0x19, 0xa4, 0x61, 0xaf, - 0x1d, 0xb1, 0x2d, 0x8a, 0x35, 0xcb, 0xcd, 0x3c, 0x86, 0xa7, 0x20, 0x59, 0xbd, 0x24, 0xb9, 0x9f, - 0x33, 0x4b, 0x43, 0x4c, 0xf2, 0x25, 0x77, 0xa1, 0x14, 0x46, 0x4e, 0x10, 0xd1, 0x66, 0x25, 0xe2, - 0xca, 0xc8, 0xec, 0x8b, 0x3f, 0x3e, 0xdc, 0xda, 0xbd, 0xed, 0x76, 0xa8, 0xd8, 0x27, 0xea, 0x8a, - 0x00, 0xc6, 0xb4, 0xc8, 0x7b, 0x00, 0x41, 0xcf, 0xab, 0xf7, 0x3a, 0x1d, 0x27, 0x38, 0x94, 0x8a, - 0xd7, 0x8d, 0xf1, 0x3e, 0x0f, 0x35, 0xbd, 0x58, 0xd5, 0x88, 0xcb, 0xd0, 0xe0, 0x47, 0xbe, 0x62, - 0xc1, 0x39, 0x31, 0x12, 0x95, 0x04, 0x53, 0x39, 0x4b, 0x70, 0x9e, 0x35, 0xed, 0xba, 0xc9, 0x02, - 0x93, 0x1c, 0xed, 0xff, 0x90, 0x54, 0x03, 0xea, 0x11, 0x3b, 0x14, 0xb5, 0x0e, 0xc9, 0xe7, 0xe1, - 0xc9, 0xb0, 0xd7, 0x68, 0xd0, 0x30, 0xdc, 0xed, 0xb5, 0xb1, 0xe7, 0xdd, 0x70, 0xc3, 0xc8, 0x0f, - 0x0e, 0x37, 0xdd, 0x8e, 0x1b, 0xf1, 0x11, 0x57, 0xac, 0x5e, 0x39, 0x3e, 0x2a, 0x3f, 0x59, 0x1f, - 0x84, 0x84, 0x83, 0xeb, 0x13, 0x07, 0x9e, 0xea, 0x79, 0x83, 0xc9, 0x0b, 0xa5, 0xbb, 0x7c, 0x7c, - 0x54, 0x7e, 0xea, 0xce, 0x60, 0x34, 0x3c, 0x89, 0x86, 0xfd, 0xdf, 0x2c, 0xb6, 0x52, 0x8b, 0xef, - 0xda, 0xa6, 0x9d, 0x6e, 0x9b, 0xad, 0x2e, 0x67, 0xaf, 0x3f, 0x46, 0x09, 0xfd, 0x11, 0xf3, 0xd9, - 0xee, 0x94, 0xfc, 0x83, 0x94, 0x48, 0xfb, 0xbf, 0x5a, 0x70, 0x31, 0x8d, 0xfc, 0x18, 0x74, 0x9e, - 0x30, 0xa9, 0xf3, 0xdc, 0xca, 0xf7, 0x6b, 0x07, 0x28, 0x3e, 0x5f, 0x9b, 0xec, 0xff, 0xd6, 0xff, - 0xd7, 0xb7, 0xd1, 0x78, 0x57, 0x2c, 0xfc, 0x28, 0x77, 0xc5, 0xc9, 0x0f, 0xd5, 0xae, 0xf8, 0x6b, - 0x93, 0x30, 0x57, 0xf1, 0x22, 0xb7, 0xb2, 0xbb, 0xeb, 0x7a, 0x6e, 0x74, 0x48, 0xbe, 0x31, 0x01, - 0xab, 0xdd, 0x80, 0xee, 0xd2, 0x20, 0xa0, 0xcd, 0xf5, 0x5e, 0xe0, 0x7a, 0xad, 0x7a, 0x63, 0x8f, - 0x36, 0x7b, 0x6d, 0xd7, 0x6b, 0x6d, 0xb4, 0x3c, 0x5f, 0x17, 0x5f, 0x7b, 0x40, 0x1b, 0x3d, 0xfe, - 0x49, 0x62, 0x52, 0x74, 0xc6, 0xfb, 0xa4, 0xda, 0x68, 0x4c, 0xab, 0x2f, 0x1d, 0x1f, 0x95, 0x57, - 0x47, 0xac, 0x84, 0xa3, 0x7e, 0x1a, 0xf9, 0xfa, 0x04, 0xac, 0x04, 0xf4, 0x67, 0x7a, 0xee, 0xf0, - 0xad, 0x21, 0x56, 0xad, 0xf6, 0x98, 0xdb, 0xcf, 0x48, 0x3c, 0xab, 0x2f, 0x1e, 0x1f, 0x95, 0x47, - 0xac, 0x83, 0x23, 0x7e, 0x97, 0x5d, 0x83, 0xd9, 0x4a, 0xd7, 0x0d, 0xdd, 0x07, 0xe8, 0xf7, 0x22, - 0x3a, 0xc4, 0x11, 0xb7, 0x0c, 0xc5, 0xa0, 0xd7, 0xa6, 0x62, 0x6e, 0x97, 0xaa, 0x25, 0xb6, 0x0a, - 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x1c, 0x5b, 0x71, 0x39, 0xc9, 0x94, 0x71, 0xe3, 0x1e, 0x14, - 0x03, 0xc6, 0x44, 0x8e, 0xac, 0x71, 0xcf, 0x81, 0xb1, 0xd4, 0x52, 0x08, 0xf6, 0x13, 0x05, 0x0b, - 0xfb, 0x77, 0x26, 0xe0, 0x52, 0xa5, 0xdb, 0xdd, 0xa2, 0xe1, 0x5e, 0x4a, 0x8a, 0x5f, 0xb0, 0x60, - 0xfe, 0xc0, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, 0x26, 0x29, 0x21, 0x4f, 0x7d, 0x5c, 0x79, 0x38, 0xb7, - 0xb7, 0x13, 0xa4, 0xab, 0xe4, 0xf8, 0xa8, 0x3c, 0x9f, 0x2c, 0xc3, 0x14, 0x7b, 0xf2, 0x8f, 0x2c, - 0x58, 0x94, 0x45, 0xb7, 0xfc, 0x26, 0x35, 0xed, 0x98, 0x77, 0xf2, 0x94, 0x49, 0x13, 0x17, 0x06, - 0xaf, 0x74, 0x29, 0xf6, 0x09, 0x61, 0xff, 0x8f, 0x09, 0xb8, 0x3c, 0x80, 0x06, 0xf9, 0x55, 0x0b, - 0x2e, 0x0a, 0xe3, 0xa7, 0x01, 0x42, 0xba, 0x2b, 0x5b, 0xf3, 0x27, 0xf3, 0x96, 0x1c, 0xd9, 0x14, - 0xa7, 0x5e, 0x83, 0x56, 0x97, 0xd8, 0x6a, 0xb8, 0x96, 0xc1, 0x1a, 0x33, 0x05, 0xe2, 0x92, 0x0a, - 0x73, 0x68, 0x4a, 0xd2, 0x89, 0xc7, 0x22, 0x69, 0x3d, 0x83, 0x35, 0x66, 0x0a, 0x64, 0xff, 0x1d, - 0x78, 0xea, 0x04, 0x72, 0x8f, 0x9e, 0x9c, 0xf6, 0x3b, 0x7a, 0xd4, 0x27, 0xc7, 0xdc, 0x10, 0xf3, - 0xda, 0x86, 0x29, 0x3e, 0x75, 0xd4, 0xc4, 0x06, 0xb6, 0xfd, 0xf1, 0x39, 0x15, 0xa2, 0x84, 0xd8, - 0xbf, 0x63, 0xc1, 0xcc, 0x08, 0xd6, 0xb0, 0x72, 0xd2, 0x1a, 0x56, 0xea, 0xb3, 0x84, 0x45, 0xfd, - 0x96, 0xb0, 0x37, 0xc6, 0xeb, 0x8d, 0x61, 0x2c, 0x60, 0x7f, 0x6e, 0xc1, 0xf9, 0x3e, 0x8b, 0x19, - 0xd9, 0x83, 0x8b, 0x5d, 0xbf, 0xa9, 0xd4, 0xa6, 0x1b, 0x4e, 0xb8, 0xc7, 0x61, 0xf2, 0xf3, 0x5e, - 0x66, 0x3d, 0x59, 0xcb, 0x80, 0x3f, 0x3c, 0x2a, 0x2f, 0x69, 0x22, 0x29, 0x04, 0xcc, 0xa4, 0x48, - 0xba, 0x30, 0xb3, 0xeb, 0xd2, 0x76, 0x33, 0x1e, 0x82, 0x63, 0x2a, 0x48, 0xd7, 0x25, 0x35, 0x61, - 0x2c, 0x56, 0xff, 0x50, 0x73, 0xb1, 0xbf, 0x0c, 0xf3, 0xc9, 0xab, 0x83, 0x21, 0x3a, 0xef, 0x0a, - 0x14, 0x9c, 0xc0, 0x93, 0x5d, 0x37, 0x2b, 0x11, 0x0a, 0x15, 0xbc, 0x85, 0xac, 0x9c, 0xbc, 0x00, - 0x33, 0xbb, 0xbd, 0x76, 0x9b, 0x55, 0x90, 0x26, 0x7d, 0xad, 0x0e, 0x5f, 0x97, 0xe5, 0xa8, 0x31, - 0xec, 0xbf, 0x9a, 0x84, 0x85, 0x6a, 0xbb, 0x47, 0xdf, 0x08, 0x28, 0x55, 0x87, 0xf4, 0x0a, 0x2c, - 0x74, 0x03, 0x7a, 0xe0, 0xd2, 0xfb, 0x75, 0xda, 0xa6, 0x8d, 0xc8, 0x0f, 0xa4, 0x34, 0x97, 0x25, - 0xa1, 0x85, 0x5a, 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0x3a, 0xcc, 0x3b, 0x8d, 0xc8, 0x3d, 0xa0, 0x9a, - 0x82, 0x10, 0xf7, 0x23, 0x92, 0xc2, 0x7c, 0x25, 0x01, 0xc5, 0x14, 0x36, 0xf9, 0x02, 0x2c, 0x85, - 0x0d, 0xa7, 0x4d, 0xef, 0x74, 0x25, 0xab, 0xb5, 0x3d, 0xda, 0xd8, 0xaf, 0xf9, 0xae, 0x17, 0x49, - 0x93, 0xcc, 0x33, 0x92, 0xd2, 0x52, 0x7d, 0x00, 0x1e, 0x0e, 0xa4, 0x40, 0xfe, 0xad, 0x05, 0x57, - 0xba, 0x01, 0xad, 0x05, 0x7e, 0xc7, 0x67, 0x7b, 0x6d, 0x9f, 0x9d, 0x42, 0x9e, 0xd7, 0xdf, 0x1e, - 0x53, 0xa9, 0x10, 0x25, 0xfd, 0xe6, 0xed, 0x8f, 0x1e, 0x1f, 0x95, 0xaf, 0xd4, 0x4e, 0x12, 0x00, - 0x4f, 0x96, 0x8f, 0xfc, 0x3b, 0x0b, 0xae, 0x76, 0xfd, 0x30, 0x3a, 0xe1, 0x13, 0x8a, 0x67, 0xfa, - 0x09, 0xf6, 0xf1, 0x51, 0xf9, 0x6a, 0xed, 0x44, 0x09, 0xf0, 0x11, 0x12, 0xda, 0xc7, 0xb3, 0x70, - 0xde, 0x18, 0x7b, 0xf2, 0x10, 0xff, 0x1a, 0x9c, 0x53, 0x83, 0x21, 0x56, 0x02, 0x4a, 0xb1, 0xd1, - 0xa5, 0x62, 0x02, 0x31, 0x89, 0xcb, 0xc6, 0x9d, 0x1e, 0x8a, 0xa2, 0x76, 0x6a, 0xdc, 0xd5, 0x12, - 0x50, 0x4c, 0x61, 0x93, 0x0d, 0xb8, 0x20, 0x4b, 0x90, 0x76, 0xdb, 0x6e, 0xc3, 0x59, 0xf3, 0x7b, - 0x72, 0xc8, 0x15, 0xab, 0x97, 0x8f, 0x8f, 0xca, 0x17, 0x6a, 0xfd, 0x60, 0xcc, 0xaa, 0x43, 0x36, - 0xe1, 0xa2, 0xd3, 0x8b, 0x7c, 0xfd, 0xfd, 0xd7, 0x3c, 0xb6, 0xaf, 0x34, 0xf9, 0xd0, 0x9a, 0x11, - 0x1b, 0x50, 0x25, 0x03, 0x8e, 0x99, 0xb5, 0x48, 0x2d, 0x45, 0xad, 0x4e, 0x1b, 0xbe, 0xd7, 0x14, - 0xbd, 0x5c, 0x8c, 0x8f, 0x22, 0x95, 0x0c, 0x1c, 0xcc, 0xac, 0x49, 0xda, 0x30, 0xdf, 0x71, 0x1e, - 0xdc, 0xf1, 0x9c, 0x03, 0xc7, 0x6d, 0x33, 0x26, 0xd2, 0x90, 0x33, 0xd8, 0xba, 0xd0, 0x8b, 0xdc, - 0xf6, 0x8a, 0xb8, 0x8a, 0x5e, 0xd9, 0xf0, 0xa2, 0xb7, 0x82, 0x7a, 0xc4, 0x54, 0x56, 0xa1, 0x4a, - 0x6d, 0x25, 0x68, 0x61, 0x8a, 0x36, 0x79, 0x0b, 0x2e, 0xf1, 0xe9, 0xb8, 0xee, 0xdf, 0xf7, 0xd6, - 0x69, 0xdb, 0x39, 0x54, 0x1f, 0x30, 0xcd, 0x3f, 0xe0, 0xc9, 0xe3, 0xa3, 0xf2, 0xa5, 0x7a, 0x16, - 0x02, 0x66, 0xd7, 0x23, 0x0e, 0x3c, 0x95, 0x04, 0x20, 0x3d, 0x70, 0x43, 0xd7, 0xf7, 0x84, 0x39, - 0x66, 0x26, 0x36, 0xc7, 0xd4, 0x07, 0xa3, 0xe1, 0x49, 0x34, 0xc8, 0x3f, 0xb1, 0xe0, 0x62, 0xd6, - 0x34, 0x5c, 0x2a, 0xe5, 0x71, 0xd1, 0x96, 0x9a, 0x5a, 0x62, 0x44, 0x64, 0x2e, 0x0a, 0x99, 0x42, - 0x90, 0xf7, 0x2d, 0x98, 0x73, 0x8c, 0xa3, 0xe4, 0x12, 0x70, 0xa9, 0x6e, 0x8e, 0x6b, 0xd0, 0x88, - 0x29, 0x56, 0x17, 0x8f, 0x8f, 0xca, 0x89, 0xe3, 0x2a, 0x26, 0x38, 0x92, 0x7f, 0x66, 0xc1, 0xa5, - 0xcc, 0x39, 0xbe, 0x34, 0x7b, 0x16, 0x2d, 0xc4, 0x07, 0x49, 0xf6, 0x9a, 0x93, 0x2d, 0x06, 0xf9, - 0x96, 0xa5, 0xb7, 0x32, 0x75, 0xf7, 0xb2, 0x34, 0xc7, 0x45, 0xbb, 0x3d, 0xe6, 0xe9, 0x39, 0x56, - 0x1f, 0x14, 0xe1, 0xea, 0x05, 0x63, 0x67, 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x69, 0xa9, 0xad, - 0x51, 0x4b, 0x74, 0xee, 0xac, 0x24, 0x22, 0xf1, 0x4e, 0xab, 0x05, 0x4a, 0x31, 0x27, 0x3f, 0x05, - 0xcb, 0xce, 0x8e, 0x1f, 0x44, 0x99, 0x93, 0x6f, 0x69, 0x9e, 0x4f, 0xa3, 0xab, 0xc7, 0x47, 0xe5, - 0xe5, 0xca, 0x40, 0x2c, 0x3c, 0x81, 0x82, 0xfd, 0x1b, 0x45, 0x98, 0x13, 0x47, 0x02, 0xb9, 0x75, - 0xfd, 0x96, 0x05, 0x4f, 0x37, 0x7a, 0x41, 0x40, 0xbd, 0xa8, 0x1e, 0xd1, 0x6e, 0xff, 0xc6, 0x65, - 0x9d, 0xe9, 0xc6, 0xf5, 0xcc, 0xf1, 0x51, 0xf9, 0xe9, 0xb5, 0x13, 0xf8, 0xe3, 0x89, 0xd2, 0x91, - 0x7f, 0x6f, 0x81, 0x2d, 0x11, 0xaa, 0x4e, 0x63, 0xbf, 0x15, 0xf8, 0x3d, 0xaf, 0xd9, 0xff, 0x11, - 0x13, 0x67, 0xfa, 0x11, 0xcf, 0x1d, 0x1f, 0x95, 0xed, 0xb5, 0x47, 0x4a, 0x81, 0x43, 0x48, 0x4a, - 0xde, 0x80, 0xf3, 0x12, 0xeb, 0xda, 0x83, 0x2e, 0x0d, 0x5c, 0xa6, 0x7c, 0x4b, 0xc5, 0x31, 0x76, - 0xaf, 0x49, 0x23, 0x60, 0x7f, 0x1d, 0x12, 0xc2, 0xf4, 0x7d, 0xea, 0xb6, 0xf6, 0x22, 0xa5, 0x3e, - 0x8d, 0xe9, 0x53, 0x23, 0xcd, 0x03, 0x77, 0x05, 0xcd, 0xea, 0xec, 0xf1, 0x51, 0x79, 0x5a, 0xfe, - 0x41, 0xc5, 0x89, 0xdc, 0x82, 0x79, 0x71, 0x60, 0xab, 0xb9, 0x5e, 0xab, 0xe6, 0x7b, 0xc2, 0x13, - 0xa5, 0x54, 0x7d, 0x4e, 0x6d, 0xf8, 0xf5, 0x04, 0xf4, 0xe1, 0x51, 0x79, 0x4e, 0xfd, 0xde, 0x3e, - 0xec, 0x52, 0x4c, 0xd5, 0xb6, 0x7f, 0x7f, 0x0a, 0x40, 0x0d, 0x57, 0xda, 0x25, 0x3f, 0x01, 0xa5, - 0x90, 0x46, 0x82, 0xab, 0xbc, 0x41, 0x10, 0x17, 0x33, 0xaa, 0x10, 0x63, 0x38, 0xd9, 0x87, 0x62, - 0xd7, 0xe9, 0x85, 0x54, 0x76, 0xfe, 0xcd, 0x5c, 0x3a, 0xbf, 0xc6, 0x28, 0x8a, 0x13, 0x1a, 0xff, - 0x89, 0x82, 0x07, 0xf9, 0xaa, 0x05, 0x40, 0x93, 0x1d, 0x36, 0xb6, 0xa5, 0x44, 0xb2, 0x8c, 0xfb, - 0x94, 0xb5, 0x41, 0x75, 0xfe, 0xf8, 0xa8, 0x0c, 0x46, 0xd7, 0x1b, 0x6c, 0xc9, 0x7d, 0x98, 0x71, - 0xd4, 0x9a, 0x3f, 0x79, 0x16, 0x6b, 0x3e, 0x3f, 0x38, 0xe9, 0x41, 0xab, 0x99, 0x91, 0xaf, 0x5b, - 0x30, 0x1f, 0xd2, 0x48, 0x76, 0x15, 0x5b, 0x79, 0xa4, 0xc2, 0x3b, 0xe6, 0xa0, 0xab, 0x27, 0x68, - 0x8a, 0x15, 0x34, 0x59, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x1b, 0xd4, 0x69, 0xd2, 0x80, 0x9f, 0xcb, - 0xa5, 0x26, 0x35, 0xbe, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x2d, - 0x37, 0x08, 0x7c, 0x29, 0xca, 0x4c, 0x4e, 0xa2, 0x18, 0x34, 0xb5, 0x28, 0x46, 0x19, 0xa6, 0xf8, - 0xda, 0xdf, 0x39, 0x07, 0xf3, 0x6a, 0x22, 0xc5, 0x9a, 0xbd, 0x30, 0x03, 0x0d, 0xd0, 0xec, 0xd7, - 0x4c, 0x20, 0x26, 0x71, 0x59, 0x65, 0x31, 0x55, 0x93, 0x8a, 0xbd, 0xae, 0x5c, 0x37, 0x81, 0x98, - 0xc4, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, 0xcb, 0xe0, 0x31, 0xef, 0x2a, 0xe3, 0xf5, 0x21, - 0xbe, 0xee, 0x61, 0xff, 0x42, 0x14, 0x5c, 0xb8, 0x25, 0x33, 0x4a, 0x18, 0x37, 0xe5, 0xe4, 0xc8, - 0x67, 0x7e, 0x26, 0xed, 0xa6, 0xa2, 0x37, 0x92, 0x65, 0x98, 0x62, 0x9f, 0xa1, 0xec, 0x17, 0xcf, - 0x50, 0xd9, 0xff, 0x1c, 0xcc, 0x74, 0x9c, 0x07, 0xf5, 0x5e, 0xd0, 0x3a, 0xfd, 0xa1, 0x42, 0xba, - 0xd7, 0x09, 0x2a, 0xa8, 0xe9, 0x91, 0xaf, 0x58, 0xc6, 0x92, 0x33, 0xcd, 0x89, 0xdf, 0xcd, 0x77, - 0xc9, 0xd1, 0x7b, 0xe5, 0xc0, 0xc5, 0xa7, 0x4f, 0xf5, 0x9e, 0x79, 0xec, 0xaa, 0x37, 0x53, 0x23, - 0xc5, 0x04, 0xd1, 0x6a, 0x64, 0xe9, 0x4c, 0xd5, 0xc8, 0xb5, 0x04, 0x33, 0x4c, 0x31, 0xe7, 0xf2, - 0x88, 0x39, 0xa7, 0xe5, 0x81, 0x33, 0x95, 0xa7, 0x9e, 0x60, 0x86, 0x29, 0xe6, 0x83, 0xcf, 0x9b, - 0xb3, 0x67, 0x73, 0xde, 0x9c, 0xcb, 0xe1, 0xbc, 0x79, 0xb2, 0x2a, 0x7e, 0x6e, 0x5c, 0x55, 0x9c, - 0xdc, 0x04, 0xd2, 0x3c, 0xf4, 0x9c, 0x8e, 0xdb, 0x90, 0x8b, 0x25, 0xdf, 0x36, 0xe7, 0xb9, 0x3d, - 0x62, 0x59, 0x2e, 0x64, 0x64, 0xbd, 0x0f, 0x03, 0x33, 0x6a, 0x91, 0x08, 0x66, 0xba, 0x4a, 0xe3, - 0x5a, 0xc8, 0x63, 0xf4, 0x2b, 0x0d, 0x4c, 0xf8, 0x0b, 0xb0, 0x89, 0xa7, 0x4a, 0x50, 0x73, 0x22, - 0x9b, 0x70, 0xb1, 0xe3, 0x7a, 0x35, 0xbf, 0x19, 0xd6, 0x68, 0x20, 0xad, 0x2d, 0x75, 0x1a, 0x2d, - 0x2d, 0xf2, 0xb6, 0xe1, 0x27, 0xe8, 0xad, 0x0c, 0x38, 0x66, 0xd6, 0xb2, 0xff, 0xa7, 0x05, 0x8b, - 0x6b, 0x6d, 0xbf, 0xd7, 0xbc, 0xeb, 0x44, 0x8d, 0x3d, 0x71, 0x55, 0x4e, 0x5e, 0x87, 0x19, 0xd7, - 0x8b, 0x68, 0x70, 0xe0, 0xb4, 0xe5, 0xfe, 0x64, 0x2b, 0xf3, 0xe9, 0x86, 0x2c, 0x7f, 0x78, 0x54, - 0x9e, 0x5f, 0xef, 0x05, 0xdc, 0x9d, 0x4e, 0xac, 0x56, 0xa8, 0xeb, 0x90, 0xef, 0x58, 0x70, 0x5e, - 0x5c, 0xb6, 0xaf, 0x3b, 0x91, 0x73, 0xbb, 0x47, 0x03, 0x97, 0xaa, 0xeb, 0xf6, 0x31, 0x17, 0xaa, - 0xb4, 0xac, 0x8a, 0xc1, 0x61, 0xac, 0xa8, 0x6f, 0xa5, 0x39, 0x63, 0xbf, 0x30, 0xf6, 0x2f, 0x16, - 0xe0, 0xc9, 0x81, 0xb4, 0xc8, 0x32, 0x4c, 0xb8, 0x4d, 0xf9, 0xe9, 0x20, 0xe9, 0x4e, 0x6c, 0x34, - 0x71, 0xc2, 0x6d, 0x92, 0x15, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0xcd, 0x6b, 0x49, 0xab, 0x87, - 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x86, 0x22, 0x77, 0xad, 0x94, 0xe7, 0x09, 0xae, 0xc5, 0x72, 0x2f, - 0x46, 0x14, 0xe5, 0xe4, 0xe7, 0x2c, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, 0x5d, 0x12, 0xf3, 0x6d, - 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x86, 0x29, 0xa6, 0xd0, 0xfa, 0xcd, - 0x53, 0x6f, 0x8a, 0xfc, 0x4a, 0xa6, 0xc6, 0x69, 0xa0, 0xa4, 0xc5, 0xda, 0x2a, 0xa0, 0x51, 0x2f, - 0xf0, 0x58, 0xd3, 0xf2, 0x6d, 0x70, 0x46, 0x48, 0x81, 0xba, 0x14, 0x0d, 0x0c, 0xfb, 0xdf, 0x4c, - 0xc0, 0xc5, 0x2c, 0xd1, 0xd9, 0x6e, 0x33, 0x25, 0xa4, 0x95, 0x47, 0xe3, 0xcf, 0xe6, 0xdf, 0x3e, - 0xd2, 0x6f, 0x44, 0x7b, 0x57, 0x48, 0xcf, 0x36, 0xc9, 0x97, 0x7c, 0x56, 0xb7, 0xd0, 0xc4, 0x29, - 0x5b, 0x48, 0x53, 0x4e, 0xb5, 0xd2, 0x33, 0x30, 0x19, 0xb2, 0x9e, 0x2f, 0x24, 0xaf, 0x3b, 0x78, - 0x1f, 0x71, 0x08, 0xc3, 0xe8, 0x79, 0x6e, 0x24, 0xfd, 0xf9, 0x35, 0xc6, 0x1d, 0xcf, 0x8d, 0x90, - 0x43, 0xec, 0x6f, 0x4f, 0xc0, 0xf2, 0xe0, 0x8f, 0x22, 0xdf, 0xb6, 0x00, 0x9a, 0xec, 0xb8, 0x12, - 0x72, 0xa7, 0x5e, 0xe1, 0x67, 0xe3, 0x9c, 0x55, 0x1b, 0xae, 0x2b, 0x4e, 0xb1, 0xd3, 0x95, 0x2e, - 0x0a, 0xd1, 0x10, 0x84, 0xbc, 0xa8, 0x86, 0x3e, 0xbf, 0xaa, 0x11, 0x93, 0x49, 0xd7, 0xd9, 0xd2, - 0x10, 0x34, 0xb0, 0xd8, 0x79, 0xd4, 0x73, 0x3a, 0x34, 0xec, 0x3a, 0x3a, 0x60, 0x83, 0x9f, 0x47, - 0x6f, 0xa9, 0x42, 0x8c, 0xe1, 0x76, 0x1b, 0x9e, 0x1d, 0x42, 0xce, 0x9c, 0x9c, 0xe7, 0xed, 0xbf, - 0xb0, 0xe0, 0xf2, 0x5a, 0xbb, 0x17, 0x46, 0x34, 0xf8, 0xff, 0xc6, 0x87, 0xed, 0x7f, 0x59, 0xf0, - 0xd4, 0x80, 0x6f, 0x7e, 0x0c, 0xae, 0x6c, 0xef, 0x26, 0x5d, 0xd9, 0xee, 0x8c, 0x3b, 0xa4, 0x33, - 0xbf, 0x63, 0x80, 0x47, 0xdb, 0xaf, 0x59, 0x70, 0x8e, 0x2d, 0x5b, 0x4d, 0xbf, 0x95, 0xd3, 0xc6, - 0xf9, 0x2c, 0x14, 0x7f, 0x86, 0x6d, 0x40, 0xe9, 0x41, 0xc6, 0x77, 0x25, 0x14, 0x30, 0x36, 0x67, - 0x9c, 0xae, 0xfb, 0x36, 0x0d, 0xf8, 0x06, 0x54, 0x48, 0xce, 0x99, 0x8a, 0x86, 0xa0, 0x81, 0x65, - 0x7f, 0x06, 0xa4, 0xb3, 0x58, 0x6a, 0xc6, 0x59, 0xc3, 0xcc, 0x38, 0xfb, 0x3f, 0x4e, 0x80, 0x61, - 0xfc, 0x78, 0x0c, 0x23, 0xd9, 0x4b, 0x8c, 0xe4, 0x31, 0x0f, 0xee, 0x86, 0x29, 0x67, 0x50, 0x30, - 0xcf, 0x41, 0x2a, 0x98, 0xe7, 0x56, 0x6e, 0x1c, 0x4f, 0x8e, 0xe5, 0xf9, 0xbe, 0x05, 0x4f, 0xc5, - 0xc8, 0xfd, 0x76, 0xc9, 0x47, 0x2f, 0x4b, 0xaf, 0xc0, 0xac, 0x13, 0x57, 0x93, 0xe3, 0xc6, 0x88, - 0xa4, 0xd0, 0x20, 0x34, 0xf1, 0x62, 0x1f, 0xf4, 0xc2, 0x29, 0x7d, 0xd0, 0x27, 0x4f, 0xf6, 0x41, - 0xb7, 0xff, 0x72, 0x02, 0xae, 0xf4, 0x7f, 0x99, 0x9a, 0x50, 0xc3, 0x5d, 0xf2, 0xbf, 0x0a, 0x73, - 0x91, 0xac, 0x60, 0x6c, 0x0f, 0x3a, 0xfa, 0x72, 0xdb, 0x80, 0x61, 0x02, 0x93, 0xd5, 0x6c, 0x88, - 0xa9, 0x5c, 0x6f, 0xf8, 0x5d, 0x15, 0xc1, 0xa0, 0x6b, 0xae, 0x19, 0x30, 0x4c, 0x60, 0x6a, 0xdf, - 0xd0, 0xc9, 0x33, 0xf7, 0x0d, 0xad, 0xc3, 0x25, 0xe5, 0x0d, 0x77, 0xdd, 0x0f, 0xd6, 0xfc, 0x4e, - 0xb7, 0x4d, 0x65, 0x0c, 0x03, 0x13, 0xf6, 0x8a, 0xac, 0x72, 0x09, 0xb3, 0x90, 0x30, 0xbb, 0xae, - 0xfd, 0xfd, 0x02, 0x5c, 0x88, 0x9b, 0x7d, 0xcd, 0xf7, 0x9a, 0x2e, 0xf7, 0x29, 0x7c, 0x0d, 0x26, - 0xa3, 0xc3, 0xae, 0x6a, 0xec, 0xbf, 0xa1, 0xc4, 0xd9, 0x3e, 0xec, 0xb2, 0xde, 0xbe, 0x9c, 0x51, - 0x85, 0x5b, 0x86, 0x79, 0x25, 0xb2, 0xa9, 0x67, 0x87, 0xe8, 0x81, 0x97, 0x93, 0xa3, 0xf9, 0xe1, - 0x51, 0x39, 0x23, 0xf8, 0x78, 0x45, 0x53, 0x4a, 0x8e, 0x79, 0x72, 0x0f, 0xe6, 0xdb, 0x4e, 0x18, - 0xdd, 0xe9, 0x36, 0x9d, 0x88, 0x6e, 0xbb, 0xd2, 0x43, 0x63, 0xb4, 0xc0, 0x00, 0x7d, 0x95, 0xbd, - 0x99, 0xa0, 0x84, 0x29, 0xca, 0xe4, 0x00, 0x08, 0x2b, 0xd9, 0x0e, 0x1c, 0x2f, 0x14, 0x5f, 0xc5, - 0xf8, 0x8d, 0x1e, 0x88, 0xa0, 0x4f, 0x86, 0x9b, 0x7d, 0xd4, 0x30, 0x83, 0x03, 0x79, 0x0e, 0xa6, - 0x02, 0xea, 0x84, 0xb2, 0x33, 0x4b, 0xf1, 0xfc, 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, 0xa8, 0xa9, - 0x47, 0x4c, 0xa8, 0x3f, 0xb5, 0x60, 0x3e, 0xee, 0xa6, 0xc7, 0xb0, 0xb3, 0x76, 0x92, 0x3b, 0xeb, - 0x8d, 0xbc, 0x96, 0xc4, 0x01, 0x9b, 0xe9, 0x1f, 0x4c, 0x99, 0xdf, 0xc7, 0x1d, 0xc3, 0xbf, 0x04, - 0x25, 0x35, 0xab, 0x95, 0xca, 0x3a, 0xe6, 0x01, 0x3b, 0xa1, 0xcc, 0x18, 0x01, 0x4d, 0x92, 0x09, - 0xc6, 0xfc, 0xd8, 0x56, 0xde, 0x94, 0xdb, 0xb4, 0x1c, 0xf6, 0x7a, 0x2b, 0x57, 0xdb, 0x77, 0xd6, - 0x56, 0xae, 0xea, 0x90, 0x3b, 0x70, 0xb9, 0x1b, 0xf8, 0x3c, 0x36, 0x79, 0x9d, 0x3a, 0xcd, 0xb6, - 0xeb, 0x51, 0x65, 0xc5, 0x10, 0x9e, 0x14, 0x4f, 0x1d, 0x1f, 0x95, 0x2f, 0xd7, 0xb2, 0x51, 0x70, - 0x50, 0xdd, 0x64, 0x60, 0xd6, 0xe4, 0x10, 0x81, 0x59, 0x7f, 0x5f, 0xdb, 0x0a, 0x69, 0x28, 0xc3, - 0xa3, 0x3e, 0x9f, 0x57, 0x57, 0x66, 0x2c, 0xeb, 0xf1, 0x90, 0xaa, 0x48, 0xa6, 0xa8, 0xd9, 0x0f, - 0x36, 0x48, 0x4d, 0x9d, 0xd2, 0x20, 0x15, 0xfb, 0xd7, 0x4f, 0xff, 0x28, 0xfd, 0xeb, 0x67, 0x3e, - 0x54, 0xfe, 0xf5, 0x1f, 0x14, 0x61, 0x31, 0xad, 0x81, 0x9c, 0x7d, 0xd0, 0xd9, 0x3f, 0xb4, 0x60, - 0x51, 0xcd, 0x1e, 0xc1, 0x93, 0xaa, 0xab, 0x86, 0xcd, 0x9c, 0x26, 0xad, 0xd0, 0xa5, 0x74, 0x34, - 0xfb, 0x76, 0x8a, 0x1b, 0xf6, 0xf1, 0x27, 0xef, 0xc0, 0xac, 0xb6, 0xc8, 0x9f, 0x2a, 0x02, 0x6d, - 0x81, 0x6b, 0x51, 0x31, 0x09, 0x34, 0xe9, 0x91, 0x0f, 0x2c, 0x80, 0x86, 0xda, 0xe6, 0xd4, 0xec, - 0xba, 0x9d, 0xd7, 0xec, 0xd2, 0x1b, 0x68, 0xac, 0x2c, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, 0x17, - 0xb9, 0x2d, 0x5e, 0x6b, 0x77, 0x6c, 0x3e, 0x15, 0xc6, 0xf7, 0x1d, 0x3e, 0x41, 0x31, 0x8d, 0x55, - 0x29, 0x03, 0x14, 0x62, 0x42, 0x08, 0xfb, 0x35, 0xd0, 0xde, 0x9e, 0x6c, 0xd9, 0xe2, 0xfe, 0x9e, - 0x35, 0x27, 0xda, 0x93, 0x43, 0x50, 0x2f, 0x5b, 0xd7, 0x15, 0x00, 0x63, 0x1c, 0xfb, 0x8b, 0x30, - 0xff, 0x46, 0xe0, 0x74, 0xf7, 0x5c, 0x6e, 0xf3, 0x66, 0x67, 0xab, 0x8f, 0xc1, 0xb4, 0xd3, 0x6c, - 0x66, 0xe5, 0x82, 0xa8, 0x88, 0x62, 0x54, 0xf0, 0xa1, 0x8e, 0x51, 0xf6, 0xef, 0x5b, 0x40, 0xe2, - 0x7b, 0x43, 0xd7, 0x6b, 0x6d, 0x39, 0x51, 0x63, 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, - 0xe8, 0x86, 0x86, 0xa0, 0x81, 0x45, 0xde, 0x83, 0x59, 0xf1, 0xef, 0x6d, 0x6d, 0x21, 0x18, 0x3b, - 0x82, 0x40, 0x6c, 0x28, 0x5c, 0x26, 0x31, 0x0a, 0x6f, 0xc4, 0x1c, 0xd0, 0x64, 0xc7, 0x9a, 0x6a, - 0xc3, 0xdb, 0x6d, 0xf7, 0x1e, 0x34, 0x77, 0xe2, 0xa6, 0xea, 0x06, 0xfe, 0xae, 0xdb, 0xa6, 0xe9, - 0xa6, 0xaa, 0x89, 0x62, 0x54, 0xf0, 0xe1, 0x9a, 0xea, 0x77, 0x2d, 0xb8, 0xb8, 0x11, 0x46, 0xae, - 0xbf, 0x4e, 0xc3, 0x88, 0x6d, 0x2b, 0x6c, 0xf1, 0xe9, 0xb5, 0x87, 0x71, 0xdc, 0x5e, 0x87, 0x45, - 0x79, 0x87, 0xd9, 0xdb, 0x09, 0x69, 0x64, 0xe8, 0xf1, 0x7a, 0x1e, 0xaf, 0xa5, 0xe0, 0xd8, 0x57, - 0x83, 0x51, 0x91, 0x97, 0x99, 0x31, 0x95, 0x42, 0x92, 0x4a, 0x3d, 0x05, 0xc7, 0xbe, 0x1a, 0xf6, - 0xf7, 0x0a, 0x70, 0x81, 0x7f, 0x46, 0x2a, 0xe8, 0xe2, 0x9b, 0x83, 0x82, 0x2e, 0xc6, 0x9c, 0xca, - 0x9c, 0xd7, 0x29, 0x42, 0x2e, 0xfe, 0x81, 0x05, 0x0b, 0xcd, 0x64, 0x4b, 0xe7, 0x63, 0xd3, 0xc9, - 0xea, 0x43, 0xe1, 0xb2, 0x95, 0x2a, 0xc4, 0x34, 0x7f, 0xf2, 0x4b, 0x16, 0x2c, 0x24, 0xc5, 0x54, - 0xab, 0xfb, 0x19, 0x34, 0x92, 0xf6, 0xb1, 0x4e, 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xc3, 0x09, - 0xd9, 0xa5, 0x67, 0x11, 0x51, 0x40, 0xee, 0x43, 0x29, 0x6a, 0x87, 0xa2, 0x50, 0x7e, 0xed, 0x98, - 0x27, 0xc2, 0xed, 0xcd, 0xba, 0x70, 0x1f, 0x88, 0x95, 0x36, 0x59, 0xc2, 0x94, 0x4f, 0xc5, 0x8b, - 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x8e, 0xa2, 0xdb, 0x6b, 0xb5, 0x34, 0x63, 0x59, 0xc2, 0x18, - 0x2b, 0x5e, 0xf6, 0xaf, 0x5b, 0x50, 0xba, 0xe9, 0xab, 0x75, 0xe4, 0xa7, 0x72, 0x30, 0xf4, 0x68, - 0x7d, 0x50, 0x5f, 0x53, 0xc6, 0x47, 0x8c, 0xd7, 0x13, 0x66, 0x9e, 0xa7, 0x0d, 0xda, 0x2b, 0x3c, - 0xcf, 0x15, 0x23, 0x75, 0xd3, 0xdf, 0x19, 0x68, 0x7a, 0xfc, 0xe5, 0x22, 0x9c, 0x7b, 0xd3, 0x39, - 0xa4, 0x5e, 0xe4, 0x8c, 0xbe, 0x49, 0xbc, 0x02, 0xb3, 0x4e, 0x97, 0xdf, 0x83, 0x19, 0x3a, 0x7e, - 0x6c, 0x39, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x48, 0xbb, 0x93, 0xb5, 0x14, 0xad, 0xa5, - 0xe0, 0xd8, 0x57, 0x83, 0xdc, 0x04, 0x22, 0xa3, 0x51, 0x2b, 0x8d, 0x86, 0xdf, 0xf3, 0xc4, 0x92, - 0x26, 0x8c, 0x2a, 0xfa, 0xb0, 0xb9, 0xd5, 0x87, 0x81, 0x19, 0xb5, 0xc8, 0x17, 0x60, 0xa9, 0xc1, - 0x29, 0xcb, 0xa3, 0x87, 0x49, 0x51, 0x1c, 0x3f, 0x75, 0x9c, 0xc0, 0xda, 0x00, 0x3c, 0x1c, 0x48, - 0x81, 0x49, 0x1a, 0x46, 0x7e, 0xe0, 0xb4, 0xa8, 0x49, 0x77, 0x2a, 0x29, 0x69, 0xbd, 0x0f, 0x03, - 0x33, 0x6a, 0x91, 0x2f, 0x43, 0x29, 0xda, 0x0b, 0x68, 0xb8, 0xe7, 0xb7, 0x9b, 0xd2, 0x6f, 0x61, - 0x4c, 0x4b, 0x9b, 0xec, 0xfd, 0x6d, 0x45, 0xd5, 0x18, 0xde, 0xaa, 0x08, 0x63, 0x9e, 0x24, 0x80, - 0xa9, 0xb0, 0xe1, 0x77, 0x69, 0x28, 0x55, 0xf6, 0x9b, 0xb9, 0x70, 0xe7, 0x96, 0x23, 0xc3, 0xc6, - 0xc7, 0x39, 0xa0, 0xe4, 0x64, 0xff, 0xde, 0x04, 0xcc, 0x99, 0x88, 0x43, 0xac, 0x4d, 0x5f, 0xb5, - 0x60, 0xae, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0x85, 0xfd, 0x2a, 0x1f, 0x8d, 0x82, 0x91, 0x5a, 0xa7, - 0x91, 0xe3, 0xb6, 0x0d, 0x53, 0x98, 0xc1, 0x06, 0x13, 0x4c, 0xc9, 0x37, 0x2c, 0x58, 0x88, 0xdd, - 0xdc, 0x62, 0x43, 0x5a, 0xae, 0x82, 0xe8, 0xa5, 0xfe, 0x5a, 0x92, 0x13, 0xa6, 0x59, 0xdb, 0x3b, - 0xb0, 0x98, 0xee, 0x6d, 0xd6, 0x94, 0x5d, 0x47, 0xce, 0xf5, 0x42, 0xdc, 0x94, 0x35, 0x27, 0x0c, - 0x91, 0x43, 0xc8, 0x0b, 0x30, 0xd3, 0x71, 0x82, 0x96, 0xeb, 0x39, 0x6d, 0xde, 0x8a, 0x05, 0x63, - 0x41, 0x92, 0xe5, 0xa8, 0x31, 0xec, 0x4f, 0xc0, 0xdc, 0x96, 0xe3, 0xb5, 0x68, 0x53, 0xae, 0xc3, - 0x8f, 0x8e, 0x69, 0xfb, 0xe1, 0x24, 0xcc, 0x1a, 0x67, 0xb3, 0xb3, 0x3f, 0x67, 0x25, 0x52, 0x6a, - 0x14, 0x72, 0x4c, 0xa9, 0xf1, 0x39, 0x80, 0x5d, 0xd7, 0x73, 0xc3, 0xbd, 0x53, 0x26, 0xeb, 0xe0, - 0xf7, 0xba, 0xd7, 0x35, 0x05, 0x34, 0xa8, 0xc5, 0x97, 0x67, 0xc5, 0x13, 0x32, 0x4f, 0x7d, 0x60, - 0x19, 0xdb, 0xcd, 0x54, 0x1e, 0xce, 0x02, 0x46, 0xc7, 0xac, 0xa8, 0xed, 0x47, 0xe4, 0x1a, 0x3a, - 0x69, 0x57, 0xda, 0x86, 0x99, 0x80, 0x86, 0xbd, 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0c, 0xdc, - 0x6d, 0x03, 0x65, 0x7d, 0xd4, 0x94, 0x96, 0x5f, 0x83, 0x73, 0x09, 0x11, 0x46, 0xca, 0x3e, 0xe4, - 0x43, 0xa6, 0x01, 0xe0, 0x34, 0x97, 0x39, 0xac, 0x2f, 0xda, 0x46, 0xb6, 0x0e, 0xdd, 0x17, 0xc2, - 0x39, 0x47, 0xc0, 0xec, 0xbf, 0x9c, 0x02, 0x79, 0xff, 0x3d, 0xc4, 0x72, 0x65, 0xde, 0x7a, 0x4d, - 0x9c, 0xe2, 0xd6, 0xeb, 0x26, 0xcc, 0xb9, 0x9e, 0x1b, 0xb9, 0x4e, 0x9b, 0x1b, 0x77, 0xe4, 0x76, - 0xaa, 0xbc, 0x97, 0xe7, 0x36, 0x0c, 0x58, 0x06, 0x9d, 0x44, 0x5d, 0x72, 0x1b, 0x8a, 0x7c, 0xbf, - 0x91, 0x03, 0x78, 0xf4, 0x4b, 0x7a, 0xee, 0x9f, 0x21, 0x42, 0x9a, 0x04, 0x25, 0x7e, 0xf8, 0x10, - 0xe9, 0x4a, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, - 0xd7, 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0xa6, 0x92, 0x54, 0xae, 0xa7, 0xe0, 0xd8, 0x57, 0x83, - 0xec, 0xc2, 0x9c, 0x2c, 0x13, 0x2e, 0x57, 0xd3, 0xa7, 0xfc, 0x4a, 0xee, 0x5a, 0x77, 0xdd, 0xa0, - 0x84, 0x09, 0xba, 0xa4, 0x07, 0xe7, 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, - 0x1c, 0x4f, 0x74, 0x1a, 0x66, 0x97, 0x8e, 0x8f, 0xca, 0xe7, 0x37, 0xd2, 0xe4, 0xb0, 0x9f, 0x03, - 0xf9, 0x8a, 0x05, 0x97, 0x1a, 0xbe, 0x17, 0xf2, 0xf8, 0xff, 0x03, 0x7a, 0x2d, 0x08, 0xfc, 0x40, - 0xf0, 0x2e, 0x9d, 0x92, 0x37, 0xb7, 0x29, 0xae, 0x65, 0x91, 0xc4, 0x6c, 0x4e, 0xe4, 0x5d, 0x98, - 0xe9, 0x06, 0xfe, 0x81, 0xdb, 0xa4, 0x81, 0x74, 0xdf, 0xdb, 0xcc, 0x23, 0x1f, 0x49, 0x4d, 0xd2, - 0x8c, 0x97, 0x1e, 0x55, 0x82, 0x9a, 0x9f, 0xfd, 0xbf, 0x67, 0x61, 0x3e, 0x89, 0x4e, 0x7e, 0x16, - 0xa0, 0x1b, 0xf8, 0x1d, 0x1a, 0xed, 0x51, 0x1d, 0x17, 0x72, 0x6b, 0xdc, 0xb4, 0x17, 0x8a, 0x9e, - 0x72, 0x79, 0x61, 0xcb, 0x45, 0x5c, 0x8a, 0x06, 0x47, 0x12, 0xc0, 0xf4, 0xbe, 0xd8, 0x76, 0xa5, - 0x16, 0xf2, 0x66, 0x2e, 0x3a, 0x93, 0xe4, 0xcc, 0x03, 0x1a, 0x64, 0x11, 0x2a, 0x46, 0x64, 0x07, - 0x0a, 0xf7, 0xe9, 0x4e, 0x3e, 0x31, 0xd7, 0x77, 0xa9, 0x3c, 0xcd, 0x54, 0xa7, 0x8f, 0x8f, 0xca, - 0x85, 0xbb, 0x74, 0x07, 0x19, 0x71, 0xf6, 0x5d, 0x4d, 0x71, 0x77, 0x2f, 0x97, 0x8a, 0x31, 0xbf, - 0x2b, 0xe1, 0x08, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x62, 0x44, 0xde, 0x85, 0xd2, 0x7d, 0xe7, 0x80, - 0xee, 0x06, 0xbe, 0x17, 0x49, 0x3f, 0xab, 0x31, 0x43, 0x05, 0xee, 0x2a, 0x72, 0x92, 0x2f, 0xdf, - 0xde, 0x75, 0x21, 0xc6, 0xec, 0xc8, 0x01, 0xcc, 0x78, 0xf4, 0x3e, 0xd2, 0xb6, 0xdb, 0xc8, 0xc7, - 0x35, 0xff, 0x96, 0xa4, 0x26, 0x39, 0xf3, 0x7d, 0x4f, 0x95, 0xa1, 0xe6, 0xc5, 0xfa, 0xf2, 0x9e, - 0xbf, 0x23, 0x17, 0xaa, 0x31, 0xfb, 0x52, 0x9f, 0x4c, 0x45, 0x5f, 0xde, 0xf4, 0x77, 0x90, 0x11, - 0x67, 0x73, 0xa4, 0xa1, 0x9d, 0x7c, 0xe4, 0x32, 0x75, 0x2b, 0x5f, 0xe7, 0x26, 0x31, 0x47, 0xe2, - 0x52, 0x34, 0x38, 0xb2, 0xb6, 0x6d, 0x49, 0x63, 0xa5, 0x5c, 0xa8, 0xc6, 0x6c, 0xdb, 0xa4, 0xe9, - 0x53, 0xb4, 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, 0xe5, 0x2f, 0x9f, 0xa5, 0x2a, 0x69, - 0x47, 0x14, 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, 0xfd, 0xc3, 0xfb, 0x4e, 0x7b, 0xdf, - 0xf5, 0x5a, 0x32, 0xce, 0x71, 0xdc, 0xb4, 0xb7, 0xfb, 0x87, 0x77, 0x05, 0x3d, 0xb3, 0xbd, 0xe3, - 0x52, 0x34, 0x38, 0x92, 0x7f, 0x6a, 0xc1, 0x54, 0xb7, 0xdd, 0x6b, 0xb9, 0xde, 0xd2, 0x1c, 0xd7, - 0x13, 0x3f, 0x9b, 0xe7, 0x0a, 0xbd, 0x52, 0xe3, 0xa4, 0x85, 0xa2, 0xf8, 0xe3, 0xda, 0x67, 0x8f, - 0x17, 0xfe, 0xfc, 0x9f, 0x95, 0x97, 0xa8, 0xd7, 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xbd, 0x17, 0xfa, - 0xde, 0x0a, 0x3a, 0xf7, 0x95, 0x8e, 0x2e, 0x65, 0x5a, 0xfe, 0x14, 0xcc, 0x1a, 0x24, 0x1e, 0xa5, - 0xe8, 0xcd, 0x99, 0x8a, 0xde, 0xaf, 0x4f, 0xc1, 0x9c, 0x99, 0x51, 0x6f, 0x08, 0xed, 0x4b, 0x9f, - 0x38, 0x26, 0x46, 0x39, 0x71, 0xb0, 0x23, 0xa6, 0x71, 0x7b, 0xa4, 0xcc, 0x5b, 0x1b, 0xb9, 0x29, - 0xdc, 0xf1, 0x11, 0xd3, 0x28, 0x0c, 0x31, 0xc1, 0x74, 0x04, 0x87, 0x12, 0xa6, 0xb6, 0x0a, 0xc5, - 0xae, 0x98, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x8b, 0x00, 0x71, 0x66, 0x39, 0x79, 0xab, 0xa8, 0xf5, - 0x61, 0x23, 0xe3, 0x9d, 0x81, 0x45, 0x9e, 0x83, 0x29, 0xa6, 0xfa, 0xd0, 0xa6, 0x0c, 0xc3, 0xd6, - 0xe7, 0xf8, 0xeb, 0xbc, 0x14, 0x25, 0x94, 0xbc, 0xca, 0xb4, 0xd4, 0x58, 0x61, 0x91, 0xd1, 0xd5, - 0x17, 0x63, 0x2d, 0x35, 0x86, 0x61, 0x02, 0x93, 0x89, 0x4e, 0x99, 0x7e, 0xc1, 0xd7, 0x06, 0x43, - 0x74, 0xae, 0x74, 0xa0, 0x80, 0x71, 0xbb, 0x52, 0x4a, 0x1f, 0xe1, 0x73, 0xba, 0x68, 0xd8, 0x95, - 0x52, 0x70, 0xec, 0xab, 0xc1, 0x3e, 0x46, 0x5e, 0x88, 0xce, 0x0a, 0x67, 0xdb, 0x01, 0x57, 0x99, - 0x5f, 0x33, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, 0x87, 0x3f, 0x6c, 0x8d, 0x77, 0x2c, 0xfa, - 0x22, 0xcc, 0x27, 0x77, 0xa1, 0xdc, 0x6f, 0x3e, 0xbe, 0x3e, 0x09, 0x17, 0x6e, 0xb5, 0x5c, 0x2f, - 0x9d, 0x2d, 0x2a, 0x2b, 0xd9, 0xb6, 0x35, 0x6a, 0xb2, 0xed, 0x38, 0x9e, 0x4b, 0x66, 0x33, 0xcf, - 0x8e, 0xe7, 0x52, 0xa9, 0xce, 0x93, 0xb8, 0xe4, 0x4f, 0x2d, 0x78, 0xda, 0x69, 0x8a, 0x73, 0x81, - 0xd3, 0x96, 0xa5, 0x46, 0x8e, 0x5b, 0x39, 0xa3, 0xc3, 0x31, 0x77, 0xf9, 0xfe, 0x8f, 0x5f, 0xa9, - 0x9c, 0xc0, 0x55, 0xf4, 0xf8, 0x8f, 0xc9, 0x2f, 0x78, 0xfa, 0x24, 0x54, 0x3c, 0x51, 0x7c, 0xf2, - 0xb7, 0x61, 0x21, 0xf1, 0xc1, 0xd2, 0x12, 0x5e, 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0xb8, - 0xcb, 0x6f, 0xc1, 0x47, 0x1f, 0x29, 0xe7, 0x48, 0x83, 0xed, 0xab, 0x16, 0x94, 0x84, 0x5d, 0x1b, - 0xe9, 0x6e, 0xca, 0x09, 0x33, 0x75, 0xf2, 0xae, 0xd4, 0x36, 0x32, 0x9c, 0x30, 0xd9, 0x5a, 0xbe, - 0xef, 0x7a, 0x4d, 0xd9, 0xcb, 0x7a, 0x2d, 0x7f, 0xd3, 0xf5, 0x9a, 0xc8, 0x21, 0x7a, 0xb5, 0x2f, - 0x0c, 0xb4, 0x37, 0xfd, 0x8a, 0x05, 0xf3, 0x3c, 0x06, 0x36, 0x3e, 0x13, 0xbe, 0xa2, 0x9d, 0x8d, - 0x84, 0x18, 0x57, 0x92, 0xce, 0x46, 0x0f, 0x8f, 0xca, 0xb3, 0x22, 0x6a, 0x36, 0xe9, 0x7b, 0xf4, - 0x79, 0x69, 0x48, 0xe2, 0x2e, 0x51, 0x13, 0x23, 0xdb, 0x39, 0xb4, 0xa1, 0xb5, 0xae, 0x88, 0x60, - 0x4c, 0xcf, 0x7e, 0x0f, 0xe6, 0xcc, 0x60, 0x16, 0xf2, 0x0a, 0xcc, 0x76, 0x5d, 0xaf, 0x95, 0x0c, - 0x7a, 0xd4, 0xc6, 0xf6, 0x5a, 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, 0x29, 0x1b, 0x7d, - 0xcd, 0x37, 0xab, 0xc5, 0x7f, 0x78, 0x8e, 0xed, 0x8c, 0xa0, 0xa9, 0xdc, 0x73, 0x6c, 0x67, 0xf0, - 0xf8, 0xd1, 0xe5, 0xd8, 0xce, 0x12, 0xe6, 0xff, 0xae, 0x1c, 0xdb, 0x3f, 0x09, 0xa3, 0x26, 0x57, - 0x64, 0xfb, 0xdd, 0x7d, 0x33, 0x30, 0x5d, 0xb7, 0xb8, 0x8c, 0x4c, 0x97, 0x50, 0xfb, 0x7d, 0x36, - 0x6d, 0xf4, 0xa1, 0xb6, 0xd2, 0x8b, 0xf6, 0x88, 0x07, 0xc5, 0xd0, 0x6d, 0x1d, 0xbc, 0x9c, 0x93, - 0x4d, 0x9b, 0x91, 0x92, 0x2f, 0x36, 0xc4, 0x01, 0xb1, 0xac, 0x10, 0x05, 0x1b, 0xfb, 0x2f, 0x2c, - 0x58, 0x4c, 0x9f, 0xbc, 0xf3, 0x76, 0x6a, 0x20, 0xdf, 0xb0, 0x60, 0xde, 0xe9, 0x45, 0x7b, 0xd4, - 0x8b, 0xd4, 0xc5, 0x56, 0x2e, 0x6f, 0x7b, 0x24, 0xdb, 0xce, 0x48, 0x61, 0x95, 0xe0, 0x85, 0x29, - 0xde, 0xf6, 0x27, 0x60, 0xc4, 0x0c, 0x91, 0xf6, 0x35, 0x20, 0xe8, 0xb7, 0xdb, 0x3b, 0x4e, 0x63, - 0xff, 0xae, 0xeb, 0x35, 0xfd, 0xfb, 0x7c, 0xf9, 0x58, 0x85, 0x52, 0x20, 0xc3, 0x04, 0x43, 0xd9, - 0xd3, 0x7a, 0xfd, 0x51, 0xf1, 0x83, 0x21, 0xc6, 0x38, 0xf6, 0x1f, 0x4e, 0xc0, 0xb4, 0x8c, 0x69, - 0x7d, 0x0c, 0xee, 0xea, 0xfb, 0x89, 0x7b, 0xcc, 0x8d, 0x5c, 0x42, 0x71, 0x07, 0xfa, 0xaa, 0x87, - 0x29, 0x5f, 0xf5, 0x37, 0xf3, 0x61, 0x77, 0xb2, 0xa3, 0xfa, 0x1f, 0x14, 0x61, 0x21, 0x15, 0x23, - 0xcc, 0x74, 0xc8, 0x3e, 0xff, 0xcc, 0x3b, 0xb9, 0x86, 0x21, 0xeb, 0xf8, 0x8b, 0x93, 0x5d, 0x35, - 0xc3, 0x44, 0x3e, 0xdf, 0xdb, 0xb9, 0x3d, 0x55, 0xf0, 0xd7, 0xa9, 0x7d, 0x47, 0x74, 0x3d, 0x24, - 0xdf, 0xb1, 0xe0, 0x82, 0xd3, 0xff, 0xd6, 0x83, 0xb4, 0x75, 0xdd, 0xce, 0xfd, 0x11, 0x89, 0xea, - 0x53, 0x52, 0xc8, 0xac, 0x27, 0x35, 0x30, 0x4b, 0x14, 0xfb, 0xbf, 0x58, 0xf0, 0xe4, 0xc0, 0x68, - 0x77, 0x9e, 0x2c, 0x29, 0x48, 0x42, 0xe5, 0x9a, 0x91, 0x73, 0x4e, 0x0f, 0x7d, 0xef, 0x99, 0xce, - 0x6f, 0x93, 0x66, 0x4f, 0x5e, 0x86, 0x39, 0xae, 0x57, 0xb1, 0xd5, 0x33, 0xa2, 0x5d, 0x79, 0x6d, - 0xc3, 0x0d, 0xf8, 0x75, 0xa3, 0x1c, 0x13, 0x58, 0xf6, 0x77, 0x2c, 0x58, 0x1a, 0x94, 0x3a, 0x67, - 0x08, 0xa3, 0xc2, 0xdf, 0x4a, 0xb9, 0xfc, 0x97, 0xfb, 0x5c, 0xfe, 0x53, 0x66, 0x05, 0xe5, 0xdd, - 0x6f, 0x9c, 0xe8, 0x0b, 0x8f, 0xf0, 0x68, 0xff, 0xa6, 0x05, 0x97, 0x07, 0x4c, 0xf8, 0xbe, 0xd0, - 0x0f, 0xeb, 0xd4, 0xa1, 0x1f, 0x13, 0xc3, 0x86, 0x7e, 0xd8, 0x7f, 0x54, 0x80, 0x45, 0x29, 0x4f, - 0xac, 0x5c, 0xbf, 0x9a, 0x08, 0x9c, 0xf8, 0xb1, 0x54, 0xe0, 0xc4, 0xc5, 0x34, 0xfe, 0x5f, 0x47, - 0x4d, 0x7c, 0xb8, 0xa2, 0x26, 0xfe, 0x6a, 0x02, 0x2e, 0x65, 0x66, 0xf4, 0x21, 0x5f, 0xcf, 0xd8, - 0xbd, 0xee, 0xe6, 0x9c, 0x3a, 0x68, 0xc8, 0xfd, 0x6b, 0xdc, 0x50, 0x83, 0x5f, 0x32, 0x5d, 0xfc, - 0xc5, 0x6e, 0xb4, 0x7b, 0x06, 0x49, 0x90, 0x46, 0xf4, 0xf6, 0xb7, 0x7f, 0xbe, 0x00, 0xcf, 0x0f, - 0x4b, 0xe8, 0x43, 0x1a, 0x0d, 0x16, 0x26, 0xa2, 0xc1, 0x1e, 0x93, 0x66, 0x71, 0x26, 0x81, 0x61, - 0xff, 0x7c, 0x52, 0x6f, 0x7b, 0xfd, 0xe3, 0x73, 0xa8, 0x3b, 0xfe, 0x69, 0xa6, 0x7d, 0xaa, 0xac, - 0xc0, 0xf1, 0x52, 0x38, 0x5d, 0x17, 0xc5, 0x0f, 0x8f, 0xca, 0xe7, 0xe3, 0xbc, 0x12, 0xb2, 0x10, - 0x55, 0x25, 0xf2, 0x3c, 0xcc, 0x04, 0x02, 0xaa, 0xe2, 0x5f, 0xa4, 0xa3, 0x84, 0x28, 0x43, 0x0d, - 0x25, 0x5f, 0x36, 0xd4, 0xf5, 0xc9, 0xb3, 0x4a, 0x9f, 0x72, 0x92, 0xff, 0xc7, 0x3b, 0x30, 0x13, - 0xaa, 0x8c, 0xbd, 0x42, 0x71, 0x79, 0x69, 0xc8, 0xb0, 0x2a, 0x76, 0x6e, 0x56, 0xe9, 0x7b, 0xc5, - 0xf7, 0xe9, 0xe4, 0xbe, 0x9a, 0x24, 0xb1, 0xf5, 0x91, 0x55, 0xd8, 0xa7, 0xa1, 0xff, 0xb8, 0x4a, - 0x22, 0x98, 0x96, 0x8f, 0x14, 0xca, 0x8b, 0xb3, 0xad, 0x9c, 0x42, 0x28, 0xa4, 0x83, 0x2d, 0xbf, - 0x9e, 0x54, 0xa6, 0x13, 0xc5, 0xca, 0xfe, 0xbe, 0x05, 0xb3, 0x72, 0x8c, 0x3c, 0x86, 0xf8, 0xb2, - 0x7b, 0xc9, 0xf8, 0xb2, 0x6b, 0xb9, 0xac, 0x58, 0x03, 0x82, 0xcb, 0xee, 0xc1, 0x9c, 0x99, 0x4a, - 0x8e, 0x7c, 0xce, 0x58, 0x71, 0xad, 0x71, 0x92, 0x33, 0xa9, 0x35, 0x39, 0x5e, 0x8d, 0xed, 0xdf, - 0x28, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x27, 0x8e, 0x7c, 0x73, 0xe0, 0x4d, 0xe4, - 0x3f, 0xf0, 0x6e, 0xc3, 0x8c, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xac, 0xe9, 0x71, 0xcb, 0x34, 0x10, - 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0xaa, 0xfb, 0x50, 0x2f, 0xd7, 0x9a, 0x0c, 0x79, 0x17, 0x66, - 0xef, 0xfb, 0xc1, 0x7e, 0xdb, 0x77, 0x78, 0xbe, 0x70, 0xc8, 0xe3, 0x92, 0x57, 0xdb, 0x58, 0x45, - 0xd8, 0xc3, 0xdd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0x16, 0x3a, 0xae, 0x87, 0xd4, 0x69, 0xea, - 0x30, 0xb2, 0x49, 0x91, 0xa2, 0x58, 0xa9, 0xd6, 0x5b, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0xb5, 0x24, - 0x48, 0x58, 0x1b, 0x64, 0x1e, 0xd2, 0xda, 0xf8, 0x83, 0x31, 0x69, 0xc1, 0x10, 0x7e, 0xff, 0xc9, - 0x72, 0x4c, 0xf1, 0x26, 0x5f, 0x82, 0x99, 0x50, 0xe6, 0x89, 0xcb, 0xc7, 0x3b, 0x40, 0x9f, 0xed, - 0x05, 0xd1, 0xb8, 0x2b, 0x55, 0x09, 0x6a, 0x86, 0x64, 0x13, 0x2e, 0x2a, 0xf3, 0x49, 0xe2, 0x4d, - 0xa7, 0xa9, 0x38, 0xad, 0x10, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0x53, 0xe5, 0x78, 0x8a, 0x46, 0x71, - 0xa9, 0x66, 0xdc, 0x43, 0xf1, 0xf9, 0xd7, 0x44, 0x09, 0x3d, 0x29, 0x4a, 0x72, 0x66, 0x8c, 0x28, - 0xc9, 0x3a, 0x5c, 0x4a, 0x83, 0x78, 0xbe, 0x28, 0x9e, 0xa2, 0xca, 0xd8, 0x42, 0x6b, 0x59, 0x48, - 0x98, 0x5d, 0x97, 0xdc, 0x85, 0x52, 0x40, 0xf9, 0x21, 0xab, 0xa2, 0xfc, 0x91, 0x46, 0xf6, 0xbc, - 0x44, 0x45, 0x00, 0x63, 0x5a, 0xac, 0xdf, 0x9d, 0x64, 0xd2, 0xe0, 0xdb, 0x39, 0x3e, 0x26, 0x2a, - 0xfb, 0x7e, 0x40, 0x1e, 0x37, 0xfb, 0x07, 0xf3, 0x70, 0x2e, 0x61, 0x03, 0x22, 0xcf, 0x42, 0x91, - 0x27, 0xd0, 0xe2, 0xab, 0xd5, 0x4c, 0xbc, 0xa2, 0x8a, 0xc6, 0x11, 0x30, 0xf2, 0x0b, 0x16, 0x2c, - 0x74, 0x13, 0xf7, 0x10, 0x6a, 0x21, 0x1f, 0xd7, 0xd2, 0x98, 0x20, 0x6a, 0xa4, 0xdb, 0x4f, 0x32, - 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0xf7, 0xe5, 0x36, 0x0d, 0x38, 0xb6, 0x54, 0xf4, 0x34, 0x89, - 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, 0x8d, 0xf3, 0x5c, 0x5d, 0x45, 0x11, 0xc0, - 0x98, 0x16, 0x79, 0x1d, 0xe6, 0x65, 0xae, 0xd8, 0x9a, 0xdf, 0xbc, 0xe1, 0x84, 0x7b, 0xf2, 0x84, - 0xa3, 0x4f, 0x64, 0x6b, 0x09, 0x28, 0xa6, 0xb0, 0xf9, 0xb7, 0xc5, 0x09, 0x79, 0x39, 0x81, 0xa9, - 0xe4, 0x6b, 0x04, 0x6b, 0x49, 0x30, 0xa6, 0xf1, 0xc9, 0x0b, 0xc6, 0x36, 0x24, 0x2e, 0xba, 0xf5, - 0x6a, 0x90, 0xb1, 0x15, 0x55, 0x60, 0xa1, 0xc7, 0x0f, 0x84, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, - 0xbc, 0x93, 0x04, 0x63, 0x1a, 0x9f, 0xbc, 0x06, 0xe7, 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xe2, 0xf6, - 0x5b, 0x5f, 0x6e, 0xa2, 0x09, 0xc4, 0x24, 0x2e, 0x79, 0x03, 0xce, 0xc7, 0xa9, 0x15, 0x15, 0x01, - 0x71, 0x1d, 0xae, 0xf3, 0x7c, 0x55, 0xd2, 0x08, 0xd8, 0x5f, 0x87, 0xfc, 0x5d, 0x58, 0x34, 0x5a, - 0x62, 0xc3, 0x6b, 0xd2, 0x07, 0x32, 0xfd, 0x1d, 0x7f, 0x66, 0x66, 0x2d, 0x05, 0xc3, 0x3e, 0x6c, - 0xf2, 0x69, 0x98, 0x6f, 0xf8, 0xed, 0x36, 0x5f, 0xe3, 0x44, 0x26, 0x7c, 0x91, 0xe7, 0x4e, 0x64, - 0x04, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x02, 0xf1, 0x77, 0x98, 0x7a, 0x45, 0x9b, 0x6f, 0x88, - 0x77, 0xcb, 0x99, 0xc6, 0x71, 0x2e, 0x19, 0x3c, 0xf1, 0x56, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x69, - 0xc2, 0x8c, 0x60, 0xd3, 0xf9, 0x3c, 0x9e, 0x6e, 0x4b, 0x9b, 0x2f, 0x1e, 0x19, 0x69, 0x1a, 0xc0, - 0x94, 0x88, 0x65, 0xc9, 0x27, 0xe1, 0x9d, 0x99, 0x14, 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, - 0xe4, 0x67, 0xa1, 0xb4, 0xa3, 0x5e, 0x48, 0xe0, 0x59, 0xee, 0xc6, 0xde, 0x17, 0x53, 0x8f, 0x7d, - 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x0e, 0x66, 0x6f, 0xd4, 0x2a, 0x7a, 0x14, 0x9e, - 0xe7, 0xbd, 0x3f, 0xc9, 0xaa, 0xa0, 0x09, 0x60, 0x33, 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0xe8, 0x48, - 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0x95, 0x35, 0xd6, 0x97, 0x2e, 0xa4, 0xb0, 0x65, 0x39, 0x6a, 0x0c, - 0xf2, 0x0e, 0xcc, 0xca, 0xfd, 0x82, 0xaf, 0x4d, 0x17, 0x4f, 0x17, 0xc8, 0x8c, 0x31, 0x09, 0x34, - 0xe9, 0xf1, 0x7b, 0x56, 0x9e, 0x38, 0x9e, 0x5e, 0xef, 0xb5, 0xdb, 0x4b, 0x97, 0xf8, 0xba, 0x19, - 0xdf, 0xb3, 0xc6, 0x20, 0x34, 0xf1, 0xc8, 0x4b, 0xca, 0xf5, 0xe8, 0x23, 0x89, 0x8b, 0x67, 0xed, - 0x7a, 0xa4, 0x95, 0xee, 0x01, 0xb1, 0x0e, 0x97, 0x1f, 0xe1, 0xf3, 0xb3, 0x03, 0xcb, 0x4a, 0xe3, - 0xeb, 0x9f, 0x24, 0x4b, 0x4b, 0x09, 0x53, 0xc9, 0xf2, 0xdd, 0x81, 0x98, 0x78, 0x02, 0x15, 0xb2, - 0x03, 0x05, 0xa7, 0xbd, 0xb3, 0xf4, 0x64, 0x1e, 0xaa, 0x6b, 0x65, 0xb3, 0x2a, 0x47, 0x14, 0xf7, - 0x4f, 0xac, 0x6c, 0x56, 0x91, 0x11, 0xb7, 0xbf, 0x32, 0xa1, 0x6f, 0x4f, 0x74, 0x22, 0xe0, 0xf7, - 0xcc, 0x51, 0x6d, 0xe5, 0xf1, 0xce, 0x76, 0xdf, 0x33, 0x22, 0x62, 0x43, 0xca, 0x1c, 0xd3, 0x5d, - 0x3d, 0x8f, 0x73, 0x49, 0xb1, 0x94, 0x4c, 0x72, 0x2c, 0x8e, 0xb4, 0xc9, 0x59, 0x6c, 0xff, 0x36, - 0x68, 0x4b, 0x5c, 0xca, 0x97, 0x26, 0x80, 0xa2, 0x1b, 0x46, 0xae, 0x9f, 0x63, 0xd0, 0x6d, 0x2a, - 0x3b, 0x30, 0xf7, 0xe9, 0xe7, 0x00, 0x14, 0xac, 0x18, 0x4f, 0xaf, 0xe5, 0x7a, 0x0f, 0xe4, 0xe7, - 0xdf, 0xce, 0xdd, 0x49, 0x46, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, 0x3d, 0x31, 0xd2, 0xf2, 0x79, - 0x53, 0x7d, 0xb3, 0x9a, 0xe2, 0x97, 0x18, 0x71, 0x8c, 0x57, 0xd8, 0x71, 0xa5, 0x0e, 0x33, 0x26, - 0xaf, 0xfa, 0xd6, 0x46, 0x16, 0xaf, 0xfa, 0xd6, 0x06, 0x32, 0x26, 0xe4, 0x6b, 0x16, 0x80, 0xd3, - 0xd9, 0x71, 0xc2, 0xd0, 0x69, 0x6a, 0x93, 0xc9, 0x98, 0x59, 0xff, 0x2b, 0x9a, 0x5e, 0x8a, 0x35, - 0x77, 0x0b, 0x8d, 0xa1, 0x68, 0x70, 0x26, 0xef, 0xc2, 0xb4, 0x23, 0xde, 0x17, 0x93, 0x1e, 0xce, - 0xf9, 0x3c, 0x9a, 0x97, 0x92, 0x80, 0xdb, 0x4e, 0x24, 0x08, 0x15, 0x43, 0xc6, 0x3b, 0x0a, 0x1c, - 0xba, 0xeb, 0xee, 0x4b, 0x8b, 0x4d, 0x7d, 0xec, 0xc4, 0xff, 0x8c, 0x58, 0x16, 0x6f, 0x09, 0x42, - 0xc5, 0x50, 0xbc, 0xf7, 0xec, 0x78, 0x8e, 0x8e, 0x5b, 0xcb, 0x27, 0xba, 0xd1, 0x8c, 0x84, 0x33, - 0xde, 0x7b, 0x36, 0x19, 0x61, 0x92, 0x2f, 0x39, 0x80, 0x29, 0x87, 0xbf, 0x7c, 0x28, 0xcf, 0x47, - 0x98, 0xc7, 0x2b, 0x8a, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, 0x5f, 0x51, 0x72, 0x23, 0xbf, 0x6a, - 0xc1, 0xb4, 0x70, 0xbe, 0x65, 0x5a, 0x22, 0xfb, 0xf6, 0x2f, 0x9e, 0x41, 0x96, 0x71, 0xe9, 0x18, - 0x2c, 0x5d, 0x69, 0x7e, 0x42, 0x7b, 0x16, 0x8a, 0xd2, 0x13, 0x5d, 0x83, 0x95, 0x74, 0xcb, 0x9f, - 0x86, 0x39, 0x93, 0xca, 0x48, 0xce, 0xc1, 0x7f, 0x5e, 0x00, 0xe0, 0x0d, 0x2d, 0x32, 0x55, 0x74, - 0x78, 0x4a, 0xd4, 0x3d, 0xbf, 0x99, 0xcf, 0x93, 0x95, 0x66, 0xc2, 0x09, 0x90, 0xf9, 0x4f, 0xf7, - 0xfc, 0x26, 0x4a, 0x26, 0xa4, 0x05, 0x93, 0x5d, 0x27, 0xda, 0xcb, 0x3f, 0xbb, 0xc5, 0x8c, 0x08, - 0xd9, 0x8c, 0xf6, 0x90, 0x33, 0x20, 0xef, 0x5b, 0x30, 0x2d, 0xf2, 0x5b, 0xa8, 0xdb, 0x8c, 0xb1, - 0xbd, 0x0a, 0x54, 0x9b, 0xad, 0x88, 0x24, 0x1a, 0xb2, 0x07, 0xb5, 0xe2, 0x21, 0x4b, 0x51, 0xb1, - 0x5d, 0xfe, 0xc0, 0x82, 0x39, 0x13, 0x35, 0xa3, 0x9b, 0x7e, 0xda, 0xec, 0xa6, 0x3c, 0xdb, 0xc3, - 0xec, 0xf1, 0xff, 0x6e, 0x81, 0xf1, 0x06, 0x79, 0xec, 0x03, 0x6d, 0x0d, 0xed, 0x03, 0x3d, 0x31, - 0xa2, 0x0f, 0x74, 0x61, 0x24, 0x1f, 0xe8, 0xc9, 0xd1, 0x7d, 0xa0, 0x8b, 0x83, 0x7d, 0xa0, 0xed, - 0x6f, 0x59, 0x70, 0xbe, 0x6f, 0xb7, 0x61, 0xca, 0x69, 0xe0, 0xfb, 0xd1, 0x00, 0xdf, 0x41, 0x8c, - 0x41, 0x68, 0xe2, 0x91, 0x75, 0x58, 0x94, 0x0f, 0x00, 0xd4, 0xbb, 0x6d, 0x37, 0x33, 0xf3, 0xc8, - 0x76, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb6, 0x60, 0xd6, 0x88, 0x57, 0x66, 0xdf, 0xc1, 0xe3, - 0xba, 0xa5, 0x18, 0xb1, 0xab, 0x17, 0xbf, 0x3d, 0x12, 0x30, 0x71, 0x91, 0xd9, 0x32, 0xd2, 0x43, - 0xc7, 0x17, 0x99, 0xac, 0x14, 0x25, 0x54, 0x24, 0xfe, 0xa5, 0x5d, 0xde, 0xe8, 0x05, 0x33, 0xf1, - 0x2f, 0xed, 0x22, 0x87, 0x70, 0x76, 0x4c, 0x4b, 0x97, 0xee, 0xf1, 0xc6, 0x53, 0x0b, 0x4e, 0x10, - 0xa1, 0x80, 0x91, 0x2b, 0x50, 0xa0, 0x5e, 0x53, 0x9a, 0x14, 0xf4, 0x63, 0x88, 0xd7, 0xbc, 0x26, - 0xb2, 0x72, 0xfb, 0x2d, 0x98, 0xab, 0xd3, 0x46, 0x40, 0xa3, 0x37, 0xe9, 0xe1, 0xd0, 0xaf, 0x2b, - 0xb2, 0xd1, 0x9e, 0x7a, 0x5d, 0x91, 0x55, 0x67, 0xe5, 0xf6, 0xbf, 0xb4, 0x20, 0xf5, 0x1e, 0x88, - 0x71, 0xa9, 0x61, 0x0d, 0xbc, 0xd4, 0x30, 0x0d, 0xe1, 0x13, 0x27, 0x1a, 0xc2, 0x6f, 0x02, 0xe9, - 0xb0, 0xa9, 0x90, 0x78, 0xfd, 0x46, 0x5a, 0x73, 0xe2, 0xec, 0x08, 0x7d, 0x18, 0x98, 0x51, 0xcb, - 0xfe, 0x17, 0x42, 0x58, 0xf3, 0x85, 0x90, 0x47, 0x37, 0x40, 0x0f, 0x8a, 0x9c, 0x94, 0x34, 0x69, - 0x8d, 0x69, 0x0e, 0xee, 0xcf, 0x32, 0x14, 0x77, 0xa4, 0x9c, 0xf2, 0x9c, 0x9b, 0xfd, 0x47, 0x42, - 0x56, 0xe3, 0x09, 0x91, 0x21, 0x64, 0xed, 0x24, 0x65, 0xbd, 0x91, 0xd7, 0x5a, 0x99, 0x2d, 0x23, - 0x59, 0x01, 0xe8, 0xd2, 0xa0, 0x41, 0xbd, 0x48, 0x45, 0x6d, 0x14, 0x65, 0xfc, 0xa0, 0x2e, 0x45, - 0x03, 0xc3, 0xfe, 0x26, 0x9b, 0x40, 0xb1, 0x73, 0x24, 0x79, 0x3e, 0xed, 0xf1, 0x98, 0x9e, 0x1c, - 0xda, 0xe1, 0xd1, 0xf0, 0xe5, 0x9f, 0x78, 0x84, 0x2f, 0xff, 0xc7, 0x60, 0x3a, 0xf0, 0xdb, 0xb4, - 0x12, 0x78, 0x69, 0xaf, 0x13, 0x64, 0xc5, 0x78, 0x0b, 0x15, 0xdc, 0xfe, 0x65, 0x0b, 0x16, 0xd3, - 0xc1, 0x46, 0xb9, 0xbb, 0x61, 0x9a, 0x11, 0xd1, 0x85, 0xd1, 0x23, 0xa2, 0xed, 0xf7, 0x99, 0x90, - 0x91, 0xdb, 0xd8, 0x77, 0x3d, 0x11, 0x44, 0xcc, 0x5a, 0xee, 0x63, 0x30, 0x4d, 0xe5, 0xfb, 0x89, - 0xc2, 0x32, 0xab, 0x85, 0x54, 0xcf, 0x26, 0x2a, 0x38, 0xa9, 0xc0, 0x82, 0xba, 0x8f, 0x52, 0xe6, - 0x74, 0x91, 0xfc, 0x40, 0x9b, 0xef, 0xd6, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x5f, 0x86, 0x59, 0x63, - 0x53, 0xe2, 0xeb, 0xf7, 0x03, 0xa7, 0x11, 0xa5, 0xd7, 0xbd, 0x6b, 0xac, 0x10, 0x05, 0x8c, 0x5b, - 0xfd, 0x45, 0x2c, 0x44, 0x6a, 0xdd, 0x93, 0x11, 0x10, 0x12, 0xca, 0x88, 0x05, 0xb4, 0x45, 0x1f, - 0xa8, 0xec, 0xdd, 0x8a, 0x18, 0xb2, 0x42, 0x14, 0x30, 0xfb, 0x05, 0x98, 0x51, 0x29, 0x6a, 0x78, - 0x9e, 0x07, 0x65, 0x91, 0x36, 0xf3, 0x3c, 0xf8, 0x41, 0x84, 0x1c, 0x62, 0xbf, 0x0d, 0x33, 0x2a, - 0x93, 0xce, 0xa3, 0xb1, 0xd9, 0x52, 0x14, 0x7a, 0xee, 0x0d, 0x3f, 0x8c, 0x54, 0xfa, 0x1f, 0x71, - 0x69, 0x76, 0x6b, 0x83, 0x97, 0xa1, 0x86, 0xda, 0x2f, 0xc1, 0x42, 0xea, 0xf2, 0x74, 0x88, 0xa4, - 0x10, 0xbf, 0x57, 0x80, 0x39, 0xf3, 0x0e, 0x6d, 0x88, 0x59, 0x3c, 0xfc, 0xe2, 0x98, 0x71, 0xef, - 0x55, 0x18, 0xf1, 0xde, 0xcb, 0xbc, 0x68, 0x9c, 0x3c, 0xdb, 0x8b, 0xc6, 0x62, 0x3e, 0x17, 0x8d, - 0xc6, 0x85, 0xf8, 0xd4, 0xe3, 0xbb, 0x10, 0xff, 0xad, 0x22, 0xcc, 0x27, 0xb3, 0x0c, 0x0e, 0xd1, - 0x93, 0x2f, 0xf4, 0xf5, 0xe4, 0x88, 0x86, 0xf6, 0xc2, 0xb8, 0x86, 0xf6, 0xc9, 0x71, 0x0d, 0xed, - 0xc5, 0x53, 0x18, 0xda, 0xfb, 0xcd, 0xe4, 0x53, 0x43, 0x9b, 0xc9, 0x3f, 0xa3, 0x5d, 0xe5, 0xa6, - 0x13, 0xbe, 0x25, 0xb1, 0xab, 0x1c, 0x49, 0x76, 0xc3, 0x9a, 0xdf, 0xcc, 0x74, 0x39, 0x9c, 0x79, - 0x84, 0x41, 0x31, 0xc8, 0xf4, 0x6c, 0x1b, 0xfd, 0x2e, 0xef, 0x23, 0x23, 0x78, 0xb5, 0xbd, 0x02, - 0xb3, 0x72, 0x3c, 0x71, 0x15, 0x14, 0x92, 0xea, 0x6b, 0x3d, 0x06, 0xa1, 0x89, 0xc7, 0x1f, 0xa0, - 0x4e, 0xbe, 0xcf, 0xcd, 0xef, 0x2d, 0xcc, 0x07, 0xa8, 0x53, 0xef, 0x79, 0xa7, 0xf1, 0xed, 0x2f, - 0xc1, 0xa5, 0x4c, 0x33, 0x02, 0xb7, 0xab, 0x72, 0xed, 0x88, 0x36, 0x25, 0x82, 0x21, 0x46, 0x2a, - 0x71, 0xfd, 0xf2, 0xdd, 0x81, 0x98, 0x78, 0x02, 0x15, 0xfb, 0x37, 0x0b, 0x30, 0x9f, 0x7c, 0xbd, - 0x90, 0xdc, 0xd7, 0x46, 0xc7, 0x5c, 0xec, 0x9d, 0x82, 0xac, 0x91, 0xb9, 0x6e, 0xe0, 0x0d, 0xc2, - 0x7d, 0x3e, 0xbe, 0x76, 0x74, 0x1a, 0xbd, 0xb3, 0x63, 0x2c, 0x4d, 0xf7, 0x92, 0x1d, 0x7f, 0xa0, - 0x30, 0x0e, 0x72, 0x93, 0xa7, 0xd9, 0xdc, 0xb9, 0xc7, 0x71, 0x67, 0x9a, 0x15, 0x1a, 0x6c, 0xd9, - 0xde, 0x72, 0x40, 0x03, 0x77, 0xd7, 0xd5, 0x2f, 0x2f, 0xf3, 0x95, 0xfb, 0x6d, 0x59, 0x86, 0x1a, - 0x6a, 0xbf, 0x3f, 0x01, 0xf1, 0xab, 0xf4, 0xfc, 0x89, 0xaf, 0xd0, 0x38, 0x39, 0xc8, 0x6e, 0xbb, - 0x39, 0xee, 0x3b, 0x7a, 0x31, 0x45, 0xe9, 0xc6, 0x6c, 0x94, 0x60, 0x82, 0xe3, 0x8f, 0xe0, 0x35, - 0x7a, 0x07, 0x16, 0x52, 0x49, 0x15, 0x72, 0xcf, 0x3c, 0xfa, 0xc3, 0x02, 0x94, 0x74, 0x5a, 0x0a, - 0xf2, 0xa9, 0x84, 0x19, 0xa7, 0x54, 0xfd, 0xa8, 0xf1, 0xfe, 0xcc, 0x9e, 0xdf, 0x7c, 0x78, 0x54, - 0x5e, 0xd0, 0xc8, 0x29, 0x93, 0xcc, 0x15, 0x28, 0xf4, 0x82, 0x76, 0xfa, 0x9c, 0x76, 0x07, 0x37, - 0x91, 0x95, 0x93, 0x07, 0x69, 0x3b, 0xca, 0x56, 0x4e, 0xa9, 0x34, 0xc4, 0x81, 0x66, 0xb0, 0xfd, - 0x84, 0xed, 0x92, 0x3b, 0x7e, 0xf3, 0x30, 0xfd, 0x5e, 0x4d, 0xd5, 0x6f, 0x1e, 0x22, 0x87, 0x90, - 0xd7, 0x61, 0x3e, 0x72, 0x3b, 0xd4, 0xef, 0x45, 0xe6, 0x2b, 0xde, 0x85, 0xf8, 0x46, 0x7c, 0x3b, - 0x01, 0xc5, 0x14, 0x36, 0xdb, 0x65, 0xef, 0x85, 0xbe, 0xc7, 0xf3, 0xc9, 0x4e, 0x25, 0xaf, 0xcf, - 0x6e, 0xd6, 0xdf, 0xba, 0xc5, 0xcd, 0x49, 0x1a, 0x83, 0x61, 0xbb, 0x3c, 0x52, 0x3a, 0xa0, 0xd2, - 0x21, 0x65, 0x31, 0xd6, 0xc7, 0x45, 0x39, 0x6a, 0x0c, 0xb2, 0x2e, 0x68, 0x33, 0x69, 0xf9, 0x8e, - 0x32, 0x57, 0x7d, 0x5e, 0xd1, 0x65, 0x65, 0x0f, 0x8f, 0x4e, 0x30, 0xf4, 0xe9, 0x9a, 0xf6, 0x1d, - 0x58, 0x48, 0x35, 0x98, 0x3a, 0x57, 0x5b, 0xd9, 0xe7, 0xea, 0xe1, 0x9e, 0x98, 0xf9, 0xd7, 0x16, - 0x9c, 0xef, 0x5b, 0x02, 0x86, 0x8d, 0x83, 0x4b, 0x6f, 0x46, 0x13, 0xa7, 0xdf, 0x8c, 0x0a, 0xa3, - 0x6d, 0x46, 0xd5, 0x9d, 0xef, 0xfe, 0xe0, 0xea, 0x13, 0xdf, 0xfb, 0xc1, 0xd5, 0x27, 0xfe, 0xf8, - 0x07, 0x57, 0x9f, 0x78, 0xff, 0xf8, 0xaa, 0xf5, 0xdd, 0xe3, 0xab, 0xd6, 0xf7, 0x8e, 0xaf, 0x5a, - 0x7f, 0x7c, 0x7c, 0xd5, 0xfa, 0xcf, 0xc7, 0x57, 0xad, 0x6f, 0xfd, 0xf0, 0xea, 0x13, 0x9f, 0xfb, - 0x4c, 0x3c, 0x40, 0x57, 0xd5, 0x00, 0xe5, 0x3f, 0x3e, 0xae, 0x86, 0xe3, 0x6a, 0x77, 0xbf, 0xb5, - 0xca, 0x06, 0xe8, 0xaa, 0x2e, 0x51, 0x03, 0xf4, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x73, - 0x4f, 0x0a, 0xe4, 0x9d, 0x00, 0x00, + 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, + 0x03, 0x31, 0xe2, 0xd8, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, + 0x49, 0x90, 0x40, 0x30, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xf7, 0xd9, 0xaf, 0x7b, 0x7a, 0xb8, + 0x33, 0x3b, 0xcd, 0xd5, 0x25, 0xd1, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, + 0x55, 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, + 0xdf, 0x0d, 0xfc, 0xbb, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, + 0x6f, 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x70, 0xda, 0xdd, 0x3d, 0xe7, 0x13, + 0xab, 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x1d, 0x53, + 0x5b, 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x53, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, + 0x97, 0x28, 0x6a, 0xcb, 0x1f, 0x33, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, + 0xf2, 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x4a, 0xb8, 0xe2, 0xfa, 0x4c, + 0xb6, 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, + 0xa0, 0x59, 0x38, 0x2f, 0xc5, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, + 0x43, 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, + 0xd7, 0x1f, 0x56, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xc5, 0x41, 0xf5, 0x7a, 0x91, + 0xdb, 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0x47, 0x05, 0x28, 0x55, 0x36, 0xab, + 0xf5, 0xc8, 0x89, 0x7a, 0x21, 0xf9, 0xaa, 0x05, 0x73, 0x6d, 0xdf, 0x69, 0x56, 0x9d, 0xb6, 0xe3, + 0x35, 0x68, 0xb0, 0x64, 0x3d, 0x63, 0x5d, 0x99, 0x7d, 0x61, 0x73, 0x65, 0x9c, 0xfe, 0x5a, 0xa9, + 0xdc, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xd5, 0xf3, 0xdf, 0x3d, 0x2a, 0x3f, + 0x71, 0x7c, 0x54, 0x9e, 0xdb, 0x34, 0x38, 0x61, 0x82, 0x2f, 0xf9, 0x96, 0x05, 0x67, 0x1b, 0x8e, + 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0xeb, 0x81, 0xdf, 0xeb, 0x2e, 0x4d, 0x9c, 0x82, + 0x34, 0x4f, 0x4a, 0x69, 0xce, 0xae, 0xa5, 0xd9, 0x61, 0xbf, 0x04, 0x5c, 0xae, 0x30, 0x72, 0x76, + 0xda, 0xd4, 0x94, 0xab, 0x70, 0x9a, 0x72, 0xd5, 0xd3, 0xec, 0xb0, 0x5f, 0x02, 0xf2, 0x11, 0x98, + 0x76, 0xbd, 0x56, 0x40, 0xc3, 0x70, 0x69, 0xf2, 0x19, 0xeb, 0x4a, 0xa9, 0xba, 0x20, 0xab, 0x4f, + 0x6f, 0x88, 0x62, 0x54, 0x70, 0xfb, 0x3b, 0x05, 0x38, 0x5b, 0xd9, 0xac, 0x6e, 0x07, 0xce, 0xee, + 0xae, 0xdb, 0x40, 0xbf, 0x17, 0xb9, 0x5e, 0xcb, 0x24, 0x60, 0x9d, 0x4c, 0x80, 0xbc, 0x0c, 0xb3, + 0x21, 0x0d, 0x0e, 0xdc, 0x06, 0xad, 0xf9, 0x41, 0xc4, 0x3b, 0xa5, 0x58, 0x3d, 0x27, 0xd1, 0x67, + 0xeb, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, 0xe2, 0x6a, + 0x18, 0x83, 0xd0, 0xc4, 0x23, 0xeb, 0xb0, 0xe8, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, 0xb5, + 0x80, 0xee, 0xba, 0xf7, 0xe5, 0x27, 0x2e, 0xc9, 0xba, 0x8b, 0x95, 0x14, 0x1c, 0xfb, 0x6a, 0x90, + 0x6f, 0x5a, 0xb0, 0x18, 0x46, 0x6e, 0x63, 0xdf, 0xf5, 0x68, 0x18, 0xae, 0xf9, 0xde, 0xae, 0xdb, + 0x5a, 0x2a, 0xf2, 0x6e, 0xbb, 0x39, 0x5e, 0xb7, 0xd5, 0x53, 0x54, 0xab, 0xe7, 0x99, 0x48, 0xe9, + 0x52, 0xec, 0xe3, 0x4e, 0x3e, 0x0a, 0x25, 0xd9, 0xa2, 0x34, 0x5c, 0x9a, 0x7a, 0xa6, 0x70, 0xa5, + 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x2e, 0x6d, 0xa8, 0x42, 0x8c, 0xe1, 0xf6, 0x3a, 0x2c, 0x55, 0x3a, + 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x75, 0xdd, 0x15, 0x98, 0xe9, 0x38, 0xdd, 0xae, 0xeb, + 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0x73, 0xc7, 0x47, 0xe5, 0x99, 0x2d, 0x59, 0x86, 0x1a, 0x6a, 0xff, + 0xe9, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, 0x98, 0x61, + 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0xbe, 0x22, 0x16, 0x91, 0x15, 0x73, 0x11, 0x89, + 0x3f, 0x9f, 0x61, 0xaf, 0x1c, 0x7c, 0x62, 0xe5, 0xcd, 0x9d, 0xbb, 0xb4, 0x11, 0x6d, 0xd1, 0xc8, + 0xa9, 0x12, 0xd9, 0x0b, 0x10, 0x97, 0xa1, 0xa6, 0x4a, 0x7c, 0x98, 0x0c, 0xbb, 0xb4, 0x21, 0x67, + 0xee, 0xd6, 0x98, 0x33, 0x24, 0x16, 0xbd, 0xde, 0xa5, 0x8d, 0xea, 0x9c, 0x64, 0x3d, 0xc9, 0xfe, + 0x21, 0x67, 0x44, 0xee, 0xc1, 0x54, 0xc8, 0xd7, 0x32, 0x39, 0x29, 0xdf, 0xcc, 0x8f, 0x25, 0x27, + 0x5b, 0x9d, 0x97, 0x4c, 0xa7, 0xc4, 0x7f, 0x94, 0xec, 0xec, 0xff, 0x64, 0xc1, 0x39, 0x03, 0xbb, + 0x12, 0xb4, 0x7a, 0x1d, 0xea, 0x45, 0xe4, 0x19, 0x98, 0xf4, 0x9c, 0x0e, 0x95, 0xb3, 0x4a, 0x8b, + 0x7c, 0xd3, 0xe9, 0x50, 0xe4, 0x10, 0xf2, 0x2c, 0x14, 0x0f, 0x9c, 0x76, 0x8f, 0xf2, 0x46, 0x2a, + 0x55, 0xcf, 0x48, 0x94, 0xe2, 0x5b, 0xac, 0x10, 0x05, 0x8c, 0xbc, 0x0b, 0x25, 0xfe, 0xe3, 0x5a, + 0xe0, 0x77, 0x72, 0xfa, 0x34, 0x29, 0xe1, 0x5b, 0x8a, 0xac, 0x18, 0x7e, 0xfa, 0x2f, 0xc6, 0x0c, + 0xed, 0x3f, 0xb7, 0x60, 0xc1, 0xf8, 0xb8, 0x4d, 0x37, 0x8c, 0xc8, 0xe7, 0xfb, 0x06, 0xcf, 0xca, + 0x70, 0x83, 0x87, 0xd5, 0xe6, 0x43, 0x67, 0x51, 0x7e, 0xe9, 0x8c, 0x2a, 0x31, 0x06, 0x8e, 0x07, + 0x45, 0x37, 0xa2, 0x9d, 0x70, 0x69, 0xe2, 0x99, 0xc2, 0x95, 0xd9, 0x17, 0x36, 0x72, 0xeb, 0xc6, + 0xb8, 0x7d, 0x37, 0x18, 0x7d, 0x14, 0x6c, 0xec, 0x7f, 0x51, 0x48, 0x74, 0xdf, 0x96, 0x92, 0xe3, + 0x7d, 0x0b, 0xa6, 0xda, 0xce, 0x0e, 0x6d, 0x8b, 0xb9, 0x35, 0xfb, 0xc2, 0xdb, 0xb9, 0x49, 0xa2, + 0x78, 0xac, 0x6c, 0x72, 0xfa, 0x57, 0xbd, 0x28, 0x38, 0x8c, 0x87, 0x97, 0x28, 0x44, 0xc9, 0x9c, + 0xfc, 0x43, 0x0b, 0x66, 0xe3, 0x55, 0x4d, 0x35, 0xcb, 0x4e, 0xfe, 0xc2, 0xc4, 0x8b, 0xa9, 0x94, + 0x48, 0x2f, 0xd1, 0x06, 0x04, 0x4d, 0x59, 0x96, 0x3f, 0x09, 0xb3, 0xc6, 0x27, 0x90, 0x45, 0x28, + 0xec, 0xd3, 0x43, 0x31, 0xe0, 0x91, 0xfd, 0x24, 0xe7, 0x13, 0x23, 0x5c, 0x0e, 0xe9, 0x4f, 0x4d, + 0xbc, 0x62, 0x2d, 0xbf, 0x06, 0x8b, 0x69, 0x86, 0xa3, 0xd4, 0xb7, 0xbf, 0x33, 0x99, 0x18, 0x98, + 0x6c, 0x21, 0x20, 0x3e, 0x4c, 0x77, 0x68, 0x14, 0xb8, 0x0d, 0xd5, 0x65, 0xeb, 0xe3, 0xb5, 0xd2, + 0x16, 0x27, 0x16, 0x6f, 0x88, 0xe2, 0x7f, 0x88, 0x8a, 0x0b, 0xd9, 0x83, 0x49, 0x27, 0x68, 0xa9, + 0x3e, 0xb9, 0x96, 0xcf, 0xb4, 0x8c, 0x97, 0x8a, 0x4a, 0xd0, 0x0a, 0x91, 0x73, 0x20, 0xab, 0x50, + 0x8a, 0x68, 0xd0, 0x71, 0x3d, 0x27, 0x12, 0x3b, 0xe8, 0x4c, 0xf5, 0xac, 0x44, 0x2b, 0x6d, 0x2b, + 0x00, 0xc6, 0x38, 0xa4, 0x0d, 0x53, 0xcd, 0xe0, 0x10, 0x7b, 0xde, 0xd2, 0x64, 0x1e, 0x4d, 0xb1, + 0xce, 0x69, 0xc5, 0x83, 0x54, 0xfc, 0x47, 0xc9, 0x83, 0xfc, 0xba, 0x05, 0xe7, 0x3b, 0xd4, 0x09, + 0x7b, 0x01, 0x65, 0x9f, 0x80, 0x34, 0xa2, 0x1e, 0xeb, 0xd8, 0xa5, 0x22, 0x67, 0x8e, 0xe3, 0xf6, + 0x43, 0x3f, 0xe5, 0xea, 0xd3, 0x52, 0x94, 0xf3, 0x59, 0x50, 0xcc, 0x94, 0xc6, 0xfe, 0xd3, 0x49, + 0x38, 0xdb, 0xb7, 0xb0, 0x93, 0x97, 0xa0, 0xd8, 0xdd, 0x73, 0x42, 0xb5, 0x52, 0x5f, 0x56, 0xcb, + 0x44, 0x8d, 0x15, 0x3e, 0x38, 0x2a, 0x9f, 0x51, 0x55, 0x78, 0x01, 0x0a, 0x64, 0xa6, 0x37, 0x75, + 0x68, 0x18, 0x3a, 0x2d, 0xb5, 0x7c, 0x1b, 0xc3, 0x84, 0x17, 0xa3, 0x82, 0x93, 0xbf, 0x63, 0xc1, + 0x19, 0x31, 0x64, 0x90, 0x86, 0xbd, 0x76, 0xc4, 0xb6, 0x28, 0xd6, 0x2c, 0x37, 0xf2, 0x18, 0x9e, + 0x82, 0x64, 0xf5, 0x82, 0xe4, 0x7e, 0xc6, 0x2c, 0x0d, 0x31, 0xc9, 0x97, 0xdc, 0x81, 0x52, 0x18, + 0x39, 0x41, 0x44, 0x9b, 0x95, 0x88, 0x2b, 0x53, 0xb3, 0x2f, 0xfc, 0xf4, 0x70, 0x6b, 0xf7, 0xb6, + 0xdb, 0xa1, 0x62, 0x9f, 0xa8, 0x2b, 0x02, 0x18, 0xd3, 0x22, 0xef, 0x02, 0x04, 0x3d, 0xaf, 0xde, + 0xeb, 0x74, 0x9c, 0xe0, 0x50, 0xea, 0x57, 0xd7, 0xc7, 0xfb, 0x3c, 0xd4, 0xf4, 0x62, 0x55, 0x23, + 0x2e, 0x43, 0x83, 0x1f, 0xf9, 0xb2, 0x05, 0x67, 0xc4, 0x48, 0x54, 0x12, 0x4c, 0xe5, 0x2c, 0xc1, + 0x59, 0xd6, 0xb4, 0xeb, 0x26, 0x0b, 0x4c, 0x72, 0xb4, 0xff, 0x43, 0x52, 0x0d, 0xa8, 0x47, 0xec, + 0xb0, 0xd5, 0x3a, 0x24, 0x9f, 0x83, 0x27, 0xc3, 0x5e, 0xa3, 0x41, 0xc3, 0x70, 0xb7, 0xd7, 0xc6, + 0x9e, 0x77, 0xdd, 0x0d, 0x23, 0x3f, 0x38, 0xdc, 0x74, 0x3b, 0x6e, 0xc4, 0x47, 0x5c, 0xb1, 0x7a, + 0xe9, 0xf8, 0xa8, 0xfc, 0x64, 0x7d, 0x10, 0x12, 0x0e, 0xae, 0x4f, 0x1c, 0x78, 0xaa, 0xe7, 0x0d, + 0x26, 0x2f, 0x34, 0xf4, 0xf2, 0xf1, 0x51, 0xf9, 0xa9, 0xdb, 0x83, 0xd1, 0xf0, 0x24, 0x1a, 0xf6, + 0x7f, 0xb3, 0xd8, 0x4a, 0x2d, 0xbe, 0x6b, 0x9b, 0x76, 0xba, 0x6d, 0xb6, 0xba, 0x9c, 0xbe, 0xfe, + 0x18, 0x25, 0xf4, 0x47, 0xcc, 0x67, 0xbb, 0x53, 0xf2, 0x0f, 0x52, 0x22, 0xed, 0xff, 0x6a, 0xc1, + 0xf9, 0x34, 0xf2, 0x63, 0xd0, 0x79, 0xc2, 0xa4, 0xce, 0x73, 0x33, 0xdf, 0xaf, 0x1d, 0xa0, 0xf8, + 0x7c, 0x75, 0xb2, 0xff, 0x5b, 0xff, 0x5f, 0xdf, 0x46, 0xe3, 0x5d, 0xb1, 0xf0, 0xe3, 0xdc, 0x15, + 0x27, 0x3f, 0x50, 0xbb, 0xe2, 0x6f, 0x4e, 0xc2, 0x5c, 0xc5, 0x8b, 0xdc, 0xca, 0xee, 0xae, 0xeb, + 0xb9, 0xd1, 0x21, 0xf9, 0xfa, 0x04, 0xac, 0x76, 0x03, 0xba, 0x4b, 0x83, 0x80, 0x36, 0xd7, 0x7b, + 0x81, 0xeb, 0xb5, 0xea, 0x8d, 0x3d, 0xda, 0xec, 0xb5, 0x5d, 0xaf, 0xb5, 0xd1, 0xf2, 0x7c, 0x5d, + 0x7c, 0xf5, 0x3e, 0x6d, 0xf4, 0xf8, 0x27, 0x89, 0x49, 0xd1, 0x19, 0xef, 0x93, 0x6a, 0xa3, 0x31, + 0xad, 0xbe, 0x78, 0x7c, 0x54, 0x5e, 0x1d, 0xb1, 0x12, 0x8e, 0xfa, 0x69, 0xe4, 0x6b, 0x13, 0xb0, + 0x12, 0xd0, 0x9f, 0xef, 0xb9, 0xc3, 0xb7, 0x86, 0x58, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, 0xf1, + 0xac, 0xbe, 0x70, 0x7c, 0x54, 0x1e, 0xb1, 0x0e, 0x8e, 0xf8, 0x5d, 0x76, 0x0d, 0x66, 0x2b, 0x5d, + 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, 0x8a, + 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x8b, 0x6c, 0xc5, 0xe5, + 0x24, 0x53, 0xc6, 0x8d, 0xbb, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0xc6, 0x3d, 0x07, 0xc6, 0x52, + 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x9b, 0x80, 0x0b, 0x95, 0x6e, 0x77, 0x8b, 0x86, + 0x7b, 0x29, 0x29, 0x7e, 0xd9, 0x82, 0xf9, 0x03, 0x37, 0x88, 0x7a, 0x4e, 0x5b, 0xd9, 0xaf, 0x84, + 0x3c, 0xf5, 0x71, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x92, 0xe3, 0xa3, 0xf2, 0x7c, 0xb2, + 0x0c, 0x53, 0xec, 0xc9, 0x3f, 0xb0, 0x60, 0x51, 0x16, 0xdd, 0xf4, 0x9b, 0xd4, 0xb4, 0x8f, 0xde, + 0xce, 0x53, 0x26, 0x4d, 0x5c, 0xd8, 0xb5, 0xd2, 0xa5, 0xd8, 0x27, 0x84, 0xfd, 0x3f, 0x26, 0xe0, + 0xe2, 0x00, 0x1a, 0xe4, 0x37, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0xae, 0x6c, 0xcd, + 0x9f, 0xc9, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x5d, 0x62, 0xab, 0xe1, 0x5a, 0x06, + 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0xcc, 0xac, 0x29, 0x49, 0x27, 0x1e, 0x8b, 0xa4, 0xf5, 0x0c, + 0xd6, 0x98, 0x29, 0x90, 0xfd, 0xb7, 0xe0, 0xa9, 0x13, 0xc8, 0x3d, 0x7c, 0x72, 0xda, 0x6f, 0xeb, + 0x51, 0x9f, 0x1c, 0x73, 0x43, 0xcc, 0x6b, 0x1b, 0xa6, 0xf8, 0xd4, 0x51, 0x13, 0x1b, 0xd8, 0xf6, + 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x9e, 0x05, 0x33, 0x23, 0x58, 0xc3, 0xca, 0x49, 0x6b, + 0x58, 0xa9, 0xcf, 0x12, 0x16, 0xf5, 0x5b, 0xc2, 0x5e, 0x1f, 0xaf, 0x37, 0x86, 0xb1, 0x80, 0xfd, + 0xc8, 0x82, 0xb3, 0x7d, 0x16, 0x33, 0xb2, 0x07, 0xe7, 0xbb, 0x7e, 0x53, 0xa9, 0x4d, 0xd7, 0x9d, + 0x70, 0x8f, 0xc3, 0xe4, 0xe7, 0xbd, 0xc4, 0x7a, 0xb2, 0x96, 0x01, 0x7f, 0x70, 0x54, 0x5e, 0xd2, + 0x44, 0x52, 0x08, 0x98, 0x49, 0x91, 0x74, 0x61, 0x66, 0xd7, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0xc7, + 0x54, 0x90, 0xae, 0x49, 0x6a, 0xc2, 0x58, 0xac, 0xfe, 0xa1, 0xe6, 0x62, 0x7f, 0x09, 0xe6, 0x93, + 0x57, 0x12, 0x43, 0x74, 0xde, 0x25, 0x28, 0x38, 0x81, 0x27, 0xbb, 0x6e, 0x56, 0x22, 0x14, 0x2a, + 0x78, 0x13, 0x59, 0x39, 0x79, 0x1e, 0x66, 0x76, 0x7b, 0xed, 0x36, 0xab, 0x20, 0xed, 0xff, 0x5a, + 0x1d, 0xbe, 0x26, 0xcb, 0x51, 0x63, 0xd8, 0x7f, 0x35, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x1e, + 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xea, 0xb4, 0x4d, 0x1b, + 0x91, 0x1f, 0x48, 0x69, 0x2e, 0x4a, 0x42, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x35, 0x98, + 0x77, 0x1a, 0x91, 0x7b, 0x40, 0x35, 0x05, 0x21, 0xee, 0x87, 0x24, 0x85, 0xf9, 0x4a, 0x02, 0x8a, + 0x29, 0x6c, 0xf2, 0x79, 0x58, 0x0a, 0x1b, 0x4e, 0x9b, 0xde, 0xee, 0x4a, 0x56, 0x6b, 0x7b, 0xb4, + 0xb1, 0x5f, 0xf3, 0x5d, 0x2f, 0x92, 0x26, 0x99, 0x67, 0x24, 0xa5, 0xa5, 0xfa, 0x00, 0x3c, 0x1c, + 0x48, 0x81, 0xfc, 0x6b, 0x0b, 0x2e, 0x75, 0x03, 0x5a, 0x0b, 0xfc, 0x8e, 0xcf, 0xf6, 0xda, 0x3e, + 0x3b, 0x85, 0x3c, 0xaf, 0xbf, 0x35, 0xa6, 0x52, 0x21, 0x4a, 0xfa, 0xcd, 0xdb, 0x1f, 0x3e, 0x3e, + 0x2a, 0x5f, 0xaa, 0x9d, 0x24, 0x00, 0x9e, 0x2c, 0x1f, 0xf9, 0x37, 0x16, 0x5c, 0xee, 0xfa, 0x61, + 0x74, 0xc2, 0x27, 0x14, 0x4f, 0xf5, 0x13, 0xec, 0xe3, 0xa3, 0xf2, 0xe5, 0xda, 0x89, 0x12, 0xe0, + 0x43, 0x24, 0xb4, 0x8f, 0x67, 0xe1, 0xac, 0x31, 0xf6, 0xe4, 0x21, 0xfe, 0x55, 0x38, 0xa3, 0x06, + 0x43, 0xac, 0x04, 0x94, 0x62, 0xa3, 0x4b, 0xc5, 0x04, 0x62, 0x12, 0x97, 0x8d, 0x3b, 0x3d, 0x14, + 0x45, 0xed, 0xd4, 0xb8, 0xab, 0x25, 0xa0, 0x98, 0xc2, 0x26, 0x1b, 0x70, 0x4e, 0x96, 0x20, 0xed, + 0xb6, 0xdd, 0x86, 0xb3, 0xe6, 0xf7, 0xe4, 0x90, 0x2b, 0x56, 0x2f, 0x1e, 0x1f, 0x95, 0xcf, 0xd5, + 0xfa, 0xc1, 0x98, 0x55, 0x87, 0x6c, 0xc2, 0x79, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, 0x7a, 0x6c, + 0x5f, 0x69, 0xf2, 0xa1, 0x35, 0x23, 0x36, 0xa0, 0x4a, 0x06, 0x1c, 0x33, 0x6b, 0x91, 0x5a, 0x8a, + 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x7a, 0xb9, 0x18, 0x1f, 0x45, 0x2a, 0x19, 0x38, 0x98, 0x59, + 0x93, 0xb4, 0x61, 0xbe, 0xe3, 0xdc, 0xbf, 0xed, 0x39, 0x07, 0x8e, 0xdb, 0x66, 0x4c, 0xa4, 0x21, + 0x67, 0xb0, 0x75, 0xa1, 0x17, 0xb9, 0xed, 0x15, 0x71, 0xc5, 0xbd, 0xb2, 0xe1, 0x45, 0x6f, 0x06, + 0xf5, 0x88, 0xa9, 0xac, 0x42, 0x95, 0xda, 0x4a, 0xd0, 0xc2, 0x14, 0x6d, 0xf2, 0x26, 0x5c, 0xe0, + 0xd3, 0x71, 0xdd, 0xbf, 0xe7, 0xad, 0xd3, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x93, + 0xc7, 0x47, 0xe5, 0x0b, 0xf5, 0x2c, 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x2a, 0x09, 0x40, 0x7a, + 0xe0, 0x86, 0xae, 0xef, 0x09, 0x73, 0xcc, 0x4c, 0x6c, 0x8e, 0xa9, 0x0f, 0x46, 0xc3, 0x93, 0x68, + 0x90, 0x7f, 0x64, 0xc1, 0xf9, 0xac, 0x69, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0x35, 0xb5, 0xc4, + 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x59, 0x30, 0xe7, 0x18, 0x47, 0xc9, 0x25, 0xe0, + 0x52, 0xdd, 0x18, 0xd7, 0xa0, 0x11, 0x53, 0xac, 0x2e, 0x1e, 0x1f, 0x95, 0x13, 0xc7, 0x55, 0x4c, + 0x70, 0x24, 0xff, 0xc4, 0x82, 0x0b, 0x99, 0x73, 0x7c, 0x69, 0xf6, 0x34, 0x5a, 0x88, 0x0f, 0x92, + 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, 0x4d, 0x4b, 0x6f, 0x65, 0xea, 0xee, 0x65, 0x69, 0x8e, 0x8b, + 0x76, 0x6b, 0xcc, 0xd3, 0x73, 0xac, 0x3e, 0x28, 0xc2, 0xd5, 0x73, 0xc6, 0xce, 0xa8, 0x0a, 0x31, + 0xcd, 0x9e, 0x7c, 0xc3, 0x52, 0x5b, 0xa3, 0x96, 0xe8, 0xcc, 0x69, 0x49, 0x44, 0xe2, 0x9d, 0x56, + 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x16, 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, + 0x9f, 0x46, 0x97, 0x8f, 0x8f, 0xca, 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0xb7, 0x8b, + 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, 0xfa, 0x1d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, + 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0x99, 0xe3, 0xa3, 0xf2, 0xd3, 0x6b, + 0x27, 0xf0, 0xc7, 0x13, 0xa5, 0x23, 0xff, 0xde, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xc6, 0x7e, 0x2b, + 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x26, 0x4e, 0xf5, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, 0xdb, 0x6b, + 0x0f, 0x95, 0x02, 0x87, 0x90, 0x94, 0xbc, 0x0e, 0x67, 0x25, 0xd6, 0xd5, 0xfb, 0x5d, 0x1a, 0xb8, + 0x4c, 0xf9, 0x96, 0x8a, 0x63, 0xec, 0xb6, 0x93, 0x46, 0xc0, 0xfe, 0x3a, 0x24, 0x84, 0xe9, 0x7b, + 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, 0x1a, 0xd3, 0x57, 0x47, 0x9a, 0x07, 0xee, 0x08, 0x9a, 0xd5, + 0xd9, 0xe3, 0xa3, 0xf2, 0xb4, 0xfc, 0x83, 0x8a, 0x13, 0xb9, 0x09, 0xf3, 0xe2, 0xc0, 0x56, 0x73, + 0xbd, 0x56, 0xcd, 0xf7, 0x84, 0xc3, 0x49, 0xa9, 0xfa, 0x9c, 0xda, 0xf0, 0xeb, 0x09, 0xe8, 0x83, + 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xc1, 0x14, 0x80, 0x1a, + 0xae, 0xb4, 0x4b, 0x3e, 0x0a, 0xa5, 0x90, 0x46, 0x82, 0xab, 0xbc, 0x41, 0x10, 0x17, 0x33, 0xaa, + 0x10, 0x63, 0x38, 0xd9, 0x87, 0x62, 0xd7, 0xe9, 0x85, 0x54, 0x76, 0xfe, 0x8d, 0x5c, 0x3a, 0xbf, + 0xc6, 0x28, 0x8a, 0x13, 0x1a, 0xff, 0x89, 0x82, 0x07, 0xf9, 0x8a, 0x05, 0x40, 0x93, 0x1d, 0x36, + 0xb6, 0xa5, 0x44, 0xb2, 0x8c, 0xfb, 0x94, 0xb5, 0x41, 0x75, 0xfe, 0xf8, 0xa8, 0x0c, 0x46, 0xd7, + 0x1b, 0x6c, 0xc9, 0x3d, 0x98, 0x71, 0xd4, 0x9a, 0x3f, 0x79, 0x1a, 0x6b, 0x3e, 0x3f, 0x38, 0xe9, + 0x41, 0xab, 0x99, 0x91, 0xaf, 0x59, 0x30, 0x1f, 0xd2, 0x48, 0x76, 0x15, 0x5b, 0x79, 0xa4, 0xc2, + 0x3b, 0xe6, 0xa0, 0xab, 0x27, 0x68, 0x8a, 0x15, 0x34, 0x59, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0xeb, + 0xd4, 0x69, 0xd2, 0x80, 0x9f, 0xcb, 0xa5, 0x26, 0x35, 0xbe, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, + 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x2d, 0x37, 0x08, 0x7c, 0x29, 0xca, 0x4c, 0x4e, 0xa2, 0x18, 0x34, + 0xb5, 0x28, 0x46, 0x19, 0xa6, 0xf8, 0xda, 0xdf, 0x3e, 0x03, 0xf3, 0x6a, 0x22, 0xc5, 0x9a, 0xbd, + 0x30, 0x03, 0x0d, 0xd0, 0xec, 0xd7, 0x4c, 0x20, 0x26, 0x71, 0x59, 0x65, 0x31, 0x55, 0x93, 0x8a, + 0xbd, 0xae, 0x5c, 0x37, 0x81, 0x98, 0xc4, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, 0xcb, 0xe0, + 0x31, 0xef, 0x2a, 0xe3, 0xf5, 0x21, 0xbe, 0xee, 0x61, 0xff, 0x42, 0x14, 0x5c, 0xb8, 0x25, 0x33, + 0x4a, 0x18, 0x37, 0xe5, 0xe4, 0xc8, 0x67, 0x7e, 0x26, 0xed, 0xa6, 0xa2, 0x37, 0x92, 0x65, 0x98, + 0x62, 0x9f, 0xa1, 0xec, 0x17, 0x4f, 0x51, 0xd9, 0xff, 0x2c, 0xcc, 0x74, 0x9c, 0xfb, 0xf5, 0x5e, + 0xd0, 0x7a, 0xf4, 0x43, 0x85, 0x74, 0xaf, 0x13, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb6, 0x8c, 0x25, + 0x67, 0x9a, 0x13, 0xbf, 0x93, 0xef, 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, + 0xf3, 0xd8, 0x55, 0x6f, 0xa6, 0x46, 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0xa9, 0xaa, 0x91, 0x6b, + 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, 0x11, 0x73, 0x4e, 0xcb, 0x03, 0xa7, 0x2a, 0x4f, 0x3d, 0xc1, + 0x0c, 0x53, 0xcc, 0x07, 0x9f, 0x37, 0x67, 0x4f, 0xe7, 0xbc, 0x39, 0x97, 0xc3, 0x79, 0xf3, 0x64, + 0x55, 0xfc, 0xcc, 0xb8, 0xaa, 0x38, 0xb9, 0x01, 0xa4, 0x79, 0xe8, 0x39, 0x1d, 0xb7, 0x21, 0x17, + 0x4b, 0xbe, 0x6d, 0xce, 0x73, 0x7b, 0xc4, 0xb2, 0x5c, 0xc8, 0xc8, 0x7a, 0x1f, 0x06, 0x66, 0xd4, + 0x22, 0x11, 0xcc, 0x74, 0x95, 0xc6, 0xb5, 0x90, 0xc7, 0xe8, 0x57, 0x1a, 0x98, 0xf0, 0x17, 0x60, + 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, 0x36, 0xe1, 0x7c, 0xc7, 0xf5, 0x6a, 0x7e, 0x33, 0xac, 0xd1, + 0x40, 0x5a, 0x5b, 0xea, 0x34, 0x5a, 0x5a, 0xe4, 0x6d, 0xc3, 0x4f, 0xd0, 0x5b, 0x19, 0x70, 0xcc, + 0xac, 0x65, 0xff, 0x4f, 0x0b, 0x16, 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xc7, 0x89, 0x1a, 0x7b, 0xe2, + 0xaa, 0x9c, 0xbc, 0x06, 0x33, 0xae, 0x17, 0xd1, 0xe0, 0xc0, 0x69, 0xcb, 0xfd, 0xc9, 0x56, 0xe6, + 0xd3, 0x0d, 0x59, 0xfe, 0xe0, 0xa8, 0x3c, 0xbf, 0xde, 0x0b, 0xb8, 0x3b, 0x9d, 0x58, 0xad, 0x50, + 0xd7, 0x21, 0xdf, 0xb6, 0xe0, 0xac, 0xb8, 0x6c, 0x5f, 0x77, 0x22, 0xe7, 0x56, 0x8f, 0x06, 0x2e, + 0x55, 0xd7, 0xed, 0x63, 0x2e, 0x54, 0x69, 0x59, 0x15, 0x83, 0xc3, 0x58, 0x51, 0xdf, 0x4a, 0x73, + 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x29, 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, + 0xd3, 0x41, 0xd2, 0x9d, 0xd8, 0x68, 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, + 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x0c, 0x45, 0xee, 0x5a, 0x29, + 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, 0x8c, 0x28, 0xca, 0xc9, 0x2f, 0x5a, 0x00, 0x42, 0x40, 0x76, + 0x1a, 0x91, 0xbb, 0x24, 0xe6, 0xdb, 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, + 0x0d, 0x53, 0x4c, 0xa1, 0xf5, 0x9b, 0x8f, 0xbc, 0x29, 0xf2, 0x2b, 0x99, 0x1a, 0xa7, 0x81, 0x92, + 0x16, 0x6b, 0xab, 0x80, 0x46, 0xbd, 0xc0, 0x63, 0x4d, 0xcb, 0xb7, 0xc1, 0x19, 0x21, 0x05, 0xea, + 0x52, 0x34, 0x30, 0xec, 0x7f, 0x35, 0x01, 0xe7, 0xb3, 0x44, 0x67, 0xbb, 0xcd, 0x94, 0x90, 0x56, + 0x1e, 0x8d, 0x3f, 0x93, 0x7f, 0xfb, 0x48, 0xbf, 0x11, 0xed, 0x5d, 0x21, 0x3d, 0xdb, 0x24, 0x5f, + 0xf2, 0x19, 0xdd, 0x42, 0x13, 0x8f, 0xd8, 0x42, 0x9a, 0x72, 0xaa, 0x95, 0x9e, 0x81, 0xc9, 0x90, + 0xf5, 0x7c, 0x21, 0x79, 0xdd, 0xc1, 0xfb, 0x88, 0x43, 0x18, 0x46, 0xcf, 0x73, 0x23, 0x19, 0x8f, + 0xa0, 0x31, 0x6e, 0x7b, 0x6e, 0x84, 0x1c, 0x62, 0x7f, 0x6b, 0x02, 0x96, 0x07, 0x7f, 0x14, 0xf9, + 0x96, 0x05, 0xd0, 0x64, 0xc7, 0x95, 0x90, 0x3b, 0xf5, 0x0a, 0x3f, 0x1b, 0xe7, 0xb4, 0xda, 0x70, + 0x5d, 0x71, 0x8a, 0x9d, 0xae, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, 0x05, 0x35, 0xf4, 0xf9, 0x55, + 0x8d, 0x98, 0x4c, 0xba, 0xce, 0x96, 0x86, 0xa0, 0x81, 0xc5, 0xce, 0xa3, 0x9e, 0xd3, 0xa1, 0x61, + 0xd7, 0xd1, 0xd1, 0x1d, 0xfc, 0x3c, 0x7a, 0x53, 0x15, 0x62, 0x0c, 0xb7, 0xdb, 0xf0, 0xec, 0x10, + 0x72, 0xe6, 0xe4, 0x3c, 0x6f, 0xff, 0x85, 0x05, 0x17, 0xd7, 0xda, 0xbd, 0x30, 0xa2, 0xc1, 0xff, + 0x37, 0x3e, 0x6c, 0xff, 0xcb, 0x82, 0xa7, 0x06, 0x7c, 0xf3, 0x63, 0x70, 0x65, 0x7b, 0x27, 0xe9, + 0xca, 0x76, 0x7b, 0xdc, 0x21, 0x9d, 0xf9, 0x1d, 0x03, 0x3c, 0xda, 0x7e, 0xd3, 0x82, 0x33, 0x6c, + 0xd9, 0x6a, 0xfa, 0xad, 0x9c, 0x36, 0xce, 0x67, 0xa1, 0xf8, 0xf3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, + 0xbe, 0x2b, 0xa1, 0x80, 0xb1, 0x39, 0xe3, 0x74, 0xdd, 0xb7, 0x68, 0xc0, 0x37, 0xa0, 0x42, 0x72, + 0xce, 0x54, 0x34, 0x04, 0x0d, 0x2c, 0xfb, 0xd3, 0x20, 0x9d, 0xc5, 0x52, 0x33, 0xce, 0x1a, 0x66, + 0xc6, 0xd9, 0xff, 0x71, 0x02, 0x0c, 0xe3, 0xc7, 0x63, 0x18, 0xc9, 0x5e, 0x62, 0x24, 0x8f, 0x79, + 0x70, 0x37, 0x4c, 0x39, 0x83, 0x82, 0x79, 0x0e, 0x52, 0xc1, 0x3c, 0x37, 0x73, 0xe3, 0x78, 0x72, + 0x2c, 0xcf, 0xf7, 0x2d, 0x78, 0x2a, 0x46, 0xee, 0xb7, 0x4b, 0x3e, 0x7c, 0x59, 0x7a, 0x19, 0x66, + 0x9d, 0xb8, 0x9a, 0x1c, 0x37, 0x46, 0x24, 0x85, 0x06, 0xa1, 0x89, 0x17, 0xfb, 0xa0, 0x17, 0x1e, + 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0x2f, 0x27, 0xe0, 0x52, 0xff, 0x97, 0xa9, 0x09, + 0x35, 0xdc, 0x25, 0xff, 0x2b, 0x30, 0x17, 0xc9, 0x0a, 0xc6, 0xf6, 0xa0, 0xa3, 0x3a, 0xb7, 0x0d, + 0x18, 0x26, 0x30, 0x59, 0xcd, 0x86, 0x98, 0xca, 0xf5, 0x86, 0xdf, 0x55, 0x11, 0x0c, 0xba, 0xe6, + 0x9a, 0x01, 0xc3, 0x04, 0xa6, 0xf6, 0x0d, 0x9d, 0x3c, 0x75, 0xdf, 0xd0, 0x3a, 0x5c, 0x50, 0xde, + 0x70, 0xd7, 0xfc, 0x60, 0xcd, 0xef, 0x74, 0xdb, 0x54, 0xc6, 0x30, 0x30, 0x61, 0x2f, 0xc9, 0x2a, + 0x17, 0x30, 0x0b, 0x09, 0xb3, 0xeb, 0xda, 0xdf, 0x2f, 0xc0, 0xb9, 0xb8, 0xd9, 0xd7, 0x7c, 0xaf, + 0xe9, 0x72, 0x9f, 0xc2, 0x57, 0x61, 0x32, 0x3a, 0xec, 0xaa, 0xc6, 0xfe, 0x6b, 0x4a, 0x9c, 0xed, + 0xc3, 0x2e, 0xeb, 0xed, 0x8b, 0x19, 0x55, 0xb8, 0x65, 0x98, 0x57, 0x22, 0x9b, 0x7a, 0x76, 0x88, + 0x1e, 0x78, 0x29, 0x39, 0x9a, 0x1f, 0x1c, 0x95, 0x33, 0x82, 0x9a, 0x57, 0x34, 0xa5, 0xe4, 0x98, + 0x27, 0x77, 0x61, 0xbe, 0xed, 0x84, 0xd1, 0xed, 0x6e, 0xd3, 0x89, 0xe8, 0xb6, 0x2b, 0x3d, 0x34, + 0x46, 0x0b, 0x0c, 0xd0, 0x57, 0xd9, 0x9b, 0x09, 0x4a, 0x98, 0xa2, 0x4c, 0x0e, 0x80, 0xb0, 0x92, + 0xed, 0xc0, 0xf1, 0x42, 0xf1, 0x55, 0x8c, 0xdf, 0xe8, 0x81, 0x08, 0xfa, 0x64, 0xb8, 0xd9, 0x47, + 0x0d, 0x33, 0x38, 0x90, 0xe7, 0x60, 0x2a, 0xa0, 0x4e, 0x28, 0x3b, 0xb3, 0x14, 0xcf, 0x7f, 0xe4, + 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x7a, 0xc8, 0x84, 0xfa, 0x33, 0x0b, 0xe6, 0xe3, 0x6e, 0x7a, + 0x0c, 0x3b, 0x6b, 0x27, 0xb9, 0xb3, 0x5e, 0xcf, 0x6b, 0x49, 0x1c, 0xb0, 0x99, 0xfe, 0xe1, 0x94, + 0xf9, 0x7d, 0xdc, 0x31, 0xfc, 0x8b, 0x50, 0x52, 0xb3, 0x5a, 0xa9, 0xac, 0x63, 0x1e, 0xb0, 0x13, + 0xca, 0x8c, 0x11, 0xd0, 0x24, 0x99, 0x60, 0xcc, 0x8f, 0x6d, 0xe5, 0x4d, 0xb9, 0x4d, 0xcb, 0x61, + 0xaf, 0xb7, 0x72, 0xb5, 0x7d, 0x67, 0x6d, 0xe5, 0xaa, 0x0e, 0xb9, 0x0d, 0x17, 0xbb, 0x81, 0xcf, + 0xc3, 0x6a, 0xd7, 0xa9, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x56, 0x0c, 0xe1, 0x49, 0xf1, 0xd4, 0xf1, + 0x51, 0xf9, 0x62, 0x2d, 0x1b, 0x05, 0x07, 0xd5, 0x4d, 0x06, 0x66, 0x4d, 0x0e, 0x11, 0x98, 0xf5, + 0x77, 0xb5, 0xad, 0x90, 0x86, 0x32, 0x3c, 0xea, 0x73, 0x79, 0x75, 0x65, 0xc6, 0xb2, 0x1e, 0x0f, + 0xa9, 0x8a, 0x64, 0x8a, 0x9a, 0xfd, 0x60, 0x83, 0xd4, 0xd4, 0x23, 0x1a, 0xa4, 0x62, 0xff, 0xfa, + 0xe9, 0x1f, 0xa7, 0x7f, 0xfd, 0xcc, 0x07, 0xca, 0xbf, 0xfe, 0xfd, 0x22, 0x2c, 0xa6, 0x35, 0x90, + 0xd3, 0x0f, 0x3a, 0xfb, 0xfb, 0x16, 0x2c, 0xaa, 0xd9, 0x23, 0x78, 0x52, 0x75, 0xd5, 0xb0, 0x99, + 0xd3, 0xa4, 0x15, 0xba, 0x94, 0x8e, 0xc6, 0xdf, 0x4e, 0x71, 0xc3, 0x3e, 0xfe, 0xe4, 0x6d, 0x98, + 0xd5, 0x16, 0xf9, 0x47, 0x8a, 0x40, 0x5b, 0xe0, 0x5a, 0x54, 0x4c, 0x02, 0x4d, 0x7a, 0xe4, 0x7d, + 0x0b, 0xa0, 0xa1, 0xb6, 0x39, 0x35, 0xbb, 0x6e, 0xe5, 0x35, 0xbb, 0xf4, 0x06, 0x1a, 0x2b, 0xcb, + 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x15, 0x6e, 0x8b, 0xd7, 0xda, 0x9d, 0x88, 0xf2, 0x1f, 0xdb, + 0x77, 0xf8, 0x04, 0xc5, 0x34, 0x56, 0xa5, 0x0c, 0x50, 0x88, 0x09, 0x21, 0xec, 0x57, 0x41, 0x7b, + 0x7b, 0xb2, 0x65, 0x8b, 0xfb, 0x7b, 0xd6, 0x9c, 0x68, 0x4f, 0x0e, 0x41, 0xbd, 0x6c, 0x5d, 0x53, + 0x00, 0x8c, 0x71, 0xec, 0x2f, 0xc0, 0xfc, 0xeb, 0x81, 0xd3, 0xdd, 0x73, 0xb9, 0xcd, 0x9b, 0x9d, + 0xad, 0x3e, 0x02, 0xd3, 0x4e, 0xb3, 0x99, 0x95, 0x38, 0xa2, 0x22, 0x8a, 0x51, 0xc1, 0x87, 0x3a, + 0x46, 0xd9, 0x7f, 0x60, 0x01, 0x89, 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, + 0x3e, 0xda, 0xe3, 0xa5, 0x59, 0xe7, 0xa3, 0xeb, 0x1a, 0x82, 0x06, 0x16, 0x79, 0x17, 0x66, 0xc5, + 0xbf, 0xb7, 0xb4, 0x85, 0x60, 0xec, 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x99, 0xc4, 0x28, 0xbc, 0x1e, + 0x73, 0x40, 0x93, 0x1d, 0x6b, 0xaa, 0x0d, 0x6f, 0xb7, 0xdd, 0xbb, 0xdf, 0xdc, 0x89, 0x9b, 0xaa, + 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, 0x9b, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0x6b, 0xaa, 0x7f, + 0x6b, 0xc1, 0xf9, 0x8d, 0x30, 0x72, 0xfd, 0x75, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0x8b, 0x4f, 0xaf, + 0x3d, 0x8c, 0xe3, 0xf6, 0x3a, 0x2c, 0xca, 0x3b, 0xcc, 0xde, 0x4e, 0x48, 0x23, 0x43, 0x8f, 0xd7, + 0xf3, 0x78, 0x2d, 0x05, 0xc7, 0xbe, 0x1a, 0x8c, 0x8a, 0xbc, 0xcc, 0x8c, 0xa9, 0x14, 0x92, 0x54, + 0xea, 0x29, 0x38, 0xf6, 0xd5, 0xb0, 0xbf, 0x57, 0x80, 0x73, 0xfc, 0x33, 0x52, 0x41, 0x17, 0xdf, + 0x18, 0x14, 0x74, 0x31, 0xe6, 0x54, 0xe6, 0xbc, 0x1e, 0x21, 0xe4, 0xe2, 0xef, 0x59, 0xb0, 0xd0, + 0x4c, 0xb6, 0x74, 0x3e, 0x36, 0x9d, 0xac, 0x3e, 0x14, 0x2e, 0x5b, 0xa9, 0x42, 0x4c, 0xf3, 0x27, + 0xbf, 0x6a, 0xc1, 0x42, 0x52, 0x4c, 0xb5, 0xba, 0x9f, 0x42, 0x23, 0x69, 0x1f, 0xeb, 0x64, 0x79, + 0x88, 0x69, 0x11, 0xec, 0x3f, 0x9a, 0x90, 0x5d, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, 0x94, 0xa2, + 0x76, 0x28, 0x0a, 0xe5, 0xd7, 0x8e, 0x79, 0x22, 0xdc, 0xde, 0xac, 0x0b, 0xf7, 0x81, 0x58, 0x69, + 0x93, 0x25, 0x4c, 0xf9, 0x54, 0xbc, 0x38, 0xe3, 0x46, 0x57, 0x32, 0xce, 0xe5, 0x28, 0xba, 0xbd, + 0x56, 0x4b, 0x33, 0x96, 0x25, 0x8c, 0xb1, 0xe2, 0x65, 0xff, 0x96, 0x05, 0xa5, 0x1b, 0xbe, 0x5a, + 0x47, 0x7e, 0x36, 0x07, 0x43, 0x8f, 0xd6, 0x07, 0xf5, 0x35, 0x65, 0x7c, 0xc4, 0x78, 0x2d, 0x61, + 0xe6, 0x79, 0xda, 0xa0, 0xbd, 0xc2, 0xf3, 0x67, 0x31, 0x52, 0x37, 0xfc, 0x9d, 0x81, 0xa6, 0xc7, + 0x5f, 0x2b, 0xc2, 0x99, 0x37, 0x9c, 0x43, 0xea, 0x45, 0xce, 0xe8, 0x9b, 0xc4, 0xcb, 0x30, 0xeb, + 0x74, 0xf9, 0x3d, 0x98, 0xa1, 0xe3, 0xc7, 0x96, 0x93, 0x18, 0x84, 0x26, 0x5e, 0xbc, 0xa0, 0x89, + 0xec, 0x3a, 0x59, 0x4b, 0xd1, 0x5a, 0x0a, 0x8e, 0x7d, 0x35, 0xc8, 0x0d, 0x20, 0x32, 0x1a, 0xb5, + 0xd2, 0x68, 0xf8, 0x3d, 0x4f, 0x2c, 0x69, 0xc2, 0xa8, 0xa2, 0x0f, 0x9b, 0x5b, 0x7d, 0x18, 0x98, + 0x51, 0x8b, 0x7c, 0x1e, 0x96, 0x1a, 0x9c, 0xb2, 0x3c, 0x7a, 0x98, 0x14, 0xc5, 0xf1, 0x53, 0xc7, + 0x09, 0xac, 0x0d, 0xc0, 0xc3, 0x81, 0x14, 0x98, 0xa4, 0x61, 0xe4, 0x07, 0x4e, 0x8b, 0x9a, 0x74, + 0xa7, 0x92, 0x92, 0xd6, 0xfb, 0x30, 0x30, 0xa3, 0x16, 0xf9, 0x12, 0x94, 0xa2, 0xbd, 0x80, 0x86, + 0x7b, 0x7e, 0xbb, 0x29, 0xfd, 0x16, 0xc6, 0xb4, 0xb4, 0xc9, 0xde, 0xdf, 0x56, 0x54, 0x8d, 0xe1, + 0xad, 0x8a, 0x30, 0xe6, 0x49, 0x02, 0x98, 0x0a, 0x1b, 0x7e, 0x97, 0x86, 0x52, 0x65, 0xbf, 0x91, + 0x0b, 0x77, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x03, 0x4a, 0x4e, 0xf6, 0xef, 0x4f, 0xc0, 0x9c, + 0x89, 0x38, 0xc4, 0xda, 0xf4, 0x15, 0x0b, 0xe6, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x5b, 0xd8, 0xaf, + 0xf2, 0xd1, 0x28, 0x18, 0xa9, 0x75, 0x1a, 0x39, 0x6e, 0xdb, 0x30, 0x85, 0x19, 0x6c, 0x30, 0xc1, + 0x94, 0x7c, 0xdd, 0x82, 0x85, 0xd8, 0xcd, 0x2d, 0x36, 0xa4, 0xe5, 0x2a, 0x88, 0x5e, 0xea, 0xaf, + 0x26, 0x39, 0x61, 0x9a, 0xb5, 0xbd, 0x03, 0x8b, 0xe9, 0xde, 0x66, 0x4d, 0xd9, 0x75, 0xe4, 0x5c, + 0x2f, 0xc4, 0x4d, 0x59, 0x73, 0xc2, 0x10, 0x39, 0x84, 0x3c, 0x0f, 0x33, 0x1d, 0x27, 0x68, 0xb9, + 0x9e, 0xd3, 0xe6, 0xad, 0x58, 0x30, 0x16, 0x24, 0x59, 0x8e, 0x1a, 0xc3, 0xfe, 0x38, 0xcc, 0x6d, + 0x39, 0x5e, 0x8b, 0x36, 0xe5, 0x3a, 0xfc, 0xf0, 0x98, 0xb6, 0x1f, 0x4e, 0xc2, 0xac, 0x71, 0x36, + 0x3b, 0xfd, 0x73, 0x56, 0x22, 0xa5, 0x46, 0x21, 0xc7, 0x94, 0x1a, 0x9f, 0x05, 0xd8, 0x75, 0x3d, + 0x37, 0xdc, 0x7b, 0xc4, 0x64, 0x1d, 0xfc, 0x5e, 0xf7, 0x9a, 0xa6, 0x80, 0x06, 0xb5, 0xf8, 0xf2, + 0xac, 0x78, 0x42, 0xe6, 0xa9, 0xf7, 0x2d, 0x63, 0xbb, 0x99, 0xca, 0xc3, 0x59, 0xc0, 0xe8, 0x98, + 0x15, 0xb5, 0xfd, 0x88, 0x5c, 0x43, 0x27, 0xed, 0x4a, 0xdb, 0x30, 0x13, 0xd0, 0xb0, 0xd7, 0x61, + 0x27, 0xc6, 0xe9, 0x91, 0x9b, 0x81, 0xbb, 0x6d, 0xa0, 0xac, 0x8f, 0x9a, 0xd2, 0xf2, 0xab, 0x70, + 0x26, 0x21, 0xc2, 0x48, 0xd9, 0x87, 0x7c, 0xc8, 0x34, 0x00, 0x3c, 0xca, 0x65, 0x0e, 0xeb, 0x8b, + 0xb6, 0x91, 0xad, 0x43, 0xf7, 0x85, 0x70, 0xce, 0x11, 0x30, 0xfb, 0x2f, 0xa7, 0x40, 0xde, 0x7f, + 0x0f, 0xb1, 0x5c, 0x99, 0xb7, 0x5e, 0x13, 0x8f, 0x70, 0xeb, 0x75, 0x03, 0xe6, 0x5c, 0xcf, 0x8d, + 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xde, 0xcb, 0x73, 0x1b, 0x06, 0x2c, 0x83, 0x4e, + 0xa2, 0x2e, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x01, 0x3c, 0xfa, 0x25, 0x3d, 0xf7, 0xcf, 0x10, + 0x21, 0x4d, 0x82, 0x12, 0x3f, 0x7c, 0x88, 0x74, 0x25, 0xfa, 0xf8, 0x2d, 0xc7, 0x71, 0x7c, 0xf8, + 0x48, 0xc1, 0xb1, 0xaf, 0x06, 0xa3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, 0x2a, 0x53, 0x49, + 0x2a, 0xd7, 0x52, 0x70, 0xec, 0xab, 0x41, 0x76, 0x61, 0x4e, 0x96, 0x09, 0x97, 0xab, 0xe9, 0x47, + 0xfc, 0x4a, 0xee, 0x5a, 0x77, 0xcd, 0xa0, 0x84, 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, + 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x4f, 0xf4, 0x28, 0xcc, 0x2e, 0x1c, 0x1f, 0x95, + 0xcf, 0x6e, 0xa4, 0xc9, 0x61, 0x3f, 0x07, 0xf2, 0x65, 0x0b, 0x2e, 0x34, 0x7c, 0x2f, 0xe4, 0xf1, + 0xff, 0x07, 0xf4, 0x6a, 0x10, 0xf8, 0x81, 0xe0, 0x5d, 0x7a, 0x44, 0xde, 0xdc, 0xa6, 0xb8, 0x96, + 0x45, 0x12, 0xb3, 0x39, 0x91, 0x77, 0x60, 0xa6, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, 0x7d, + 0x6f, 0x33, 0x8f, 0x7c, 0x24, 0x35, 0x49, 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, + 0x9e, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x05, 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, + 0xc8, 0xcd, 0x71, 0xd3, 0x5e, 0x28, 0x7a, 0xca, 0xe5, 0x85, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, + 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x1b, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x0f, + 0x68, 0x90, 0x45, 0xa8, 0x18, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, 0x5c, 0xdf, 0xa1, + 0xf2, 0x34, 0x53, 0x9d, 0x3e, 0x3e, 0x2a, 0x17, 0xee, 0xd0, 0x1d, 0x64, 0xc4, 0xd9, 0x77, 0x35, + 0xc5, 0xdd, 0xbd, 0x5c, 0x2a, 0xc6, 0xfc, 0xae, 0x84, 0x23, 0x80, 0xf8, 0x2e, 0x59, 0x84, 0x8a, + 0x11, 0x79, 0x07, 0x4a, 0xf7, 0x9c, 0x03, 0xba, 0x1b, 0xf8, 0x5e, 0x24, 0xfd, 0xac, 0xc6, 0x0c, + 0x15, 0xb8, 0xa3, 0xc8, 0x49, 0xbe, 0x7c, 0x7b, 0xd7, 0x85, 0x18, 0xb3, 0x23, 0x07, 0x30, 0xe3, + 0xd1, 0x7b, 0x48, 0xdb, 0x6e, 0x23, 0x1f, 0xd7, 0xfc, 0x9b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, + 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0xbb, 0xfe, 0x8e, 0x5c, 0xa8, 0xc6, 0xec, 0x4b, 0x7d, 0x32, + 0x15, 0x7d, 0x79, 0xc3, 0xdf, 0x41, 0x46, 0x9c, 0xcd, 0x91, 0x86, 0x76, 0xf2, 0x91, 0xcb, 0xd4, + 0xcd, 0x7c, 0x9d, 0x9b, 0xc4, 0x1c, 0x89, 0x4b, 0xd1, 0xe0, 0xc8, 0xda, 0xb6, 0x25, 0x8d, 0x95, + 0x72, 0xa1, 0x1a, 0xb3, 0x6d, 0x93, 0xa6, 0x4f, 0xd1, 0xb6, 0xaa, 0x0c, 0x35, 0x2f, 0xc6, 0xd7, + 0x95, 0x96, 0xbf, 0x7c, 0x96, 0xaa, 0xa4, 0x1d, 0x51, 0xf0, 0x55, 0x65, 0xa8, 0x79, 0xb1, 0xf6, + 0x0e, 0xf7, 0x0f, 0xef, 0x39, 0xed, 0x7d, 0xd7, 0x6b, 0xc9, 0x38, 0xc7, 0x71, 0xb3, 0xdb, 0xee, + 0x1f, 0xde, 0x11, 0xf4, 0xcc, 0xf6, 0x8e, 0x4b, 0xd1, 0xe0, 0x48, 0xfe, 0xb1, 0x05, 0x53, 0xdd, + 0x76, 0xaf, 0xe5, 0x7a, 0x4b, 0x73, 0x5c, 0x4f, 0xfc, 0x4c, 0x9e, 0x2b, 0xf4, 0x4a, 0x8d, 0x93, + 0x16, 0x8a, 0xe2, 0x4f, 0x6b, 0x9f, 0x3d, 0x5e, 0xf8, 0x4b, 0x7f, 0x5e, 0x5e, 0xa2, 0x5e, 0xc3, + 0x6f, 0xba, 0x5e, 0x6b, 0xf5, 0x6e, 0xe8, 0x7b, 0x2b, 0xe8, 0xdc, 0x53, 0x3a, 0xba, 0x94, 0x69, + 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x98, 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x35, 0x05, 0x73, + 0x66, 0x46, 0xbd, 0x21, 0xb4, 0x2f, 0x7d, 0xe2, 0x98, 0x18, 0xe5, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, + 0xed, 0x91, 0x32, 0x6f, 0x6d, 0xe4, 0xa6, 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, + 0x11, 0x1c, 0x4a, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x2f, 0x00, + 0xc4, 0x99, 0xe5, 0xe4, 0xad, 0xa2, 0xd6, 0x87, 0x8d, 0x8c, 0x77, 0x06, 0x16, 0x79, 0x0e, 0xa6, + 0x98, 0xea, 0x43, 0x9b, 0x32, 0x0c, 0x5b, 0x9f, 0xe3, 0xaf, 0xf1, 0x52, 0x94, 0x50, 0xf2, 0x0a, + 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0x57, 0x9f, 0x8f, 0xb5, 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, + 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, 0xd1, 0xb9, 0xd2, 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, + 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, 0x4a, 0xc1, 0xb1, 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x21, + 0x3a, 0x2b, 0x9c, 0x6d, 0x07, 0x5c, 0x65, 0x7e, 0xd5, 0x3c, 0x6b, 0xe5, 0x38, 0x87, 0xc4, 0xa8, + 0x1d, 0xfe, 0xb0, 0x35, 0xde, 0xb1, 0xe8, 0x0b, 0x30, 0x9f, 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, + 0xda, 0x24, 0x9c, 0xbb, 0xd9, 0x72, 0xbd, 0x74, 0xb6, 0xa8, 0xac, 0x64, 0xe1, 0xd6, 0xc8, 0xc9, + 0xc2, 0x75, 0x3c, 0x97, 0x4c, 0xc5, 0x9d, 0x1d, 0xcf, 0xa5, 0xf2, 0xa2, 0x27, 0x71, 0xc9, 0x9f, + 0x59, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x46, 0x87, + 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xab, 0xe8, 0xf1, 0x9f, 0x92, 0x5f, 0xf0, + 0xf4, 0x49, 0xa8, 0x78, 0xa2, 0xf8, 0xe4, 0x6f, 0xc2, 0x42, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, + 0x2e, 0x2c, 0xea, 0x49, 0x10, 0xa6, 0x71, 0x97, 0xdf, 0x84, 0x0f, 0x3f, 0x54, 0xce, 0x91, 0x06, + 0xdb, 0x57, 0x2c, 0x28, 0x09, 0xbb, 0x36, 0xd2, 0xdd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, 0xa9, + 0x6d, 0x64, 0x38, 0x61, 0xb2, 0xb5, 0x7c, 0xdf, 0xf5, 0x9a, 0xb2, 0x97, 0xf5, 0x5a, 0xfe, 0x86, + 0xeb, 0x35, 0x91, 0x43, 0xf4, 0x6a, 0x5f, 0x18, 0x68, 0x6f, 0xfa, 0x75, 0x0b, 0xe6, 0x79, 0x0c, + 0x6c, 0x7c, 0x26, 0x7c, 0x59, 0x3b, 0x1b, 0x09, 0x31, 0x2e, 0x25, 0x9d, 0x8d, 0x1e, 0x1c, 0x95, + 0x67, 0x45, 0xd4, 0x6c, 0xd2, 0xf7, 0xe8, 0x73, 0xd2, 0x90, 0xc4, 0x5d, 0xa2, 0x26, 0x46, 0xb6, + 0x73, 0x68, 0x43, 0x6b, 0x5d, 0x11, 0xc1, 0x98, 0x9e, 0xfd, 0x2e, 0xcc, 0x99, 0xc1, 0x2c, 0xe4, + 0x65, 0x98, 0xed, 0xba, 0x5e, 0x2b, 0x19, 0xf4, 0xa8, 0x8d, 0xed, 0xb5, 0x18, 0x84, 0x26, 0x1e, + 0xaf, 0xe6, 0xc7, 0xd5, 0x52, 0x36, 0xfa, 0x9a, 0x6f, 0x56, 0x8b, 0xff, 0xf0, 0x1c, 0xdb, 0x19, + 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xe0, 0xf1, 0xe3, 0xcb, 0xb1, 0x9d, 0x25, 0xcc, 0xff, 0x5d, + 0x39, 0xb6, 0x7f, 0x06, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0x6e, 0x71, + 0x19, 0x99, 0x2e, 0xa1, 0xf6, 0x7b, 0x6c, 0xda, 0xe8, 0x43, 0x6d, 0xa5, 0x17, 0xed, 0x11, 0x0f, + 0x8a, 0xa1, 0xdb, 0x3a, 0x78, 0x29, 0x27, 0x9b, 0x36, 0x23, 0x25, 0x1f, 0x66, 0x88, 0x03, 0x62, + 0x59, 0x21, 0x0a, 0x36, 0xf6, 0x5f, 0x58, 0xb0, 0x98, 0x3e, 0x79, 0xe7, 0xed, 0xd4, 0x40, 0xbe, + 0x6e, 0xc1, 0xbc, 0xd3, 0x8b, 0xf6, 0xa8, 0x17, 0xa9, 0x8b, 0xad, 0x5c, 0xde, 0x0c, 0x49, 0xb6, + 0x9d, 0x91, 0xc2, 0x2a, 0xc1, 0x0b, 0x53, 0xbc, 0xed, 0x8f, 0xc3, 0x88, 0x19, 0x22, 0xed, 0xab, + 0x40, 0xd0, 0x6f, 0xb7, 0x77, 0x9c, 0xc6, 0xfe, 0x1d, 0xd7, 0x6b, 0xfa, 0xf7, 0xf8, 0xf2, 0xb1, + 0x0a, 0xa5, 0x40, 0x86, 0x09, 0x86, 0xb2, 0xa7, 0xf5, 0xfa, 0xa3, 0xe2, 0x07, 0x43, 0x8c, 0x71, + 0xec, 0x3f, 0x9a, 0x80, 0x69, 0x19, 0xd3, 0xfa, 0x18, 0xdc, 0xd5, 0xf7, 0x13, 0xf7, 0x98, 0x1b, + 0xb9, 0x84, 0xe2, 0x0e, 0xf4, 0x55, 0x0f, 0x53, 0xbe, 0xea, 0x6f, 0xe4, 0xc3, 0xee, 0x64, 0x47, + 0xf5, 0x3f, 0x2c, 0xc2, 0x42, 0x2a, 0x46, 0x98, 0xe9, 0x90, 0x7d, 0xfe, 0x99, 0xb7, 0x73, 0x0d, + 0x43, 0xd6, 0xf1, 0x17, 0x27, 0xbb, 0x6a, 0x86, 0x89, 0x7c, 0xbe, 0xb7, 0x72, 0x7b, 0xaa, 0xe0, + 0x27, 0xa9, 0x7d, 0x47, 0x74, 0x3d, 0x24, 0xdf, 0xb6, 0xe0, 0x9c, 0xd3, 0xff, 0xd6, 0x83, 0xb4, + 0x75, 0xdd, 0xca, 0xfd, 0x11, 0x89, 0xea, 0x53, 0x52, 0xc8, 0xac, 0x27, 0x35, 0x30, 0x4b, 0x14, + 0xfb, 0xbf, 0x58, 0xf0, 0xe4, 0xc0, 0x68, 0x77, 0x9e, 0x2c, 0x29, 0x48, 0x42, 0xe5, 0x9a, 0x91, + 0x73, 0x4e, 0x0f, 0x7d, 0xef, 0x99, 0xce, 0x6f, 0x93, 0x66, 0x4f, 0x5e, 0x82, 0x39, 0xae, 0x57, + 0xb1, 0xd5, 0x33, 0xa2, 0x5d, 0x79, 0x6d, 0xc3, 0x0d, 0xf8, 0x75, 0xa3, 0x1c, 0x13, 0x58, 0xf6, + 0xb7, 0x2d, 0x58, 0x1a, 0x94, 0x3a, 0x67, 0x08, 0xa3, 0xc2, 0xdf, 0x48, 0xb9, 0xfc, 0x97, 0xfb, + 0x5c, 0xfe, 0x53, 0x66, 0x05, 0xe5, 0xdd, 0x6f, 0x9c, 0xe8, 0x0b, 0x0f, 0xf1, 0x68, 0xff, 0x86, + 0x05, 0x17, 0x07, 0x4c, 0xf8, 0xbe, 0xd0, 0x0f, 0xeb, 0x91, 0x43, 0x3f, 0x26, 0x86, 0x0d, 0xfd, + 0xb0, 0xff, 0xb8, 0x00, 0x8b, 0x52, 0x9e, 0x58, 0xb9, 0x7e, 0x25, 0x11, 0x38, 0xf1, 0x53, 0xa9, + 0xc0, 0x89, 0xf3, 0x69, 0xfc, 0x9f, 0x44, 0x4d, 0x7c, 0xb0, 0xa2, 0x26, 0xfe, 0x6a, 0x02, 0x2e, + 0x64, 0x66, 0xf4, 0x21, 0x5f, 0xcb, 0xd8, 0xbd, 0xee, 0xe4, 0x9c, 0x3a, 0x68, 0xc8, 0xfd, 0x6b, + 0xdc, 0x50, 0x83, 0x5f, 0x35, 0x5d, 0xfc, 0xc5, 0x6e, 0xb4, 0x7b, 0x0a, 0x49, 0x90, 0x46, 0xf4, + 0xf6, 0xb7, 0x7f, 0xa9, 0x00, 0x57, 0x86, 0x25, 0xf4, 0x01, 0x8d, 0x06, 0x0b, 0x13, 0xd1, 0x60, + 0x8f, 0x49, 0xb3, 0x38, 0x95, 0xc0, 0xb0, 0x7f, 0x3a, 0xa9, 0xb7, 0xbd, 0xfe, 0xf1, 0x39, 0xd4, + 0x1d, 0xff, 0x34, 0xd3, 0x3e, 0x55, 0x56, 0xe0, 0x78, 0x29, 0x9c, 0xae, 0x8b, 0xe2, 0x07, 0x47, + 0xe5, 0xb3, 0x71, 0x5e, 0x09, 0x59, 0x88, 0xaa, 0x12, 0xb9, 0x02, 0x33, 0x81, 0x80, 0xaa, 0xf8, + 0x17, 0xe9, 0x28, 0x21, 0xca, 0x50, 0x43, 0xc9, 0x97, 0x0c, 0x75, 0x7d, 0xf2, 0xb4, 0xd2, 0xa7, + 0x9c, 0xe4, 0xff, 0xf1, 0x36, 0xcc, 0x84, 0x2a, 0x63, 0xaf, 0x50, 0x5c, 0x5e, 0x1c, 0x32, 0xac, + 0x8a, 0x9d, 0x9b, 0x55, 0xfa, 0x5e, 0xf1, 0x7d, 0x3a, 0xb9, 0xaf, 0x26, 0x49, 0x6c, 0x7d, 0x64, + 0x15, 0xf6, 0x69, 0xe8, 0x3f, 0xae, 0x92, 0x08, 0xa6, 0xe5, 0x8b, 0x86, 0xf2, 0xe2, 0x6c, 0x2b, + 0xa7, 0x10, 0x0a, 0xe9, 0x60, 0xcb, 0xaf, 0x27, 0x95, 0xe9, 0x44, 0xb1, 0xb2, 0xbf, 0x6f, 0xc1, + 0xac, 0x1c, 0x23, 0x8f, 0x21, 0xbe, 0xec, 0x6e, 0x32, 0xbe, 0xec, 0x6a, 0x2e, 0x2b, 0xd6, 0x80, + 0xe0, 0xb2, 0xbb, 0x30, 0x67, 0xa6, 0x92, 0x23, 0x9f, 0x35, 0x56, 0x5c, 0x6b, 0x9c, 0xe4, 0x4c, + 0x6a, 0x4d, 0x8e, 0x57, 0x63, 0xfb, 0xb7, 0x4b, 0xba, 0x15, 0xf9, 0xd9, 0xd5, 0x1c, 0xf9, 0xd6, + 0x89, 0x23, 0xdf, 0x1c, 0x78, 0x13, 0xf9, 0x0f, 0xbc, 0x5b, 0x30, 0xa3, 0x96, 0x45, 0xa9, 0x3c, + 0x3c, 0x6b, 0x7a, 0xdc, 0x32, 0x0d, 0x84, 0x11, 0x33, 0xa6, 0x0b, 0x3f, 0x83, 0xea, 0x3e, 0xd4, + 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x81, 0xd9, 0x7b, 0x7e, 0xb0, 0xdf, 0xf6, 0x1d, 0x9e, 0x2f, 0x1c, + 0xf2, 0xb8, 0xe4, 0xd5, 0x36, 0x56, 0x11, 0xf6, 0x70, 0x27, 0xa6, 0x8f, 0x26, 0x33, 0x52, 0x81, + 0x85, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0x8c, 0x6c, 0x52, 0xa4, 0x28, 0x56, 0xaa, 0xf5, 0x56, + 0x12, 0x8c, 0x69, 0x7c, 0x6e, 0x2d, 0x09, 0x12, 0xd6, 0x06, 0x99, 0x87, 0xb4, 0x36, 0xfe, 0x60, + 0x4c, 0x5a, 0x30, 0x84, 0xdf, 0x7f, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0x17, 0x61, 0x26, 0x94, 0x79, + 0xe2, 0xf2, 0xf1, 0x0e, 0xd0, 0x67, 0x7b, 0x41, 0x34, 0xee, 0x4a, 0x55, 0x82, 0x9a, 0x21, 0xd9, + 0x84, 0xf3, 0xca, 0x7c, 0x92, 0x78, 0xd3, 0x69, 0x2a, 0x4e, 0x2b, 0x84, 0x19, 0x70, 0xcc, 0xac, + 0xc5, 0x54, 0x39, 0x9e, 0xa2, 0x51, 0x5c, 0xaa, 0x19, 0xf7, 0x50, 0x7c, 0xfe, 0x35, 0x51, 0x42, + 0x4f, 0x8a, 0x92, 0x9c, 0x19, 0x23, 0x4a, 0xb2, 0x0e, 0x17, 0xd2, 0x20, 0x9e, 0x2f, 0x8a, 0xa7, + 0xa8, 0x32, 0xb6, 0xd0, 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa0, 0x14, 0x50, 0x7e, 0xc8, + 0xaa, 0x28, 0x7f, 0xa4, 0x91, 0x3d, 0x2f, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, + 0x34, 0xf8, 0x56, 0x8e, 0x8f, 0x89, 0xca, 0xbe, 0x1f, 0x90, 0xc7, 0xcd, 0xfe, 0x77, 0x0b, 0x70, + 0x26, 0x61, 0x03, 0x22, 0xcf, 0x42, 0x91, 0x27, 0xd0, 0xe2, 0xab, 0xd5, 0x4c, 0xbc, 0xa2, 0x8a, + 0xc6, 0x11, 0x30, 0xf2, 0xcb, 0x16, 0x2c, 0x74, 0x13, 0xf7, 0x10, 0x6a, 0x21, 0x1f, 0xd7, 0xd2, + 0x98, 0x20, 0x6a, 0xa4, 0xdb, 0x4f, 0x32, 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0xf7, 0xe5, 0x36, + 0x0d, 0x38, 0xb6, 0x54, 0xf4, 0x34, 0x89, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, + 0x8d, 0xf3, 0x5c, 0x5d, 0x45, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x0d, 0xe6, 0x65, 0xae, 0xd8, 0x9a, + 0xdf, 0xbc, 0xee, 0x84, 0x7b, 0xf2, 0x84, 0xa3, 0x4f, 0x64, 0x6b, 0x09, 0x28, 0xa6, 0xb0, 0xf9, + 0xb7, 0xc5, 0x09, 0x79, 0x39, 0x81, 0xa9, 0xe4, 0x6b, 0x04, 0x6b, 0x49, 0x30, 0xa6, 0xf1, 0xc9, + 0xf3, 0xc6, 0x36, 0x24, 0x2e, 0xba, 0xf5, 0x6a, 0x90, 0xb1, 0x15, 0x55, 0x60, 0xa1, 0xc7, 0x0f, + 0x84, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, 0xbc, 0x9d, 0x04, 0x63, 0x1a, 0x9f, 0xbc, 0x0a, 0x67, + 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xe2, 0xf6, 0x5b, 0x5f, 0x6e, 0xa2, 0x09, 0xc4, 0x24, 0x2e, 0x79, + 0x1d, 0xce, 0xc6, 0xa9, 0x15, 0x15, 0x01, 0x71, 0x1d, 0xae, 0xf3, 0x7c, 0x55, 0xd2, 0x08, 0xd8, + 0x5f, 0x87, 0xfc, 0x6d, 0x58, 0x34, 0x5a, 0x62, 0xc3, 0x6b, 0xd2, 0xfb, 0x32, 0xfd, 0x1d, 0x7f, + 0x66, 0x66, 0x2d, 0x05, 0xc3, 0x3e, 0x6c, 0xf2, 0x29, 0x98, 0x6f, 0xf8, 0xed, 0x36, 0x5f, 0xe3, + 0x44, 0x26, 0x7c, 0x91, 0xe7, 0x4e, 0x64, 0x04, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x00, 0xf1, + 0x77, 0x98, 0x7a, 0x45, 0x9b, 0xaf, 0x8b, 0xf7, 0xd0, 0x99, 0xc6, 0x71, 0x26, 0x19, 0x3c, 0xf1, + 0x66, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x69, 0xc2, 0x8c, 0x60, 0xd3, 0xf9, 0x3c, 0x9e, 0x6e, 0x4b, + 0x9b, 0x2f, 0x1e, 0x1a, 0x69, 0x1a, 0xc0, 0x94, 0x88, 0x65, 0xc9, 0x27, 0xe1, 0x9d, 0x99, 0x14, + 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, 0xe4, 0x17, 0xa0, 0xb4, 0xa3, 0x5e, 0x48, 0xe0, 0x59, + 0xee, 0xc6, 0xde, 0x17, 0x53, 0x8f, 0x7d, 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x0e, + 0x66, 0xaf, 0xd7, 0x2a, 0x7a, 0x14, 0x9e, 0xe5, 0xbd, 0x3f, 0xc9, 0xaa, 0xa0, 0x09, 0x60, 0x33, + 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0xe8, 0x48, 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0x95, 0x35, 0xd6, 0x97, + 0xce, 0xa5, 0xb0, 0x65, 0x39, 0x6a, 0x0c, 0xf2, 0x36, 0xcc, 0xca, 0xfd, 0x82, 0xaf, 0x4d, 0xe7, + 0x1f, 0x2d, 0x90, 0x19, 0x63, 0x12, 0x68, 0xd2, 0xe3, 0xf7, 0xac, 0x3c, 0x71, 0x3c, 0xbd, 0xd6, + 0x6b, 0xb7, 0x97, 0x2e, 0xf0, 0x75, 0x33, 0xbe, 0x67, 0x8d, 0x41, 0x68, 0xe2, 0x91, 0x17, 0x95, + 0xeb, 0xd1, 0x87, 0x12, 0x17, 0xcf, 0xda, 0xf5, 0x48, 0x2b, 0xdd, 0x03, 0x62, 0x1d, 0x2e, 0x3e, + 0xc4, 0xe7, 0x67, 0x07, 0x96, 0x95, 0xc6, 0xd7, 0x3f, 0x49, 0x96, 0x96, 0x12, 0xa6, 0x92, 0xe5, + 0x3b, 0x03, 0x31, 0xf1, 0x04, 0x2a, 0x64, 0x07, 0x0a, 0x4e, 0x7b, 0x67, 0xe9, 0xc9, 0x3c, 0x54, + 0xd7, 0xca, 0x66, 0x55, 0x8e, 0x28, 0xee, 0x9f, 0x58, 0xd9, 0xac, 0x22, 0x23, 0x4e, 0x5c, 0x98, + 0x74, 0xda, 0x3b, 0xe1, 0xd2, 0x32, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0x9b, 0xd5, 0x10, + 0x39, 0x0b, 0xfb, 0xcb, 0x13, 0xfa, 0xa2, 0x46, 0xe7, 0x1c, 0x7e, 0xd7, 0x9c, 0x40, 0x56, 0x1e, + 0x4f, 0x7a, 0xf7, 0xbd, 0x58, 0x22, 0xf6, 0xbe, 0xcc, 0xe9, 0xd3, 0xd5, 0x4b, 0x46, 0x2e, 0xd9, + 0x9c, 0x92, 0xf9, 0x94, 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xbf, 0x0b, 0xda, 0xe8, 0x97, 0x72, + 0xdb, 0x09, 0xa0, 0xe8, 0x86, 0x91, 0xeb, 0xe7, 0x18, 0xdf, 0x9b, 0x4a, 0x44, 0xcc, 0xc3, 0x07, + 0x38, 0x00, 0x05, 0x2b, 0xc6, 0xd3, 0x6b, 0xb9, 0xde, 0x7d, 0xf9, 0xf9, 0xb7, 0x72, 0xf7, 0xc7, + 0x11, 0x3c, 0x39, 0x00, 0x05, 0x2b, 0x72, 0x57, 0x0c, 0xea, 0x7c, 0x9e, 0x6f, 0xdf, 0xac, 0xa6, + 0xf8, 0x25, 0x07, 0xf7, 0x5d, 0x28, 0x84, 0x1d, 0x57, 0xaa, 0x4b, 0x63, 0xf2, 0xaa, 0x6f, 0x6d, + 0x64, 0xf1, 0xaa, 0x6f, 0x6d, 0x20, 0x63, 0x42, 0xbe, 0x6a, 0x01, 0x38, 0x9d, 0x1d, 0x27, 0x0c, + 0x9d, 0xa6, 0xb6, 0xce, 0x8c, 0xf9, 0xc0, 0x40, 0x45, 0xd3, 0x4b, 0xb1, 0xe6, 0x1e, 0xa8, 0x31, + 0x14, 0x0d, 0xce, 0xe4, 0x1d, 0x98, 0x76, 0xc4, 0x53, 0x66, 0xd2, 0x99, 0x3a, 0x9f, 0xf7, 0xf9, + 0x52, 0x12, 0x70, 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0x77, 0xdd, 0x7d, + 0x69, 0x1c, 0xaa, 0x8f, 0xfd, 0xc6, 0x00, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x4f, + 0x4b, 0x3b, 0x9e, 0xa3, 0x43, 0xe4, 0xf2, 0x09, 0xa4, 0x34, 0x83, 0xee, 0x8c, 0xa7, 0xa5, 0x4d, + 0x46, 0x98, 0xe4, 0x4b, 0x0e, 0x60, 0xca, 0xe1, 0x8f, 0x2c, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x60, + 0x63, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x9f, 0x72, 0x94, 0xdc, 0xc8, 0x6f, 0x58, 0x30, 0x2d, 0xfc, + 0x7c, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x0b, 0xa7, 0x90, 0xd0, 0x5c, 0xfa, 0x20, 0x4b, 0xaf, 0x9d, + 0x8f, 0x6a, 0x27, 0x46, 0x51, 0x7a, 0xa2, 0x17, 0xb2, 0x92, 0x6e, 0xf9, 0x53, 0x30, 0x67, 0x52, + 0x19, 0xc9, 0x0f, 0xf9, 0x47, 0x05, 0x00, 0xde, 0xd0, 0x22, 0x29, 0x46, 0x87, 0x67, 0x5f, 0xdd, + 0xf3, 0x9b, 0xf9, 0xbc, 0x8e, 0x69, 0xe6, 0xb6, 0x00, 0x99, 0x6a, 0x75, 0xcf, 0x6f, 0xa2, 0x64, + 0x42, 0x5a, 0x30, 0xd9, 0x75, 0xa2, 0xbd, 0xfc, 0x13, 0x69, 0xcc, 0x88, 0xe8, 0xd0, 0x68, 0x0f, + 0x39, 0x03, 0xf2, 0x9e, 0x05, 0xd3, 0x22, 0x95, 0x86, 0xba, 0x38, 0x19, 0xdb, 0x81, 0x41, 0xb5, + 0xd9, 0x8a, 0xc8, 0xd7, 0x21, 0x7b, 0x50, 0xeb, 0x38, 0xb2, 0x14, 0x15, 0xdb, 0xe5, 0xf7, 0x2d, + 0x98, 0x33, 0x51, 0x33, 0xba, 0xe9, 0xe7, 0xcc, 0x6e, 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0xef, + 0x16, 0x18, 0xcf, 0x9d, 0xc7, 0xee, 0xd6, 0xd6, 0xd0, 0xee, 0xd6, 0x13, 0x23, 0xba, 0x5b, 0x17, + 0x46, 0x72, 0xb7, 0x9e, 0x1c, 0xdd, 0xdd, 0xba, 0x38, 0xd8, 0xdd, 0xda, 0xfe, 0xa6, 0x05, 0x67, + 0xfb, 0x76, 0x1b, 0xa6, 0x07, 0x07, 0xbe, 0x1f, 0x0d, 0x70, 0x53, 0xc4, 0x18, 0x84, 0x26, 0x1e, + 0x59, 0x87, 0x45, 0xf9, 0xd6, 0x40, 0xbd, 0xdb, 0x76, 0x33, 0x93, 0x9c, 0x6c, 0xa7, 0xe0, 0xd8, + 0x57, 0xc3, 0xfe, 0x5d, 0x0b, 0x66, 0x8d, 0xd0, 0x68, 0xf6, 0x1d, 0x3c, 0x84, 0x5c, 0x8a, 0x11, + 0x7b, 0x95, 0xf1, 0x8b, 0x2a, 0x01, 0x13, 0x77, 0xa6, 0x2d, 0x23, 0x13, 0x75, 0x7c, 0x67, 0xca, + 0x4a, 0x51, 0x42, 0x45, 0x8e, 0x61, 0xda, 0xe5, 0x8d, 0x5e, 0x30, 0x73, 0x0c, 0xd3, 0x2e, 0x72, + 0x08, 0x67, 0xc7, 0x0e, 0x04, 0xd2, 0x13, 0xdf, 0x78, 0xd5, 0xc1, 0x09, 0x22, 0x14, 0x30, 0x72, + 0x09, 0x0a, 0xd4, 0x6b, 0x4a, 0xeb, 0x85, 0x7e, 0x77, 0xf1, 0xaa, 0xd7, 0x44, 0x56, 0x6e, 0xbf, + 0x09, 0x73, 0x75, 0xda, 0x08, 0x68, 0xf4, 0x06, 0x3d, 0x1c, 0xfa, 0x21, 0x47, 0x36, 0xda, 0x53, + 0x0f, 0x39, 0xb2, 0xea, 0xac, 0xdc, 0xfe, 0xe7, 0x16, 0xa4, 0x9e, 0x1e, 0x31, 0xee, 0x4f, 0xac, + 0x81, 0xf7, 0x27, 0xa6, 0xcd, 0x7d, 0xe2, 0x44, 0x9b, 0xfb, 0x0d, 0x20, 0x1d, 0x36, 0x15, 0x12, + 0x0f, 0xed, 0x48, 0xc3, 0x51, 0x9c, 0x88, 0xa1, 0x0f, 0x03, 0x33, 0x6a, 0xd9, 0xff, 0x4c, 0x08, + 0x6b, 0x3e, 0x46, 0xf2, 0xf0, 0x06, 0xe8, 0x41, 0x91, 0x93, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, + 0xfd, 0x09, 0x8d, 0xe2, 0x8e, 0x94, 0x53, 0x9e, 0x73, 0xb3, 0xff, 0x58, 0xc8, 0x6a, 0xbc, 0x56, + 0x32, 0x84, 0xac, 0x9d, 0xa4, 0xac, 0xd7, 0xf3, 0x5a, 0x2b, 0xb3, 0x65, 0x24, 0x2b, 0x00, 0x5d, + 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0x00, 0x91, 0xa2, 0x0c, 0x55, 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0xdf, + 0x60, 0x13, 0x28, 0xf6, 0xc3, 0x24, 0x57, 0xd2, 0xce, 0x95, 0xe9, 0xc9, 0xa1, 0x7d, 0x2b, 0x8d, + 0xb0, 0x81, 0x89, 0x87, 0x84, 0x0d, 0x7c, 0x04, 0xa6, 0x03, 0xbf, 0x4d, 0x2b, 0x81, 0x97, 0x76, + 0x70, 0x41, 0x56, 0x8c, 0x37, 0x51, 0xc1, 0xed, 0x5f, 0xb3, 0x60, 0x31, 0x1d, 0xd7, 0x94, 0xbb, + 0xc7, 0xa7, 0x19, 0x7c, 0x5d, 0x18, 0x3d, 0xf8, 0xda, 0x7e, 0x8f, 0x09, 0x19, 0xb9, 0x8d, 0x7d, + 0xd7, 0x13, 0xf1, 0xca, 0xac, 0xe5, 0x3e, 0x02, 0xd3, 0x54, 0x3e, 0xd5, 0x28, 0x8c, 0xc0, 0x5a, + 0x48, 0xf5, 0x42, 0xa3, 0x82, 0x93, 0x0a, 0x2c, 0xa8, 0xab, 0x2f, 0x65, 0xb9, 0x17, 0x79, 0x16, + 0xb4, 0xa5, 0x70, 0x3d, 0x09, 0xc6, 0x34, 0xbe, 0xfd, 0x25, 0x98, 0x35, 0x36, 0x25, 0xbe, 0x7e, + 0xdf, 0x77, 0x1a, 0x51, 0x7a, 0xdd, 0xbb, 0xca, 0x0a, 0x51, 0xc0, 0xf8, 0x05, 0x83, 0x08, 0xbb, + 0x48, 0xad, 0x7b, 0x32, 0xd8, 0x42, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, 0x7d, 0x95, 0x28, 0x5c, + 0x11, 0x43, 0x56, 0x88, 0x02, 0x66, 0x3f, 0x0f, 0x33, 0x2a, 0x1b, 0x0e, 0x4f, 0x29, 0xa1, 0x8c, + 0xdf, 0x66, 0x4a, 0x09, 0x3f, 0x88, 0x90, 0x43, 0xec, 0xb7, 0x60, 0x46, 0x25, 0xed, 0x79, 0x38, + 0x36, 0x5b, 0x8a, 0x42, 0xcf, 0xbd, 0xee, 0x87, 0x91, 0xca, 0x34, 0x24, 0xee, 0xe7, 0x6e, 0x6e, + 0xf0, 0x32, 0xd4, 0x50, 0xfb, 0x45, 0x58, 0x48, 0xdd, 0xd3, 0x0e, 0x91, 0x7f, 0xe2, 0xf7, 0x0b, + 0x30, 0x67, 0x5e, 0xd7, 0x0d, 0x31, 0x8b, 0x87, 0x5f, 0x1c, 0x33, 0xae, 0xd8, 0x0a, 0x23, 0x5e, + 0xb1, 0x99, 0x77, 0x9a, 0x93, 0xa7, 0x7b, 0xa7, 0x59, 0xcc, 0xe7, 0x4e, 0xd3, 0xb8, 0x7b, 0x9f, + 0x7a, 0x7c, 0x77, 0xef, 0xbf, 0x53, 0x84, 0xf9, 0x64, 0x42, 0xc3, 0x21, 0x7a, 0xf2, 0xf9, 0xbe, + 0x9e, 0x1c, 0xd1, 0xa6, 0x5f, 0x18, 0xd7, 0xa6, 0x3f, 0x39, 0xae, 0x4d, 0xbf, 0xf8, 0x08, 0x36, + 0xfd, 0x7e, 0x8b, 0xfc, 0xd4, 0xd0, 0x16, 0xf9, 0x4f, 0x6b, 0xaf, 0xbc, 0xe9, 0x84, 0x1b, 0x4b, + 0xec, 0x95, 0x47, 0x92, 0xdd, 0xb0, 0xe6, 0x37, 0x33, 0xbd, 0x1b, 0x67, 0x1e, 0x62, 0xbb, 0x0c, + 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, 0x0e, 0x74, 0x2f, 0xc3, 0xac, 0x1c, 0x4f, + 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, 0xe2, 0xf1, 0xb7, 0xae, 0x93, 0x4f, 0x81, + 0xf3, 0x2b, 0x12, 0xf3, 0xad, 0xeb, 0xd4, 0xd3, 0xe1, 0x69, 0x7c, 0xfb, 0x8b, 0x70, 0x21, 0xd3, + 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x4d, 0x89, 0x60, 0x88, 0x91, 0xca, 0x91, 0xbf, 0x7c, + 0x67, 0x20, 0x26, 0x9e, 0x40, 0xc5, 0xfe, 0x4e, 0x01, 0xe6, 0x93, 0x0f, 0x25, 0x92, 0x7b, 0xda, + 0xe8, 0x98, 0x8b, 0xbd, 0x53, 0x90, 0x35, 0x92, 0xe4, 0x0d, 0xbc, 0xac, 0xb8, 0xc7, 0xc7, 0xd7, + 0x8e, 0xce, 0xd8, 0x77, 0x7a, 0x8c, 0xe5, 0x2d, 0x81, 0x64, 0xc7, 0xdf, 0x42, 0x8c, 0xe3, 0xe9, + 0xe4, 0x69, 0x36, 0x77, 0xee, 0x71, 0x88, 0x9b, 0x66, 0x85, 0x06, 0x5b, 0xb6, 0xb7, 0x1c, 0xd0, + 0xc0, 0xdd, 0x75, 0xf5, 0x23, 0xcf, 0x7c, 0xe5, 0x7e, 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x4d, + 0x40, 0xfc, 0x00, 0x3e, 0x7f, 0x4d, 0x2c, 0x34, 0x4e, 0x0e, 0xb2, 0xdb, 0x6e, 0x8c, 0xfb, 0x64, + 0x5f, 0x4c, 0x51, 0x7a, 0x4c, 0x1b, 0x25, 0x98, 0xe0, 0xf8, 0x63, 0x78, 0xf8, 0xde, 0x81, 0x85, + 0x54, 0xfe, 0x86, 0xdc, 0x93, 0x9c, 0xfe, 0xb0, 0x00, 0x25, 0x9d, 0x01, 0x83, 0x7c, 0x32, 0x61, + 0xc6, 0x29, 0x55, 0x3f, 0x6c, 0x3c, 0x75, 0xb3, 0xe7, 0x37, 0x1f, 0x1c, 0x95, 0x17, 0x34, 0x72, + 0xca, 0x24, 0x73, 0x09, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa7, 0xdd, 0xc6, 0x4d, 0x64, 0xe5, 0xe4, + 0x7e, 0xda, 0x8e, 0xb2, 0x95, 0x53, 0xd6, 0x0e, 0x71, 0xa0, 0x19, 0x6c, 0x3f, 0x61, 0xbb, 0xe4, + 0x8e, 0xdf, 0x3c, 0x4c, 0x3f, 0x8d, 0x53, 0xf5, 0x9b, 0x87, 0xc8, 0x21, 0xe4, 0x35, 0x98, 0x8f, + 0xdc, 0x0e, 0xf5, 0x7b, 0x91, 0xf9, 0x60, 0x78, 0x21, 0xbe, 0x7c, 0xdf, 0x4e, 0x40, 0x31, 0x85, + 0xcd, 0x76, 0xd9, 0xbb, 0xa1, 0xef, 0xf1, 0xd4, 0xb5, 0x53, 0xc9, 0x9b, 0xba, 0x1b, 0xf5, 0x37, + 0x6f, 0x72, 0x73, 0x92, 0xc6, 0x60, 0xd8, 0x2e, 0x0f, 0xca, 0x0e, 0xa8, 0xf4, 0x7d, 0x59, 0x8c, + 0xf5, 0x71, 0x51, 0x8e, 0x1a, 0x83, 0xac, 0x0b, 0xda, 0x4c, 0x5a, 0xbe, 0xa3, 0xcc, 0x55, 0xaf, + 0x28, 0xba, 0xac, 0xec, 0xc1, 0xd1, 0x09, 0x86, 0x3e, 0x5d, 0xd3, 0xbe, 0x0d, 0x0b, 0xa9, 0x06, + 0x53, 0xe7, 0x6a, 0x2b, 0xfb, 0x5c, 0x3d, 0xdc, 0x6b, 0x36, 0xff, 0xd2, 0x82, 0xb3, 0x7d, 0x4b, + 0xc0, 0xb0, 0x21, 0x77, 0xe9, 0xcd, 0x68, 0xe2, 0xd1, 0x37, 0xa3, 0xc2, 0x68, 0x9b, 0x51, 0x75, + 0xe7, 0xbb, 0x3f, 0xb8, 0xfc, 0xc4, 0xf7, 0x7e, 0x70, 0xf9, 0x89, 0x3f, 0xf9, 0xc1, 0xe5, 0x27, + 0xde, 0x3b, 0xbe, 0x6c, 0x7d, 0xf7, 0xf8, 0xb2, 0xf5, 0xbd, 0xe3, 0xcb, 0xd6, 0x9f, 0x1c, 0x5f, + 0xb6, 0xfe, 0xf3, 0xf1, 0x65, 0xeb, 0x9b, 0x3f, 0xbc, 0xfc, 0xc4, 0x67, 0x3f, 0x1d, 0x0f, 0xd0, + 0x55, 0x35, 0x40, 0xf9, 0x8f, 0x8f, 0xa9, 0xe1, 0xb8, 0xda, 0xdd, 0x6f, 0xad, 0xb2, 0x01, 0xba, + 0xaa, 0x4b, 0xd4, 0x00, 0xfd, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x3c, 0xb1, 0xba, 0xa7, + 0x9e, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -3824,6 +3827,11 @@ func (m *ALBStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.Ingress) + copy(dAtA[i:], m.Ingress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Ingress))) + i-- + dAtA[i] = 0x22 { size, err := m.StableTargetGroup.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -3877,6 +3885,15 @@ func (m *ALBTrafficRouting) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Ingresses) > 0 { + for iNdEx := len(m.Ingresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Ingresses[iNdEx]) + copy(dAtA[i:], m.Ingresses[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Ingresses[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } if m.StickinessConfig != nil { { size, err := m.StickinessConfig.MarshalToSizedBuffer(dAtA[:i]) @@ -8568,6 +8585,22 @@ func (m *RolloutStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ALBs) > 0 { + for iNdEx := len(m.ALBs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ALBs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xd2 + } + } if m.ALB != nil { { size, err := m.ALB.MarshalToSizedBuffer(dAtA[:i]) @@ -10052,6 +10085,8 @@ func (m *ALBStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.StableTargetGroup.Size() n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Ingress) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -10072,6 +10107,12 @@ func (m *ALBTrafficRouting) Size() (n int) { l = m.StickinessConfig.Size() n += 1 + l + sovGenerated(uint64(l)) } + if len(m.Ingresses) > 0 { + for _, s := range m.Ingresses { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -11855,6 +11896,12 @@ func (m *RolloutStatus) Size() (n int) { l = m.ALB.Size() n += 2 + l + sovGenerated(uint64(l)) } + if len(m.ALBs) > 0 { + for _, e := range m.ALBs { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -12352,6 +12399,7 @@ func (this *ALBStatus) String() string { `LoadBalancer:` + strings.Replace(strings.Replace(this.LoadBalancer.String(), "AwsResourceRef", "AwsResourceRef", 1), `&`, ``, 1) + `,`, `CanaryTargetGroup:` + strings.Replace(strings.Replace(this.CanaryTargetGroup.String(), "AwsResourceRef", "AwsResourceRef", 1), `&`, ``, 1) + `,`, `StableTargetGroup:` + strings.Replace(strings.Replace(this.StableTargetGroup.String(), "AwsResourceRef", "AwsResourceRef", 1), `&`, ``, 1) + `,`, + `Ingress:` + fmt.Sprintf("%v", this.Ingress) + `,`, `}`, }, "") return s @@ -12366,6 +12414,7 @@ func (this *ALBTrafficRouting) String() string { `RootService:` + fmt.Sprintf("%v", this.RootService) + `,`, `AnnotationPrefix:` + fmt.Sprintf("%v", this.AnnotationPrefix) + `,`, `StickinessConfig:` + strings.Replace(this.StickinessConfig.String(), "StickinessConfig", "StickinessConfig", 1) + `,`, + `Ingresses:` + fmt.Sprintf("%v", this.Ingresses) + `,`, `}`, }, "") return s @@ -13694,6 +13743,11 @@ func (this *RolloutStatus) String() string { repeatedStringForConditions += strings.Replace(strings.Replace(f.String(), "RolloutCondition", "RolloutCondition", 1), `&`, ``, 1) + "," } repeatedStringForConditions += "}" + repeatedStringForALBs := "[]ALBStatus{" + for _, f := range this.ALBs { + repeatedStringForALBs += strings.Replace(strings.Replace(f.String(), "ALBStatus", "ALBStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForALBs += "}" s := strings.Join([]string{`&RolloutStatus{`, `Abort:` + fmt.Sprintf("%v", this.Abort) + `,`, `PauseConditions:` + repeatedStringForPauseConditions + `,`, @@ -13720,6 +13774,7 @@ func (this *RolloutStatus) String() string { `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `WorkloadObservedGeneration:` + fmt.Sprintf("%v", this.WorkloadObservedGeneration) + `,`, `ALB:` + strings.Replace(this.ALB.String(), "ALBStatus", "ALBStatus", 1) + `,`, + `ALBs:` + repeatedStringForALBs + `,`, `}`, }, "") return s @@ -14230,6 +14285,38 @@ func (m *ALBStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ingress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ingress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -14431,6 +14518,38 @@ func (m *ALBTrafficRouting) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ingresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ingresses = append(m.Ingresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -29690,6 +29809,40 @@ func (m *RolloutStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 26: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ALBs", 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 + } + m.ALBs = append(m.ALBs, ALBStatus{}) + if err := m.ALBs[len(m.ALBs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex 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 ab5c65258e..22e777df86 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -37,6 +37,8 @@ message ALBStatus { optional AwsResourceRef canaryTargetGroup = 2; optional AwsResourceRef stableTargetGroup = 3; + + optional string ingress = 4; } // ALBTrafficRouting configuration for ALB ingress controller to control traffic routing @@ -50,13 +52,17 @@ message ALBTrafficRouting { // RootService references the service in the ingress to the controller should add the action to optional string rootService = 3; - // AdditionalForwardConfig allows to specify further settings on the ForwaredConfig + // AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller + // +optional + optional string annotationPrefix = 4; + + // StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress` // +optional optional StickinessConfig stickinessConfig = 5; - // AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller + // Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario // +optional - optional string annotationPrefix = 4; + repeated string ingresses = 6; } // AmbassadorTrafficRouting defines the configuration required to use Ambassador as traffic @@ -1480,6 +1486,9 @@ message RolloutStatus { // / ALB keeps information regarding the ALB and TargetGroups optional ALBStatus alb = 25; + + // / ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario + repeated ALBStatus albs = 26; } // RolloutStrategy defines strategy to apply during next rollout diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 79251e03a0..fdb24d4d31 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -168,6 +168,12 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBStatus(ref common.ReferenceCallback) c Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef"), }, }, + "ingress": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -186,7 +192,6 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal "ingress": { SchemaProps: spec.SchemaProps{ Description: "Ingress refers to the name of an `Ingress` resource in the same namespace as the `Rollout`", - Default: "", Type: []string{"string"}, Format: "", }, @@ -206,21 +211,36 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal Format: "", }, }, + "annotationPrefix": { + SchemaProps: spec.SchemaProps{ + Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", + Type: []string{"string"}, + Format: "", + }, + }, "stickinessConfig": { SchemaProps: spec.SchemaProps{ - Description: "AdditionalForwardConfig allows to specify further settings on the ForwaredConfig", + Description: "StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress`", Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StickinessConfig"), }, }, - "annotationPrefix": { + "ingresses": { SchemaProps: spec.SchemaProps{ - Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", - Type: []string{"string"}, - Format: "", + Description: "Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, }, }, }, - Required: []string{"ingress", "servicePort"}, + Required: []string{"servicePort"}, }, }, Dependencies: []string{ @@ -4406,6 +4426,20 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutStatus(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), }, }, + "albs": { + SchemaProps: spec.SchemaProps{ + Description: "/ ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), + }, + }, + }, + }, + }, }, }, }, diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index 6f93585fd9..f2c2dbe7fe 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -335,17 +335,20 @@ type AnalysisRunStrategy struct { // ALBTrafficRouting configuration for ALB ingress controller to control traffic routing type ALBTrafficRouting struct { // Ingress refers to the name of an `Ingress` resource in the same namespace as the `Rollout` - Ingress string `json:"ingress" protobuf:"bytes,1,opt,name=ingress"` + Ingress string `json:"ingress,omitempty" protobuf:"bytes,1,opt,name=ingress"` // ServicePort refers to the port that the Ingress action should route traffic to ServicePort int32 `json:"servicePort" protobuf:"varint,2,opt,name=servicePort"` // RootService references the service in the ingress to the controller should add the action to RootService string `json:"rootService,omitempty" protobuf:"bytes,3,opt,name=rootService"` - // AdditionalForwardConfig allows to specify further settings on the ForwaredConfig - // +optional - StickinessConfig *StickinessConfig `json:"stickinessConfig,omitempty" protobuf:"bytes,5,opt,name=stickinessConfig"` // AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller // +optional AnnotationPrefix string `json:"annotationPrefix,omitempty" protobuf:"bytes,4,opt,name=annotationPrefix"` + // StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress` + // +optional + StickinessConfig *StickinessConfig `json:"stickinessConfig,omitempty" protobuf:"bytes,5,opt,name=stickinessConfig"` + // Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario + // +optional + Ingresses []string `json:"ingresses,omitempty" protobuf:"bytes,6,opt,name=ingresses"` } type StickinessConfig struct { @@ -934,6 +937,8 @@ type RolloutStatus struct { WorkloadObservedGeneration string `json:"workloadObservedGeneration,omitempty" protobuf:"bytes,24,opt,name=workloadObservedGeneration"` /// ALB keeps information regarding the ALB and TargetGroups ALB *ALBStatus `json:"alb,omitempty" protobuf:"bytes,25,opt,name=alb"` + /// ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario + ALBs []ALBStatus `json:"albs,omitempty" protobuf:"bytes,26,opt,name=albs"` } // BlueGreenStatus status fields that only pertain to the blueGreen rollout @@ -1006,6 +1011,7 @@ type ALBStatus struct { LoadBalancer AwsResourceRef `json:"loadBalancer,omitempty" protobuf:"bytes,1,opt,name=loadBalancer"` CanaryTargetGroup AwsResourceRef `json:"canaryTargetGroup,omitempty" protobuf:"bytes,2,opt,name=canaryTargetGroup"` StableTargetGroup AwsResourceRef `json:"stableTargetGroup,omitempty" protobuf:"bytes,3,opt,name=stableTargetGroup"` + Ingress string `json:"ingress,omitempty" protobuf:"bytes,4,opt,name=ingress"` } type AwsResourceRef struct { diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index ed84121b94..34f84f7659 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -56,6 +56,11 @@ func (in *ALBTrafficRouting) DeepCopyInto(out *ALBTrafficRouting) { *out = new(StickinessConfig) **out = **in } + if in.Ingresses != nil { + in, out := &in.Ingresses, &out.Ingresses + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -2343,6 +2348,11 @@ func (in *RolloutStatus) DeepCopyInto(out *RolloutStatus) { *out = new(ALBStatus) **out = **in } + if in.ALBs != nil { + in, out := &in.ALBs, &out.ALBs + *out = make([]ALBStatus, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/apis/rollouts/validation/validation_references.go b/pkg/apis/rollouts/validation/validation_references.go index 85a92eac7e..85040c71c5 100644 --- a/pkg/apis/rollouts/validation/validation_references.go +++ b/pkg/apis/rollouts/validation/validation_references.go @@ -249,14 +249,27 @@ func validateNginxIngress(canary *v1alpha1.CanaryStrategy, ingress *ingressutil. } func validateAlbIngress(canary *v1alpha1.CanaryStrategy, ingress *ingressutil.Ingress, fldPath *field.Path) field.ErrorList { - fldPath = fldPath.Child("alb").Child("ingress") - ingressName := canary.TrafficRouting.ALB.Ingress - serviceName := canary.StableService - if canary.TrafficRouting.ALB.RootService != "" { - serviceName = canary.TrafficRouting.ALB.RootService + ingresses := canary.TrafficRouting.ALB.Ingresses + allErrs := field.ErrorList{} + // If there are multiple ALB ingresses, and one of them is being validated, + // use that ingress name. + if ingresses != nil && slices.Contains(ingresses, ingress.GetName()) { + fldPath = fldPath.Child("alb").Child("ingresses") + serviceName := canary.StableService + ingressName := ingress.GetName() + if canary.TrafficRouting.ALB.RootService != "" { + serviceName = canary.TrafficRouting.ALB.RootService + } + return reportErrors(ingress, serviceName, ingressName, fldPath, allErrs) + } else { + fldPath = fldPath.Child("alb").Child("ingress") + serviceName := canary.StableService + ingressName := canary.TrafficRouting.ALB.Ingress + if canary.TrafficRouting.ALB.RootService != "" { + serviceName = canary.TrafficRouting.ALB.RootService + } + return reportErrors(ingress, serviceName, ingressName, fldPath, allErrs) } - - return reportErrors(ingress, serviceName, ingressName, fldPath, field.ErrorList{}) } func reportErrors(ingress *ingressutil.Ingress, serviceName, ingressName string, fldPath *field.Path, allErrs field.ErrorList) field.ErrorList { @@ -292,6 +305,31 @@ func ValidateRolloutNginxIngressesConfig(r *v1alpha1.Rollout) error { return err } +// ValidateRolloutAlbIngressesConfig checks that only one or the other of the two fields +// (Ingress, Ingresses) is defined on the ALB struct +func ValidateRolloutAlbIngressesConfig(r *v1alpha1.Rollout) error { + fldPath := field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb") + var err error + + // If the traffic strategy isn't canary -> ALB, no need to validate + // fields on ALB struct. + if r.Spec.Strategy.Canary == nil || + r.Spec.Strategy.Canary.TrafficRouting == nil || + r.Spec.Strategy.Canary.TrafficRouting.ALB == nil { + return nil + } + + // If both Ingress and Ingresses are configured or if neither are configured, + // that's an error. It must be one or the other. + if ingressutil.MultipleAlbIngressesConfigured(r) && ingressutil.SingleAlbIngressConfigured(r) { + err = field.InternalError(fldPath, fmt.Errorf("Either Ingress or Ingresses must be configured. Both are configured.")) + } else if !(ingressutil.MultipleAlbIngressesConfigured(r) || ingressutil.SingleAlbIngressConfigured(r)) { + err = field.InternalError(fldPath, fmt.Errorf("Either Ingress or Ingresses must be configured. Neither are configured.")) + } + + return err +} + // ValidateRolloutVirtualServicesConfig checks either VirtualService or VirtualServices configured // It returns an error if both VirtualService and VirtualServices are configured. // Also, returns an error if both are not configured. diff --git a/pkg/apis/rollouts/validation/validation_references_test.go b/pkg/apis/rollouts/validation/validation_references_test.go index 55468838a1..e0597bf8b1 100644 --- a/pkg/apis/rollouts/validation/validation_references_test.go +++ b/pkg/apis/rollouts/validation/validation_references_test.go @@ -250,7 +250,7 @@ func getAnalysisTemplatesWithType() AnalysisTemplatesWithType { } } -func getAlbRollout() *v1alpha1.Rollout { +func getAlbRollout(ingress string) *v1alpha1.Rollout { return &v1alpha1.Rollout{ Spec: v1alpha1.RolloutSpec{ Strategy: v1alpha1.RolloutStrategy{ @@ -258,7 +258,24 @@ func getAlbRollout() *v1alpha1.Rollout { StableService: "stable-service-name", TrafficRouting: &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ - Ingress: "alb-ingress", + Ingress: ingress, + }, + }, + }, + }, + }, + } +} + +func getAlbRolloutMultiIngress(ingressNames []string) *v1alpha1.Rollout { + return &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + StableService: "stable-service-name", + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingresses: ingressNames, }, }, }, @@ -374,7 +391,7 @@ func TestValidateRolloutReferencedResources(t *testing.T) { ServiceWithType: []ServiceWithType{getServiceWithType()}, VirtualServices: nil, } - allErrs := ValidateRolloutReferencedResources(getAlbRollout(), refResources) + allErrs := ValidateRolloutReferencedResources(getAlbRollout("alb-ingress"), refResources) assert.Empty(t, allErrs) } @@ -504,9 +521,139 @@ func TestValidateRolloutReferencedResourcesNginxIngress(t *testing.T) { } } +func TestValidateRolloutReferencedResourcesAlbIngress(t *testing.T) { + stableService := "stable-service" + wrongService := "wrong-stable-service" + stableIngressKey := "spec.strategy.canary.trafficRouting.alb.ingress" + stableIngressesKey := "spec.strategy.canary.trafficRouting.alb.ingresses" + tests := []struct { + name string + multipleIngresses bool + ingresses []string + services []string + expectedErrors [][]string + }{ + { + "Validate single ALB Ingress -- success", + false, + []string{StableIngress}, + []string{stableService}, + [][]string{}, + }, + { + "Validate single ALB Ingress -- failure", + false, + []string{StableIngress}, + []string{wrongService}, + [][]string{{stableIngressKey, StableIngress}}, + }, + { + "Validate multiple ALB Ingresses successfully", + true, + []string{ + StableIngress, + AddStableIngress1, + AddStableIngress2, + }, + []string{ + stableService, + stableService, + stableService, + }, + [][]string{}, + }, + { + "Validate multiple ALB Ingresses -- primary fails", + true, + []string{ + StableIngress, + AddStableIngress1, + AddStableIngress2, + }, + []string{ + wrongService, + stableService, + stableService, + }, + [][]string{{stableIngressesKey, StableIngress}}, + }, + { + "Validate multiple ALB Ingresses -- additional ingress fails", + true, + []string{ + StableIngress, + AddStableIngress1, + AddStableIngress2, + }, + []string{ + stableService, + wrongService, + stableService, + }, + [][]string{{stableIngressesKey, AddStableIngress1}}, + }, + { + "Validate multiple ALB Ingresses -- all ingresses fail fails", + true, + []string{ + StableIngress, + AddStableIngress1, + AddStableIngress2, + }, + []string{ + wrongService, + wrongService, + wrongService, + }, + [][]string{ + {stableIngressesKey, StableIngress}, + {stableIngressesKey, AddStableIngress1}, + {stableIngressesKey, AddStableIngress2}, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + var ingresses []ingressutil.Ingress + for i, service := range test.services { + ingress := extensionsIngress(test.ingresses[i], 80, service) + legacyIngress := ingressutil.NewLegacyIngress(ingress) + ingresses = append(ingresses, *legacyIngress) + } + refResources := ReferencedResources{ + AnalysisTemplatesWithType: []AnalysisTemplatesWithType{getAnalysisTemplatesWithType()}, + Ingresses: ingresses, + ServiceWithType: []ServiceWithType{getServiceWithType()}, + VirtualServices: nil, + } + + var allErrs field.ErrorList + if test.multipleIngresses { + allErrs = ValidateRolloutReferencedResources(getAlbRolloutMultiIngress([]string{StableIngress, AddStableIngress1, AddStableIngress2}), refResources) + } else { + allErrs = ValidateRolloutReferencedResources(getAlbRollout(StableIngress), refResources) + } + + if len(test.expectedErrors) > 0 { + assert.Len(t, allErrs, len(test.expectedErrors), "Errors should be present.") + for i, e := range test.expectedErrors { + assert.Equal(t, field.ErrorType("FieldValueInvalid"), allErrs[i].Type, "Should be bad service name for ingress") + assert.Equal(t, e[0], allErrs[i].Field, "Bad service name for ingress") + assert.Equal(t, e[1], allErrs[i].BadValue, "Bad service name for ingress") + } + } else { + assert.Empty(t, allErrs) + } + }) + } +} + func TestValidateAnalysisTemplatesWithType(t *testing.T) { t.Run("failure - invalid argument", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") templates := getAnalysisTemplatesWithType() templates.AnalysisTemplates[0].Spec.Args = append(templates.AnalysisTemplates[0].Spec.Args, v1alpha1.Argument{Name: "invalid"}) allErrs := ValidateAnalysisTemplatesWithType(rollout, templates) @@ -516,7 +663,7 @@ func TestValidateAnalysisTemplatesWithType(t *testing.T) { }) t.Run("success", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") templates := getAnalysisTemplatesWithType() templates.AnalysisTemplates[0].Spec.Args = append(templates.AnalysisTemplates[0].Spec.Args, v1alpha1.Argument{Name: "valid"}) templates.Args = []v1alpha1.AnalysisRunArgument{{Name: "valid", Value: "true"}} @@ -525,7 +672,7 @@ func TestValidateAnalysisTemplatesWithType(t *testing.T) { }) t.Run("failure - duplicate metrics", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") templates := getAnalysisTemplatesWithType() templates.AnalysisTemplates[0].Spec.Args = append(templates.AnalysisTemplates[0].Spec.Args, v1alpha1.Argument{Name: "metric1-name", Value: pointer.StringPtr("true")}) templates.AnalysisTemplates[0].Spec.Args[0] = v1alpha1.Argument{Name: "valid", Value: pointer.StringPtr("true")} @@ -534,7 +681,7 @@ func TestValidateAnalysisTemplatesWithType(t *testing.T) { }) t.Run("failure - duplicate MeasurementRetention", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") rollout.Spec.Strategy.Canary.Steps = append(rollout.Spec.Strategy.Canary.Steps, v1alpha1.CanaryStep{ Analysis: &v1alpha1.RolloutAnalysis{ Templates: []v1alpha1.RolloutAnalysisTemplate{ @@ -570,14 +717,14 @@ func TestValidateAnalysisTemplatesWithType(t *testing.T) { func TestValidateAnalysisTemplateWithType(t *testing.T) { t.Run("validate analysisTemplate - success", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") templates := getAnalysisTemplatesWithType() allErrs := ValidateAnalysisTemplateWithType(rollout, templates.AnalysisTemplates[0], nil, templates.TemplateType, GetAnalysisTemplateWithTypeFieldPath(templates.TemplateType, templates.CanaryStepIndex)) assert.Empty(t, allErrs) }) t.Run("validate inline clusterAnalysisTemplate - failure", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") count := intstr.FromInt(0) template := getAnalysisTemplatesWithType() template.ClusterAnalysisTemplates[0].Spec.Metrics[0].Count = &count @@ -589,7 +736,7 @@ func TestValidateAnalysisTemplateWithType(t *testing.T) { }) t.Run("validate inline analysisTemplate argument - success", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") template := getAnalysisTemplatesWithType() template.AnalysisTemplates[0].Spec.Args = []v1alpha1.Argument{ { @@ -602,7 +749,7 @@ func TestValidateAnalysisTemplateWithType(t *testing.T) { }) t.Run("validate background analysisTemplate - failure", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") template := getAnalysisTemplatesWithType() template.TemplateType = BackgroundAnalysis template.AnalysisTemplates[0].Spec.Args = []v1alpha1.Argument{ @@ -632,7 +779,7 @@ func TestValidateAnalysisTemplateWithType(t *testing.T) { // verify background analysis matches the arguments in rollout spec t.Run("validate background analysisTemplate - success", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") templates := getAnalysisTemplatesWithType() templates.TemplateType = BackgroundAnalysis @@ -671,7 +818,7 @@ func TestValidateAnalysisTemplateWithType(t *testing.T) { // verify background analysis does not care about a metric that runs indefinitely t.Run("validate background analysisTemplate - success", func(t *testing.T) { - rollout := getAlbRollout() + rollout := getAlbRollout("alb-ingress") count := intstr.FromInt(0) templates := getAnalysisTemplatesWithType() templates.TemplateType = BackgroundAnalysis @@ -685,7 +832,7 @@ func TestValidateAnalysisTemplateWithType(t *testing.T) { func TestValidateAlbIngress(t *testing.T) { t.Run("validate alb ingress - success", func(t *testing.T) { ingress := ingressutil.NewLegacyIngress(getIngress()) - allErrs := ValidateIngress(getAlbRollout(), ingress) + allErrs := ValidateIngress(getAlbRollout("alb-ingress"), ingress) assert.Empty(t, allErrs) }) @@ -693,7 +840,7 @@ func TestValidateAlbIngress(t *testing.T) { ingress := getIngress() ingress.Spec.Rules[0].HTTP.Paths[0].Backend.ServiceName = "not-stable-service" i := ingressutil.NewLegacyIngress(ingress) - allErrs := ValidateIngress(getAlbRollout(), i) + allErrs := ValidateIngress(getAlbRollout("alb-ingress"), i) expectedErr := field.Invalid(field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb", "ingress"), ingress.Name, "ingress `alb-ingress` has no rules using service stable-service-name backend") assert.Equal(t, expectedErr.Error(), allErrs[0].Error()) }) @@ -762,17 +909,80 @@ func TestValidateRolloutNginxIngressesConfig(t *testing.T) { } } +func TestValidateRolloutAlbIngressesConfig(t *testing.T) { + var emptyIngress string + var emptyIngresses []string + stableIngress := "stable-ingress" + stableIngresses := []string{"stable-ingress", "additional-stable-ingress"} + fldPath := field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb") + failureCase1 := field.InternalError(fldPath, fmt.Errorf("Either Ingress or Ingresses must be configured. Neither are configured.")) + failureCase2 := field.InternalError(fldPath, fmt.Errorf("Either Ingress or Ingresses must be configured. Both are configured.")) + + tests := []struct { + name string + Ingress string + Ingresses []string + expected error + }{ + { + "No ingress configured", + emptyIngress, + emptyIngresses, + failureCase1, + }, + { + "Both ingresses configured", + stableIngress, + stableIngresses, + failureCase2, + }, + { + "Just Ingress configured", + stableIngress, + emptyIngresses, + nil, + }, + { + "Just Ingresses configured", + emptyIngress, + stableIngresses, + nil, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ro := &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingress: test.Ingress, + Ingresses: test.Ingresses, + }, + }, + }, + }, + }, + } + + assert.Equal(t, test.expected, ValidateRolloutAlbIngressesConfig(ro)) + }) + } +} + func TestValidateService(t *testing.T) { t.Run("validate service - success", func(t *testing.T) { svc := getServiceWithType() - allErrs := ValidateService(svc, getAlbRollout()) + allErrs := ValidateService(svc, getAlbRollout("alb-ingress")) assert.Empty(t, allErrs) }) t.Run("validate service - failure", func(t *testing.T) { svc := getServiceWithType() svc.Service.Annotations = map[string]string{v1alpha1.ManagedByRolloutsKey: "not-rollout-name"} - allErrs := ValidateService(svc, getAlbRollout()) + allErrs := ValidateService(svc, getAlbRollout("alb-ingress")) assert.Len(t, allErrs, 1) expectedErr := field.Invalid(GetServiceWithTypeFieldPath(svc.Type), svc.Service.Name, "Service \"stable-service-name\" is managed by another Rollout") assert.Equal(t, expectedErr.Error(), allErrs[0].Error()) @@ -781,7 +991,7 @@ func TestValidateService(t *testing.T) { t.Run("validate service with unmatch label - failure", func(t *testing.T) { svc := getServiceWithType() svc.Service.Spec.Selector = map[string]string{"app": "unmatch-rollout-label"} - allErrs := ValidateService(svc, getAlbRollout()) + allErrs := ValidateService(svc, getAlbRollout("alb-ingress")) assert.Len(t, allErrs, 1) expectedErr := field.Invalid(GetServiceWithTypeFieldPath(svc.Type), svc.Service.Name, "Service \"stable-service-name\" has unmatch label \"app\" in rollout") assert.Equal(t, expectedErr.Error(), allErrs[0].Error()) @@ -790,7 +1000,7 @@ func TestValidateService(t *testing.T) { t.Run("validate service with Rollout label - success", func(t *testing.T) { svc := getServiceWithType() svc.Service.Spec.Selector = map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "123-456"} - allErrs := ValidateService(svc, getAlbRollout()) + allErrs := ValidateService(svc, getAlbRollout("alb-ingress")) assert.Empty(t, allErrs) }) } @@ -1135,7 +1345,7 @@ spec: refResources := ReferencedResources{ AppMeshResources: []k8sunstructured.Unstructured{*obj}, } - errList := ValidateRolloutReferencedResources(getAlbRollout(), refResources) + errList := ValidateRolloutReferencedResources(getAlbRollout("alb-ingress"), refResources) assert.NotNil(t, errList) assert.Len(t, errList, 1) assert.Equal(t, errList[0].Detail, "Expected object kind to be VirtualRouter but is VirtualService") diff --git a/rollout/controller.go b/rollout/controller.go index c7e51611c2..b5c51914ae 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -512,6 +512,7 @@ func (c *Controller) newRolloutContext(rollout *v1alpha1.Rollout) (*rolloutConte newStatus: v1alpha1.RolloutStatus{ RestartedAt: rollout.Status.RestartedAt, ALB: rollout.Status.ALB, + ALBs: rollout.Status.ALBs, }, pauseContext: &pauseContext{ rollout: rollout, @@ -579,12 +580,18 @@ func (c *rolloutContext) getRolloutReferencedResources() (*validation.Referenced } refResources.AnalysisTemplatesWithType = *analysisTemplates - // // Validate Rollout Nginx Ingress Controller before referencing + // Validate Rollout Nginx Ingress Controller before referencing err = validation.ValidateRolloutNginxIngressesConfig(c.rollout) if err != nil { return nil, err } + // Validate Rollout ALB Ingress Controller before referencing + err = validation.ValidateRolloutAlbIngressesConfig(c.rollout) + if err != nil { + return nil, err + } + ingresses, err := c.getReferencedIngresses() if err != nil { return nil, err @@ -853,14 +860,27 @@ func (c *rolloutContext) getReferencedNginxIngresses(canary *v1alpha1.CanaryStra return &ingresses, nil } -// return nil, field.Invalid(fldPath.Child("alb", "ingress"), canary.TrafficRouting.ALB.Ingress, err.Error()) func (c *rolloutContext) getReferencedALBIngresses(canary *v1alpha1.CanaryStrategy) (*[]ingressutil.Ingress, error) { ingresses := []ingressutil.Ingress{} - ingress, err := c.ingressWrapper.GetCached(c.rollout.Namespace, canary.TrafficRouting.ALB.Ingress) - if err != nil { - return handleCacheError("alb", []string{"ingress"}, canary.TrafficRouting.ALB.Ingress, err) + + // The rollout resource manages more than 1 ingress. + if canary.TrafficRouting.ALB.Ingresses != nil { + for _, ing := range canary.TrafficRouting.ALB.Ingresses { + ingress, err := c.ingressWrapper.GetCached(c.rollout.Namespace, ing) + if err != nil { + return handleCacheError("alb", []string{"ingresses"}, canary.TrafficRouting.ALB.Ingresses, err) + } + ingresses = append(ingresses, *ingress) + } + } else { + // The rollout resource manages only 1 ingress. + ingress, err := c.ingressWrapper.GetCached(c.rollout.Namespace, canary.TrafficRouting.ALB.Ingress) + if err != nil { + return handleCacheError("alb", []string{"ingress"}, canary.TrafficRouting.ALB.Ingress, err) + } + ingresses = append(ingresses, *ingress) } - ingresses = append(ingresses, *ingress) + return &ingresses, nil } diff --git a/rollout/controller_test.go b/rollout/controller_test.go index 00f811617c..d2c78d70c1 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -1705,6 +1705,98 @@ func TestGetReferencedIngressesALB(t *testing.T) { }) } +func TestGetReferencedIngressesALBMultiIngress(t *testing.T) { + primaryIngress := "alb-ingress-name" + addIngress := "alb-ingress-additional" + ingresses := []string{primaryIngress, addIngress} + f := newFixture(t) + defer f.Close() + r := newCanaryRollout("rollout", 1, nil, nil, nil, intstr.FromInt(0), intstr.FromInt(1)) + r.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingresses: ingresses, + }, + } + r.Namespace = metav1.NamespaceDefault + defer f.Close() + + tests := []struct { + name string + ingresses []*ingressutil.Ingress + expectedErr *field.Error + }{ + { + "get referenced ALB ingress - fail first ingress when both missing", + []*ingressutil.Ingress{}, + field.Invalid(field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb", "ingresses"), ingresses, fmt.Sprintf("ingress.extensions \"%s\" not found", primaryIngress)), + }, + { + "get referenced ALB ingress - fail on primary when additional present", + []*ingressutil.Ingress{ + ingressutil.NewLegacyIngress(&extensionsv1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: addIngress, + Namespace: metav1.NamespaceDefault, + }, + }), + }, + field.Invalid(field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb", "ingresses"), ingresses, fmt.Sprintf("ingress.extensions \"%s\" not found", primaryIngress)), + }, + { + "get referenced ALB ingress - fail on secondary when only secondary missing", + []*ingressutil.Ingress{ + ingressutil.NewLegacyIngress(&extensionsv1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: primaryIngress, + Namespace: metav1.NamespaceDefault, + }, + }), + }, + field.Invalid(field.NewPath("spec", "strategy", "canary", "trafficRouting", "alb", "ingresses"), ingresses, fmt.Sprintf("ingress.extensions \"%s\" not found", addIngress)), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + // clear fixture + f.ingressLister = []*ingressutil.Ingress{} + for _, ing := range test.ingresses { + f.ingressLister = append(f.ingressLister, ing) + } + c, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := c.newRolloutContext(r) + assert.NoError(t, err) + _, err = roCtx.getReferencedIngresses() + assert.Equal(t, test.expectedErr.Error(), err.Error()) + }) + } + + t.Run("get referenced ALB ingress - success", func(t *testing.T) { + // clear fixture + f.ingressLister = []*ingressutil.Ingress{} + ingress := &extensionsv1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: primaryIngress, + Namespace: metav1.NamespaceDefault, + }, + } + ingressAdditional := &extensionsv1beta1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Name: addIngress, + Namespace: metav1.NamespaceDefault, + }, + } + f.ingressLister = append(f.ingressLister, ingressutil.NewLegacyIngress(ingress)) + f.ingressLister = append(f.ingressLister, ingressutil.NewLegacyIngress(ingressAdditional)) + c, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := c.newRolloutContext(r) + assert.NoError(t, err) + ingresses, err := roCtx.getReferencedIngresses() + assert.NoError(t, err) + assert.Len(t, *ingresses, 2, "Should find the main ingress and the additional ingress") + }) +} + func TestGetReferencedIngressesNginx(t *testing.T) { primaryIngress := "nginx-ingress-name" f := newFixture(t) diff --git a/rollout/trafficrouting/alb/alb.go b/rollout/trafficrouting/alb/alb.go index abe615638f..b1b9ff0f25 100644 --- a/rollout/trafficrouting/alb/alb.go +++ b/rollout/trafficrouting/alb/alb.go @@ -24,6 +24,7 @@ import ( jsonutil "github.com/argoproj/argo-rollouts/utils/json" logutil "github.com/argoproj/argo-rollouts/utils/log" "github.com/argoproj/argo-rollouts/utils/record" + elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types" ) const ( @@ -75,43 +76,54 @@ func (r *Reconciler) Type() string { // SetWeight modifies ALB Ingress resources to reach desired state func (r *Reconciler) SetWeight(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) error { - ctx := context.TODO() - rollout := r.cfg.Rollout - ingressName := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress - ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) - if err != nil { - return err - } - actionService := rollout.Spec.Strategy.Canary.StableService - if rollout.Spec.Strategy.Canary.TrafficRouting.ALB.RootService != "" { - actionService = rollout.Spec.Strategy.Canary.TrafficRouting.ALB.RootService - } - port := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort - if !ingressutil.HasRuleWithService(ingress, actionService) { - return fmt.Errorf("ingress does not have service `%s` in rules", actionService) + if ingresses := r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses; ingresses != nil { + return r.SetWeightPerIngress(desiredWeight, ingresses, additionalDestinations...) + } else { + return r.SetWeightPerIngress(desiredWeight, []string{r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress}, additionalDestinations...) } +} - desiredAnnotations, err := getDesiredAnnotations(ingress, rollout, port, desiredWeight, additionalDestinations...) - if err != nil { - return err - } - desiredIngress := ingressutil.NewIngressWithAnnotations(ingress.Mode(), desiredAnnotations) - patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations()) - if err != nil { - return nil - } - if !modified { - r.log.Info("no changes to the ALB Ingress") - return nil - } - r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") - r.log.WithField("desiredWeight", desiredWeight).Info("updating ALB Ingress") - r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` to desiredWeight '%d'", ingressName, desiredWeight) +// SetWeightPerIngress modifies each ALB Ingress resource to reach desired state in the scenario of a rollout +func (r *Reconciler) SetWeightPerIngress(desiredWeight int32, ingresses []string, additionalDestinations ...v1alpha1.WeightDestination) error { + for _, ingress := range ingresses { + ctx := context.TODO() + rollout := r.cfg.Rollout + ingressName := ingress + ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) + if err != nil { + return err + } + actionService := rollout.Spec.Strategy.Canary.StableService + if rollout.Spec.Strategy.Canary.TrafficRouting.ALB.RootService != "" { + actionService = rollout.Spec.Strategy.Canary.TrafficRouting.ALB.RootService + } + port := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort + if !ingressutil.HasRuleWithService(ingress, actionService) { + return fmt.Errorf("ingress does not have service `%s` in rules", actionService) + } - _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) - if err != nil { - r.log.WithField("err", err.Error()).Error("error patching alb ingress") - return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) + desiredAnnotations, err := getDesiredAnnotations(ingress, rollout, port, desiredWeight, additionalDestinations...) + if err != nil { + return err + } + desiredIngress := ingressutil.NewIngressWithAnnotations(ingress.Mode(), desiredAnnotations) + patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations()) + if err != nil { + return nil + } + if !modified { + r.log.Info("no changes to the ALB Ingress") + return nil + } + r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") + r.log.WithField("desiredWeight", desiredWeight).Info("updating ALB Ingress") + r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` to desiredWeight '%d'", ingressName, desiredWeight) + + _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) + if err != nil { + r.log.WithField("err", err.Error()).Error("error patching alb ingress") + return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) + } } return nil } @@ -120,45 +132,57 @@ func (r *Reconciler) SetHeaderRoute(headerRoute *v1alpha1.SetHeaderRoute) error if headerRoute == nil { return nil } - ctx := context.TODO() - rollout := r.cfg.Rollout - ingressName := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress - action := headerRoute.Name - port := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort - ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) - if err != nil { - return err + if ingresses := r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses; ingresses != nil { + return r.SetHeaderRoutePerIngress(headerRoute, ingresses) + } else { + return r.SetHeaderRoutePerIngress(headerRoute, []string{r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress}) } - desiredAnnotations, err := getDesiredHeaderAnnotations(ingress, rollout, port, headerRoute) - if err != nil { - return err - } - desiredIngress := ingressutil.NewIngressWithSpecAndAnnotations(ingress, desiredAnnotations) - hasRule := ingressutil.HasRuleWithService(ingress, action) - if hasRule && headerRoute.Match == nil { - desiredIngress.RemovePathByServiceName(action) - } - if !hasRule && headerRoute.Match != nil { - desiredIngress.CreateAnnotationBasedPath(action) - } - desiredIngress.SortHttpPaths(rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes) - patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations(), ingressutil.WithSpec()) - if err != nil { - return nil - } - if !modified { - r.log.Info("no changes to the ALB Ingress for header routing") - return nil - } - r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") - r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` to headerRoute '%d'", ingressName, headerRoute) +} - _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) - if err != nil { - r.log.WithField("err", err.Error()).Error("error patching alb ingress") - return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) +func (r *Reconciler) SetHeaderRoutePerIngress(headerRoute *v1alpha1.SetHeaderRoute, ingresses []string) error { + for _, ingress := range ingresses { + ctx := context.TODO() + rollout := r.cfg.Rollout + ingressName := ingress + action := headerRoute.Name + port := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort + + ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) + if err != nil { + return err + } + + desiredAnnotations, err := getDesiredHeaderAnnotations(ingress, rollout, port, headerRoute) + if err != nil { + return err + } + desiredIngress := ingressutil.NewIngressWithSpecAndAnnotations(ingress, desiredAnnotations) + hasRule := ingressutil.HasRuleWithService(ingress, action) + if hasRule && headerRoute.Match == nil { + desiredIngress.RemovePathByServiceName(action) + } + if !hasRule && headerRoute.Match != nil { + desiredIngress.CreateAnnotationBasedPath(action) + } + desiredIngress.SortHttpPaths(rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes) + patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations(), ingressutil.WithSpec()) + if err != nil { + return nil + } + if !modified { + r.log.Info("no changes to the ALB Ingress for header routing") + return nil + } + r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") + r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` to headerRoute '%d'", ingressName, headerRoute) + + _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) + if err != nil { + r.log.WithField("err", err.Error()).Error("error patching alb ingress") + return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) + } } return nil } @@ -174,6 +198,7 @@ func (r *Reconciler) getShouldVerifyWeightCfg() bool { func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) (*bool, error) { if !r.getShouldVerifyWeightCfg() { r.cfg.Status.ALB = nil + r.cfg.Status.ALBs = nil return nil, nil } @@ -182,7 +207,7 @@ func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations .. // installed in the cluster we want to actually run the rest of the function, so we do not return if // r.cfg.Rollout.Status.ALB is nil. However, if we should not verify, and we have already updated the status once // we return early to avoid calling AWS apis. - if r.cfg.Rollout.Status.ALB != nil { + if r.cfg.Rollout.Status.ALBs != nil || r.cfg.Rollout.Status.ALB != nil { return nil, nil } } @@ -190,106 +215,135 @@ func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations .. if r.cfg.Status.ALB == nil { r.cfg.Status.ALB = &v1alpha1.ALBStatus{} } - - ctx := context.TODO() - rollout := r.cfg.Rollout - ingressName := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress - ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) - if err != nil { - return pointer.BoolPtr(false), err - } - resourceIDToDest := map[string]v1alpha1.WeightDestination{} - - stableService, canaryService := trafficrouting.GetStableAndCanaryServices(rollout) - canaryResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), canaryService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) - stableResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), stableService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) - - for _, dest := range additionalDestinations { - resourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), dest.ServiceName, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) - resourceIDToDest[resourceID] = dest - } - - loadBalancerStatus := ingress.GetLoadBalancerStatus() - if len(loadBalancerStatus.Ingress) == 0 { - r.log.Infof("LoadBalancer not yet allocated") + albsCount := len(r.cfg.Status.ALBs) + if ingresses := r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses; len(ingresses) > 0 { + if albsCount == 0 || albsCount != len(ingresses) { + r.cfg.Status.ALBs = make([]v1alpha1.ALBStatus, len(ingresses)) + } + return r.VerifyWeightPerIngress(desiredWeight, ingresses, additionalDestinations...) + } else { + if albsCount == 0 || albsCount != 1 { + r.cfg.Status.ALBs = make([]v1alpha1.ALBStatus, 1) + } + return r.VerifyWeightPerIngress(desiredWeight, []string{r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress}, additionalDestinations...) } +} - numVerifiedWeights := 0 - for _, lbIngress := range loadBalancerStatus.Ingress { - if lbIngress.Hostname == "" { - continue - } - lb, err := r.aws.FindLoadBalancerByDNSName(ctx, lbIngress.Hostname) +func (r *Reconciler) VerifyWeightPerIngress(desiredWeight int32, ingresses []string, additionalDestinations ...v1alpha1.WeightDestination) (*bool, error) { + var numVerifiedWeights int + numVerifiedWeights = 0 + for i, ingress := range ingresses { + ctx := context.TODO() + rollout := r.cfg.Rollout + ingressName := ingress + ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) if err != nil { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifyErrorReason}, conditions.TargetGroupVerifyErrorMessage, canaryService, "unknown", err.Error()) - return pointer.BoolPtr(false), err + return pointer.Bool(false), err } - if lb == nil || lb.LoadBalancerArn == nil { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.LoadBalancerNotFoundReason}, conditions.LoadBalancerNotFoundMessage, lbIngress.Hostname) - return pointer.BoolPtr(false), nil + resourceIDToDest := map[string]v1alpha1.WeightDestination{} + + stableService, canaryService := trafficrouting.GetStableAndCanaryServices(rollout) + canaryResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), canaryService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) + stableResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), stableService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) + + for _, dest := range additionalDestinations { + resourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), dest.ServiceName, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) + resourceIDToDest[resourceID] = dest } - r.cfg.Status.ALB.LoadBalancer.Name = *lb.LoadBalancerName - r.cfg.Status.ALB.LoadBalancer.ARN = *lb.LoadBalancerArn - if lbArnParts := strings.Split(*lb.LoadBalancerArn, "/"); len(lbArnParts) > 2 { - r.cfg.Status.ALB.LoadBalancer.FullName = strings.Join(lbArnParts[2:], "/") - } else { - r.cfg.Status.ALB.LoadBalancer.FullName = "" - r.log.Errorf("error parsing load balancer arn: '%s'", *lb.LoadBalancerArn) + loadBalancerStatus := ingress.GetLoadBalancerStatus() + if len(loadBalancerStatus.Ingress) == 0 { + r.log.Infof("LoadBalancer not yet allocated") } - lbTargetGroups, err := r.aws.GetTargetGroupMetadata(ctx, *lb.LoadBalancerArn) - if err != nil { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifyErrorReason}, conditions.TargetGroupVerifyErrorMessage, canaryService, "unknown", err.Error()) - return pointer.BoolPtr(false), err - } - logCtx := r.log.WithField("lb", *lb.LoadBalancerArn) - for _, tg := range lbTargetGroups { - if tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID] == canaryResourceID { - r.cfg.Status.ALB.CanaryTargetGroup.Name = *tg.TargetGroupName - r.cfg.Status.ALB.CanaryTargetGroup.ARN = *tg.TargetGroupArn - if tgArnParts := strings.Split(*tg.TargetGroupArn, "/"); len(tgArnParts) > 1 { - r.cfg.Status.ALB.CanaryTargetGroup.FullName = strings.Join(tgArnParts[1:], "/") - } else { - r.cfg.Status.ALB.CanaryTargetGroup.FullName = "" - r.log.Errorf("error parsing canary target group arn: '%s'", *tg.TargetGroupArn) - } - if tg.Weight != nil { - logCtx := logCtx.WithField("tg", *tg.TargetGroupArn) - logCtx.Infof("canary weight of %s (desired: %d, current: %d)", canaryResourceID, desiredWeight, *tg.Weight) - verified := *tg.Weight == desiredWeight - if verified { - numVerifiedWeights += 1 - r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedWeightsMessage, canaryService, *tg.TargetGroupArn, desiredWeight) - } else { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupUnverifiedReason}, conditions.TargetGroupUnverifiedWeightsMessage, canaryService, *tg.TargetGroupArn, desiredWeight, *tg.Weight) - } - } - } else if dest, ok := resourceIDToDest[tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID]]; ok { + for _, lbIngress := range loadBalancerStatus.Ingress { + if lbIngress.Hostname == "" { + continue + } + lb, err := r.aws.FindLoadBalancerByDNSName(ctx, lbIngress.Hostname) + if err != nil { + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifyErrorReason}, conditions.TargetGroupVerifyErrorMessage, canaryService, "unknown", err.Error()) + return pointer.Bool(false), err + } + if lb == nil || lb.LoadBalancerArn == nil { + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.LoadBalancerNotFoundReason}, conditions.LoadBalancerNotFoundMessage, lbIngress.Hostname) + return pointer.Bool(false), nil + } + + r.cfg.Status.ALBs[i].Ingress = ingressName + r.cfg.Status.ALB.Ingress = ingressName + updateLoadBalancerStatus(&r.cfg.Status.ALBs[i], lb, r.log) + updateLoadBalancerStatus(r.cfg.Status.ALB, lb, r.log) + + lbTargetGroups, err := r.aws.GetTargetGroupMetadata(ctx, *lb.LoadBalancerArn) + if err != nil { + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifyErrorReason}, conditions.TargetGroupVerifyErrorMessage, canaryService, "unknown", err.Error()) + return pointer.Bool(false), err + } + logCtx := r.log.WithField("lb", *lb.LoadBalancerArn) + for _, tg := range lbTargetGroups { + updateTargetGroupStatus(&r.cfg.Status.ALBs[i], &tg, canaryResourceID, stableResourceID, r.log) + updateTargetGroupStatus(r.cfg.Status.ALB, &tg, canaryResourceID, stableResourceID, r.log) if tg.Weight != nil { - logCtx := logCtx.WithField("tg", *tg.TargetGroupArn) - logCtx.Infof("%s weight of %s (desired: %d, current: %d)", dest.ServiceName, tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID], dest.Weight, *tg.Weight) - verified := *tg.Weight == dest.Weight - if verified { - numVerifiedWeights += 1 - r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedWeightsMessage, dest.ServiceName, *tg.TargetGroupArn, dest.Weight) - } else { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupUnverifiedReason}, conditions.TargetGroupUnverifiedWeightsMessage, dest.ServiceName, *tg.TargetGroupArn, dest.Weight, *tg.Weight) + if tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID] == canaryResourceID { + logCtx := logCtx.WithField("tg", *tg.TargetGroupArn) + logCtx.Infof("canary weight of %s (desired: %d, current: %d)", canaryResourceID, desiredWeight, *tg.Weight) + verified := *tg.Weight == desiredWeight + if verified { + numVerifiedWeights += 1 + r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedWeightsMessage, canaryService, *tg.TargetGroupArn, desiredWeight) + } else { + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupUnverifiedReason}, conditions.TargetGroupUnverifiedWeightsMessage, canaryService, *tg.TargetGroupArn, desiredWeight, *tg.Weight) + } + } else if dest, ok := resourceIDToDest[tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID]]; ok { + logCtx := logCtx.WithField("tg", *tg.TargetGroupArn) + logCtx.Infof("%s weight of %s (desired: %d, current: %d)", dest.ServiceName, tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID], dest.Weight, *tg.Weight) + verified := *tg.Weight == dest.Weight + if verified { + numVerifiedWeights += 1 + r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedWeightsMessage, dest.ServiceName, *tg.TargetGroupArn, dest.Weight) + } else { + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupUnverifiedReason}, conditions.TargetGroupUnverifiedWeightsMessage, dest.ServiceName, *tg.TargetGroupArn, dest.Weight, *tg.Weight) + } } } - } else if tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID] == stableResourceID { - r.cfg.Status.ALB.StableTargetGroup.Name = *tg.TargetGroupName - r.cfg.Status.ALB.StableTargetGroup.ARN = *tg.TargetGroupArn - if tgArnParts := strings.Split(*tg.TargetGroupArn, "/"); len(tgArnParts) > 1 { - r.cfg.Status.ALB.StableTargetGroup.FullName = strings.Join(tgArnParts[1:], "/") - } else { - r.cfg.Status.ALB.StableTargetGroup.FullName = "" - r.log.Errorf("error parsing stable target group arn: '%s'", *tg.TargetGroupArn) - } } } } - return pointer.BoolPtr(numVerifiedWeights == 1+len(additionalDestinations)), nil + return pointer.Bool(numVerifiedWeights == len(ingresses)+len(additionalDestinations)), nil +} + +func updateLoadBalancerStatus(status *v1alpha1.ALBStatus, lb *elbv2types.LoadBalancer, log *logrus.Entry) { + status.LoadBalancer.Name = *lb.LoadBalancerName + status.LoadBalancer.ARN = *lb.LoadBalancerArn + if lbArnParts := strings.Split(*lb.LoadBalancerArn, "/"); len(lbArnParts) > 2 { + status.LoadBalancer.FullName = strings.Join(lbArnParts[2:], "/") + } else { + status.LoadBalancer.FullName = "" + log.Errorf("error parsing load balancer arn: '%s'", *lb.LoadBalancerArn) + } +} + +func updateTargetGroupStatus(status *v1alpha1.ALBStatus, tg *aws.TargetGroupMeta, canaryResourceID string, stableResourceID string, log *logrus.Entry) { + if tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID] == canaryResourceID { + status.CanaryTargetGroup.Name = *tg.TargetGroupName + status.CanaryTargetGroup.ARN = *tg.TargetGroupArn + if tgArnParts := strings.Split(*tg.TargetGroupArn, "/"); len(tgArnParts) > 1 { + status.CanaryTargetGroup.FullName = strings.Join(tgArnParts[1:], "/") + } else { + status.CanaryTargetGroup.FullName = "" + log.Errorf("error parsing canary target group arn: '%s'", *tg.TargetGroupArn) + } + } else if tg.Tags[aws.AWSLoadBalancerV2TagKeyResourceID] == stableResourceID { + status.StableTargetGroup.Name = *tg.TargetGroupName + status.StableTargetGroup.ARN = *tg.TargetGroupArn + if tgArnParts := strings.Split(*tg.TargetGroupArn, "/"); len(tgArnParts) > 1 { + status.StableTargetGroup.FullName = strings.Join(tgArnParts[1:], "/") + } else { + status.StableTargetGroup.FullName = "" + log.Errorf("error parsing stable target group arn: '%s'", *tg.TargetGroupArn) + } + } } func getForwardActionString(r *v1alpha1.Rollout, port int32, desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) (string, error) { @@ -490,50 +544,61 @@ func (r *Reconciler) RemoveManagedRoutes() error { if len(r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes) == 0 { return nil } - ctx := context.TODO() - rollout := r.cfg.Rollout - ingressName := rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress - ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) - if err != nil { - return err + if ingresses := r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses; ingresses != nil { + return r.RemoveManagedRoutesPerIngress(ingresses) + } else { + return r.RemoveManagedRoutesPerIngress([]string{r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress}) } +} - desiredAnnotations := ingress.DeepCopy().GetAnnotations() - var actionKeys []string - for _, managedRoute := range rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes { - actionKey := ingressutil.ALBHeaderBasedActionAnnotationKey(rollout, managedRoute.Name) - conditionKey := ingressutil.ALBHeaderBasedConditionAnnotationKey(rollout, managedRoute.Name) - delete(desiredAnnotations, actionKey) - delete(desiredAnnotations, conditionKey) - actionKeys = append(actionKeys, actionKey, conditionKey) - } - desiredAnnotations, err = modifyManagedAnnotation(desiredAnnotations, rollout.Name, false, actionKeys...) - if err != nil { - return err - } +func (r *Reconciler) RemoveManagedRoutesPerIngress(ingresses []string) error { + for _, ingress := range ingresses { + ctx := context.TODO() + rollout := r.cfg.Rollout + ingressName := ingress - desiredIngress := ingressutil.NewIngressWithSpecAndAnnotations(ingress, desiredAnnotations) + ingress, err := r.cfg.IngressWrapper.GetCached(rollout.Namespace, ingressName) + if err != nil { + return err + } - for _, managedRoute := range rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes { - desiredIngress.RemovePathByServiceName(managedRoute.Name) - } + desiredAnnotations := ingress.DeepCopy().GetAnnotations() + var actionKeys []string + for _, managedRoute := range rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes { + actionKey := ingressutil.ALBHeaderBasedActionAnnotationKey(rollout, managedRoute.Name) + conditionKey := ingressutil.ALBHeaderBasedConditionAnnotationKey(rollout, managedRoute.Name) + delete(desiredAnnotations, actionKey) + delete(desiredAnnotations, conditionKey) + actionKeys = append(actionKeys, actionKey, conditionKey) + } + desiredAnnotations, err = modifyManagedAnnotation(desiredAnnotations, rollout.Name, false, actionKeys...) + if err != nil { + return err + } - patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations(), ingressutil.WithSpec()) - if err != nil { - return nil - } - if !modified { - r.log.Info("no changes to the ALB Ingress for header routing") - return nil - } - r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") - r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` removing managed routes", ingressName) + desiredIngress := ingressutil.NewIngressWithSpecAndAnnotations(ingress, desiredAnnotations) - _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) - if err != nil { - r.log.WithField("err", err.Error()).Error("error patching alb ingress") - return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) + for _, managedRoute := range rollout.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes { + desiredIngress.RemovePathByServiceName(managedRoute.Name) + } + + patch, modified, err := ingressutil.BuildIngressPatch(ingress.Mode(), ingress, desiredIngress, ingressutil.WithAnnotations(), ingressutil.WithSpec()) + if err != nil { + return nil + } + if !modified { + r.log.Info("no changes to the ALB Ingress for header routing") + return nil + } + r.log.WithField("patch", string(patch)).Debug("applying ALB Ingress patch") + r.cfg.Recorder.Eventf(rollout, record.EventOptions{EventReason: "PatchingALBIngress"}, "Updating Ingress `%s` removing managed routes", ingressName) + + _, err = r.cfg.IngressWrapper.Patch(ctx, ingress.GetNamespace(), ingress.GetName(), types.MergePatchType, patch, metav1.PatchOptions{}) + if err != nil { + r.log.WithField("err", err.Error()).Error("error patching alb ingress") + return fmt.Errorf("error patching alb ingress `%s`: %v", ingressName, err) + } } return nil } diff --git a/rollout/trafficrouting/alb/alb_test.go b/rollout/trafficrouting/alb/alb_test.go index 5bb6619d06..e81b456941 100644 --- a/rollout/trafficrouting/alb/alb_test.go +++ b/rollout/trafficrouting/alb/alb_test.go @@ -57,6 +57,30 @@ func fakeRollout(stableSvc, canarySvc string, pingPong *v1alpha1.PingPongSpec, s } } +func fakeRolloutWithMultiIngress(stableSvc, canarySvc string, pingPong *v1alpha1.PingPongSpec, stableIngresses []string, port int32) *v1alpha1.Rollout { + return &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "rollout", + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + StableService: stableSvc, + CanaryService: canarySvc, + PingPong: pingPong, + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingresses: stableIngresses, + ServicePort: port, + }, + }, + }, + }, + }, + } +} + const actionTemplate = `{ "Type":"forward", "ForwardConfig":{ @@ -159,6 +183,19 @@ func TestType(t *testing.T) { assert.NoError(t, err) } +func TestTypeMultiIngress(t *testing.T) { + client := fake.NewSimpleClientset() + rollout := fakeRolloutWithMultiIngress("stable-service", "canary-service", nil, []string{"stable-ingress", "multi-ingress"}, 443) + r, err := NewReconciler(ReconcilerConfig{ + Rollout: rollout, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + }) + assert.Equal(t, Type, r.Type()) + assert.NoError(t, err) +} + func TestAddManagedAnnotation(t *testing.T) { annotations, _ := modifyManagedAnnotation(map[string]string{}, "argo-rollouts", true, "alb.ingress.kubernetes.io/actions.action1", "alb.ingress.kubernetes.io/conditions.action1") assert.Equal(t, annotations[ingressutil.ManagedAnnotations], "{\"argo-rollouts\":[\"alb.ingress.kubernetes.io/actions.action1\",\"alb.ingress.kubernetes.io/conditions.action1\"]}") @@ -186,6 +223,26 @@ func TestIngressNotFound(t *testing.T) { assert.True(t, k8serrors.IsNotFound(err)) } +func TestIngressNotFoundMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress("stable-service", "canary-service", nil, []string{"stable-ingress", "multi-ingress"}, 443) + client := fake.NewSimpleClientset() + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.True(t, k8serrors.IsNotFound(err)) +} + func TestServiceNotFoundInIngress(t *testing.T) { ro := fakeRollout("stable-stable", "canary-service", nil, "ingress", 443) ro.Spec.Strategy.Canary.TrafficRouting.ALB.RootService = "invalid-svc" @@ -209,6 +266,31 @@ func TestServiceNotFoundInIngress(t *testing.T) { assert.Errorf(t, err, "ingress does not use the stable service") } +func TestServiceNotFoundInMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress("stable-service", "canary-service", nil, []string{"stable-ingress", "multi-ingress"}, 443) + ro.Spec.Strategy.Canary.TrafficRouting.ALB.RootService = "invalid-svc" + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 50, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 50, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Errorf(t, err, "ingress does not use the stable service") +} + func TestNoChanges(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) @@ -232,6 +314,31 @@ func TestNoChanges(t *testing.T) { assert.Len(t, client.Actions(), 0) } +func TestNoChangesMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 0) +} + func TestErrorOnInvalidManagedBy(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) @@ -255,6 +362,31 @@ func TestErrorOnInvalidManagedBy(t *testing.T) { assert.Errorf(t, err, "incorrectly formatted managed actions annotation") } +func TestErrorOnInvalidManagedByMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress("stable-service", "canary-service", nil, []string{"stable-ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi.Annotations[ingressutil.ManagedAnnotations] = "test" + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Errorf(t, err, "incorrectly formatted managed actions annotation") +} + func TestSetInitialDesiredWeight(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) @@ -279,13 +411,38 @@ func TestSetInitialDesiredWeight(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestSetInitialDesiredWeightMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + i.Annotations = map[string]string{} + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) +} + func TestSetWeightPingPong(t *testing.T) { pp := &v1alpha1.PingPongSpec{PingService: PING_SVC, PongService: PONG_SVC} ro := fakeRollout("", "", pp, "ingress", 443) ro.Spec.Strategy.Canary.TrafficRouting.ALB.RootService = "root-service" ro.Status.Canary.StablePingPong = PONG_SVC i := ingress("ingress", PING_SVC, PONG_SVC, "root-service", 443, 10, ro.Name, false) - //i.Spec. i.Annotations = map[string]string{} client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) @@ -308,6 +465,36 @@ func TestSetWeightPingPong(t *testing.T) { assert.Len(t, actions, 1) } +func TestSetWeightPingPongMultiIngress(t *testing.T) { + pp := &v1alpha1.PingPongSpec{PingService: PING_SVC, PongService: PONG_SVC} + ro := fakeRolloutWithMultiIngress("", "", pp, []string{"ingress", "multi-ingress"}, 443) + ro.Spec.Strategy.Canary.TrafficRouting.ALB.RootService = "root-service" + ro.Status.Canary.StablePingPong = PONG_SVC + i := ingress("ingress", PING_SVC, PONG_SVC, "root-service", 443, 10, ro.Name, false) + mi := ingress("multi-ingress", PING_SVC, PONG_SVC, "root-service", 443, 10, ro.Name, false) + i.Annotations = map[string]string{} + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Nil(t, err) + actions := client.Actions() + assert.Len(t, actions, 2) +} + func TestUpdateDesiredWeightWithStickyConfig(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, true) @@ -329,6 +516,29 @@ func TestUpdateDesiredWeightWithStickyConfig(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestUpdateDesiredWeightWithStickyConfigMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, true) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, true) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + assert.Nil(t, err) + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) +} + func TestUpdateDesiredWeight(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) @@ -352,6 +562,31 @@ func TestUpdateDesiredWeight(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestUpdateDesiredWeightMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetWeight(10) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) +} + // TestGetForwardActionStringMarshalsZeroCorrectly ensures that the annotation does not omit default value zero when marshalling // the forward action func TestGetForwardActionStringMarshalsZeroCorrectly(t *testing.T) { @@ -435,9 +670,42 @@ func TestErrorPatching(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestErrorPatchingMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + client.ReactionChain = nil + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + + 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) + }) + + err = r.SetWeight(10) + assert.Error(t, err, "some error occurred") + assert.Len(t, client.Actions(), 1) +} + type fakeAWSClient struct { + Ingresses []string targetGroups []aws.TargetGroupMeta - loadBalancer *elbv2types.LoadBalancer + loadBalancers []*elbv2types.LoadBalancer targetHealthDescriptions []elbv2types.TargetHealthDescription } @@ -446,16 +714,21 @@ func (f *fakeAWSClient) GetTargetGroupMetadata(ctx context.Context, loadBalancer } func (f *fakeAWSClient) FindLoadBalancerByDNSName(ctx context.Context, dnsName string) (*elbv2types.LoadBalancer, error) { - return f.loadBalancer, nil + for _, lb := range f.loadBalancers { + if lb.DNSName != nil && *lb.DNSName == dnsName { + return lb, nil + } + } + return nil, nil } func (f *fakeAWSClient) GetTargetGroupHealth(ctx context.Context, targetGroupARN string) ([]elbv2types.TargetHealthDescription, error) { return f.targetHealthDescriptions, nil } -func (f *fakeAWSClient) getAlbStatus() *v1alpha1.ALBStatus { +func (f *fakeAWSClient) getAlbStatus(ingress string) *v1alpha1.ALBStatus { LoadBalancerFullName := "" - if lbArnParts := strings.Split(*f.loadBalancer.LoadBalancerArn, "/"); len(lbArnParts) > 2 { + if lbArnParts := strings.Split(*f.loadBalancers[0].LoadBalancerArn, "/"); len(lbArnParts) > 2 { LoadBalancerFullName = strings.Join(lbArnParts[2:], "/") } CanaryTargetGroupFullName := "" @@ -467,9 +740,10 @@ func (f *fakeAWSClient) getAlbStatus() *v1alpha1.ALBStatus { StableTargetGroupFullName = strings.Join(tgArnParts[1:], "/") } return &v1alpha1.ALBStatus{ + Ingress: ingress, LoadBalancer: v1alpha1.AwsResourceRef{ - Name: *f.loadBalancer.LoadBalancerName, - ARN: *f.loadBalancer.LoadBalancerArn, + Name: *f.loadBalancers[0].LoadBalancerName, + ARN: *f.loadBalancers[0].LoadBalancerArn, FullName: LoadBalancerFullName, }, CanaryTargetGroup: v1alpha1.AwsResourceRef{ @@ -485,6 +759,39 @@ func (f *fakeAWSClient) getAlbStatus() *v1alpha1.ALBStatus { } } +func (f *fakeAWSClient) getAlbStatusMultiIngress(ingress string, lbIdx int32, tgIdx int32) *v1alpha1.ALBStatus { + LoadBalancerFullName := "" + if lbArnParts := strings.Split(*f.loadBalancers[lbIdx].LoadBalancerArn, "/"); len(lbArnParts) > 2 { + LoadBalancerFullName = strings.Join(lbArnParts[2:], "/") + } + CanaryTargetGroupFullName := "" + if tgArnParts := strings.Split(*f.targetGroups[tgIdx].TargetGroupArn, "/"); len(tgArnParts) > 1 { + CanaryTargetGroupFullName = strings.Join(tgArnParts[1:], "/") + } + StableTargetGroupFullName := "" + if tgArnParts := strings.Split(*f.targetGroups[tgIdx+1].TargetGroupArn, "/"); len(tgArnParts) > 1 { + StableTargetGroupFullName = strings.Join(tgArnParts[1:], "/") + } + return &v1alpha1.ALBStatus{ + Ingress: ingress, + LoadBalancer: v1alpha1.AwsResourceRef{ + Name: *f.loadBalancers[lbIdx].LoadBalancerName, + ARN: *f.loadBalancers[lbIdx].LoadBalancerArn, + FullName: LoadBalancerFullName, + }, + CanaryTargetGroup: v1alpha1.AwsResourceRef{ + Name: *f.targetGroups[tgIdx].TargetGroupName, + ARN: *f.targetGroups[tgIdx].TargetGroupArn, + FullName: CanaryTargetGroupFullName, + }, + StableTargetGroup: v1alpha1.AwsResourceRef{ + Name: *f.targetGroups[tgIdx+1].TargetGroupName, + ARN: *f.targetGroups[tgIdx+1].TargetGroupArn, + FullName: StableTargetGroupFullName, + }, + } +} + func TestVerifyWeight(t *testing.T) { newFakeReconciler := func(status *v1alpha1.RolloutStatus) (*Reconciler, *fakeAWSClient) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) @@ -530,9 +837,11 @@ func TestVerifyWeight(t *testing.T) { weightVerified, err := r.VerifyWeight(10) assert.NoError(t, err) assert.False(t, *weightVerified) + assert.NotNil(t, status.ALB) + assert.Len(t, status.ALBs, 1) } - // VeryifyWeight not needed + // VerifyWeight not needed { var status v1alpha1.RolloutStatus r, _ := newFakeReconciler(&status) @@ -541,9 +850,11 @@ func TestVerifyWeight(t *testing.T) { weightVerified, err := r.VerifyWeight(10) assert.NoError(t, err) assert.False(t, *weightVerified) + assert.NotNil(t, status.ALB) + assert.Len(t, status.ALBs, 1) } - // VeryifyWeight that we do not need to verify weight and status.ALB is already set + // VerifyWeight that we do not need to verify weight and status.ALB is already set { var status v1alpha1.RolloutStatus r, _ := newFakeReconciler(&status) @@ -559,10 +870,12 @@ func TestVerifyWeight(t *testing.T) { { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -590,17 +903,20 @@ func TestVerifyWeight(t *testing.T) { weightVerified, err := r.VerifyWeight(10) assert.NoError(t, err) assert.False(t, *weightVerified) - assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus()) + assert.Equal(t, status.ALBs[0], *status.ALB) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } // LoadBalancer found, at weight { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -628,17 +944,20 @@ func TestVerifyWeight(t *testing.T) { weightVerified, err := r.VerifyWeight(10) assert.NoError(t, err) assert.True(t, *weightVerified) - assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus()) + assert.Equal(t, status.ALBs[0], *status.ALB) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } // LoadBalancer found, but ARNs are unparsable { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("lb-abc123-arn"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("lb-abc123-arn"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -666,19 +985,246 @@ func TestVerifyWeight(t *testing.T) { weightVerified, err := r.VerifyWeight(10) assert.NoError(t, err) assert.True(t, *weightVerified) - albStatus := *fakeClient.getAlbStatus() + albStatus := *fakeClient.getAlbStatus("ingress") assert.Equal(t, albStatus.LoadBalancer.FullName, "") assert.Equal(t, albStatus.CanaryTargetGroup.FullName, "") assert.Equal(t, albStatus.StableTargetGroup.FullName, "") } } -func TestSetWeightWithMultipleBackends(t *testing.T) { - ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) - i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) - client := fake.NewSimpleClientset(i) - k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) +func TestVerifyWeightMultiIngress(t *testing.T) { + newFakeReconciler := func(status *v1alpha1.RolloutStatus) (*Reconciler, *fakeAWSClient) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + ro.Status.StableRS = "a45fe23" + ro.Spec.Strategy.Canary.Steps = []v1alpha1.CanaryStep{{ + SetWeight: pointer.Int32Ptr(10), + }} + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + i.Status.LoadBalancer = corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + { + Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", + }, + }, + } + mi.Status.LoadBalancer = corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + { + Hostname: "verify-weight-multi-ingress.us-west-2.elb.amazonaws.com", + }, + }, + } + + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + VerifyWeight: pointer.BoolPtr(true), + Status: status, + }) + assert.NoError(t, err) + fakeAWS := fakeAWSClient{} + r.aws = &fakeAWS + return r, &fakeAWS + } + + // LoadBalancer not found + { + var status v1alpha1.RolloutStatus + r, _ := newFakeReconciler(&status) + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.NotNil(t, status.ALB) + assert.Len(t, status.ALBs, 2) + } + + // VerifyWeight not needed + { + var status v1alpha1.RolloutStatus + r, _ := newFakeReconciler(&status) + status.StableRS = "" + r.cfg.Rollout.Status.StableRS = "" + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.NotNil(t, status.ALB) + assert.Len(t, status.ALBs, 2) + } + + // VerifyWeight that we do not need to verify weight and status.ALB is already set + { + var status v1alpha1.RolloutStatus + r, _ := newFakeReconciler(&status) + r.cfg.Rollout.Status.ALBs = []v1alpha1.ALBStatus{} + r.cfg.Rollout.Status.CurrentStepIndex = nil + r.cfg.Rollout.Spec.Strategy.Canary.Steps = nil + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.Nil(t, weightVerified) + } + + // status.ALBs already set, len not match + { + var status v1alpha1.RolloutStatus + r, _ := newFakeReconciler(&status) + r.cfg.Status.ALBs = []v1alpha1.ALBStatus{{}} + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.Len(t, status.ALBs, 2) + } + + // LoadBalancer found, not at weight + { + var status v1alpha1.RolloutStatus + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + { + LoadBalancerName: pointer.StringPtr("lb-multi-ingress-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-multi-ingress-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-multi-ingress.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(11), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(89), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(11), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(89), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-stable-svc:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *fakeClient.getAlbStatusMultiIngress("ingress", 0, 0)) + assert.Equal(t, status.ALBs[1], *fakeClient.getAlbStatusMultiIngress("multi-ingress", 1, 2)) + } + + // LoadBalancer found, at weight + { + var status v1alpha1.RolloutStatus + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + { + LoadBalancerName: pointer.StringPtr("lb-multi-ingress-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-multi-ingress-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-multi-ingress.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(90), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(90), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-stable-svc:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(10) + assert.NoError(t, err) + assert.True(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *fakeClient.getAlbStatusMultiIngress("ingress", 0, 0)) + assert.Equal(t, status.ALBs[1], *fakeClient.getAlbStatusMultiIngress("multi-ingress", 1, 2)) + } +} + +func TestSetWeightWithMultipleBackends(t *testing.T) { + ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) + client := fake.NewSimpleClientset(i) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) if err != nil { t.Fatal(err) @@ -720,6 +1266,55 @@ func TestSetWeightWithMultipleBackends(t *testing.T) { assert.Equal(t, expectedAction, patchedI.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"]) } +func TestSetWeightWithMultipleBackendsMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + + weightDestinations := []v1alpha1.WeightDestination{ + { + ServiceName: "ex-svc-1", + PodTemplateHash: "", + Weight: 2, + }, + { + ServiceName: "ex-svc-2", + PodTemplateHash: "", + Weight: 3, + }, + } + err = r.SetWeight(10, weightDestinations...) + assert.Nil(t, err) + + actions := client.Actions() + assert.Len(t, client.Actions(), 2) + assert.Equal(t, "patch", actions[0].GetVerb()) + + patchedI := extensionsv1beta1.Ingress{} + err = json.Unmarshal(actions[0].(k8stesting.PatchAction).GetPatch(), &patchedI) + assert.Nil(t, err) + + servicePort := 443 + expectedAction := fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, servicePort, 10, weightDestinations[0].ServiceName, servicePort, weightDestinations[0].Weight, weightDestinations[1].ServiceName, servicePort, weightDestinations[1].Weight, STABLE_SVC, servicePort, 85) + assert.Equal(t, expectedAction, patchedI.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"]) +} + func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { weightDestinations := []v1alpha1.WeightDestination{ { @@ -776,10 +1371,12 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -807,17 +1404,19 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { weightVerified, err := r.VerifyWeight(10, weightDestinations...) assert.NoError(t, err) assert.False(t, *weightVerified) - assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus()) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } // LoadBalancer found, with incorrect weights { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -865,17 +1464,19 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { weightVerified, err := r.VerifyWeight(10, weightDestinations...) assert.NoError(t, err) assert.False(t, *weightVerified) - assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus()) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } // LoadBalancer found, with all correct weights { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) - fakeClient.loadBalancer = &elbv2types.LoadBalancer{ - LoadBalancerName: pointer.StringPtr("lb-abc123-name"), - LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), - DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, } fakeClient.targetGroups = []aws.TargetGroupMeta{ { @@ -923,20 +1524,319 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { weightVerified, err := r.VerifyWeight(10, weightDestinations...) assert.NoError(t, err) assert.True(t, *weightVerified) - assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus()) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } } -func TestSetHeaderRoute(t *testing.T) { - ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) - ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ - {Name: "header-route"}, +func TestVerifyWeightWithAdditionalDestinationsMultiIngress(t *testing.T) { + weightDestinations := []v1alpha1.WeightDestination{ + { + ServiceName: "ex-svc-1", + PodTemplateHash: "", + Weight: 2, + }, + { + ServiceName: "ex-svc-2", + PodTemplateHash: "", + Weight: 3, + }, } - i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) - client := fake.NewSimpleClientset(i) - k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + newFakeReconciler := func(status *v1alpha1.RolloutStatus) (*Reconciler, *fakeAWSClient) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + ro.Status.StableRS = "a45fe23" + ro.Spec.Strategy.Canary.Steps = []v1alpha1.CanaryStep{{ + SetWeight: pointer.Int32Ptr(10), + }} + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) + i.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"] = fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, 443, 10, weightDestinations[0].ServiceName, 443, weightDestinations[0].Weight, weightDestinations[1].ServiceName, 443, weightDestinations[1].Weight, STABLE_SVC, 443, 85) + mi.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"] = fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, 443, 10, weightDestinations[0].ServiceName, 443, weightDestinations[0].Weight, weightDestinations[1].ServiceName, 443, weightDestinations[1].Weight, STABLE_SVC, 443, 85) + + i.Status.LoadBalancer = corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + { + Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", + }, + }, + } + mi.Status.LoadBalancer = corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + { + Hostname: "verify-weight-multi-ingress.us-west-2.elb.amazonaws.com", + }, + }, + } + + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + VerifyWeight: pointer.BoolPtr(true), + Status: status, + }) + assert.NoError(t, err) + fakeAWS := fakeAWSClient{} + r.aws = &fakeAWS + return r, &fakeAWS + } + + // LoadBalancer found, but experiment weights not present + { + var status v1alpha1.RolloutStatus + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + { + LoadBalancerName: pointer.StringPtr("lb-multi-ingress-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-multi-ingress-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-multi-ingress.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(90), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(90), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-stable-svc:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(10, weightDestinations...) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *fakeClient.getAlbStatusMultiIngress("ingress", 0, 0)) + } + + // LoadBalancer found, with incorrect weights + { + var status v1alpha1.RolloutStatus + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + { + LoadBalancerName: pointer.StringPtr("lb-multi-ingress-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-multi-ingress-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-multi-ingress.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(85), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/multi-ingress-canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/app/multi-ingress-stable-tg-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(85), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("ex-svc-1-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/ex-svc-1-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(100), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-ex-svc-1:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("ex-svc-2-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/ex-svc-2-tg-abc123-name/123456789012345"), + }, + Weight: pointer.Int32Ptr(100), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-ex-svc-2:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(10, weightDestinations...) + assert.NoError(t, err) + assert.False(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *fakeClient.getAlbStatusMultiIngress("ingress", 0, 0)) + assert.Equal(t, status.ALBs[1], *fakeClient.getAlbStatusMultiIngress("multi-ingress", 1, 2)) + } + + // LoadBalancer found, with all correct weights + { + var status v1alpha1.RolloutStatus + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + { + LoadBalancerName: pointer.StringPtr("lb-multi-ingress-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-multi-ingress-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-multi-ingress.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(85), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/app/multi-ingress-canary-tg-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(10), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("multi-ingress-stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/app/multi-ingress-stable-tg-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(85), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/multi-ingress-stable-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("ex-svc-1-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/ex-svc-1-tg-abc123-name/1234567890123456"), + }, + Weight: &weightDestinations[0].Weight, + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-ex-svc-1:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("ex-svc-2-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/ex-svc-2-tg-abc123-name/123456789012345"), + }, + Weight: &weightDestinations[1].Weight, + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-ex-svc-2:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(10, weightDestinations...) + assert.NoError(t, err) + assert.True(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *fakeClient.getAlbStatusMultiIngress("ingress", 0, 0)) + } +} + +func TestSetHeaderRoute(t *testing.T) { + ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) + ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ + {Name: "header-route"}, + } + i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + client := fake.NewSimpleClientset(i) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) if err != nil { t.Fatal(err) } @@ -966,6 +1866,47 @@ func TestSetHeaderRoute(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestSetHeaderRouteMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ + {Name: "header-route"}, + } + i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, "action2", 443, 10, ro.Name, false) + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetHeaderRoute(&v1alpha1.SetHeaderRoute{ + Name: "header-route", + Match: []v1alpha1.HeaderRoutingMatch{{ + HeaderName: "Agent", + HeaderValue: &v1alpha1.StringMatch{ + Prefix: "Chrome", + }, + }}, + }) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) + + // no managed routes, no changes expected + err = r.RemoveManagedRoutes() + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) +} + func TestRemoveManagedRoutes(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ @@ -1040,6 +1981,116 @@ func TestRemoveManagedRoutes(t *testing.T) { assert.Len(t, client.Actions(), 2) } +func TestRemoveManagedRoutesMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ + {Name: "header-route"}, + } + i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + managedByValue := ingressutil.ManagedALBAnnotations{ + ro.Name: ingressutil.ManagedALBAnnotation{ + "alb.ingress.kubernetes.io/actions.action1", + "alb.ingress.kubernetes.io/actions.header-route", + "alb.ingress.kubernetes.io/conditions.header-route", + }, + } + i.Annotations["alb.ingress.kubernetes.io/actions.header-route"] = "{}" + i.Annotations["alb.ingress.kubernetes.io/conditions.header-route"] = "{}" + i.Annotations[ingressutil.ManagedAnnotations] = managedByValue.String() + i.Spec.Rules = []extensionsv1beta1.IngressRule{ + { + IngressRuleValue: extensionsv1beta1.IngressRuleValue{ + HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ + Paths: []extensionsv1beta1.HTTPIngressPath{ + { + Backend: extensionsv1beta1.IngressBackend{ + ServiceName: "action1", + ServicePort: intstr.Parse("use-annotation"), + }, + }, + }, + }, + }, + }, + { + IngressRuleValue: extensionsv1beta1.IngressRuleValue{ + HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ + Paths: []extensionsv1beta1.HTTPIngressPath{ + { + Backend: extensionsv1beta1.IngressBackend{ + ServiceName: "header-route", + ServicePort: intstr.Parse("use-annotation"), + }, + }, + }, + }, + }, + }, + } + + mi.Annotations["alb.ingress.kubernetes.io/actions.header-route"] = "{}" + mi.Annotations["alb.ingress.kubernetes.io/conditions.header-route"] = "{}" + mi.Annotations[ingressutil.ManagedAnnotations] = managedByValue.String() + mi.Spec.Rules = []extensionsv1beta1.IngressRule{ + { + IngressRuleValue: extensionsv1beta1.IngressRuleValue{ + HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ + Paths: []extensionsv1beta1.HTTPIngressPath{ + { + Backend: extensionsv1beta1.IngressBackend{ + ServiceName: "action1", + ServicePort: intstr.Parse("use-annotation"), + }, + }, + }, + }, + }, + }, + { + IngressRuleValue: extensionsv1beta1.IngressRuleValue{ + HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ + Paths: []extensionsv1beta1.HTTPIngressPath{ + { + Backend: extensionsv1beta1.IngressBackend{ + ServiceName: "header-route", + ServicePort: intstr.Parse("use-annotation"), + }, + }, + }, + }, + }, + }, + } + + client := fake.NewSimpleClientset(i, mi) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + + err = r.SetHeaderRoute(&v1alpha1.SetHeaderRoute{ + Name: "header-route", + }) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 2) + + err = r.RemoveManagedRoutes() + assert.Nil(t, err) + assert.Len(t, client.Actions(), 4) +} + func TestSetMirrorRoute(t *testing.T) { ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) @@ -1070,3 +2121,36 @@ func TestSetMirrorRoute(t *testing.T) { assert.Len(t, client.Actions(), 0) } + +func TestSetMirrorRouteMultiIngress(t *testing.T) { + ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) + i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) + mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) + client := fake.NewSimpleClientset() + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + err = r.SetMirrorRoute(&v1alpha1.SetMirrorRoute{ + Name: "mirror-route", + Match: []v1alpha1.RouteMatch{{ + Method: &v1alpha1.StringMatch{Exact: "GET"}, + }}, + }) + assert.Nil(t, err) + err = r.RemoveManagedRoutes() + assert.Nil(t, err) + + assert.Len(t, client.Actions(), 0) +} diff --git a/test/e2e/alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml b/test/e2e/alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml new file mode 100644 index 0000000000..413fd8af3a --- /dev/null +++ b/test/e2e/alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml @@ -0,0 +1,123 @@ +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-root +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-canary +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-stable +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-1 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: alb-rollout-root + port: + name: use-annotation +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-2 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: alb-rollout-root + port: + name: use-annotation +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: alb-rollout +spec: + selector: + matchLabels: + app: alb-rollout + template: + metadata: + labels: + app: alb-rollout + spec: + containers: + - name: alb-rollout + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + canaryService: alb-rollout-canary + stableService: alb-rollout-stable + trafficRouting: + alb: + ingresses: + - alb-rollout-multi-ingress-1 + - alb-rollout-multi-ingress-2 + rootService: alb-rollout-root + servicePort: 80 + steps: + - experiment: + duration: 15s + templates: + - name: experiment-alb-canary + specRef: canary + weight: 20 + - name: experiment-alb-stable + specRef: stable + weight: 20 diff --git a/test/e2e/alb/rollout-alb-multi-ingress-experiment.yaml b/test/e2e/alb/rollout-alb-multi-ingress-experiment.yaml new file mode 100644 index 0000000000..14c41e0be6 --- /dev/null +++ b/test/e2e/alb/rollout-alb-multi-ingress-experiment.yaml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-root +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-canary +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-rollout-stable +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-rollout +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-1 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: alb-rollout-root + port: + name: use-annotation +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-2 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: alb-rollout-root + port: + name: use-annotation +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: alb-rollout +spec: + selector: + matchLabels: + app: alb-rollout + template: + metadata: + labels: + app: alb-rollout + spec: + containers: + - name: alb-rollout + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + canaryService: alb-rollout-canary + stableService: alb-rollout-stable + trafficRouting: + alb: + ingresses: + - alb-rollout-multi-ingress-1 + - alb-rollout-multi-ingress-2 + rootService: alb-rollout-root + servicePort: 80 + steps: + - setWeight: 10 + - experiment: + templates: + - name: experiment-alb + specRef: canary + weight: 20 diff --git a/test/e2e/aws_test.go b/test/e2e/aws_test.go index 1265095797..f8b0553fe2 100644 --- a/test/e2e/aws_test.go +++ b/test/e2e/aws_test.go @@ -46,6 +46,17 @@ func (s *AWSSuite) TestALBCanaryUpdate() { WaitForRolloutStatus("Healthy") } +func (s *AWSSuite) TestALBCanaryUpdateMultiIngress() { + if val, _ := os.LookupEnv(fixtures.EnvVarE2EALBIngressAnnotations); val == "" { + s.T().SkipNow() + } + s.Given(). + HealthyRollout(`@functional/alb-canary-multi-ingress-rollout.yaml`). + When(). + UpdateSpec(). + WaitForRolloutStatus("Healthy") +} + func (s *AWSSuite) TestALBBlueGreenUpdate() { if val, _ := os.LookupEnv(fixtures.EnvVarE2EALBIngressAnnotations); val == "" { s.T().SkipNow() @@ -83,6 +94,32 @@ func (s *AWSSuite) TestALBPingPongUpdate() { Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)) } +func (s *AWSSuite) TestALBPingPongUpdateMultiIngress() { + s.Given(). + RolloutObjects("@functional/alb-pingpong-multi-ingress-rollout.yaml"). + When().ApplyManifests().WaitForRolloutStatus("Healthy"). + Then(). + Assert(assertWeightsMultiIngress(s, "ping-multi-ingress-service", "pong-multi-ingress-service", 100, 0)). + // Update 1. Test the weight switch from ping => pong + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + Assert(assertWeightsMultiIngress(s, "ping-multi-ingress-service", "pong-multi-ingress-service", 75, 25)). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + Assert(assertWeightsMultiIngress(s, "ping-multi-ingress-service", "pong-multi-ingress-service", 0, 100)). + // Update 2. Test the weight switch from pong => ping + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + Assert(assertWeightsMultiIngress(s, "ping-multi-ingress-service", "pong-multi-ingress-service", 25, 75)). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + Assert(assertWeightsMultiIngress(s, "ping-multi-ingress-service", "pong-multi-ingress-service", 100, 0)) +} + func assertWeights(s *AWSSuite, groupA, groupB string, weightA, weightB int64) func(t *fixtures.Then) { return func(t *fixtures.Then) { ingress := t.GetALBIngress() @@ -106,6 +143,31 @@ func assertWeights(s *AWSSuite, groupA, groupB string, weightA, weightB int64) f } } +func assertWeightsMultiIngress(s *AWSSuite, groupA, groupB string, weightA, weightB int64) func(t *fixtures.Then) { + return func(t *fixtures.Then) { + ingresses := t.GetALBIngresses() + for _, ingress := range ingresses { + action, ok := ingress.Annotations["alb.ingress.kubernetes.io/actions.alb-rollout-root"] + assert.True(s.T(), ok) + + var albAction ingress2.ALBAction + if err := json.Unmarshal([]byte(action), &albAction); err != nil { + panic(err) + } + for _, targetGroup := range albAction.ForwardConfig.TargetGroups { + switch targetGroup.ServiceName { + case groupA: + assert.True(s.T(), *targetGroup.Weight == weightA, fmt.Sprintf("Weight doesn't match: %d and %d", *targetGroup.Weight, weightA)) + case groupB: + assert.True(s.T(), *targetGroup.Weight == weightB, fmt.Sprintf("Weight doesn't match: %d and %d", *targetGroup.Weight, weightB)) + default: + assert.True(s.T(), false, "Service is not expected in the target group: "+targetGroup.ServiceName) + } + } + } + } +} + func (s *AWSSuite) TestALBExperimentStep() { s.Given(). RolloutObjects("@alb/rollout-alb-experiment.yaml"). @@ -140,6 +202,42 @@ func (s *AWSSuite) TestALBExperimentStep() { Assert(assertWeights(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)) } +func (s *AWSSuite) TestALBExperimentStepMultiIngress() { + s.Given(). + RolloutObjects("@alb/rollout-alb-multi-ingress-experiment.yaml"). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + Assert(assertWeightsMultiIngress(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)). + ExpectExperimentCount(0). + When(). + UpdateSpec(). + WaitForRolloutCanaryStepIndex(1). + Sleep(10 * time.Second). + Then(). + Assert(func(t *fixtures.Then) { + ingresses := t.GetALBIngresses() + for _, ingress := range ingresses { + action, ok := ingress.Annotations["alb.ingress.kubernetes.io/actions.alb-rollout-root"] + assert.True(s.T(), ok) + + ex := t.GetRolloutExperiments().Items[0] + exServiceName := ex.Status.TemplateStatuses[0].ServiceName + + port := 80 + expectedAction := fmt.Sprintf(actionTemplateWithExperiment, "alb-rollout-canary", port, 10, exServiceName, port, 20, "alb-rollout-stable", port, 70) + assert.Equal(s.T(), expectedAction, action) + } + }). + When(). + PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). // stable is currently set first, and then changes made to VirtualServices/DestinationRules + Then(). + Assert(assertWeightsMultiIngress(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)) +} + func (s *AWSSuite) TestALBExperimentStepNoSetWeight() { s.Given(). RolloutObjects("@alb/rollout-alb-experiment-no-setweight.yaml"). @@ -173,6 +271,41 @@ func (s *AWSSuite) TestALBExperimentStepNoSetWeight() { Assert(assertWeights(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)) } +func (s *AWSSuite) TestALBExperimentStepNoSetWeightMultiIngress() { + s.Given(). + RolloutObjects("@alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml"). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + Assert(assertWeightsMultiIngress(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)). + ExpectExperimentCount(0). + When(). + UpdateSpec(). + Sleep(10 * time.Second). + Then(). + Assert(func(t *fixtures.Then) { + ingresses := t.GetALBIngresses() + for _, ingress := range ingresses { + action, ok := ingress.Annotations["alb.ingress.kubernetes.io/actions.alb-rollout-root"] + assert.True(s.T(), ok) + + experiment := t.GetRolloutExperiments().Items[0] + exService1, exService2 := experiment.Status.TemplateStatuses[0].ServiceName, experiment.Status.TemplateStatuses[1].ServiceName + + port := 80 + expectedAction := fmt.Sprintf(actionTemplateWithExperiments, "alb-rollout-canary", port, 0, exService1, port, 20, exService2, port, 20, "alb-rollout-stable", port, 60) + assert.Equal(s.T(), expectedAction, action) + } + }). + When(). + PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(2 * time.Second). // stable is currently set first, and then changes made to VirtualServices/DestinationRules + Then(). + Assert(assertWeightsMultiIngress(s, "alb-rollout-canary", "alb-rollout-stable", 0, 100)) +} + func (s *AWSSuite) TestAlbHeaderRoute() { s.Given(). RolloutObjects("@header-routing/alb-header-route.yaml"). @@ -215,6 +348,48 @@ func (s *AWSSuite) TestAlbHeaderRoute() { }) } +func (s *AWSSuite) TestAlbHeaderRouteMultiIngress() { + s.Given(). + RolloutObjects("@header-routing/alb-header-route-multi-ingress.yaml"). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + Assert(func(t *fixtures.Then) { + assertAlbActionDoesNotExistMultiIngress(t, s, "header-route") + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "canary-multi-ingress-service", 0) + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "stable-multi-ingress-service", 100) + }). + When(). + UpdateSpec(). + WaitForRolloutStatus("Paused"). + Sleep(5 * time.Second). + Then(). + Assert(func(t *fixtures.Then) { + assertAlbActionDoesNotExistMultiIngress(t, s, "header-route") + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "canary-multi-ingress-service", 20) + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "stable-multi-ingress-service", 80) + }). + When(). + PromoteRollout(). + WaitForRolloutStatus("Paused"). + Sleep(5 * time.Second). + Then(). + Assert(func(t *fixtures.Then) { + assertAlbActionServiceWeightMultiIngress(t, s, "header-route", "canary-multi-ingress-service", 100) + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "canary-multi-ingress-service", 20) + assertAlbActionServiceWeightMultiIngress(t, s, "action1", "stable-multi-ingress-service", 80) + }). + When(). + PromoteRollout(). + WaitForRolloutStatus("Paused"). + Sleep(5 * time.Second). + Then(). + Assert(func(t *fixtures.Then) { + assertAlbActionDoesNotExistMultiIngress(t, s, "header-route") + }) +} + func assertAlbActionServiceWeight(t *fixtures.Then, s *AWSSuite, actionName, serviceName string, expectedWeight int64) { ingress := t.GetALBIngress() key := "alb.ingress.kubernetes.io/actions." + actionName @@ -237,9 +412,42 @@ func assertAlbActionServiceWeight(t *fixtures.Then, s *AWSSuite, actionName, ser assert.True(s.T(), found, "Service %s was not found", serviceName) } +func assertAlbActionServiceWeightMultiIngress(t *fixtures.Then, s *AWSSuite, actionName, serviceName string, expectedWeight int64) { + ingresses := t.GetALBIngresses() + for _, ingress := range ingresses { + key := "alb.ingress.kubernetes.io/actions." + actionName + actionStr, ok := ingress.Annotations[key] + assert.True(s.T(), ok, "Annotation for action was not found: %s", key) + + var albAction ingress2.ALBAction + err := json.Unmarshal([]byte(actionStr), &albAction) + if err != nil { + panic(err) + } + + found := false + for _, group := range albAction.ForwardConfig.TargetGroups { + if group.ServiceName == serviceName { + assert.Equal(s.T(), pointer.Int64(expectedWeight), group.Weight) + found = true + } + } + assert.True(s.T(), found, "Service %s was not found", serviceName) + } +} + func assertAlbActionDoesNotExist(t *fixtures.Then, s *AWSSuite, actionName string) { ingress := t.GetALBIngress() key := "alb.ingress.kubernetes.io/actions." + actionName _, ok := ingress.Annotations[key] assert.False(s.T(), ok, "Annotation for action should not exist: %s", key) } + +func assertAlbActionDoesNotExistMultiIngress(t *fixtures.Then, s *AWSSuite, actionName string) { + ingresses := t.GetALBIngresses() + for _, ingress := range ingresses { + key := "alb.ingress.kubernetes.io/actions." + actionName + _, ok := ingress.Annotations[key] + assert.False(s.T(), ok, "Annotation for action should not exist: %s", key) + } +} diff --git a/test/e2e/functional/alb-canary-multi-ingress-rollout.yaml b/test/e2e/functional/alb-canary-multi-ingress-rollout.yaml new file mode 100644 index 0000000000..b18d75e606 --- /dev/null +++ b/test/e2e/functional/alb-canary-multi-ingress-rollout.yaml @@ -0,0 +1,118 @@ +apiVersion: v1 +kind: Service +metadata: + name: alb-canary-multi-ingress-root +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary-multi-ingress +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-canary-multi-ingress-desired +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary-multi-ingress +--- +apiVersion: v1 +kind: Service +metadata: + name: alb-canary-multi-ingress-stable +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary-multi-ingress +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-canary-multi-ingress-1 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: alb-canary-multi-ingress-root + port: + name: use-annotation +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-canary-multi-ingress-2 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: alb-canary-multi-ingress-root + port: + name: use-annotation +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: alb-canary-multi-ingress +spec: + selector: + matchLabels: + app: alb-canary-multi-ingress + template: + metadata: + labels: + app: alb-canary-multi-ingress + spec: + containers: + - name: alb-canary-multi-ingress + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + canaryService: alb-canary-multi-ingress-desired + stableService: alb-canary-multi-ingress-stable + trafficRouting: + alb: + ingresses: + - alb-canary-multi-ingress-1 + - alb-canary-multi-ingress-2 + rootService: alb-canary-root + servicePort: 80 + steps: + - setWeight: 10 + - pause: {duration: 5s} + - setWeight: 20 + - pause: {duration: 5s} diff --git a/test/e2e/functional/alb-canary-rollout.yaml b/test/e2e/functional/alb-canary-rollout.yaml index e05f73d2c2..dd2aa348cb 100644 --- a/test/e2e/functional/alb-canary-rollout.yaml +++ b/test/e2e/functional/alb-canary-rollout.yaml @@ -51,7 +51,7 @@ spec: - http: paths: - path: /* - pathType: Prefix + pathType: ImplementationSpecific backend: service: name: alb-canary-root @@ -95,4 +95,4 @@ spec: - setWeight: 10 - pause: {duration: 5s} - setWeight: 20 - - pause: {duration: 5s} \ No newline at end of file + - pause: {duration: 5s} diff --git a/test/e2e/functional/alb-pingpong-multi-ingress-rollout.yaml b/test/e2e/functional/alb-pingpong-multi-ingress-rollout.yaml new file mode 100644 index 0000000000..6ad8e471c8 --- /dev/null +++ b/test/e2e/functional/alb-pingpong-multi-ingress-rollout.yaml @@ -0,0 +1,106 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: ping-multi-ingress-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary-multi-ingress +--- +apiVersion: v1 +kind: Service +metadata: + name: pong-multi-ingress-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary-multi-ingress +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-canary-multi-ingress-1 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + backend: + service: + name: alb-rollout-root + port: + name: use-annotation + pathType: ImplementationSpecific +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-canary-multi-ingress-2 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + backend: + service: + name: alb-rollout-root + port: + name: use-annotation + pathType: ImplementationSpecific +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: alb-canary-multi-ingress +spec: + replicas: 2 + selector: + matchLabels: + app: alb-canary-multi-ingress + template: + metadata: + labels: + app: alb-canary-multi-ingress + spec: + containers: + - name: alb-canary-multi-ingress + image: "argoproj/rollouts-demo:red" + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + scaleDownDelaySeconds: 2 + pingPong: + pingService: ping-multi-ingress-service + pongService: pong-multi-ingress-service + trafficRouting: + alb: + ingresses: + - alb-canary-multi-ingress-1 + - alb-canary-multi-ingress-2 + rootService: alb-rollout-root + servicePort: 80 + steps: + - setWeight: 25 + - pause: {duration: 5s} diff --git a/test/e2e/header-routing/alb-header-route-multi-ingress.yaml b/test/e2e/header-routing/alb-header-route-multi-ingress.yaml new file mode 100644 index 0000000000..f2bca43442 --- /dev/null +++ b/test/e2e/header-routing/alb-header-route-multi-ingress.yaml @@ -0,0 +1,112 @@ +apiVersion: v1 +kind: Service +metadata: + name: canary-multi-ingress-service +spec: + type: NodePort + ports: + - port: 8080 + targetPort: 8080 + protocol: TCP + name: http + selector: + app: alb-multi-ingress-rollout +--- +apiVersion: v1 +kind: Service +metadata: + name: stable-multi-ingress-service +spec: + type: NodePort + ports: + - port: 8080 + targetPort: 8080 + protocol: TCP + name: http + selector: + app: alb-multi-ingress-rollout +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-1 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: action1 + port: + name: use-annotation +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-rollout-multi-ingress-2 + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + pathType: ImplementationSpecific + backend: + service: + name: action1 + port: + name: use-annotation +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: rollouts-demo +spec: + replicas: 5 + selector: + matchLabels: + app: alb-multi-ingress-rollout + template: + metadata: + labels: + app: alb-multi-ingress-rollout + spec: + containers: + - name: alb-multi-ingress-rollout + image: "argoproj/rollouts-demo:yellow" + ports: + - name: http + containerPort: 8080 + protocol: TCP + strategy: + canary: + scaleDownDelaySeconds: 5 + stableService: stable-multi-ingress-service + canaryService: canary-multi-ingress-service + trafficRouting: + managedRoutes: + - name: header-route + alb: + ingresses: + - alb-rollout-multi-ingress-1 + - alb-rollout-multi-ingress-2 + rootService: action1 + servicePort: 8080 + steps: + - setWeight: 20 + - pause: {} + - setHeaderRoute: + name: header-route + match: + - headerName: Custom-Header + headerValue: + exact: Mozilla* + - pause: {} + - setHeaderRoute: + name: header-route + - pause: {} diff --git a/test/e2e/header-routing/alb-header-route.yaml b/test/e2e/header-routing/alb-header-route.yaml index 71c9e7aa6f..99c3f5d205 100644 --- a/test/e2e/header-routing/alb-header-route.yaml +++ b/test/e2e/header-routing/alb-header-route.yaml @@ -31,21 +31,7 @@ kind: Ingress metadata: name: alb-rollout-ingress annotations: - alb.ingress.kubernetes.io/security-groups: 'iks-intuit-cidr-ingress-tcp-443' - alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-2:795188202216:certificate/27d920c5-a8a6-4210-9f31-bd4a2d439039 - alb.ingress.kubernetes.io/load-balancer-attributes: access_logs.s3.enabled=false - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-2-2017-01 - kubernetes.io/ingress.class: aws-alb - alb.ingress.kubernetes.io/load-balancer-name: rollouts-sample - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/healthcheck-protocol: HTTP - alb.ingress.kubernetes.io/healthcheck-port: traffic-port - alb.ingress.kubernetes.io/healthcheck-path: /color - alb.ingress.kubernetes.io/backend-protocol: HTTP - alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/subnets: IngressSubnetAz1, IngressSubnetAz2, IngressSubnetAz3 + kubernetes.io/ingress.class: alb spec: rules: - http: diff --git a/test/fixtures/common.go b/test/fixtures/common.go index c16df649e3..9e060df865 100644 --- a/test/fixtures/common.go +++ b/test/fixtures/common.go @@ -536,6 +536,18 @@ func (c *Common) GetALBIngress() *networkingv1.Ingress { return ingress } +func (c *Common) GetALBIngresses() []*networkingv1.Ingress { + ro := c.Rollout() + names := ro.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses + ingresses := []*networkingv1.Ingress{} + for _, name := range names { + ingress, err := c.kubeClient.NetworkingV1().Ingresses(c.namespace).Get(c.Context, name, metav1.GetOptions{}) + c.CheckError(err) + ingresses = append(ingresses, ingress) + } + return ingresses +} + func (c *Common) GetNginxIngressStable() *networkingv1.Ingress { ro := c.Rollout() name := ro.Spec.Strategy.Canary.TrafficRouting.Nginx.StableIngress diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index a4064899f4..151eb4b672 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -101,6 +101,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBStatus { * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBStatus */ stableTargetGroup?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AwsResourceRef; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBStatus + */ + ingress?: string; } /** * @@ -126,6 +132,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBTrafficR * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBTrafficRouting */ rootService?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBTrafficRouting + */ + annotationPrefix?: string; /** * * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StickinessConfig} @@ -134,10 +146,10 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBTrafficR stickinessConfig?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StickinessConfig; /** * - * @type {string} + * @type {Array} * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBTrafficRouting */ - annotationPrefix?: string; + ingresses?: Array; } /** * @@ -1534,6 +1546,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutStat * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutStatus */ alb?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ALBStatus; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutStatus + */ + albs?: Array; } /** * diff --git a/utils/ingress/ingress.go b/utils/ingress/ingress.go index 494245ae8e..69e921beef 100644 --- a/utils/ingress/ingress.go +++ b/utils/ingress/ingress.go @@ -83,6 +83,14 @@ func SingleNginxIngressConfigured(rollout *v1alpha1.Rollout) bool { return rollout.Spec.Strategy.Canary.TrafficRouting.Nginx.StableIngress != "" } +func MultipleAlbIngressesConfigured(rollout *v1alpha1.Rollout) bool { + return rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses != nil +} + +func SingleAlbIngressConfigured(rollout *v1alpha1.Rollout) bool { + return rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress != "" +} + // GetRolloutIngressKeys returns ingresses keys (namespace/ingressName) which are referenced by specified rollout func GetRolloutIngressKeys(rollout *v1alpha1.Rollout) []string { var ingresses []string @@ -126,6 +134,20 @@ func GetRolloutIngressKeys(rollout *v1alpha1.Rollout) []string { ) } + // Scenario where one rollout is managing multiple ALB ingresses. + if rollout.Spec.Strategy.Canary != nil && + rollout.Spec.Strategy.Canary.TrafficRouting != nil && + rollout.Spec.Strategy.Canary.TrafficRouting.ALB != nil && + rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses != nil { + + for _, ingress := range rollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses { + ingresses = append( + ingresses, + fmt.Sprintf("%s/%s", rollout.Namespace, ingress), + ) + } + } + return ingresses } diff --git a/utils/ingress/ingress_test.go b/utils/ingress/ingress_test.go index b0213a3bf9..7d6cecee63 100644 --- a/utils/ingress/ingress_test.go +++ b/utils/ingress/ingress_test.go @@ -77,14 +77,14 @@ func TestGetRolloutIngressKeysForCanaryWithTrafficRoutingMultiIngress(t *testing StableIngresses: []string{"stable-ingress", "stable-ingress-additional"}, }, ALB: &v1alpha1.ALBTrafficRouting{ - Ingress: "alb-ingress", + Ingresses: []string{"alb-ingress", "alb-multi-ingress"}, }, }, }, }, }, }) - assert.ElementsMatch(t, keys, []string{"default/stable-ingress", "default/myrollout-stable-ingress-canary", "default/stable-ingress-additional", "default/myrollout-stable-ingress-additional-canary", "default/alb-ingress"}) + assert.ElementsMatch(t, keys, []string{"default/stable-ingress", "default/myrollout-stable-ingress-canary", "default/stable-ingress-additional", "default/myrollout-stable-ingress-additional-canary", "default/alb-ingress", "default/alb-multi-ingress"}) } func TestGetCanaryIngressName(t *testing.T) { @@ -160,6 +160,79 @@ func TestGetCanaryIngressName(t *testing.T) { }) } +func TestGetCanaryAlbIngressName(t *testing.T) { + singleIngressRollout := &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myrollout", + Namespace: "default", + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + CanaryService: "canary-service", + StableService: "stable-service", + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingress: "stable-ingress", + }, + }, + }, + }, + }, + } + + multiIngressRollout := &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myrollout", + Namespace: "default", + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + CanaryService: "canary-service", + StableService: "stable-service", + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingresses: []string{"stable-ingress", "stable-ingress-additional"}, + }, + }, + }, + }, + }, + } + + t.Run("Ingress - NoTrim", func(t *testing.T) { + singleIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress = "stable-ingress" + canaryIngress := GetCanaryIngressName(singleIngressRollout.GetName(), singleIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress) + assert.Equal(t, "myrollout-stable-ingress-canary", canaryIngress) + }) + t.Run("Ingress - Trim", func(t *testing.T) { + singleIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress = fmt.Sprintf("stable-ingress%s", strings.Repeat("a", 260)) + canaryIngress := GetCanaryIngressName(singleIngressRollout.GetName(), singleIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingress) + assert.Equal(t, 253, len(canaryIngress), "canary ingress truncated to 253") + assert.Equal(t, true, strings.HasSuffix(canaryIngress, "-canary"), "canary ingress has -canary suffix") + }) + t.Run("Ingresses - NoTrim", func(t *testing.T) { + for _, ing := range multiIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses { + canaryIngress := GetCanaryIngressName(multiIngressRollout.GetName(), ing) + assert.Equal(t, fmt.Sprintf("%s-%s-canary", multiIngressRollout.ObjectMeta.Name, ing), canaryIngress) + } + }) + t.Run("Ingresses - Trim", func(t *testing.T) { + multiIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses = []string{fmt.Sprintf("stable-ingress%s", strings.Repeat("a", 260))} + for _, ing := range multiIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB.Ingresses { + canaryIngress := GetCanaryIngressName(multiIngressRollout.GetName(), ing) + assert.Equal(t, 253, len(canaryIngress), "canary ingress truncated to 253") + assert.Equal(t, true, strings.HasSuffix(canaryIngress, "-canary"), "canary ingress has -canary suffix") + } + }) + t.Run("NoIngress", func(t *testing.T) { + multiIngressRollout.Spec.Strategy.Canary.TrafficRouting.ALB = nil + canaryIngress := GetCanaryIngressName(multiIngressRollout.GetName(), "") + assert.Equal(t, "", canaryIngress, "canary ingress is empty") + }) +} + func TestHasRuleWithService(t *testing.T) { t.Run("will check rule with legacy ingress", func(t *testing.T) { // given From 45e549d93e476ab46d2f123e390b73c0bb2938d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 11:15:16 -0500 Subject: [PATCH 108/159] chore(deps): bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 (#2894) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.12.6 to 1.12.7. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.12.6...v1.12.7) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 623fd4384d..5c7279a8c2 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.19 require ( - github.com/antonmedv/expr v1.12.6 + github.com/antonmedv/expr v1.12.7 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.19.0 diff --git a/go.sum b/go.sum index a1395d4b25..fb4298bbf1 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.12.6 h1:qtgMHOFissxhePwokx0xB9eqS6PUy0SbhDRPD67PInA= -github.com/antonmedv/expr v1.12.6/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.12.7 h1:jfV/l/+dHWAadLwAtESXNxXdfbK9bE4+FNMHYCMntwk= +github.com/antonmedv/expr v1.12.7/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.0 h1:XyE4jAw0oeRQKL9vlDQBnycmqhN7EIqUdWgPsSUqnkQ= github.com/argoproj/notifications-engine v0.4.0/go.mod h1:uGas18+DbCCwjif1zSwWWuwR0xJ18FXF+c2dkhPbF2k= From 1e0ea4b5c1991ba228a54c4ebf860164f6b88d21 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Mon, 24 Jul 2023 17:11:18 +0300 Subject: [PATCH 109/159] docs: mirroring support in Traefik is not implemented yet (#2904) Signed-off-by: Kostis Kapelonis --- docs/features/traffic-management/traefik.md | 51 ++------------------- 1 file changed, 3 insertions(+), 48 deletions(-) diff --git a/docs/features/traffic-management/traefik.md b/docs/features/traffic-management/traefik.md index dfba805c4f..481527a9c7 100644 --- a/docs/features/traffic-management/traefik.md +++ b/docs/features/traffic-management/traefik.md @@ -4,6 +4,9 @@ You can use the [Traefik Proxy](https://traefik.io/traefik/) for traffic managem The [TraefikService](https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#kind-traefikservice) is the object that supports the ability for [weighted round robin load balancing](https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#weighted-round-robin) and [traffic mirroring](https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#mirroring) when using Traefik as ingress. +!!! note + Traefik is also supported via the [Argo Rollouts Gateway API plugin](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/). + ## How to integrate TraefikService with Argo Rollouts using it as weighted round robin load balancer First, we need to create the TraefikService object using its ability for weighted round robin load balancing. @@ -52,52 +55,4 @@ spec: ... ``` -## How to integrate TraefikService with Argo Rollouts using it as traffic mirror - -First, we also need to create the TraefikService object but using its ability for traffic mirroring. -```yaml -apiVersion: traefik.containo.us/v1alpha1 -kind: TraefikService -metadata: - name: traefik-service -spec: - mirroring: - name: some-service - port: 80 - mirrors: - - name: stable-rollout # k8s service name that you need to create for stable application version - port: 80 - - name: canary-rollout # k8s service name that you need to create for new application version - port: 80 -``` - -Notice, we don't specify the `percent` field. It is necessary to be synced with ArgoCD. If we specify this field and Argo Rollouts controller changes it, then the ArgoCD controller will notice it and will show that this resource is out of sync (if you are using Argo CD to manage your Rollout). - -Secondly, we need to create the Argo Rollouts object. - -```yaml -apiVersion: argoproj.io/v1alpha1 -kind: Rollout -metadata: - name: rollouts-demo -spec: - replicas: 5 - strategy: - canary: - canaryService: canary-rollout - stableService: stable-rollout - trafficRouting: - traefik: - mirrorTraefikServiceName: traefik-service # specify traefikService resource name that we have created before - steps: - - setWeight: 30 - - pause: {} - - setWeight: 40 - - pause: {duration: 10} - - setWeight: 60 - - pause: {duration: 10} - - setWeight: 80 - - pause: {duration: 10} - ... -``` From 9365acaaf546421f5158ac6980725350adff0b37 Mon Sep 17 00:00:00 2001 From: HYH-99 <63279812+huoyinghao@users.noreply.github.com> Date: Mon, 24 Jul 2023 23:53:56 +0800 Subject: [PATCH 110/159] fix: rollout not modify the VirtualService whit setHeaderRoute step with workloadRef (#2797) * remove generation whil setHeaderRoute and setMirrorRoute Signed-off-by: huoyinghao <962917302@qq.com> * switch to revision instead of generation to determin first install Signed-off-by: zachaller * fix godoc Signed-off-by: zachaller * increase test cov Signed-off-by: zachaller * lint Signed-off-by: zachaller --------- Signed-off-by: huoyinghao <962917302@qq.com> Signed-off-by: zachaller Co-authored-by: zachaller --- rollout/trafficrouting.go | 10 ++- rollout/trafficrouting_test.go | 102 ++++++++++++++++++++++++++ utils/annotations/annotations.go | 17 +++++ utils/annotations/annotations_test.go | 40 ++++++++++ 4 files changed, 165 insertions(+), 4 deletions(-) diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index 1b694d517a..c7b3bf7055 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -6,6 +6,8 @@ import ( "strconv" "strings" + "github.com/argoproj/argo-rollouts/utils/annotations" + "github.com/argoproj/argo-rollouts/rollout/trafficrouting/plugin" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -233,10 +235,10 @@ func (c *rolloutContext) reconcileTrafficRouting() error { desiredWeight = 100 } } - - // We need to check for Generation > 1 because when we first install the rollout we run step 0 this prevents that. - // We could also probably use c.newRS == nil || c.newRS.Status.AvailableReplicas == 0 - if currentStep != nil && c.rollout.ObjectMeta.Generation > 1 { + // We need to check for revision > 1 because when we first install the rollout we run step 0 this prevents that. + // There is a bigger fix needed for the reasons on why we run step 0 on rollout install, that needs to be explored. + revision, revisionFound := annotations.GetRevisionAnnotation(c.rollout) + if currentStep != nil && (revisionFound && revision > 1) { if currentStep.SetHeaderRoute != nil { if err = reconciler.SetHeaderRoute(currentStep.SetHeaderRoute); err != nil { return err diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index da82f812a4..21aea362ae 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -1051,3 +1051,105 @@ func TestDynamicScalingDecreaseWeightAccordingToStableAvailabilityWhenAbortedAnd f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(pointer.BoolPtr(true), nil) f.run(getKey(r1, t)) } + +func TestRolloutReplicaIsAvailableAndGenerationNotBeModifiedShouldModifyVirtualServiceSHeaderRoute(t *testing.T) { + f := newFixture(t) + defer f.Close() + steps := []v1alpha1.CanaryStep{ + { + SetCanaryScale: &v1alpha1.SetCanaryScale{ + Replicas: pointer.Int32(1), + }, + }, + { + SetHeaderRoute: &v1alpha1.SetHeaderRoute{ + Name: "test-header", + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "test", + HeaderValue: &v1alpha1.StringMatch{ + Prefix: "test", + }, + }, + }, + }, + }, + { + Pause: &v1alpha1.RolloutPause{}, + }, + } + r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32(1), intstr.FromInt(1), intstr.FromInt(1)) + r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + Istio: &v1alpha1.IstioTrafficRouting{ + VirtualService: &v1alpha1.IstioVirtualService{ + Name: "test", + Routes: []string{ + "primary", + }, + }, + DestinationRule: &v1alpha1.IstioDestinationRule{ + Name: "test", + StableSubsetName: "stable", + CanarySubsetName: "canary", + }, + }, + ManagedRoutes: []v1alpha1.MangedRoutes{ + { + Name: "test-header", + }, + }, + } + r1.Spec.WorkloadRef = &v1alpha1.ObjectRef{ + Name: "test", + APIVersion: "apps/v1", + Kind: "Deployment", + } + r1.Spec.SelectorResolvedFromRef = true + r1.Spec.TemplateResolvedFromRef = true + r2 := bumpVersion(r1) + + // if set WorkloadRef it does not change the generation + r2.ObjectMeta.Generation = r2.ObjectMeta.Generation - 1 + + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 1, 1) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + canarySelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs2PodHash} + stableSelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs1PodHash} + canarySvc := newService("canary", 80, canarySelector, r1) + stableSvc := newService("stable", 80, stableSelector, r1) + r2.Status.StableRS = rs1PodHash + r2.Status.Canary.Weights = &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + Weight: 0, + ServiceName: "canary", + PodTemplateHash: rs2PodHash, + }, + Stable: v1alpha1.WeightDestination{ + Weight: 100, + ServiceName: "stable", + PodTemplateHash: rs1PodHash, + }, + } + f.kubeobjects = append(f.kubeobjects, rs1, rs2, canarySvc, stableSvc) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + f.expectPatchRolloutAction(r2) + f.expectPatchReplicaSetAction(rs1) + f.expectPatchReplicaSetAction(rs2) + f.fakeTrafficRouting = newUnmockedFakeTrafficRoutingReconciler() + f.fakeTrafficRouting.On("SetHeaderRoute", &v1alpha1.SetHeaderRoute{ + Name: "test-header", + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "test", + HeaderValue: &v1alpha1.StringMatch{ + Prefix: "test", + }, + }, + }, + }).Once().Return(nil) + f.run(getKey(r1, t)) +} diff --git a/utils/annotations/annotations.go b/utils/annotations/annotations.go index e3fead8e8f..80cec5ce2a 100644 --- a/utils/annotations/annotations.go +++ b/utils/annotations/annotations.go @@ -51,6 +51,23 @@ func GetWorkloadGenerationAnnotation(ro *v1alpha1.Rollout) (int32, bool) { return int32(intValue), true } +// GetRevisionAnnotation returns revision of rollout +func GetRevisionAnnotation(ro *v1alpha1.Rollout) (int32, bool) { + if ro == nil { + return 0, false + } + annotationValue, ok := ro.Annotations[RevisionAnnotation] + if !ok { + return int32(0), false + } + intValue, err := strconv.ParseInt(annotationValue, 10, 32) + if err != nil { + log.Warnf("Cannot convert the value %q with annotation key %q for the replica set %q", annotationValue, RevisionAnnotation, ro.Name) + return int32(0), false + } + return int32(intValue), true +} + func getIntFromAnnotation(rs *appsv1.ReplicaSet, annotationKey string) (int32, bool) { if rs == nil { return 0, false diff --git a/utils/annotations/annotations_test.go b/utils/annotations/annotations_test.go index e4f5de319e..3ad136fd7e 100644 --- a/utils/annotations/annotations_test.go +++ b/utils/annotations/annotations_test.go @@ -444,3 +444,43 @@ func TestReplicasAnnotationsNeedUpdate(t *testing.T) { }) } } + +func TestGetRevisionAnnotation(t *testing.T) { + rev, found := GetRevisionAnnotation(&v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + Annotations: map[string]string{ + RevisionAnnotation: "1", + }, + }, + }) + assert.True(t, found) + assert.Equal(t, int32(1), rev) + + rev, found = GetRevisionAnnotation(&v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + Annotations: map[string]string{}, + }, + }) + assert.False(t, found) + assert.Equal(t, int32(0), rev) + + rev, found = GetRevisionAnnotation(nil) + assert.False(t, found) + assert.Equal(t, int32(0), rev) + + rev, found = GetRevisionAnnotation(&v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + Annotations: map[string]string{ + RevisionAnnotation: "abc", + }, + }, + }) + assert.False(t, found) + assert.Equal(t, int32(0), rev) +} From d8dbb24526a7922638c1f238c28ffdf77864df22 Mon Sep 17 00:00:00 2001 From: AhmedGrati <48932084+AhmedGrati@users.noreply.github.com> Date: Tue, 25 Jul 2023 18:40:31 +0100 Subject: [PATCH 111/159] feat: Add prometheus timeout (#2893) * feat: add prometheus timeout attribute Signed-off-by: AhmedGrati * add protobuf and crd of timeout attribute Signed-off-by: AhmedGrati * docs: add timeout attribute in the prometheus docs Signed-off-by: AhmedGrati * make private Signed-off-by: zachaller --------- Signed-off-by: AhmedGrati Signed-off-by: zachaller Co-authored-by: zachaller --- docs/analysis/prometheus.md | 2 + .../features/kustomize/rollout_cr_schema.json | 12 + manifests/crds/analysis-run-crd.yaml | 3 + manifests/crds/analysis-template-crd.yaml | 3 + .../crds/cluster-analysis-template-crd.yaml | 3 + manifests/install.yaml | 9 + metricproviders/metricproviders.go | 2 +- metricproviders/prometheus/prometheus.go | 25 +- metricproviders/prometheus/prometheus_test.go | 74 ++- pkg/apis/rollouts/v1alpha1/analysis_types.go | 3 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 480 ++++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 4 + .../rollouts/v1alpha1/openapi_generated.go | 7 + .../v1alpha1/zz_generated.deepcopy.go | 7 +- 14 files changed, 389 insertions(+), 245 deletions(-) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index 9030d94403..74b1ce1bb4 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -20,6 +20,8 @@ spec: provider: prometheus: address: http://prometheus.example.com:9090 + # timeout is expressed in seconds + timeout: 40 query: | sum(irate( istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 9d11edb202..8f523fb53e 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -4280,6 +4280,10 @@ }, "query": { "type": "string" + }, + "timeout": { + "format": "int64", + "type": "integer" } }, "type": "object" @@ -8670,6 +8674,10 @@ }, "query": { "type": "string" + }, + "timeout": { + "format": "int64", + "type": "integer" } }, "type": "object" @@ -13060,6 +13068,10 @@ }, "query": { "type": "string" + }, + "timeout": { + "format": "int64", + "type": "integer" } }, "type": "object" diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index c17c338a13..fbfeb64412 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2779,6 +2779,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 1359dc1507..3411b175a6 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2775,6 +2775,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index f4023eda12..aeeb9a1dab 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2775,6 +2775,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: diff --git a/manifests/install.yaml b/manifests/install.yaml index b93a60d32b..53d7405bb7 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2780,6 +2780,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: @@ -5739,6 +5742,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: @@ -8584,6 +8590,9 @@ spec: type: object query: type: string + timeout: + format: int64 + type: integer type: object skywalking: properties: diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index ed544a7f04..f73ff15e88 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -41,7 +41,7 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) if err != nil { return nil, err } - return prometheus.NewPrometheusProvider(api, logCtx), nil + return prometheus.NewPrometheusProvider(api, logCtx, metric) case job.ProviderType: return job.NewJobProvider(logCtx, f.KubeClient, f.JobLister), nil case kayenta.ProviderType: diff --git a/metricproviders/prometheus/prometheus.go b/metricproviders/prometheus/prometheus.go index 83c9ec83f2..57bc0e85d1 100644 --- a/metricproviders/prometheus/prometheus.go +++ b/metricproviders/prometheus/prometheus.go @@ -33,8 +33,9 @@ const ( // Provider contains all the required components to run a prometheus query type Provider struct { - api v1.API - logCtx log.Entry + api v1.API + logCtx log.Entry + timeout time.Duration } // Type indicates provider is a prometheus provider @@ -59,7 +60,7 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph } //TODO(dthomson) make timeout configurable - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), p.timeout) defer cancel() response, warnings, err := p.api.Query(ctx, metric.Provider.Prometheus.Query, time.Now()) @@ -138,11 +139,25 @@ func (p *Provider) processResponse(metric v1alpha1.Metric, response model.Value) } // NewPrometheusProvider Creates a new Prometheus client -func NewPrometheusProvider(api v1.API, logCtx log.Entry) *Provider { - return &Provider{ +func NewPrometheusProvider(api v1.API, logCtx log.Entry, metric v1alpha1.Metric) (*Provider, error) { + provider := &Provider{ logCtx: logCtx, api: api, } + + if metric.Provider.Prometheus == nil || metric.Provider.Prometheus.Timeout == nil { + provider.timeout = 30 * time.Second + return provider, nil + } + + metricTimeout := metric.Provider.Prometheus.Timeout + + if *metricTimeout < 0 { + return nil, errors.New("prometheus timeout should not be negative") + } + + provider.timeout = time.Duration(*metricTimeout * int64(time.Second)) + return provider, nil } // NewPrometheusAPI generates a prometheus API from the metric configuration diff --git a/metricproviders/prometheus/prometheus_test.go b/metricproviders/prometheus/prometheus_test.go index d62f080bcd..e5b8b2142d 100644 --- a/metricproviders/prometheus/prometheus_test.go +++ b/metricproviders/prometheus/prometheus_test.go @@ -5,6 +5,7 @@ import ( "math" "os" "testing" + "time" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "github.com/prometheus/client_golang/api/prometheus/v1" @@ -30,8 +31,22 @@ func TestType(t *testing.T) { mock := mockAPI{ value: newScalar(10), } - p := NewPrometheusProvider(mock, e) + timeout := int64(5) + metric := v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result == 10", + FailureCondition: "result != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Query: "test", + Timeout: &timeout, + }, + }, + } + p, err := NewPrometheusProvider(mock, e, metric) + assert.NoError(t, err) assert.Equal(t, ProviderType, p.Type()) + assert.Equal(t, p.timeout, time.Duration(timeout*int64(time.Second))) } func TestRunSuccessfully(t *testing.T) { @@ -39,7 +54,6 @@ func TestRunSuccessfully(t *testing.T) { mock := mockAPI{ value: newScalar(10), } - p := NewPrometheusProvider(mock, e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -50,8 +64,11 @@ func TestRunSuccessfully(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, e, metric) + measurement := p.Run(newAnalysisRun(), metric) assert.NotNil(t, measurement.StartedAt) + assert.NoError(t, err) assert.Equal(t, "10", measurement.Value) assert.NotNil(t, measurement.FinishedAt) assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, measurement.Phase) @@ -64,7 +81,6 @@ func TestRunSuccessfullyWithEnv(t *testing.T) { } address := "http://127.0.0.1:9090" os.Setenv(EnvVarArgoRolloutsPrometheusAddress, address) - p := NewPrometheusProvider(mock, e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -75,8 +91,10 @@ func TestRunSuccessfullyWithEnv(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.NotNil(t, measurement.StartedAt) + assert.NoError(t, err) assert.Equal(t, "10", measurement.Value) assert.NotNil(t, measurement.FinishedAt) assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, measurement.Phase) @@ -88,7 +106,6 @@ func TestRunSuccessfullyWithWarning(t *testing.T) { value: newScalar(10), warnings: v1.Warnings([]string{"warning", "warning2"}), } - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -99,8 +116,10 @@ func TestRunSuccessfullyWithWarning(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, *e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.NotNil(t, measurement.StartedAt) + assert.NoError(t, err) assert.Equal(t, "10", measurement.Value) assert.NotNil(t, measurement.FinishedAt) assert.Equal(t, `"warning", "warning2"`, measurement.Metadata["warnings"]) @@ -113,7 +132,6 @@ func TestRunSuccessfullyWithWarningWithEnv(t *testing.T) { value: newScalar(10), warnings: v1.Warnings([]string{"warning", "warning2"}), } - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -124,8 +142,10 @@ func TestRunSuccessfullyWithWarningWithEnv(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, *e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.NotNil(t, measurement.StartedAt) + assert.NoError(t, err) assert.Equal(t, "10", measurement.Value) assert.NotNil(t, measurement.FinishedAt) assert.Equal(t, `"warning", "warning2"`, measurement.Metadata["warnings"]) @@ -138,7 +158,6 @@ func TestRunWithQueryError(t *testing.T) { mock := mockAPI{ err: expectedErr, } - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -149,8 +168,10 @@ func TestRunWithQueryError(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, *e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.Equal(t, expectedErr.Error(), measurement.Message) + assert.NoError(t, err) assert.NotNil(t, measurement.StartedAt) assert.Equal(t, "", measurement.Value) assert.NotNil(t, measurement.FinishedAt) @@ -163,7 +184,6 @@ func TestRunWithResolveArgsError(t *testing.T) { mock := mockAPI{ err: expectedErr, } - p := NewPrometheusProvider(mock, e) metric := v1alpha1.Metric{ Name: "foo", Provider: v1alpha1.MetricProvider{ @@ -172,8 +192,10 @@ func TestRunWithResolveArgsError(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.Equal(t, expectedErr.Error(), measurement.Message) + assert.NoError(t, err) assert.NotNil(t, measurement.StartedAt) assert.Equal(t, "", measurement.Value) assert.NotNil(t, measurement.FinishedAt) @@ -183,7 +205,6 @@ func TestRunWithResolveArgsError(t *testing.T) { func TestGetStatusReturnsResolvedQuery(t *testing.T) { e := log.Entry{} mock := mockAPI{} - p := NewPrometheusProvider(mock, e) metric := v1alpha1.Metric{ Name: "foo", Provider: v1alpha1.MetricProvider{ @@ -192,15 +213,16 @@ func TestGetStatusReturnsResolvedQuery(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, e, metric) metricsMetadata := p.GetMetadata(metric) assert.NotNil(t, metricsMetadata) + assert.NoError(t, err) assert.Equal(t, "resolved-query", metricsMetadata["ResolvedPrometheusQuery"]) } func TestRunWithEvaluationError(t *testing.T) { e := log.WithField("", "") mock := mockAPI{} - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -211,8 +233,10 @@ func TestRunWithEvaluationError(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, *e, metric) measurement := p.Run(newAnalysisRun(), metric) assert.Equal(t, "Prometheus metric type not supported", measurement.Message) + assert.NoError(t, err) assert.NotNil(t, measurement.StartedAt) assert.Equal(t, "", measurement.Value) assert.NotNil(t, measurement.FinishedAt) @@ -222,7 +246,6 @@ func TestRunWithEvaluationError(t *testing.T) { func TestResume(t *testing.T) { e := log.WithField("", "") mock := mockAPI{} - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{ Name: "foo", SuccessCondition: "result == 10", @@ -233,6 +256,8 @@ func TestResume(t *testing.T) { }, }, } + p, err := NewPrometheusProvider(mock, *e, metric) + assert.NoError(t, err) now := metav1.Now() previousMeasurement := v1alpha1.Measurement{ StartedAt: &now, @@ -245,8 +270,9 @@ func TestResume(t *testing.T) { func TestTerminate(t *testing.T) { e := log.NewEntry(log.New()) mock := mockAPI{} - p := NewPrometheusProvider(mock, *e) metric := v1alpha1.Metric{} + p, err := NewPrometheusProvider(mock, *e, metric) + assert.NoError(t, err) now := metav1.Now() previousMeasurement := v1alpha1.Measurement{ StartedAt: &now, @@ -259,8 +285,10 @@ func TestTerminate(t *testing.T) { func TestGarbageCollect(t *testing.T) { e := log.NewEntry(log.New()) mock := mockAPI{} - p := NewPrometheusProvider(mock, *e) - err := p.GarbageCollect(nil, v1alpha1.Metric{}, 0) + metric := v1alpha1.Metric{} + p, err := NewPrometheusProvider(mock, *e, metric) + assert.NoError(t, err) + err = p.GarbageCollect(nil, v1alpha1.Metric{}, 0) assert.NoError(t, err) } @@ -465,3 +493,23 @@ func TestNewPrometheusAddressNotConfigured(t *testing.T) { assert.NotNil(t, err) log.Infof("api:%v", api) } + +func TestNewPrometheusNegativeTimeout(t *testing.T) { + e := log.Entry{} + mock := mockAPI{ + value: newScalar(10), + } + timeout := int64(-20) + metric := v1alpha1.Metric{ + Name: "foo", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Query: "test", + Timeout: &timeout, + }, + }, + } + p, err := NewPrometheusProvider(mock, e, metric) + assert.NotNil(t, err) + assert.Nil(t, p) +} diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 72364344de..83fa92a04f 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -213,6 +213,9 @@ type PrometheusMetric struct { // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus // +optional Authentication PrometheusAuth `json:"authentication,omitempty" protobuf:"bytes,3,opt,name=authentication"` + // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. + // +optional + Timeout *int64 `json:"timeout,omitempty" protobuf:"bytes,4,opt,name=timeout"` } // PrometheusMetric defines the prometheus query to perform canary analysis diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index f4bf7a3e67..a3535dfade 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3292,27 +3292,27 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8179 bytes of a gzipped FileDescriptorProto + // 8196 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, - 0x9c, 0xfa, 0x8c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, + 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xb6, 0x86, 0x7b, 0x2b, 0x4b, 0x3a, 0x5b, 0xcd, 0x99, 0xc7, 0x61, 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, - 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, + 0xac, 0xc4, 0x16, 0x92, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, 0x03, 0x31, 0xe2, 0xd8, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, - 0x49, 0x90, 0x40, 0x30, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xf7, 0xd9, 0xaf, 0x7b, 0x7a, 0xb8, - 0x33, 0x3b, 0xcd, 0xd5, 0x25, 0xd1, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, + 0x49, 0x90, 0x40, 0x08, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xf7, 0xd9, 0xaf, 0x7b, 0x7a, 0xb8, + 0x33, 0x3b, 0xcd, 0xd5, 0x25, 0xf6, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, 0x55, 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, 0xdf, 0x0d, 0xfc, 0xbb, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, 0x6f, 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x70, 0xda, 0xdd, 0x3d, 0xe7, 0x13, 0xab, 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x1d, 0x53, - 0x5b, 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x53, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, + 0x5b, 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x51, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, 0x97, 0x28, 0x6a, 0xcb, 0x1f, 0x33, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, 0xf2, 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x4a, 0xb8, 0xe2, 0xfa, 0x4c, 0xb6, 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, 0xa0, 0x59, 0x38, 0x2f, 0xc5, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, 0x43, 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, - 0xd7, 0x1f, 0x56, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xc5, 0x41, 0xf5, 0x7a, 0x91, + 0xd7, 0x1e, 0x56, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xc5, 0x41, 0xf5, 0x7a, 0x91, 0xdb, 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0x47, 0x05, 0x28, 0x55, 0x36, 0xab, 0xf5, 0xc8, 0x89, 0x7a, 0x21, 0xf9, 0xaa, 0x05, 0x73, 0x6d, 0xdf, 0x69, 0x56, 0x9d, 0xb6, 0xe3, 0x35, 0x68, 0xb0, 0x64, 0x3d, 0x63, 0x5d, 0x99, 0x7d, 0x61, 0x73, 0x65, 0x9c, 0xfe, 0x5a, 0xa9, @@ -3334,7 +3334,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x2e, 0x6d, 0xa8, 0x42, 0x8c, 0xe1, 0xf6, 0x3a, 0x2c, 0x55, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x75, 0xdd, 0x15, 0x98, 0xe9, 0x38, 0xdd, 0xae, 0xeb, 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0x73, 0xc7, 0x47, 0xe5, 0x99, 0x2d, 0x59, 0x86, 0x1a, 0x6a, 0xff, - 0xe9, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, 0x98, 0x61, + 0xf1, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, 0x98, 0x61, 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0xbe, 0x22, 0x16, 0x91, 0x15, 0x73, 0x11, 0x89, 0x3f, 0x9f, 0x61, 0xaf, 0x1c, 0x7c, 0x62, 0xe5, 0xcd, 0x9d, 0xbb, 0xb4, 0x11, 0x6d, 0xd1, 0xc8, 0xa9, 0x12, 0xd9, 0x0b, 0x10, 0x97, 0xa1, 0xa6, 0x4a, 0x7c, 0x98, 0x0c, 0xbb, 0xb4, 0x21, 0x67, @@ -3345,7 +3345,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x7c, 0xd3, 0xe9, 0x50, 0xe4, 0x10, 0xf2, 0x2c, 0x14, 0x0f, 0x9c, 0x76, 0x8f, 0xf2, 0x46, 0x2a, 0x55, 0xcf, 0x48, 0x94, 0xe2, 0x5b, 0xac, 0x10, 0x05, 0x8c, 0xbc, 0x0b, 0x25, 0xfe, 0xe3, 0x5a, 0xe0, 0x77, 0x72, 0xfa, 0x34, 0x29, 0xe1, 0x5b, 0x8a, 0xac, 0x18, 0x7e, 0xfa, 0x2f, 0xc6, 0x0c, - 0xed, 0x3f, 0xb7, 0x60, 0xc1, 0xf8, 0xb8, 0x4d, 0x37, 0x8c, 0xc8, 0xe7, 0xfb, 0x06, 0xcf, 0xca, + 0xed, 0x3f, 0xb5, 0x60, 0xc1, 0xf8, 0xb8, 0x4d, 0x37, 0x8c, 0xc8, 0xe7, 0xfb, 0x06, 0xcf, 0xca, 0x70, 0x83, 0x87, 0xd5, 0xe6, 0x43, 0x67, 0x51, 0x7e, 0xe9, 0x8c, 0x2a, 0x31, 0x06, 0x8e, 0x07, 0x45, 0x37, 0xa2, 0x9d, 0x70, 0x69, 0xe2, 0x99, 0xc2, 0x95, 0xd9, 0x17, 0x36, 0x72, 0xeb, 0xc6, 0xb8, 0x7d, 0x37, 0x18, 0x7d, 0x14, 0x6c, 0xec, 0x7f, 0x51, 0x48, 0x74, 0xdf, 0x96, 0x92, 0xe3, @@ -3360,15 +3360,15 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x3e, 0xb9, 0x96, 0xcf, 0xb4, 0x8c, 0x97, 0x8a, 0x4a, 0xd0, 0x0a, 0x91, 0x73, 0x20, 0xab, 0x50, 0x8a, 0x68, 0xd0, 0x71, 0x3d, 0x27, 0x12, 0x3b, 0xe8, 0x4c, 0xf5, 0xac, 0x44, 0x2b, 0x6d, 0x2b, 0x00, 0xc6, 0x38, 0xa4, 0x0d, 0x53, 0xcd, 0xe0, 0x10, 0x7b, 0xde, 0xd2, 0x64, 0x1e, 0x4d, 0xb1, - 0xce, 0x69, 0xc5, 0x83, 0x54, 0xfc, 0x47, 0xc9, 0x83, 0xfc, 0xba, 0x05, 0xe7, 0x3b, 0xd4, 0x09, + 0xce, 0x69, 0xc5, 0x83, 0x54, 0xfc, 0x47, 0xc9, 0x83, 0xfc, 0xaa, 0x05, 0xe7, 0x3b, 0xd4, 0x09, 0x7b, 0x01, 0x65, 0x9f, 0x80, 0x34, 0xa2, 0x1e, 0xeb, 0xd8, 0xa5, 0x22, 0x67, 0x8e, 0xe3, 0xf6, - 0x43, 0x3f, 0xe5, 0xea, 0xd3, 0x52, 0x94, 0xf3, 0x59, 0x50, 0xcc, 0x94, 0xc6, 0xfe, 0xd3, 0x49, + 0x43, 0x3f, 0xe5, 0xea, 0xd3, 0x52, 0x94, 0xf3, 0x59, 0x50, 0xcc, 0x94, 0xc6, 0xfe, 0xe3, 0x49, 0x38, 0xdb, 0xb7, 0xb0, 0x93, 0x97, 0xa0, 0xd8, 0xdd, 0x73, 0x42, 0xb5, 0x52, 0x5f, 0x56, 0xcb, 0x44, 0x8d, 0x15, 0x3e, 0x38, 0x2a, 0x9f, 0x51, 0x55, 0x78, 0x01, 0x0a, 0x64, 0xa6, 0x37, 0x75, - 0x68, 0x18, 0x3a, 0x2d, 0xb5, 0x7c, 0x1b, 0xc3, 0x84, 0x17, 0xa3, 0x82, 0x93, 0xbf, 0x63, 0xc1, + 0x68, 0x18, 0x3a, 0x2d, 0xb5, 0x7c, 0x1b, 0xc3, 0x84, 0x17, 0xa3, 0x82, 0x93, 0xbf, 0x6d, 0xc1, 0x19, 0x31, 0x64, 0x90, 0x86, 0xbd, 0x76, 0xc4, 0xb6, 0x28, 0xd6, 0x2c, 0x37, 0xf2, 0x18, 0x9e, 0x82, 0x64, 0xf5, 0x82, 0xe4, 0x7e, 0xc6, 0x2c, 0x0d, 0x31, 0xc9, 0x97, 0xdc, 0x81, 0x52, 0x18, - 0x39, 0x41, 0x44, 0x9b, 0x95, 0x88, 0x2b, 0x53, 0xb3, 0x2f, 0xfc, 0xf4, 0x70, 0x6b, 0xf7, 0xb6, + 0x39, 0x41, 0x44, 0x9b, 0x95, 0x88, 0x2b, 0x53, 0xb3, 0x2f, 0xfc, 0xe4, 0x70, 0x6b, 0xf7, 0xb6, 0xdb, 0xa1, 0x62, 0x9f, 0xa8, 0x2b, 0x02, 0x18, 0xd3, 0x22, 0xef, 0x02, 0x04, 0x3d, 0xaf, 0xde, 0xeb, 0x74, 0x9c, 0xe0, 0x50, 0xea, 0x57, 0xd7, 0xc7, 0xfb, 0x3c, 0xd4, 0xf4, 0x62, 0x55, 0x23, 0x2e, 0x43, 0x83, 0x1f, 0xf9, 0xb2, 0x05, 0x67, 0xc4, 0x48, 0x54, 0x12, 0x4c, 0xe5, 0x2c, 0xc1, @@ -3380,28 +3380,28 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x7f, 0xb3, 0xd8, 0x4a, 0x2d, 0xbe, 0x6b, 0x9b, 0x76, 0xba, 0x6d, 0xb6, 0xba, 0x9c, 0xbe, 0xfe, 0x18, 0x25, 0xf4, 0x47, 0xcc, 0x67, 0xbb, 0x53, 0xf2, 0x0f, 0x52, 0x22, 0xed, 0xff, 0x6a, 0xc1, 0xf9, 0x34, 0xf2, 0x63, 0xd0, 0x79, 0xc2, 0xa4, 0xce, 0x73, 0x33, 0xdf, 0xaf, 0x1d, 0xa0, 0xf8, - 0x7c, 0x75, 0xb2, 0xff, 0x5b, 0xff, 0x5f, 0xdf, 0x46, 0xe3, 0x5d, 0xb1, 0xf0, 0xe3, 0xdc, 0x15, - 0x27, 0x3f, 0x50, 0xbb, 0xe2, 0x6f, 0x4e, 0xc2, 0x5c, 0xc5, 0x8b, 0xdc, 0xca, 0xee, 0xae, 0xeb, + 0x7c, 0x75, 0xb2, 0xff, 0x5b, 0xff, 0x7f, 0xdf, 0x46, 0xe3, 0x5d, 0xb1, 0xf0, 0xe3, 0xdc, 0x15, + 0x27, 0x3f, 0x50, 0xbb, 0xe2, 0xaf, 0x4f, 0xc2, 0x5c, 0xc5, 0x8b, 0xdc, 0xca, 0xee, 0xae, 0xeb, 0xb9, 0xd1, 0x21, 0xf9, 0xfa, 0x04, 0xac, 0x76, 0x03, 0xba, 0x4b, 0x83, 0x80, 0x36, 0xd7, 0x7b, 0x81, 0xeb, 0xb5, 0xea, 0x8d, 0x3d, 0xda, 0xec, 0xb5, 0x5d, 0xaf, 0xb5, 0xd1, 0xf2, 0x7c, 0x5d, 0x7c, 0xf5, 0x3e, 0x6d, 0xf4, 0xf8, 0x27, 0x89, 0x49, 0xd1, 0x19, 0xef, 0x93, 0x6a, 0xa3, 0x31, 0xad, 0xbe, 0x78, 0x7c, 0x54, 0x5e, 0x1d, 0xb1, 0x12, 0x8e, 0xfa, 0x69, 0xe4, 0x6b, 0x13, 0xb0, - 0x12, 0xd0, 0x9f, 0xef, 0xb9, 0xc3, 0xb7, 0x86, 0x58, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, 0xf1, + 0x12, 0xd0, 0x9f, 0xed, 0xb9, 0xc3, 0xb7, 0x86, 0x58, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, 0xf1, 0xac, 0xbe, 0x70, 0x7c, 0x54, 0x1e, 0xb1, 0x0e, 0x8e, 0xf8, 0x5d, 0x76, 0x0d, 0x66, 0x2b, 0x5d, 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, 0x8a, - 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x8b, 0x6c, 0xc5, 0xe5, + 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0xf3, 0x6c, 0xc5, 0xe5, 0x24, 0x53, 0xc6, 0x8d, 0xbb, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0xc6, 0x3d, 0x07, 0xc6, 0x52, - 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x9b, 0x80, 0x0b, 0x95, 0x6e, 0x77, 0x8b, 0x86, - 0x7b, 0x29, 0x29, 0x7e, 0xd9, 0x82, 0xf9, 0x03, 0x37, 0x88, 0x7a, 0x4e, 0x5b, 0xd9, 0xaf, 0x84, + 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x99, 0x80, 0x0b, 0x95, 0x6e, 0x77, 0x8b, 0x86, + 0x7b, 0x29, 0x29, 0x7e, 0xd1, 0x82, 0xf9, 0x03, 0x37, 0x88, 0x7a, 0x4e, 0x5b, 0xd9, 0xaf, 0x84, 0x3c, 0xf5, 0x71, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x92, 0xe3, 0xa3, 0xf2, 0x7c, 0xb2, - 0x0c, 0x53, 0xec, 0xc9, 0x3f, 0xb0, 0x60, 0x51, 0x16, 0xdd, 0xf4, 0x9b, 0xd4, 0xb4, 0x8f, 0xde, + 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb7, 0x60, 0x51, 0x16, 0xdd, 0xf4, 0x9b, 0xd4, 0xb4, 0x8f, 0xde, 0xce, 0x53, 0x26, 0x4d, 0x5c, 0xd8, 0xb5, 0xd2, 0xa5, 0xd8, 0x27, 0x84, 0xfd, 0x3f, 0x26, 0xe0, - 0xe2, 0x00, 0x1a, 0xe4, 0x37, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0xae, 0x6c, 0xcd, - 0x9f, 0xc9, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x5d, 0x62, 0xab, 0xe1, 0x5a, 0x06, + 0xe2, 0x00, 0x1a, 0xe4, 0xd7, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0xae, 0x6c, 0xcd, + 0x9f, 0xca, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x5d, 0x62, 0xab, 0xe1, 0x5a, 0x06, 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0xcc, 0xac, 0x29, 0x49, 0x27, 0x1e, 0x8b, 0xa4, 0xf5, 0x0c, - 0xd6, 0x98, 0x29, 0x90, 0xfd, 0xb7, 0xe0, 0xa9, 0x13, 0xc8, 0x3d, 0x7c, 0x72, 0xda, 0x6f, 0xeb, + 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x37, 0xe1, 0xa9, 0x13, 0xc8, 0x3d, 0x7c, 0x72, 0xda, 0x6f, 0xeb, 0x51, 0x9f, 0x1c, 0x73, 0x43, 0xcc, 0x6b, 0x1b, 0xa6, 0xf8, 0xd4, 0x51, 0x13, 0x1b, 0xd8, 0xf6, - 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x9e, 0x05, 0x33, 0x23, 0x58, 0xc3, 0xca, 0x49, 0x6b, + 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x8e, 0x05, 0x33, 0x23, 0x58, 0xc3, 0xca, 0x49, 0x6b, 0x58, 0xa9, 0xcf, 0x12, 0x16, 0xf5, 0x5b, 0xc2, 0x5e, 0x1f, 0xaf, 0x37, 0x86, 0xb1, 0x80, 0xfd, 0xc8, 0x82, 0xb3, 0x7d, 0x16, 0x33, 0xb2, 0x07, 0xe7, 0xbb, 0x7e, 0x53, 0xa9, 0x4d, 0xd7, 0x9d, 0x70, 0x8f, 0xc3, 0xe4, 0xe7, 0xbd, 0xc4, 0x7a, 0xb2, 0x96, 0x01, 0x7f, 0x70, 0x54, 0x5e, 0xd2, @@ -3409,7 +3409,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x54, 0x90, 0xae, 0x49, 0x6a, 0xc2, 0x58, 0xac, 0xfe, 0xa1, 0xe6, 0x62, 0x7f, 0x09, 0xe6, 0x93, 0x57, 0x12, 0x43, 0x74, 0xde, 0x25, 0x28, 0x38, 0x81, 0x27, 0xbb, 0x6e, 0x56, 0x22, 0x14, 0x2a, 0x78, 0x13, 0x59, 0x39, 0x79, 0x1e, 0x66, 0x76, 0x7b, 0xed, 0x36, 0xab, 0x20, 0xed, 0xff, 0x5a, - 0x1d, 0xbe, 0x26, 0xcb, 0x51, 0x63, 0xd8, 0x7f, 0x35, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x1e, + 0x1d, 0xbe, 0x26, 0xcb, 0x51, 0x63, 0xd8, 0x7f, 0x3e, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x1e, 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xea, 0xb4, 0x4d, 0x1b, 0x91, 0x1f, 0x48, 0x69, 0x2e, 0x4a, 0x42, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x35, 0x98, 0x77, 0x1a, 0x91, 0x7b, 0x40, 0x35, 0x05, 0x21, 0xee, 0x87, 0x24, 0x85, 0xf9, 0x4a, 0x02, 0x8a, @@ -3439,9 +3439,9 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, 0x4d, 0x4b, 0x6f, 0x65, 0xea, 0xee, 0x65, 0x69, 0x8e, 0x8b, 0x76, 0x6b, 0xcc, 0xd3, 0x73, 0xac, 0x3e, 0x28, 0xc2, 0xd5, 0x73, 0xc6, 0xce, 0xa8, 0x0a, 0x31, 0xcd, 0x9e, 0x7c, 0xc3, 0x52, 0x5b, 0xa3, 0x96, 0xe8, 0xcc, 0x69, 0x49, 0x44, 0xe2, 0x9d, 0x56, - 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x16, 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, - 0x9f, 0x46, 0x97, 0x8f, 0x8f, 0xca, 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0xb7, 0x8b, - 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, 0xfa, 0x1d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, + 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x1a, 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, + 0x9f, 0x46, 0x97, 0x8f, 0x8f, 0xca, 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0x37, 0x8b, + 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, 0xfa, 0x2d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0x99, 0xe3, 0xa3, 0xf2, 0xd3, 0x6b, 0x27, 0xf0, 0xc7, 0x13, 0xa5, 0x23, 0xff, 0xde, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xc6, 0x7e, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x26, 0x4e, 0xf5, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, 0xdb, 0x6b, @@ -3450,7 +3450,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, 0x1a, 0xd3, 0x57, 0x47, 0x9a, 0x07, 0xee, 0x08, 0x9a, 0xd5, 0xd9, 0xe3, 0xa3, 0xf2, 0xb4, 0xfc, 0x83, 0x8a, 0x13, 0xb9, 0x09, 0xf3, 0xe2, 0xc0, 0x56, 0x73, 0xbd, 0x56, 0xcd, 0xf7, 0x84, 0xc3, 0x49, 0xa9, 0xfa, 0x9c, 0xda, 0xf0, 0xeb, 0x09, 0xe8, 0x83, - 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xc1, 0x14, 0x80, 0x1a, + 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xde, 0x14, 0x80, 0x1a, 0xae, 0xb4, 0x4b, 0x3e, 0x0a, 0xa5, 0x90, 0x46, 0x82, 0xab, 0xbc, 0x41, 0x10, 0x17, 0x33, 0xaa, 0x10, 0x63, 0x38, 0xd9, 0x87, 0x62, 0xd7, 0xe9, 0x85, 0x54, 0x76, 0xfe, 0x8d, 0x5c, 0x3a, 0xbf, 0xc6, 0x28, 0x8a, 0x13, 0x1a, 0xff, 0x89, 0x82, 0x07, 0xf9, 0x8a, 0x05, 0x40, 0x93, 0x1d, 0x36, @@ -3476,15 +3476,15 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x22, 0x11, 0xcc, 0x74, 0x95, 0xc6, 0xb5, 0x90, 0xc7, 0xe8, 0x57, 0x1a, 0x98, 0xf0, 0x17, 0x60, 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, 0x36, 0xe1, 0x7c, 0xc7, 0xf5, 0x6a, 0x7e, 0x33, 0xac, 0xd1, 0x40, 0x5a, 0x5b, 0xea, 0x34, 0x5a, 0x5a, 0xe4, 0x6d, 0xc3, 0x4f, 0xd0, 0x5b, 0x19, 0x70, 0xcc, - 0xac, 0x65, 0xff, 0x4f, 0x0b, 0x16, 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xc7, 0x89, 0x1a, 0x7b, 0xe2, + 0xac, 0x65, 0xff, 0x2f, 0x0b, 0x16, 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xc7, 0x89, 0x1a, 0x7b, 0xe2, 0xaa, 0x9c, 0xbc, 0x06, 0x33, 0xae, 0x17, 0xd1, 0xe0, 0xc0, 0x69, 0xcb, 0xfd, 0xc9, 0x56, 0xe6, 0xd3, 0x0d, 0x59, 0xfe, 0xe0, 0xa8, 0x3c, 0xbf, 0xde, 0x0b, 0xb8, 0x3b, 0x9d, 0x58, 0xad, 0x50, 0xd7, 0x21, 0xdf, 0xb6, 0xe0, 0xac, 0xb8, 0x6c, 0x5f, 0x77, 0x22, 0xe7, 0x56, 0x8f, 0x06, 0x2e, 0x55, 0xd7, 0xed, 0x63, 0x2e, 0x54, 0x69, 0x59, 0x15, 0x83, 0xc3, 0x58, 0x51, 0xdf, 0x4a, 0x73, - 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x29, 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, + 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2a, 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, 0xd3, 0x41, 0xd2, 0x9d, 0xd8, 0x68, 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x0c, 0x45, 0xee, 0x5a, 0x29, - 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, 0x8c, 0x28, 0xca, 0xc9, 0x2f, 0x5a, 0x00, 0x42, 0x40, 0x76, + 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, 0x8c, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, 0x1a, 0x91, 0xbb, 0x24, 0xe6, 0xdb, 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, 0x0d, 0x53, 0x4c, 0xa1, 0xf5, 0x9b, 0x8f, 0xbc, 0x29, 0xf2, 0x2b, 0x99, 0x1a, 0xa7, 0x81, 0x92, 0x16, 0x6b, 0xab, 0x80, 0x46, 0xbd, 0xc0, 0x63, 0x4d, 0xcb, 0xb7, 0xc1, 0x19, 0x21, 0x05, 0xea, @@ -3497,49 +3497,49 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x5d, 0x71, 0x8a, 0x9d, 0xae, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, 0x05, 0x35, 0xf4, 0xf9, 0x55, 0x8d, 0x98, 0x4c, 0xba, 0xce, 0x96, 0x86, 0xa0, 0x81, 0xc5, 0xce, 0xa3, 0x9e, 0xd3, 0xa1, 0x61, 0xd7, 0xd1, 0xd1, 0x1d, 0xfc, 0x3c, 0x7a, 0x53, 0x15, 0x62, 0x0c, 0xb7, 0xdb, 0xf0, 0xec, 0x10, - 0x72, 0xe6, 0xe4, 0x3c, 0x6f, 0xff, 0x85, 0x05, 0x17, 0xd7, 0xda, 0xbd, 0x30, 0xa2, 0xc1, 0xff, - 0x37, 0x3e, 0x6c, 0xff, 0xcb, 0x82, 0xa7, 0x06, 0x7c, 0xf3, 0x63, 0x70, 0x65, 0x7b, 0x27, 0xe9, - 0xca, 0x76, 0x7b, 0xdc, 0x21, 0x9d, 0xf9, 0x1d, 0x03, 0x3c, 0xda, 0x7e, 0xd3, 0x82, 0x33, 0x6c, - 0xd9, 0x6a, 0xfa, 0xad, 0x9c, 0x36, 0xce, 0x67, 0xa1, 0xf8, 0xf3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, + 0x72, 0xe6, 0xe4, 0x3c, 0x6f, 0xff, 0x4f, 0x0b, 0x2e, 0xae, 0xb5, 0x7b, 0x61, 0x44, 0x83, 0xbf, + 0x30, 0x3e, 0x6c, 0xff, 0xdb, 0x82, 0xa7, 0x06, 0x7c, 0xf3, 0x63, 0x70, 0x65, 0x7b, 0x27, 0xe9, + 0xca, 0x76, 0x7b, 0xdc, 0x21, 0x9d, 0xf9, 0x1d, 0x03, 0x3c, 0xda, 0x7e, 0xdd, 0x82, 0x33, 0x6c, + 0xd9, 0x6a, 0xfa, 0xad, 0x9c, 0x36, 0xce, 0x67, 0xa1, 0xf8, 0xb3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, 0xbe, 0x2b, 0xa1, 0x80, 0xb1, 0x39, 0xe3, 0x74, 0xdd, 0xb7, 0x68, 0xc0, 0x37, 0xa0, 0x42, 0x72, 0xce, 0x54, 0x34, 0x04, 0x0d, 0x2c, 0xfb, 0xd3, 0x20, 0x9d, 0xc5, 0x52, 0x33, 0xce, 0x1a, 0x66, 0xc6, 0xd9, 0xff, 0x71, 0x02, 0x0c, 0xe3, 0xc7, 0x63, 0x18, 0xc9, 0x5e, 0x62, 0x24, 0x8f, 0x79, 0x70, 0x37, 0x4c, 0x39, 0x83, 0x82, 0x79, 0x0e, 0x52, 0xc1, 0x3c, 0x37, 0x73, 0xe3, 0x78, 0x72, 0x2c, 0xcf, 0xf7, 0x2d, 0x78, 0x2a, 0x46, 0xee, 0xb7, 0x4b, 0x3e, 0x7c, 0x59, 0x7a, 0x19, 0x66, 0x9d, 0xb8, 0x9a, 0x1c, 0x37, 0x46, 0x24, 0x85, 0x06, 0xa1, 0x89, 0x17, 0xfb, 0xa0, 0x17, 0x1e, - 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0x2f, 0x27, 0xe0, 0x52, 0xff, 0x97, 0xa9, 0x09, + 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0xcf, 0x26, 0xe0, 0x52, 0xff, 0x97, 0xa9, 0x09, 0x35, 0xdc, 0x25, 0xff, 0x2b, 0x30, 0x17, 0xc9, 0x0a, 0xc6, 0xf6, 0xa0, 0xa3, 0x3a, 0xb7, 0x0d, 0x18, 0x26, 0x30, 0x59, 0xcd, 0x86, 0x98, 0xca, 0xf5, 0x86, 0xdf, 0x55, 0x11, 0x0c, 0xba, 0xe6, 0x9a, 0x01, 0xc3, 0x04, 0xa6, 0xf6, 0x0d, 0x9d, 0x3c, 0x75, 0xdf, 0xd0, 0x3a, 0x5c, 0x50, 0xde, 0x70, 0xd7, 0xfc, 0x60, 0xcd, 0xef, 0x74, 0xdb, 0x54, 0xc6, 0x30, 0x30, 0x61, 0x2f, 0xc9, 0x2a, 0x17, 0x30, 0x0b, 0x09, 0xb3, 0xeb, 0xda, 0xdf, 0x2f, 0xc0, 0xb9, 0xb8, 0xd9, 0xd7, 0x7c, 0xaf, - 0xe9, 0x72, 0x9f, 0xc2, 0x57, 0x61, 0x32, 0x3a, 0xec, 0xaa, 0xc6, 0xfe, 0x6b, 0x4a, 0x9c, 0xed, + 0xe9, 0x72, 0x9f, 0xc2, 0x57, 0x61, 0x32, 0x3a, 0xec, 0xaa, 0xc6, 0xfe, 0xab, 0x4a, 0x9c, 0xed, 0xc3, 0x2e, 0xeb, 0xed, 0x8b, 0x19, 0x55, 0xb8, 0x65, 0x98, 0x57, 0x22, 0x9b, 0x7a, 0x76, 0x88, 0x1e, 0x78, 0x29, 0x39, 0x9a, 0x1f, 0x1c, 0x95, 0x33, 0x82, 0x9a, 0x57, 0x34, 0xa5, 0xe4, 0x98, 0x27, 0x77, 0x61, 0xbe, 0xed, 0x84, 0xd1, 0xed, 0x6e, 0xd3, 0x89, 0xe8, 0xb6, 0x2b, 0x3d, 0x34, 0x46, 0x0b, 0x0c, 0xd0, 0x57, 0xd9, 0x9b, 0x09, 0x4a, 0x98, 0xa2, 0x4c, 0x0e, 0x80, 0xb0, 0x92, 0xed, 0xc0, 0xf1, 0x42, 0xf1, 0x55, 0x8c, 0xdf, 0xe8, 0x81, 0x08, 0xfa, 0x64, 0xb8, 0xd9, 0x47, 0x0d, 0x33, 0x38, 0x90, 0xe7, 0x60, 0x2a, 0xa0, 0x4e, 0x28, 0x3b, 0xb3, 0x14, 0xcf, 0x7f, 0xe4, - 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x7a, 0xc8, 0x84, 0xfa, 0x33, 0x0b, 0xe6, 0xe3, 0x6e, 0x7a, - 0x0c, 0x3b, 0x6b, 0x27, 0xb9, 0xb3, 0x5e, 0xcf, 0x6b, 0x49, 0x1c, 0xb0, 0x99, 0xfe, 0xe1, 0x94, + 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x7a, 0xc8, 0x84, 0xfa, 0x13, 0x0b, 0xe6, 0xe3, 0x6e, 0x7a, + 0x0c, 0x3b, 0x6b, 0x27, 0xb9, 0xb3, 0x5e, 0xcf, 0x6b, 0x49, 0x1c, 0xb0, 0x99, 0xfe, 0xfe, 0x94, 0xf9, 0x7d, 0xdc, 0x31, 0xfc, 0x8b, 0x50, 0x52, 0xb3, 0x5a, 0xa9, 0xac, 0x63, 0x1e, 0xb0, 0x13, 0xca, 0x8c, 0x11, 0xd0, 0x24, 0x99, 0x60, 0xcc, 0x8f, 0x6d, 0xe5, 0x4d, 0xb9, 0x4d, 0xcb, 0x61, 0xaf, 0xb7, 0x72, 0xb5, 0x7d, 0x67, 0x6d, 0xe5, 0xaa, 0x0e, 0xb9, 0x0d, 0x17, 0xbb, 0x81, 0xcf, 0xc3, 0x6a, 0xd7, 0xa9, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x56, 0x0c, 0xe1, 0x49, 0xf1, 0xd4, 0xf1, 0x51, 0xf9, 0x62, 0x2d, 0x1b, 0x05, 0x07, 0xd5, 0x4d, 0x06, 0x66, 0x4d, 0x0e, 0x11, 0x98, 0xf5, - 0x77, 0xb5, 0xad, 0x90, 0x86, 0x32, 0x3c, 0xea, 0x73, 0x79, 0x75, 0x65, 0xc6, 0xb2, 0x1e, 0x0f, + 0x77, 0xb4, 0xad, 0x90, 0x86, 0x32, 0x3c, 0xea, 0x73, 0x79, 0x75, 0x65, 0xc6, 0xb2, 0x1e, 0x0f, 0xa9, 0x8a, 0x64, 0x8a, 0x9a, 0xfd, 0x60, 0x83, 0xd4, 0xd4, 0x23, 0x1a, 0xa4, 0x62, 0xff, 0xfa, 0xe9, 0x1f, 0xa7, 0x7f, 0xfd, 0xcc, 0x07, 0xca, 0xbf, 0xfe, 0xfd, 0x22, 0x2c, 0xa6, 0x35, 0x90, - 0xd3, 0x0f, 0x3a, 0xfb, 0xfb, 0x16, 0x2c, 0xaa, 0xd9, 0x23, 0x78, 0x52, 0x75, 0xd5, 0xb0, 0x99, + 0xd3, 0x0f, 0x3a, 0xfb, 0x7b, 0x16, 0x2c, 0xaa, 0xd9, 0x23, 0x78, 0x52, 0x75, 0xd5, 0xb0, 0x99, 0xd3, 0xa4, 0x15, 0xba, 0x94, 0x8e, 0xc6, 0xdf, 0x4e, 0x71, 0xc3, 0x3e, 0xfe, 0xe4, 0x6d, 0x98, 0xd5, 0x16, 0xf9, 0x47, 0x8a, 0x40, 0x5b, 0xe0, 0x5a, 0x54, 0x4c, 0x02, 0x4d, 0x7a, 0xe4, 0x7d, 0x0b, 0xa0, 0xa1, 0xb6, 0x39, 0x35, 0xbb, 0x6e, 0xe5, 0x35, 0xbb, 0xf4, 0x06, 0x1a, 0x2b, 0xcb, - 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x15, 0x6e, 0x8b, 0xd7, 0xda, 0x9d, 0x88, 0xf2, 0x1f, 0xdb, + 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x25, 0x6e, 0x8b, 0xd7, 0xda, 0x9d, 0x88, 0xf2, 0x1f, 0xdb, 0x77, 0xf8, 0x04, 0xc5, 0x34, 0x56, 0xa5, 0x0c, 0x50, 0x88, 0x09, 0x21, 0xec, 0x57, 0x41, 0x7b, 0x7b, 0xb2, 0x65, 0x8b, 0xfb, 0x7b, 0xd6, 0x9c, 0x68, 0x4f, 0x0e, 0x41, 0xbd, 0x6c, 0x5d, 0x53, 0x00, 0x8c, 0x71, 0xec, 0x2f, 0xc0, 0xfc, 0xeb, 0x81, 0xd3, 0xdd, 0x73, 0xb9, 0xcd, 0x9b, 0x9d, 0xad, 0x3e, 0x02, 0xd3, 0x4e, 0xb3, 0x99, 0x95, 0x38, 0xa2, 0x22, 0x8a, 0x51, 0xc1, 0x87, 0x3a, - 0x46, 0xd9, 0x7f, 0x60, 0x01, 0x89, 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, + 0x46, 0xd9, 0xbf, 0x67, 0x01, 0x89, 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, 0x3e, 0xda, 0xe3, 0xa5, 0x59, 0xe7, 0xa3, 0xeb, 0x1a, 0x82, 0x06, 0x16, 0x79, 0x17, 0x66, 0xc5, 0xbf, 0xb7, 0xb4, 0x85, 0x60, 0xec, 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x99, 0xc4, 0x28, 0xbc, 0x1e, 0x73, 0x40, 0x93, 0x1d, 0x6b, 0xaa, 0x0d, 0x6f, 0xb7, 0xdd, 0xbb, 0xdf, 0xdc, 0x89, 0x9b, 0xaa, @@ -3548,16 +3548,16 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x3d, 0x8c, 0xe3, 0xf6, 0x3a, 0x2c, 0xca, 0x3b, 0xcc, 0xde, 0x4e, 0x48, 0x23, 0x43, 0x8f, 0xd7, 0xf3, 0x78, 0x2d, 0x05, 0xc7, 0xbe, 0x1a, 0x8c, 0x8a, 0xbc, 0xcc, 0x8c, 0xa9, 0x14, 0x92, 0x54, 0xea, 0x29, 0x38, 0xf6, 0xd5, 0xb0, 0xbf, 0x57, 0x80, 0x73, 0xfc, 0x33, 0x52, 0x41, 0x17, 0xdf, - 0x18, 0x14, 0x74, 0x31, 0xe6, 0x54, 0xe6, 0xbc, 0x1e, 0x21, 0xe4, 0xe2, 0xef, 0x59, 0xb0, 0xd0, + 0x18, 0x14, 0x74, 0x31, 0xe6, 0x54, 0xe6, 0xbc, 0x1e, 0x21, 0xe4, 0xe2, 0xef, 0x5a, 0xb0, 0xd0, 0x4c, 0xb6, 0x74, 0x3e, 0x36, 0x9d, 0xac, 0x3e, 0x14, 0x2e, 0x5b, 0xa9, 0x42, 0x4c, 0xf3, 0x27, - 0xbf, 0x6a, 0xc1, 0x42, 0x52, 0x4c, 0xb5, 0xba, 0x9f, 0x42, 0x23, 0x69, 0x1f, 0xeb, 0x64, 0x79, - 0x88, 0x69, 0x11, 0xec, 0x3f, 0x9a, 0x90, 0x5d, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, 0x94, 0xa2, + 0xbf, 0x6c, 0xc1, 0x42, 0x52, 0x4c, 0xb5, 0xba, 0x9f, 0x42, 0x23, 0x69, 0x1f, 0xeb, 0x64, 0x79, + 0x88, 0x69, 0x11, 0xec, 0x3f, 0x98, 0x90, 0x5d, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, 0x94, 0xa2, 0x76, 0x28, 0x0a, 0xe5, 0xd7, 0x8e, 0x79, 0x22, 0xdc, 0xde, 0xac, 0x0b, 0xf7, 0x81, 0x58, 0x69, 0x93, 0x25, 0x4c, 0xf9, 0x54, 0xbc, 0x38, 0xe3, 0x46, 0x57, 0x32, 0xce, 0xe5, 0x28, 0xba, 0xbd, - 0x56, 0x4b, 0x33, 0x96, 0x25, 0x8c, 0xb1, 0xe2, 0x65, 0xff, 0x96, 0x05, 0xa5, 0x1b, 0xbe, 0x5a, - 0x47, 0x7e, 0x36, 0x07, 0x43, 0x8f, 0xd6, 0x07, 0xf5, 0x35, 0x65, 0x7c, 0xc4, 0x78, 0x2d, 0x61, + 0x56, 0x4b, 0x33, 0x96, 0x25, 0x8c, 0xb1, 0xe2, 0x65, 0xff, 0x86, 0x05, 0xa5, 0x1b, 0xbe, 0x5a, + 0x47, 0x7e, 0x3a, 0x07, 0x43, 0x8f, 0xd6, 0x07, 0xf5, 0x35, 0x65, 0x7c, 0xc4, 0x78, 0x2d, 0x61, 0xe6, 0x79, 0xda, 0xa0, 0xbd, 0xc2, 0xf3, 0x67, 0x31, 0x52, 0x37, 0xfc, 0x9d, 0x81, 0xa6, 0xc7, - 0x5f, 0x2b, 0xc2, 0x99, 0x37, 0x9c, 0x43, 0xea, 0x45, 0xce, 0xe8, 0x9b, 0xc4, 0xcb, 0x30, 0xeb, + 0x5f, 0x29, 0xc2, 0x99, 0x37, 0x9c, 0x43, 0xea, 0x45, 0xce, 0xe8, 0x9b, 0xc4, 0xcb, 0x30, 0xeb, 0x74, 0xf9, 0x3d, 0x98, 0xa1, 0xe3, 0xc7, 0x96, 0x93, 0x18, 0x84, 0x26, 0x5e, 0xbc, 0xa0, 0x89, 0xec, 0x3a, 0x59, 0x4b, 0xd1, 0x5a, 0x0a, 0x8e, 0x7d, 0x35, 0xc8, 0x0d, 0x20, 0x32, 0x1a, 0xb5, 0xd2, 0x68, 0xf8, 0x3d, 0x4f, 0x2c, 0x69, 0xc2, 0xa8, 0xa2, 0x0f, 0x9b, 0x5b, 0x7d, 0x18, 0x98, @@ -3566,7 +3566,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xa7, 0x92, 0x92, 0xd6, 0xfb, 0x30, 0x30, 0xa3, 0x16, 0xf9, 0x12, 0x94, 0xa2, 0xbd, 0x80, 0x86, 0x7b, 0x7e, 0xbb, 0x29, 0xfd, 0x16, 0xc6, 0xb4, 0xb4, 0xc9, 0xde, 0xdf, 0x56, 0x54, 0x8d, 0xe1, 0xad, 0x8a, 0x30, 0xe6, 0x49, 0x02, 0x98, 0x0a, 0x1b, 0x7e, 0x97, 0x86, 0x52, 0x65, 0xbf, 0x91, - 0x0b, 0x77, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x03, 0x4a, 0x4e, 0xf6, 0xef, 0x4f, 0xc0, 0x9c, + 0x0b, 0x77, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x03, 0x4a, 0x4e, 0xf6, 0xef, 0x4e, 0xc0, 0x9c, 0x89, 0x38, 0xc4, 0xda, 0xf4, 0x15, 0x0b, 0xe6, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x5b, 0xd8, 0xaf, 0xf2, 0xd1, 0x28, 0x18, 0xa9, 0x75, 0x1a, 0x39, 0x6e, 0xdb, 0x30, 0x85, 0x19, 0x6c, 0x30, 0xc1, 0x94, 0x7c, 0xdd, 0x82, 0x85, 0xd8, 0xcd, 0x2d, 0x36, 0xa4, 0xe5, 0x2a, 0x88, 0x5e, 0xea, 0xaf, @@ -3580,7 +3580,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x15, 0xb5, 0xfd, 0x88, 0x5c, 0x43, 0x27, 0xed, 0x4a, 0xdb, 0x30, 0x13, 0xd0, 0xb0, 0xd7, 0x61, 0x27, 0xc6, 0xe9, 0x91, 0x9b, 0x81, 0xbb, 0x6d, 0xa0, 0xac, 0x8f, 0x9a, 0xd2, 0xf2, 0xab, 0x70, 0x26, 0x21, 0xc2, 0x48, 0xd9, 0x87, 0x7c, 0xc8, 0x34, 0x00, 0x3c, 0xca, 0x65, 0x0e, 0xeb, 0x8b, - 0xb6, 0x91, 0xad, 0x43, 0xf7, 0x85, 0x70, 0xce, 0x11, 0x30, 0xfb, 0x2f, 0xa7, 0x40, 0xde, 0x7f, + 0xb6, 0x91, 0xad, 0x43, 0xf7, 0x85, 0x70, 0xce, 0x11, 0x30, 0xfb, 0xcf, 0xa6, 0x40, 0xde, 0x7f, 0x0f, 0xb1, 0x5c, 0x99, 0xb7, 0x5e, 0x13, 0x8f, 0x70, 0xeb, 0x75, 0x03, 0xe6, 0x5c, 0xcf, 0x8d, 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xde, 0xcb, 0x73, 0x1b, 0x06, 0x2c, 0x83, 0x4e, 0xa2, 0x2e, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x01, 0x3c, 0xfa, 0x25, 0x3d, 0xf7, 0xcf, 0x10, @@ -3593,7 +3593,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xff, 0x07, 0xf4, 0x6a, 0x10, 0xf8, 0x81, 0xe0, 0x5d, 0x7a, 0x44, 0xde, 0xdc, 0xa6, 0xb8, 0x96, 0x45, 0x12, 0xb3, 0x39, 0x91, 0x77, 0x60, 0xa6, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, 0x7d, 0x6f, 0x33, 0x8f, 0x7c, 0x24, 0x35, 0x49, 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, - 0x9e, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x05, 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, + 0x99, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x39, 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, 0xc8, 0xcd, 0x71, 0xd3, 0x5e, 0x28, 0x7a, 0xca, 0xe5, 0x85, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x1b, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x0f, 0x68, 0x90, 0x45, 0xa8, 0x18, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, 0x5c, 0xdf, 0xa1, @@ -3610,9 +3610,9 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x0e, 0xf7, 0x0f, 0xef, 0x39, 0xed, 0x7d, 0xd7, 0x6b, 0xc9, 0x38, 0xc7, 0x71, 0xb3, 0xdb, 0xee, 0x1f, 0xde, 0x11, 0xf4, 0xcc, 0xf6, 0x8e, 0x4b, 0xd1, 0xe0, 0x48, 0xfe, 0xb1, 0x05, 0x53, 0xdd, 0x76, 0xaf, 0xe5, 0x7a, 0x4b, 0x73, 0x5c, 0x4f, 0xfc, 0x4c, 0x9e, 0x2b, 0xf4, 0x4a, 0x8d, 0x93, - 0x16, 0x8a, 0xe2, 0x4f, 0x6b, 0x9f, 0x3d, 0x5e, 0xf8, 0x4b, 0x7f, 0x5e, 0x5e, 0xa2, 0x5e, 0xc3, + 0x16, 0x8a, 0xe2, 0x4f, 0x6a, 0x9f, 0x3d, 0x5e, 0xf8, 0x0b, 0x7f, 0x5a, 0x5e, 0xa2, 0x5e, 0xc3, 0x6f, 0xba, 0x5e, 0x6b, 0xf5, 0x6e, 0xe8, 0x7b, 0x2b, 0xe8, 0xdc, 0x53, 0x3a, 0xba, 0x94, 0x69, - 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x98, 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x35, 0x05, 0x73, + 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x98, 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x31, 0x05, 0x73, 0x66, 0x46, 0xbd, 0x21, 0xb4, 0x2f, 0x7d, 0xe2, 0x98, 0x18, 0xe5, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0xed, 0x91, 0x32, 0x6f, 0x6d, 0xe4, 0xa6, 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x11, 0x1c, 0x4a, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x2f, 0x00, @@ -3625,186 +3625,187 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x1d, 0xfe, 0xb0, 0x35, 0xde, 0xb1, 0xe8, 0x0b, 0x30, 0x9f, 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, 0xda, 0x24, 0x9c, 0xbb, 0xd9, 0x72, 0xbd, 0x74, 0xb6, 0xa8, 0xac, 0x64, 0xe1, 0xd6, 0xc8, 0xc9, 0xc2, 0x75, 0x3c, 0x97, 0x4c, 0xc5, 0x9d, 0x1d, 0xcf, 0xa5, 0xf2, 0xa2, 0x27, 0x71, 0xc9, 0x9f, - 0x59, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x46, 0x87, - 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xab, 0xe8, 0xf1, 0x9f, 0x92, 0x5f, 0xf0, - 0xf4, 0x49, 0xa8, 0x78, 0xa2, 0xf8, 0xe4, 0x6f, 0xc2, 0x42, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, + 0x58, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x46, 0x87, + 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xab, 0xe8, 0xf1, 0x9f, 0x90, 0x5f, 0xf0, + 0xf4, 0x49, 0xa8, 0x78, 0xa2, 0xf8, 0xe4, 0x6f, 0xc0, 0x42, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, 0x2e, 0x2c, 0xea, 0x49, 0x10, 0xa6, 0x71, 0x97, 0xdf, 0x84, 0x0f, 0x3f, 0x54, 0xce, 0x91, 0x06, 0xdb, 0x57, 0x2c, 0x28, 0x09, 0xbb, 0x36, 0xd2, 0xdd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, 0xa9, 0x6d, 0x64, 0x38, 0x61, 0xb2, 0xb5, 0x7c, 0xdf, 0xf5, 0x9a, 0xb2, 0x97, 0xf5, 0x5a, 0xfe, 0x86, - 0xeb, 0x35, 0x91, 0x43, 0xf4, 0x6a, 0x5f, 0x18, 0x68, 0x6f, 0xfa, 0x75, 0x0b, 0xe6, 0x79, 0x0c, + 0xeb, 0x35, 0x91, 0x43, 0xf4, 0x6a, 0x5f, 0x18, 0x68, 0x6f, 0xfa, 0x55, 0x0b, 0xe6, 0x79, 0x0c, 0x6c, 0x7c, 0x26, 0x7c, 0x59, 0x3b, 0x1b, 0x09, 0x31, 0x2e, 0x25, 0x9d, 0x8d, 0x1e, 0x1c, 0x95, 0x67, 0x45, 0xd4, 0x6c, 0xd2, 0xf7, 0xe8, 0x73, 0xd2, 0x90, 0xc4, 0x5d, 0xa2, 0x26, 0x46, 0xb6, 0x73, 0x68, 0x43, 0x6b, 0x5d, 0x11, 0xc1, 0x98, 0x9e, 0xfd, 0x2e, 0xcc, 0x99, 0xc1, 0x2c, 0xe4, 0x65, 0x98, 0xed, 0xba, 0x5e, 0x2b, 0x19, 0xf4, 0xa8, 0x8d, 0xed, 0xb5, 0x18, 0x84, 0x26, 0x1e, 0xaf, 0xe6, 0xc7, 0xd5, 0x52, 0x36, 0xfa, 0x9a, 0x6f, 0x56, 0x8b, 0xff, 0xf0, 0x1c, 0xdb, 0x19, - 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xe0, 0xf1, 0xe3, 0xcb, 0xb1, 0x9d, 0x25, 0xcc, 0xff, 0x5d, - 0x39, 0xb6, 0x7f, 0x06, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0x6e, 0x71, + 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xe0, 0xf1, 0xe3, 0xcb, 0xb1, 0x9d, 0x25, 0xcc, 0xff, 0x5b, + 0x39, 0xb6, 0x7f, 0x0a, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0x6e, 0x71, 0x19, 0x99, 0x2e, 0xa1, 0xf6, 0x7b, 0x6c, 0xda, 0xe8, 0x43, 0x6d, 0xa5, 0x17, 0xed, 0x11, 0x0f, 0x8a, 0xa1, 0xdb, 0x3a, 0x78, 0x29, 0x27, 0x9b, 0x36, 0x23, 0x25, 0x1f, 0x66, 0x88, 0x03, 0x62, - 0x59, 0x21, 0x0a, 0x36, 0xf6, 0x5f, 0x58, 0xb0, 0x98, 0x3e, 0x79, 0xe7, 0xed, 0xd4, 0x40, 0xbe, - 0x6e, 0xc1, 0xbc, 0xd3, 0x8b, 0xf6, 0xa8, 0x17, 0xa9, 0x8b, 0xad, 0x5c, 0xde, 0x0c, 0x49, 0xb6, - 0x9d, 0x91, 0xc2, 0x2a, 0xc1, 0x0b, 0x53, 0xbc, 0xed, 0x8f, 0xc3, 0x88, 0x19, 0x22, 0xed, 0xab, - 0x40, 0xd0, 0x6f, 0xb7, 0x77, 0x9c, 0xc6, 0xfe, 0x1d, 0xd7, 0x6b, 0xfa, 0xf7, 0xf8, 0xf2, 0xb1, - 0x0a, 0xa5, 0x40, 0x86, 0x09, 0x86, 0xb2, 0xa7, 0xf5, 0xfa, 0xa3, 0xe2, 0x07, 0x43, 0x8c, 0x71, - 0xec, 0x3f, 0x9a, 0x80, 0x69, 0x19, 0xd3, 0xfa, 0x18, 0xdc, 0xd5, 0xf7, 0x13, 0xf7, 0x98, 0x1b, - 0xb9, 0x84, 0xe2, 0x0e, 0xf4, 0x55, 0x0f, 0x53, 0xbe, 0xea, 0x6f, 0xe4, 0xc3, 0xee, 0x64, 0x47, - 0xf5, 0x3f, 0x2c, 0xc2, 0x42, 0x2a, 0x46, 0x98, 0xe9, 0x90, 0x7d, 0xfe, 0x99, 0xb7, 0x73, 0x0d, - 0x43, 0xd6, 0xf1, 0x17, 0x27, 0xbb, 0x6a, 0x86, 0x89, 0x7c, 0xbe, 0xb7, 0x72, 0x7b, 0xaa, 0xe0, - 0x27, 0xa9, 0x7d, 0x47, 0x74, 0x3d, 0x24, 0xdf, 0xb6, 0xe0, 0x9c, 0xd3, 0xff, 0xd6, 0x83, 0xb4, - 0x75, 0xdd, 0xca, 0xfd, 0x11, 0x89, 0xea, 0x53, 0x52, 0xc8, 0xac, 0x27, 0x35, 0x30, 0x4b, 0x14, - 0xfb, 0xbf, 0x58, 0xf0, 0xe4, 0xc0, 0x68, 0x77, 0x9e, 0x2c, 0x29, 0x48, 0x42, 0xe5, 0x9a, 0x91, - 0x73, 0x4e, 0x0f, 0x7d, 0xef, 0x99, 0xce, 0x6f, 0x93, 0x66, 0x4f, 0x5e, 0x82, 0x39, 0xae, 0x57, - 0xb1, 0xd5, 0x33, 0xa2, 0x5d, 0x79, 0x6d, 0xc3, 0x0d, 0xf8, 0x75, 0xa3, 0x1c, 0x13, 0x58, 0xf6, - 0xb7, 0x2d, 0x58, 0x1a, 0x94, 0x3a, 0x67, 0x08, 0xa3, 0xc2, 0xdf, 0x48, 0xb9, 0xfc, 0x97, 0xfb, - 0x5c, 0xfe, 0x53, 0x66, 0x05, 0xe5, 0xdd, 0x6f, 0x9c, 0xe8, 0x0b, 0x0f, 0xf1, 0x68, 0xff, 0x86, - 0x05, 0x17, 0x07, 0x4c, 0xf8, 0xbe, 0xd0, 0x0f, 0xeb, 0x91, 0x43, 0x3f, 0x26, 0x86, 0x0d, 0xfd, - 0xb0, 0xff, 0xb8, 0x00, 0x8b, 0x52, 0x9e, 0x58, 0xb9, 0x7e, 0x25, 0x11, 0x38, 0xf1, 0x53, 0xa9, - 0xc0, 0x89, 0xf3, 0x69, 0xfc, 0x9f, 0x44, 0x4d, 0x7c, 0xb0, 0xa2, 0x26, 0xfe, 0x6a, 0x02, 0x2e, - 0x64, 0x66, 0xf4, 0x21, 0x5f, 0xcb, 0xd8, 0xbd, 0xee, 0xe4, 0x9c, 0x3a, 0x68, 0xc8, 0xfd, 0x6b, - 0xdc, 0x50, 0x83, 0x5f, 0x35, 0x5d, 0xfc, 0xc5, 0x6e, 0xb4, 0x7b, 0x0a, 0x49, 0x90, 0x46, 0xf4, - 0xf6, 0xb7, 0x7f, 0xa9, 0x00, 0x57, 0x86, 0x25, 0xf4, 0x01, 0x8d, 0x06, 0x0b, 0x13, 0xd1, 0x60, - 0x8f, 0x49, 0xb3, 0x38, 0x95, 0xc0, 0xb0, 0x7f, 0x3a, 0xa9, 0xb7, 0xbd, 0xfe, 0xf1, 0x39, 0xd4, - 0x1d, 0xff, 0x34, 0xd3, 0x3e, 0x55, 0x56, 0xe0, 0x78, 0x29, 0x9c, 0xae, 0x8b, 0xe2, 0x07, 0x47, - 0xe5, 0xb3, 0x71, 0x5e, 0x09, 0x59, 0x88, 0xaa, 0x12, 0xb9, 0x02, 0x33, 0x81, 0x80, 0xaa, 0xf8, - 0x17, 0xe9, 0x28, 0x21, 0xca, 0x50, 0x43, 0xc9, 0x97, 0x0c, 0x75, 0x7d, 0xf2, 0xb4, 0xd2, 0xa7, - 0x9c, 0xe4, 0xff, 0xf1, 0x36, 0xcc, 0x84, 0x2a, 0x63, 0xaf, 0x50, 0x5c, 0x5e, 0x1c, 0x32, 0xac, - 0x8a, 0x9d, 0x9b, 0x55, 0xfa, 0x5e, 0xf1, 0x7d, 0x3a, 0xb9, 0xaf, 0x26, 0x49, 0x6c, 0x7d, 0x64, - 0x15, 0xf6, 0x69, 0xe8, 0x3f, 0xae, 0x92, 0x08, 0xa6, 0xe5, 0x8b, 0x86, 0xf2, 0xe2, 0x6c, 0x2b, - 0xa7, 0x10, 0x0a, 0xe9, 0x60, 0xcb, 0xaf, 0x27, 0x95, 0xe9, 0x44, 0xb1, 0xb2, 0xbf, 0x6f, 0xc1, - 0xac, 0x1c, 0x23, 0x8f, 0x21, 0xbe, 0xec, 0x6e, 0x32, 0xbe, 0xec, 0x6a, 0x2e, 0x2b, 0xd6, 0x80, - 0xe0, 0xb2, 0xbb, 0x30, 0x67, 0xa6, 0x92, 0x23, 0x9f, 0x35, 0x56, 0x5c, 0x6b, 0x9c, 0xe4, 0x4c, - 0x6a, 0x4d, 0x8e, 0x57, 0x63, 0xfb, 0xb7, 0x4b, 0xba, 0x15, 0xf9, 0xd9, 0xd5, 0x1c, 0xf9, 0xd6, - 0x89, 0x23, 0xdf, 0x1c, 0x78, 0x13, 0xf9, 0x0f, 0xbc, 0x5b, 0x30, 0xa3, 0x96, 0x45, 0xa9, 0x3c, - 0x3c, 0x6b, 0x7a, 0xdc, 0x32, 0x0d, 0x84, 0x11, 0x33, 0xa6, 0x0b, 0x3f, 0x83, 0xea, 0x3e, 0xd4, - 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x81, 0xd9, 0x7b, 0x7e, 0xb0, 0xdf, 0xf6, 0x1d, 0x9e, 0x2f, 0x1c, - 0xf2, 0xb8, 0xe4, 0xd5, 0x36, 0x56, 0x11, 0xf6, 0x70, 0x27, 0xa6, 0x8f, 0x26, 0x33, 0x52, 0x81, - 0x85, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0x8c, 0x6c, 0x52, 0xa4, 0x28, 0x56, 0xaa, 0xf5, 0x56, - 0x12, 0x8c, 0x69, 0x7c, 0x6e, 0x2d, 0x09, 0x12, 0xd6, 0x06, 0x99, 0x87, 0xb4, 0x36, 0xfe, 0x60, - 0x4c, 0x5a, 0x30, 0x84, 0xdf, 0x7f, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0x17, 0x61, 0x26, 0x94, 0x79, - 0xe2, 0xf2, 0xf1, 0x0e, 0xd0, 0x67, 0x7b, 0x41, 0x34, 0xee, 0x4a, 0x55, 0x82, 0x9a, 0x21, 0xd9, - 0x84, 0xf3, 0xca, 0x7c, 0x92, 0x78, 0xd3, 0x69, 0x2a, 0x4e, 0x2b, 0x84, 0x19, 0x70, 0xcc, 0xac, - 0xc5, 0x54, 0x39, 0x9e, 0xa2, 0x51, 0x5c, 0xaa, 0x19, 0xf7, 0x50, 0x7c, 0xfe, 0x35, 0x51, 0x42, - 0x4f, 0x8a, 0x92, 0x9c, 0x19, 0x23, 0x4a, 0xb2, 0x0e, 0x17, 0xd2, 0x20, 0x9e, 0x2f, 0x8a, 0xa7, - 0xa8, 0x32, 0xb6, 0xd0, 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa0, 0x14, 0x50, 0x7e, 0xc8, - 0xaa, 0x28, 0x7f, 0xa4, 0x91, 0x3d, 0x2f, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, - 0x34, 0xf8, 0x56, 0x8e, 0x8f, 0x89, 0xca, 0xbe, 0x1f, 0x90, 0xc7, 0xcd, 0xfe, 0x77, 0x0b, 0x70, - 0x26, 0x61, 0x03, 0x22, 0xcf, 0x42, 0x91, 0x27, 0xd0, 0xe2, 0xab, 0xd5, 0x4c, 0xbc, 0xa2, 0x8a, - 0xc6, 0x11, 0x30, 0xf2, 0xcb, 0x16, 0x2c, 0x74, 0x13, 0xf7, 0x10, 0x6a, 0x21, 0x1f, 0xd7, 0xd2, - 0x98, 0x20, 0x6a, 0xa4, 0xdb, 0x4f, 0x32, 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0xf7, 0xe5, 0x36, - 0x0d, 0x38, 0xb6, 0x54, 0xf4, 0x34, 0x89, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, - 0x8d, 0xf3, 0x5c, 0x5d, 0x45, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x0d, 0xe6, 0x65, 0xae, 0xd8, 0x9a, - 0xdf, 0xbc, 0xee, 0x84, 0x7b, 0xf2, 0x84, 0xa3, 0x4f, 0x64, 0x6b, 0x09, 0x28, 0xa6, 0xb0, 0xf9, - 0xb7, 0xc5, 0x09, 0x79, 0x39, 0x81, 0xa9, 0xe4, 0x6b, 0x04, 0x6b, 0x49, 0x30, 0xa6, 0xf1, 0xc9, - 0xf3, 0xc6, 0x36, 0x24, 0x2e, 0xba, 0xf5, 0x6a, 0x90, 0xb1, 0x15, 0x55, 0x60, 0xa1, 0xc7, 0x0f, - 0x84, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, 0xbc, 0x9d, 0x04, 0x63, 0x1a, 0x9f, 0xbc, 0x0a, 0x67, - 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xe2, 0xf6, 0x5b, 0x5f, 0x6e, 0xa2, 0x09, 0xc4, 0x24, 0x2e, 0x79, - 0x1d, 0xce, 0xc6, 0xa9, 0x15, 0x15, 0x01, 0x71, 0x1d, 0xae, 0xf3, 0x7c, 0x55, 0xd2, 0x08, 0xd8, - 0x5f, 0x87, 0xfc, 0x6d, 0x58, 0x34, 0x5a, 0x62, 0xc3, 0x6b, 0xd2, 0xfb, 0x32, 0xfd, 0x1d, 0x7f, - 0x66, 0x66, 0x2d, 0x05, 0xc3, 0x3e, 0x6c, 0xf2, 0x29, 0x98, 0x6f, 0xf8, 0xed, 0x36, 0x5f, 0xe3, - 0x44, 0x26, 0x7c, 0x91, 0xe7, 0x4e, 0x64, 0x04, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x00, 0xf1, - 0x77, 0x98, 0x7a, 0x45, 0x9b, 0xaf, 0x8b, 0xf7, 0xd0, 0x99, 0xc6, 0x71, 0x26, 0x19, 0x3c, 0xf1, - 0x66, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x69, 0xc2, 0x8c, 0x60, 0xd3, 0xf9, 0x3c, 0x9e, 0x6e, 0x4b, - 0x9b, 0x2f, 0x1e, 0x1a, 0x69, 0x1a, 0xc0, 0x94, 0x88, 0x65, 0xc9, 0x27, 0xe1, 0x9d, 0x99, 0x14, - 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, 0xe4, 0x17, 0xa0, 0xb4, 0xa3, 0x5e, 0x48, 0xe0, 0x59, - 0xee, 0xc6, 0xde, 0x17, 0x53, 0x8f, 0x7d, 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x0e, - 0x66, 0xaf, 0xd7, 0x2a, 0x7a, 0x14, 0x9e, 0xe5, 0xbd, 0x3f, 0xc9, 0xaa, 0xa0, 0x09, 0x60, 0x33, - 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0xe8, 0x48, 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0x95, 0x35, 0xd6, 0x97, - 0xce, 0xa5, 0xb0, 0x65, 0x39, 0x6a, 0x0c, 0xf2, 0x36, 0xcc, 0xca, 0xfd, 0x82, 0xaf, 0x4d, 0xe7, - 0x1f, 0x2d, 0x90, 0x19, 0x63, 0x12, 0x68, 0xd2, 0xe3, 0xf7, 0xac, 0x3c, 0x71, 0x3c, 0xbd, 0xd6, - 0x6b, 0xb7, 0x97, 0x2e, 0xf0, 0x75, 0x33, 0xbe, 0x67, 0x8d, 0x41, 0x68, 0xe2, 0x91, 0x17, 0x95, - 0xeb, 0xd1, 0x87, 0x12, 0x17, 0xcf, 0xda, 0xf5, 0x48, 0x2b, 0xdd, 0x03, 0x62, 0x1d, 0x2e, 0x3e, - 0xc4, 0xe7, 0x67, 0x07, 0x96, 0x95, 0xc6, 0xd7, 0x3f, 0x49, 0x96, 0x96, 0x12, 0xa6, 0x92, 0xe5, - 0x3b, 0x03, 0x31, 0xf1, 0x04, 0x2a, 0x64, 0x07, 0x0a, 0x4e, 0x7b, 0x67, 0xe9, 0xc9, 0x3c, 0x54, - 0xd7, 0xca, 0x66, 0x55, 0x8e, 0x28, 0xee, 0x9f, 0x58, 0xd9, 0xac, 0x22, 0x23, 0x4e, 0x5c, 0x98, - 0x74, 0xda, 0x3b, 0xe1, 0xd2, 0x32, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0x9b, 0xd5, 0x10, - 0x39, 0x0b, 0xfb, 0xcb, 0x13, 0xfa, 0xa2, 0x46, 0xe7, 0x1c, 0x7e, 0xd7, 0x9c, 0x40, 0x56, 0x1e, - 0x4f, 0x7a, 0xf7, 0xbd, 0x58, 0x22, 0xf6, 0xbe, 0xcc, 0xe9, 0xd3, 0xd5, 0x4b, 0x46, 0x2e, 0xd9, - 0x9c, 0x92, 0xf9, 0x94, 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xbf, 0x0b, 0xda, 0xe8, 0x97, 0x72, - 0xdb, 0x09, 0xa0, 0xe8, 0x86, 0x91, 0xeb, 0xe7, 0x18, 0xdf, 0x9b, 0x4a, 0x44, 0xcc, 0xc3, 0x07, - 0x38, 0x00, 0x05, 0x2b, 0xc6, 0xd3, 0x6b, 0xb9, 0xde, 0x7d, 0xf9, 0xf9, 0xb7, 0x72, 0xf7, 0xc7, - 0x11, 0x3c, 0x39, 0x00, 0x05, 0x2b, 0x72, 0x57, 0x0c, 0xea, 0x7c, 0x9e, 0x6f, 0xdf, 0xac, 0xa6, - 0xf8, 0x25, 0x07, 0xf7, 0x5d, 0x28, 0x84, 0x1d, 0x57, 0xaa, 0x4b, 0x63, 0xf2, 0xaa, 0x6f, 0x6d, - 0x64, 0xf1, 0xaa, 0x6f, 0x6d, 0x20, 0x63, 0x42, 0xbe, 0x6a, 0x01, 0x38, 0x9d, 0x1d, 0x27, 0x0c, - 0x9d, 0xa6, 0xb6, 0xce, 0x8c, 0xf9, 0xc0, 0x40, 0x45, 0xd3, 0x4b, 0xb1, 0xe6, 0x1e, 0xa8, 0x31, - 0x14, 0x0d, 0xce, 0xe4, 0x1d, 0x98, 0x76, 0xc4, 0x53, 0x66, 0xd2, 0x99, 0x3a, 0x9f, 0xf7, 0xf9, - 0x52, 0x12, 0x70, 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0x77, 0xdd, 0x7d, - 0x69, 0x1c, 0xaa, 0x8f, 0xfd, 0xc6, 0x00, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x4f, - 0x4b, 0x3b, 0x9e, 0xa3, 0x43, 0xe4, 0xf2, 0x09, 0xa4, 0x34, 0x83, 0xee, 0x8c, 0xa7, 0xa5, 0x4d, - 0x46, 0x98, 0xe4, 0x4b, 0x0e, 0x60, 0xca, 0xe1, 0x8f, 0x2c, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x60, - 0x63, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x9f, 0x72, 0x94, 0xdc, 0xc8, 0x6f, 0x58, 0x30, 0x2d, 0xfc, - 0x7c, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x0b, 0xa7, 0x90, 0xd0, 0x5c, 0xfa, 0x20, 0x4b, 0xaf, 0x9d, - 0x8f, 0x6a, 0x27, 0x46, 0x51, 0x7a, 0xa2, 0x17, 0xb2, 0x92, 0x6e, 0xf9, 0x53, 0x30, 0x67, 0x52, - 0x19, 0xc9, 0x0f, 0xf9, 0x47, 0x05, 0x00, 0xde, 0xd0, 0x22, 0x29, 0x46, 0x87, 0x67, 0x5f, 0xdd, - 0xf3, 0x9b, 0xf9, 0xbc, 0x8e, 0x69, 0xe6, 0xb6, 0x00, 0x99, 0x6a, 0x75, 0xcf, 0x6f, 0xa2, 0x64, - 0x42, 0x5a, 0x30, 0xd9, 0x75, 0xa2, 0xbd, 0xfc, 0x13, 0x69, 0xcc, 0x88, 0xe8, 0xd0, 0x68, 0x0f, - 0x39, 0x03, 0xf2, 0x9e, 0x05, 0xd3, 0x22, 0x95, 0x86, 0xba, 0x38, 0x19, 0xdb, 0x81, 0x41, 0xb5, - 0xd9, 0x8a, 0xc8, 0xd7, 0x21, 0x7b, 0x50, 0xeb, 0x38, 0xb2, 0x14, 0x15, 0xdb, 0xe5, 0xf7, 0x2d, - 0x98, 0x33, 0x51, 0x33, 0xba, 0xe9, 0xe7, 0xcc, 0x6e, 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0xef, - 0x16, 0x18, 0xcf, 0x9d, 0xc7, 0xee, 0xd6, 0xd6, 0xd0, 0xee, 0xd6, 0x13, 0x23, 0xba, 0x5b, 0x17, - 0x46, 0x72, 0xb7, 0x9e, 0x1c, 0xdd, 0xdd, 0xba, 0x38, 0xd8, 0xdd, 0xda, 0xfe, 0xa6, 0x05, 0x67, - 0xfb, 0x76, 0x1b, 0xa6, 0x07, 0x07, 0xbe, 0x1f, 0x0d, 0x70, 0x53, 0xc4, 0x18, 0x84, 0x26, 0x1e, - 0x59, 0x87, 0x45, 0xf9, 0xd6, 0x40, 0xbd, 0xdb, 0x76, 0x33, 0x93, 0x9c, 0x6c, 0xa7, 0xe0, 0xd8, - 0x57, 0xc3, 0xfe, 0x5d, 0x0b, 0x66, 0x8d, 0xd0, 0x68, 0xf6, 0x1d, 0x3c, 0x84, 0x5c, 0x8a, 0x11, - 0x7b, 0x95, 0xf1, 0x8b, 0x2a, 0x01, 0x13, 0x77, 0xa6, 0x2d, 0x23, 0x13, 0x75, 0x7c, 0x67, 0xca, - 0x4a, 0x51, 0x42, 0x45, 0x8e, 0x61, 0xda, 0xe5, 0x8d, 0x5e, 0x30, 0x73, 0x0c, 0xd3, 0x2e, 0x72, - 0x08, 0x67, 0xc7, 0x0e, 0x04, 0xd2, 0x13, 0xdf, 0x78, 0xd5, 0xc1, 0x09, 0x22, 0x14, 0x30, 0x72, - 0x09, 0x0a, 0xd4, 0x6b, 0x4a, 0xeb, 0x85, 0x7e, 0x77, 0xf1, 0xaa, 0xd7, 0x44, 0x56, 0x6e, 0xbf, - 0x09, 0x73, 0x75, 0xda, 0x08, 0x68, 0xf4, 0x06, 0x3d, 0x1c, 0xfa, 0x21, 0x47, 0x36, 0xda, 0x53, - 0x0f, 0x39, 0xb2, 0xea, 0xac, 0xdc, 0xfe, 0xe7, 0x16, 0xa4, 0x9e, 0x1e, 0x31, 0xee, 0x4f, 0xac, - 0x81, 0xf7, 0x27, 0xa6, 0xcd, 0x7d, 0xe2, 0x44, 0x9b, 0xfb, 0x0d, 0x20, 0x1d, 0x36, 0x15, 0x12, - 0x0f, 0xed, 0x48, 0xc3, 0x51, 0x9c, 0x88, 0xa1, 0x0f, 0x03, 0x33, 0x6a, 0xd9, 0xff, 0x4c, 0x08, - 0x6b, 0x3e, 0x46, 0xf2, 0xf0, 0x06, 0xe8, 0x41, 0x91, 0x93, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, - 0xfd, 0x09, 0x8d, 0xe2, 0x8e, 0x94, 0x53, 0x9e, 0x73, 0xb3, 0xff, 0x58, 0xc8, 0x6a, 0xbc, 0x56, - 0x32, 0x84, 0xac, 0x9d, 0xa4, 0xac, 0xd7, 0xf3, 0x5a, 0x2b, 0xb3, 0x65, 0x24, 0x2b, 0x00, 0x5d, - 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0x00, 0x91, 0xa2, 0x0c, 0x55, 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0xdf, - 0x60, 0x13, 0x28, 0xf6, 0xc3, 0x24, 0x57, 0xd2, 0xce, 0x95, 0xe9, 0xc9, 0xa1, 0x7d, 0x2b, 0x8d, - 0xb0, 0x81, 0x89, 0x87, 0x84, 0x0d, 0x7c, 0x04, 0xa6, 0x03, 0xbf, 0x4d, 0x2b, 0x81, 0x97, 0x76, - 0x70, 0x41, 0x56, 0x8c, 0x37, 0x51, 0xc1, 0xed, 0x5f, 0xb3, 0x60, 0x31, 0x1d, 0xd7, 0x94, 0xbb, - 0xc7, 0xa7, 0x19, 0x7c, 0x5d, 0x18, 0x3d, 0xf8, 0xda, 0x7e, 0x8f, 0x09, 0x19, 0xb9, 0x8d, 0x7d, - 0xd7, 0x13, 0xf1, 0xca, 0xac, 0xe5, 0x3e, 0x02, 0xd3, 0x54, 0x3e, 0xd5, 0x28, 0x8c, 0xc0, 0x5a, - 0x48, 0xf5, 0x42, 0xa3, 0x82, 0x93, 0x0a, 0x2c, 0xa8, 0xab, 0x2f, 0x65, 0xb9, 0x17, 0x79, 0x16, - 0xb4, 0xa5, 0x70, 0x3d, 0x09, 0xc6, 0x34, 0xbe, 0xfd, 0x25, 0x98, 0x35, 0x36, 0x25, 0xbe, 0x7e, - 0xdf, 0x77, 0x1a, 0x51, 0x7a, 0xdd, 0xbb, 0xca, 0x0a, 0x51, 0xc0, 0xf8, 0x05, 0x83, 0x08, 0xbb, - 0x48, 0xad, 0x7b, 0x32, 0xd8, 0x42, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, 0x7d, 0x95, 0x28, 0x5c, - 0x11, 0x43, 0x56, 0x88, 0x02, 0x66, 0x3f, 0x0f, 0x33, 0x2a, 0x1b, 0x0e, 0x4f, 0x29, 0xa1, 0x8c, - 0xdf, 0x66, 0x4a, 0x09, 0x3f, 0x88, 0x90, 0x43, 0xec, 0xb7, 0x60, 0x46, 0x25, 0xed, 0x79, 0x38, - 0x36, 0x5b, 0x8a, 0x42, 0xcf, 0xbd, 0xee, 0x87, 0x91, 0xca, 0x34, 0x24, 0xee, 0xe7, 0x6e, 0x6e, - 0xf0, 0x32, 0xd4, 0x50, 0xfb, 0x45, 0x58, 0x48, 0xdd, 0xd3, 0x0e, 0x91, 0x7f, 0xe2, 0xf7, 0x0b, - 0x30, 0x67, 0x5e, 0xd7, 0x0d, 0x31, 0x8b, 0x87, 0x5f, 0x1c, 0x33, 0xae, 0xd8, 0x0a, 0x23, 0x5e, - 0xb1, 0x99, 0x77, 0x9a, 0x93, 0xa7, 0x7b, 0xa7, 0x59, 0xcc, 0xe7, 0x4e, 0xd3, 0xb8, 0x7b, 0x9f, - 0x7a, 0x7c, 0x77, 0xef, 0xbf, 0x53, 0x84, 0xf9, 0x64, 0x42, 0xc3, 0x21, 0x7a, 0xf2, 0xf9, 0xbe, - 0x9e, 0x1c, 0xd1, 0xa6, 0x5f, 0x18, 0xd7, 0xa6, 0x3f, 0x39, 0xae, 0x4d, 0xbf, 0xf8, 0x08, 0x36, - 0xfd, 0x7e, 0x8b, 0xfc, 0xd4, 0xd0, 0x16, 0xf9, 0x4f, 0x6b, 0xaf, 0xbc, 0xe9, 0x84, 0x1b, 0x4b, - 0xec, 0x95, 0x47, 0x92, 0xdd, 0xb0, 0xe6, 0x37, 0x33, 0xbd, 0x1b, 0x67, 0x1e, 0x62, 0xbb, 0x0c, - 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, 0x0e, 0x74, 0x2f, 0xc3, 0xac, 0x1c, 0x4f, - 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, 0xe2, 0xf1, 0xb7, 0xae, 0x93, 0x4f, 0x81, - 0xf3, 0x2b, 0x12, 0xf3, 0xad, 0xeb, 0xd4, 0xd3, 0xe1, 0x69, 0x7c, 0xfb, 0x8b, 0x70, 0x21, 0xd3, - 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x4d, 0x89, 0x60, 0x88, 0x91, 0xca, 0x91, 0xbf, 0x7c, - 0x67, 0x20, 0x26, 0x9e, 0x40, 0xc5, 0xfe, 0x4e, 0x01, 0xe6, 0x93, 0x0f, 0x25, 0x92, 0x7b, 0xda, - 0xe8, 0x98, 0x8b, 0xbd, 0x53, 0x90, 0x35, 0x92, 0xe4, 0x0d, 0xbc, 0xac, 0xb8, 0xc7, 0xc7, 0xd7, - 0x8e, 0xce, 0xd8, 0x77, 0x7a, 0x8c, 0xe5, 0x2d, 0x81, 0x64, 0xc7, 0xdf, 0x42, 0x8c, 0xe3, 0xe9, - 0xe4, 0x69, 0x36, 0x77, 0xee, 0x71, 0x88, 0x9b, 0x66, 0x85, 0x06, 0x5b, 0xb6, 0xb7, 0x1c, 0xd0, - 0xc0, 0xdd, 0x75, 0xf5, 0x23, 0xcf, 0x7c, 0xe5, 0x7e, 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x4d, - 0x40, 0xfc, 0x00, 0x3e, 0x7f, 0x4d, 0x2c, 0x34, 0x4e, 0x0e, 0xb2, 0xdb, 0x6e, 0x8c, 0xfb, 0x64, - 0x5f, 0x4c, 0x51, 0x7a, 0x4c, 0x1b, 0x25, 0x98, 0xe0, 0xf8, 0x63, 0x78, 0xf8, 0xde, 0x81, 0x85, - 0x54, 0xfe, 0x86, 0xdc, 0x93, 0x9c, 0xfe, 0xb0, 0x00, 0x25, 0x9d, 0x01, 0x83, 0x7c, 0x32, 0x61, - 0xc6, 0x29, 0x55, 0x3f, 0x6c, 0x3c, 0x75, 0xb3, 0xe7, 0x37, 0x1f, 0x1c, 0x95, 0x17, 0x34, 0x72, - 0xca, 0x24, 0x73, 0x09, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa7, 0xdd, 0xc6, 0x4d, 0x64, 0xe5, 0xe4, - 0x7e, 0xda, 0x8e, 0xb2, 0x95, 0x53, 0xd6, 0x0e, 0x71, 0xa0, 0x19, 0x6c, 0x3f, 0x61, 0xbb, 0xe4, - 0x8e, 0xdf, 0x3c, 0x4c, 0x3f, 0x8d, 0x53, 0xf5, 0x9b, 0x87, 0xc8, 0x21, 0xe4, 0x35, 0x98, 0x8f, - 0xdc, 0x0e, 0xf5, 0x7b, 0x91, 0xf9, 0x60, 0x78, 0x21, 0xbe, 0x7c, 0xdf, 0x4e, 0x40, 0x31, 0x85, - 0xcd, 0x76, 0xd9, 0xbb, 0xa1, 0xef, 0xf1, 0xd4, 0xb5, 0x53, 0xc9, 0x9b, 0xba, 0x1b, 0xf5, 0x37, - 0x6f, 0x72, 0x73, 0x92, 0xc6, 0x60, 0xd8, 0x2e, 0x0f, 0xca, 0x0e, 0xa8, 0xf4, 0x7d, 0x59, 0x8c, - 0xf5, 0x71, 0x51, 0x8e, 0x1a, 0x83, 0xac, 0x0b, 0xda, 0x4c, 0x5a, 0xbe, 0xa3, 0xcc, 0x55, 0xaf, - 0x28, 0xba, 0xac, 0xec, 0xc1, 0xd1, 0x09, 0x86, 0x3e, 0x5d, 0xd3, 0xbe, 0x0d, 0x0b, 0xa9, 0x06, - 0x53, 0xe7, 0x6a, 0x2b, 0xfb, 0x5c, 0x3d, 0xdc, 0x6b, 0x36, 0xff, 0xd2, 0x82, 0xb3, 0x7d, 0x4b, - 0xc0, 0xb0, 0x21, 0x77, 0xe9, 0xcd, 0x68, 0xe2, 0xd1, 0x37, 0xa3, 0xc2, 0x68, 0x9b, 0x51, 0x75, - 0xe7, 0xbb, 0x3f, 0xb8, 0xfc, 0xc4, 0xf7, 0x7e, 0x70, 0xf9, 0x89, 0x3f, 0xf9, 0xc1, 0xe5, 0x27, - 0xde, 0x3b, 0xbe, 0x6c, 0x7d, 0xf7, 0xf8, 0xb2, 0xf5, 0xbd, 0xe3, 0xcb, 0xd6, 0x9f, 0x1c, 0x5f, - 0xb6, 0xfe, 0xf3, 0xf1, 0x65, 0xeb, 0x9b, 0x3f, 0xbc, 0xfc, 0xc4, 0x67, 0x3f, 0x1d, 0x0f, 0xd0, - 0x55, 0x35, 0x40, 0xf9, 0x8f, 0x8f, 0xa9, 0xe1, 0xb8, 0xda, 0xdd, 0x6f, 0xad, 0xb2, 0x01, 0xba, - 0xaa, 0x4b, 0xd4, 0x00, 0xfd, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x3c, 0xb1, 0xba, 0xa7, - 0x9e, 0x00, 0x00, + 0x59, 0x21, 0x0a, 0x36, 0xf6, 0x3f, 0x98, 0x80, 0xc5, 0xf4, 0xc9, 0x3b, 0x6f, 0xa7, 0x06, 0xf2, + 0x75, 0x0b, 0xe6, 0x9d, 0x5e, 0xb4, 0x47, 0xbd, 0x48, 0x5d, 0x6c, 0xe5, 0xf2, 0x66, 0x48, 0xb2, + 0xed, 0x8c, 0x14, 0x56, 0x09, 0x5e, 0x98, 0xe2, 0x4d, 0xfe, 0x0a, 0x4c, 0x47, 0x6e, 0x87, 0xfa, + 0x3d, 0x61, 0x8f, 0x2b, 0x88, 0x73, 0xf1, 0xb6, 0x28, 0x42, 0x05, 0xb3, 0x3f, 0x0e, 0x23, 0x26, + 0x92, 0xb4, 0xaf, 0x02, 0x41, 0xbf, 0xdd, 0xde, 0x71, 0x1a, 0xfb, 0x77, 0x5c, 0xaf, 0xe9, 0xdf, + 0xe3, 0xab, 0xcc, 0x2a, 0x94, 0x02, 0x19, 0x4d, 0x18, 0xca, 0x01, 0xa1, 0x97, 0x29, 0x15, 0x66, + 0x18, 0x62, 0x8c, 0x63, 0xff, 0xc1, 0x04, 0x4c, 0xcb, 0xd0, 0xd7, 0xc7, 0xe0, 0xd5, 0xbe, 0x9f, + 0xb8, 0xee, 0xdc, 0xc8, 0x25, 0x62, 0x77, 0xa0, 0x4b, 0x7b, 0x98, 0x72, 0x69, 0x7f, 0x23, 0x1f, + 0x76, 0x27, 0xfb, 0xb3, 0xff, 0x7e, 0x11, 0x16, 0x52, 0xa1, 0xc4, 0x4c, 0xd5, 0xec, 0x73, 0xe3, + 0xbc, 0x9d, 0x6b, 0xb4, 0xb2, 0x0e, 0xd3, 0x38, 0xd9, 0xa3, 0x33, 0x4c, 0xa4, 0xfd, 0xbd, 0x95, + 0xdb, 0x8b, 0x06, 0x7f, 0x99, 0x01, 0x78, 0x44, 0x0f, 0x45, 0xf2, 0x6d, 0x0b, 0xce, 0x39, 0xfd, + 0x4f, 0x42, 0x48, 0x93, 0xd8, 0xad, 0xdc, 0xdf, 0x9a, 0xa8, 0x3e, 0x25, 0x85, 0xcc, 0x7a, 0x79, + 0x03, 0xb3, 0x44, 0xb1, 0xff, 0x8b, 0x05, 0x4f, 0x0e, 0x0c, 0x8a, 0xe7, 0x39, 0x95, 0x82, 0x24, + 0x54, 0xae, 0x19, 0x39, 0xa7, 0xfe, 0xd0, 0xd7, 0xa3, 0xe9, 0x34, 0x38, 0x69, 0xf6, 0xe4, 0x25, + 0x98, 0xe3, 0xea, 0x17, 0x5b, 0x3d, 0x23, 0xda, 0x95, 0xb7, 0x3b, 0xdc, 0xce, 0x5f, 0x37, 0xca, + 0x31, 0x81, 0x65, 0x7f, 0xdb, 0x82, 0xa5, 0x41, 0x19, 0x76, 0x86, 0xb0, 0x3d, 0xfc, 0xf5, 0x54, + 0x64, 0x40, 0xb9, 0x2f, 0x32, 0x20, 0x65, 0x7d, 0x50, 0x41, 0x00, 0xc6, 0xc1, 0xbf, 0xf0, 0x10, + 0xc7, 0xf7, 0x6f, 0x58, 0x70, 0x71, 0xc0, 0x84, 0xef, 0x8b, 0x10, 0xb1, 0x1e, 0x39, 0x42, 0x64, + 0x62, 0xd8, 0x08, 0x11, 0xfb, 0x0f, 0x0b, 0xb0, 0x28, 0xe5, 0x89, 0x75, 0xf0, 0x57, 0x12, 0xf1, + 0x15, 0x3f, 0x91, 0x8a, 0xaf, 0x38, 0x9f, 0xc6, 0xff, 0xcb, 0xe0, 0x8a, 0x0f, 0x56, 0x70, 0xc5, + 0x9f, 0x4f, 0xc0, 0x85, 0xcc, 0xc4, 0x3f, 0xe4, 0x6b, 0x19, 0xbb, 0xd7, 0x9d, 0x9c, 0x33, 0x0c, + 0x0d, 0xb9, 0x7f, 0x8d, 0x1b, 0x91, 0xf0, 0xcb, 0x66, 0x24, 0x80, 0xd8, 0x8d, 0x76, 0x4f, 0x21, + 0x57, 0xd2, 0x88, 0x41, 0x01, 0xf6, 0x2f, 0x14, 0xe0, 0xca, 0xb0, 0x84, 0x3e, 0xa0, 0x41, 0x63, + 0x61, 0x22, 0x68, 0xec, 0x31, 0x69, 0x16, 0xa7, 0x12, 0x3f, 0xf6, 0x4f, 0x27, 0xf5, 0xb6, 0xd7, + 0x3f, 0x3e, 0x87, 0x72, 0x05, 0x98, 0x66, 0xda, 0xa7, 0x4a, 0x1e, 0x1c, 0x2f, 0x85, 0xd3, 0x75, + 0x51, 0xfc, 0xe0, 0xa8, 0x7c, 0x36, 0x4e, 0x3f, 0x21, 0x0b, 0x51, 0x55, 0x22, 0x57, 0x60, 0x26, + 0x10, 0x50, 0x15, 0x26, 0x23, 0xfd, 0x29, 0x44, 0x19, 0x6a, 0x28, 0xf9, 0x92, 0xa1, 0xae, 0x4f, + 0x9e, 0x56, 0x96, 0x95, 0x93, 0xdc, 0x44, 0xde, 0x86, 0x99, 0x50, 0x25, 0xf6, 0x15, 0x8a, 0xcb, + 0x8b, 0x43, 0x46, 0x5f, 0xb1, 0xe3, 0xb5, 0xca, 0xf2, 0x2b, 0xbe, 0x4f, 0xe7, 0x00, 0xd6, 0x24, + 0x89, 0xad, 0x4f, 0xb6, 0xc2, 0x8c, 0x0d, 0xfd, 0xa7, 0x5a, 0x12, 0xc1, 0xb4, 0x7c, 0xf8, 0x50, + 0xde, 0xaf, 0x6d, 0xe5, 0x14, 0x69, 0x21, 0xfd, 0x70, 0xf9, 0x69, 0x4d, 0x59, 0x58, 0x14, 0x2b, + 0xfb, 0xfb, 0x16, 0xcc, 0xca, 0x31, 0xf2, 0x18, 0xc2, 0xd0, 0xee, 0x26, 0xc3, 0xd0, 0xae, 0xe6, + 0xb2, 0x62, 0x0d, 0x88, 0x41, 0xbb, 0x0b, 0x73, 0x66, 0xc6, 0x39, 0xf2, 0x59, 0x63, 0xc5, 0xb5, + 0xc6, 0xc9, 0xe1, 0xa4, 0xd6, 0xe4, 0x78, 0x35, 0xb6, 0x7f, 0xb3, 0xa4, 0x5b, 0x91, 0x9f, 0x5d, + 0xcd, 0x91, 0x6f, 0x9d, 0x38, 0xf2, 0xcd, 0x81, 0x37, 0x91, 0xff, 0xc0, 0xbb, 0x05, 0x33, 0x6a, + 0x59, 0x94, 0xca, 0xc3, 0xb3, 0xa6, 0x63, 0x2e, 0xd3, 0x40, 0x18, 0x31, 0x63, 0xba, 0xf0, 0x33, + 0xa8, 0xee, 0x43, 0xbd, 0x5c, 0x6b, 0x32, 0xe4, 0x1d, 0x98, 0xbd, 0xe7, 0x07, 0xfb, 0x6d, 0xdf, + 0xe1, 0x69, 0xc5, 0x21, 0x8f, 0xbb, 0x60, 0x6d, 0x8a, 0x15, 0xd1, 0x11, 0x77, 0x62, 0xfa, 0x68, + 0x32, 0x23, 0x15, 0x58, 0xe8, 0xb8, 0x1e, 0x52, 0xa7, 0xa9, 0xa3, 0xcd, 0x26, 0x45, 0x26, 0x63, + 0xa5, 0x5a, 0x6f, 0x25, 0xc1, 0x98, 0xc6, 0xe7, 0x46, 0x95, 0x20, 0x61, 0x6d, 0x90, 0xe9, 0x4a, + 0x6b, 0xe3, 0x0f, 0xc6, 0xa4, 0x05, 0x43, 0x84, 0x07, 0x24, 0xcb, 0x31, 0xc5, 0x9b, 0x7c, 0x11, + 0x66, 0x42, 0x99, 0x4e, 0x2e, 0x1f, 0x27, 0x02, 0x7d, 0xb6, 0x17, 0x44, 0xe3, 0xae, 0x54, 0x25, + 0xa8, 0x19, 0x92, 0x4d, 0x38, 0xaf, 0xcc, 0x27, 0x89, 0xa7, 0x9f, 0xa6, 0xe2, 0xec, 0x43, 0x98, + 0x01, 0xc7, 0xcc, 0x5a, 0x4c, 0x95, 0xe3, 0x99, 0x1c, 0xc5, 0xdd, 0x9b, 0x71, 0x5d, 0xc5, 0xe7, + 0x5f, 0x13, 0x25, 0xf4, 0xa4, 0x60, 0xca, 0x99, 0x31, 0x82, 0x29, 0xeb, 0x70, 0x21, 0x0d, 0xe2, + 0x69, 0xa5, 0x78, 0x26, 0x2b, 0x63, 0x0b, 0xad, 0x65, 0x21, 0x61, 0x76, 0x5d, 0x72, 0x07, 0x4a, + 0x01, 0xe5, 0x87, 0xac, 0x8a, 0x72, 0x5b, 0x1a, 0xd9, 0x41, 0x13, 0x15, 0x01, 0x8c, 0x69, 0xb1, + 0x7e, 0x77, 0x92, 0xb9, 0x85, 0x6f, 0xe5, 0xf8, 0xe6, 0xa8, 0xec, 0xfb, 0x01, 0xe9, 0xde, 0xec, + 0x7f, 0xb7, 0x00, 0x67, 0x12, 0x36, 0x20, 0xf2, 0x2c, 0x14, 0x79, 0x9e, 0x2d, 0xbe, 0x5a, 0xcd, + 0xc4, 0x2b, 0xaa, 0x68, 0x1c, 0x01, 0x23, 0xbf, 0x68, 0xc1, 0x42, 0x37, 0x71, 0x5d, 0xa1, 0x16, + 0xf2, 0x71, 0x0d, 0x92, 0x09, 0xa2, 0x46, 0x56, 0xfe, 0x24, 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, + 0xf4, 0x72, 0x6e, 0xd3, 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, 0x58, 0x4b, 0x82, 0x31, 0x8d, 0xcf, + 0x7a, 0x98, 0x7f, 0xdd, 0x38, 0xaf, 0xda, 0x55, 0x14, 0x01, 0x8c, 0x69, 0x91, 0xd7, 0x60, 0x5e, + 0xa6, 0x94, 0xad, 0xf9, 0xcd, 0xeb, 0x4e, 0xb8, 0x27, 0x4f, 0x38, 0xfa, 0x44, 0xb6, 0x96, 0x80, + 0x62, 0x0a, 0x9b, 0x7f, 0x5b, 0x9c, 0xb7, 0x97, 0x13, 0x98, 0x4a, 0x3e, 0x5a, 0xb0, 0x96, 0x04, + 0x63, 0x1a, 0x9f, 0x3c, 0x6f, 0x6c, 0x43, 0xe2, 0x3e, 0x5c, 0xaf, 0x06, 0x19, 0x5b, 0x51, 0x05, + 0x16, 0x7a, 0xfc, 0x40, 0xd8, 0x54, 0x40, 0x39, 0x1f, 0x35, 0xc3, 0xdb, 0x49, 0x30, 0xa6, 0xf1, + 0xc9, 0xab, 0x70, 0x26, 0x60, 0x8b, 0xad, 0x26, 0x20, 0x2e, 0xc9, 0xf5, 0x1d, 0x28, 0x9a, 0x40, + 0x4c, 0xe2, 0x92, 0xd7, 0xe1, 0x6c, 0x9c, 0x81, 0x51, 0x11, 0x10, 0xb7, 0xe6, 0x3a, 0x1d, 0x58, + 0x25, 0x8d, 0x80, 0xfd, 0x75, 0xc8, 0xdf, 0x82, 0x45, 0xa3, 0x25, 0x36, 0xbc, 0x26, 0xbd, 0x2f, + 0xb3, 0xe4, 0xf1, 0xd7, 0x68, 0xd6, 0x52, 0x30, 0xec, 0xc3, 0x26, 0x9f, 0x82, 0xf9, 0x86, 0xdf, + 0x6e, 0xf3, 0x35, 0x4e, 0x24, 0xcc, 0x17, 0xe9, 0xf0, 0x44, 0xe2, 0xc0, 0x04, 0x04, 0x53, 0x98, + 0xe4, 0x06, 0x10, 0x7f, 0x87, 0xa9, 0x57, 0xb4, 0xf9, 0xba, 0x78, 0x36, 0x9d, 0x69, 0x1c, 0x67, + 0x92, 0x31, 0x16, 0x6f, 0xf6, 0x61, 0x60, 0x46, 0x2d, 0x9e, 0x4d, 0xcc, 0x88, 0x49, 0x9d, 0xcf, + 0xe3, 0x85, 0xb7, 0xb4, 0xf9, 0xe2, 0xa1, 0x01, 0xa9, 0x01, 0x4c, 0x89, 0x90, 0x97, 0x7c, 0xf2, + 0xe2, 0x99, 0xb9, 0xb3, 0xe3, 0x3d, 0x42, 0x94, 0xa2, 0xe4, 0x44, 0x7e, 0x0e, 0x4a, 0x3b, 0xea, + 0x21, 0x05, 0x9e, 0x0c, 0x6f, 0xec, 0x7d, 0x31, 0xf5, 0x26, 0x48, 0x7c, 0x3c, 0xd7, 0x00, 0x8c, + 0x59, 0x92, 0xe7, 0x60, 0xf6, 0x7a, 0xad, 0xa2, 0x47, 0xe1, 0x59, 0xde, 0xfb, 0x93, 0xac, 0x0a, + 0x9a, 0x00, 0x36, 0xc3, 0xb4, 0xfa, 0x46, 0x92, 0x6f, 0x93, 0x64, 0x68, 0x63, 0x0c, 0x9b, 0xdf, + 0x6c, 0x63, 0x7d, 0xe9, 0x5c, 0x0a, 0x5b, 0x96, 0xa3, 0xc6, 0x20, 0x6f, 0xc3, 0xac, 0xdc, 0x2f, + 0xf8, 0xda, 0x74, 0xfe, 0xd1, 0xe2, 0x9d, 0x31, 0x26, 0x81, 0x26, 0x3d, 0x7e, 0x1d, 0xcb, 0xf3, + 0xcb, 0xd3, 0x6b, 0xbd, 0x76, 0x7b, 0xe9, 0x02, 0x5f, 0x37, 0xe3, 0xeb, 0xd8, 0x18, 0x84, 0x26, + 0x1e, 0x79, 0x51, 0x79, 0x28, 0x7d, 0x28, 0x71, 0x3f, 0xad, 0x3d, 0x94, 0xb4, 0xd2, 0x3d, 0x20, + 0x24, 0xe2, 0xe2, 0x43, 0x5c, 0x83, 0x76, 0x60, 0x59, 0x69, 0x7c, 0xfd, 0x93, 0x64, 0x69, 0x29, + 0x61, 0x2a, 0x59, 0xbe, 0x33, 0x10, 0x13, 0x4f, 0xa0, 0x42, 0x76, 0xa0, 0xe0, 0xb4, 0x77, 0x96, + 0x9e, 0xcc, 0x43, 0x75, 0xad, 0x6c, 0x56, 0xe5, 0x88, 0xe2, 0x6e, 0x8c, 0x95, 0xcd, 0x2a, 0x32, + 0xe2, 0xc4, 0x85, 0x49, 0xa7, 0xbd, 0x13, 0x2e, 0x2d, 0xf3, 0x39, 0x9b, 0x1b, 0x93, 0xd8, 0x78, + 0xb0, 0x59, 0x0d, 0x91, 0xb3, 0xb0, 0xbf, 0x3c, 0xa1, 0x2f, 0x6a, 0x74, 0x6a, 0xe2, 0x77, 0xcd, + 0x09, 0x64, 0xe5, 0xf1, 0xf2, 0x77, 0xdf, 0xc3, 0x26, 0x62, 0xef, 0xcb, 0x9c, 0x3e, 0x5d, 0xbd, + 0x64, 0xe4, 0x92, 0xf4, 0x29, 0x99, 0x76, 0x59, 0x9c, 0x9e, 0x93, 0x0b, 0x86, 0xfd, 0xdb, 0xa0, + 0x8d, 0x7e, 0x29, 0xef, 0x9e, 0x00, 0x8a, 0x6e, 0x18, 0xb9, 0x7e, 0x8e, 0x61, 0xc0, 0xa9, 0x7c, + 0xc5, 0x3c, 0xca, 0x80, 0x03, 0x50, 0xb0, 0x62, 0x3c, 0xbd, 0x96, 0xeb, 0xdd, 0x97, 0x9f, 0x7f, + 0x2b, 0x77, 0xb7, 0x1d, 0xc1, 0x93, 0x03, 0x50, 0xb0, 0x22, 0x77, 0xc5, 0xa0, 0xce, 0xe7, 0x95, + 0xf7, 0xcd, 0x6a, 0x8a, 0x5f, 0x72, 0x70, 0xdf, 0x85, 0x42, 0xd8, 0x71, 0xa5, 0xba, 0x34, 0x26, + 0xaf, 0xfa, 0xd6, 0x46, 0x16, 0xaf, 0xfa, 0xd6, 0x06, 0x32, 0x26, 0xe4, 0xab, 0x16, 0x80, 0xd3, + 0xd9, 0x71, 0xc2, 0xd0, 0x69, 0x6a, 0xeb, 0xcc, 0x98, 0xef, 0x10, 0x54, 0x34, 0xbd, 0x14, 0x6b, + 0xee, 0xa8, 0x1a, 0x43, 0xd1, 0xe0, 0x4c, 0xde, 0x81, 0x69, 0x47, 0xbc, 0x78, 0x26, 0x7d, 0xae, + 0xf3, 0x79, 0xc6, 0x2f, 0x25, 0x01, 0x37, 0xd3, 0x48, 0x10, 0x2a, 0x86, 0x8c, 0x77, 0x14, 0x38, + 0x74, 0xd7, 0xdd, 0x97, 0xc6, 0xa1, 0xfa, 0xd8, 0x4f, 0x11, 0x30, 0x62, 0x59, 0xbc, 0x25, 0x08, + 0x15, 0x43, 0xf1, 0x02, 0xb5, 0xe3, 0x39, 0x3a, 0x92, 0x2e, 0x9f, 0x78, 0x4b, 0x33, 0x36, 0xcf, + 0x78, 0x81, 0xda, 0x64, 0x84, 0x49, 0xbe, 0xe4, 0x00, 0xa6, 0x1c, 0xfe, 0x16, 0xa3, 0x3c, 0x8a, + 0x61, 0x1e, 0xef, 0x3a, 0xa6, 0xda, 0x80, 0x2f, 0x2e, 0xf2, 0xc5, 0x47, 0xc9, 0x8d, 0xfc, 0x9a, + 0x05, 0xd3, 0xc2, 0x1d, 0x98, 0x29, 0xa4, 0xec, 0xdb, 0xbf, 0x70, 0x0a, 0x79, 0xcf, 0xa5, 0xab, + 0xb2, 0x74, 0xee, 0xf9, 0xa8, 0xf6, 0x75, 0x14, 0xa5, 0x27, 0x3a, 0x2b, 0x2b, 0xe9, 0x96, 0x3f, + 0x05, 0x73, 0x26, 0x95, 0x91, 0xdc, 0x95, 0x7f, 0x54, 0x00, 0xe0, 0x0d, 0x2d, 0x72, 0x67, 0x74, + 0x78, 0x92, 0xd6, 0x3d, 0xbf, 0x99, 0xcf, 0x23, 0x9a, 0x66, 0x0a, 0x0c, 0x90, 0x19, 0x59, 0xf7, + 0xfc, 0x26, 0x4a, 0x26, 0xa4, 0x05, 0x93, 0x5d, 0x27, 0xda, 0xcb, 0x3f, 0xdf, 0xc6, 0x8c, 0x08, + 0x22, 0x8d, 0xf6, 0x90, 0x33, 0x20, 0xef, 0x59, 0x30, 0x2d, 0x32, 0x6e, 0xa8, 0x8b, 0x93, 0xb1, + 0x1d, 0x18, 0x54, 0x9b, 0xad, 0x88, 0xb4, 0x1e, 0xb2, 0x07, 0xb5, 0x8e, 0x23, 0x4b, 0x51, 0xb1, + 0x5d, 0x7e, 0xdf, 0x82, 0x39, 0x13, 0x35, 0xa3, 0x9b, 0x7e, 0xc6, 0xec, 0xa6, 0x3c, 0xdb, 0xc3, + 0xec, 0xf1, 0xff, 0x6e, 0x81, 0xf1, 0x2a, 0x7a, 0xec, 0x95, 0x6d, 0x0d, 0xed, 0x95, 0x3d, 0x31, + 0xa2, 0x57, 0x76, 0x61, 0x24, 0xaf, 0xec, 0xc9, 0xd1, 0xbd, 0xb2, 0x8b, 0x83, 0xbd, 0xb2, 0xed, + 0x6f, 0x5a, 0x70, 0xb6, 0x6f, 0xb7, 0x61, 0x7a, 0x70, 0xe0, 0xfb, 0xd1, 0x00, 0x6f, 0x46, 0x8c, + 0x41, 0x68, 0xe2, 0x91, 0x75, 0x58, 0x94, 0x4f, 0x12, 0xd4, 0xbb, 0x6d, 0x37, 0x33, 0x17, 0xca, + 0x76, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb6, 0x60, 0xd6, 0x88, 0xa0, 0x66, 0xdf, 0xc1, 0x23, + 0xcd, 0xa5, 0x18, 0xb1, 0xf3, 0x19, 0xbf, 0xa8, 0x12, 0x30, 0x71, 0x67, 0xda, 0x32, 0x12, 0x56, + 0xc7, 0x77, 0xa6, 0xac, 0x14, 0x25, 0x54, 0xa4, 0x22, 0xa6, 0x5d, 0xde, 0xe8, 0x05, 0x33, 0x15, + 0x31, 0xed, 0x22, 0x87, 0x70, 0x76, 0xec, 0x40, 0x20, 0x1d, 0xf6, 0x8d, 0xc7, 0x1f, 0x9c, 0x20, + 0x42, 0x01, 0x23, 0x97, 0xa0, 0x40, 0xbd, 0xa6, 0xb4, 0x5e, 0xe8, 0xe7, 0x19, 0xaf, 0x7a, 0x4d, + 0x64, 0xe5, 0xf6, 0x9b, 0x30, 0x57, 0xa7, 0x8d, 0x80, 0x46, 0x6f, 0xd0, 0xc3, 0xa1, 0xdf, 0x7b, + 0x64, 0xa3, 0x3d, 0xf5, 0xde, 0x23, 0xab, 0xce, 0xca, 0xed, 0x7f, 0x6e, 0x41, 0xea, 0x85, 0x12, + 0xe3, 0xfe, 0xc4, 0x1a, 0x78, 0x7f, 0x62, 0xda, 0xdc, 0x27, 0x4e, 0xb4, 0xb9, 0xdf, 0x00, 0xd2, + 0x61, 0x53, 0x21, 0xf1, 0x1e, 0x8f, 0x34, 0x1c, 0xc5, 0xf9, 0x1a, 0xfa, 0x30, 0x30, 0xa3, 0x96, + 0xfd, 0xcf, 0x84, 0xb0, 0xe6, 0x9b, 0x25, 0x0f, 0x6f, 0x80, 0x1e, 0x14, 0x39, 0x29, 0x69, 0x3d, + 0x1b, 0xd3, 0xf2, 0xdc, 0x9f, 0xf7, 0x28, 0xee, 0x48, 0x39, 0xe5, 0x39, 0x37, 0xfb, 0x0f, 0x85, + 0xac, 0xc6, 0xa3, 0x26, 0x43, 0xc8, 0xda, 0x49, 0xca, 0x7a, 0x3d, 0xaf, 0xb5, 0x32, 0x5b, 0x46, + 0xb2, 0x02, 0xd0, 0xa5, 0x41, 0x83, 0x7a, 0x91, 0x8a, 0x23, 0x29, 0xca, 0x88, 0x46, 0x5d, 0x8a, + 0x06, 0x86, 0xfd, 0x0d, 0x36, 0x81, 0x62, 0x77, 0x4d, 0x72, 0x25, 0xed, 0x83, 0x99, 0x9e, 0x1c, + 0xda, 0x05, 0xd3, 0x88, 0x2e, 0x98, 0x78, 0x48, 0x74, 0xc1, 0x47, 0x60, 0x3a, 0xf0, 0xdb, 0xb4, + 0x12, 0x78, 0x69, 0x07, 0x17, 0x64, 0xc5, 0x78, 0x13, 0x15, 0xdc, 0xfe, 0x15, 0x0b, 0x16, 0xd3, + 0xe1, 0x4f, 0xb9, 0x3b, 0x86, 0x9a, 0x31, 0xda, 0x85, 0xd1, 0x63, 0xb4, 0xed, 0xf7, 0x98, 0x90, + 0x91, 0xdb, 0xd8, 0x77, 0x3d, 0x11, 0xd6, 0xcc, 0x5a, 0xee, 0x23, 0x30, 0x4d, 0xe5, 0x8b, 0x8e, + 0xc2, 0x08, 0xac, 0x85, 0x54, 0x0f, 0x39, 0x2a, 0x38, 0xa9, 0xc0, 0x82, 0xba, 0xfa, 0x52, 0x96, + 0x7b, 0x91, 0x8e, 0x41, 0x5b, 0x0a, 0xd7, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x5f, 0x82, 0x59, 0x63, + 0x53, 0xe2, 0xeb, 0xf7, 0x7d, 0xa7, 0x11, 0xa5, 0xd7, 0xbd, 0xab, 0xac, 0x10, 0x05, 0x8c, 0x5f, + 0x30, 0x88, 0xe8, 0x8c, 0xd4, 0xba, 0x27, 0x63, 0x32, 0x24, 0x94, 0x11, 0x0b, 0x68, 0x8b, 0xde, + 0x57, 0xf9, 0xc4, 0x15, 0x31, 0x64, 0x85, 0x28, 0x60, 0xf6, 0xf3, 0x30, 0xa3, 0x92, 0xe6, 0xf0, + 0xcc, 0x13, 0xca, 0xf8, 0x6d, 0x66, 0x9e, 0xf0, 0x83, 0x08, 0x39, 0xc4, 0x7e, 0x0b, 0x66, 0x54, + 0x6e, 0x9f, 0x87, 0x63, 0xb3, 0xa5, 0x28, 0xf4, 0xdc, 0xeb, 0x7e, 0x18, 0xa9, 0x84, 0x44, 0xe2, + 0x7e, 0xee, 0xe6, 0x06, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x84, 0x85, 0xd4, 0x3d, 0xed, 0x10, 0x69, + 0x2a, 0x7e, 0xb7, 0x00, 0x73, 0xe6, 0x75, 0xdd, 0x10, 0xb3, 0x78, 0xf8, 0xc5, 0x31, 0xe3, 0x8a, + 0xad, 0x30, 0xe2, 0x15, 0x9b, 0x79, 0xa7, 0x39, 0x79, 0xba, 0x77, 0x9a, 0xc5, 0x7c, 0xee, 0x34, + 0x8d, 0xbb, 0xf7, 0xa9, 0xc7, 0x77, 0xf7, 0xfe, 0x5b, 0x45, 0x98, 0x4f, 0xe6, 0x3d, 0x1c, 0xa2, + 0x27, 0x9f, 0xef, 0xeb, 0xc9, 0x11, 0x6d, 0xfa, 0x85, 0x71, 0x6d, 0xfa, 0x93, 0xe3, 0xda, 0xf4, + 0x8b, 0x8f, 0x60, 0xd3, 0xef, 0xb7, 0xc8, 0x4f, 0x0d, 0x6d, 0x91, 0xff, 0xb4, 0xf6, 0xca, 0x9b, + 0x4e, 0xb8, 0xb1, 0xc4, 0x5e, 0x79, 0x24, 0xd9, 0x0d, 0x6b, 0x7e, 0x33, 0xd3, 0xbb, 0x71, 0xe6, + 0x21, 0xb6, 0xcb, 0x20, 0xd3, 0x89, 0x6e, 0xf4, 0x6b, 0xc3, 0x0f, 0x8d, 0xe0, 0x40, 0xf7, 0x32, + 0xcc, 0xca, 0xf1, 0xc4, 0x55, 0x50, 0x48, 0xaa, 0xaf, 0xf5, 0x18, 0x84, 0x26, 0x1e, 0x7f, 0x12, + 0x3b, 0xf9, 0x62, 0x38, 0xbf, 0x22, 0x31, 0x9f, 0xc4, 0x4e, 0xbd, 0x30, 0x9e, 0xc6, 0xb7, 0xbf, + 0x08, 0x17, 0x32, 0xcd, 0x08, 0xdc, 0x84, 0xcb, 0xb5, 0x23, 0xda, 0x94, 0x08, 0x86, 0x18, 0xa9, + 0x54, 0xfa, 0xcb, 0x77, 0x06, 0x62, 0xe2, 0x09, 0x54, 0xec, 0xef, 0x14, 0x60, 0x3e, 0xf9, 0x9e, + 0x22, 0xb9, 0xa7, 0x8d, 0x8e, 0xb9, 0xd8, 0x3b, 0x05, 0x59, 0x23, 0x97, 0xde, 0xc0, 0xcb, 0x8a, + 0x7b, 0x7c, 0x7c, 0xed, 0xe8, 0xc4, 0x7e, 0xa7, 0xc7, 0x58, 0xde, 0x12, 0x48, 0x76, 0xfc, 0xc9, + 0xc4, 0x38, 0xec, 0x4e, 0x9e, 0x66, 0x73, 0xe7, 0x1e, 0x47, 0xc2, 0x69, 0x56, 0x68, 0xb0, 0x65, + 0x7b, 0xcb, 0x01, 0x0d, 0xdc, 0x5d, 0x57, 0xbf, 0x05, 0xcd, 0x57, 0xee, 0xb7, 0x64, 0x19, 0x6a, + 0xa8, 0xfd, 0xde, 0x04, 0xc4, 0xef, 0xe4, 0xf3, 0x47, 0xc7, 0x42, 0xe3, 0xe4, 0x20, 0xbb, 0xed, + 0xc6, 0xb8, 0x2f, 0xfb, 0xc5, 0x14, 0xa5, 0xc7, 0xb4, 0x51, 0x82, 0x09, 0x8e, 0x3f, 0x86, 0xf7, + 0xf1, 0x1d, 0x58, 0x48, 0xa5, 0x79, 0xc8, 0x3d, 0x17, 0xea, 0x0f, 0x0b, 0x50, 0xd2, 0x89, 0x32, + 0xc8, 0x27, 0x13, 0x66, 0x9c, 0x52, 0xf5, 0xc3, 0xc6, 0x8b, 0x38, 0x7b, 0x7e, 0xf3, 0xc1, 0x51, + 0x79, 0x41, 0x23, 0xa7, 0x4c, 0x32, 0x97, 0xa0, 0xd0, 0x0b, 0xda, 0xe9, 0x73, 0xda, 0x6d, 0xdc, + 0x44, 0x56, 0x4e, 0xee, 0xa7, 0xed, 0x28, 0x5b, 0x39, 0x25, 0xf7, 0x10, 0x07, 0x9a, 0xc1, 0xf6, + 0x13, 0xb6, 0x4b, 0xee, 0xf8, 0xcd, 0xc3, 0xf4, 0x0b, 0x3a, 0x55, 0xbf, 0x79, 0x88, 0x1c, 0x42, + 0x5e, 0x83, 0x79, 0x19, 0x8f, 0x64, 0xbe, 0x2b, 0x5e, 0x88, 0x2f, 0xdf, 0xb7, 0x13, 0x50, 0x4c, + 0x61, 0xb3, 0x5d, 0xf6, 0x6e, 0xe8, 0x7b, 0x3c, 0xc3, 0xed, 0x54, 0xf2, 0xa6, 0xee, 0x46, 0xfd, + 0xcd, 0x9b, 0xdc, 0x9c, 0xa4, 0x31, 0x18, 0xb6, 0xcb, 0x63, 0xb7, 0x03, 0x2a, 0x7d, 0x5f, 0x16, + 0x63, 0x7d, 0x5c, 0x94, 0xa3, 0xc6, 0x20, 0xeb, 0x82, 0x36, 0x93, 0x96, 0xef, 0x28, 0x73, 0xd5, + 0x2b, 0x8a, 0x2e, 0x2b, 0x7b, 0x70, 0x74, 0x82, 0xa1, 0x4f, 0xd7, 0xb4, 0x6f, 0xc3, 0x42, 0xaa, + 0xc1, 0xd4, 0xb9, 0xda, 0xca, 0x3e, 0x57, 0x0f, 0xf7, 0xe8, 0xcd, 0xbf, 0xb4, 0xe0, 0x6c, 0xdf, + 0x12, 0x30, 0x6c, 0x64, 0x5e, 0x7a, 0x33, 0x9a, 0x78, 0xf4, 0xcd, 0xa8, 0x30, 0xda, 0x66, 0x54, + 0xdd, 0xf9, 0xee, 0x0f, 0x2e, 0x3f, 0xf1, 0xbd, 0x1f, 0x5c, 0x7e, 0xe2, 0x8f, 0x7e, 0x70, 0xf9, + 0x89, 0xf7, 0x8e, 0x2f, 0x5b, 0xdf, 0x3d, 0xbe, 0x6c, 0x7d, 0xef, 0xf8, 0xb2, 0xf5, 0x47, 0xc7, + 0x97, 0xad, 0xff, 0x7c, 0x7c, 0xd9, 0xfa, 0xe6, 0x0f, 0x2f, 0x3f, 0xf1, 0xd9, 0x4f, 0xc7, 0x03, + 0x74, 0x55, 0x0d, 0x50, 0xfe, 0xe3, 0x63, 0x6a, 0x38, 0xae, 0x76, 0xf7, 0x5b, 0xab, 0x6c, 0x80, + 0xae, 0xea, 0x12, 0x35, 0x40, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x9a, 0xe7, 0x61, + 0xce, 0x9e, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7761,6 +7762,11 @@ func (m *PrometheusMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Timeout != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Timeout)) + i-- + dAtA[i] = 0x20 + } { size, err := m.Authentication.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -11550,6 +11556,9 @@ func (m *PrometheusMetric) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Authentication.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Timeout != nil { + n += 1 + sovGenerated(uint64(*m.Timeout)) + } return n } @@ -13506,6 +13515,7 @@ func (this *PrometheusMetric) String() string { `Address:` + fmt.Sprintf("%v", this.Address) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "PrometheusAuth", "PrometheusAuth", 1), `&`, ``, 1) + `,`, + `Timeout:` + valueToStringGenerated(this.Timeout) + `,`, `}`, }, "") return s @@ -26769,6 +26779,26 @@ func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Timeout = &v 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 22e777df86..257a56f068 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1143,6 +1143,10 @@ message PrometheusMetric { // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus // +optional optional PrometheusAuth authentication = 3; + + // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. + // +optional + optional int64 timeout = 4; } // RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index fdb24d4d31..4ea5f05291 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3451,6 +3451,13 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"), }, }, + "timeout": { + SchemaProps: spec.SchemaProps{ + Description: "Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds.", + Type: []string{"integer"}, + Format: "int64", + }, + }, }, }, }, diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 34f84f7659..3d47a9e8c1 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1651,7 +1651,7 @@ func (in *MetricProvider) DeepCopyInto(out *MetricProvider) { if in.Prometheus != nil { in, out := &in.Prometheus, &out.Prometheus *out = new(PrometheusMetric) - **out = **in + (*in).DeepCopyInto(*out) } if in.Kayenta != nil { in, out := &in.Kayenta, &out.Kayenta @@ -1921,6 +1921,11 @@ func (in *PrometheusAuth) DeepCopy() *PrometheusAuth { func (in *PrometheusMetric) DeepCopyInto(out *PrometheusMetric) { *out = *in out.Authentication = in.Authentication + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(int64) + **out = **in + } return } From 8d293d41719daf7ae7e7c9a9621dfb3d394d4c69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jul 2023 09:18:15 -0500 Subject: [PATCH 112/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 (#2907) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.28 to 1.18.29. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.28...config/v1.18.29) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 5c7279a8c2..3b7e1a2191 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.19.0 - github.com/aws/aws-sdk-go-v2/config v1.18.28 + github.com/aws/aws-sdk-go-v2/config v1.18.29 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible @@ -82,7 +82,7 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.27 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.28 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect @@ -90,7 +90,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.20.0 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index fb4298bbf1..f947ae967c 100644 --- a/go.sum +++ b/go.sum @@ -103,10 +103,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.28 h1:TINEaKyh1Td64tqFvn09iYpKiWjmHYrG1fa91q2gnqw= -github.com/aws/aws-sdk-go-v2/config v1.18.28/go.mod h1:nIL+4/8JdAuNHEjn/gPEXqtnS02Q3NXB/9Z7o5xE4+A= -github.com/aws/aws-sdk-go-v2/credentials v1.13.27 h1:dz0yr/yR1jweAnsCx+BmjerUILVPQ6FS5AwF/OyG1kA= -github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= +github.com/aws/aws-sdk-go-v2/config v1.18.29 h1:yA+bSSRGhBwWuprG9I4VgxfK//NBLZ/0BGOHiV3f9oM= +github.com/aws/aws-sdk-go-v2/config v1.18.29/go.mod h1:bJT6P8A+KU1qvNMp8aj+/NmaI06Z670dHNoWsrLOgMg= +github.com/aws/aws-sdk-go-v2/credentials v1.13.28 h1:WM9tEHgoOh5ThJZ042UKnSx7TXGSC/bz63X3fsrQL2o= +github.com/aws/aws-sdk-go-v2/credentials v1.13.28/go.mod h1:86BSbSeamnVVdr1hPfBZVN8SXM7KxSAZAvhNxVfi8fU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 h1:sWDv7cMITPcZ21QdreULwxOOAmE github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 h1:BFubHS/xN5bjl818QaroN6mQdjneYQ+AOx44KNXlyH4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 h1:e5mnydVdCVWxP+5rPAGi2PYxC7u2OZgH1ypC114H04U= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= +github.com/aws/aws-sdk-go-v2/service/sts v1.20.0 h1:jKmIOO+dFvCPuIhhM8u0Dy3dtd590n2kEDSYiGHoI98= +github.com/aws/aws-sdk-go-v2/service/sts v1.20.0/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 8bed76059579121725df0c988b26b8373ca06dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 10:39:59 -0500 Subject: [PATCH 113/159] chore(deps): bump google.golang.org/grpc from 1.56.2 to 1.57.0 (#2908) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.56.2 to 1.57.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.56.2...v1.57.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 ++++-- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3b7e1a2191..585884668e 100644 --- a/go.mod +++ b/go.mod @@ -36,8 +36,8 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 - google.golang.org/grpc v1.56.2 + google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 + google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 @@ -179,6 +179,8 @@ require ( gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // 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 f947ae967c..4ade941d17 100644 --- a/go.sum +++ b/go.sum @@ -1039,8 +1039,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1056,8 +1060,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= 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= From 44f94881d31622ebecdaa8a5464882fd9401276b Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 28 Jul 2023 16:07:18 -0500 Subject: [PATCH 114/159] chore: bump golang to 1.20 (#2910) * bump golang to 1.20 Signed-off-by: zachaller * use .x because of https://github.com/actions/setup-go/issues/326 Signed-off-by: zachaller * use .x because of https://github.com/actions/setup-go/issues/326 Signed-off-by: zachaller * change test to avoid loopclosure: loop variable test captured by func literal from go vet Signed-off-by: zachaller * ignore new govet rules for tests to pass Signed-off-by: zachaller * change closures Signed-off-by: zachaller * fix test Signed-off-by: zachaller * fix test Signed-off-by: zachaller * fix go vet by removing concurency Signed-off-by: zachaller * one more Signed-off-by: zachaller * copy var instead of removing Parallel Signed-off-by: zachaller * copy var instead of removing Parallel Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .github/workflows/docker-publish.yml | 4 +- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 4 +- .github/workflows/release.yaml | 6 +- Dockerfile | 6 +- Dockerfile.dev | 2 +- .../features/kustomize/rollout_cr_schema.json | 444 ++++++++++++------ go.mod | 2 +- hack/gen-crd-spec/main.go | 3 +- hack/installers/install-codegen-go-tools.sh | 8 +- manifests/crds/analysis-run-crd.yaml | 34 +- manifests/crds/analysis-template-crd.yaml | 34 +- .../crds/cluster-analysis-template-crd.yaml | 34 +- manifests/crds/experiment-crd.yaml | 34 +- manifests/crds/rollout-crd.yaml | 35 +- manifests/install.yaml | 171 ++++++- metricproviders/mocks/Provider.go | 11 +- .../validation/validation_references_test.go | 7 +- rollout/mocks/TrafficRoutingReconciler.go | 16 +- rollout/trafficrouting/nginx/nginx_test.go | 3 +- utils/aws/mocks/ELBv2APIClient.go | 41 +- 22 files changed, 696 insertions(+), 207 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 28afaeb95f..1a51e2a485 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.19 + go-version: '1.20' 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.19 + go-version: '1.20' platforms: ${{ needs.set-vars.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} target: kubectl-argo-rollouts diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 80637ab009..59c587fa84 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -48,7 +48,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4.0.1 with: - go-version: 1.19 + go-version: '1.20' - uses: actions/checkout@v3.1.0 - name: Setup k3s env: diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index 89df548ebd..b8732ce58a 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -26,7 +26,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4.0.1 with: - go-version: 1.19 + go-version: 1.20 - name: build run: | pip install mkdocs mkdocs_material diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 87d385a9d6..067b36513c 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.19' + GOLANG_VERSION: '1.20' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -44,7 +44,7 @@ jobs: - name: Run golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.49.0 + version: v1.53.3 args: --timeout 6m build: name: Build diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e6abe3e90b..8d37cac21e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,7 +7,7 @@ on: permissions: {} env: - GOLANG_VERSION: '1.19' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. + GOLANG_VERSION: '1.20' # 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.19 + go-version: '1.20' 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.19 + go-version: '1.20' platforms: linux/amd64,linux/arm64 push: true target: kubectl-argo-rollouts diff --git a/Dockerfile b/Dockerfile index e03f98623c..096b150517 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.19 as builder +FROM --platform=$BUILDPLATFORM golang:1.20 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.49.0 && \ +RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.53.3 && \ 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.19 as argo-rollouts-build +FROM --platform=$BUILDPLATFORM golang:1.20 as argo-rollouts-build WORKDIR /go/src/github.com/argoproj/argo-rollouts diff --git a/Dockerfile.dev b/Dockerfile.dev index 93d3320ece..7c3fc3f30c 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,7 +1,7 @@ #################################################################################################### # argo-rollouts-dev #################################################################################################### -FROM golang:1.19 as builder +FROM golang:1.20 as builder RUN apt-get update && apt-get install -y \ ca-certificates && \ diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 8f523fb53e..4afab9bc42 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -422,7 +422,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "suspend": { "type": "boolean" @@ -510,7 +511,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "weight": { "format": "int32", @@ -579,7 +581,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" } @@ -587,7 +590,8 @@ "required": [ "nodeSelectorTerms" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -632,7 +636,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -667,7 +672,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -733,7 +739,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -768,7 +775,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -830,7 +838,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -865,7 +874,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -931,7 +941,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -966,7 +977,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -1035,7 +1047,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -1049,7 +1062,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -1075,7 +1089,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -1092,7 +1107,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -1117,7 +1133,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -1131,7 +1148,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -1979,7 +1997,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -1993,7 +2012,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -2019,7 +2039,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -2036,7 +2057,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -2061,7 +2083,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -2075,7 +2098,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -2887,7 +2911,8 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" }, @@ -2932,7 +2957,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -2946,7 +2972,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -2972,7 +2999,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -2989,7 +3017,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -3014,7 +3043,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -3028,7 +3058,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -4042,7 +4073,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "matchLabelKeys": { "items": { @@ -4816,7 +4848,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "suspend": { "type": "boolean" @@ -4904,7 +4937,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "weight": { "format": "int32", @@ -4973,7 +5007,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" } @@ -4981,7 +5016,8 @@ "required": [ "nodeSelectorTerms" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -5026,7 +5062,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -5061,7 +5098,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -5127,7 +5165,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -5162,7 +5201,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -5224,7 +5264,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -5259,7 +5300,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -5325,7 +5367,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -5360,7 +5403,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -5429,7 +5473,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -5443,7 +5488,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -5469,7 +5515,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -5486,7 +5533,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -5511,7 +5559,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -5525,7 +5574,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -6373,7 +6423,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -6387,7 +6438,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -6413,7 +6465,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -6430,7 +6483,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -6455,7 +6509,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -6469,7 +6524,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -7281,7 +7337,8 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" }, @@ -7326,7 +7383,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -7340,7 +7398,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -7366,7 +7425,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -7383,7 +7443,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -7408,7 +7469,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -7422,7 +7484,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -8436,7 +8499,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "matchLabelKeys": { "items": { @@ -9210,7 +9274,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "suspend": { "type": "boolean" @@ -9298,7 +9363,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "weight": { "format": "int32", @@ -9367,7 +9433,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" } @@ -9375,7 +9442,8 @@ "required": [ "nodeSelectorTerms" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -9420,7 +9488,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -9455,7 +9524,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -9521,7 +9591,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -9556,7 +9627,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -9618,7 +9690,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -9653,7 +9726,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -9719,7 +9793,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -9754,7 +9829,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -9823,7 +9899,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -9837,7 +9914,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -9863,7 +9941,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -9880,7 +9959,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -9905,7 +9985,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -9919,7 +10000,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -10767,7 +10849,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -10781,7 +10864,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -10807,7 +10891,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -10824,7 +10909,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -10849,7 +10935,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -10863,7 +10950,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -11675,7 +11763,8 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" }, @@ -11720,7 +11809,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -11734,7 +11824,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -11760,7 +11851,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -11777,7 +11869,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -11802,7 +11895,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -11816,7 +11910,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -12830,7 +12925,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "matchLabelKeys": { "items": { @@ -13344,7 +13440,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "service": { "properties": { @@ -13437,7 +13534,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "weight": { "format": "int32", @@ -13506,7 +13604,8 @@ "type": "array" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" } @@ -13514,7 +13613,8 @@ "required": [ "nodeSelectorTerms" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -13559,7 +13659,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -13594,7 +13695,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -13660,7 +13762,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -13695,7 +13798,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -13757,7 +13861,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -13792,7 +13897,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -13858,7 +13964,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaceSelector": { "properties": { @@ -13893,7 +14000,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "namespaces": { "items": { @@ -13962,7 +14070,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -13976,7 +14085,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -14002,7 +14112,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -14019,7 +14130,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -14044,7 +14156,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -14058,7 +14171,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -14906,7 +15020,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -14920,7 +15035,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -14946,7 +15062,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -14963,7 +15080,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -14988,7 +15106,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -15002,7 +15121,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -15814,7 +15934,8 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array" }, @@ -15859,7 +15980,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -15873,7 +15995,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -15899,7 +16022,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -15916,7 +16040,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -15941,7 +16066,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -15955,7 +16081,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -16969,7 +17096,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "matchLabelKeys": { "items": { @@ -17407,7 +17535,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -17421,7 +17550,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -17447,7 +17577,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -17464,7 +17595,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -17489,7 +17621,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -17503,7 +17636,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -18316,7 +18450,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -18330,7 +18465,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -18356,7 +18492,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -18373,7 +18510,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -18398,7 +18536,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -18412,7 +18551,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -19213,7 +19353,8 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "type": "array", "x-kubernetes-patch-merge-key": "name", @@ -19260,7 +19401,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "fieldRef": { "properties": { @@ -19274,7 +19416,8 @@ "required": [ "fieldPath" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "resourceFieldRef": { "properties": { @@ -19300,7 +19443,8 @@ "required": [ "resource" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "secretKeyRef": { "properties": { @@ -19317,7 +19461,8 @@ "required": [ "key" ], - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -19342,7 +19487,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "prefix": { "type": "string" @@ -19356,7 +19502,8 @@ "type": "boolean" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" } }, "type": "object" @@ -20164,7 +20311,8 @@ "type": "object" } }, - "type": "object" + "type": "object", + "x-kubernetes-map-type": "atomic" }, "matchLabelKeys": { "items": { diff --git a/go.mod b/go.mod index 585884668e..718ade94e8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/argoproj/argo-rollouts -go 1.19 +go 1.20 require ( github.com/antonmedv/expr v1.12.7 diff --git a/hack/gen-crd-spec/main.go b/hack/gen-crd-spec/main.go index aa615687d9..97156308a5 100644 --- a/hack/gen-crd-spec/main.go +++ b/hack/gen-crd-spec/main.go @@ -80,8 +80,7 @@ func NewCustomResourceDefinition() []*extensionsobj.CustomResourceDefinition { crdYamlBytes, err := exec.Command( "controller-gen", "paths=./pkg/apis/rollouts/...", - "crd:crdVersions=v1", - "crd:maxDescLen=0", + "crd:crdVersions=v1,maxDescLen=0", "output:crd:stdout", ).Output() if err != nil { diff --git a/hack/installers/install-codegen-go-tools.sh b/hack/installers/install-codegen-go-tools.sh index 8a08efd826..d6c7d5b864 100755 --- a/hack/installers/install-codegen-go-tools.sh +++ b/hack/installers/install-codegen-go-tools.sh @@ -45,13 +45,13 @@ go_mod_install k8s.io/code-generator/cmd/lister-gen go_mod_install k8s.io/kube-openapi/cmd/openapi-gen # controller-gen is run by ./hack/gen-crd-spec to generate the CRDs -go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.7.0 +go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.12.1 # swagger cli is used to generate swagger docs -go install github.com/go-swagger/go-swagger/cmd/swagger@v0.28.0 +go install github.com/go-swagger/go-swagger/cmd/swagger@v0.30.5 # goimports is used to auto-format generated code -go install golang.org/x/tools/cmd/goimports@v0.1.8 +go install golang.org/x/tools/cmd/goimports@v0.11.0 # mockery is used for generating mock -go install github.com/vektra/mockery/v2@v2.14.0 +go install github.com/vektra/mockery/v2@v2.32.0 diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index fbfeb64412..ba43ef534d 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: analysisruns.argoproj.io spec: group: argoproj.io @@ -300,6 +300,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -362,6 +363,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -408,10 +410,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -443,6 +447,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -466,6 +471,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -509,6 +515,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -532,6 +539,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -573,6 +581,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -596,6 +605,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -639,6 +649,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -662,6 +673,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -707,6 +719,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -716,6 +729,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -731,6 +745,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -742,6 +757,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -757,6 +773,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -766,6 +783,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1306,6 +1324,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1315,6 +1334,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1330,6 +1350,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1341,6 +1362,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1356,6 +1378,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1365,6 +1388,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1879,6 +1903,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -1911,6 +1936,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1920,6 +1946,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1935,6 +1962,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1946,6 +1974,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1961,6 +1990,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1970,6 +2000,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2618,6 +2649,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 3411b175a6..61508d4237 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: analysistemplates.argoproj.io spec: group: argoproj.io @@ -296,6 +296,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -358,6 +359,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -404,10 +406,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -439,6 +443,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -462,6 +467,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -505,6 +511,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -528,6 +535,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -569,6 +577,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -592,6 +601,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -635,6 +645,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -658,6 +669,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -703,6 +715,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -712,6 +725,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -727,6 +741,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -738,6 +753,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -753,6 +769,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -762,6 +779,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1302,6 +1320,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1311,6 +1330,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1326,6 +1346,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1337,6 +1358,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1352,6 +1374,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1361,6 +1384,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1875,6 +1899,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -1907,6 +1932,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1916,6 +1942,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1931,6 +1958,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1942,6 +1970,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1957,6 +1986,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1966,6 +1996,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2614,6 +2645,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index aeeb9a1dab..e5bb0543df 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: clusteranalysistemplates.argoproj.io spec: group: argoproj.io @@ -296,6 +296,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -358,6 +359,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -404,10 +406,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -439,6 +443,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -462,6 +467,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -505,6 +511,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -528,6 +535,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -569,6 +577,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -592,6 +601,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -635,6 +645,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -658,6 +669,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -703,6 +715,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -712,6 +725,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -727,6 +741,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -738,6 +753,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -753,6 +769,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -762,6 +779,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1302,6 +1320,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1311,6 +1330,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1326,6 +1346,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1337,6 +1358,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1352,6 +1374,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1361,6 +1384,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1875,6 +1899,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -1907,6 +1932,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1916,6 +1942,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1931,6 +1958,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1942,6 +1970,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1957,6 +1986,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1966,6 +1996,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2614,6 +2645,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/manifests/crds/experiment-crd.yaml b/manifests/crds/experiment-crd.yaml index 5fb7940b31..3693004db0 100644 --- a/manifests/crds/experiment-crd.yaml +++ b/manifests/crds/experiment-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: experiments.argoproj.io spec: group: argoproj.io @@ -148,6 +148,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic service: properties: name: @@ -213,6 +214,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -259,10 +261,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -294,6 +298,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -317,6 +322,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -360,6 +366,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -383,6 +390,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -424,6 +432,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -447,6 +456,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -490,6 +500,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -513,6 +524,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -558,6 +570,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -567,6 +580,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -582,6 +596,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -593,6 +608,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -608,6 +624,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -617,6 +634,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1157,6 +1175,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1166,6 +1185,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1181,6 +1201,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1192,6 +1213,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1207,6 +1229,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1216,6 +1239,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1730,6 +1754,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -1762,6 +1787,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1771,6 +1797,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1786,6 +1813,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1797,6 +1825,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1812,6 +1841,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1821,6 +1851,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2469,6 +2500,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 5428a3a2e4..e3f73b1d3e 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: rollouts.argoproj.io spec: group: argoproj.io @@ -108,6 +108,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic strategy: properties: blueGreen: @@ -614,6 +615,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic service: properties: name: @@ -996,6 +998,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -1042,10 +1045,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -1077,6 +1082,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -1100,6 +1106,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -1143,6 +1150,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -1166,6 +1174,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -1207,6 +1216,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -1230,6 +1240,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -1273,6 +1284,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -1296,6 +1308,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -1341,6 +1354,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1350,6 +1364,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1365,6 +1380,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1376,6 +1392,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1391,6 +1408,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1400,6 +1418,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1940,6 +1959,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1949,6 +1969,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1964,6 +1985,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1975,6 +1997,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1990,6 +2013,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1999,6 +2023,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2513,6 +2538,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -2545,6 +2571,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -2554,6 +2581,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2569,6 +2597,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -2580,6 +2609,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -2595,6 +2625,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -2604,6 +2635,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -3252,6 +3284,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/manifests/install.yaml b/manifests/install.yaml index 53d7405bb7..8a4c2dc8c5 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: analysisruns.argoproj.io spec: group: argoproj.io @@ -301,6 +301,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -363,6 +364,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -409,10 +411,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -444,6 +448,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -467,6 +472,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -510,6 +516,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -533,6 +540,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -574,6 +582,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -597,6 +606,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -640,6 +650,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -663,6 +674,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -708,6 +720,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -717,6 +730,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -732,6 +746,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -743,6 +758,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -758,6 +774,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -767,6 +784,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1307,6 +1325,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1316,6 +1335,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1331,6 +1351,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1342,6 +1363,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1357,6 +1379,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1366,6 +1389,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -1880,6 +1904,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -1912,6 +1937,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1921,6 +1947,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1936,6 +1963,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1947,6 +1975,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1962,6 +1991,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -1971,6 +2001,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -2619,6 +2650,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string @@ -2969,7 +3001,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: analysistemplates.argoproj.io spec: group: argoproj.io @@ -3263,6 +3295,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -3325,6 +3358,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -3371,10 +3405,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -3406,6 +3442,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -3429,6 +3466,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -3472,6 +3510,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -3495,6 +3534,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -3536,6 +3576,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -3559,6 +3600,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -3602,6 +3644,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -3625,6 +3668,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -3670,6 +3714,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -3679,6 +3724,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3694,6 +3740,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -3705,6 +3752,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -3720,6 +3768,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -3729,6 +3778,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -4269,6 +4319,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -4278,6 +4329,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4293,6 +4345,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -4304,6 +4357,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -4319,6 +4373,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -4328,6 +4383,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -4842,6 +4898,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -4874,6 +4931,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -4883,6 +4941,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4898,6 +4957,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -4909,6 +4969,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -4924,6 +4985,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -4933,6 +4995,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -5581,6 +5644,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string @@ -5817,7 +5881,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: clusteranalysistemplates.argoproj.io spec: group: argoproj.io @@ -6111,6 +6175,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic suspend: type: boolean template: @@ -6173,6 +6238,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -6219,10 +6285,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -6254,6 +6322,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -6277,6 +6346,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -6320,6 +6390,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -6343,6 +6414,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -6384,6 +6456,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -6407,6 +6480,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -6450,6 +6524,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -6473,6 +6548,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -6518,6 +6594,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -6527,6 +6604,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -6542,6 +6620,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -6553,6 +6632,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -6568,6 +6648,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -6577,6 +6658,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -7117,6 +7199,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -7126,6 +7209,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -7141,6 +7225,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -7152,6 +7237,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -7167,6 +7253,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -7176,6 +7263,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -7690,6 +7778,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -7722,6 +7811,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -7731,6 +7821,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -7746,6 +7837,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -7757,6 +7849,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -7772,6 +7865,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -7781,6 +7875,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -8429,6 +8524,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string @@ -8665,7 +8761,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: experiments.argoproj.io spec: group: argoproj.io @@ -8811,6 +8907,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic service: properties: name: @@ -8876,6 +8973,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -8922,10 +9020,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -8957,6 +9057,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -8980,6 +9081,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -9023,6 +9125,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -9046,6 +9149,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -9087,6 +9191,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -9110,6 +9215,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -9153,6 +9259,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -9176,6 +9283,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -9221,6 +9329,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -9230,6 +9339,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9245,6 +9355,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -9256,6 +9367,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -9271,6 +9383,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -9280,6 +9393,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -9820,6 +9934,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -9829,6 +9944,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9844,6 +9960,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -9855,6 +9972,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -9870,6 +9988,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -9879,6 +9998,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -10393,6 +10513,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -10425,6 +10546,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -10434,6 +10556,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10449,6 +10572,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -10460,6 +10584,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -10475,6 +10600,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -10484,6 +10610,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -11132,6 +11259,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string @@ -11281,7 +11409,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.12.1 name: rollouts.argoproj.io spec: group: argoproj.io @@ -11387,6 +11515,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic strategy: properties: blueGreen: @@ -11893,6 +12022,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic service: properties: name: @@ -12275,6 +12405,7 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic weight: format: int32 type: integer @@ -12321,10 +12452,12 @@ spec: type: object type: array type: object + x-kubernetes-map-type: atomic type: array required: - nodeSelectorTerms type: object + x-kubernetes-map-type: atomic type: object podAffinity: properties: @@ -12356,6 +12489,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -12379,6 +12513,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -12422,6 +12557,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -12445,6 +12581,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -12486,6 +12623,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -12509,6 +12647,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -12552,6 +12691,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaceSelector: properties: matchExpressions: @@ -12575,6 +12715,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic namespaces: items: type: string @@ -12620,6 +12761,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -12629,6 +12771,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12644,6 +12787,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -12655,6 +12799,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -12670,6 +12815,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -12679,6 +12825,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -13219,6 +13366,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -13228,6 +13376,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13243,6 +13392,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -13254,6 +13404,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -13269,6 +13420,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -13278,6 +13430,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -13792,6 +13945,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: items: @@ -13824,6 +13978,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -13833,6 +13988,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13848,6 +14004,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -13859,6 +14016,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -13874,6 +14032,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic prefix: type: string secretRef: @@ -13883,6 +14042,7 @@ spec: optional: type: boolean type: object + x-kubernetes-map-type: atomic type: object type: array image: @@ -14531,6 +14691,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic matchLabelKeys: items: type: string diff --git a/metricproviders/mocks/Provider.go b/metricproviders/mocks/Provider.go index 6944f7b05c..1e647a943d 100644 --- a/metricproviders/mocks/Provider.go +++ b/metricproviders/mocks/Provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package mocks @@ -98,13 +98,12 @@ func (_m *Provider) Type() string { return r0 } -type mockConstructorTestingTNewProvider interface { +// NewProvider creates a new instance of Provider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProvider(t interface { mock.TestingT Cleanup(func()) -} - -// NewProvider creates a new instance of Provider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewProvider(t mockConstructorTestingTNewProvider) *Provider { +}) *Provider { mock := &Provider{} mock.Mock.Test(t) diff --git a/pkg/apis/rollouts/validation/validation_references_test.go b/pkg/apis/rollouts/validation/validation_references_test.go index e0597bf8b1..4fc8349fdf 100644 --- a/pkg/apis/rollouts/validation/validation_references_test.go +++ b/pkg/apis/rollouts/validation/validation_references_test.go @@ -484,9 +484,9 @@ func TestValidateRolloutReferencedResourcesNginxIngress(t *testing.T) { } for _, test := range tests { + test := test t.Run(test.name, func(t *testing.T) { t.Parallel() - var ingresses []ingressutil.Ingress for i, service := range test.services { ingress := extensionsIngress(test.ingresses[i], 80, service) @@ -522,7 +522,7 @@ func TestValidateRolloutReferencedResourcesNginxIngress(t *testing.T) { } func TestValidateRolloutReferencedResourcesAlbIngress(t *testing.T) { - stableService := "stable-service" + stableService := "stable-service-name" wrongService := "wrong-stable-service" stableIngressKey := "spec.strategy.canary.trafficRouting.alb.ingress" stableIngressesKey := "spec.strategy.canary.trafficRouting.alb.ingresses" @@ -614,9 +614,9 @@ func TestValidateRolloutReferencedResourcesAlbIngress(t *testing.T) { } for _, test := range tests { + test := test t.Run(test.name, func(t *testing.T) { t.Parallel() - var ingresses []ingressutil.Ingress for i, service := range test.services { ingress := extensionsIngress(test.ingresses[i], 80, service) @@ -1371,6 +1371,7 @@ spec: routeTypes := []string{"httpRoute", "tcpRoute", "grpcRoute", "http2Route"} for _, routeType := range routeTypes { + routeType := routeType t.Run(fmt.Sprintf("will succeed with valid appmesh virtual-router with %s", routeType), func(t *testing.T) { t.Parallel() manifest := fmt.Sprintf(` diff --git a/rollout/mocks/TrafficRoutingReconciler.go b/rollout/mocks/TrafficRoutingReconciler.go index 3a5b1fa67f..c8c3a7cde8 100644 --- a/rollout/mocks/TrafficRoutingReconciler.go +++ b/rollout/mocks/TrafficRoutingReconciler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package mocks @@ -123,6 +123,10 @@ func (_m *TrafficRoutingReconciler) VerifyWeight(desiredWeight int32, additional ret := _m.Called(_ca...) var r0 *bool + var r1 error + if rf, ok := ret.Get(0).(func(int32, ...v1alpha1.WeightDestination) (*bool, error)); ok { + return rf(desiredWeight, additionalDestinations...) + } if rf, ok := ret.Get(0).(func(int32, ...v1alpha1.WeightDestination) *bool); ok { r0 = rf(desiredWeight, additionalDestinations...) } else { @@ -131,7 +135,6 @@ func (_m *TrafficRoutingReconciler) VerifyWeight(desiredWeight int32, additional } } - var r1 error if rf, ok := ret.Get(1).(func(int32, ...v1alpha1.WeightDestination) error); ok { r1 = rf(desiredWeight, additionalDestinations...) } else { @@ -141,13 +144,12 @@ func (_m *TrafficRoutingReconciler) VerifyWeight(desiredWeight int32, additional return r0, r1 } -type mockConstructorTestingTNewTrafficRoutingReconciler interface { +// NewTrafficRoutingReconciler creates a new instance of TrafficRoutingReconciler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTrafficRoutingReconciler(t interface { mock.TestingT Cleanup(func()) -} - -// NewTrafficRoutingReconciler creates a new instance of TrafficRoutingReconciler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewTrafficRoutingReconciler(t mockConstructorTestingTNewTrafficRoutingReconciler) *TrafficRoutingReconciler { +}) *TrafficRoutingReconciler { mock := &TrafficRoutingReconciler{} mock.Mock.Test(t) diff --git a/rollout/trafficrouting/nginx/nginx_test.go b/rollout/trafficrouting/nginx/nginx_test.go index 6930ce1e06..2be80fa23a 100644 --- a/rollout/trafficrouting/nginx/nginx_test.go +++ b/rollout/trafficrouting/nginx/nginx_test.go @@ -577,9 +577,10 @@ func TestCanaryIngressAdditionalAnnotations(t *testing.T) { func TestReconciler_canaryIngress(t *testing.T) { tests := generateMultiIngressTestData() for _, test := range tests { + test := test t.Run(test.name, func(t *testing.T) { - // given t.Parallel() + // given r := Reconciler{ cfg: ReconcilerConfig{ Rollout: fakeRollout(stableService, canaryService, test.singleIngress, test.multiIngress), diff --git a/utils/aws/mocks/ELBv2APIClient.go b/utils/aws/mocks/ELBv2APIClient.go index cfc8872f3b..5e9f9dc380 100644 --- a/utils/aws/mocks/ELBv2APIClient.go +++ b/utils/aws/mocks/ELBv2APIClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package mocks @@ -26,6 +26,10 @@ func (_m *ELBv2APIClient) DescribeListeners(_a0 context.Context, _a1 *elasticloa ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeListenersOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeListenersInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeListenersOutput, error)); ok { + return rf(_a0, _a1, _a2...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeListenersInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeListenersOutput); ok { r0 = rf(_a0, _a1, _a2...) } else { @@ -34,7 +38,6 @@ func (_m *ELBv2APIClient) DescribeListeners(_a0 context.Context, _a1 *elasticloa } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeListenersInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(_a0, _a1, _a2...) } else { @@ -56,6 +59,10 @@ func (_m *ELBv2APIClient) DescribeLoadBalancers(_a0 context.Context, _a1 *elasti ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeLoadBalancersOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeLoadBalancersInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeLoadBalancersOutput, error)); ok { + return rf(_a0, _a1, _a2...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeLoadBalancersInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeLoadBalancersOutput); ok { r0 = rf(_a0, _a1, _a2...) } else { @@ -64,7 +71,6 @@ func (_m *ELBv2APIClient) DescribeLoadBalancers(_a0 context.Context, _a1 *elasti } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeLoadBalancersInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(_a0, _a1, _a2...) } else { @@ -86,6 +92,10 @@ func (_m *ELBv2APIClient) DescribeRules(ctx context.Context, params *elasticload ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeRulesOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeRulesInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeRulesOutput, error)); ok { + return rf(ctx, params, optFns...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeRulesInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeRulesOutput); ok { r0 = rf(ctx, params, optFns...) } else { @@ -94,7 +104,6 @@ func (_m *ELBv2APIClient) DescribeRules(ctx context.Context, params *elasticload } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeRulesInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(ctx, params, optFns...) } else { @@ -116,6 +125,10 @@ func (_m *ELBv2APIClient) DescribeTags(ctx context.Context, params *elasticloadb ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeTagsOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTagsInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTagsOutput, error)); ok { + return rf(ctx, params, optFns...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTagsInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeTagsOutput); ok { r0 = rf(ctx, params, optFns...) } else { @@ -124,7 +137,6 @@ func (_m *ELBv2APIClient) DescribeTags(ctx context.Context, params *elasticloadb } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeTagsInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(ctx, params, optFns...) } else { @@ -146,6 +158,10 @@ func (_m *ELBv2APIClient) DescribeTargetGroups(_a0 context.Context, _a1 *elastic ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeTargetGroupsOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTargetGroupsInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTargetGroupsOutput, error)); ok { + return rf(_a0, _a1, _a2...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTargetGroupsInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeTargetGroupsOutput); ok { r0 = rf(_a0, _a1, _a2...) } else { @@ -154,7 +170,6 @@ func (_m *ELBv2APIClient) DescribeTargetGroups(_a0 context.Context, _a1 *elastic } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeTargetGroupsInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(_a0, _a1, _a2...) } else { @@ -176,6 +191,10 @@ func (_m *ELBv2APIClient) DescribeTargetHealth(ctx context.Context, params *elas ret := _m.Called(_ca...) var r0 *elasticloadbalancingv2.DescribeTargetHealthOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTargetHealthInput, ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTargetHealthOutput, error)); ok { + return rf(ctx, params, optFns...) + } if rf, ok := ret.Get(0).(func(context.Context, *elasticloadbalancingv2.DescribeTargetHealthInput, ...func(*elasticloadbalancingv2.Options)) *elasticloadbalancingv2.DescribeTargetHealthOutput); ok { r0 = rf(ctx, params, optFns...) } else { @@ -184,7 +203,6 @@ func (_m *ELBv2APIClient) DescribeTargetHealth(ctx context.Context, params *elas } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *elasticloadbalancingv2.DescribeTargetHealthInput, ...func(*elasticloadbalancingv2.Options)) error); ok { r1 = rf(ctx, params, optFns...) } else { @@ -194,13 +212,12 @@ func (_m *ELBv2APIClient) DescribeTargetHealth(ctx context.Context, params *elas return r0, r1 } -type mockConstructorTestingTNewELBv2APIClient interface { +// NewELBv2APIClient creates a new instance of ELBv2APIClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewELBv2APIClient(t interface { mock.TestingT Cleanup(func()) -} - -// NewELBv2APIClient creates a new instance of ELBv2APIClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewELBv2APIClient(t mockConstructorTestingTNewELBv2APIClient) *ELBv2APIClient { +}) *ELBv2APIClient { mock := &ELBv2APIClient{} mock.Mock.Test(t) From 4729910fdca9d81fb222a613b9fd13b768171190 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 28 Jul 2023 18:34:19 -0500 Subject: [PATCH 115/159] chore: quote golang version string to not use go 1.2.2 (#2915) quote golang version string to not use go 1.2.2 Signed-off-by: zachaller --- .github/workflows/gh-pages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index b8732ce58a..7a3a109950 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -26,7 +26,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4.0.1 with: - go-version: 1.20 + go-version: '1.20' - name: build run: | pip install mkdocs mkdocs_material From 7d8b08c8f0d962d1f2e2f42ee575121aa392aa27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:32:45 -0500 Subject: [PATCH 116/159] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 (#2920) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.19.0 to 1.19.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.19.0...v1.19.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 718ade94e8..0eb86250d2 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/antonmedv/expr v1.12.7 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.19.0 + github.com/aws/aws-sdk-go-v2 v1.19.1 github.com/aws/aws-sdk-go-v2/config v1.18.29 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 diff --git a/go.sum b/go.sum index 4ade941d17..41e96bcacf 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,9 @@ 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.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.19.1 h1:STs0lbbpXu3byTPcnRLghs2DH0yk9qKDo27TyyJSKsM= +github.com/aws/aws-sdk-go-v2 v1.19.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.29 h1:yA+bSSRGhBwWuprG9I4VgxfK//NBLZ/0BGOHiV3f9oM= github.com/aws/aws-sdk-go-v2/config v1.18.29/go.mod h1:bJT6P8A+KU1qvNMp8aj+/NmaI06Z670dHNoWsrLOgMg= github.com/aws/aws-sdk-go-v2/credentials v1.13.28 h1:WM9tEHgoOh5ThJZ042UKnSx7TXGSC/bz63X3fsrQL2o= From d27d28560ae722eacddc85e8fb66ed690af863aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 18:51:19 +0000 Subject: [PATCH 117/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 (#2919) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.29 to 1.18.30. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.29...config/v1.18.30) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 38 ++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 0eb86250d2..e1e4fbb258 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.19.1 - github.com/aws/aws-sdk-go-v2/config v1.18.29 + github.com/aws/aws-sdk-go-v2/config v1.18.30 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.28 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.29 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 41e96bcacf..63605efc2c 100644 --- a/go.sum +++ b/go.sum @@ -104,30 +104,32 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.19.1 h1:STs0lbbpXu3byTPcnRLghs2DH0yk9qKDo27TyyJSKsM= github.com/aws/aws-sdk-go-v2 v1.19.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.29 h1:yA+bSSRGhBwWuprG9I4VgxfK//NBLZ/0BGOHiV3f9oM= -github.com/aws/aws-sdk-go-v2/config v1.18.29/go.mod h1:bJT6P8A+KU1qvNMp8aj+/NmaI06Z670dHNoWsrLOgMg= -github.com/aws/aws-sdk-go-v2/credentials v1.13.28 h1:WM9tEHgoOh5ThJZ042UKnSx7TXGSC/bz63X3fsrQL2o= -github.com/aws/aws-sdk-go-v2/credentials v1.13.28/go.mod h1:86BSbSeamnVVdr1hPfBZVN8SXM7KxSAZAvhNxVfi8fU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= +github.com/aws/aws-sdk-go-v2/config v1.18.30 h1:TTAXQIn31qYFUQjkW6siVrRTX1ux+sADZDOe3jsZcMg= +github.com/aws/aws-sdk-go-v2/config v1.18.30/go.mod h1:+YogjT7e/t9JVu/sOnZZgxTge1G+bPNk8zOaI0QIQvE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.29 h1:KNgCpThGuZyCjq9EuuqoLDenKKMwO/x1Xx01ckDa7VI= +github.com/aws/aws-sdk-go-v2/credentials v1.13.29/go.mod h1:VMq1LcmSEa9qxBlOCYTjVuGJWEEzhGmgL552jQsmhss= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 h1:kortK122LvTU34CGX/F9oJpelXKkEA2j/MW48II+8+8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6/go.mod h1:k7IPHyHNIASI0m0RwOmCjWOTtgG+J0raqwuHH8WhWJE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 h1:kbk81RlPoC6e4co7cQx2FAvH9TgbzxIqCqiosAFiB+w= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36/go.mod h1:T8Jsn/uNL/AFOXrVYQ1YQaN1r9gN34JU1855/Lyjv+o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 h1:8r5m1BoAWkn0TDC34lUculryf7nUF25EgIMdjvGCkgo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36/go.mod h1:Rmw2M1hMVTwiUhjwMoIBFWFJMhvJbct06sSidxInkhY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 h1:lMl8S5SB8jNCB+Sty2Em4lnu3IJytceHQd7qbmfqKL0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30/go.mod h1:v3GSCnFxbHzt9dlWBqvA1K1f9lmWuf4ztupZBCAIVs4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 h1:BXiqvN7WuV/pMhz8CivhO8cG8icJcjnjHumif4ukQ0c= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37/go.mod h1:d4GZ62cjnz/hjKFdAu11gAwK73bdhqaFv2O4J1gaqIs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 h1:sAqtjjMc1DdA0JnYKKuqJVt/eHLTuN7bDf2T4UQ9sDs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3/go.mod h1:r6kXYdL8M2/BnZatWvQ8yC/3UQvPrXTQnJtZ0xEbKRM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 h1:sWDv7cMITPcZ21QdreULwxOOAmE05JjEsT6fCDtDA9k= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 h1:BFubHS/xN5bjl818QaroN6mQdjneYQ+AOx44KNXlyH4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= -github.com/aws/aws-sdk-go-v2/service/sts v1.20.0 h1:jKmIOO+dFvCPuIhhM8u0Dy3dtd590n2kEDSYiGHoI98= -github.com/aws/aws-sdk-go-v2/service/sts v1.20.0/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 h1:UcVZxLVNY4yayCmiG94Ge3l2qbc5WEB/oa4RmjoQEi0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30/go.mod h1:wPffyJiWWtHwvpFyn23WjAjVjMnlQOQrl02+vutBh3Y= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 h1:gUjz7trfz9qBm0AlkKTvJHBXELi1wvw+2LA9GfD2AsM= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.14/go.mod h1:9kfRdJgLCbnyeqZ/DpaSwcgj9ZDYLfRpe8Sze+NrYfQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 h1:8bEtxV5UT9ucdWGXfZ7CM3caQhSHGjWnTHt0OeF7m7s= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14/go.mod h1:nd9BG2UnexN2sDx/mk2Jd6pf3d2E61AiA8m8Fdvdx8Y= +github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 h1:U7h9CPoyMfVoN5jUglB0LglCMP10AK4vMBsbsCKM8Yw= +github.com/aws/aws-sdk-go-v2/service/sts v1.20.1/go.mod h1:BUHusg4cOA1TFGegj7x8/eoWrbdHzJfoMrXcbMQAG0k= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 288e5d5ff35181816718861cb1cc1c70b9ba4082 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Aug 2023 08:29:34 -0500 Subject: [PATCH 118/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 (#2924) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.30 to 1.18.31. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.30...config/v1.18.31) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 24 ++++++++++++------------ go.sum | 47 ++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index e1e4fbb258..0f7f3263a5 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.12.7 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.19.1 - github.com/aws/aws-sdk-go-v2/config v1.18.30 + github.com/aws/aws-sdk-go-v2 v1.20.0 + github.com/aws/aws-sdk-go-v2/config v1.18.31 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible @@ -82,16 +82,16 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.29 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.30 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.21.0 // indirect + github.com/aws/smithy-go v1.14.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 63605efc2c..5433d88b53 100644 --- a/go.sum +++ b/go.sum @@ -102,36 +102,37 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 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.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.19.1 h1:STs0lbbpXu3byTPcnRLghs2DH0yk9qKDo27TyyJSKsM= -github.com/aws/aws-sdk-go-v2 v1.19.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.30 h1:TTAXQIn31qYFUQjkW6siVrRTX1ux+sADZDOe3jsZcMg= -github.com/aws/aws-sdk-go-v2/config v1.18.30/go.mod h1:+YogjT7e/t9JVu/sOnZZgxTge1G+bPNk8zOaI0QIQvE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.29 h1:KNgCpThGuZyCjq9EuuqoLDenKKMwO/x1Xx01ckDa7VI= -github.com/aws/aws-sdk-go-v2/credentials v1.13.29/go.mod h1:VMq1LcmSEa9qxBlOCYTjVuGJWEEzhGmgL552jQsmhss= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 h1:kortK122LvTU34CGX/F9oJpelXKkEA2j/MW48II+8+8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6/go.mod h1:k7IPHyHNIASI0m0RwOmCjWOTtgG+J0raqwuHH8WhWJE= +github.com/aws/aws-sdk-go-v2 v1.20.0 h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8= +github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= +github.com/aws/aws-sdk-go-v2/config v1.18.31 h1:CcacHsJjsPtHpe1MaopwPddUErmLnl+X77+7n4G2KkY= +github.com/aws/aws-sdk-go-v2/config v1.18.31/go.mod h1:pnSeuahFFvtScCHy0INXLxJ4N8H7KncD5u6A48bx3/8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.30 h1:4pt4sI4OwXrrWUGuGr5NEb2g+4IBUB/I2BVj0t2Ak7Q= +github.com/aws/aws-sdk-go-v2/credentials v1.13.30/go.mod h1:Scpo/dGUdxAtRKsNCaXMXONnl3gvvugbXVldy5Fz2DQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 h1:kbk81RlPoC6e4co7cQx2FAvH9TgbzxIqCqiosAFiB+w= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36/go.mod h1:T8Jsn/uNL/AFOXrVYQ1YQaN1r9gN34JU1855/Lyjv+o= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 h1:zr/gxAZkMcvP71ZhQOcvdm8ReLjFgIXnIn0fw5AM7mo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 h1:lMl8S5SB8jNCB+Sty2Em4lnu3IJytceHQd7qbmfqKL0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30/go.mod h1:v3GSCnFxbHzt9dlWBqvA1K1f9lmWuf4ztupZBCAIVs4= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 h1:BXiqvN7WuV/pMhz8CivhO8cG8icJcjnjHumif4ukQ0c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37/go.mod h1:d4GZ62cjnz/hjKFdAu11gAwK73bdhqaFv2O4J1gaqIs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8tf4bRTUanzEYvhw7KkPXIMpO0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 h1:sAqtjjMc1DdA0JnYKKuqJVt/eHLTuN7bDf2T4UQ9sDs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3/go.mod h1:r6kXYdL8M2/BnZatWvQ8yC/3UQvPrXTQnJtZ0xEbKRM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 h1:UcVZxLVNY4yayCmiG94Ge3l2qbc5WEB/oa4RmjoQEi0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30/go.mod h1:wPffyJiWWtHwvpFyn23WjAjVjMnlQOQrl02+vutBh3Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 h1:gUjz7trfz9qBm0AlkKTvJHBXELi1wvw+2LA9GfD2AsM= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.14/go.mod h1:9kfRdJgLCbnyeqZ/DpaSwcgj9ZDYLfRpe8Sze+NrYfQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 h1:8bEtxV5UT9ucdWGXfZ7CM3caQhSHGjWnTHt0OeF7m7s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14/go.mod h1:nd9BG2UnexN2sDx/mk2Jd6pf3d2E61AiA8m8Fdvdx8Y= -github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 h1:U7h9CPoyMfVoN5jUglB0LglCMP10AK4vMBsbsCKM8Yw= -github.com/aws/aws-sdk-go-v2/service/sts v1.20.1/go.mod h1:BUHusg4cOA1TFGegj7x8/eoWrbdHzJfoMrXcbMQAG0k= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.0 h1:agnjK56/1jtGPehxV8QZ/AYHV++pEfl7CpYbWjHjBDc= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.0/go.mod h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0 h1:g0Rr6COTBEaIG9TFQ0GmRkPWOGuDfySGSq2PlMcclrY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.0 h1:HI1YIL5Q9FtucxF5tcNpzCEyLnkeUcqg6xtOx8u09S4= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.0/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io= +github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 0f7aca2e4cd88e03438efa2461550fd46f9d7897 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Aug 2023 10:45:01 -0500 Subject: [PATCH 119/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 (#2922) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.26.3 to 1.27.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.3...service/s3/v1.27.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0f7f3263a5..c1afaaaea0 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.0 github.com/aws/aws-sdk-go-v2/config v1.18.31 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 5433d88b53..de53109201 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3 h1:sAqtjjMc1DdA0JnYKKuqJVt/eHLTuN7bDf2T4UQ9sDs= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.26.3/go.mod h1:r6kXYdL8M2/BnZatWvQ8yC/3UQvPrXTQnJtZ0xEbKRM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0 h1:DLEgqzvRmK3cG6JEFkzvD9ilU4+FVvA4mKzjoNQ+eeA= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= From 9f4a5c925b5d8d22de3bfce70ab11176f4e57dc9 Mon Sep 17 00:00:00 2001 From: modesvops <87967053+modesvops@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:50:30 +0300 Subject: [PATCH 120/159] fix: cloudwatch metrics provider multiple dimensions (#2932) update cloudwatch metrics provider Signed-off-by: Modestas Kulpinskas Co-authored-by: Modestas Kulpinskas --- metricproviders/cloudwatch/cloudwatch.go | 6 +- metricproviders/cloudwatch/cloudwatch_test.go | 86 +++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/metricproviders/cloudwatch/cloudwatch.go b/metricproviders/cloudwatch/cloudwatch.go index 2bb6c2aaad..05d65704df 100644 --- a/metricproviders/cloudwatch/cloudwatch.go +++ b/metricproviders/cloudwatch/cloudwatch.go @@ -154,9 +154,11 @@ func convertType(data []v1alpha1.CloudWatchMetricDataQuery) []types.MetricDataQu if v.MetricStat.Metric.Dimensions != nil { metricStat.Metric.Dimensions = make([]types.Dimension, len(v.MetricStat.Metric.Dimensions)) for j, d := range v.MetricStat.Metric.Dimensions { + name := d.Name + value := d.Value metricStat.Metric.Dimensions[j] = types.Dimension{ - Name: &d.Name, - Value: &d.Value, + Name: &name, + Value: &value, } } } diff --git a/metricproviders/cloudwatch/cloudwatch_test.go b/metricproviders/cloudwatch/cloudwatch_test.go index cd55dcc41c..de91aae755 100644 --- a/metricproviders/cloudwatch/cloudwatch_test.go +++ b/metricproviders/cloudwatch/cloudwatch_test.go @@ -382,6 +382,92 @@ func TestConvertType(t *testing.T) { }, }, }, + { + query: []v1alpha1.CloudWatchMetricDataQuery{ + { + Id: "rate", + Expression: pointer.StringPtr("errors / requests"), + }, + { + Id: "errors", + MetricStat: &v1alpha1.CloudWatchMetricStat{ + Metric: v1alpha1.CloudWatchMetricStatMetric{ + Dimensions: []v1alpha1.CloudWatchMetricStatMetricDimension{ + { + Name: "hoge", + Value: "fuga", + }, + { + Name: "poge", + Value: "doge", + }, + }, + Namespace: pointer.StringPtr("app1"), + MetricName: "errors", + }, + Period: period, + Stat: "Max", + Unit: "Count", + }, + ReturnData: pointer.BoolPtr(false), + }, + { + Id: "requests", + MetricStat: &v1alpha1.CloudWatchMetricStat{ + Metric: v1alpha1.CloudWatchMetricStatMetric{ + Namespace: pointer.StringPtr("app2"), + MetricName: "requests", + }, + Period: period, + Stat: "Sum", + Unit: "Bytes/Second", + }, + ReturnData: pointer.BoolPtr(true), + }, + }, + expected: []types.MetricDataQuery{ + { + Id: pointer.StringPtr("rate"), + Expression: pointer.StringPtr("errors / requests"), + }, + { + Id: pointer.StringPtr("errors"), + MetricStat: &types.MetricStat{ + Metric: &types.Metric{ + Namespace: pointer.StringPtr("app1"), + MetricName: pointer.StringPtr("errors"), + Dimensions: []types.Dimension{ + { + Name: pointer.StringPtr("hoge"), + Value: pointer.StringPtr("fuga"), + }, + { + Name: pointer.StringPtr("poge"), + Value: pointer.StringPtr("doge"), + }, + }, + }, + Period: pointer.Int32Ptr(300), + Stat: pointer.StringPtr("Max"), + Unit: types.StandardUnitCount, + }, + ReturnData: pointer.BoolPtr(false), + }, + { + Id: pointer.StringPtr("requests"), + MetricStat: &types.MetricStat{ + Metric: &types.Metric{ + Namespace: pointer.StringPtr("app2"), + MetricName: pointer.StringPtr("requests"), + }, + Period: pointer.Int32Ptr(300), + Stat: pointer.StringPtr("Sum"), + Unit: types.StandardUnitBytesSecond, + }, + ReturnData: pointer.BoolPtr(true), + }, + }, + }, } for _, tt := range tests { From 378e3d3497ab5a428e557dc98892e9b94e545d50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 07:50:52 -0500 Subject: [PATCH 121/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 (#2928) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.31 to 1.18.32. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.31...config/v1.18.32) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index c1afaaaea0..218d655828 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.0 - github.com/aws/aws-sdk-go-v2/config v1.18.31 + github.com/aws/aws-sdk-go-v2/config v1.18.32 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.30 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.21.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect github.com/aws/smithy-go v1.14.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index de53109201..764d682f14 100644 --- a/go.sum +++ b/go.sum @@ -104,10 +104,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.0 h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8= github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= -github.com/aws/aws-sdk-go-v2/config v1.18.31 h1:CcacHsJjsPtHpe1MaopwPddUErmLnl+X77+7n4G2KkY= -github.com/aws/aws-sdk-go-v2/config v1.18.31/go.mod h1:pnSeuahFFvtScCHy0INXLxJ4N8H7KncD5u6A48bx3/8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.30 h1:4pt4sI4OwXrrWUGuGr5NEb2g+4IBUB/I2BVj0t2Ak7Q= -github.com/aws/aws-sdk-go-v2/credentials v1.13.30/go.mod h1:Scpo/dGUdxAtRKsNCaXMXONnl3gvvugbXVldy5Fz2DQ= +github.com/aws/aws-sdk-go-v2/config v1.18.32 h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI= +github.com/aws/aws-sdk-go-v2/config v1.18.32/go.mod h1:U3ZF0fQRRA4gnbn9GGvOWLoT2EzzZfAWeKwnVrm1rDc= +github.com/aws/aws-sdk-go-v2/credentials v1.13.31 h1:vJyON3lG7R8VOErpJJBclBADiWTwzcwdkQpTKx8D2sk= +github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= @@ -124,12 +124,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYz github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.0 h1:agnjK56/1jtGPehxV8QZ/AYHV++pEfl7CpYbWjHjBDc= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.0/go.mod h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0 h1:g0Rr6COTBEaIG9TFQ0GmRkPWOGuDfySGSq2PlMcclrY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.0/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.0 h1:HI1YIL5Q9FtucxF5tcNpzCEyLnkeUcqg6xtOx8u09S4= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.0/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.1/go.mod h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9LeH2gqNtBe0MhTedA8MGI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io= github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= From e2467fe3c2a10a29b7fd7ab465fb32f6f883504c Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 4 Aug 2023 11:14:20 -0500 Subject: [PATCH 122/159] fix: add required ingress permission (#2933) add required ingress permission Signed-off-by: zachaller --- manifests/install.yaml | 1 + manifests/namespace-install.yaml | 1 + manifests/role/argo-rollouts-clusterrole.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/manifests/install.yaml b/manifests/install.yaml index 8a4c2dc8c5..b5a7f8f77f 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -15172,6 +15172,7 @@ rules: - get - list - watch + - update - patch - apiGroups: - batch diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 1972b411b8..f75037669c 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -135,6 +135,7 @@ rules: - get - list - watch + - update - patch - apiGroups: - batch diff --git a/manifests/role/argo-rollouts-clusterrole.yaml b/manifests/role/argo-rollouts-clusterrole.yaml index d58c5bda56..95cc82004d 100644 --- a/manifests/role/argo-rollouts-clusterrole.yaml +++ b/manifests/role/argo-rollouts-clusterrole.yaml @@ -135,6 +135,7 @@ rules: - get - list - watch + - update - patch # job access needed for analysis template job metrics - apiGroups: From c9bc3bc4844d4fa298a69f11c7fc113c6aa500e6 Mon Sep 17 00:00:00 2001 From: OpenGuidou <73480729+OpenGuidou@users.noreply.github.com> Date: Sat, 5 Aug 2023 00:35:45 +0200 Subject: [PATCH 123/159] feat: Add insecure option for Prometheus. Fixes #2913 (#2914) * feat: Add insecure option for Prometheus Signed-off-by: Guillaume Doussin * change grpc id Signed-off-by: zachaller --------- Signed-off-by: Guillaume Doussin Signed-off-by: zachaller Co-authored-by: zachaller --- docs/analysis/prometheus.md | 20 +- docs/analysis/web.md | 18 + .../features/kustomize/rollout_cr_schema.json | 9 + manifests/crds/analysis-run-crd.yaml | 2 + manifests/crds/analysis-template-crd.yaml | 2 + .../crds/cluster-analysis-template-crd.yaml | 2 + manifests/install.yaml | 6 + metricproviders/prometheus/prometheus.go | 12 + metricproviders/prometheus/prometheus_test.go | 1 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 2 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1054 +++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 3 + .../rollouts/v1alpha1/openapi_generated.go | 7 + 13 files changed, 625 insertions(+), 513 deletions(-) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index 74b1ce1bb4..e21396cec5 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -58,9 +58,27 @@ provider: roleArn: $ROLEARN ``` -# Additional Metadata +## Additional Metadata Any additional metadata from the Prometheus controller, like the resolved queries after substituting the template's arguments, etc. will appear under the `Metadata` map in the `MetricsResult` object of `AnalysisRun`. + +## Skip TLS verification + +You can skip the TLS verification of the prometheus host provided by setting the options `insecure: true`. + +```yaml +provider: + prometheus: + address: https://prometheus.example.com + insecure: true + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) +``` \ No newline at end of file diff --git a/docs/analysis/web.md b/docs/analysis/web.md index 4572dbc4f2..db501d0ead 100644 --- a/docs/analysis/web.md +++ b/docs/analysis/web.md @@ -94,4 +94,22 @@ It is possible to use a POST or PUT requests, by specifying the `method` and eit nestedObj: nested value key3: "{{ args.service-name }}" jsonPath: "{$.data.ok}" +``` + +### Skip TLS verification + +You can skip the TLS verification of the web host provided by setting the options `insecure: true`. + +```yaml + metrics: + - name: webmetric + successCondition: "result.ok && result.successPercent >= 0.90" + provider: + web: + url: "https://my-server.com/api/v1/measurement?service={{ args.service-name }}" + insecure: true + headers: + - key: Authorization + value: "Bearer {{ args.api-token }}" + jsonPath: "{$.data}" ``` \ No newline at end of file diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 4afab9bc42..d78d9c5c7c 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -4310,6 +4310,9 @@ }, "type": "object" }, + "insecure": { + "type": "boolean" + }, "query": { "type": "string" }, @@ -8736,6 +8739,9 @@ }, "type": "object" }, + "insecure": { + "type": "boolean" + }, "query": { "type": "string" }, @@ -13162,6 +13168,9 @@ }, "type": "object" }, + "insecure": { + "type": "boolean" + }, "query": { "type": "string" }, diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index ba43ef534d..55dde775cf 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2809,6 +2809,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 61508d4237..5ef0ed7570 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2805,6 +2805,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index e5bb0543df..69bd9595e6 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2805,6 +2805,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: diff --git a/manifests/install.yaml b/manifests/install.yaml index b5a7f8f77f..fd9d491424 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2810,6 +2810,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: @@ -5804,6 +5806,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: @@ -8684,6 +8688,8 @@ spec: type: string type: object type: object + insecure: + type: boolean query: type: string timeout: diff --git a/metricproviders/prometheus/prometheus.go b/metricproviders/prometheus/prometheus.go index 57bc0e85d1..15562b25d6 100644 --- a/metricproviders/prometheus/prometheus.go +++ b/metricproviders/prometheus/prometheus.go @@ -2,8 +2,10 @@ package prometheus import ( "context" + "crypto/tls" "errors" "fmt" + "net" "net/http" "net/url" "os" @@ -183,7 +185,17 @@ func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { prometheusApiConfig := api.Config{ Address: metric.Provider.Prometheus.Address, + RoundTripper: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + TLSHandshakeTimeout: 10 * time.Second, + TLSClientConfig: &tls.Config{InsecureSkipVerify: metric.Provider.Prometheus.Insecure}, + }, } + //Check if using Amazon Managed Prometheus if true build sigv4 client if strings.Contains(metric.Provider.Prometheus.Address, "aps-workspaces") { cfg := sigv4.SigV4Config{ diff --git a/metricproviders/prometheus/prometheus_test.go b/metricproviders/prometheus/prometheus_test.go index e5b8b2142d..8b077930a5 100644 --- a/metricproviders/prometheus/prometheus_test.go +++ b/metricproviders/prometheus/prometheus_test.go @@ -453,6 +453,7 @@ func TestNewPrometheusAPI(t *testing.T) { log.Infof("api:%v", api) metric.Provider.Prometheus.Address = "https://www.example.com" + metric.Provider.Prometheus.Insecure = true _, err = NewPrometheusAPI(metric) assert.Nil(t, err) } diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 83fa92a04f..07c8acbc61 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -216,6 +216,8 @@ type PrometheusMetric struct { // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. // +optional Timeout *int64 `json:"timeout,omitempty" protobuf:"bytes,4,opt,name=timeout"` + // Insecure skips host TLS verification + Insecure bool `json:"insecure,omitempty" protobuf:"varint,5,opt,name=insecure"` } // PrometheusMetric defines the prometheus query to perform canary analysis diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index a3535dfade..679db00a8a 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3292,520 +3292,520 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8196 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, - 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, + // 8206 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, + 0x75, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x1e, 0xb9, 0x24, 0xb7, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, - 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xb6, 0x86, 0x7b, 0x2b, 0x4b, 0x3a, 0x5b, 0xcd, 0x99, 0xc7, 0x61, + 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xf6, 0x0d, 0xf7, 0x56, 0x96, 0x74, 0xb6, 0x9a, 0x33, 0xc5, 0x61, 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, - 0xac, 0xc4, 0x16, 0x92, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, - 0x03, 0x31, 0xe2, 0xd8, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, - 0x49, 0x90, 0x40, 0x08, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xf7, 0xd9, 0xaf, 0x7b, 0x7a, 0xb8, - 0x33, 0x3b, 0xcd, 0xd5, 0x25, 0xf6, 0xbf, 0x99, 0x57, 0xf5, 0xaa, 0xaa, 0xdf, 0x67, 0xbd, 0x7a, - 0x55, 0xf5, 0x60, 0xb3, 0xe5, 0x46, 0x7b, 0xbd, 0x9d, 0x95, 0x86, 0xdf, 0x59, 0x75, 0x82, 0x96, - 0xdf, 0x0d, 0xfc, 0xbb, 0xfc, 0xc7, 0xc7, 0x02, 0xbf, 0xdd, 0xf6, 0x7b, 0x51, 0xb8, 0xda, 0xdd, - 0x6f, 0xad, 0x3a, 0x5d, 0x37, 0x5c, 0xd5, 0x25, 0x07, 0x9f, 0x70, 0xda, 0xdd, 0x3d, 0xe7, 0x13, - 0xab, 0x2d, 0xea, 0xd1, 0xc0, 0x89, 0x68, 0x73, 0xa5, 0x1b, 0xf8, 0x91, 0x4f, 0x3e, 0x1d, 0x53, - 0x5b, 0x51, 0xd4, 0xf8, 0x8f, 0x9f, 0x51, 0x75, 0x57, 0xba, 0xfb, 0xad, 0x15, 0x46, 0x6d, 0x45, - 0x97, 0x28, 0x6a, 0xcb, 0x1f, 0x33, 0x64, 0x69, 0xf9, 0x2d, 0x7f, 0x95, 0x13, 0xdd, 0xe9, 0xed, - 0xf2, 0x7f, 0xfc, 0x0f, 0xff, 0x25, 0x98, 0x2d, 0x3f, 0xbb, 0xff, 0x4a, 0xb8, 0xe2, 0xfa, 0x4c, - 0xb6, 0xd5, 0x1d, 0x27, 0x6a, 0xec, 0xad, 0x1e, 0xf4, 0x49, 0xb4, 0x6c, 0x1b, 0x48, 0x0d, 0x3f, - 0xa0, 0x59, 0x38, 0x2f, 0xc5, 0x38, 0x1d, 0xa7, 0xb1, 0xe7, 0x7a, 0x34, 0x38, 0x8c, 0xbf, 0xba, - 0x43, 0x23, 0x27, 0xab, 0xd6, 0xea, 0xa0, 0x5a, 0x41, 0xcf, 0x8b, 0xdc, 0x0e, 0xed, 0xab, 0xf0, - 0xd7, 0x1e, 0x56, 0x21, 0x6c, 0xec, 0xd1, 0x8e, 0xd3, 0x57, 0xef, 0xc5, 0x41, 0xf5, 0x7a, 0x91, - 0xdb, 0x5e, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0x74, 0x25, 0xfb, 0x47, 0x05, 0x28, 0x55, 0x36, 0xab, - 0xf5, 0xc8, 0x89, 0x7a, 0x21, 0xf9, 0xaa, 0x05, 0x73, 0x6d, 0xdf, 0x69, 0x56, 0x9d, 0xb6, 0xe3, - 0x35, 0x68, 0xb0, 0x64, 0x3d, 0x63, 0x5d, 0x99, 0x7d, 0x61, 0x73, 0x65, 0x9c, 0xfe, 0x5a, 0xa9, - 0xdc, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xd5, 0xf3, 0xdf, 0x3d, 0x2a, 0x3f, - 0x71, 0x7c, 0x54, 0x9e, 0xdb, 0x34, 0x38, 0x61, 0x82, 0x2f, 0xf9, 0x96, 0x05, 0x67, 0x1b, 0x8e, - 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0xeb, 0x81, 0xdf, 0xeb, 0x2e, 0x4d, 0x9c, 0x82, - 0x34, 0x4f, 0x4a, 0x69, 0xce, 0xae, 0xa5, 0xd9, 0x61, 0xbf, 0x04, 0x5c, 0xae, 0x30, 0x72, 0x76, - 0xda, 0xd4, 0x94, 0xab, 0x70, 0x9a, 0x72, 0xd5, 0xd3, 0xec, 0xb0, 0x5f, 0x02, 0xf2, 0x11, 0x98, - 0x76, 0xbd, 0x56, 0x40, 0xc3, 0x70, 0x69, 0xf2, 0x19, 0xeb, 0x4a, 0xa9, 0xba, 0x20, 0xab, 0x4f, - 0x6f, 0x88, 0x62, 0x54, 0x70, 0xfb, 0x3b, 0x05, 0x38, 0x5b, 0xd9, 0xac, 0x6e, 0x07, 0xce, 0xee, - 0xae, 0xdb, 0x40, 0xbf, 0x17, 0xb9, 0x5e, 0xcb, 0x24, 0x60, 0x9d, 0x4c, 0x80, 0xbc, 0x0c, 0xb3, - 0x21, 0x0d, 0x0e, 0xdc, 0x06, 0xad, 0xf9, 0x41, 0xc4, 0x3b, 0xa5, 0x58, 0x3d, 0x27, 0xd1, 0x67, - 0xeb, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, 0xe2, 0x6a, - 0x18, 0x83, 0xd0, 0xc4, 0x23, 0xeb, 0xb0, 0xe8, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, 0xb5, - 0x80, 0xee, 0xba, 0xf7, 0xe5, 0x27, 0x2e, 0xc9, 0xba, 0x8b, 0x95, 0x14, 0x1c, 0xfb, 0x6a, 0x90, - 0x6f, 0x5a, 0xb0, 0x18, 0x46, 0x6e, 0x63, 0xdf, 0xf5, 0x68, 0x18, 0xae, 0xf9, 0xde, 0xae, 0xdb, - 0x5a, 0x2a, 0xf2, 0x6e, 0xbb, 0x39, 0x5e, 0xb7, 0xd5, 0x53, 0x54, 0xab, 0xe7, 0x99, 0x48, 0xe9, - 0x52, 0xec, 0xe3, 0x4e, 0x3e, 0x0a, 0x25, 0xd9, 0xa2, 0x34, 0x5c, 0x9a, 0x7a, 0xa6, 0x70, 0xa5, - 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x2e, 0x6d, 0xa8, 0x42, 0x8c, 0xe1, 0xf6, 0x3a, 0x2c, 0x55, 0x3a, - 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x75, 0xdd, 0x15, 0x98, 0xe9, 0x38, 0xdd, 0xae, 0xeb, - 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0x73, 0xc7, 0x47, 0xe5, 0x99, 0x2d, 0x59, 0x86, 0x1a, 0x6a, 0xff, - 0xf1, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, 0x98, 0x61, - 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0xbe, 0x22, 0x16, 0x91, 0x15, 0x73, 0x11, 0x89, - 0x3f, 0x9f, 0x61, 0xaf, 0x1c, 0x7c, 0x62, 0xe5, 0xcd, 0x9d, 0xbb, 0xb4, 0x11, 0x6d, 0xd1, 0xc8, - 0xa9, 0x12, 0xd9, 0x0b, 0x10, 0x97, 0xa1, 0xa6, 0x4a, 0x7c, 0x98, 0x0c, 0xbb, 0xb4, 0x21, 0x67, - 0xee, 0xd6, 0x98, 0x33, 0x24, 0x16, 0xbd, 0xde, 0xa5, 0x8d, 0xea, 0x9c, 0x64, 0x3d, 0xc9, 0xfe, - 0x21, 0x67, 0x44, 0xee, 0xc1, 0x54, 0xc8, 0xd7, 0x32, 0x39, 0x29, 0xdf, 0xcc, 0x8f, 0x25, 0x27, - 0x5b, 0x9d, 0x97, 0x4c, 0xa7, 0xc4, 0x7f, 0x94, 0xec, 0xec, 0xff, 0x64, 0xc1, 0x39, 0x03, 0xbb, - 0x12, 0xb4, 0x7a, 0x1d, 0xea, 0x45, 0xe4, 0x19, 0x98, 0xf4, 0x9c, 0x0e, 0x95, 0xb3, 0x4a, 0x8b, - 0x7c, 0xd3, 0xe9, 0x50, 0xe4, 0x10, 0xf2, 0x2c, 0x14, 0x0f, 0x9c, 0x76, 0x8f, 0xf2, 0x46, 0x2a, - 0x55, 0xcf, 0x48, 0x94, 0xe2, 0x5b, 0xac, 0x10, 0x05, 0x8c, 0xbc, 0x0b, 0x25, 0xfe, 0xe3, 0x5a, - 0xe0, 0x77, 0x72, 0xfa, 0x34, 0x29, 0xe1, 0x5b, 0x8a, 0xac, 0x18, 0x7e, 0xfa, 0x2f, 0xc6, 0x0c, - 0xed, 0x3f, 0xb5, 0x60, 0xc1, 0xf8, 0xb8, 0x4d, 0x37, 0x8c, 0xc8, 0xe7, 0xfb, 0x06, 0xcf, 0xca, - 0x70, 0x83, 0x87, 0xd5, 0xe6, 0x43, 0x67, 0x51, 0x7e, 0xe9, 0x8c, 0x2a, 0x31, 0x06, 0x8e, 0x07, - 0x45, 0x37, 0xa2, 0x9d, 0x70, 0x69, 0xe2, 0x99, 0xc2, 0x95, 0xd9, 0x17, 0x36, 0x72, 0xeb, 0xc6, - 0xb8, 0x7d, 0x37, 0x18, 0x7d, 0x14, 0x6c, 0xec, 0x7f, 0x51, 0x48, 0x74, 0xdf, 0x96, 0x92, 0xe3, - 0x7d, 0x0b, 0xa6, 0xda, 0xce, 0x0e, 0x6d, 0x8b, 0xb9, 0x35, 0xfb, 0xc2, 0xdb, 0xb9, 0x49, 0xa2, - 0x78, 0xac, 0x6c, 0x72, 0xfa, 0x57, 0xbd, 0x28, 0x38, 0x8c, 0x87, 0x97, 0x28, 0x44, 0xc9, 0x9c, - 0xfc, 0x43, 0x0b, 0x66, 0xe3, 0x55, 0x4d, 0x35, 0xcb, 0x4e, 0xfe, 0xc2, 0xc4, 0x8b, 0xa9, 0x94, - 0x48, 0x2f, 0xd1, 0x06, 0x04, 0x4d, 0x59, 0x96, 0x3f, 0x09, 0xb3, 0xc6, 0x27, 0x90, 0x45, 0x28, - 0xec, 0xd3, 0x43, 0x31, 0xe0, 0x91, 0xfd, 0x24, 0xe7, 0x13, 0x23, 0x5c, 0x0e, 0xe9, 0x4f, 0x4d, - 0xbc, 0x62, 0x2d, 0xbf, 0x06, 0x8b, 0x69, 0x86, 0xa3, 0xd4, 0xb7, 0xbf, 0x33, 0x99, 0x18, 0x98, - 0x6c, 0x21, 0x20, 0x3e, 0x4c, 0x77, 0x68, 0x14, 0xb8, 0x0d, 0xd5, 0x65, 0xeb, 0xe3, 0xb5, 0xd2, - 0x16, 0x27, 0x16, 0x6f, 0x88, 0xe2, 0x7f, 0x88, 0x8a, 0x0b, 0xd9, 0x83, 0x49, 0x27, 0x68, 0xa9, - 0x3e, 0xb9, 0x96, 0xcf, 0xb4, 0x8c, 0x97, 0x8a, 0x4a, 0xd0, 0x0a, 0x91, 0x73, 0x20, 0xab, 0x50, - 0x8a, 0x68, 0xd0, 0x71, 0x3d, 0x27, 0x12, 0x3b, 0xe8, 0x4c, 0xf5, 0xac, 0x44, 0x2b, 0x6d, 0x2b, - 0x00, 0xc6, 0x38, 0xa4, 0x0d, 0x53, 0xcd, 0xe0, 0x10, 0x7b, 0xde, 0xd2, 0x64, 0x1e, 0x4d, 0xb1, - 0xce, 0x69, 0xc5, 0x83, 0x54, 0xfc, 0x47, 0xc9, 0x83, 0xfc, 0xaa, 0x05, 0xe7, 0x3b, 0xd4, 0x09, - 0x7b, 0x01, 0x65, 0x9f, 0x80, 0x34, 0xa2, 0x1e, 0xeb, 0xd8, 0xa5, 0x22, 0x67, 0x8e, 0xe3, 0xf6, - 0x43, 0x3f, 0xe5, 0xea, 0xd3, 0x52, 0x94, 0xf3, 0x59, 0x50, 0xcc, 0x94, 0xc6, 0xfe, 0xe3, 0x49, - 0x38, 0xdb, 0xb7, 0xb0, 0x93, 0x97, 0xa0, 0xd8, 0xdd, 0x73, 0x42, 0xb5, 0x52, 0x5f, 0x56, 0xcb, - 0x44, 0x8d, 0x15, 0x3e, 0x38, 0x2a, 0x9f, 0x51, 0x55, 0x78, 0x01, 0x0a, 0x64, 0xa6, 0x37, 0x75, - 0x68, 0x18, 0x3a, 0x2d, 0xb5, 0x7c, 0x1b, 0xc3, 0x84, 0x17, 0xa3, 0x82, 0x93, 0xbf, 0x6d, 0xc1, - 0x19, 0x31, 0x64, 0x90, 0x86, 0xbd, 0x76, 0xc4, 0xb6, 0x28, 0xd6, 0x2c, 0x37, 0xf2, 0x18, 0x9e, - 0x82, 0x64, 0xf5, 0x82, 0xe4, 0x7e, 0xc6, 0x2c, 0x0d, 0x31, 0xc9, 0x97, 0xdc, 0x81, 0x52, 0x18, - 0x39, 0x41, 0x44, 0x9b, 0x95, 0x88, 0x2b, 0x53, 0xb3, 0x2f, 0xfc, 0xe4, 0x70, 0x6b, 0xf7, 0xb6, - 0xdb, 0xa1, 0x62, 0x9f, 0xa8, 0x2b, 0x02, 0x18, 0xd3, 0x22, 0xef, 0x02, 0x04, 0x3d, 0xaf, 0xde, - 0xeb, 0x74, 0x9c, 0xe0, 0x50, 0xea, 0x57, 0xd7, 0xc7, 0xfb, 0x3c, 0xd4, 0xf4, 0x62, 0x55, 0x23, - 0x2e, 0x43, 0x83, 0x1f, 0xf9, 0xb2, 0x05, 0x67, 0xc4, 0x48, 0x54, 0x12, 0x4c, 0xe5, 0x2c, 0xc1, - 0x59, 0xd6, 0xb4, 0xeb, 0x26, 0x0b, 0x4c, 0x72, 0xb4, 0xff, 0x43, 0x52, 0x0d, 0xa8, 0x47, 0xec, - 0xb0, 0xd5, 0x3a, 0x24, 0x9f, 0x83, 0x27, 0xc3, 0x5e, 0xa3, 0x41, 0xc3, 0x70, 0xb7, 0xd7, 0xc6, - 0x9e, 0x77, 0xdd, 0x0d, 0x23, 0x3f, 0x38, 0xdc, 0x74, 0x3b, 0x6e, 0xc4, 0x47, 0x5c, 0xb1, 0x7a, - 0xe9, 0xf8, 0xa8, 0xfc, 0x64, 0x7d, 0x10, 0x12, 0x0e, 0xae, 0x4f, 0x1c, 0x78, 0xaa, 0xe7, 0x0d, - 0x26, 0x2f, 0x34, 0xf4, 0xf2, 0xf1, 0x51, 0xf9, 0xa9, 0xdb, 0x83, 0xd1, 0xf0, 0x24, 0x1a, 0xf6, - 0x7f, 0xb3, 0xd8, 0x4a, 0x2d, 0xbe, 0x6b, 0x9b, 0x76, 0xba, 0x6d, 0xb6, 0xba, 0x9c, 0xbe, 0xfe, - 0x18, 0x25, 0xf4, 0x47, 0xcc, 0x67, 0xbb, 0x53, 0xf2, 0x0f, 0x52, 0x22, 0xed, 0xff, 0x6a, 0xc1, - 0xf9, 0x34, 0xf2, 0x63, 0xd0, 0x79, 0xc2, 0xa4, 0xce, 0x73, 0x33, 0xdf, 0xaf, 0x1d, 0xa0, 0xf8, - 0x7c, 0x75, 0xb2, 0xff, 0x5b, 0xff, 0x7f, 0xdf, 0x46, 0xe3, 0x5d, 0xb1, 0xf0, 0xe3, 0xdc, 0x15, - 0x27, 0x3f, 0x50, 0xbb, 0xe2, 0xaf, 0x4f, 0xc2, 0x5c, 0xc5, 0x8b, 0xdc, 0xca, 0xee, 0xae, 0xeb, - 0xb9, 0xd1, 0x21, 0xf9, 0xfa, 0x04, 0xac, 0x76, 0x03, 0xba, 0x4b, 0x83, 0x80, 0x36, 0xd7, 0x7b, - 0x81, 0xeb, 0xb5, 0xea, 0x8d, 0x3d, 0xda, 0xec, 0xb5, 0x5d, 0xaf, 0xb5, 0xd1, 0xf2, 0x7c, 0x5d, - 0x7c, 0xf5, 0x3e, 0x6d, 0xf4, 0xf8, 0x27, 0x89, 0x49, 0xd1, 0x19, 0xef, 0x93, 0x6a, 0xa3, 0x31, - 0xad, 0xbe, 0x78, 0x7c, 0x54, 0x5e, 0x1d, 0xb1, 0x12, 0x8e, 0xfa, 0x69, 0xe4, 0x6b, 0x13, 0xb0, - 0x12, 0xd0, 0x9f, 0xed, 0xb9, 0xc3, 0xb7, 0x86, 0x58, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, 0xf1, - 0xac, 0xbe, 0x70, 0x7c, 0x54, 0x1e, 0xb1, 0x0e, 0x8e, 0xf8, 0x5d, 0x76, 0x0d, 0x66, 0x2b, 0x5d, - 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, 0x8a, - 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0xf3, 0x6c, 0xc5, 0xe5, - 0x24, 0x53, 0xc6, 0x8d, 0xbb, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0xc6, 0x3d, 0x07, 0xc6, 0x52, - 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x99, 0x80, 0x0b, 0x95, 0x6e, 0x77, 0x8b, 0x86, - 0x7b, 0x29, 0x29, 0x7e, 0xd1, 0x82, 0xf9, 0x03, 0x37, 0x88, 0x7a, 0x4e, 0x5b, 0xd9, 0xaf, 0x84, - 0x3c, 0xf5, 0x71, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x92, 0xe3, 0xa3, 0xf2, 0x7c, 0xb2, - 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb7, 0x60, 0x51, 0x16, 0xdd, 0xf4, 0x9b, 0xd4, 0xb4, 0x8f, 0xde, - 0xce, 0x53, 0x26, 0x4d, 0x5c, 0xd8, 0xb5, 0xd2, 0xa5, 0xd8, 0x27, 0x84, 0xfd, 0x3f, 0x26, 0xe0, - 0xe2, 0x00, 0x1a, 0xe4, 0xd7, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0xae, 0x6c, 0xcd, - 0x9f, 0xca, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x5d, 0x62, 0xab, 0xe1, 0x5a, 0x06, - 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0xcc, 0xac, 0x29, 0x49, 0x27, 0x1e, 0x8b, 0xa4, 0xf5, 0x0c, - 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x37, 0xe1, 0xa9, 0x13, 0xc8, 0x3d, 0x7c, 0x72, 0xda, 0x6f, 0xeb, - 0x51, 0x9f, 0x1c, 0x73, 0x43, 0xcc, 0x6b, 0x1b, 0xa6, 0xf8, 0xd4, 0x51, 0x13, 0x1b, 0xd8, 0xf6, - 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x8e, 0x05, 0x33, 0x23, 0x58, 0xc3, 0xca, 0x49, 0x6b, - 0x58, 0xa9, 0xcf, 0x12, 0x16, 0xf5, 0x5b, 0xc2, 0x5e, 0x1f, 0xaf, 0x37, 0x86, 0xb1, 0x80, 0xfd, - 0xc8, 0x82, 0xb3, 0x7d, 0x16, 0x33, 0xb2, 0x07, 0xe7, 0xbb, 0x7e, 0x53, 0xa9, 0x4d, 0xd7, 0x9d, - 0x70, 0x8f, 0xc3, 0xe4, 0xe7, 0xbd, 0xc4, 0x7a, 0xb2, 0x96, 0x01, 0x7f, 0x70, 0x54, 0x5e, 0xd2, - 0x44, 0x52, 0x08, 0x98, 0x49, 0x91, 0x74, 0x61, 0x66, 0xd7, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0xc7, - 0x54, 0x90, 0xae, 0x49, 0x6a, 0xc2, 0x58, 0xac, 0xfe, 0xa1, 0xe6, 0x62, 0x7f, 0x09, 0xe6, 0x93, - 0x57, 0x12, 0x43, 0x74, 0xde, 0x25, 0x28, 0x38, 0x81, 0x27, 0xbb, 0x6e, 0x56, 0x22, 0x14, 0x2a, - 0x78, 0x13, 0x59, 0x39, 0x79, 0x1e, 0x66, 0x76, 0x7b, 0xed, 0x36, 0xab, 0x20, 0xed, 0xff, 0x5a, - 0x1d, 0xbe, 0x26, 0xcb, 0x51, 0x63, 0xd8, 0x7f, 0x3e, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, 0x1e, - 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xea, 0xb4, 0x4d, 0x1b, - 0x91, 0x1f, 0x48, 0x69, 0x2e, 0x4a, 0x42, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x35, 0x98, - 0x77, 0x1a, 0x91, 0x7b, 0x40, 0x35, 0x05, 0x21, 0xee, 0x87, 0x24, 0x85, 0xf9, 0x4a, 0x02, 0x8a, - 0x29, 0x6c, 0xf2, 0x79, 0x58, 0x0a, 0x1b, 0x4e, 0x9b, 0xde, 0xee, 0x4a, 0x56, 0x6b, 0x7b, 0xb4, - 0xb1, 0x5f, 0xf3, 0x5d, 0x2f, 0x92, 0x26, 0x99, 0x67, 0x24, 0xa5, 0xa5, 0xfa, 0x00, 0x3c, 0x1c, - 0x48, 0x81, 0xfc, 0x6b, 0x0b, 0x2e, 0x75, 0x03, 0x5a, 0x0b, 0xfc, 0x8e, 0xcf, 0xf6, 0xda, 0x3e, - 0x3b, 0x85, 0x3c, 0xaf, 0xbf, 0x35, 0xa6, 0x52, 0x21, 0x4a, 0xfa, 0xcd, 0xdb, 0x1f, 0x3e, 0x3e, - 0x2a, 0x5f, 0xaa, 0x9d, 0x24, 0x00, 0x9e, 0x2c, 0x1f, 0xf9, 0x37, 0x16, 0x5c, 0xee, 0xfa, 0x61, - 0x74, 0xc2, 0x27, 0x14, 0x4f, 0xf5, 0x13, 0xec, 0xe3, 0xa3, 0xf2, 0xe5, 0xda, 0x89, 0x12, 0xe0, - 0x43, 0x24, 0xb4, 0x8f, 0x67, 0xe1, 0xac, 0x31, 0xf6, 0xe4, 0x21, 0xfe, 0x55, 0x38, 0xa3, 0x06, - 0x43, 0xac, 0x04, 0x94, 0x62, 0xa3, 0x4b, 0xc5, 0x04, 0x62, 0x12, 0x97, 0x8d, 0x3b, 0x3d, 0x14, - 0x45, 0xed, 0xd4, 0xb8, 0xab, 0x25, 0xa0, 0x98, 0xc2, 0x26, 0x1b, 0x70, 0x4e, 0x96, 0x20, 0xed, - 0xb6, 0xdd, 0x86, 0xb3, 0xe6, 0xf7, 0xe4, 0x90, 0x2b, 0x56, 0x2f, 0x1e, 0x1f, 0x95, 0xcf, 0xd5, - 0xfa, 0xc1, 0x98, 0x55, 0x87, 0x6c, 0xc2, 0x79, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, 0x7a, 0x6c, - 0x5f, 0x69, 0xf2, 0xa1, 0x35, 0x23, 0x36, 0xa0, 0x4a, 0x06, 0x1c, 0x33, 0x6b, 0x91, 0x5a, 0x8a, - 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x7a, 0xb9, 0x18, 0x1f, 0x45, 0x2a, 0x19, 0x38, 0x98, 0x59, - 0x93, 0xb4, 0x61, 0xbe, 0xe3, 0xdc, 0xbf, 0xed, 0x39, 0x07, 0x8e, 0xdb, 0x66, 0x4c, 0xa4, 0x21, - 0x67, 0xb0, 0x75, 0xa1, 0x17, 0xb9, 0xed, 0x15, 0x71, 0xc5, 0xbd, 0xb2, 0xe1, 0x45, 0x6f, 0x06, - 0xf5, 0x88, 0xa9, 0xac, 0x42, 0x95, 0xda, 0x4a, 0xd0, 0xc2, 0x14, 0x6d, 0xf2, 0x26, 0x5c, 0xe0, - 0xd3, 0x71, 0xdd, 0xbf, 0xe7, 0xad, 0xd3, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x93, - 0xc7, 0x47, 0xe5, 0x0b, 0xf5, 0x2c, 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x2a, 0x09, 0x40, 0x7a, - 0xe0, 0x86, 0xae, 0xef, 0x09, 0x73, 0xcc, 0x4c, 0x6c, 0x8e, 0xa9, 0x0f, 0x46, 0xc3, 0x93, 0x68, - 0x90, 0x7f, 0x64, 0xc1, 0xf9, 0xac, 0x69, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0x35, 0xb5, 0xc4, - 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x59, 0x30, 0xe7, 0x18, 0x47, 0xc9, 0x25, 0xe0, - 0x52, 0xdd, 0x18, 0xd7, 0xa0, 0x11, 0x53, 0xac, 0x2e, 0x1e, 0x1f, 0x95, 0x13, 0xc7, 0x55, 0x4c, - 0x70, 0x24, 0xff, 0xc4, 0x82, 0x0b, 0x99, 0x73, 0x7c, 0x69, 0xf6, 0x34, 0x5a, 0x88, 0x0f, 0x92, - 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, 0x4d, 0x4b, 0x6f, 0x65, 0xea, 0xee, 0x65, 0x69, 0x8e, 0x8b, - 0x76, 0x6b, 0xcc, 0xd3, 0x73, 0xac, 0x3e, 0x28, 0xc2, 0xd5, 0x73, 0xc6, 0xce, 0xa8, 0x0a, 0x31, - 0xcd, 0x9e, 0x7c, 0xc3, 0x52, 0x5b, 0xa3, 0x96, 0xe8, 0xcc, 0x69, 0x49, 0x44, 0xe2, 0x9d, 0x56, - 0x0b, 0x94, 0x62, 0x4e, 0x7e, 0x1a, 0x96, 0x9d, 0x1d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xd2, 0x3c, - 0x9f, 0x46, 0x97, 0x8f, 0x8f, 0xca, 0xcb, 0x95, 0x81, 0x58, 0x78, 0x02, 0x05, 0xfb, 0x37, 0x8b, - 0x30, 0x27, 0x8e, 0x04, 0x72, 0xeb, 0xfa, 0x2d, 0x0b, 0x9e, 0x6e, 0xf4, 0x82, 0x80, 0x7a, 0x51, - 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0x99, 0xe3, 0xa3, 0xf2, 0xd3, 0x6b, - 0x27, 0xf0, 0xc7, 0x13, 0xa5, 0x23, 0xff, 0xde, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xc6, 0x7e, 0x2b, - 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x26, 0x4e, 0xf5, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, 0xdb, 0x6b, - 0x0f, 0x95, 0x02, 0x87, 0x90, 0x94, 0xbc, 0x0e, 0x67, 0x25, 0xd6, 0xd5, 0xfb, 0x5d, 0x1a, 0xb8, - 0x4c, 0xf9, 0x96, 0x8a, 0x63, 0xec, 0xb6, 0x93, 0x46, 0xc0, 0xfe, 0x3a, 0x24, 0x84, 0xe9, 0x7b, - 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, 0x1a, 0xd3, 0x57, 0x47, 0x9a, 0x07, 0xee, 0x08, 0x9a, 0xd5, - 0xd9, 0xe3, 0xa3, 0xf2, 0xb4, 0xfc, 0x83, 0x8a, 0x13, 0xb9, 0x09, 0xf3, 0xe2, 0xc0, 0x56, 0x73, - 0xbd, 0x56, 0xcd, 0xf7, 0x84, 0xc3, 0x49, 0xa9, 0xfa, 0x9c, 0xda, 0xf0, 0xeb, 0x09, 0xe8, 0x83, - 0xa3, 0xf2, 0x9c, 0xfa, 0xbd, 0x7d, 0xd8, 0xa5, 0x98, 0xaa, 0x6d, 0xff, 0xde, 0x14, 0x80, 0x1a, - 0xae, 0xb4, 0x4b, 0x3e, 0x0a, 0xa5, 0x90, 0x46, 0x82, 0xab, 0xbc, 0x41, 0x10, 0x17, 0x33, 0xaa, - 0x10, 0x63, 0x38, 0xd9, 0x87, 0x62, 0xd7, 0xe9, 0x85, 0x54, 0x76, 0xfe, 0x8d, 0x5c, 0x3a, 0xbf, - 0xc6, 0x28, 0x8a, 0x13, 0x1a, 0xff, 0x89, 0x82, 0x07, 0xf9, 0x8a, 0x05, 0x40, 0x93, 0x1d, 0x36, - 0xb6, 0xa5, 0x44, 0xb2, 0x8c, 0xfb, 0x94, 0xb5, 0x41, 0x75, 0xfe, 0xf8, 0xa8, 0x0c, 0x46, 0xd7, - 0x1b, 0x6c, 0xc9, 0x3d, 0x98, 0x71, 0xd4, 0x9a, 0x3f, 0x79, 0x1a, 0x6b, 0x3e, 0x3f, 0x38, 0xe9, - 0x41, 0xab, 0x99, 0x91, 0xaf, 0x59, 0x30, 0x1f, 0xd2, 0x48, 0x76, 0x15, 0x5b, 0x79, 0xa4, 0xc2, - 0x3b, 0xe6, 0xa0, 0xab, 0x27, 0x68, 0x8a, 0x15, 0x34, 0x59, 0x86, 0x29, 0xbe, 0x4a, 0x94, 0xeb, - 0xd4, 0x69, 0xd2, 0x80, 0x9f, 0xcb, 0xa5, 0x26, 0x35, 0xbe, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, - 0x86, 0x29, 0xbe, 0x4a, 0x94, 0x2d, 0x37, 0x08, 0x7c, 0x29, 0xca, 0x4c, 0x4e, 0xa2, 0x18, 0x34, - 0xb5, 0x28, 0x46, 0x19, 0xa6, 0xf8, 0xda, 0xdf, 0x3e, 0x03, 0xf3, 0x6a, 0x22, 0xc5, 0x9a, 0xbd, - 0x30, 0x03, 0x0d, 0xd0, 0xec, 0xd7, 0x4c, 0x20, 0x26, 0x71, 0x59, 0x65, 0x31, 0x55, 0x93, 0x8a, - 0xbd, 0xae, 0x5c, 0x37, 0x81, 0x98, 0xc4, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, 0xcb, 0xe0, - 0x31, 0xef, 0x2a, 0xe3, 0xf5, 0x21, 0xbe, 0xee, 0x61, 0xff, 0x42, 0x14, 0x5c, 0xb8, 0x25, 0x33, - 0x4a, 0x18, 0x37, 0xe5, 0xe4, 0xc8, 0x67, 0x7e, 0x26, 0xed, 0xa6, 0xa2, 0x37, 0x92, 0x65, 0x98, - 0x62, 0x9f, 0xa1, 0xec, 0x17, 0x4f, 0x51, 0xd9, 0xff, 0x2c, 0xcc, 0x74, 0x9c, 0xfb, 0xf5, 0x5e, - 0xd0, 0x7a, 0xf4, 0x43, 0x85, 0x74, 0xaf, 0x13, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb6, 0x8c, 0x25, - 0x67, 0x9a, 0x13, 0xbf, 0x93, 0xef, 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, - 0xf3, 0xd8, 0x55, 0x6f, 0xa6, 0x46, 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0xa9, 0xaa, 0x91, 0x6b, - 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, 0x11, 0x73, 0x4e, 0xcb, 0x03, 0xa7, 0x2a, 0x4f, 0x3d, 0xc1, - 0x0c, 0x53, 0xcc, 0x07, 0x9f, 0x37, 0x67, 0x4f, 0xe7, 0xbc, 0x39, 0x97, 0xc3, 0x79, 0xf3, 0x64, - 0x55, 0xfc, 0xcc, 0xb8, 0xaa, 0x38, 0xb9, 0x01, 0xa4, 0x79, 0xe8, 0x39, 0x1d, 0xb7, 0x21, 0x17, - 0x4b, 0xbe, 0x6d, 0xce, 0x73, 0x7b, 0xc4, 0xb2, 0x5c, 0xc8, 0xc8, 0x7a, 0x1f, 0x06, 0x66, 0xd4, - 0x22, 0x11, 0xcc, 0x74, 0x95, 0xc6, 0xb5, 0x90, 0xc7, 0xe8, 0x57, 0x1a, 0x98, 0xf0, 0x17, 0x60, - 0x13, 0x4f, 0x95, 0xa0, 0xe6, 0x44, 0x36, 0xe1, 0x7c, 0xc7, 0xf5, 0x6a, 0x7e, 0x33, 0xac, 0xd1, - 0x40, 0x5a, 0x5b, 0xea, 0x34, 0x5a, 0x5a, 0xe4, 0x6d, 0xc3, 0x4f, 0xd0, 0x5b, 0x19, 0x70, 0xcc, - 0xac, 0x65, 0xff, 0x2f, 0x0b, 0x16, 0xd7, 0xda, 0x7e, 0xaf, 0x79, 0xc7, 0x89, 0x1a, 0x7b, 0xe2, - 0xaa, 0x9c, 0xbc, 0x06, 0x33, 0xae, 0x17, 0xd1, 0xe0, 0xc0, 0x69, 0xcb, 0xfd, 0xc9, 0x56, 0xe6, - 0xd3, 0x0d, 0x59, 0xfe, 0xe0, 0xa8, 0x3c, 0xbf, 0xde, 0x0b, 0xb8, 0x3b, 0x9d, 0x58, 0xad, 0x50, - 0xd7, 0x21, 0xdf, 0xb6, 0xe0, 0xac, 0xb8, 0x6c, 0x5f, 0x77, 0x22, 0xe7, 0x56, 0x8f, 0x06, 0x2e, - 0x55, 0xd7, 0xed, 0x63, 0x2e, 0x54, 0x69, 0x59, 0x15, 0x83, 0xc3, 0x58, 0x51, 0xdf, 0x4a, 0x73, - 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2a, 0xc0, 0x93, 0x03, 0x69, 0x91, 0x65, 0x98, 0x70, 0x9b, 0xf2, - 0xd3, 0x41, 0xd2, 0x9d, 0xd8, 0x68, 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, - 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x0c, 0x45, 0xee, 0x5a, 0x29, - 0xcf, 0x13, 0x5c, 0x8b, 0xe5, 0x5e, 0x8c, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, - 0x1a, 0x91, 0xbb, 0x24, 0xe6, 0xdb, 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, - 0x0d, 0x53, 0x4c, 0xa1, 0xf5, 0x9b, 0x8f, 0xbc, 0x29, 0xf2, 0x2b, 0x99, 0x1a, 0xa7, 0x81, 0x92, - 0x16, 0x6b, 0xab, 0x80, 0x46, 0xbd, 0xc0, 0x63, 0x4d, 0xcb, 0xb7, 0xc1, 0x19, 0x21, 0x05, 0xea, - 0x52, 0x34, 0x30, 0xec, 0x7f, 0x35, 0x01, 0xe7, 0xb3, 0x44, 0x67, 0xbb, 0xcd, 0x94, 0x90, 0x56, - 0x1e, 0x8d, 0x3f, 0x93, 0x7f, 0xfb, 0x48, 0xbf, 0x11, 0xed, 0x5d, 0x21, 0x3d, 0xdb, 0x24, 0x5f, - 0xf2, 0x19, 0xdd, 0x42, 0x13, 0x8f, 0xd8, 0x42, 0x9a, 0x72, 0xaa, 0x95, 0x9e, 0x81, 0xc9, 0x90, - 0xf5, 0x7c, 0x21, 0x79, 0xdd, 0xc1, 0xfb, 0x88, 0x43, 0x18, 0x46, 0xcf, 0x73, 0x23, 0x19, 0x8f, - 0xa0, 0x31, 0x6e, 0x7b, 0x6e, 0x84, 0x1c, 0x62, 0x7f, 0x6b, 0x02, 0x96, 0x07, 0x7f, 0x14, 0xf9, - 0x96, 0x05, 0xd0, 0x64, 0xc7, 0x95, 0x90, 0x3b, 0xf5, 0x0a, 0x3f, 0x1b, 0xe7, 0xb4, 0xda, 0x70, - 0x5d, 0x71, 0x8a, 0x9d, 0xae, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, 0x05, 0x35, 0xf4, 0xf9, 0x55, - 0x8d, 0x98, 0x4c, 0xba, 0xce, 0x96, 0x86, 0xa0, 0x81, 0xc5, 0xce, 0xa3, 0x9e, 0xd3, 0xa1, 0x61, - 0xd7, 0xd1, 0xd1, 0x1d, 0xfc, 0x3c, 0x7a, 0x53, 0x15, 0x62, 0x0c, 0xb7, 0xdb, 0xf0, 0xec, 0x10, - 0x72, 0xe6, 0xe4, 0x3c, 0x6f, 0xff, 0x4f, 0x0b, 0x2e, 0xae, 0xb5, 0x7b, 0x61, 0x44, 0x83, 0xbf, - 0x30, 0x3e, 0x6c, 0xff, 0xdb, 0x82, 0xa7, 0x06, 0x7c, 0xf3, 0x63, 0x70, 0x65, 0x7b, 0x27, 0xe9, - 0xca, 0x76, 0x7b, 0xdc, 0x21, 0x9d, 0xf9, 0x1d, 0x03, 0x3c, 0xda, 0x7e, 0xdd, 0x82, 0x33, 0x6c, - 0xd9, 0x6a, 0xfa, 0xad, 0x9c, 0x36, 0xce, 0x67, 0xa1, 0xf8, 0xb3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, - 0xbe, 0x2b, 0xa1, 0x80, 0xb1, 0x39, 0xe3, 0x74, 0xdd, 0xb7, 0x68, 0xc0, 0x37, 0xa0, 0x42, 0x72, - 0xce, 0x54, 0x34, 0x04, 0x0d, 0x2c, 0xfb, 0xd3, 0x20, 0x9d, 0xc5, 0x52, 0x33, 0xce, 0x1a, 0x66, - 0xc6, 0xd9, 0xff, 0x71, 0x02, 0x0c, 0xe3, 0xc7, 0x63, 0x18, 0xc9, 0x5e, 0x62, 0x24, 0x8f, 0x79, - 0x70, 0x37, 0x4c, 0x39, 0x83, 0x82, 0x79, 0x0e, 0x52, 0xc1, 0x3c, 0x37, 0x73, 0xe3, 0x78, 0x72, - 0x2c, 0xcf, 0xf7, 0x2d, 0x78, 0x2a, 0x46, 0xee, 0xb7, 0x4b, 0x3e, 0x7c, 0x59, 0x7a, 0x19, 0x66, - 0x9d, 0xb8, 0x9a, 0x1c, 0x37, 0x46, 0x24, 0x85, 0x06, 0xa1, 0x89, 0x17, 0xfb, 0xa0, 0x17, 0x1e, - 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0xcf, 0x26, 0xe0, 0x52, 0xff, 0x97, 0xa9, 0x09, - 0x35, 0xdc, 0x25, 0xff, 0x2b, 0x30, 0x17, 0xc9, 0x0a, 0xc6, 0xf6, 0xa0, 0xa3, 0x3a, 0xb7, 0x0d, - 0x18, 0x26, 0x30, 0x59, 0xcd, 0x86, 0x98, 0xca, 0xf5, 0x86, 0xdf, 0x55, 0x11, 0x0c, 0xba, 0xe6, - 0x9a, 0x01, 0xc3, 0x04, 0xa6, 0xf6, 0x0d, 0x9d, 0x3c, 0x75, 0xdf, 0xd0, 0x3a, 0x5c, 0x50, 0xde, - 0x70, 0xd7, 0xfc, 0x60, 0xcd, 0xef, 0x74, 0xdb, 0x54, 0xc6, 0x30, 0x30, 0x61, 0x2f, 0xc9, 0x2a, - 0x17, 0x30, 0x0b, 0x09, 0xb3, 0xeb, 0xda, 0xdf, 0x2f, 0xc0, 0xb9, 0xb8, 0xd9, 0xd7, 0x7c, 0xaf, - 0xe9, 0x72, 0x9f, 0xc2, 0x57, 0x61, 0x32, 0x3a, 0xec, 0xaa, 0xc6, 0xfe, 0xab, 0x4a, 0x9c, 0xed, - 0xc3, 0x2e, 0xeb, 0xed, 0x8b, 0x19, 0x55, 0xb8, 0x65, 0x98, 0x57, 0x22, 0x9b, 0x7a, 0x76, 0x88, - 0x1e, 0x78, 0x29, 0x39, 0x9a, 0x1f, 0x1c, 0x95, 0x33, 0x82, 0x9a, 0x57, 0x34, 0xa5, 0xe4, 0x98, - 0x27, 0x77, 0x61, 0xbe, 0xed, 0x84, 0xd1, 0xed, 0x6e, 0xd3, 0x89, 0xe8, 0xb6, 0x2b, 0x3d, 0x34, - 0x46, 0x0b, 0x0c, 0xd0, 0x57, 0xd9, 0x9b, 0x09, 0x4a, 0x98, 0xa2, 0x4c, 0x0e, 0x80, 0xb0, 0x92, - 0xed, 0xc0, 0xf1, 0x42, 0xf1, 0x55, 0x8c, 0xdf, 0xe8, 0x81, 0x08, 0xfa, 0x64, 0xb8, 0xd9, 0x47, - 0x0d, 0x33, 0x38, 0x90, 0xe7, 0x60, 0x2a, 0xa0, 0x4e, 0x28, 0x3b, 0xb3, 0x14, 0xcf, 0x7f, 0xe4, - 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x7a, 0xc8, 0x84, 0xfa, 0x13, 0x0b, 0xe6, 0xe3, 0x6e, 0x7a, - 0x0c, 0x3b, 0x6b, 0x27, 0xb9, 0xb3, 0x5e, 0xcf, 0x6b, 0x49, 0x1c, 0xb0, 0x99, 0xfe, 0xfe, 0x94, - 0xf9, 0x7d, 0xdc, 0x31, 0xfc, 0x8b, 0x50, 0x52, 0xb3, 0x5a, 0xa9, 0xac, 0x63, 0x1e, 0xb0, 0x13, - 0xca, 0x8c, 0x11, 0xd0, 0x24, 0x99, 0x60, 0xcc, 0x8f, 0x6d, 0xe5, 0x4d, 0xb9, 0x4d, 0xcb, 0x61, - 0xaf, 0xb7, 0x72, 0xb5, 0x7d, 0x67, 0x6d, 0xe5, 0xaa, 0x0e, 0xb9, 0x0d, 0x17, 0xbb, 0x81, 0xcf, - 0xc3, 0x6a, 0xd7, 0xa9, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x56, 0x0c, 0xe1, 0x49, 0xf1, 0xd4, 0xf1, - 0x51, 0xf9, 0x62, 0x2d, 0x1b, 0x05, 0x07, 0xd5, 0x4d, 0x06, 0x66, 0x4d, 0x0e, 0x11, 0x98, 0xf5, - 0x77, 0xb4, 0xad, 0x90, 0x86, 0x32, 0x3c, 0xea, 0x73, 0x79, 0x75, 0x65, 0xc6, 0xb2, 0x1e, 0x0f, - 0xa9, 0x8a, 0x64, 0x8a, 0x9a, 0xfd, 0x60, 0x83, 0xd4, 0xd4, 0x23, 0x1a, 0xa4, 0x62, 0xff, 0xfa, - 0xe9, 0x1f, 0xa7, 0x7f, 0xfd, 0xcc, 0x07, 0xca, 0xbf, 0xfe, 0xfd, 0x22, 0x2c, 0xa6, 0x35, 0x90, - 0xd3, 0x0f, 0x3a, 0xfb, 0x7b, 0x16, 0x2c, 0xaa, 0xd9, 0x23, 0x78, 0x52, 0x75, 0xd5, 0xb0, 0x99, - 0xd3, 0xa4, 0x15, 0xba, 0x94, 0x8e, 0xc6, 0xdf, 0x4e, 0x71, 0xc3, 0x3e, 0xfe, 0xe4, 0x6d, 0x98, - 0xd5, 0x16, 0xf9, 0x47, 0x8a, 0x40, 0x5b, 0xe0, 0x5a, 0x54, 0x4c, 0x02, 0x4d, 0x7a, 0xe4, 0x7d, - 0x0b, 0xa0, 0xa1, 0xb6, 0x39, 0x35, 0xbb, 0x6e, 0xe5, 0x35, 0xbb, 0xf4, 0x06, 0x1a, 0x2b, 0xcb, - 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x25, 0x6e, 0x8b, 0xd7, 0xda, 0x9d, 0x88, 0xf2, 0x1f, 0xdb, - 0x77, 0xf8, 0x04, 0xc5, 0x34, 0x56, 0xa5, 0x0c, 0x50, 0x88, 0x09, 0x21, 0xec, 0x57, 0x41, 0x7b, - 0x7b, 0xb2, 0x65, 0x8b, 0xfb, 0x7b, 0xd6, 0x9c, 0x68, 0x4f, 0x0e, 0x41, 0xbd, 0x6c, 0x5d, 0x53, - 0x00, 0x8c, 0x71, 0xec, 0x2f, 0xc0, 0xfc, 0xeb, 0x81, 0xd3, 0xdd, 0x73, 0xb9, 0xcd, 0x9b, 0x9d, - 0xad, 0x3e, 0x02, 0xd3, 0x4e, 0xb3, 0x99, 0x95, 0x38, 0xa2, 0x22, 0x8a, 0x51, 0xc1, 0x87, 0x3a, - 0x46, 0xd9, 0xbf, 0x67, 0x01, 0x89, 0xef, 0x0d, 0x5d, 0xaf, 0xb5, 0xe5, 0x44, 0x8d, 0x3d, 0x76, - 0x3e, 0xda, 0xe3, 0xa5, 0x59, 0xe7, 0xa3, 0xeb, 0x1a, 0x82, 0x06, 0x16, 0x79, 0x17, 0x66, 0xc5, - 0xbf, 0xb7, 0xb4, 0x85, 0x60, 0xec, 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x99, 0xc4, 0x28, 0xbc, 0x1e, - 0x73, 0x40, 0x93, 0x1d, 0x6b, 0xaa, 0x0d, 0x6f, 0xb7, 0xdd, 0xbb, 0xdf, 0xdc, 0x89, 0x9b, 0xaa, - 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, 0x9b, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0x6b, 0xaa, 0x7f, - 0x6b, 0xc1, 0xf9, 0x8d, 0x30, 0x72, 0xfd, 0x75, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0x8b, 0x4f, 0xaf, - 0x3d, 0x8c, 0xe3, 0xf6, 0x3a, 0x2c, 0xca, 0x3b, 0xcc, 0xde, 0x4e, 0x48, 0x23, 0x43, 0x8f, 0xd7, - 0xf3, 0x78, 0x2d, 0x05, 0xc7, 0xbe, 0x1a, 0x8c, 0x8a, 0xbc, 0xcc, 0x8c, 0xa9, 0x14, 0x92, 0x54, - 0xea, 0x29, 0x38, 0xf6, 0xd5, 0xb0, 0xbf, 0x57, 0x80, 0x73, 0xfc, 0x33, 0x52, 0x41, 0x17, 0xdf, - 0x18, 0x14, 0x74, 0x31, 0xe6, 0x54, 0xe6, 0xbc, 0x1e, 0x21, 0xe4, 0xe2, 0xef, 0x5a, 0xb0, 0xd0, - 0x4c, 0xb6, 0x74, 0x3e, 0x36, 0x9d, 0xac, 0x3e, 0x14, 0x2e, 0x5b, 0xa9, 0x42, 0x4c, 0xf3, 0x27, - 0xbf, 0x6c, 0xc1, 0x42, 0x52, 0x4c, 0xb5, 0xba, 0x9f, 0x42, 0x23, 0x69, 0x1f, 0xeb, 0x64, 0x79, - 0x88, 0x69, 0x11, 0xec, 0x3f, 0x98, 0x90, 0x5d, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, 0x94, 0xa2, - 0x76, 0x28, 0x0a, 0xe5, 0xd7, 0x8e, 0x79, 0x22, 0xdc, 0xde, 0xac, 0x0b, 0xf7, 0x81, 0x58, 0x69, - 0x93, 0x25, 0x4c, 0xf9, 0x54, 0xbc, 0x38, 0xe3, 0x46, 0x57, 0x32, 0xce, 0xe5, 0x28, 0xba, 0xbd, - 0x56, 0x4b, 0x33, 0x96, 0x25, 0x8c, 0xb1, 0xe2, 0x65, 0xff, 0x86, 0x05, 0xa5, 0x1b, 0xbe, 0x5a, - 0x47, 0x7e, 0x3a, 0x07, 0x43, 0x8f, 0xd6, 0x07, 0xf5, 0x35, 0x65, 0x7c, 0xc4, 0x78, 0x2d, 0x61, - 0xe6, 0x79, 0xda, 0xa0, 0xbd, 0xc2, 0xf3, 0x67, 0x31, 0x52, 0x37, 0xfc, 0x9d, 0x81, 0xa6, 0xc7, - 0x5f, 0x29, 0xc2, 0x99, 0x37, 0x9c, 0x43, 0xea, 0x45, 0xce, 0xe8, 0x9b, 0xc4, 0xcb, 0x30, 0xeb, - 0x74, 0xf9, 0x3d, 0x98, 0xa1, 0xe3, 0xc7, 0x96, 0x93, 0x18, 0x84, 0x26, 0x5e, 0xbc, 0xa0, 0x89, - 0xec, 0x3a, 0x59, 0x4b, 0xd1, 0x5a, 0x0a, 0x8e, 0x7d, 0x35, 0xc8, 0x0d, 0x20, 0x32, 0x1a, 0xb5, - 0xd2, 0x68, 0xf8, 0x3d, 0x4f, 0x2c, 0x69, 0xc2, 0xa8, 0xa2, 0x0f, 0x9b, 0x5b, 0x7d, 0x18, 0x98, - 0x51, 0x8b, 0x7c, 0x1e, 0x96, 0x1a, 0x9c, 0xb2, 0x3c, 0x7a, 0x98, 0x14, 0xc5, 0xf1, 0x53, 0xc7, - 0x09, 0xac, 0x0d, 0xc0, 0xc3, 0x81, 0x14, 0x98, 0xa4, 0x61, 0xe4, 0x07, 0x4e, 0x8b, 0x9a, 0x74, - 0xa7, 0x92, 0x92, 0xd6, 0xfb, 0x30, 0x30, 0xa3, 0x16, 0xf9, 0x12, 0x94, 0xa2, 0xbd, 0x80, 0x86, - 0x7b, 0x7e, 0xbb, 0x29, 0xfd, 0x16, 0xc6, 0xb4, 0xb4, 0xc9, 0xde, 0xdf, 0x56, 0x54, 0x8d, 0xe1, - 0xad, 0x8a, 0x30, 0xe6, 0x49, 0x02, 0x98, 0x0a, 0x1b, 0x7e, 0x97, 0x86, 0x52, 0x65, 0xbf, 0x91, - 0x0b, 0x77, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x03, 0x4a, 0x4e, 0xf6, 0xef, 0x4e, 0xc0, 0x9c, - 0x89, 0x38, 0xc4, 0xda, 0xf4, 0x15, 0x0b, 0xe6, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x5b, 0xd8, 0xaf, - 0xf2, 0xd1, 0x28, 0x18, 0xa9, 0x75, 0x1a, 0x39, 0x6e, 0xdb, 0x30, 0x85, 0x19, 0x6c, 0x30, 0xc1, - 0x94, 0x7c, 0xdd, 0x82, 0x85, 0xd8, 0xcd, 0x2d, 0x36, 0xa4, 0xe5, 0x2a, 0x88, 0x5e, 0xea, 0xaf, - 0x26, 0x39, 0x61, 0x9a, 0xb5, 0xbd, 0x03, 0x8b, 0xe9, 0xde, 0x66, 0x4d, 0xd9, 0x75, 0xe4, 0x5c, - 0x2f, 0xc4, 0x4d, 0x59, 0x73, 0xc2, 0x10, 0x39, 0x84, 0x3c, 0x0f, 0x33, 0x1d, 0x27, 0x68, 0xb9, - 0x9e, 0xd3, 0xe6, 0xad, 0x58, 0x30, 0x16, 0x24, 0x59, 0x8e, 0x1a, 0xc3, 0xfe, 0x38, 0xcc, 0x6d, - 0x39, 0x5e, 0x8b, 0x36, 0xe5, 0x3a, 0xfc, 0xf0, 0x98, 0xb6, 0x1f, 0x4e, 0xc2, 0xac, 0x71, 0x36, - 0x3b, 0xfd, 0x73, 0x56, 0x22, 0xa5, 0x46, 0x21, 0xc7, 0x94, 0x1a, 0x9f, 0x05, 0xd8, 0x75, 0x3d, - 0x37, 0xdc, 0x7b, 0xc4, 0x64, 0x1d, 0xfc, 0x5e, 0xf7, 0x9a, 0xa6, 0x80, 0x06, 0xb5, 0xf8, 0xf2, - 0xac, 0x78, 0x42, 0xe6, 0xa9, 0xf7, 0x2d, 0x63, 0xbb, 0x99, 0xca, 0xc3, 0x59, 0xc0, 0xe8, 0x98, - 0x15, 0xb5, 0xfd, 0x88, 0x5c, 0x43, 0x27, 0xed, 0x4a, 0xdb, 0x30, 0x13, 0xd0, 0xb0, 0xd7, 0x61, - 0x27, 0xc6, 0xe9, 0x91, 0x9b, 0x81, 0xbb, 0x6d, 0xa0, 0xac, 0x8f, 0x9a, 0xd2, 0xf2, 0xab, 0x70, - 0x26, 0x21, 0xc2, 0x48, 0xd9, 0x87, 0x7c, 0xc8, 0x34, 0x00, 0x3c, 0xca, 0x65, 0x0e, 0xeb, 0x8b, - 0xb6, 0x91, 0xad, 0x43, 0xf7, 0x85, 0x70, 0xce, 0x11, 0x30, 0xfb, 0xcf, 0xa6, 0x40, 0xde, 0x7f, - 0x0f, 0xb1, 0x5c, 0x99, 0xb7, 0x5e, 0x13, 0x8f, 0x70, 0xeb, 0x75, 0x03, 0xe6, 0x5c, 0xcf, 0x8d, - 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xde, 0xcb, 0x73, 0x1b, 0x06, 0x2c, 0x83, 0x4e, - 0xa2, 0x2e, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x01, 0x3c, 0xfa, 0x25, 0x3d, 0xf7, 0xcf, 0x10, - 0x21, 0x4d, 0x82, 0x12, 0x3f, 0x7c, 0x88, 0x74, 0x25, 0xfa, 0xf8, 0x2d, 0xc7, 0x71, 0x7c, 0xf8, - 0x48, 0xc1, 0xb1, 0xaf, 0x06, 0xa3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, 0x2a, 0x53, 0x49, - 0x2a, 0xd7, 0x52, 0x70, 0xec, 0xab, 0x41, 0x76, 0x61, 0x4e, 0x96, 0x09, 0x97, 0xab, 0xe9, 0x47, - 0xfc, 0x4a, 0xee, 0x5a, 0x77, 0xcd, 0xa0, 0x84, 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, - 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x4f, 0xf4, 0x28, 0xcc, 0x2e, 0x1c, 0x1f, 0x95, - 0xcf, 0x6e, 0xa4, 0xc9, 0x61, 0x3f, 0x07, 0xf2, 0x65, 0x0b, 0x2e, 0x34, 0x7c, 0x2f, 0xe4, 0xf1, - 0xff, 0x07, 0xf4, 0x6a, 0x10, 0xf8, 0x81, 0xe0, 0x5d, 0x7a, 0x44, 0xde, 0xdc, 0xa6, 0xb8, 0x96, - 0x45, 0x12, 0xb3, 0x39, 0x91, 0x77, 0x60, 0xa6, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, 0x7d, - 0x6f, 0x33, 0x8f, 0x7c, 0x24, 0x35, 0x49, 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, - 0x99, 0x85, 0xf9, 0x24, 0x3a, 0xf9, 0x39, 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x47, 0x75, 0x5c, - 0xc8, 0xcd, 0x71, 0xd3, 0x5e, 0x28, 0x7a, 0xca, 0xe5, 0x85, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, - 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x1b, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x0f, - 0x68, 0x90, 0x45, 0xa8, 0x18, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, 0x5c, 0xdf, 0xa1, - 0xf2, 0x34, 0x53, 0x9d, 0x3e, 0x3e, 0x2a, 0x17, 0xee, 0xd0, 0x1d, 0x64, 0xc4, 0xd9, 0x77, 0x35, - 0xc5, 0xdd, 0xbd, 0x5c, 0x2a, 0xc6, 0xfc, 0xae, 0x84, 0x23, 0x80, 0xf8, 0x2e, 0x59, 0x84, 0x8a, - 0x11, 0x79, 0x07, 0x4a, 0xf7, 0x9c, 0x03, 0xba, 0x1b, 0xf8, 0x5e, 0x24, 0xfd, 0xac, 0xc6, 0x0c, - 0x15, 0xb8, 0xa3, 0xc8, 0x49, 0xbe, 0x7c, 0x7b, 0xd7, 0x85, 0x18, 0xb3, 0x23, 0x07, 0x30, 0xe3, - 0xd1, 0x7b, 0x48, 0xdb, 0x6e, 0x23, 0x1f, 0xd7, 0xfc, 0x9b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, - 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0xbb, 0xfe, 0x8e, 0x5c, 0xa8, 0xc6, 0xec, 0x4b, 0x7d, 0x32, - 0x15, 0x7d, 0x79, 0xc3, 0xdf, 0x41, 0x46, 0x9c, 0xcd, 0x91, 0x86, 0x76, 0xf2, 0x91, 0xcb, 0xd4, - 0xcd, 0x7c, 0x9d, 0x9b, 0xc4, 0x1c, 0x89, 0x4b, 0xd1, 0xe0, 0xc8, 0xda, 0xb6, 0x25, 0x8d, 0x95, - 0x72, 0xa1, 0x1a, 0xb3, 0x6d, 0x93, 0xa6, 0x4f, 0xd1, 0xb6, 0xaa, 0x0c, 0x35, 0x2f, 0xc6, 0xd7, - 0x95, 0x96, 0xbf, 0x7c, 0x96, 0xaa, 0xa4, 0x1d, 0x51, 0xf0, 0x55, 0x65, 0xa8, 0x79, 0xb1, 0xf6, - 0x0e, 0xf7, 0x0f, 0xef, 0x39, 0xed, 0x7d, 0xd7, 0x6b, 0xc9, 0x38, 0xc7, 0x71, 0xb3, 0xdb, 0xee, - 0x1f, 0xde, 0x11, 0xf4, 0xcc, 0xf6, 0x8e, 0x4b, 0xd1, 0xe0, 0x48, 0xfe, 0xb1, 0x05, 0x53, 0xdd, - 0x76, 0xaf, 0xe5, 0x7a, 0x4b, 0x73, 0x5c, 0x4f, 0xfc, 0x4c, 0x9e, 0x2b, 0xf4, 0x4a, 0x8d, 0x93, - 0x16, 0x8a, 0xe2, 0x4f, 0x6a, 0x9f, 0x3d, 0x5e, 0xf8, 0x0b, 0x7f, 0x5a, 0x5e, 0xa2, 0x5e, 0xc3, - 0x6f, 0xba, 0x5e, 0x6b, 0xf5, 0x6e, 0xe8, 0x7b, 0x2b, 0xe8, 0xdc, 0x53, 0x3a, 0xba, 0x94, 0x69, - 0xf9, 0x93, 0x30, 0x6b, 0x90, 0x78, 0x98, 0xa2, 0x37, 0x67, 0x2a, 0x7a, 0xbf, 0x31, 0x05, 0x73, - 0x66, 0x46, 0xbd, 0x21, 0xb4, 0x2f, 0x7d, 0xe2, 0x98, 0x18, 0xe5, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, - 0xed, 0x91, 0x32, 0x6f, 0x6d, 0xe4, 0xa6, 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, - 0x11, 0x1c, 0x4a, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x2f, 0x00, - 0xc4, 0x99, 0xe5, 0xe4, 0xad, 0xa2, 0xd6, 0x87, 0x8d, 0x8c, 0x77, 0x06, 0x16, 0x79, 0x0e, 0xa6, - 0x98, 0xea, 0x43, 0x9b, 0x32, 0x0c, 0x5b, 0x9f, 0xe3, 0xaf, 0xf1, 0x52, 0x94, 0x50, 0xf2, 0x0a, - 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0x57, 0x9f, 0x8f, 0xb5, 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, - 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, 0xd1, 0xb9, 0xd2, 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, - 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, 0x4a, 0xc1, 0xb1, 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x21, - 0x3a, 0x2b, 0x9c, 0x6d, 0x07, 0x5c, 0x65, 0x7e, 0xd5, 0x3c, 0x6b, 0xe5, 0x38, 0x87, 0xc4, 0xa8, - 0x1d, 0xfe, 0xb0, 0x35, 0xde, 0xb1, 0xe8, 0x0b, 0x30, 0x9f, 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, - 0xda, 0x24, 0x9c, 0xbb, 0xd9, 0x72, 0xbd, 0x74, 0xb6, 0xa8, 0xac, 0x64, 0xe1, 0xd6, 0xc8, 0xc9, - 0xc2, 0x75, 0x3c, 0x97, 0x4c, 0xc5, 0x9d, 0x1d, 0xcf, 0xa5, 0xf2, 0xa2, 0x27, 0x71, 0xc9, 0x9f, - 0x58, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x46, 0x87, - 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xab, 0xe8, 0xf1, 0x9f, 0x90, 0x5f, 0xf0, - 0xf4, 0x49, 0xa8, 0x78, 0xa2, 0xf8, 0xe4, 0x6f, 0xc0, 0x42, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, - 0x2e, 0x2c, 0xea, 0x49, 0x10, 0xa6, 0x71, 0x97, 0xdf, 0x84, 0x0f, 0x3f, 0x54, 0xce, 0x91, 0x06, - 0xdb, 0x57, 0x2c, 0x28, 0x09, 0xbb, 0x36, 0xd2, 0xdd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, 0xa9, - 0x6d, 0x64, 0x38, 0x61, 0xb2, 0xb5, 0x7c, 0xdf, 0xf5, 0x9a, 0xb2, 0x97, 0xf5, 0x5a, 0xfe, 0x86, - 0xeb, 0x35, 0x91, 0x43, 0xf4, 0x6a, 0x5f, 0x18, 0x68, 0x6f, 0xfa, 0x55, 0x0b, 0xe6, 0x79, 0x0c, - 0x6c, 0x7c, 0x26, 0x7c, 0x59, 0x3b, 0x1b, 0x09, 0x31, 0x2e, 0x25, 0x9d, 0x8d, 0x1e, 0x1c, 0x95, - 0x67, 0x45, 0xd4, 0x6c, 0xd2, 0xf7, 0xe8, 0x73, 0xd2, 0x90, 0xc4, 0x5d, 0xa2, 0x26, 0x46, 0xb6, - 0x73, 0x68, 0x43, 0x6b, 0x5d, 0x11, 0xc1, 0x98, 0x9e, 0xfd, 0x2e, 0xcc, 0x99, 0xc1, 0x2c, 0xe4, - 0x65, 0x98, 0xed, 0xba, 0x5e, 0x2b, 0x19, 0xf4, 0xa8, 0x8d, 0xed, 0xb5, 0x18, 0x84, 0x26, 0x1e, - 0xaf, 0xe6, 0xc7, 0xd5, 0x52, 0x36, 0xfa, 0x9a, 0x6f, 0x56, 0x8b, 0xff, 0xf0, 0x1c, 0xdb, 0x19, - 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xe0, 0xf1, 0xe3, 0xcb, 0xb1, 0x9d, 0x25, 0xcc, 0xff, 0x5b, - 0x39, 0xb6, 0x7f, 0x0a, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0x6e, 0x71, - 0x19, 0x99, 0x2e, 0xa1, 0xf6, 0x7b, 0x6c, 0xda, 0xe8, 0x43, 0x6d, 0xa5, 0x17, 0xed, 0x11, 0x0f, - 0x8a, 0xa1, 0xdb, 0x3a, 0x78, 0x29, 0x27, 0x9b, 0x36, 0x23, 0x25, 0x1f, 0x66, 0x88, 0x03, 0x62, - 0x59, 0x21, 0x0a, 0x36, 0xf6, 0x3f, 0x98, 0x80, 0xc5, 0xf4, 0xc9, 0x3b, 0x6f, 0xa7, 0x06, 0xf2, - 0x75, 0x0b, 0xe6, 0x9d, 0x5e, 0xb4, 0x47, 0xbd, 0x48, 0x5d, 0x6c, 0xe5, 0xf2, 0x66, 0x48, 0xb2, - 0xed, 0x8c, 0x14, 0x56, 0x09, 0x5e, 0x98, 0xe2, 0x4d, 0xfe, 0x0a, 0x4c, 0x47, 0x6e, 0x87, 0xfa, - 0x3d, 0x61, 0x8f, 0x2b, 0x88, 0x73, 0xf1, 0xb6, 0x28, 0x42, 0x05, 0xb3, 0x3f, 0x0e, 0x23, 0x26, - 0x92, 0xb4, 0xaf, 0x02, 0x41, 0xbf, 0xdd, 0xde, 0x71, 0x1a, 0xfb, 0x77, 0x5c, 0xaf, 0xe9, 0xdf, - 0xe3, 0xab, 0xcc, 0x2a, 0x94, 0x02, 0x19, 0x4d, 0x18, 0xca, 0x01, 0xa1, 0x97, 0x29, 0x15, 0x66, - 0x18, 0x62, 0x8c, 0x63, 0xff, 0xc1, 0x04, 0x4c, 0xcb, 0xd0, 0xd7, 0xc7, 0xe0, 0xd5, 0xbe, 0x9f, - 0xb8, 0xee, 0xdc, 0xc8, 0x25, 0x62, 0x77, 0xa0, 0x4b, 0x7b, 0x98, 0x72, 0x69, 0x7f, 0x23, 0x1f, - 0x76, 0x27, 0xfb, 0xb3, 0xff, 0x7e, 0x11, 0x16, 0x52, 0xa1, 0xc4, 0x4c, 0xd5, 0xec, 0x73, 0xe3, - 0xbc, 0x9d, 0x6b, 0xb4, 0xb2, 0x0e, 0xd3, 0x38, 0xd9, 0xa3, 0x33, 0x4c, 0xa4, 0xfd, 0xbd, 0x95, - 0xdb, 0x8b, 0x06, 0x7f, 0x99, 0x01, 0x78, 0x44, 0x0f, 0x45, 0xf2, 0x6d, 0x0b, 0xce, 0x39, 0xfd, - 0x4f, 0x42, 0x48, 0x93, 0xd8, 0xad, 0xdc, 0xdf, 0x9a, 0xa8, 0x3e, 0x25, 0x85, 0xcc, 0x7a, 0x79, - 0x03, 0xb3, 0x44, 0xb1, 0xff, 0x8b, 0x05, 0x4f, 0x0e, 0x0c, 0x8a, 0xe7, 0x39, 0x95, 0x82, 0x24, - 0x54, 0xae, 0x19, 0x39, 0xa7, 0xfe, 0xd0, 0xd7, 0xa3, 0xe9, 0x34, 0x38, 0x69, 0xf6, 0xe4, 0x25, - 0x98, 0xe3, 0xea, 0x17, 0x5b, 0x3d, 0x23, 0xda, 0x95, 0xb7, 0x3b, 0xdc, 0xce, 0x5f, 0x37, 0xca, - 0x31, 0x81, 0x65, 0x7f, 0xdb, 0x82, 0xa5, 0x41, 0x19, 0x76, 0x86, 0xb0, 0x3d, 0xfc, 0xf5, 0x54, - 0x64, 0x40, 0xb9, 0x2f, 0x32, 0x20, 0x65, 0x7d, 0x50, 0x41, 0x00, 0xc6, 0xc1, 0xbf, 0xf0, 0x10, - 0xc7, 0xf7, 0x6f, 0x58, 0x70, 0x71, 0xc0, 0x84, 0xef, 0x8b, 0x10, 0xb1, 0x1e, 0x39, 0x42, 0x64, - 0x62, 0xd8, 0x08, 0x11, 0xfb, 0x0f, 0x0b, 0xb0, 0x28, 0xe5, 0x89, 0x75, 0xf0, 0x57, 0x12, 0xf1, - 0x15, 0x3f, 0x91, 0x8a, 0xaf, 0x38, 0x9f, 0xc6, 0xff, 0xcb, 0xe0, 0x8a, 0x0f, 0x56, 0x70, 0xc5, - 0x9f, 0x4f, 0xc0, 0x85, 0xcc, 0xc4, 0x3f, 0xe4, 0x6b, 0x19, 0xbb, 0xd7, 0x9d, 0x9c, 0x33, 0x0c, - 0x0d, 0xb9, 0x7f, 0x8d, 0x1b, 0x91, 0xf0, 0xcb, 0x66, 0x24, 0x80, 0xd8, 0x8d, 0x76, 0x4f, 0x21, - 0x57, 0xd2, 0x88, 0x41, 0x01, 0xf6, 0x2f, 0x14, 0xe0, 0xca, 0xb0, 0x84, 0x3e, 0xa0, 0x41, 0x63, - 0x61, 0x22, 0x68, 0xec, 0x31, 0x69, 0x16, 0xa7, 0x12, 0x3f, 0xf6, 0x4f, 0x27, 0xf5, 0xb6, 0xd7, - 0x3f, 0x3e, 0x87, 0x72, 0x05, 0x98, 0x66, 0xda, 0xa7, 0x4a, 0x1e, 0x1c, 0x2f, 0x85, 0xd3, 0x75, - 0x51, 0xfc, 0xe0, 0xa8, 0x7c, 0x36, 0x4e, 0x3f, 0x21, 0x0b, 0x51, 0x55, 0x22, 0x57, 0x60, 0x26, - 0x10, 0x50, 0x15, 0x26, 0x23, 0xfd, 0x29, 0x44, 0x19, 0x6a, 0x28, 0xf9, 0x92, 0xa1, 0xae, 0x4f, - 0x9e, 0x56, 0x96, 0x95, 0x93, 0xdc, 0x44, 0xde, 0x86, 0x99, 0x50, 0x25, 0xf6, 0x15, 0x8a, 0xcb, - 0x8b, 0x43, 0x46, 0x5f, 0xb1, 0xe3, 0xb5, 0xca, 0xf2, 0x2b, 0xbe, 0x4f, 0xe7, 0x00, 0xd6, 0x24, - 0x89, 0xad, 0x4f, 0xb6, 0xc2, 0x8c, 0x0d, 0xfd, 0xa7, 0x5a, 0x12, 0xc1, 0xb4, 0x7c, 0xf8, 0x50, - 0xde, 0xaf, 0x6d, 0xe5, 0x14, 0x69, 0x21, 0xfd, 0x70, 0xf9, 0x69, 0x4d, 0x59, 0x58, 0x14, 0x2b, - 0xfb, 0xfb, 0x16, 0xcc, 0xca, 0x31, 0xf2, 0x18, 0xc2, 0xd0, 0xee, 0x26, 0xc3, 0xd0, 0xae, 0xe6, - 0xb2, 0x62, 0x0d, 0x88, 0x41, 0xbb, 0x0b, 0x73, 0x66, 0xc6, 0x39, 0xf2, 0x59, 0x63, 0xc5, 0xb5, - 0xc6, 0xc9, 0xe1, 0xa4, 0xd6, 0xe4, 0x78, 0x35, 0xb6, 0x7f, 0xb3, 0xa4, 0x5b, 0x91, 0x9f, 0x5d, - 0xcd, 0x91, 0x6f, 0x9d, 0x38, 0xf2, 0xcd, 0x81, 0x37, 0x91, 0xff, 0xc0, 0xbb, 0x05, 0x33, 0x6a, - 0x59, 0x94, 0xca, 0xc3, 0xb3, 0xa6, 0x63, 0x2e, 0xd3, 0x40, 0x18, 0x31, 0x63, 0xba, 0xf0, 0x33, - 0xa8, 0xee, 0x43, 0xbd, 0x5c, 0x6b, 0x32, 0xe4, 0x1d, 0x98, 0xbd, 0xe7, 0x07, 0xfb, 0x6d, 0xdf, - 0xe1, 0x69, 0xc5, 0x21, 0x8f, 0xbb, 0x60, 0x6d, 0x8a, 0x15, 0xd1, 0x11, 0x77, 0x62, 0xfa, 0x68, - 0x32, 0x23, 0x15, 0x58, 0xe8, 0xb8, 0x1e, 0x52, 0xa7, 0xa9, 0xa3, 0xcd, 0x26, 0x45, 0x26, 0x63, - 0xa5, 0x5a, 0x6f, 0x25, 0xc1, 0x98, 0xc6, 0xe7, 0x46, 0x95, 0x20, 0x61, 0x6d, 0x90, 0xe9, 0x4a, - 0x6b, 0xe3, 0x0f, 0xc6, 0xa4, 0x05, 0x43, 0x84, 0x07, 0x24, 0xcb, 0x31, 0xc5, 0x9b, 0x7c, 0x11, - 0x66, 0x42, 0x99, 0x4e, 0x2e, 0x1f, 0x27, 0x02, 0x7d, 0xb6, 0x17, 0x44, 0xe3, 0xae, 0x54, 0x25, - 0xa8, 0x19, 0x92, 0x4d, 0x38, 0xaf, 0xcc, 0x27, 0x89, 0xa7, 0x9f, 0xa6, 0xe2, 0xec, 0x43, 0x98, - 0x01, 0xc7, 0xcc, 0x5a, 0x4c, 0x95, 0xe3, 0x99, 0x1c, 0xc5, 0xdd, 0x9b, 0x71, 0x5d, 0xc5, 0xe7, - 0x5f, 0x13, 0x25, 0xf4, 0xa4, 0x60, 0xca, 0x99, 0x31, 0x82, 0x29, 0xeb, 0x70, 0x21, 0x0d, 0xe2, - 0x69, 0xa5, 0x78, 0x26, 0x2b, 0x63, 0x0b, 0xad, 0x65, 0x21, 0x61, 0x76, 0x5d, 0x72, 0x07, 0x4a, - 0x01, 0xe5, 0x87, 0xac, 0x8a, 0x72, 0x5b, 0x1a, 0xd9, 0x41, 0x13, 0x15, 0x01, 0x8c, 0x69, 0xb1, - 0x7e, 0x77, 0x92, 0xb9, 0x85, 0x6f, 0xe5, 0xf8, 0xe6, 0xa8, 0xec, 0xfb, 0x01, 0xe9, 0xde, 0xec, - 0x7f, 0xb7, 0x00, 0x67, 0x12, 0x36, 0x20, 0xf2, 0x2c, 0x14, 0x79, 0x9e, 0x2d, 0xbe, 0x5a, 0xcd, - 0xc4, 0x2b, 0xaa, 0x68, 0x1c, 0x01, 0x23, 0xbf, 0x68, 0xc1, 0x42, 0x37, 0x71, 0x5d, 0xa1, 0x16, - 0xf2, 0x71, 0x0d, 0x92, 0x09, 0xa2, 0x46, 0x56, 0xfe, 0x24, 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, - 0xf4, 0x72, 0x6e, 0xd3, 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, 0x58, 0x4b, 0x82, 0x31, 0x8d, 0xcf, - 0x7a, 0x98, 0x7f, 0xdd, 0x38, 0xaf, 0xda, 0x55, 0x14, 0x01, 0x8c, 0x69, 0x91, 0xd7, 0x60, 0x5e, - 0xa6, 0x94, 0xad, 0xf9, 0xcd, 0xeb, 0x4e, 0xb8, 0x27, 0x4f, 0x38, 0xfa, 0x44, 0xb6, 0x96, 0x80, - 0x62, 0x0a, 0x9b, 0x7f, 0x5b, 0x9c, 0xb7, 0x97, 0x13, 0x98, 0x4a, 0x3e, 0x5a, 0xb0, 0x96, 0x04, - 0x63, 0x1a, 0x9f, 0x3c, 0x6f, 0x6c, 0x43, 0xe2, 0x3e, 0x5c, 0xaf, 0x06, 0x19, 0x5b, 0x51, 0x05, - 0x16, 0x7a, 0xfc, 0x40, 0xd8, 0x54, 0x40, 0x39, 0x1f, 0x35, 0xc3, 0xdb, 0x49, 0x30, 0xa6, 0xf1, - 0xc9, 0xab, 0x70, 0x26, 0x60, 0x8b, 0xad, 0x26, 0x20, 0x2e, 0xc9, 0xf5, 0x1d, 0x28, 0x9a, 0x40, - 0x4c, 0xe2, 0x92, 0xd7, 0xe1, 0x6c, 0x9c, 0x81, 0x51, 0x11, 0x10, 0xb7, 0xe6, 0x3a, 0x1d, 0x58, - 0x25, 0x8d, 0x80, 0xfd, 0x75, 0xc8, 0xdf, 0x82, 0x45, 0xa3, 0x25, 0x36, 0xbc, 0x26, 0xbd, 0x2f, - 0xb3, 0xe4, 0xf1, 0xd7, 0x68, 0xd6, 0x52, 0x30, 0xec, 0xc3, 0x26, 0x9f, 0x82, 0xf9, 0x86, 0xdf, - 0x6e, 0xf3, 0x35, 0x4e, 0x24, 0xcc, 0x17, 0xe9, 0xf0, 0x44, 0xe2, 0xc0, 0x04, 0x04, 0x53, 0x98, - 0xe4, 0x06, 0x10, 0x7f, 0x87, 0xa9, 0x57, 0xb4, 0xf9, 0xba, 0x78, 0x36, 0x9d, 0x69, 0x1c, 0x67, - 0x92, 0x31, 0x16, 0x6f, 0xf6, 0x61, 0x60, 0x46, 0x2d, 0x9e, 0x4d, 0xcc, 0x88, 0x49, 0x9d, 0xcf, - 0xe3, 0x85, 0xb7, 0xb4, 0xf9, 0xe2, 0xa1, 0x01, 0xa9, 0x01, 0x4c, 0x89, 0x90, 0x97, 0x7c, 0xf2, - 0xe2, 0x99, 0xb9, 0xb3, 0xe3, 0x3d, 0x42, 0x94, 0xa2, 0xe4, 0x44, 0x7e, 0x0e, 0x4a, 0x3b, 0xea, - 0x21, 0x05, 0x9e, 0x0c, 0x6f, 0xec, 0x7d, 0x31, 0xf5, 0x26, 0x48, 0x7c, 0x3c, 0xd7, 0x00, 0x8c, - 0x59, 0x92, 0xe7, 0x60, 0xf6, 0x7a, 0xad, 0xa2, 0x47, 0xe1, 0x59, 0xde, 0xfb, 0x93, 0xac, 0x0a, - 0x9a, 0x00, 0x36, 0xc3, 0xb4, 0xfa, 0x46, 0x92, 0x6f, 0x93, 0x64, 0x68, 0x63, 0x0c, 0x9b, 0xdf, - 0x6c, 0x63, 0x7d, 0xe9, 0x5c, 0x0a, 0x5b, 0x96, 0xa3, 0xc6, 0x20, 0x6f, 0xc3, 0xac, 0xdc, 0x2f, - 0xf8, 0xda, 0x74, 0xfe, 0xd1, 0xe2, 0x9d, 0x31, 0x26, 0x81, 0x26, 0x3d, 0x7e, 0x1d, 0xcb, 0xf3, - 0xcb, 0xd3, 0x6b, 0xbd, 0x76, 0x7b, 0xe9, 0x02, 0x5f, 0x37, 0xe3, 0xeb, 0xd8, 0x18, 0x84, 0x26, - 0x1e, 0x79, 0x51, 0x79, 0x28, 0x7d, 0x28, 0x71, 0x3f, 0xad, 0x3d, 0x94, 0xb4, 0xd2, 0x3d, 0x20, - 0x24, 0xe2, 0xe2, 0x43, 0x5c, 0x83, 0x76, 0x60, 0x59, 0x69, 0x7c, 0xfd, 0x93, 0x64, 0x69, 0x29, - 0x61, 0x2a, 0x59, 0xbe, 0x33, 0x10, 0x13, 0x4f, 0xa0, 0x42, 0x76, 0xa0, 0xe0, 0xb4, 0x77, 0x96, - 0x9e, 0xcc, 0x43, 0x75, 0xad, 0x6c, 0x56, 0xe5, 0x88, 0xe2, 0x6e, 0x8c, 0x95, 0xcd, 0x2a, 0x32, - 0xe2, 0xc4, 0x85, 0x49, 0xa7, 0xbd, 0x13, 0x2e, 0x2d, 0xf3, 0x39, 0x9b, 0x1b, 0x93, 0xd8, 0x78, - 0xb0, 0x59, 0x0d, 0x91, 0xb3, 0xb0, 0xbf, 0x3c, 0xa1, 0x2f, 0x6a, 0x74, 0x6a, 0xe2, 0x77, 0xcd, - 0x09, 0x64, 0xe5, 0xf1, 0xf2, 0x77, 0xdf, 0xc3, 0x26, 0x62, 0xef, 0xcb, 0x9c, 0x3e, 0x5d, 0xbd, - 0x64, 0xe4, 0x92, 0xf4, 0x29, 0x99, 0x76, 0x59, 0x9c, 0x9e, 0x93, 0x0b, 0x86, 0xfd, 0xdb, 0xa0, - 0x8d, 0x7e, 0x29, 0xef, 0x9e, 0x00, 0x8a, 0x6e, 0x18, 0xb9, 0x7e, 0x8e, 0x61, 0xc0, 0xa9, 0x7c, - 0xc5, 0x3c, 0xca, 0x80, 0x03, 0x50, 0xb0, 0x62, 0x3c, 0xbd, 0x96, 0xeb, 0xdd, 0x97, 0x9f, 0x7f, - 0x2b, 0x77, 0xb7, 0x1d, 0xc1, 0x93, 0x03, 0x50, 0xb0, 0x22, 0x77, 0xc5, 0xa0, 0xce, 0xe7, 0x95, - 0xf7, 0xcd, 0x6a, 0x8a, 0x5f, 0x72, 0x70, 0xdf, 0x85, 0x42, 0xd8, 0x71, 0xa5, 0xba, 0x34, 0x26, - 0xaf, 0xfa, 0xd6, 0x46, 0x16, 0xaf, 0xfa, 0xd6, 0x06, 0x32, 0x26, 0xe4, 0xab, 0x16, 0x80, 0xd3, - 0xd9, 0x71, 0xc2, 0xd0, 0x69, 0x6a, 0xeb, 0xcc, 0x98, 0xef, 0x10, 0x54, 0x34, 0xbd, 0x14, 0x6b, - 0xee, 0xa8, 0x1a, 0x43, 0xd1, 0xe0, 0x4c, 0xde, 0x81, 0x69, 0x47, 0xbc, 0x78, 0x26, 0x7d, 0xae, - 0xf3, 0x79, 0xc6, 0x2f, 0x25, 0x01, 0x37, 0xd3, 0x48, 0x10, 0x2a, 0x86, 0x8c, 0x77, 0x14, 0x38, - 0x74, 0xd7, 0xdd, 0x97, 0xc6, 0xa1, 0xfa, 0xd8, 0x4f, 0x11, 0x30, 0x62, 0x59, 0xbc, 0x25, 0x08, - 0x15, 0x43, 0xf1, 0x02, 0xb5, 0xe3, 0x39, 0x3a, 0x92, 0x2e, 0x9f, 0x78, 0x4b, 0x33, 0x36, 0xcf, - 0x78, 0x81, 0xda, 0x64, 0x84, 0x49, 0xbe, 0xe4, 0x00, 0xa6, 0x1c, 0xfe, 0x16, 0xa3, 0x3c, 0x8a, - 0x61, 0x1e, 0xef, 0x3a, 0xa6, 0xda, 0x80, 0x2f, 0x2e, 0xf2, 0xc5, 0x47, 0xc9, 0x8d, 0xfc, 0x9a, - 0x05, 0xd3, 0xc2, 0x1d, 0x98, 0x29, 0xa4, 0xec, 0xdb, 0xbf, 0x70, 0x0a, 0x79, 0xcf, 0xa5, 0xab, - 0xb2, 0x74, 0xee, 0xf9, 0xa8, 0xf6, 0x75, 0x14, 0xa5, 0x27, 0x3a, 0x2b, 0x2b, 0xe9, 0x96, 0x3f, - 0x05, 0x73, 0x26, 0x95, 0x91, 0xdc, 0x95, 0x7f, 0x54, 0x00, 0xe0, 0x0d, 0x2d, 0x72, 0x67, 0x74, - 0x78, 0x92, 0xd6, 0x3d, 0xbf, 0x99, 0xcf, 0x23, 0x9a, 0x66, 0x0a, 0x0c, 0x90, 0x19, 0x59, 0xf7, - 0xfc, 0x26, 0x4a, 0x26, 0xa4, 0x05, 0x93, 0x5d, 0x27, 0xda, 0xcb, 0x3f, 0xdf, 0xc6, 0x8c, 0x08, - 0x22, 0x8d, 0xf6, 0x90, 0x33, 0x20, 0xef, 0x59, 0x30, 0x2d, 0x32, 0x6e, 0xa8, 0x8b, 0x93, 0xb1, - 0x1d, 0x18, 0x54, 0x9b, 0xad, 0x88, 0xb4, 0x1e, 0xb2, 0x07, 0xb5, 0x8e, 0x23, 0x4b, 0x51, 0xb1, - 0x5d, 0x7e, 0xdf, 0x82, 0x39, 0x13, 0x35, 0xa3, 0x9b, 0x7e, 0xc6, 0xec, 0xa6, 0x3c, 0xdb, 0xc3, - 0xec, 0xf1, 0xff, 0x6e, 0x81, 0xf1, 0x2a, 0x7a, 0xec, 0x95, 0x6d, 0x0d, 0xed, 0x95, 0x3d, 0x31, - 0xa2, 0x57, 0x76, 0x61, 0x24, 0xaf, 0xec, 0xc9, 0xd1, 0xbd, 0xb2, 0x8b, 0x83, 0xbd, 0xb2, 0xed, - 0x6f, 0x5a, 0x70, 0xb6, 0x6f, 0xb7, 0x61, 0x7a, 0x70, 0xe0, 0xfb, 0xd1, 0x00, 0x6f, 0x46, 0x8c, - 0x41, 0x68, 0xe2, 0x91, 0x75, 0x58, 0x94, 0x4f, 0x12, 0xd4, 0xbb, 0x6d, 0x37, 0x33, 0x17, 0xca, - 0x76, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb6, 0x60, 0xd6, 0x88, 0xa0, 0x66, 0xdf, 0xc1, 0x23, - 0xcd, 0xa5, 0x18, 0xb1, 0xf3, 0x19, 0xbf, 0xa8, 0x12, 0x30, 0x71, 0x67, 0xda, 0x32, 0x12, 0x56, - 0xc7, 0x77, 0xa6, 0xac, 0x14, 0x25, 0x54, 0xa4, 0x22, 0xa6, 0x5d, 0xde, 0xe8, 0x05, 0x33, 0x15, - 0x31, 0xed, 0x22, 0x87, 0x70, 0x76, 0xec, 0x40, 0x20, 0x1d, 0xf6, 0x8d, 0xc7, 0x1f, 0x9c, 0x20, - 0x42, 0x01, 0x23, 0x97, 0xa0, 0x40, 0xbd, 0xa6, 0xb4, 0x5e, 0xe8, 0xe7, 0x19, 0xaf, 0x7a, 0x4d, - 0x64, 0xe5, 0xf6, 0x9b, 0x30, 0x57, 0xa7, 0x8d, 0x80, 0x46, 0x6f, 0xd0, 0xc3, 0xa1, 0xdf, 0x7b, - 0x64, 0xa3, 0x3d, 0xf5, 0xde, 0x23, 0xab, 0xce, 0xca, 0xed, 0x7f, 0x6e, 0x41, 0xea, 0x85, 0x12, - 0xe3, 0xfe, 0xc4, 0x1a, 0x78, 0x7f, 0x62, 0xda, 0xdc, 0x27, 0x4e, 0xb4, 0xb9, 0xdf, 0x00, 0xd2, - 0x61, 0x53, 0x21, 0xf1, 0x1e, 0x8f, 0x34, 0x1c, 0xc5, 0xf9, 0x1a, 0xfa, 0x30, 0x30, 0xa3, 0x96, - 0xfd, 0xcf, 0x84, 0xb0, 0xe6, 0x9b, 0x25, 0x0f, 0x6f, 0x80, 0x1e, 0x14, 0x39, 0x29, 0x69, 0x3d, - 0x1b, 0xd3, 0xf2, 0xdc, 0x9f, 0xf7, 0x28, 0xee, 0x48, 0x39, 0xe5, 0x39, 0x37, 0xfb, 0x0f, 0x85, - 0xac, 0xc6, 0xa3, 0x26, 0x43, 0xc8, 0xda, 0x49, 0xca, 0x7a, 0x3d, 0xaf, 0xb5, 0x32, 0x5b, 0x46, - 0xb2, 0x02, 0xd0, 0xa5, 0x41, 0x83, 0x7a, 0x91, 0x8a, 0x23, 0x29, 0xca, 0x88, 0x46, 0x5d, 0x8a, - 0x06, 0x86, 0xfd, 0x0d, 0x36, 0x81, 0x62, 0x77, 0x4d, 0x72, 0x25, 0xed, 0x83, 0x99, 0x9e, 0x1c, - 0xda, 0x05, 0xd3, 0x88, 0x2e, 0x98, 0x78, 0x48, 0x74, 0xc1, 0x47, 0x60, 0x3a, 0xf0, 0xdb, 0xb4, - 0x12, 0x78, 0x69, 0x07, 0x17, 0x64, 0xc5, 0x78, 0x13, 0x15, 0xdc, 0xfe, 0x15, 0x0b, 0x16, 0xd3, - 0xe1, 0x4f, 0xb9, 0x3b, 0x86, 0x9a, 0x31, 0xda, 0x85, 0xd1, 0x63, 0xb4, 0xed, 0xf7, 0x98, 0x90, - 0x91, 0xdb, 0xd8, 0x77, 0x3d, 0x11, 0xd6, 0xcc, 0x5a, 0xee, 0x23, 0x30, 0x4d, 0xe5, 0x8b, 0x8e, - 0xc2, 0x08, 0xac, 0x85, 0x54, 0x0f, 0x39, 0x2a, 0x38, 0xa9, 0xc0, 0x82, 0xba, 0xfa, 0x52, 0x96, - 0x7b, 0x91, 0x8e, 0x41, 0x5b, 0x0a, 0xd7, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x5f, 0x82, 0x59, 0x63, - 0x53, 0xe2, 0xeb, 0xf7, 0x7d, 0xa7, 0x11, 0xa5, 0xd7, 0xbd, 0xab, 0xac, 0x10, 0x05, 0x8c, 0x5f, - 0x30, 0x88, 0xe8, 0x8c, 0xd4, 0xba, 0x27, 0x63, 0x32, 0x24, 0x94, 0x11, 0x0b, 0x68, 0x8b, 0xde, - 0x57, 0xf9, 0xc4, 0x15, 0x31, 0x64, 0x85, 0x28, 0x60, 0xf6, 0xf3, 0x30, 0xa3, 0x92, 0xe6, 0xf0, - 0xcc, 0x13, 0xca, 0xf8, 0x6d, 0x66, 0x9e, 0xf0, 0x83, 0x08, 0x39, 0xc4, 0x7e, 0x0b, 0x66, 0x54, - 0x6e, 0x9f, 0x87, 0x63, 0xb3, 0xa5, 0x28, 0xf4, 0xdc, 0xeb, 0x7e, 0x18, 0xa9, 0x84, 0x44, 0xe2, - 0x7e, 0xee, 0xe6, 0x06, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x84, 0x85, 0xd4, 0x3d, 0xed, 0x10, 0x69, - 0x2a, 0x7e, 0xb7, 0x00, 0x73, 0xe6, 0x75, 0xdd, 0x10, 0xb3, 0x78, 0xf8, 0xc5, 0x31, 0xe3, 0x8a, - 0xad, 0x30, 0xe2, 0x15, 0x9b, 0x79, 0xa7, 0x39, 0x79, 0xba, 0x77, 0x9a, 0xc5, 0x7c, 0xee, 0x34, - 0x8d, 0xbb, 0xf7, 0xa9, 0xc7, 0x77, 0xf7, 0xfe, 0x5b, 0x45, 0x98, 0x4f, 0xe6, 0x3d, 0x1c, 0xa2, - 0x27, 0x9f, 0xef, 0xeb, 0xc9, 0x11, 0x6d, 0xfa, 0x85, 0x71, 0x6d, 0xfa, 0x93, 0xe3, 0xda, 0xf4, - 0x8b, 0x8f, 0x60, 0xd3, 0xef, 0xb7, 0xc8, 0x4f, 0x0d, 0x6d, 0x91, 0xff, 0xb4, 0xf6, 0xca, 0x9b, - 0x4e, 0xb8, 0xb1, 0xc4, 0x5e, 0x79, 0x24, 0xd9, 0x0d, 0x6b, 0x7e, 0x33, 0xd3, 0xbb, 0x71, 0xe6, - 0x21, 0xb6, 0xcb, 0x20, 0xd3, 0x89, 0x6e, 0xf4, 0x6b, 0xc3, 0x0f, 0x8d, 0xe0, 0x40, 0xf7, 0x32, - 0xcc, 0xca, 0xf1, 0xc4, 0x55, 0x50, 0x48, 0xaa, 0xaf, 0xf5, 0x18, 0x84, 0x26, 0x1e, 0x7f, 0x12, - 0x3b, 0xf9, 0x62, 0x38, 0xbf, 0x22, 0x31, 0x9f, 0xc4, 0x4e, 0xbd, 0x30, 0x9e, 0xc6, 0xb7, 0xbf, - 0x08, 0x17, 0x32, 0xcd, 0x08, 0xdc, 0x84, 0xcb, 0xb5, 0x23, 0xda, 0x94, 0x08, 0x86, 0x18, 0xa9, - 0x54, 0xfa, 0xcb, 0x77, 0x06, 0x62, 0xe2, 0x09, 0x54, 0xec, 0xef, 0x14, 0x60, 0x3e, 0xf9, 0x9e, - 0x22, 0xb9, 0xa7, 0x8d, 0x8e, 0xb9, 0xd8, 0x3b, 0x05, 0x59, 0x23, 0x97, 0xde, 0xc0, 0xcb, 0x8a, - 0x7b, 0x7c, 0x7c, 0xed, 0xe8, 0xc4, 0x7e, 0xa7, 0xc7, 0x58, 0xde, 0x12, 0x48, 0x76, 0xfc, 0xc9, - 0xc4, 0x38, 0xec, 0x4e, 0x9e, 0x66, 0x73, 0xe7, 0x1e, 0x47, 0xc2, 0x69, 0x56, 0x68, 0xb0, 0x65, - 0x7b, 0xcb, 0x01, 0x0d, 0xdc, 0x5d, 0x57, 0xbf, 0x05, 0xcd, 0x57, 0xee, 0xb7, 0x64, 0x19, 0x6a, - 0xa8, 0xfd, 0xde, 0x04, 0xc4, 0xef, 0xe4, 0xf3, 0x47, 0xc7, 0x42, 0xe3, 0xe4, 0x20, 0xbb, 0xed, - 0xc6, 0xb8, 0x2f, 0xfb, 0xc5, 0x14, 0xa5, 0xc7, 0xb4, 0x51, 0x82, 0x09, 0x8e, 0x3f, 0x86, 0xf7, - 0xf1, 0x1d, 0x58, 0x48, 0xa5, 0x79, 0xc8, 0x3d, 0x17, 0xea, 0x0f, 0x0b, 0x50, 0xd2, 0x89, 0x32, - 0xc8, 0x27, 0x13, 0x66, 0x9c, 0x52, 0xf5, 0xc3, 0xc6, 0x8b, 0x38, 0x7b, 0x7e, 0xf3, 0xc1, 0x51, - 0x79, 0x41, 0x23, 0xa7, 0x4c, 0x32, 0x97, 0xa0, 0xd0, 0x0b, 0xda, 0xe9, 0x73, 0xda, 0x6d, 0xdc, - 0x44, 0x56, 0x4e, 0xee, 0xa7, 0xed, 0x28, 0x5b, 0x39, 0x25, 0xf7, 0x10, 0x07, 0x9a, 0xc1, 0xf6, - 0x13, 0xb6, 0x4b, 0xee, 0xf8, 0xcd, 0xc3, 0xf4, 0x0b, 0x3a, 0x55, 0xbf, 0x79, 0x88, 0x1c, 0x42, - 0x5e, 0x83, 0x79, 0x19, 0x8f, 0x64, 0xbe, 0x2b, 0x5e, 0x88, 0x2f, 0xdf, 0xb7, 0x13, 0x50, 0x4c, - 0x61, 0xb3, 0x5d, 0xf6, 0x6e, 0xe8, 0x7b, 0x3c, 0xc3, 0xed, 0x54, 0xf2, 0xa6, 0xee, 0x46, 0xfd, - 0xcd, 0x9b, 0xdc, 0x9c, 0xa4, 0x31, 0x18, 0xb6, 0xcb, 0x63, 0xb7, 0x03, 0x2a, 0x7d, 0x5f, 0x16, - 0x63, 0x7d, 0x5c, 0x94, 0xa3, 0xc6, 0x20, 0xeb, 0x82, 0x36, 0x93, 0x96, 0xef, 0x28, 0x73, 0xd5, - 0x2b, 0x8a, 0x2e, 0x2b, 0x7b, 0x70, 0x74, 0x82, 0xa1, 0x4f, 0xd7, 0xb4, 0x6f, 0xc3, 0x42, 0xaa, - 0xc1, 0xd4, 0xb9, 0xda, 0xca, 0x3e, 0x57, 0x0f, 0xf7, 0xe8, 0xcd, 0xbf, 0xb4, 0xe0, 0x6c, 0xdf, - 0x12, 0x30, 0x6c, 0x64, 0x5e, 0x7a, 0x33, 0x9a, 0x78, 0xf4, 0xcd, 0xa8, 0x30, 0xda, 0x66, 0x54, - 0xdd, 0xf9, 0xee, 0x0f, 0x2e, 0x3f, 0xf1, 0xbd, 0x1f, 0x5c, 0x7e, 0xe2, 0x8f, 0x7e, 0x70, 0xf9, - 0x89, 0xf7, 0x8e, 0x2f, 0x5b, 0xdf, 0x3d, 0xbe, 0x6c, 0x7d, 0xef, 0xf8, 0xb2, 0xf5, 0x47, 0xc7, - 0x97, 0xad, 0xff, 0x7c, 0x7c, 0xd9, 0xfa, 0xe6, 0x0f, 0x2f, 0x3f, 0xf1, 0xd9, 0x4f, 0xc7, 0x03, - 0x74, 0x55, 0x0d, 0x50, 0xfe, 0xe3, 0x63, 0x6a, 0x38, 0xae, 0x76, 0xf7, 0x5b, 0xab, 0x6c, 0x80, - 0xae, 0xea, 0x12, 0x35, 0x40, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x9a, 0xe7, 0x61, - 0xce, 0x9e, 0x00, 0x00, + 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, + 0x03, 0x31, 0xe2, 0x58, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, + 0x49, 0x90, 0x40, 0x08, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xfa, 0xec, 0xea, 0x9e, 0x1e, 0xee, + 0xcc, 0x4e, 0x73, 0x75, 0x49, 0xfc, 0x6f, 0xa6, 0x5e, 0xd5, 0x7b, 0xaf, 0xeb, 0xe3, 0xd5, 0xab, + 0x57, 0xef, 0xbd, 0x82, 0xcd, 0x96, 0x1b, 0xed, 0xf5, 0x76, 0x56, 0x1a, 0x7e, 0x67, 0xd5, 0x09, + 0x5a, 0x7e, 0x37, 0xf0, 0xef, 0xf2, 0x1f, 0x1f, 0x0b, 0xfc, 0x76, 0xdb, 0xef, 0x45, 0xe1, 0x6a, + 0x77, 0xbf, 0xb5, 0xea, 0x74, 0xdd, 0x70, 0x55, 0x97, 0x1c, 0x7c, 0xc2, 0x69, 0x77, 0xf7, 0x9c, + 0x4f, 0xac, 0xb6, 0xa8, 0x47, 0x03, 0x27, 0xa2, 0xcd, 0x95, 0x6e, 0xe0, 0x47, 0x3e, 0xf9, 0x74, + 0x8c, 0x6d, 0x45, 0x61, 0xe3, 0x3f, 0x7e, 0x4e, 0xb5, 0x5d, 0xe9, 0xee, 0xb7, 0x56, 0x18, 0xb6, + 0x15, 0x5d, 0xa2, 0xb0, 0x2d, 0x7f, 0xcc, 0xe0, 0xa5, 0xe5, 0xb7, 0xfc, 0x55, 0x8e, 0x74, 0xa7, + 0xb7, 0xcb, 0xff, 0xf1, 0x3f, 0xfc, 0x97, 0x20, 0xb6, 0xfc, 0xec, 0xfe, 0x2b, 0xe1, 0x8a, 0xeb, + 0x33, 0xde, 0x56, 0x77, 0x9c, 0xa8, 0xb1, 0xb7, 0x7a, 0xd0, 0xc7, 0xd1, 0xb2, 0x6d, 0x54, 0x6a, + 0xf8, 0x01, 0xcd, 0xaa, 0xf3, 0x52, 0x5c, 0xa7, 0xe3, 0x34, 0xf6, 0x5c, 0x8f, 0x06, 0x87, 0xf1, + 0x57, 0x77, 0x68, 0xe4, 0x64, 0xb5, 0x5a, 0x1d, 0xd4, 0x2a, 0xe8, 0x79, 0x91, 0xdb, 0xa1, 0x7d, + 0x0d, 0xfe, 0xda, 0xc3, 0x1a, 0x84, 0x8d, 0x3d, 0xda, 0x71, 0xfa, 0xda, 0xbd, 0x38, 0xa8, 0x5d, + 0x2f, 0x72, 0xdb, 0xab, 0xae, 0x17, 0x85, 0x51, 0x90, 0x6e, 0x64, 0xff, 0xb8, 0x00, 0xa5, 0xca, + 0x66, 0xb5, 0x1e, 0x39, 0x51, 0x2f, 0x24, 0x5f, 0xb5, 0x60, 0xae, 0xed, 0x3b, 0xcd, 0xaa, 0xd3, + 0x76, 0xbc, 0x06, 0x0d, 0x96, 0xac, 0x67, 0xac, 0x2b, 0xb3, 0x2f, 0x6c, 0xae, 0x8c, 0x33, 0x5e, + 0x2b, 0x95, 0x7b, 0x21, 0xd2, 0xd0, 0xef, 0x05, 0x0d, 0x8a, 0x74, 0xb7, 0x7a, 0xfe, 0x7b, 0x47, + 0xe5, 0x27, 0x8e, 0x8f, 0xca, 0x73, 0x9b, 0x06, 0x25, 0x4c, 0xd0, 0x25, 0xdf, 0xb2, 0xe0, 0x6c, + 0xc3, 0xf1, 0x9c, 0xe0, 0x70, 0xdb, 0x09, 0x5a, 0x34, 0x7a, 0x3d, 0xf0, 0x7b, 0xdd, 0xa5, 0x89, + 0x53, 0xe0, 0xe6, 0x49, 0xc9, 0xcd, 0xd9, 0xb5, 0x34, 0x39, 0xec, 0xe7, 0x80, 0xf3, 0x15, 0x46, + 0xce, 0x4e, 0x9b, 0x9a, 0x7c, 0x15, 0x4e, 0x93, 0xaf, 0x7a, 0x9a, 0x1c, 0xf6, 0x73, 0x40, 0x3e, + 0x02, 0xd3, 0xae, 0xd7, 0x0a, 0x68, 0x18, 0x2e, 0x4d, 0x3e, 0x63, 0x5d, 0x29, 0x55, 0x17, 0x64, + 0xf3, 0xe9, 0x0d, 0x51, 0x8c, 0x0a, 0x6e, 0x7f, 0xa7, 0x00, 0x67, 0x2b, 0x9b, 0xd5, 0xed, 0xc0, + 0xd9, 0xdd, 0x75, 0x1b, 0xe8, 0xf7, 0x22, 0xd7, 0x6b, 0x99, 0x08, 0xac, 0x93, 0x11, 0x90, 0x97, + 0x61, 0x36, 0xa4, 0xc1, 0x81, 0xdb, 0xa0, 0x35, 0x3f, 0x88, 0xf8, 0xa0, 0x14, 0xab, 0xe7, 0x64, + 0xf5, 0xd9, 0x7a, 0x0c, 0x42, 0xb3, 0x1e, 0x6b, 0x16, 0xf8, 0x7e, 0x24, 0xe1, 0xbc, 0xcf, 0x4a, + 0x71, 0x33, 0x8c, 0x41, 0x68, 0xd6, 0x23, 0xeb, 0xb0, 0xe8, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, + 0x7b, 0xb5, 0x80, 0xee, 0xba, 0xf7, 0xe5, 0x27, 0x2e, 0xc9, 0xb6, 0x8b, 0x95, 0x14, 0x1c, 0xfb, + 0x5a, 0x90, 0x6f, 0x5a, 0xb0, 0x18, 0x46, 0x6e, 0x63, 0xdf, 0xf5, 0x68, 0x18, 0xae, 0xf9, 0xde, + 0xae, 0xdb, 0x5a, 0x2a, 0xf2, 0x61, 0xbb, 0x39, 0xde, 0xb0, 0xd5, 0x53, 0x58, 0xab, 0xe7, 0x19, + 0x4b, 0xe9, 0x52, 0xec, 0xa3, 0x4e, 0x3e, 0x0a, 0x25, 0xd9, 0xa3, 0x34, 0x5c, 0x9a, 0x7a, 0xa6, + 0x70, 0xa5, 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x2e, 0x6d, 0xa8, 0x42, 0x8c, 0xe1, 0xf6, 0x3a, 0x2c, + 0x55, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x0d, 0xdd, 0x15, 0x98, 0xe9, 0x38, 0xdd, + 0xae, 0xeb, 0xb5, 0xd8, 0xd8, 0x31, 0x3c, 0x73, 0xc7, 0x47, 0xe5, 0x99, 0x2d, 0x59, 0x86, 0x1a, + 0x6a, 0xff, 0xc9, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, + 0x98, 0x61, 0x52, 0xab, 0xe9, 0x44, 0x8e, 0x5c, 0xe9, 0x1f, 0x5f, 0x11, 0x42, 0x64, 0xc5, 0x14, + 0x22, 0xf1, 0xe7, 0xb3, 0xda, 0x2b, 0x07, 0x9f, 0x58, 0x79, 0x73, 0xe7, 0x2e, 0x6d, 0x44, 0x5b, + 0x34, 0x72, 0xaa, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, 0x2e, 0x6d, + 0xc8, 0x95, 0xbb, 0x35, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x3a, 0x27, 0x49, 0x4f, + 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0x9b, 0xf9, 0x91, + 0xe4, 0x68, 0xab, 0xf3, 0x92, 0xe8, 0x94, 0xf8, 0x8f, 0x92, 0x9c, 0xfd, 0x1f, 0x2d, 0x38, 0x67, + 0xd4, 0xae, 0x04, 0xad, 0x5e, 0x87, 0x7a, 0x11, 0x79, 0x06, 0x26, 0x3d, 0xa7, 0x43, 0xe5, 0xaa, + 0xd2, 0x2c, 0xdf, 0x74, 0x3a, 0x14, 0x39, 0x84, 0x3c, 0x0b, 0xc5, 0x03, 0xa7, 0xdd, 0xa3, 0xbc, + 0x93, 0x4a, 0xd5, 0x33, 0xb2, 0x4a, 0xf1, 0x2d, 0x56, 0x88, 0x02, 0x46, 0xde, 0x85, 0x12, 0xff, + 0x71, 0x2d, 0xf0, 0x3b, 0x39, 0x7d, 0x9a, 0xe4, 0xf0, 0x2d, 0x85, 0x56, 0x4c, 0x3f, 0xfd, 0x17, + 0x63, 0x82, 0xf6, 0x9f, 0x59, 0xb0, 0x60, 0x7c, 0xdc, 0xa6, 0x1b, 0x46, 0xe4, 0xf3, 0x7d, 0x93, + 0x67, 0x65, 0xb8, 0xc9, 0xc3, 0x5a, 0xf3, 0xa9, 0xb3, 0x28, 0xbf, 0x74, 0x46, 0x95, 0x18, 0x13, + 0xc7, 0x83, 0xa2, 0x1b, 0xd1, 0x4e, 0xb8, 0x34, 0xf1, 0x4c, 0xe1, 0xca, 0xec, 0x0b, 0x1b, 0xb9, + 0x0d, 0x63, 0xdc, 0xbf, 0x1b, 0x0c, 0x3f, 0x0a, 0x32, 0xf6, 0x3f, 0x2f, 0x24, 0x86, 0x6f, 0x4b, + 0xf1, 0xf1, 0xbe, 0x05, 0x53, 0x6d, 0x67, 0x87, 0xb6, 0xc5, 0xda, 0x9a, 0x7d, 0xe1, 0xed, 0xdc, + 0x38, 0x51, 0x34, 0x56, 0x36, 0x39, 0xfe, 0xab, 0x5e, 0x14, 0x1c, 0xc6, 0xd3, 0x4b, 0x14, 0xa2, + 0x24, 0x4e, 0xfe, 0x81, 0x05, 0xb3, 0xb1, 0x54, 0x53, 0xdd, 0xb2, 0x93, 0x3f, 0x33, 0xb1, 0x30, + 0x95, 0x1c, 0x69, 0x11, 0x6d, 0x40, 0xd0, 0xe4, 0x65, 0xf9, 0x93, 0x30, 0x6b, 0x7c, 0x02, 0x59, + 0x84, 0xc2, 0x3e, 0x3d, 0x14, 0x13, 0x1e, 0xd9, 0x4f, 0x72, 0x3e, 0x31, 0xc3, 0xe5, 0x94, 0xfe, + 0xd4, 0xc4, 0x2b, 0xd6, 0xf2, 0x6b, 0xb0, 0x98, 0x26, 0x38, 0x4a, 0x7b, 0xfb, 0x3b, 0x93, 0x89, + 0x89, 0xc9, 0x04, 0x01, 0xf1, 0x61, 0xba, 0x43, 0xa3, 0xc0, 0x6d, 0xa8, 0x21, 0x5b, 0x1f, 0xaf, + 0x97, 0xb6, 0x38, 0xb2, 0x78, 0x43, 0x14, 0xff, 0x43, 0x54, 0x54, 0xc8, 0x1e, 0x4c, 0x3a, 0x41, + 0x4b, 0x8d, 0xc9, 0xb5, 0x7c, 0x96, 0x65, 0x2c, 0x2a, 0x2a, 0x41, 0x2b, 0x44, 0x4e, 0x81, 0xac, + 0x42, 0x29, 0xa2, 0x41, 0xc7, 0xf5, 0x9c, 0x48, 0xec, 0xa0, 0x33, 0xd5, 0xb3, 0xb2, 0x5a, 0x69, + 0x5b, 0x01, 0x30, 0xae, 0x43, 0xda, 0x30, 0xd5, 0x0c, 0x0e, 0xb1, 0xe7, 0x2d, 0x4d, 0xe6, 0xd1, + 0x15, 0xeb, 0x1c, 0x57, 0x3c, 0x49, 0xc5, 0x7f, 0x94, 0x34, 0xc8, 0xaf, 0x5b, 0x70, 0xbe, 0x43, + 0x9d, 0xb0, 0x17, 0x50, 0xf6, 0x09, 0x48, 0x23, 0xea, 0xb1, 0x81, 0x5d, 0x2a, 0x72, 0xe2, 0x38, + 0xee, 0x38, 0xf4, 0x63, 0xae, 0x3e, 0x2d, 0x59, 0x39, 0x9f, 0x05, 0xc5, 0x4c, 0x6e, 0xec, 0x3f, + 0x99, 0x84, 0xb3, 0x7d, 0x82, 0x9d, 0xbc, 0x04, 0xc5, 0xee, 0x9e, 0x13, 0x2a, 0x49, 0x7d, 0x59, + 0x89, 0x89, 0x1a, 0x2b, 0x7c, 0x70, 0x54, 0x3e, 0xa3, 0x9a, 0xf0, 0x02, 0x14, 0x95, 0x99, 0xde, + 0xd4, 0xa1, 0x61, 0xe8, 0xb4, 0x94, 0xf8, 0x36, 0xa6, 0x09, 0x2f, 0x46, 0x05, 0x27, 0x7f, 0xdb, + 0x82, 0x33, 0x62, 0xca, 0x20, 0x0d, 0x7b, 0xed, 0x88, 0x6d, 0x51, 0xac, 0x5b, 0x6e, 0xe4, 0x31, + 0x3d, 0x05, 0xca, 0xea, 0x05, 0x49, 0xfd, 0x8c, 0x59, 0x1a, 0x62, 0x92, 0x2e, 0xb9, 0x03, 0xa5, + 0x30, 0x72, 0x82, 0x88, 0x36, 0x2b, 0x11, 0x57, 0xa6, 0x66, 0x5f, 0xf8, 0xe9, 0xe1, 0x64, 0xf7, + 0xb6, 0xdb, 0xa1, 0x62, 0x9f, 0xa8, 0x2b, 0x04, 0x18, 0xe3, 0x22, 0xef, 0x02, 0x04, 0x3d, 0xaf, + 0xde, 0xeb, 0x74, 0x9c, 0xe0, 0x50, 0xea, 0x57, 0xd7, 0xc7, 0xfb, 0x3c, 0xd4, 0xf8, 0x62, 0x55, + 0x23, 0x2e, 0x43, 0x83, 0x1e, 0xf9, 0xb2, 0x05, 0x67, 0xc4, 0x4c, 0x54, 0x1c, 0x4c, 0xe5, 0xcc, + 0xc1, 0x59, 0xd6, 0xb5, 0xeb, 0x26, 0x09, 0x4c, 0x52, 0xb4, 0xff, 0x7d, 0x52, 0x0d, 0xa8, 0x47, + 0xec, 0xb0, 0xd5, 0x3a, 0x24, 0x9f, 0x83, 0x27, 0xc3, 0x5e, 0xa3, 0x41, 0xc3, 0x70, 0xb7, 0xd7, + 0xc6, 0x9e, 0x77, 0xdd, 0x0d, 0x23, 0x3f, 0x38, 0xdc, 0x74, 0x3b, 0x6e, 0xc4, 0x67, 0x5c, 0xb1, + 0x7a, 0xe9, 0xf8, 0xa8, 0xfc, 0x64, 0x7d, 0x50, 0x25, 0x1c, 0xdc, 0x9e, 0x38, 0xf0, 0x54, 0xcf, + 0x1b, 0x8c, 0x5e, 0x68, 0xe8, 0xe5, 0xe3, 0xa3, 0xf2, 0x53, 0xb7, 0x07, 0x57, 0xc3, 0x93, 0x70, + 0xd8, 0xff, 0xd5, 0x62, 0x92, 0x5a, 0x7c, 0xd7, 0x36, 0xed, 0x74, 0xdb, 0x4c, 0xba, 0x9c, 0xbe, + 0xfe, 0x18, 0x25, 0xf4, 0x47, 0xcc, 0x67, 0xbb, 0x53, 0xfc, 0x0f, 0x52, 0x22, 0xed, 0xff, 0x62, + 0xc1, 0xf9, 0x74, 0xe5, 0xc7, 0xa0, 0xf3, 0x84, 0x49, 0x9d, 0xe7, 0x66, 0xbe, 0x5f, 0x3b, 0x40, + 0xf1, 0xf9, 0xea, 0x64, 0xff, 0xb7, 0xfe, 0xbf, 0xbe, 0x8d, 0xc6, 0xbb, 0x62, 0xe1, 0x27, 0xb9, + 0x2b, 0x4e, 0x7e, 0xa0, 0x76, 0xc5, 0xdf, 0x9c, 0x84, 0xb9, 0x8a, 0x17, 0xb9, 0x95, 0xdd, 0x5d, + 0xd7, 0x73, 0xa3, 0x43, 0xf2, 0xf5, 0x09, 0x58, 0xed, 0x06, 0x74, 0x97, 0x06, 0x01, 0x6d, 0xae, + 0xf7, 0x02, 0xd7, 0x6b, 0xd5, 0x1b, 0x7b, 0xb4, 0xd9, 0x6b, 0xbb, 0x5e, 0x6b, 0xa3, 0xe5, 0xf9, + 0xba, 0xf8, 0xea, 0x7d, 0xda, 0xe8, 0xf1, 0x4f, 0x12, 0x8b, 0xa2, 0x33, 0xde, 0x27, 0xd5, 0x46, + 0x23, 0x5a, 0x7d, 0xf1, 0xf8, 0xa8, 0xbc, 0x3a, 0x62, 0x23, 0x1c, 0xf5, 0xd3, 0xc8, 0xd7, 0x26, + 0x60, 0x25, 0xa0, 0x3f, 0xdf, 0x73, 0x87, 0xef, 0x0d, 0x21, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, + 0xd1, 0xac, 0xbe, 0x70, 0x7c, 0x54, 0x1e, 0xb1, 0x0d, 0x8e, 0xf8, 0x5d, 0x76, 0x0d, 0x66, 0x2b, + 0x5d, 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, + 0x8a, 0xb5, 0x5d, 0xaa, 0x96, 0x98, 0x14, 0x42, 0x56, 0x80, 0xa2, 0xdc, 0xfe, 0x45, 0x26, 0x71, + 0x39, 0xca, 0x94, 0x71, 0xe3, 0x2e, 0x14, 0x03, 0x46, 0x44, 0xce, 0xac, 0x71, 0xcf, 0x81, 0x31, + 0xd7, 0x92, 0x09, 0xf6, 0x13, 0x05, 0x09, 0xfb, 0xf7, 0x26, 0xe0, 0x42, 0xa5, 0xdb, 0xdd, 0xa2, + 0xe1, 0x5e, 0x8a, 0x8b, 0x5f, 0xb6, 0x60, 0xfe, 0xc0, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, 0xf6, 0x2b, + 0xc1, 0x4f, 0x7d, 0x5c, 0x7e, 0x38, 0xb5, 0xb7, 0x12, 0xa8, 0xab, 0xe4, 0xf8, 0xa8, 0x3c, 0x9f, + 0x2c, 0xc3, 0x14, 0x79, 0xf2, 0xf7, 0x2d, 0x58, 0x94, 0x45, 0x37, 0xfd, 0x26, 0x35, 0xed, 0xa3, + 0xb7, 0xf3, 0xe4, 0x49, 0x23, 0x17, 0x76, 0xad, 0x74, 0x29, 0xf6, 0x31, 0x61, 0xff, 0xf7, 0x09, + 0xb8, 0x38, 0x00, 0x07, 0xf9, 0x0d, 0x0b, 0xce, 0x0b, 0xa3, 0xaa, 0x01, 0x42, 0xba, 0x2b, 0x7b, + 0xf3, 0x67, 0xf2, 0xe6, 0x1c, 0xd9, 0x12, 0xa7, 0x5e, 0x83, 0x56, 0x97, 0x98, 0x34, 0x5c, 0xcb, + 0x20, 0x8d, 0x99, 0x0c, 0x71, 0x4e, 0x85, 0x99, 0x35, 0xc5, 0xe9, 0xc4, 0x63, 0xe1, 0xb4, 0x9e, + 0x41, 0x1a, 0x33, 0x19, 0xb2, 0xff, 0x26, 0x3c, 0x75, 0x02, 0xba, 0x87, 0x2f, 0x4e, 0xfb, 0x6d, + 0x3d, 0xeb, 0x93, 0x73, 0x6e, 0x88, 0x75, 0x6d, 0xc3, 0x14, 0x5f, 0x3a, 0x6a, 0x61, 0x03, 0xdb, + 0xfe, 0xf8, 0x9a, 0x0a, 0x51, 0x42, 0xec, 0xdf, 0xb3, 0x60, 0x66, 0x04, 0x6b, 0x58, 0x39, 0x69, + 0x0d, 0x2b, 0xf5, 0x59, 0xc2, 0xa2, 0x7e, 0x4b, 0xd8, 0xeb, 0xe3, 0x8d, 0xc6, 0x30, 0x16, 0xb0, + 0x1f, 0x5b, 0x70, 0xb6, 0xcf, 0x62, 0x46, 0xf6, 0xe0, 0x7c, 0xd7, 0x6f, 0x2a, 0xb5, 0xe9, 0xba, + 0x13, 0xee, 0x71, 0x98, 0xfc, 0xbc, 0x97, 0xd8, 0x48, 0xd6, 0x32, 0xe0, 0x0f, 0x8e, 0xca, 0x4b, + 0x1a, 0x49, 0xaa, 0x02, 0x66, 0x62, 0x24, 0x5d, 0x98, 0xd9, 0x75, 0x69, 0xbb, 0x19, 0x4f, 0xc1, + 0x31, 0x15, 0xa4, 0x6b, 0x12, 0x9b, 0x30, 0x16, 0xab, 0x7f, 0xa8, 0xa9, 0xd8, 0x5f, 0x82, 0xf9, + 0xe4, 0x95, 0xc4, 0x10, 0x83, 0x77, 0x09, 0x0a, 0x4e, 0xe0, 0xc9, 0xa1, 0x9b, 0x95, 0x15, 0x0a, + 0x15, 0xbc, 0x89, 0xac, 0x9c, 0x3c, 0x0f, 0x33, 0xbb, 0xbd, 0x76, 0x9b, 0x35, 0x90, 0xf6, 0x7f, + 0xad, 0x0e, 0x5f, 0x93, 0xe5, 0xa8, 0x6b, 0xd8, 0x7f, 0x31, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, + 0x1e, 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xea, 0xb4, 0x4d, + 0x1b, 0x91, 0x1f, 0x48, 0x6e, 0x2e, 0x4a, 0x44, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf5, 0xc9, 0x6b, + 0x30, 0xef, 0x34, 0x22, 0xf7, 0x80, 0x6a, 0x0c, 0x82, 0xdd, 0x0f, 0x49, 0x0c, 0xf3, 0x95, 0x04, + 0x14, 0x53, 0xb5, 0xc9, 0xe7, 0x61, 0x29, 0x6c, 0x38, 0x6d, 0x7a, 0xbb, 0x2b, 0x49, 0xad, 0xed, + 0xd1, 0xc6, 0x7e, 0xcd, 0x77, 0xbd, 0x48, 0x9a, 0x64, 0x9e, 0x91, 0x98, 0x96, 0xea, 0x03, 0xea, + 0xe1, 0x40, 0x0c, 0xe4, 0x5f, 0x59, 0x70, 0xa9, 0x1b, 0xd0, 0x5a, 0xe0, 0x77, 0x7c, 0xb6, 0xd7, + 0xf6, 0xd9, 0x29, 0xe4, 0x79, 0xfd, 0xad, 0x31, 0x95, 0x0a, 0x51, 0xd2, 0x6f, 0xde, 0xfe, 0xf0, + 0xf1, 0x51, 0xf9, 0x52, 0xed, 0x24, 0x06, 0xf0, 0x64, 0xfe, 0xc8, 0xbf, 0xb6, 0xe0, 0x72, 0xd7, + 0x0f, 0xa3, 0x13, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1f, 0x95, 0x2f, 0xd7, 0x4e, 0xe4, + 0x00, 0x1f, 0xc2, 0xa1, 0x7d, 0x3c, 0x0b, 0x67, 0x8d, 0xb9, 0x27, 0x0f, 0xf1, 0xaf, 0xc2, 0x19, + 0x35, 0x19, 0x62, 0x25, 0xa0, 0x14, 0x1b, 0x5d, 0x2a, 0x26, 0x10, 0x93, 0x75, 0xd9, 0xbc, 0xd3, + 0x53, 0x51, 0xb4, 0x4e, 0xcd, 0xbb, 0x5a, 0x02, 0x8a, 0xa9, 0xda, 0x64, 0x03, 0xce, 0xc9, 0x12, + 0xa4, 0xdd, 0xb6, 0xdb, 0x70, 0xd6, 0xfc, 0x9e, 0x9c, 0x72, 0xc5, 0xea, 0xc5, 0xe3, 0xa3, 0xf2, + 0xb9, 0x5a, 0x3f, 0x18, 0xb3, 0xda, 0x90, 0x4d, 0x38, 0xef, 0xf4, 0x22, 0x5f, 0x7f, 0xff, 0x55, + 0x8f, 0xed, 0x2b, 0x4d, 0x3e, 0xb5, 0x66, 0xc4, 0x06, 0x54, 0xc9, 0x80, 0x63, 0x66, 0x2b, 0x52, + 0x4b, 0x61, 0xab, 0xd3, 0x86, 0xef, 0x35, 0xc5, 0x28, 0x17, 0xe3, 0xa3, 0x48, 0x25, 0xa3, 0x0e, + 0x66, 0xb6, 0x24, 0x6d, 0x98, 0xef, 0x38, 0xf7, 0x6f, 0x7b, 0xce, 0x81, 0xe3, 0xb6, 0x19, 0x11, + 0x69, 0xc8, 0x19, 0x6c, 0x5d, 0xe8, 0x45, 0x6e, 0x7b, 0x45, 0x5c, 0x71, 0xaf, 0x6c, 0x78, 0xd1, + 0x9b, 0x41, 0x3d, 0x62, 0x2a, 0xab, 0x50, 0xa5, 0xb6, 0x12, 0xb8, 0x30, 0x85, 0x9b, 0xbc, 0x09, + 0x17, 0xf8, 0x72, 0x5c, 0xf7, 0xef, 0x79, 0xeb, 0xb4, 0xed, 0x1c, 0xaa, 0x0f, 0x98, 0xe6, 0x1f, + 0xf0, 0xe4, 0xf1, 0x51, 0xf9, 0x42, 0x3d, 0xab, 0x02, 0x66, 0xb7, 0x23, 0x0e, 0x3c, 0x95, 0x04, + 0x20, 0x3d, 0x70, 0x43, 0xd7, 0xf7, 0x84, 0x39, 0x66, 0x26, 0x36, 0xc7, 0xd4, 0x07, 0x57, 0xc3, + 0x93, 0x70, 0x90, 0x7f, 0x68, 0xc1, 0xf9, 0xac, 0x65, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0xb5, + 0xb4, 0xc4, 0x8c, 0xc8, 0x14, 0x0a, 0x99, 0x4c, 0x90, 0xf7, 0x2c, 0x98, 0x73, 0x8c, 0xa3, 0xe4, + 0x12, 0x70, 0xae, 0x6e, 0x8c, 0x6b, 0xd0, 0x88, 0x31, 0x56, 0x17, 0x8f, 0x8f, 0xca, 0x89, 0xe3, + 0x2a, 0x26, 0x28, 0x92, 0x7f, 0x6c, 0xc1, 0x85, 0xcc, 0x35, 0xbe, 0x34, 0x7b, 0x1a, 0x3d, 0xc4, + 0x27, 0x49, 0xb6, 0xcc, 0xc9, 0x66, 0x83, 0x7c, 0xd3, 0xd2, 0x5b, 0x99, 0xba, 0x7b, 0x59, 0x9a, + 0xe3, 0xac, 0xdd, 0x1a, 0xf3, 0xf4, 0x1c, 0xab, 0x0f, 0x0a, 0x71, 0xf5, 0x9c, 0xb1, 0x33, 0xaa, + 0x42, 0x4c, 0x93, 0x27, 0xdf, 0xb0, 0xd4, 0xd6, 0xa8, 0x39, 0x3a, 0x73, 0x5a, 0x1c, 0x91, 0x78, + 0xa7, 0xd5, 0x0c, 0xa5, 0x88, 0x93, 0x9f, 0x85, 0x65, 0x67, 0xc7, 0x0f, 0xa2, 0xcc, 0xc5, 0xb7, + 0x34, 0xcf, 0x97, 0xd1, 0xe5, 0xe3, 0xa3, 0xf2, 0x72, 0x65, 0x60, 0x2d, 0x3c, 0x01, 0x83, 0xfd, + 0xdb, 0x45, 0x98, 0x13, 0x47, 0x02, 0xb9, 0x75, 0xfd, 0x8e, 0x05, 0x4f, 0x37, 0x7a, 0x41, 0x40, + 0xbd, 0xa8, 0x1e, 0xd1, 0x6e, 0xff, 0xc6, 0x65, 0x9d, 0xea, 0xc6, 0xf5, 0xcc, 0xf1, 0x51, 0xf9, + 0xe9, 0xb5, 0x13, 0xe8, 0xe3, 0x89, 0xdc, 0x91, 0x7f, 0x67, 0x81, 0x2d, 0x2b, 0x54, 0x9d, 0xc6, + 0x7e, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x26, 0x4e, 0xf5, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, + 0xdb, 0x6b, 0x0f, 0xe5, 0x02, 0x87, 0xe0, 0x94, 0xbc, 0x0e, 0x67, 0x65, 0xad, 0xab, 0xf7, 0xbb, + 0x34, 0x70, 0x99, 0xf2, 0x2d, 0x15, 0xc7, 0xd8, 0x6d, 0x27, 0x5d, 0x01, 0xfb, 0xdb, 0x90, 0x10, + 0xa6, 0xef, 0x51, 0xb7, 0xb5, 0x17, 0x29, 0xf5, 0x69, 0x4c, 0x5f, 0x1d, 0x69, 0x1e, 0xb8, 0x23, + 0x70, 0x56, 0x67, 0x8f, 0x8f, 0xca, 0xd3, 0xf2, 0x0f, 0x2a, 0x4a, 0xe4, 0x26, 0xcc, 0x8b, 0x03, + 0x5b, 0xcd, 0xf5, 0x5a, 0x35, 0xdf, 0x13, 0x0e, 0x27, 0xa5, 0xea, 0x73, 0x6a, 0xc3, 0xaf, 0x27, + 0xa0, 0x0f, 0x8e, 0xca, 0x73, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xdd, 0x29, + 0x00, 0x35, 0x5d, 0x69, 0x97, 0x7c, 0x14, 0x4a, 0x21, 0x8d, 0x04, 0x55, 0x79, 0x83, 0x20, 0x2e, + 0x66, 0x54, 0x21, 0xc6, 0x70, 0xb2, 0x0f, 0xc5, 0xae, 0xd3, 0x0b, 0xa9, 0x1c, 0xfc, 0x1b, 0xb9, + 0x0c, 0x7e, 0x8d, 0x61, 0x14, 0x27, 0x34, 0xfe, 0x13, 0x05, 0x0d, 0xf2, 0x15, 0x0b, 0x80, 0x26, + 0x07, 0x6c, 0x6c, 0x4b, 0x89, 0x24, 0x19, 0x8f, 0x29, 0xeb, 0x83, 0xea, 0xfc, 0xf1, 0x51, 0x19, + 0x8c, 0xa1, 0x37, 0xc8, 0x92, 0x7b, 0x30, 0xe3, 0x28, 0x99, 0x3f, 0x79, 0x1a, 0x32, 0x9f, 0x1f, + 0x9c, 0xf4, 0xa4, 0xd5, 0xc4, 0xc8, 0xd7, 0x2c, 0x98, 0x0f, 0x69, 0x24, 0x87, 0x8a, 0x49, 0x1e, + 0xa9, 0xf0, 0x8e, 0x39, 0xe9, 0xea, 0x09, 0x9c, 0x42, 0x82, 0x26, 0xcb, 0x30, 0x45, 0x57, 0xb1, + 0x72, 0x9d, 0x3a, 0x4d, 0x1a, 0xf0, 0x73, 0xb9, 0xd4, 0xa4, 0xc6, 0x67, 0xc5, 0xc0, 0xa9, 0x59, + 0x31, 0xca, 0x30, 0x45, 0x57, 0xb1, 0xb2, 0xe5, 0x06, 0x81, 0x2f, 0x59, 0x99, 0xc9, 0x89, 0x15, + 0x03, 0xa7, 0x66, 0xc5, 0x28, 0xc3, 0x14, 0x5d, 0xfb, 0xdb, 0x67, 0x60, 0x5e, 0x2d, 0xa4, 0x58, + 0xb3, 0x17, 0x66, 0xa0, 0x01, 0x9a, 0xfd, 0x9a, 0x09, 0xc4, 0x64, 0x5d, 0xd6, 0x58, 0x2c, 0xd5, + 0xa4, 0x62, 0xaf, 0x1b, 0xd7, 0x4d, 0x20, 0x26, 0xeb, 0x92, 0x0e, 0x14, 0xc3, 0x88, 0x76, 0xd5, + 0x65, 0xf0, 0x98, 0x77, 0x95, 0xb1, 0x7c, 0x88, 0xaf, 0x7b, 0xd8, 0xbf, 0x10, 0x05, 0x15, 0x6e, + 0xc9, 0x8c, 0x12, 0xc6, 0x4d, 0xb9, 0x38, 0xf2, 0x59, 0x9f, 0x49, 0xbb, 0xa9, 0x18, 0x8d, 0x64, + 0x19, 0xa6, 0xc8, 0x67, 0x28, 0xfb, 0xc5, 0x53, 0x54, 0xf6, 0x3f, 0x0b, 0x33, 0x1d, 0xe7, 0x7e, + 0xbd, 0x17, 0xb4, 0x1e, 0xfd, 0x50, 0x21, 0xdd, 0xeb, 0x04, 0x16, 0xd4, 0xf8, 0xc8, 0x97, 0x2d, + 0x43, 0xe4, 0x4c, 0x73, 0xe4, 0x77, 0xf2, 0x15, 0x39, 0x7a, 0xaf, 0x1c, 0x28, 0x7c, 0xfa, 0x54, + 0xef, 0x99, 0xc7, 0xae, 0x7a, 0x33, 0x35, 0x52, 0x2c, 0x10, 0xad, 0x46, 0x96, 0x4e, 0x55, 0x8d, + 0x5c, 0x4b, 0x10, 0xc3, 0x14, 0x71, 0xce, 0x8f, 0x58, 0x73, 0x9a, 0x1f, 0x38, 0x55, 0x7e, 0xea, + 0x09, 0x62, 0x98, 0x22, 0x3e, 0xf8, 0xbc, 0x39, 0x7b, 0x3a, 0xe7, 0xcd, 0xb9, 0x1c, 0xce, 0x9b, + 0x27, 0xab, 0xe2, 0x67, 0xc6, 0x55, 0xc5, 0xc9, 0x0d, 0x20, 0xcd, 0x43, 0xcf, 0xe9, 0xb8, 0x0d, + 0x29, 0x2c, 0xf9, 0xb6, 0x39, 0xcf, 0xed, 0x11, 0xcb, 0x52, 0x90, 0x91, 0xf5, 0xbe, 0x1a, 0x98, + 0xd1, 0x8a, 0x44, 0x30, 0xd3, 0x55, 0x1a, 0xd7, 0x42, 0x1e, 0xb3, 0x5f, 0x69, 0x60, 0xc2, 0x5f, + 0x80, 0x2d, 0x3c, 0x55, 0x82, 0x9a, 0x12, 0xd9, 0x84, 0xf3, 0x1d, 0xd7, 0xab, 0xf9, 0xcd, 0xb0, + 0x46, 0x03, 0x69, 0x6d, 0xa9, 0xd3, 0x68, 0x69, 0x91, 0xf7, 0x0d, 0x3f, 0x41, 0x6f, 0x65, 0xc0, + 0x31, 0xb3, 0x95, 0xfd, 0x3f, 0x2d, 0x58, 0x5c, 0x6b, 0xfb, 0xbd, 0xe6, 0x1d, 0x27, 0x6a, 0xec, + 0x89, 0xab, 0x72, 0xf2, 0x1a, 0xcc, 0xb8, 0x5e, 0x44, 0x83, 0x03, 0xa7, 0x2d, 0xf7, 0x27, 0x5b, + 0x99, 0x4f, 0x37, 0x64, 0xf9, 0x83, 0xa3, 0xf2, 0xfc, 0x7a, 0x2f, 0xe0, 0xee, 0x74, 0x42, 0x5a, + 0xa1, 0x6e, 0x43, 0xbe, 0x6d, 0xc1, 0x59, 0x71, 0xd9, 0xbe, 0xee, 0x44, 0xce, 0xad, 0x1e, 0x0d, + 0x5c, 0xaa, 0xae, 0xdb, 0xc7, 0x14, 0x54, 0x69, 0x5e, 0x15, 0x81, 0xc3, 0x58, 0x51, 0xdf, 0x4a, + 0x53, 0xc6, 0x7e, 0x66, 0xec, 0x5f, 0x29, 0xc0, 0x93, 0x03, 0x71, 0x91, 0x65, 0x98, 0x70, 0x9b, + 0xf2, 0xd3, 0x41, 0xe2, 0x9d, 0xd8, 0x68, 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, + 0x18, 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x35, 0x48, 0x19, 0x8a, 0xdc, 0xb5, + 0x52, 0x9e, 0x27, 0xb8, 0x16, 0xcb, 0xbd, 0x18, 0x51, 0x94, 0x93, 0x5f, 0xb4, 0x00, 0x04, 0x83, + 0xec, 0x34, 0x22, 0x77, 0x49, 0xcc, 0xb7, 0x9b, 0x18, 0x66, 0xc1, 0x65, 0xfc, 0x1f, 0x0d, 0xaa, + 0x64, 0x1b, 0xa6, 0x98, 0x42, 0xeb, 0x37, 0x1f, 0x79, 0x53, 0xe4, 0x57, 0x32, 0x35, 0x8e, 0x03, + 0x25, 0x2e, 0xd6, 0x57, 0x01, 0x8d, 0x7a, 0x81, 0xc7, 0xba, 0x96, 0x6f, 0x83, 0x33, 0x82, 0x0b, + 0xd4, 0xa5, 0x68, 0xd4, 0xb0, 0xff, 0xe5, 0x04, 0x9c, 0xcf, 0x62, 0x9d, 0xed, 0x36, 0x53, 0x82, + 0x5b, 0x79, 0x34, 0xfe, 0x4c, 0xfe, 0xfd, 0x23, 0xfd, 0x46, 0xb4, 0x77, 0x85, 0xf4, 0x6c, 0x93, + 0x74, 0xc9, 0x67, 0x74, 0x0f, 0x4d, 0x3c, 0x62, 0x0f, 0x69, 0xcc, 0xa9, 0x5e, 0x7a, 0x06, 0x26, + 0x43, 0x36, 0xf2, 0x85, 0xe4, 0x75, 0x07, 0x1f, 0x23, 0x0e, 0x61, 0x35, 0x7a, 0x9e, 0x1b, 0xc9, + 0x78, 0x04, 0x5d, 0xe3, 0xb6, 0xe7, 0x46, 0xc8, 0x21, 0xf6, 0xb7, 0x26, 0x60, 0x79, 0xf0, 0x47, + 0x91, 0x6f, 0x59, 0x00, 0x4d, 0x76, 0x5c, 0x09, 0xb9, 0x53, 0xaf, 0xf0, 0xb3, 0x71, 0x4e, 0xab, + 0x0f, 0xd7, 0x15, 0xa5, 0xd8, 0xe9, 0x4a, 0x17, 0x85, 0x68, 0x30, 0x42, 0x5e, 0x50, 0x53, 0x9f, + 0x5f, 0xd5, 0x88, 0xc5, 0xa4, 0xdb, 0x6c, 0x69, 0x08, 0x1a, 0xb5, 0xd8, 0x79, 0xd4, 0x73, 0x3a, + 0x34, 0xec, 0x3a, 0x3a, 0xba, 0x83, 0x9f, 0x47, 0x6f, 0xaa, 0x42, 0x8c, 0xe1, 0x76, 0x1b, 0x9e, + 0x1d, 0x82, 0xcf, 0x9c, 0x9c, 0xe7, 0xed, 0xff, 0x61, 0xc1, 0xc5, 0xb5, 0x76, 0x2f, 0x8c, 0x68, + 0xf0, 0xff, 0x8d, 0x0f, 0xdb, 0xff, 0xb2, 0xe0, 0xa9, 0x01, 0xdf, 0xfc, 0x18, 0x5c, 0xd9, 0xde, + 0x49, 0xba, 0xb2, 0xdd, 0x1e, 0x77, 0x4a, 0x67, 0x7e, 0xc7, 0x00, 0x8f, 0xb6, 0xdf, 0xb4, 0xe0, + 0x0c, 0x13, 0x5b, 0x4d, 0xbf, 0x95, 0xd3, 0xc6, 0xf9, 0x2c, 0x14, 0x7f, 0x9e, 0x6d, 0x40, 0xe9, + 0x49, 0xc6, 0x77, 0x25, 0x14, 0x30, 0xb6, 0x66, 0x9c, 0xae, 0xfb, 0x16, 0x0d, 0xf8, 0x06, 0x54, + 0x48, 0xae, 0x99, 0x8a, 0x86, 0xa0, 0x51, 0xcb, 0xfe, 0x34, 0x48, 0x67, 0xb1, 0xd4, 0x8a, 0xb3, + 0x86, 0x59, 0x71, 0xf6, 0x7f, 0x98, 0x00, 0xc3, 0xf8, 0xf1, 0x18, 0x66, 0xb2, 0x97, 0x98, 0xc9, + 0x63, 0x1e, 0xdc, 0x0d, 0x53, 0xce, 0xa0, 0x60, 0x9e, 0x83, 0x54, 0x30, 0xcf, 0xcd, 0xdc, 0x28, + 0x9e, 0x1c, 0xcb, 0xf3, 0x03, 0x0b, 0x9e, 0x8a, 0x2b, 0xf7, 0xdb, 0x25, 0x1f, 0x2e, 0x96, 0x5e, + 0x86, 0x59, 0x27, 0x6e, 0x26, 0xe7, 0x8d, 0x11, 0x49, 0xa1, 0x41, 0x68, 0xd6, 0x8b, 0x7d, 0xd0, + 0x0b, 0x8f, 0xe8, 0x83, 0x3e, 0x79, 0xb2, 0x0f, 0xba, 0xfd, 0xe7, 0x13, 0x70, 0xa9, 0xff, 0xcb, + 0xd4, 0x82, 0x1a, 0xee, 0x92, 0xff, 0x15, 0x98, 0x8b, 0x64, 0x03, 0x63, 0x7b, 0xd0, 0x51, 0x9d, + 0xdb, 0x06, 0x0c, 0x13, 0x35, 0x59, 0xcb, 0x86, 0x58, 0xca, 0xf5, 0x86, 0xdf, 0x55, 0x11, 0x0c, + 0xba, 0xe5, 0x9a, 0x01, 0xc3, 0x44, 0x4d, 0xed, 0x1b, 0x3a, 0x79, 0xea, 0xbe, 0xa1, 0x75, 0xb8, + 0xa0, 0xbc, 0xe1, 0xae, 0xf9, 0xc1, 0x9a, 0xdf, 0xe9, 0xb6, 0xa9, 0x8c, 0x61, 0x60, 0xcc, 0x5e, + 0x92, 0x4d, 0x2e, 0x60, 0x56, 0x25, 0xcc, 0x6e, 0x6b, 0xff, 0xa0, 0x00, 0xe7, 0xe2, 0x6e, 0x5f, + 0xf3, 0xbd, 0xa6, 0xcb, 0x7d, 0x0a, 0x5f, 0x85, 0xc9, 0xe8, 0xb0, 0xab, 0x3a, 0xfb, 0xaf, 0x2a, + 0x76, 0xb6, 0x0f, 0xbb, 0x6c, 0xb4, 0x2f, 0x66, 0x34, 0xe1, 0x96, 0x61, 0xde, 0x88, 0x6c, 0xea, + 0xd5, 0x21, 0x46, 0xe0, 0xa5, 0xe4, 0x6c, 0x7e, 0x70, 0x54, 0xce, 0x08, 0x6a, 0x5e, 0xd1, 0x98, + 0x92, 0x73, 0x9e, 0xdc, 0x85, 0xf9, 0xb6, 0x13, 0x46, 0xb7, 0xbb, 0x4d, 0x27, 0xa2, 0xdb, 0xae, + 0xf4, 0xd0, 0x18, 0x2d, 0x30, 0x40, 0x5f, 0x65, 0x6f, 0x26, 0x30, 0x61, 0x0a, 0x33, 0x39, 0x00, + 0xc2, 0x4a, 0xb6, 0x03, 0xc7, 0x0b, 0xc5, 0x57, 0x31, 0x7a, 0xa3, 0x07, 0x22, 0xe8, 0x93, 0xe1, + 0x66, 0x1f, 0x36, 0xcc, 0xa0, 0x40, 0x9e, 0x83, 0xa9, 0x80, 0x3a, 0xa1, 0x1c, 0xcc, 0x52, 0xbc, + 0xfe, 0x91, 0x97, 0xa2, 0x84, 0x9a, 0x0b, 0x6a, 0xea, 0x21, 0x0b, 0xea, 0x4f, 0x2d, 0x98, 0x8f, + 0x87, 0xe9, 0x31, 0xec, 0xac, 0x9d, 0xe4, 0xce, 0x7a, 0x3d, 0x2f, 0x91, 0x38, 0x60, 0x33, 0xfd, + 0x83, 0x29, 0xf3, 0xfb, 0xb8, 0x63, 0xf8, 0x17, 0xa1, 0xa4, 0x56, 0xb5, 0x52, 0x59, 0xc7, 0x3c, + 0x60, 0x27, 0x94, 0x19, 0x23, 0xa0, 0x49, 0x12, 0xc1, 0x98, 0x1e, 0xdb, 0xca, 0x9b, 0x72, 0x9b, + 0x96, 0xd3, 0x5e, 0x6f, 0xe5, 0x6a, 0xfb, 0xce, 0xda, 0xca, 0x55, 0x1b, 0x72, 0x1b, 0x2e, 0x76, + 0x03, 0x9f, 0x87, 0xd5, 0xae, 0x53, 0xa7, 0xd9, 0x76, 0x3d, 0xaa, 0xac, 0x18, 0xc2, 0x93, 0xe2, + 0xa9, 0xe3, 0xa3, 0xf2, 0xc5, 0x5a, 0x76, 0x15, 0x1c, 0xd4, 0x36, 0x19, 0x98, 0x35, 0x39, 0x44, + 0x60, 0xd6, 0xdf, 0xd1, 0xb6, 0x42, 0x1a, 0xca, 0xf0, 0xa8, 0xcf, 0xe5, 0x35, 0x94, 0x19, 0x62, + 0x3d, 0x9e, 0x52, 0x15, 0x49, 0x14, 0x35, 0xf9, 0xc1, 0x06, 0xa9, 0xa9, 0x47, 0x34, 0x48, 0xc5, + 0xfe, 0xf5, 0xd3, 0x3f, 0x49, 0xff, 0xfa, 0x99, 0x0f, 0x94, 0x7f, 0xfd, 0xfb, 0x45, 0x58, 0x4c, + 0x6b, 0x20, 0xa7, 0x1f, 0x74, 0xf6, 0xf7, 0x2c, 0x58, 0x54, 0xab, 0x47, 0xd0, 0xa4, 0xea, 0xaa, + 0x61, 0x33, 0xa7, 0x45, 0x2b, 0x74, 0x29, 0x1d, 0x8d, 0xbf, 0x9d, 0xa2, 0x86, 0x7d, 0xf4, 0xc9, + 0xdb, 0x30, 0xab, 0x2d, 0xf2, 0x8f, 0x14, 0x81, 0xb6, 0xc0, 0xb5, 0xa8, 0x18, 0x05, 0x9a, 0xf8, + 0xc8, 0xfb, 0x16, 0x40, 0x43, 0x6d, 0x73, 0x6a, 0x75, 0xdd, 0xca, 0x6b, 0x75, 0xe9, 0x0d, 0x34, + 0x56, 0x96, 0x75, 0x51, 0x88, 0x06, 0x61, 0xf2, 0x2b, 0xdc, 0x16, 0xaf, 0xb5, 0x3b, 0x11, 0xe5, + 0x3f, 0xb6, 0xef, 0xf0, 0x09, 0x8a, 0x69, 0xac, 0x4a, 0x19, 0xa0, 0x10, 0x13, 0x4c, 0xd8, 0xaf, + 0x82, 0xf6, 0xf6, 0x64, 0x62, 0x8b, 0xfb, 0x7b, 0xd6, 0x9c, 0x68, 0x4f, 0x4e, 0x41, 0x2d, 0xb6, + 0xae, 0x29, 0x00, 0xc6, 0x75, 0xec, 0x2f, 0xc0, 0xfc, 0xeb, 0x81, 0xd3, 0xdd, 0x73, 0xb9, 0xcd, + 0x9b, 0x9d, 0xad, 0x3e, 0x02, 0xd3, 0x4e, 0xb3, 0x99, 0x95, 0x38, 0xa2, 0x22, 0x8a, 0x51, 0xc1, + 0x87, 0x3a, 0x46, 0xd9, 0xdf, 0xb5, 0x80, 0xc4, 0xf7, 0x86, 0xae, 0xd7, 0xda, 0x72, 0xa2, 0xc6, + 0x1e, 0x3b, 0x1f, 0xed, 0xf1, 0xd2, 0xac, 0xf3, 0xd1, 0x75, 0x0d, 0x41, 0xa3, 0x16, 0x79, 0x17, + 0x66, 0xc5, 0xbf, 0xb7, 0xb4, 0x85, 0x60, 0xec, 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x9e, 0xc4, 0x2c, + 0xbc, 0x1e, 0x53, 0x40, 0x93, 0x1c, 0xeb, 0xaa, 0x0d, 0x6f, 0xb7, 0xdd, 0xbb, 0xdf, 0xdc, 0x89, + 0xbb, 0xaa, 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, 0xbb, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0xeb, + 0xaa, 0x7f, 0x63, 0xc1, 0xf9, 0x8d, 0x30, 0x72, 0xfd, 0x75, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0xc2, + 0xa7, 0xd7, 0x1e, 0xc6, 0x71, 0x7b, 0x1d, 0x16, 0xe5, 0x1d, 0x66, 0x6f, 0x27, 0xa4, 0x91, 0xa1, + 0xc7, 0xeb, 0x75, 0xbc, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0x5e, 0x66, 0xc6, 0x58, 0x0a, + 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2f, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0xa0, + 0x8b, 0x6f, 0x0c, 0x0a, 0xba, 0x18, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x72, 0xf1, 0x77, 0x2d, + 0x58, 0x68, 0x26, 0x7b, 0x3a, 0x1f, 0x9b, 0x4e, 0xd6, 0x18, 0x0a, 0x97, 0xad, 0x54, 0x21, 0xa6, + 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x21, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, 0xc7, 0x3a, + 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x27, 0xe4, 0x90, 0x9e, 0x46, 0x44, 0x01, 0xb9, 0x07, + 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xeb, 0xc2, 0x7d, 0x20, + 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, 0x39, 0x8a, + 0x6e, 0xaf, 0xd5, 0xd2, 0x84, 0x65, 0x09, 0x23, 0xac, 0x68, 0xd9, 0xbf, 0x65, 0x41, 0xe9, 0x86, + 0xaf, 0xe4, 0xc8, 0xcf, 0xe6, 0x60, 0xe8, 0xd1, 0xfa, 0xa0, 0xbe, 0xa6, 0x8c, 0x8f, 0x18, 0xaf, + 0x25, 0xcc, 0x3c, 0x4f, 0x1b, 0xb8, 0x57, 0x78, 0xfe, 0x2c, 0x86, 0xea, 0x86, 0xbf, 0x33, 0xd0, + 0xf4, 0xf8, 0x6b, 0x45, 0x38, 0xf3, 0x86, 0x73, 0x48, 0xbd, 0xc8, 0x19, 0x7d, 0x93, 0x78, 0x19, + 0x66, 0x9d, 0x2e, 0xbf, 0x07, 0x33, 0x74, 0xfc, 0xd8, 0x72, 0x12, 0x83, 0xd0, 0xac, 0x17, 0x0b, + 0x34, 0x91, 0x5d, 0x27, 0x4b, 0x14, 0xad, 0xa5, 0xe0, 0xd8, 0xd7, 0x82, 0xdc, 0x00, 0x22, 0xa3, + 0x51, 0x2b, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, 0xea, 0xab, + 0x81, 0x19, 0xad, 0xc8, 0xe7, 0x61, 0xa9, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, 0x1c, 0x3f, + 0x75, 0x9c, 0xc0, 0xda, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x51, + 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x04, 0xa5, 0x68, 0x2f, + 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0xbf, 0x85, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, 0x15, 0x56, + 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, + 0x6f, 0xe4, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, 0xfb, 0x13, + 0x30, 0x67, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xc5, 0x82, 0xb9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, + 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x9d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x19, + 0x4c, 0x10, 0x25, 0x5f, 0xb7, 0x60, 0x21, 0x76, 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x32, 0xa2, 0x45, + 0xfd, 0xd5, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x31, 0x3d, 0xda, 0xac, 0x2b, 0xbb, 0x8e, + 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0x6b, 0x4e, 0x18, 0x22, 0x87, 0x90, 0xe7, 0x61, 0xa6, 0xe3, 0x04, + 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, 0x1f, 0x87, + 0xb9, 0x2d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x69, 0xfb, 0xd1, 0x24, 0xcc, 0x1a, + 0x67, 0xb3, 0xd3, 0x3f, 0x67, 0x25, 0x52, 0x6a, 0x14, 0x72, 0x4c, 0xa9, 0xf1, 0x59, 0x80, 0x5d, + 0xd7, 0x73, 0xc3, 0xbd, 0x47, 0x4c, 0xd6, 0xc1, 0xef, 0x75, 0xaf, 0x69, 0x0c, 0x68, 0x60, 0x8b, + 0x2f, 0xcf, 0x8a, 0x27, 0x64, 0x9e, 0x7a, 0xdf, 0x32, 0xb6, 0x9b, 0xa9, 0x3c, 0x9c, 0x05, 0x8c, + 0x81, 0x59, 0x51, 0xdb, 0x8f, 0xc8, 0x35, 0x74, 0xd2, 0xae, 0xb4, 0x0d, 0x33, 0x01, 0x0d, 0x7b, + 0x1d, 0x76, 0x62, 0x9c, 0x1e, 0xb9, 0x1b, 0xb8, 0xdb, 0x06, 0xca, 0xf6, 0xa8, 0x31, 0x2d, 0xbf, + 0x0a, 0x67, 0x12, 0x2c, 0x8c, 0x94, 0x7d, 0xc8, 0x87, 0x4c, 0x03, 0xc0, 0xa3, 0x5c, 0xe6, 0xb0, + 0xb1, 0x68, 0x1b, 0xd9, 0x3a, 0xf4, 0x58, 0x08, 0xe7, 0x1c, 0x01, 0xb3, 0xff, 0x7c, 0x0a, 0xe4, + 0xfd, 0xf7, 0x10, 0xe2, 0xca, 0xbc, 0xf5, 0x9a, 0x78, 0x84, 0x5b, 0xaf, 0x1b, 0x30, 0xe7, 0x7a, + 0x6e, 0xe4, 0x3a, 0x6d, 0x6e, 0xdc, 0x91, 0xdb, 0xa9, 0xf2, 0x5e, 0x9e, 0xdb, 0x30, 0x60, 0x19, + 0x78, 0x12, 0x6d, 0xc9, 0x2d, 0x28, 0xf2, 0xfd, 0x46, 0x4e, 0xe0, 0xd1, 0x2f, 0xe9, 0xb9, 0x7f, + 0x86, 0x08, 0x69, 0x12, 0x98, 0xf8, 0xe1, 0x43, 0xa4, 0x2b, 0xd1, 0xc7, 0x6f, 0x39, 0x8f, 0xe3, + 0xc3, 0x47, 0x0a, 0x8e, 0x7d, 0x2d, 0x18, 0x96, 0x5d, 0xc7, 0x6d, 0xf7, 0x02, 0x1a, 0x63, 0x99, + 0x4a, 0x62, 0xb9, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0xb2, 0x0b, 0x73, 0xb2, 0x4c, 0xb8, 0x5c, 0x4d, + 0x3f, 0xe2, 0x57, 0x72, 0xd7, 0xba, 0x6b, 0x06, 0x26, 0x4c, 0xe0, 0x25, 0x3d, 0x38, 0xeb, 0x7a, + 0x0d, 0xdf, 0x6b, 0xb4, 0x7b, 0xa1, 0x7b, 0x40, 0xe3, 0x78, 0xa2, 0x47, 0x21, 0x76, 0xe1, 0xf8, + 0xa8, 0x7c, 0x76, 0x23, 0x8d, 0x0e, 0xfb, 0x29, 0x90, 0x2f, 0x5b, 0x70, 0xa1, 0xe1, 0x7b, 0x21, + 0x8f, 0xff, 0x3f, 0xa0, 0x57, 0x83, 0xc0, 0x0f, 0x04, 0xed, 0xd2, 0x23, 0xd2, 0xe6, 0x36, 0xc5, + 0xb5, 0x2c, 0x94, 0x98, 0x4d, 0x89, 0xbc, 0x03, 0x33, 0xdd, 0xc0, 0x3f, 0x70, 0x9b, 0x34, 0x90, + 0xee, 0x7b, 0x9b, 0x79, 0xe4, 0x23, 0xa9, 0x49, 0x9c, 0xb1, 0xe8, 0x51, 0x25, 0xa8, 0xe9, 0xd9, + 0xff, 0x7b, 0x16, 0xe6, 0x93, 0xd5, 0xc9, 0x2f, 0x00, 0x74, 0x03, 0xbf, 0x43, 0xa3, 0x3d, 0xaa, + 0xe3, 0x42, 0x6e, 0x8e, 0x9b, 0xf6, 0x42, 0xe1, 0x53, 0x2e, 0x2f, 0x4c, 0x5c, 0xc4, 0xa5, 0x68, + 0x50, 0x24, 0x01, 0x4c, 0xef, 0x8b, 0x6d, 0x57, 0x6a, 0x21, 0x6f, 0xe4, 0xa2, 0x33, 0x49, 0xca, + 0x3c, 0xa0, 0x41, 0x16, 0xa1, 0x22, 0x44, 0x76, 0xa0, 0x70, 0x8f, 0xee, 0xe4, 0x13, 0x73, 0x7d, + 0x87, 0xca, 0xd3, 0x4c, 0x75, 0xfa, 0xf8, 0xa8, 0x5c, 0xb8, 0x43, 0x77, 0x90, 0x21, 0x67, 0xdf, + 0xd5, 0x14, 0x77, 0xf7, 0x52, 0x54, 0x8c, 0xf9, 0x5d, 0x09, 0x47, 0x00, 0xf1, 0x5d, 0xb2, 0x08, + 0x15, 0x21, 0xf2, 0x0e, 0x94, 0xee, 0x39, 0x07, 0x74, 0x37, 0xf0, 0xbd, 0x48, 0xfa, 0x59, 0x8d, + 0x19, 0x2a, 0x70, 0x47, 0xa1, 0x93, 0x74, 0xf9, 0xf6, 0xae, 0x0b, 0x31, 0x26, 0x47, 0x0e, 0x60, + 0xc6, 0xa3, 0xf7, 0x90, 0xb6, 0xdd, 0x46, 0x3e, 0xae, 0xf9, 0x37, 0x25, 0x36, 0x49, 0x99, 0xef, + 0x7b, 0xaa, 0x0c, 0x35, 0x2d, 0x36, 0x96, 0x77, 0xfd, 0x1d, 0x29, 0xa8, 0xc6, 0x1c, 0x4b, 0x7d, + 0x32, 0x15, 0x63, 0x79, 0xc3, 0xdf, 0x41, 0x86, 0x9c, 0xad, 0x91, 0x86, 0x76, 0xf2, 0x91, 0x62, + 0xea, 0x66, 0xbe, 0xce, 0x4d, 0x62, 0x8d, 0xc4, 0xa5, 0x68, 0x50, 0x64, 0x7d, 0xdb, 0x92, 0xc6, + 0x4a, 0x29, 0xa8, 0xc6, 0xec, 0xdb, 0xa4, 0xe9, 0x53, 0xf4, 0xad, 0x2a, 0x43, 0x4d, 0x8b, 0xd1, + 0x75, 0xa5, 0xe5, 0x2f, 0x1f, 0x51, 0x95, 0xb4, 0x23, 0x0a, 0xba, 0xaa, 0x0c, 0x35, 0x2d, 0xd6, + 0xdf, 0xe1, 0xfe, 0xe1, 0x3d, 0xa7, 0xbd, 0xef, 0x7a, 0x2d, 0x19, 0xe7, 0x38, 0x6e, 0x76, 0xdb, + 0xfd, 0xc3, 0x3b, 0x02, 0x9f, 0xd9, 0xdf, 0x71, 0x29, 0x1a, 0x14, 0xc9, 0x3f, 0xb2, 0x60, 0xaa, + 0xdb, 0xee, 0xb5, 0x5c, 0x6f, 0x69, 0x8e, 0xeb, 0x89, 0x9f, 0xc9, 0x53, 0x42, 0xaf, 0xd4, 0x38, + 0x6a, 0xa1, 0x28, 0xfe, 0xb4, 0xf6, 0xd9, 0xe3, 0x85, 0xbf, 0xf4, 0x67, 0xe5, 0x25, 0xea, 0x35, + 0xfc, 0xa6, 0xeb, 0xb5, 0x56, 0xef, 0x86, 0xbe, 0xb7, 0x82, 0xce, 0x3d, 0xa5, 0xa3, 0x4b, 0x9e, + 0x96, 0x3f, 0x09, 0xb3, 0x06, 0x8a, 0x87, 0x29, 0x7a, 0x73, 0xa6, 0xa2, 0xf7, 0x5b, 0x53, 0x30, + 0x67, 0x66, 0xd4, 0x1b, 0x42, 0xfb, 0xd2, 0x27, 0x8e, 0x89, 0x51, 0x4e, 0x1c, 0xec, 0x88, 0x69, + 0xdc, 0x1e, 0x29, 0xf3, 0xd6, 0x46, 0x6e, 0x0a, 0x77, 0x7c, 0xc4, 0x34, 0x0a, 0x43, 0x4c, 0x10, + 0x1d, 0xc1, 0xa1, 0x84, 0xa9, 0xad, 0x42, 0xb1, 0x2b, 0x26, 0xd5, 0xd6, 0x84, 0xaa, 0xf6, 0x02, + 0x40, 0x9c, 0x59, 0x4e, 0xde, 0x2a, 0x6a, 0x7d, 0xd8, 0xc8, 0x78, 0x67, 0xd4, 0x22, 0xcf, 0xc1, + 0x14, 0x53, 0x7d, 0x68, 0x53, 0x86, 0x61, 0xeb, 0x73, 0xfc, 0x35, 0x5e, 0x8a, 0x12, 0x4a, 0x5e, + 0x61, 0x5a, 0x6a, 0xac, 0xb0, 0xc8, 0xe8, 0xea, 0xf3, 0xb1, 0x96, 0x1a, 0xc3, 0x30, 0x51, 0x93, + 0xb1, 0x4e, 0x99, 0x7e, 0xc1, 0x65, 0x83, 0xc1, 0x3a, 0x57, 0x3a, 0x50, 0xc0, 0xb8, 0x5d, 0x29, + 0xa5, 0x8f, 0xf0, 0x35, 0x5d, 0x34, 0xec, 0x4a, 0x29, 0x38, 0xf6, 0xb5, 0x60, 0x1f, 0x23, 0x2f, + 0x44, 0x67, 0x85, 0xb3, 0xed, 0x80, 0xab, 0xcc, 0xaf, 0x9a, 0x67, 0xad, 0x1c, 0xd7, 0x90, 0x98, + 0xb5, 0xc3, 0x1f, 0xb6, 0xc6, 0x3b, 0x16, 0x7d, 0x01, 0xe6, 0x93, 0xbb, 0x50, 0xee, 0x37, 0x1f, + 0x5f, 0x9b, 0x84, 0x73, 0x37, 0x5b, 0xae, 0x97, 0xce, 0x16, 0x95, 0x95, 0x2c, 0xdc, 0x1a, 0x39, + 0x59, 0xb8, 0x8e, 0xe7, 0x92, 0xa9, 0xb8, 0xb3, 0xe3, 0xb9, 0x54, 0x5e, 0xf4, 0x64, 0x5d, 0xf2, + 0xa7, 0x16, 0x3c, 0xed, 0x34, 0xc5, 0xb9, 0xc0, 0x69, 0xcb, 0x52, 0x23, 0xc7, 0xad, 0x5c, 0xd1, + 0xe1, 0x98, 0xbb, 0x7c, 0xff, 0xc7, 0xaf, 0x54, 0x4e, 0xa0, 0x2a, 0x46, 0xfc, 0xa7, 0xe4, 0x17, + 0x3c, 0x7d, 0x52, 0x55, 0x3c, 0x91, 0x7d, 0xf2, 0x37, 0x60, 0x21, 0xf1, 0xc1, 0xd2, 0x12, 0x5e, + 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0x75, 0x97, 0xdf, 0x84, 0x0f, 0x3f, 0x94, 0xcf, 0x91, + 0x26, 0xdb, 0x57, 0x2c, 0x28, 0x09, 0xbb, 0x36, 0xd2, 0xdd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, + 0xa9, 0x6d, 0x64, 0x38, 0x61, 0x32, 0x59, 0xbe, 0xef, 0x7a, 0x4d, 0x39, 0xca, 0x5a, 0x96, 0xbf, + 0xe1, 0x7a, 0x4d, 0xe4, 0x10, 0x2d, 0xed, 0x0b, 0x03, 0xed, 0x4d, 0xbf, 0x6e, 0xc1, 0x3c, 0x8f, + 0x81, 0x8d, 0xcf, 0x84, 0x2f, 0x6b, 0x67, 0x23, 0xc1, 0xc6, 0xa5, 0xa4, 0xb3, 0xd1, 0x83, 0xa3, + 0xf2, 0xac, 0x88, 0x9a, 0x4d, 0xfa, 0x1e, 0x7d, 0x4e, 0x1a, 0x92, 0xb8, 0x4b, 0xd4, 0xc4, 0xc8, + 0x76, 0x0e, 0x6d, 0x68, 0xad, 0x2b, 0x24, 0x18, 0xe3, 0xb3, 0xdf, 0x85, 0x39, 0x33, 0x98, 0x85, + 0xbc, 0x0c, 0xb3, 0x5d, 0xd7, 0x6b, 0x25, 0x83, 0x1e, 0xb5, 0xb1, 0xbd, 0x16, 0x83, 0xd0, 0xac, + 0xc7, 0x9b, 0xf9, 0x71, 0xb3, 0x94, 0x8d, 0xbe, 0xe6, 0x9b, 0xcd, 0xe2, 0x3f, 0x3c, 0xc7, 0x76, + 0x46, 0xd0, 0x54, 0xee, 0x39, 0xb6, 0x33, 0x68, 0xfc, 0xe4, 0x72, 0x6c, 0x67, 0x31, 0xf3, 0x7f, + 0x57, 0x8e, 0xed, 0x9f, 0x81, 0x51, 0x93, 0x2b, 0xb2, 0xfd, 0xee, 0x9e, 0x19, 0x98, 0xae, 0x7b, + 0x5c, 0x46, 0xa6, 0x4b, 0xa8, 0xfd, 0x1e, 0x5b, 0x36, 0xfa, 0x50, 0x5b, 0xe9, 0x45, 0x7b, 0xc4, + 0x83, 0x62, 0xe8, 0xb6, 0x0e, 0x5e, 0xca, 0xc9, 0xa6, 0xcd, 0x50, 0xc9, 0x87, 0x19, 0xe2, 0x80, + 0x58, 0x56, 0x88, 0x82, 0x8c, 0xfd, 0xdd, 0x09, 0x58, 0x4c, 0x9f, 0xbc, 0xf3, 0x76, 0x6a, 0x20, + 0x5f, 0xb7, 0x60, 0xde, 0xe9, 0x45, 0x7b, 0xd4, 0x8b, 0xd4, 0xc5, 0x56, 0x2e, 0x6f, 0x86, 0x24, + 0xfb, 0xce, 0x48, 0x61, 0x95, 0xa0, 0x85, 0x29, 0xda, 0xe4, 0xaf, 0xc0, 0x74, 0xe4, 0x76, 0xa8, + 0xdf, 0x13, 0xf6, 0xb8, 0x82, 0x38, 0x17, 0x6f, 0x8b, 0x22, 0x54, 0x30, 0xf2, 0x3c, 0x3b, 0xc7, + 0x30, 0x45, 0x26, 0xa0, 0xd2, 0xfb, 0x75, 0x31, 0x36, 0x20, 0x8a, 0x72, 0xd4, 0x35, 0xec, 0x8f, + 0xc3, 0x88, 0x69, 0x27, 0xed, 0xab, 0x40, 0xd0, 0x6f, 0xb7, 0x77, 0x9c, 0xc6, 0xfe, 0x1d, 0xd7, + 0x6b, 0xfa, 0xf7, 0xb8, 0x4c, 0x5a, 0x85, 0x52, 0x20, 0x63, 0x0f, 0x43, 0x39, 0x7d, 0xb4, 0x50, + 0x53, 0x41, 0x89, 0x21, 0xc6, 0x75, 0xec, 0x3f, 0x9c, 0x80, 0x69, 0x19, 0x28, 0xfb, 0x18, 0x7c, + 0xe0, 0xf7, 0x13, 0x97, 0xa3, 0x1b, 0xb9, 0xc4, 0xf7, 0x0e, 0x74, 0x80, 0x0f, 0x53, 0x0e, 0xf0, + 0x6f, 0xe4, 0x43, 0xee, 0x64, 0xef, 0xf7, 0x3f, 0x28, 0xc2, 0x42, 0x2a, 0xf0, 0x98, 0x29, 0xa6, + 0x7d, 0x4e, 0x9f, 0xb7, 0x73, 0x8d, 0x6d, 0xd6, 0x41, 0x1d, 0x27, 0xfb, 0x7f, 0x86, 0x89, 0x24, + 0xc1, 0xb7, 0x72, 0x7b, 0xff, 0xe0, 0x2f, 0xf3, 0x05, 0x8f, 0xe8, 0xcf, 0x48, 0xbe, 0x6d, 0xc1, + 0x39, 0xa7, 0xff, 0x01, 0x09, 0x69, 0x40, 0xbb, 0x95, 0xfb, 0xcb, 0x14, 0xd5, 0xa7, 0x24, 0x93, + 0x59, 0xef, 0x74, 0x60, 0x16, 0x2b, 0xf6, 0x7f, 0xb6, 0xe0, 0xc9, 0x81, 0x21, 0xf4, 0x3c, 0x03, + 0x53, 0x90, 0x84, 0x4a, 0x99, 0x91, 0x73, 0xa2, 0x10, 0x7d, 0x99, 0x9a, 0x4e, 0x9a, 0x93, 0x26, + 0x4f, 0x5e, 0x82, 0x39, 0xae, 0xac, 0x31, 0xe9, 0x19, 0xd1, 0xae, 0xbc, 0x0b, 0xe2, 0xb7, 0x02, + 0x75, 0xa3, 0x1c, 0x13, 0xb5, 0xec, 0x6f, 0x5b, 0xb0, 0x34, 0x28, 0x1f, 0xcf, 0x10, 0x96, 0x8a, + 0xbf, 0x9e, 0x8a, 0x23, 0x28, 0xf7, 0xc5, 0x11, 0xa4, 0x6c, 0x15, 0x2a, 0x64, 0xc0, 0x30, 0x13, + 0x14, 0x1e, 0xe2, 0x26, 0xff, 0x0d, 0x0b, 0x2e, 0x0e, 0x58, 0xf0, 0x7d, 0xf1, 0x24, 0xd6, 0x23, + 0xc7, 0x93, 0x4c, 0x0c, 0x1b, 0x4f, 0x62, 0xff, 0x51, 0x01, 0x16, 0x25, 0x3f, 0xb1, 0xc6, 0xfe, + 0x4a, 0x22, 0x1a, 0xe3, 0xa7, 0x52, 0xd1, 0x18, 0xe7, 0xd3, 0xf5, 0xff, 0x32, 0x14, 0xe3, 0x83, + 0x15, 0x8a, 0xf1, 0x17, 0x13, 0x70, 0x21, 0x33, 0x4d, 0x10, 0xf9, 0x5a, 0xc6, 0xee, 0x75, 0x27, + 0xe7, 0x7c, 0x44, 0x43, 0xee, 0x5f, 0xe3, 0xc6, 0x2f, 0xfc, 0xaa, 0x19, 0x37, 0x20, 0x76, 0xa3, + 0xdd, 0x53, 0xc8, 0xac, 0x34, 0x62, 0x08, 0x81, 0xfd, 0x4b, 0x05, 0xb8, 0x32, 0x2c, 0xa2, 0x0f, + 0x68, 0x88, 0x59, 0x98, 0x08, 0x31, 0x7b, 0x4c, 0x9a, 0xc5, 0xa9, 0x44, 0x9b, 0xfd, 0x93, 0x49, + 0xbd, 0xed, 0xf5, 0xcf, 0xcf, 0xa1, 0x1c, 0x07, 0xa6, 0x99, 0xf6, 0xa9, 0x52, 0x0d, 0xc7, 0xa2, + 0x70, 0xba, 0x2e, 0x8a, 0x1f, 0x1c, 0x95, 0xcf, 0xc6, 0xc9, 0x2a, 0x64, 0x21, 0xaa, 0x46, 0xe4, + 0x0a, 0xcc, 0x04, 0x02, 0xaa, 0x82, 0x6a, 0xa4, 0xf7, 0x85, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x32, + 0xd4, 0xf5, 0xc9, 0xd3, 0xca, 0xc9, 0x72, 0x92, 0x53, 0xc9, 0xdb, 0x30, 0x13, 0xaa, 0x34, 0xc0, + 0x42, 0x71, 0x79, 0x71, 0xc8, 0x58, 0x2d, 0x76, 0x18, 0x57, 0x39, 0x81, 0xc5, 0xf7, 0xe9, 0x8c, + 0xc1, 0x1a, 0x25, 0xb1, 0xf5, 0x39, 0x58, 0x18, 0xbd, 0xa1, 0xff, 0x0c, 0x4c, 0x22, 0x98, 0x96, + 0xcf, 0x24, 0xca, 0xdb, 0xb8, 0xad, 0x9c, 0xe2, 0x32, 0xa4, 0xd7, 0x2e, 0x3f, 0xdb, 0x29, 0x7b, + 0x8c, 0x22, 0x65, 0xff, 0xc0, 0x82, 0x59, 0x39, 0x47, 0x1e, 0x43, 0xd0, 0xda, 0xdd, 0x64, 0xd0, + 0xda, 0xd5, 0x5c, 0x24, 0xd6, 0x80, 0x88, 0xb5, 0xbb, 0x30, 0x67, 0xe6, 0xa7, 0x23, 0x9f, 0x35, + 0x24, 0xae, 0x35, 0x4e, 0xc6, 0x27, 0x25, 0x93, 0x63, 0x69, 0x6c, 0xff, 0x76, 0x49, 0xf7, 0x22, + 0x3f, 0xbb, 0x9a, 0x33, 0xdf, 0x3a, 0x71, 0xe6, 0x9b, 0x13, 0x6f, 0x22, 0xff, 0x89, 0x77, 0x0b, + 0x66, 0x94, 0x58, 0x94, 0xca, 0xc3, 0xb3, 0xa6, 0x1b, 0x2f, 0xd3, 0x40, 0x18, 0x32, 0x63, 0xb9, + 0xf0, 0x33, 0xa8, 0x1e, 0x43, 0x2d, 0xae, 0x35, 0x1a, 0xf2, 0x0e, 0xcc, 0xde, 0xf3, 0x83, 0xfd, + 0xb6, 0xef, 0xf0, 0x24, 0xe4, 0x90, 0xc7, 0xcd, 0xb1, 0x36, 0xdc, 0x8a, 0x58, 0x8a, 0x3b, 0x31, + 0x7e, 0x34, 0x89, 0x91, 0x0a, 0x2c, 0x74, 0x5c, 0x0f, 0xa9, 0xd3, 0xd4, 0xb1, 0x69, 0x93, 0x22, + 0xef, 0xb1, 0x52, 0xad, 0xb7, 0x92, 0x60, 0x4c, 0xd7, 0xe7, 0x26, 0x98, 0x20, 0x61, 0x6d, 0x90, + 0xc9, 0x4d, 0x6b, 0xe3, 0x4f, 0xc6, 0xa4, 0x05, 0x43, 0x04, 0x13, 0x24, 0xcb, 0x31, 0x45, 0x9b, + 0x7c, 0x11, 0x66, 0x42, 0x99, 0x7c, 0x2e, 0x1f, 0x97, 0x03, 0x7d, 0xb6, 0x17, 0x48, 0xe3, 0xa1, + 0x54, 0x25, 0xa8, 0x09, 0x92, 0x4d, 0x38, 0xaf, 0xcc, 0x27, 0x89, 0x87, 0xa2, 0xa6, 0xe2, 0x5c, + 0x45, 0x98, 0x01, 0xc7, 0xcc, 0x56, 0x4c, 0x95, 0xe3, 0x79, 0x1f, 0xc5, 0x4d, 0x9d, 0x71, 0xb9, + 0xc5, 0xd7, 0x5f, 0x13, 0x25, 0xf4, 0xa4, 0xd0, 0xcb, 0x99, 0x31, 0x42, 0x2f, 0xeb, 0x70, 0x21, + 0x0d, 0xe2, 0x49, 0xa8, 0x78, 0xde, 0x2b, 0x63, 0x0b, 0xad, 0x65, 0x55, 0xc2, 0xec, 0xb6, 0xe4, + 0x0e, 0x94, 0x02, 0xca, 0x0f, 0x59, 0x15, 0xe5, 0xe4, 0x34, 0xb2, 0x3b, 0x27, 0x2a, 0x04, 0x18, + 0xe3, 0x62, 0xe3, 0xee, 0x24, 0x33, 0x11, 0xdf, 0xca, 0xf1, 0x85, 0x52, 0x39, 0xf6, 0x03, 0x92, + 0xc3, 0xd9, 0xff, 0x76, 0x01, 0xce, 0x24, 0x6c, 0x40, 0xe4, 0x59, 0x28, 0xf2, 0xac, 0x5c, 0x5c, + 0x5a, 0xcd, 0xc4, 0x12, 0x55, 0x74, 0x8e, 0x80, 0x91, 0x5f, 0xb6, 0x60, 0xa1, 0x9b, 0xb8, 0xdc, + 0x50, 0x82, 0x7c, 0x5c, 0xf3, 0x65, 0x02, 0xa9, 0x91, 0xc3, 0x3f, 0x49, 0x0c, 0xd3, 0xd4, 0x99, + 0x3c, 0x90, 0x3e, 0xd1, 0x6d, 0x1a, 0xf0, 0xda, 0x52, 0xd1, 0xd3, 0x28, 0xd6, 0x92, 0x60, 0x4c, + 0xd7, 0x67, 0x23, 0xcc, 0xbf, 0x6e, 0x9c, 0x37, 0xf0, 0x2a, 0x0a, 0x01, 0xc6, 0xb8, 0xc8, 0x6b, + 0x30, 0x2f, 0x13, 0xd0, 0xd6, 0xfc, 0xe6, 0x75, 0x27, 0xdc, 0x93, 0x27, 0x1c, 0x7d, 0x22, 0x5b, + 0x4b, 0x40, 0x31, 0x55, 0x9b, 0x7f, 0x5b, 0x9c, 0xe5, 0x97, 0x23, 0x98, 0x4a, 0x3e, 0x71, 0xb0, + 0x96, 0x04, 0x63, 0xba, 0x3e, 0x79, 0xde, 0xd8, 0x86, 0xc4, 0xed, 0xb9, 0x96, 0x06, 0x19, 0x5b, + 0x51, 0x05, 0x16, 0x7a, 0xfc, 0x40, 0xd8, 0x54, 0x40, 0xb9, 0x1e, 0x35, 0xc1, 0xdb, 0x49, 0x30, + 0xa6, 0xeb, 0x93, 0x57, 0xe1, 0x4c, 0xc0, 0x84, 0xad, 0x46, 0x20, 0xae, 0xd4, 0xf5, 0x8d, 0x29, + 0x9a, 0x40, 0x4c, 0xd6, 0x25, 0xaf, 0xc3, 0xd9, 0x38, 0x5f, 0xa3, 0x42, 0x20, 0xee, 0xd8, 0x75, + 0xf2, 0xb0, 0x4a, 0xba, 0x02, 0xf6, 0xb7, 0x21, 0x7f, 0x0b, 0x16, 0x8d, 0x9e, 0xd8, 0xf0, 0x9a, + 0xf4, 0xbe, 0xcc, 0xa9, 0xc7, 0xdf, 0xae, 0x59, 0x4b, 0xc1, 0xb0, 0xaf, 0x36, 0xf9, 0x14, 0xcc, + 0x37, 0xfc, 0x76, 0x9b, 0xcb, 0x38, 0x91, 0x5e, 0x5f, 0x24, 0xcf, 0x13, 0x69, 0x06, 0x13, 0x10, + 0x4c, 0xd5, 0x24, 0x37, 0x80, 0xf8, 0x3b, 0x4c, 0xbd, 0xa2, 0xcd, 0xd7, 0xc5, 0x23, 0xeb, 0x4c, + 0xe3, 0x38, 0x93, 0x8c, 0xc8, 0x78, 0xb3, 0xaf, 0x06, 0x66, 0xb4, 0xe2, 0xb9, 0xc7, 0x8c, 0x08, + 0xd6, 0xf9, 0x3c, 0xde, 0x83, 0x4b, 0x9b, 0x2f, 0x1e, 0x1a, 0xbe, 0x1a, 0xc0, 0x94, 0x08, 0x90, + 0xc9, 0x27, 0x8b, 0x9e, 0x99, 0x69, 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4a, 0xe4, 0x17, 0xa0, + 0xb4, 0xa3, 0x9e, 0x5d, 0xe0, 0xa9, 0xf3, 0xc6, 0xde, 0x17, 0x53, 0x2f, 0x88, 0xc4, 0xc7, 0x73, + 0x0d, 0xc0, 0x98, 0x24, 0x79, 0x0e, 0x66, 0xaf, 0xd7, 0x2a, 0x7a, 0x16, 0x9e, 0xe5, 0xa3, 0x3f, + 0xc9, 0x9a, 0xa0, 0x09, 0x60, 0x2b, 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0x92, 0x49, 0x86, 0x36, 0xc6, + 0x6a, 0xf3, 0x7b, 0x70, 0xac, 0x2f, 0x9d, 0x4b, 0xd5, 0x96, 0xe5, 0xa8, 0x6b, 0x90, 0xb7, 0x61, + 0x56, 0xee, 0x17, 0x5c, 0x36, 0x9d, 0x7f, 0xb4, 0xe8, 0x68, 0x8c, 0x51, 0xa0, 0x89, 0x8f, 0x5f, + 0xde, 0xf2, 0x6c, 0xf4, 0xf4, 0x5a, 0xaf, 0xdd, 0x5e, 0xba, 0xc0, 0xe5, 0x66, 0x7c, 0x79, 0x1b, + 0x83, 0xd0, 0xac, 0x47, 0x5e, 0x54, 0xfe, 0x4c, 0x1f, 0x4a, 0xdc, 0x66, 0x6b, 0x7f, 0x26, 0xad, + 0x74, 0x0f, 0x08, 0xa0, 0xb8, 0xf8, 0x10, 0x47, 0xa2, 0x1d, 0x58, 0x56, 0x1a, 0x5f, 0xff, 0x22, + 0x59, 0x5a, 0x4a, 0x98, 0x4a, 0x96, 0xef, 0x0c, 0xac, 0x89, 0x27, 0x60, 0x21, 0x3b, 0x50, 0x70, + 0xda, 0x3b, 0x4b, 0x4f, 0xe6, 0xa1, 0xba, 0x56, 0x36, 0xab, 0x72, 0x46, 0x71, 0xa7, 0xc7, 0xca, + 0x66, 0x15, 0x19, 0x72, 0xe2, 0xc2, 0xa4, 0xd3, 0xde, 0x09, 0x97, 0x96, 0xf9, 0x9a, 0xcd, 0x8d, + 0x48, 0x6c, 0x3c, 0xd8, 0xac, 0x86, 0xc8, 0x49, 0xd8, 0x5f, 0x9e, 0xd0, 0x17, 0x35, 0x3a, 0x91, + 0xf1, 0xbb, 0xe6, 0x02, 0xb2, 0xf2, 0x78, 0x27, 0xbc, 0xef, 0x19, 0x14, 0xb1, 0xf7, 0x65, 0x2e, + 0x9f, 0xae, 0x16, 0x19, 0xb9, 0xa4, 0x88, 0x4a, 0x26, 0x69, 0x16, 0xa7, 0xe7, 0xa4, 0xc0, 0xb0, + 0x7f, 0x17, 0xb4, 0xd1, 0x2f, 0xe5, 0x0b, 0x14, 0x40, 0xd1, 0x0d, 0x23, 0xd7, 0xcf, 0x31, 0x68, + 0x38, 0x95, 0xdd, 0x98, 0xc7, 0x24, 0x70, 0x00, 0x0a, 0x52, 0x8c, 0xa6, 0xd7, 0x72, 0xbd, 0xfb, + 0xf2, 0xf3, 0x6f, 0xe5, 0xee, 0xe4, 0x23, 0x68, 0x72, 0x00, 0x0a, 0x52, 0xe4, 0xae, 0x98, 0xd4, + 0xf9, 0xbc, 0x09, 0xbf, 0x59, 0x4d, 0xd1, 0x4b, 0x4e, 0xee, 0xbb, 0x50, 0x08, 0x3b, 0xae, 0x54, + 0x97, 0xc6, 0xa4, 0x55, 0xdf, 0xda, 0xc8, 0xa2, 0x55, 0xdf, 0xda, 0x40, 0x46, 0x84, 0x7c, 0xd5, + 0x02, 0x70, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x6d, 0x9d, 0x19, 0xf3, 0xd5, 0x82, 0x8a, 0xc6, + 0x97, 0x22, 0xcd, 0xdd, 0x5a, 0x63, 0x28, 0x1a, 0x94, 0xc9, 0x3b, 0x30, 0xed, 0x88, 0xf7, 0xd1, + 0xa4, 0x87, 0x76, 0x3e, 0x8f, 0xfe, 0xa5, 0x38, 0xe0, 0x66, 0x1a, 0x09, 0x42, 0x45, 0x90, 0xd1, + 0x8e, 0x02, 0x87, 0xee, 0xba, 0xfb, 0xd2, 0x38, 0x54, 0x1f, 0xfb, 0xe1, 0x02, 0x86, 0x2c, 0x8b, + 0xb6, 0x04, 0xa1, 0x22, 0x28, 0xde, 0xab, 0x76, 0x3c, 0x47, 0xc7, 0xdd, 0xe5, 0x13, 0x9d, 0x69, + 0x46, 0xf2, 0x19, 0xef, 0x55, 0x9b, 0x84, 0x30, 0x49, 0x97, 0x1c, 0xc0, 0x94, 0xc3, 0x5f, 0x6e, + 0x94, 0x47, 0x31, 0xcc, 0xe3, 0x15, 0xc8, 0x54, 0x1f, 0x70, 0xe1, 0x22, 0xdf, 0x87, 0x94, 0xd4, + 0xc8, 0x6f, 0x58, 0x30, 0x2d, 0x9c, 0x87, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x0b, 0xa7, 0x90, 0x25, + 0x5d, 0x3a, 0x36, 0x4b, 0x57, 0xa0, 0x8f, 0x6a, 0xcf, 0x48, 0x51, 0x7a, 0xa2, 0x6b, 0xb3, 0xe2, + 0x6e, 0xf9, 0x53, 0x30, 0x67, 0x62, 0x19, 0xc9, 0xb9, 0xf9, 0xc7, 0x05, 0x00, 0xde, 0xd1, 0x22, + 0xd3, 0x46, 0x87, 0xa7, 0x74, 0xdd, 0xf3, 0x9b, 0xf9, 0x3c, 0xb9, 0x69, 0x26, 0xcc, 0x00, 0x99, + 0xbf, 0x75, 0xcf, 0x6f, 0xa2, 0x24, 0x42, 0x5a, 0x30, 0xd9, 0x75, 0xa2, 0xbd, 0xfc, 0xb3, 0x73, + 0xcc, 0x88, 0x90, 0xd3, 0x68, 0x0f, 0x39, 0x01, 0xf2, 0x9e, 0x05, 0xd3, 0x22, 0x3f, 0x87, 0xba, + 0x38, 0x19, 0xdb, 0x81, 0x41, 0xf5, 0xd9, 0x8a, 0x48, 0x02, 0x22, 0x47, 0x50, 0xeb, 0x38, 0xb2, + 0x14, 0x15, 0xd9, 0xe5, 0xf7, 0x2d, 0x98, 0x33, 0xab, 0x66, 0x0c, 0xd3, 0xcf, 0x99, 0xc3, 0x94, + 0x67, 0x7f, 0x98, 0x23, 0xfe, 0xdf, 0x2c, 0x30, 0xde, 0x50, 0x8f, 0x7d, 0xb8, 0xad, 0xa1, 0x7d, + 0xb8, 0x27, 0x46, 0xf4, 0xe1, 0x2e, 0x8c, 0xe4, 0xc3, 0x3d, 0x39, 0xba, 0x0f, 0x77, 0x71, 0xb0, + 0x0f, 0xb7, 0xfd, 0x4d, 0x0b, 0xce, 0xf6, 0xed, 0x36, 0x4c, 0x0f, 0x0e, 0x7c, 0x3f, 0x1a, 0xe0, + 0xfb, 0x88, 0x31, 0x08, 0xcd, 0x7a, 0x64, 0x1d, 0x16, 0xe5, 0x03, 0x06, 0xf5, 0x6e, 0xdb, 0xcd, + 0xcc, 0x9c, 0xb2, 0x9d, 0x82, 0x63, 0x5f, 0x0b, 0xfb, 0x77, 0x2d, 0x98, 0x35, 0xe2, 0xad, 0xd9, + 0x77, 0xf0, 0xb8, 0x74, 0xc9, 0x46, 0xec, 0xaa, 0xc6, 0x2f, 0xaa, 0x04, 0x4c, 0xdc, 0x99, 0xb6, + 0x8c, 0xf4, 0xd6, 0xf1, 0x9d, 0x29, 0x2b, 0x45, 0x09, 0x15, 0x89, 0x8b, 0x69, 0x97, 0x77, 0x7a, + 0xc1, 0x4c, 0x5c, 0x4c, 0xbb, 0xc8, 0x21, 0x9c, 0x1c, 0x3b, 0x10, 0x48, 0xf7, 0x7e, 0xe3, 0xa9, + 0x08, 0x27, 0x88, 0x50, 0xc0, 0xc8, 0x25, 0x28, 0x50, 0xaf, 0x29, 0xad, 0x17, 0xfa, 0x31, 0xc7, + 0xab, 0x5e, 0x13, 0x59, 0xb9, 0xfd, 0x26, 0xcc, 0xd5, 0x69, 0x23, 0xa0, 0xd1, 0x1b, 0xf4, 0x70, + 0xe8, 0xd7, 0x21, 0xd9, 0x6c, 0x4f, 0xbd, 0x0e, 0xc9, 0x9a, 0xb3, 0x72, 0xfb, 0x9f, 0x59, 0x90, + 0x7a, 0xcf, 0xc4, 0xb8, 0x3f, 0xb1, 0x06, 0xde, 0x9f, 0x98, 0x36, 0xf7, 0x89, 0x13, 0x6d, 0xee, + 0x37, 0x80, 0x74, 0xd8, 0x52, 0x48, 0xbc, 0xde, 0x23, 0x0d, 0x47, 0x71, 0x76, 0x87, 0xbe, 0x1a, + 0x98, 0xd1, 0xca, 0xfe, 0xa7, 0x82, 0x59, 0xf3, 0x85, 0x93, 0x87, 0x77, 0x40, 0x0f, 0x8a, 0x1c, + 0x95, 0xb4, 0x9e, 0x8d, 0x69, 0x79, 0xee, 0xcf, 0x92, 0x14, 0x0f, 0xa4, 0x5c, 0xf2, 0x9c, 0x9a, + 0xfd, 0x47, 0x82, 0x57, 0xe3, 0x09, 0x94, 0x21, 0x78, 0xed, 0x24, 0x79, 0xbd, 0x9e, 0x97, 0xac, + 0xcc, 0xe6, 0x91, 0xac, 0x00, 0x74, 0x69, 0xd0, 0xa0, 0x5e, 0xa4, 0xa2, 0x4e, 0x8a, 0x32, 0xfe, + 0x51, 0x97, 0xa2, 0x51, 0xc3, 0xfe, 0x06, 0x5b, 0x40, 0xb1, 0x73, 0x27, 0xb9, 0x92, 0xf6, 0xd8, + 0x4c, 0x2f, 0x0e, 0xed, 0xb0, 0x69, 0xc4, 0x22, 0x4c, 0x3c, 0x24, 0x16, 0xe1, 0x23, 0x30, 0x1d, + 0xf8, 0x6d, 0x5a, 0x09, 0xbc, 0xb4, 0x83, 0x0b, 0xb2, 0x62, 0xbc, 0x89, 0x0a, 0x6e, 0xff, 0x9a, + 0x05, 0x8b, 0xe9, 0x60, 0xa9, 0xdc, 0xdd, 0x48, 0xcd, 0x88, 0xee, 0xc2, 0xe8, 0x11, 0xdd, 0xf6, + 0x7b, 0x8c, 0xc9, 0xc8, 0x6d, 0xec, 0xbb, 0x9e, 0x08, 0x82, 0x66, 0x3d, 0xf7, 0x11, 0x98, 0xa6, + 0xf2, 0xfd, 0x47, 0x61, 0x04, 0xd6, 0x4c, 0xaa, 0x67, 0x1f, 0x15, 0x9c, 0x54, 0x60, 0x41, 0x5d, + 0x7d, 0x29, 0xcb, 0xbd, 0x48, 0xde, 0xa0, 0x2d, 0x85, 0xeb, 0x49, 0x30, 0xa6, 0xeb, 0xdb, 0x5f, + 0x82, 0x59, 0x63, 0x53, 0xe2, 0xf2, 0xfb, 0xbe, 0xd3, 0x88, 0xd2, 0x72, 0xef, 0x2a, 0x2b, 0x44, + 0x01, 0xe3, 0x17, 0x0c, 0x22, 0x96, 0x23, 0x25, 0xf7, 0x64, 0x04, 0x87, 0x84, 0x32, 0x64, 0x01, + 0x6d, 0xd1, 0xfb, 0x2a, 0xfb, 0xb8, 0x42, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x1e, 0x66, 0x54, + 0x8a, 0x1d, 0x9e, 0xa7, 0x42, 0x19, 0xbf, 0xcd, 0x3c, 0x15, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, + 0xc1, 0x8c, 0xca, 0x04, 0xf4, 0xf0, 0xda, 0x4c, 0x14, 0x85, 0x9e, 0x7b, 0xdd, 0x0f, 0x23, 0x95, + 0xbe, 0x48, 0xdc, 0xcf, 0xdd, 0xdc, 0xe0, 0x65, 0xa8, 0xa1, 0xf6, 0x8b, 0xb0, 0x90, 0xba, 0xa7, + 0x1d, 0x22, 0xa9, 0xc5, 0xef, 0x17, 0x60, 0xce, 0xbc, 0xae, 0x1b, 0x62, 0x15, 0x0f, 0x2f, 0x1c, + 0x33, 0xae, 0xd8, 0x0a, 0x23, 0x5e, 0xb1, 0x99, 0x77, 0x9a, 0x93, 0xa7, 0x7b, 0xa7, 0x59, 0xcc, + 0xe7, 0x4e, 0xd3, 0xb8, 0x7b, 0x9f, 0x7a, 0x7c, 0x77, 0xef, 0xbf, 0x53, 0x84, 0xf9, 0x64, 0x96, + 0xc4, 0x21, 0x46, 0xf2, 0xf9, 0xbe, 0x91, 0x1c, 0xd1, 0xa6, 0x5f, 0x18, 0xd7, 0xa6, 0x3f, 0x39, + 0xae, 0x4d, 0xbf, 0xf8, 0x08, 0x36, 0xfd, 0x7e, 0x8b, 0xfc, 0xd4, 0xd0, 0x16, 0xf9, 0x4f, 0x6b, + 0xaf, 0xbc, 0xe9, 0x84, 0x1b, 0x4b, 0xec, 0x95, 0x47, 0x92, 0xc3, 0xb0, 0xe6, 0x37, 0x33, 0xbd, + 0x1b, 0x67, 0x1e, 0x62, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, 0x0e, + 0x74, 0x2f, 0xc3, 0xac, 0x9c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, 0xd6, + 0xe3, 0x0f, 0x68, 0x27, 0xdf, 0x17, 0xe7, 0x57, 0x24, 0xe6, 0x03, 0xda, 0xa9, 0xf7, 0xc8, 0xd3, + 0xf5, 0xed, 0x2f, 0xc2, 0x85, 0x4c, 0x33, 0x02, 0x37, 0xe1, 0x72, 0xed, 0x88, 0x36, 0x65, 0x05, + 0x83, 0x8d, 0x54, 0xe2, 0xfd, 0xe5, 0x3b, 0x03, 0x6b, 0xe2, 0x09, 0x58, 0xec, 0xef, 0x14, 0x60, + 0x3e, 0xf9, 0xfa, 0x22, 0xb9, 0xa7, 0x8d, 0x8e, 0xb9, 0xd8, 0x3b, 0x05, 0x5a, 0x23, 0xf3, 0xde, + 0xc0, 0xcb, 0x8a, 0x7b, 0x7c, 0x7e, 0xed, 0xe8, 0x34, 0x80, 0xa7, 0x47, 0x58, 0xde, 0x12, 0x48, + 0x72, 0xfc, 0x81, 0xc5, 0x38, 0x48, 0x4f, 0x9e, 0x66, 0x73, 0xa7, 0x1e, 0xc7, 0xcd, 0x69, 0x52, + 0x68, 0x90, 0x65, 0x7b, 0xcb, 0x01, 0x0d, 0xdc, 0x5d, 0x57, 0xbf, 0x1c, 0xcd, 0x25, 0xf7, 0x5b, + 0xb2, 0x0c, 0x35, 0xd4, 0x7e, 0x6f, 0x02, 0xe2, 0x57, 0xf5, 0xf9, 0x13, 0x65, 0xa1, 0x71, 0x72, + 0x90, 0xc3, 0x76, 0x63, 0xdc, 0x77, 0x00, 0x63, 0x8c, 0xd2, 0x63, 0xda, 0x28, 0xc1, 0x04, 0xc5, + 0x9f, 0xc0, 0x6b, 0xfa, 0x0e, 0x2c, 0xa4, 0x92, 0x42, 0xe4, 0x9e, 0x39, 0xf5, 0x47, 0x05, 0x28, + 0xe9, 0xb4, 0x1a, 0xe4, 0x93, 0x09, 0x33, 0x4e, 0xa9, 0xfa, 0x61, 0xe3, 0xfd, 0x9c, 0x3d, 0xbf, + 0xf9, 0xe0, 0xa8, 0xbc, 0xa0, 0x2b, 0xa7, 0x4c, 0x32, 0x97, 0xa0, 0xd0, 0x0b, 0xda, 0xe9, 0x73, + 0xda, 0x6d, 0xdc, 0x44, 0x56, 0x4e, 0xee, 0xa7, 0xed, 0x28, 0x5b, 0x39, 0xa5, 0x02, 0x11, 0x07, + 0x9a, 0xc1, 0xf6, 0x13, 0xb6, 0x4b, 0xee, 0xf8, 0xcd, 0xc3, 0xf4, 0x7b, 0x3b, 0x55, 0xbf, 0x79, + 0x88, 0x1c, 0x42, 0x5e, 0x83, 0x79, 0x19, 0xbd, 0x64, 0xbe, 0x42, 0x5e, 0x88, 0x2f, 0xdf, 0xb7, + 0x13, 0x50, 0x4c, 0xd5, 0x66, 0xbb, 0xec, 0xdd, 0xd0, 0xf7, 0x78, 0x3e, 0xdc, 0xa9, 0xe4, 0x4d, + 0xdd, 0x8d, 0xfa, 0x9b, 0x37, 0xb9, 0x39, 0x49, 0xd7, 0x48, 0x04, 0x48, 0x4d, 0x3f, 0x2c, 0x40, + 0x8a, 0xac, 0x0b, 0xdc, 0x8c, 0x5b, 0xbe, 0xa3, 0xcc, 0x55, 0xaf, 0x28, 0xbc, 0xac, 0xec, 0xc1, + 0xd1, 0x09, 0x86, 0x3e, 0xdd, 0xd2, 0xbe, 0x0d, 0x0b, 0xa9, 0x0e, 0x53, 0xe7, 0x6a, 0x2b, 0xfb, + 0x5c, 0x3d, 0xdc, 0x13, 0x39, 0xff, 0xc2, 0x82, 0xb3, 0x7d, 0x22, 0x60, 0xd8, 0x38, 0xbe, 0xf4, + 0x66, 0x34, 0xf1, 0xe8, 0x9b, 0x51, 0x61, 0xb4, 0xcd, 0xa8, 0xba, 0xf3, 0xbd, 0x1f, 0x5e, 0x7e, + 0xe2, 0xfb, 0x3f, 0xbc, 0xfc, 0xc4, 0x1f, 0xff, 0xf0, 0xf2, 0x13, 0xef, 0x1d, 0x5f, 0xb6, 0xbe, + 0x77, 0x7c, 0xd9, 0xfa, 0xfe, 0xf1, 0x65, 0xeb, 0x8f, 0x8f, 0x2f, 0x5b, 0xff, 0xe9, 0xf8, 0xb2, + 0xf5, 0xcd, 0x1f, 0x5d, 0x7e, 0xe2, 0xb3, 0x9f, 0x8e, 0x27, 0xe8, 0xaa, 0x9a, 0xa0, 0xfc, 0xc7, + 0xc7, 0xd4, 0x74, 0x5c, 0xed, 0xee, 0xb7, 0x56, 0xd9, 0x04, 0x5d, 0xd5, 0x25, 0x6a, 0x82, 0xfe, + 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xbb, 0x6e, 0x5a, 0xfc, 0x9e, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7762,6 +7762,14 @@ func (m *PrometheusMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i-- + if m.Insecure { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 if m.Timeout != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.Timeout)) i-- @@ -11559,6 +11567,7 @@ func (m *PrometheusMetric) Size() (n int) { if m.Timeout != nil { n += 1 + sovGenerated(uint64(*m.Timeout)) } + n += 2 return n } @@ -13516,6 +13525,7 @@ func (this *PrometheusMetric) String() string { `Query:` + fmt.Sprintf("%v", this.Query) + `,`, `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "PrometheusAuth", "PrometheusAuth", 1), `&`, ``, 1) + `,`, `Timeout:` + valueToStringGenerated(this.Timeout) + `,`, + `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, `}`, }, "") return s @@ -26799,6 +26809,26 @@ func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { } } m.Timeout = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Insecure = bool(v != 0) 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 257a56f068..30ba6edf71 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1147,6 +1147,9 @@ message PrometheusMetric { // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. // +optional optional int64 timeout = 4; + + // Insecure skips host TLS verification + optional bool insecure = 5; } // RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 4ea5f05291..bbb3a48f17 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3458,6 +3458,13 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall Format: "int64", }, }, + "insecure": { + SchemaProps: spec.SchemaProps{ + Description: "Insecure skips host TLS verification", + Type: []string{"boolean"}, + Format: "", + }, + }, }, }, }, From e200c7fde9b8d91f5ba26cf38047f951b2f80342 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 18:02:13 -0500 Subject: [PATCH 124/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 (#2927) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.0 to 1.27.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.0...service/s3/v1.27.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 218d655828..dab4ce50ce 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.0 github.com/aws/aws-sdk-go-v2/config v1.18.32 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 764d682f14..f6b8d61800 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0 h1:DLEgqzvRmK3cG6JEFkzvD9ilU4+FVvA4mKzjoNQ+eeA= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.0/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 h1:GH10a37HtUcvUMg/4DR4SSYgmOaTVBBFB0npgn0LBTs= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= From 64ab374e413df0acae1640b701ee641802f87121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Aug 2023 09:11:01 -0500 Subject: [PATCH 125/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 (#2926) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.19.14 to 1.20.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/sqs/v1.19.14...service/ecs/v1.20.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index dab4ce50ce..7c8a6f03c1 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.20.0 github.com/aws/aws-sdk-go-v2/config v1.18.32 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index f6b8d61800..2d132ec8d3 100644 --- a/go.sum +++ b/go.sum @@ -101,7 +101,6 @@ 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.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.0 h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8= github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= github.com/aws/aws-sdk-go-v2/config v1.18.32 h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI= @@ -110,18 +109,16 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.31 h1:vJyON3lG7R8VOErpJJBclBADiWT github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 h1:zr/gxAZkMcvP71ZhQOcvdm8ReLjFgIXnIn0fw5AM7mo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8tf4bRTUanzEYvhw7KkPXIMpO0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 h1:GH10a37HtUcvUMg/4DR4SSYgmOaTVBBFB0npgn0LBTs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14 h1:ekfFZUYzAqzBYhh1bwIen4SNLIn4KiMNDWyRmfbp62I= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.19.14/go.mod h1:0eT2aeVd4MnWmyT935I2MTwP5xT7cFVteV02BgJ/F+E= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1 h1:tqKfJHzTsHbq1dSZTj74hkpzbQSTsFLaKFd5vuG3Vao= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1/go.mod h1:7MMONtI4lt6a8RgV5OOXrnu8G42PaerBfeAkmcmhk1w= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY= @@ -130,7 +127,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9Le github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs= github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io= github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From d42fdf5edb071a1e51b33820e9a7b07458d113c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Aug 2023 22:16:31 -0500 Subject: [PATCH 126/159] chore(deps): bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 (#2936) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8d37cac21e..eb6d176da7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.7.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.7.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} @@ -141,7 +141,7 @@ jobs: id-token: write # Needed for provenance signing and ID contents: write # Needed for release uploads # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.7.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.8.0 with: base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" provenance-name: "argo-rollouts.intoto.jsonl" From f0c569b3dced50d12f15dec8ed6876143ed2f059 Mon Sep 17 00:00:00 2001 From: AhmedGrati <48932084+AhmedGrati@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:09:47 +0100 Subject: [PATCH 127/159] feat: support prometheus headers (#2937) * feat: support prometheus headers Signed-off-by: AhmedGrati * test: add headers round tripper prometheus headers unit tests Signed-off-by: AhmedGrati * docs: add headers in prometheus example Signed-off-by: AhmedGrati --------- Signed-off-by: AhmedGrati --- docs/analysis/prometheus.md | 5 +- .../features/kustomize/rollout_cr_schema.json | 54 ++ manifests/crds/analysis-run-crd.yaml | 12 + manifests/crds/analysis-template-crd.yaml | 12 + .../crds/cluster-analysis-template-crd.yaml | 12 + manifests/install.yaml | 36 + .../prometheus/headers_round_tripper.go | 21 + .../prometheus/headers_round_tripper_test.go | 140 ++++ metricproviders/prometheus/prometheus.go | 34 +- pkg/apis/api-rules/violation_exceptions.list | 1 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 5 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 781 ++++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 6 + .../rollouts/v1alpha1/openapi_generated.go | 22 +- .../v1alpha1/zz_generated.deepcopy.go | 5 + 15 files changed, 773 insertions(+), 373 deletions(-) create mode 100644 metricproviders/prometheus/headers_round_tripper.go create mode 100644 metricproviders/prometheus/headers_round_tripper_test.go diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index e21396cec5..786b3d2c6f 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -22,6 +22,9 @@ spec: address: http://prometheus.example.com:9090 # timeout is expressed in seconds timeout: 40 + headers: + - name: X-Scope-Org-ID + value: tenant_a query: | sum(irate( istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] @@ -81,4 +84,4 @@ provider: sum(irate( istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] )) -``` \ No newline at end of file +``` diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index d78d9c5c7c..6d8420e916 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -4310,6 +4310,24 @@ }, "type": "object" }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, "insecure": { "type": "boolean" }, @@ -8739,6 +8757,24 @@ }, "type": "object" }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, "insecure": { "type": "boolean" }, @@ -13168,6 +13204,24 @@ }, "type": "object" }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, "insecure": { "type": "boolean" }, diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 55dde775cf..112b5e7287 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2809,6 +2809,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 5ef0ed7570..8f76efa195 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2805,6 +2805,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 69bd9595e6..4e5187d8df 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2805,6 +2805,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: diff --git a/manifests/install.yaml b/manifests/install.yaml index fd9d491424..ddcd3e3d66 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2810,6 +2810,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: @@ -5806,6 +5818,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: @@ -8688,6 +8712,18 @@ spec: type: string type: object type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array insecure: type: boolean query: diff --git a/metricproviders/prometheus/headers_round_tripper.go b/metricproviders/prometheus/headers_round_tripper.go new file mode 100644 index 0000000000..e2bbecd793 --- /dev/null +++ b/metricproviders/prometheus/headers_round_tripper.go @@ -0,0 +1,21 @@ +package prometheus + +import ( + "net/http" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" +) + +type httpHeadersRoundTripper struct { + headers []v1alpha1.WebMetricHeader + roundTripper http.RoundTripper +} + +// RoundTrip implements the http.RoundTripper interface. +func (h httpHeadersRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { + for _, header := range h.headers { + r.Header.Set(header.Key, header.Value) + } + + return h.roundTripper.RoundTrip(r) +} diff --git a/metricproviders/prometheus/headers_round_tripper_test.go b/metricproviders/prometheus/headers_round_tripper_test.go new file mode 100644 index 0000000000..a9983747a1 --- /dev/null +++ b/metricproviders/prometheus/headers_round_tripper_test.go @@ -0,0 +1,140 @@ +package prometheus + +import ( + "bytes" + "context" + "io" + "net/http" + "net/url" + "testing" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + "github.com/prometheus/client_golang/api" + "github.com/stretchr/testify/assert" +) + +type testHttpHeaderRoundTripper struct { + expectedHeaders []v1alpha1.WebMetricHeader + t *testing.T +} + +func (rt *testHttpHeaderRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + assert.Equal(rt.t, fromWebMetricHeadersToHttpHeaders(rt.expectedHeaders), req.Header) + + return &http.Response{ + StatusCode: 200, + Body: io.NopCloser(bytes.NewBufferString("ahoj")), + Header: http.Header{ + "Content-Type": []string{"application/json"}, + }, + }, nil +} + +func fromWebMetricHeadersToHttpHeaders(headers []v1alpha1.WebMetricHeader) http.Header { + header := http.Header{} + for _, h := range headers { + header.Add(h.Key, h.Value) + } + + return header +} + +func Test_httpHeadersRoundTripper_RoundTrip(t *testing.T) { + tests := []struct { + name string + initialHeaders []v1alpha1.WebMetricHeader + appendedHeaders []v1alpha1.WebMetricHeader + expectedHeaders []v1alpha1.WebMetricHeader + }{ + { + name: "have header and append header", + initialHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header1", Value: "value1"}, + }, + appendedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader", Value: "appendedHeaderValue"}, + }, + expectedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader", Value: "appendedHeaderValue"}, + {Key: "header1", Value: "value1"}, + }, + }, + { + name: "only append header", + initialHeaders: []v1alpha1.WebMetricHeader{}, + appendedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader", Value: "appendedHeaderValue"}, + }, + expectedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader", Value: "appendedHeaderValue"}, + }, + }, + { + name: "have header and not append header", + initialHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header1", Value: "value1"}, + }, + appendedHeaders: []v1alpha1.WebMetricHeader{}, + expectedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header1", Value: "value1"}, + }, + }, + { + name: "empty headers", + initialHeaders: []v1alpha1.WebMetricHeader{}, + appendedHeaders: []v1alpha1.WebMetricHeader{}, + expectedHeaders: []v1alpha1.WebMetricHeader{}, + }, + { + name: "append multiple headers", + initialHeaders: []v1alpha1.WebMetricHeader{}, + appendedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader1", Value: "appendedHeaderValue1"}, + {Key: "appendedHeader2", Value: "appendedHeaderValue2"}, + }, + expectedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "appendedHeader1", Value: "appendedHeaderValue1"}, + {Key: "appendedHeader2", Value: "appendedHeaderValue2"}, + }, + }, + { + name: "overwrite header", + initialHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header", Value: "value"}, + }, + appendedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header", Value: "newValue"}, + }, + expectedHeaders: []v1alpha1.WebMetricHeader{ + {Key: "header", Value: "newValue"}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + rt := httpHeadersRoundTripper{ + headers: tt.appendedHeaders, + roundTripper: &testHttpHeaderRoundTripper{ + expectedHeaders: tt.expectedHeaders, + t: t, + }, + } + + c, err := api.NewClient(api.Config{ + Address: "http://fake-address", + RoundTripper: rt, + }) + if err != nil { + t.Fatal(err) + } + r := &http.Request{ + URL: &url.URL{Scheme: "http", Host: "fake-host", Path: "/"}, + Header: fromWebMetricHeadersToHttpHeaders(tt.initialHeaders), + } + if _, _, err = c.Do(context.Background(), r); err != nil { + t.Fatal(err) + } + + }) + } +} diff --git a/metricproviders/prometheus/prometheus.go b/metricproviders/prometheus/prometheus.go index 15562b25d6..6d1d521fb0 100644 --- a/metricproviders/prometheus/prometheus.go +++ b/metricproviders/prometheus/prometheus.go @@ -61,7 +61,6 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph StartedAt: &startTime, } - //TODO(dthomson) make timeout configurable ctx, cancel := context.WithTimeout(context.Background(), p.timeout) defer cancel() @@ -183,17 +182,30 @@ func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { return nil, errors.New("prometheus address is not configured") } + var roundTripper http.RoundTripper + + roundTripper = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + TLSHandshakeTimeout: 10 * time.Second, + TLSClientConfig: &tls.Config{InsecureSkipVerify: metric.Provider.Prometheus.Insecure}, + } + + // attach custom headers to api requests, if specified + customHeaders := metric.Provider.Prometheus.Headers + if len(customHeaders) > 0 { + roundTripper = httpHeadersRoundTripper{ + headers: customHeaders, + roundTripper: roundTripper, + } + } + prometheusApiConfig := api.Config{ - Address: metric.Provider.Prometheus.Address, - RoundTripper: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).DialContext, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: &tls.Config{InsecureSkipVerify: metric.Provider.Prometheus.Insecure}, - }, + Address: metric.Provider.Prometheus.Address, + RoundTripper: roundTripper, } //Check if using Amazon Managed Prometheus if true build sigv4 client diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 33491b0435..1d968d19e0 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -29,6 +29,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,KayentaMetric,Scopes API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,MetricResult,Measurements API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,NginxTrafficRouting,StableIngresses +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,PrometheusMetric,Headers API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,Args API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,DryRun API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,MeasurementRetention diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 07c8acbc61..d7d1685d04 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -218,6 +218,11 @@ type PrometheusMetric struct { Timeout *int64 `json:"timeout,omitempty" protobuf:"bytes,4,opt,name=timeout"` // Insecure skips host TLS verification Insecure bool `json:"insecure,omitempty" protobuf:"varint,5,opt,name=insecure"` + // Headers are optional HTTP headers to use in the request + // +optional + // +patchMergeKey=key + // +patchStrategy=merge + Headers []WebMetricHeader `json:"headers,omitempty" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,6,opt,name=headers"` } // PrometheusMetric defines the prometheus query to perform canary analysis diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 679db00a8a..7a0c3ccf23 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3292,14 +3292,14 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8206 bytes of a gzipped FileDescriptorProto + // 8214 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, 0x75, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x1e, 0xb9, 0x24, 0xb7, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xf6, 0x0d, 0xf7, 0x56, 0x96, 0x74, 0xb6, 0x9a, 0x33, 0xc5, 0x61, 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, - 0x03, 0x31, 0xe2, 0x58, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, + 0x03, 0x11, 0xe2, 0xd8, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, 0x49, 0x90, 0x40, 0x08, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xfa, 0xec, 0xea, 0x9e, 0x1e, 0xee, 0xcc, 0x4e, 0x73, 0x75, 0x49, 0xfc, 0x6f, 0xa6, 0x5e, 0xd5, 0x7b, 0xaf, 0xeb, 0xe3, 0xd5, 0xab, 0x57, 0xef, 0xbd, 0x82, 0xcd, 0x96, 0x1b, 0xed, 0xf5, 0x76, 0x56, 0x1a, 0x7e, 0x67, 0xd5, 0x09, @@ -3391,7 +3391,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x5d, 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, 0x8a, 0xb5, 0x5d, 0xaa, 0x96, 0x98, 0x14, 0x42, 0x56, 0x80, 0xa2, 0xdc, 0xfe, 0x45, 0x26, 0x71, 0x39, 0xca, 0x94, 0x71, 0xe3, 0x2e, 0x14, 0x03, 0x46, 0x44, 0xce, 0xac, 0x71, 0xcf, 0x81, 0x31, - 0xd7, 0x92, 0x09, 0xf6, 0x13, 0x05, 0x09, 0xfb, 0xf7, 0x26, 0xe0, 0x42, 0xa5, 0xdb, 0xdd, 0xa2, + 0xd7, 0x92, 0x09, 0xf6, 0x13, 0x05, 0x09, 0xfb, 0x77, 0x27, 0xe0, 0x42, 0xa5, 0xdb, 0xdd, 0xa2, 0xe1, 0x5e, 0x8a, 0x8b, 0x5f, 0xb6, 0x60, 0xfe, 0xc0, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, 0xf6, 0x2b, 0xc1, 0x4f, 0x7d, 0x5c, 0x7e, 0x38, 0xb5, 0xb7, 0x12, 0xa8, 0xab, 0xe4, 0xf8, 0xa8, 0x3c, 0x9f, 0x2c, 0xc3, 0x14, 0x79, 0xf2, 0xf7, 0x2d, 0x58, 0x94, 0x45, 0x37, 0xfd, 0x26, 0x35, 0xed, 0xa3, @@ -3401,7 +3401,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x20, 0x8d, 0x99, 0x0c, 0x71, 0x4e, 0x85, 0x99, 0x35, 0xc5, 0xe9, 0xc4, 0x63, 0xe1, 0xb4, 0x9e, 0x41, 0x1a, 0x33, 0x19, 0xb2, 0xff, 0x26, 0x3c, 0x75, 0x02, 0xba, 0x87, 0x2f, 0x4e, 0xfb, 0x6d, 0x3d, 0xeb, 0x93, 0x73, 0x6e, 0x88, 0x75, 0x6d, 0xc3, 0x14, 0x5f, 0x3a, 0x6a, 0x61, 0x03, 0xdb, - 0xfe, 0xf8, 0x9a, 0x0a, 0x51, 0x42, 0xec, 0xdf, 0xb3, 0x60, 0x66, 0x04, 0x6b, 0x58, 0x39, 0x69, + 0xfe, 0xf8, 0x9a, 0x0a, 0x51, 0x42, 0xec, 0xdf, 0xb5, 0x60, 0x66, 0x04, 0x6b, 0x58, 0x39, 0x69, 0x0d, 0x2b, 0xf5, 0x59, 0xc2, 0xa2, 0x7e, 0x4b, 0xd8, 0xeb, 0xe3, 0x8d, 0xc6, 0x30, 0x16, 0xb0, 0x1f, 0x5b, 0x70, 0xb6, 0xcf, 0x62, 0x46, 0xf6, 0xe0, 0x7c, 0xd7, 0x6f, 0x2a, 0xb5, 0xe9, 0xba, 0x13, 0xee, 0x71, 0x98, 0xfc, 0xbc, 0x97, 0xd8, 0x48, 0xd6, 0x32, 0xe0, 0x0f, 0x8e, 0xca, 0x4b, @@ -3450,362 +3450,363 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xa6, 0xef, 0x51, 0xb7, 0xb5, 0x17, 0x29, 0xf5, 0x69, 0x4c, 0x5f, 0x1d, 0x69, 0x1e, 0xb8, 0x23, 0x70, 0x56, 0x67, 0x8f, 0x8f, 0xca, 0xd3, 0xf2, 0x0f, 0x2a, 0x4a, 0xe4, 0x26, 0xcc, 0x8b, 0x03, 0x5b, 0xcd, 0xf5, 0x5a, 0x35, 0xdf, 0x13, 0x0e, 0x27, 0xa5, 0xea, 0x73, 0x6a, 0xc3, 0xaf, 0x27, - 0xa0, 0x0f, 0x8e, 0xca, 0x73, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xdd, 0x29, - 0x00, 0x35, 0x5d, 0x69, 0x97, 0x7c, 0x14, 0x4a, 0x21, 0x8d, 0x04, 0x55, 0x79, 0x83, 0x20, 0x2e, - 0x66, 0x54, 0x21, 0xc6, 0x70, 0xb2, 0x0f, 0xc5, 0xae, 0xd3, 0x0b, 0xa9, 0x1c, 0xfc, 0x1b, 0xb9, - 0x0c, 0x7e, 0x8d, 0x61, 0x14, 0x27, 0x34, 0xfe, 0x13, 0x05, 0x0d, 0xf2, 0x15, 0x0b, 0x80, 0x26, - 0x07, 0x6c, 0x6c, 0x4b, 0x89, 0x24, 0x19, 0x8f, 0x29, 0xeb, 0x83, 0xea, 0xfc, 0xf1, 0x51, 0x19, - 0x8c, 0xa1, 0x37, 0xc8, 0x92, 0x7b, 0x30, 0xe3, 0x28, 0x99, 0x3f, 0x79, 0x1a, 0x32, 0x9f, 0x1f, - 0x9c, 0xf4, 0xa4, 0xd5, 0xc4, 0xc8, 0xd7, 0x2c, 0x98, 0x0f, 0x69, 0x24, 0x87, 0x8a, 0x49, 0x1e, - 0xa9, 0xf0, 0x8e, 0x39, 0xe9, 0xea, 0x09, 0x9c, 0x42, 0x82, 0x26, 0xcb, 0x30, 0x45, 0x57, 0xb1, - 0x72, 0x9d, 0x3a, 0x4d, 0x1a, 0xf0, 0x73, 0xb9, 0xd4, 0xa4, 0xc6, 0x67, 0xc5, 0xc0, 0xa9, 0x59, - 0x31, 0xca, 0x30, 0x45, 0x57, 0xb1, 0xb2, 0xe5, 0x06, 0x81, 0x2f, 0x59, 0x99, 0xc9, 0x89, 0x15, - 0x03, 0xa7, 0x66, 0xc5, 0x28, 0xc3, 0x14, 0x5d, 0xfb, 0xdb, 0x67, 0x60, 0x5e, 0x2d, 0xa4, 0x58, - 0xb3, 0x17, 0x66, 0xa0, 0x01, 0x9a, 0xfd, 0x9a, 0x09, 0xc4, 0x64, 0x5d, 0xd6, 0x58, 0x2c, 0xd5, - 0xa4, 0x62, 0xaf, 0x1b, 0xd7, 0x4d, 0x20, 0x26, 0xeb, 0x92, 0x0e, 0x14, 0xc3, 0x88, 0x76, 0xd5, - 0x65, 0xf0, 0x98, 0x77, 0x95, 0xb1, 0x7c, 0x88, 0xaf, 0x7b, 0xd8, 0xbf, 0x10, 0x05, 0x15, 0x6e, - 0xc9, 0x8c, 0x12, 0xc6, 0x4d, 0xb9, 0x38, 0xf2, 0x59, 0x9f, 0x49, 0xbb, 0xa9, 0x18, 0x8d, 0x64, - 0x19, 0xa6, 0xc8, 0x67, 0x28, 0xfb, 0xc5, 0x53, 0x54, 0xf6, 0x3f, 0x0b, 0x33, 0x1d, 0xe7, 0x7e, - 0xbd, 0x17, 0xb4, 0x1e, 0xfd, 0x50, 0x21, 0xdd, 0xeb, 0x04, 0x16, 0xd4, 0xf8, 0xc8, 0x97, 0x2d, - 0x43, 0xe4, 0x4c, 0x73, 0xe4, 0x77, 0xf2, 0x15, 0x39, 0x7a, 0xaf, 0x1c, 0x28, 0x7c, 0xfa, 0x54, - 0xef, 0x99, 0xc7, 0xae, 0x7a, 0x33, 0x35, 0x52, 0x2c, 0x10, 0xad, 0x46, 0x96, 0x4e, 0x55, 0x8d, - 0x5c, 0x4b, 0x10, 0xc3, 0x14, 0x71, 0xce, 0x8f, 0x58, 0x73, 0x9a, 0x1f, 0x38, 0x55, 0x7e, 0xea, - 0x09, 0x62, 0x98, 0x22, 0x3e, 0xf8, 0xbc, 0x39, 0x7b, 0x3a, 0xe7, 0xcd, 0xb9, 0x1c, 0xce, 0x9b, - 0x27, 0xab, 0xe2, 0x67, 0xc6, 0x55, 0xc5, 0xc9, 0x0d, 0x20, 0xcd, 0x43, 0xcf, 0xe9, 0xb8, 0x0d, - 0x29, 0x2c, 0xf9, 0xb6, 0x39, 0xcf, 0xed, 0x11, 0xcb, 0x52, 0x90, 0x91, 0xf5, 0xbe, 0x1a, 0x98, - 0xd1, 0x8a, 0x44, 0x30, 0xd3, 0x55, 0x1a, 0xd7, 0x42, 0x1e, 0xb3, 0x5f, 0x69, 0x60, 0xc2, 0x5f, - 0x80, 0x2d, 0x3c, 0x55, 0x82, 0x9a, 0x12, 0xd9, 0x84, 0xf3, 0x1d, 0xd7, 0xab, 0xf9, 0xcd, 0xb0, - 0x46, 0x03, 0x69, 0x6d, 0xa9, 0xd3, 0x68, 0x69, 0x91, 0xf7, 0x0d, 0x3f, 0x41, 0x6f, 0x65, 0xc0, - 0x31, 0xb3, 0x95, 0xfd, 0x3f, 0x2d, 0x58, 0x5c, 0x6b, 0xfb, 0xbd, 0xe6, 0x1d, 0x27, 0x6a, 0xec, - 0x89, 0xab, 0x72, 0xf2, 0x1a, 0xcc, 0xb8, 0x5e, 0x44, 0x83, 0x03, 0xa7, 0x2d, 0xf7, 0x27, 0x5b, - 0x99, 0x4f, 0x37, 0x64, 0xf9, 0x83, 0xa3, 0xf2, 0xfc, 0x7a, 0x2f, 0xe0, 0xee, 0x74, 0x42, 0x5a, - 0xa1, 0x6e, 0x43, 0xbe, 0x6d, 0xc1, 0x59, 0x71, 0xd9, 0xbe, 0xee, 0x44, 0xce, 0xad, 0x1e, 0x0d, - 0x5c, 0xaa, 0xae, 0xdb, 0xc7, 0x14, 0x54, 0x69, 0x5e, 0x15, 0x81, 0xc3, 0x58, 0x51, 0xdf, 0x4a, - 0x53, 0xc6, 0x7e, 0x66, 0xec, 0x5f, 0x29, 0xc0, 0x93, 0x03, 0x71, 0x91, 0x65, 0x98, 0x70, 0x9b, - 0xf2, 0xd3, 0x41, 0xe2, 0x9d, 0xd8, 0x68, 0xe2, 0x84, 0xdb, 0x24, 0x2b, 0x5c, 0xe7, 0x0c, 0x68, - 0x18, 0xaa, 0x9b, 0xd7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x35, 0x48, 0x19, 0x8a, 0xdc, 0xb5, - 0x52, 0x9e, 0x27, 0xb8, 0x16, 0xcb, 0xbd, 0x18, 0x51, 0x94, 0x93, 0x5f, 0xb4, 0x00, 0x04, 0x83, - 0xec, 0x34, 0x22, 0x77, 0x49, 0xcc, 0xb7, 0x9b, 0x18, 0x66, 0xc1, 0x65, 0xfc, 0x1f, 0x0d, 0xaa, - 0x64, 0x1b, 0xa6, 0x98, 0x42, 0xeb, 0x37, 0x1f, 0x79, 0x53, 0xe4, 0x57, 0x32, 0x35, 0x8e, 0x03, - 0x25, 0x2e, 0xd6, 0x57, 0x01, 0x8d, 0x7a, 0x81, 0xc7, 0xba, 0x96, 0x6f, 0x83, 0x33, 0x82, 0x0b, - 0xd4, 0xa5, 0x68, 0xd4, 0xb0, 0xff, 0xe5, 0x04, 0x9c, 0xcf, 0x62, 0x9d, 0xed, 0x36, 0x53, 0x82, - 0x5b, 0x79, 0x34, 0xfe, 0x4c, 0xfe, 0xfd, 0x23, 0xfd, 0x46, 0xb4, 0x77, 0x85, 0xf4, 0x6c, 0x93, - 0x74, 0xc9, 0x67, 0x74, 0x0f, 0x4d, 0x3c, 0x62, 0x0f, 0x69, 0xcc, 0xa9, 0x5e, 0x7a, 0x06, 0x26, - 0x43, 0x36, 0xf2, 0x85, 0xe4, 0x75, 0x07, 0x1f, 0x23, 0x0e, 0x61, 0x35, 0x7a, 0x9e, 0x1b, 0xc9, - 0x78, 0x04, 0x5d, 0xe3, 0xb6, 0xe7, 0x46, 0xc8, 0x21, 0xf6, 0xb7, 0x26, 0x60, 0x79, 0xf0, 0x47, - 0x91, 0x6f, 0x59, 0x00, 0x4d, 0x76, 0x5c, 0x09, 0xb9, 0x53, 0xaf, 0xf0, 0xb3, 0x71, 0x4e, 0xab, - 0x0f, 0xd7, 0x15, 0xa5, 0xd8, 0xe9, 0x4a, 0x17, 0x85, 0x68, 0x30, 0x42, 0x5e, 0x50, 0x53, 0x9f, - 0x5f, 0xd5, 0x88, 0xc5, 0xa4, 0xdb, 0x6c, 0x69, 0x08, 0x1a, 0xb5, 0xd8, 0x79, 0xd4, 0x73, 0x3a, - 0x34, 0xec, 0x3a, 0x3a, 0xba, 0x83, 0x9f, 0x47, 0x6f, 0xaa, 0x42, 0x8c, 0xe1, 0x76, 0x1b, 0x9e, - 0x1d, 0x82, 0xcf, 0x9c, 0x9c, 0xe7, 0xed, 0xff, 0x61, 0xc1, 0xc5, 0xb5, 0x76, 0x2f, 0x8c, 0x68, - 0xf0, 0xff, 0x8d, 0x0f, 0xdb, 0xff, 0xb2, 0xe0, 0xa9, 0x01, 0xdf, 0xfc, 0x18, 0x5c, 0xd9, 0xde, - 0x49, 0xba, 0xb2, 0xdd, 0x1e, 0x77, 0x4a, 0x67, 0x7e, 0xc7, 0x00, 0x8f, 0xb6, 0xdf, 0xb4, 0xe0, - 0x0c, 0x13, 0x5b, 0x4d, 0xbf, 0x95, 0xd3, 0xc6, 0xf9, 0x2c, 0x14, 0x7f, 0x9e, 0x6d, 0x40, 0xe9, - 0x49, 0xc6, 0x77, 0x25, 0x14, 0x30, 0xb6, 0x66, 0x9c, 0xae, 0xfb, 0x16, 0x0d, 0xf8, 0x06, 0x54, - 0x48, 0xae, 0x99, 0x8a, 0x86, 0xa0, 0x51, 0xcb, 0xfe, 0x34, 0x48, 0x67, 0xb1, 0xd4, 0x8a, 0xb3, - 0x86, 0x59, 0x71, 0xf6, 0x7f, 0x98, 0x00, 0xc3, 0xf8, 0xf1, 0x18, 0x66, 0xb2, 0x97, 0x98, 0xc9, - 0x63, 0x1e, 0xdc, 0x0d, 0x53, 0xce, 0xa0, 0x60, 0x9e, 0x83, 0x54, 0x30, 0xcf, 0xcd, 0xdc, 0x28, - 0x9e, 0x1c, 0xcb, 0xf3, 0x03, 0x0b, 0x9e, 0x8a, 0x2b, 0xf7, 0xdb, 0x25, 0x1f, 0x2e, 0x96, 0x5e, - 0x86, 0x59, 0x27, 0x6e, 0x26, 0xe7, 0x8d, 0x11, 0x49, 0xa1, 0x41, 0x68, 0xd6, 0x8b, 0x7d, 0xd0, - 0x0b, 0x8f, 0xe8, 0x83, 0x3e, 0x79, 0xb2, 0x0f, 0xba, 0xfd, 0xe7, 0x13, 0x70, 0xa9, 0xff, 0xcb, - 0xd4, 0x82, 0x1a, 0xee, 0x92, 0xff, 0x15, 0x98, 0x8b, 0x64, 0x03, 0x63, 0x7b, 0xd0, 0x51, 0x9d, - 0xdb, 0x06, 0x0c, 0x13, 0x35, 0x59, 0xcb, 0x86, 0x58, 0xca, 0xf5, 0x86, 0xdf, 0x55, 0x11, 0x0c, - 0xba, 0xe5, 0x9a, 0x01, 0xc3, 0x44, 0x4d, 0xed, 0x1b, 0x3a, 0x79, 0xea, 0xbe, 0xa1, 0x75, 0xb8, - 0xa0, 0xbc, 0xe1, 0xae, 0xf9, 0xc1, 0x9a, 0xdf, 0xe9, 0xb6, 0xa9, 0x8c, 0x61, 0x60, 0xcc, 0x5e, - 0x92, 0x4d, 0x2e, 0x60, 0x56, 0x25, 0xcc, 0x6e, 0x6b, 0xff, 0xa0, 0x00, 0xe7, 0xe2, 0x6e, 0x5f, - 0xf3, 0xbd, 0xa6, 0xcb, 0x7d, 0x0a, 0x5f, 0x85, 0xc9, 0xe8, 0xb0, 0xab, 0x3a, 0xfb, 0xaf, 0x2a, - 0x76, 0xb6, 0x0f, 0xbb, 0x6c, 0xb4, 0x2f, 0x66, 0x34, 0xe1, 0x96, 0x61, 0xde, 0x88, 0x6c, 0xea, - 0xd5, 0x21, 0x46, 0xe0, 0xa5, 0xe4, 0x6c, 0x7e, 0x70, 0x54, 0xce, 0x08, 0x6a, 0x5e, 0xd1, 0x98, - 0x92, 0x73, 0x9e, 0xdc, 0x85, 0xf9, 0xb6, 0x13, 0x46, 0xb7, 0xbb, 0x4d, 0x27, 0xa2, 0xdb, 0xae, - 0xf4, 0xd0, 0x18, 0x2d, 0x30, 0x40, 0x5f, 0x65, 0x6f, 0x26, 0x30, 0x61, 0x0a, 0x33, 0x39, 0x00, - 0xc2, 0x4a, 0xb6, 0x03, 0xc7, 0x0b, 0xc5, 0x57, 0x31, 0x7a, 0xa3, 0x07, 0x22, 0xe8, 0x93, 0xe1, - 0x66, 0x1f, 0x36, 0xcc, 0xa0, 0x40, 0x9e, 0x83, 0xa9, 0x80, 0x3a, 0xa1, 0x1c, 0xcc, 0x52, 0xbc, - 0xfe, 0x91, 0x97, 0xa2, 0x84, 0x9a, 0x0b, 0x6a, 0xea, 0x21, 0x0b, 0xea, 0x4f, 0x2d, 0x98, 0x8f, - 0x87, 0xe9, 0x31, 0xec, 0xac, 0x9d, 0xe4, 0xce, 0x7a, 0x3d, 0x2f, 0x91, 0x38, 0x60, 0x33, 0xfd, - 0x83, 0x29, 0xf3, 0xfb, 0xb8, 0x63, 0xf8, 0x17, 0xa1, 0xa4, 0x56, 0xb5, 0x52, 0x59, 0xc7, 0x3c, - 0x60, 0x27, 0x94, 0x19, 0x23, 0xa0, 0x49, 0x12, 0xc1, 0x98, 0x1e, 0xdb, 0xca, 0x9b, 0x72, 0x9b, - 0x96, 0xd3, 0x5e, 0x6f, 0xe5, 0x6a, 0xfb, 0xce, 0xda, 0xca, 0x55, 0x1b, 0x72, 0x1b, 0x2e, 0x76, - 0x03, 0x9f, 0x87, 0xd5, 0xae, 0x53, 0xa7, 0xd9, 0x76, 0x3d, 0xaa, 0xac, 0x18, 0xc2, 0x93, 0xe2, - 0xa9, 0xe3, 0xa3, 0xf2, 0xc5, 0x5a, 0x76, 0x15, 0x1c, 0xd4, 0x36, 0x19, 0x98, 0x35, 0x39, 0x44, - 0x60, 0xd6, 0xdf, 0xd1, 0xb6, 0x42, 0x1a, 0xca, 0xf0, 0xa8, 0xcf, 0xe5, 0x35, 0x94, 0x19, 0x62, - 0x3d, 0x9e, 0x52, 0x15, 0x49, 0x14, 0x35, 0xf9, 0xc1, 0x06, 0xa9, 0xa9, 0x47, 0x34, 0x48, 0xc5, - 0xfe, 0xf5, 0xd3, 0x3f, 0x49, 0xff, 0xfa, 0x99, 0x0f, 0x94, 0x7f, 0xfd, 0xfb, 0x45, 0x58, 0x4c, - 0x6b, 0x20, 0xa7, 0x1f, 0x74, 0xf6, 0xf7, 0x2c, 0x58, 0x54, 0xab, 0x47, 0xd0, 0xa4, 0xea, 0xaa, - 0x61, 0x33, 0xa7, 0x45, 0x2b, 0x74, 0x29, 0x1d, 0x8d, 0xbf, 0x9d, 0xa2, 0x86, 0x7d, 0xf4, 0xc9, - 0xdb, 0x30, 0xab, 0x2d, 0xf2, 0x8f, 0x14, 0x81, 0xb6, 0xc0, 0xb5, 0xa8, 0x18, 0x05, 0x9a, 0xf8, - 0xc8, 0xfb, 0x16, 0x40, 0x43, 0x6d, 0x73, 0x6a, 0x75, 0xdd, 0xca, 0x6b, 0x75, 0xe9, 0x0d, 0x34, - 0x56, 0x96, 0x75, 0x51, 0x88, 0x06, 0x61, 0xf2, 0x2b, 0xdc, 0x16, 0xaf, 0xb5, 0x3b, 0x11, 0xe5, - 0x3f, 0xb6, 0xef, 0xf0, 0x09, 0x8a, 0x69, 0xac, 0x4a, 0x19, 0xa0, 0x10, 0x13, 0x4c, 0xd8, 0xaf, - 0x82, 0xf6, 0xf6, 0x64, 0x62, 0x8b, 0xfb, 0x7b, 0xd6, 0x9c, 0x68, 0x4f, 0x4e, 0x41, 0x2d, 0xb6, - 0xae, 0x29, 0x00, 0xc6, 0x75, 0xec, 0x2f, 0xc0, 0xfc, 0xeb, 0x81, 0xd3, 0xdd, 0x73, 0xb9, 0xcd, - 0x9b, 0x9d, 0xad, 0x3e, 0x02, 0xd3, 0x4e, 0xb3, 0x99, 0x95, 0x38, 0xa2, 0x22, 0x8a, 0x51, 0xc1, - 0x87, 0x3a, 0x46, 0xd9, 0xdf, 0xb5, 0x80, 0xc4, 0xf7, 0x86, 0xae, 0xd7, 0xda, 0x72, 0xa2, 0xc6, - 0x1e, 0x3b, 0x1f, 0xed, 0xf1, 0xd2, 0xac, 0xf3, 0xd1, 0x75, 0x0d, 0x41, 0xa3, 0x16, 0x79, 0x17, - 0x66, 0xc5, 0xbf, 0xb7, 0xb4, 0x85, 0x60, 0xec, 0x08, 0x02, 0xb1, 0xa1, 0x70, 0x9e, 0xc4, 0x2c, - 0xbc, 0x1e, 0x53, 0x40, 0x93, 0x1c, 0xeb, 0xaa, 0x0d, 0x6f, 0xb7, 0xdd, 0xbb, 0xdf, 0xdc, 0x89, - 0xbb, 0xaa, 0x1b, 0xf8, 0xbb, 0x6e, 0x9b, 0xa6, 0xbb, 0xaa, 0x26, 0x8a, 0x51, 0xc1, 0x87, 0xeb, - 0xaa, 0x7f, 0x63, 0xc1, 0xf9, 0x8d, 0x30, 0x72, 0xfd, 0x75, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0xc2, - 0xa7, 0xd7, 0x1e, 0xc6, 0x71, 0x7b, 0x1d, 0x16, 0xe5, 0x1d, 0x66, 0x6f, 0x27, 0xa4, 0x91, 0xa1, - 0xc7, 0xeb, 0x75, 0xbc, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0x5e, 0x66, 0xc6, 0x58, 0x0a, - 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2f, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0xa0, - 0x8b, 0x6f, 0x0c, 0x0a, 0xba, 0x18, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x72, 0xf1, 0x77, 0x2d, - 0x58, 0x68, 0x26, 0x7b, 0x3a, 0x1f, 0x9b, 0x4e, 0xd6, 0x18, 0x0a, 0x97, 0xad, 0x54, 0x21, 0xa6, - 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x21, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, 0xc7, 0x3a, - 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x27, 0xe4, 0x90, 0x9e, 0x46, 0x44, 0x01, 0xb9, 0x07, - 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xeb, 0xc2, 0x7d, 0x20, - 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, 0x39, 0x8a, - 0x6e, 0xaf, 0xd5, 0xd2, 0x84, 0x65, 0x09, 0x23, 0xac, 0x68, 0xd9, 0xbf, 0x65, 0x41, 0xe9, 0x86, - 0xaf, 0xe4, 0xc8, 0xcf, 0xe6, 0x60, 0xe8, 0xd1, 0xfa, 0xa0, 0xbe, 0xa6, 0x8c, 0x8f, 0x18, 0xaf, - 0x25, 0xcc, 0x3c, 0x4f, 0x1b, 0xb8, 0x57, 0x78, 0xfe, 0x2c, 0x86, 0xea, 0x86, 0xbf, 0x33, 0xd0, - 0xf4, 0xf8, 0x6b, 0x45, 0x38, 0xf3, 0x86, 0x73, 0x48, 0xbd, 0xc8, 0x19, 0x7d, 0x93, 0x78, 0x19, - 0x66, 0x9d, 0x2e, 0xbf, 0x07, 0x33, 0x74, 0xfc, 0xd8, 0x72, 0x12, 0x83, 0xd0, 0xac, 0x17, 0x0b, - 0x34, 0x91, 0x5d, 0x27, 0x4b, 0x14, 0xad, 0xa5, 0xe0, 0xd8, 0xd7, 0x82, 0xdc, 0x00, 0x22, 0xa3, - 0x51, 0x2b, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, 0xea, 0xab, - 0x81, 0x19, 0xad, 0xc8, 0xe7, 0x61, 0xa9, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, 0x1c, 0x3f, - 0x75, 0x9c, 0xc0, 0xda, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x51, - 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x04, 0xa5, 0x68, 0x2f, - 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0xbf, 0x85, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, 0x15, 0x56, - 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, - 0x6f, 0xe4, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, 0xfb, 0x13, - 0x30, 0x67, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xc5, 0x82, 0xb9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, - 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x9d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x19, - 0x4c, 0x10, 0x25, 0x5f, 0xb7, 0x60, 0x21, 0x76, 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x32, 0xa2, 0x45, - 0xfd, 0xd5, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x31, 0x3d, 0xda, 0xac, 0x2b, 0xbb, 0x8e, - 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0x6b, 0x4e, 0x18, 0x22, 0x87, 0x90, 0xe7, 0x61, 0xa6, 0xe3, 0x04, - 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, 0x1f, 0x87, - 0xb9, 0x2d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x69, 0xfb, 0xd1, 0x24, 0xcc, 0x1a, - 0x67, 0xb3, 0xd3, 0x3f, 0x67, 0x25, 0x52, 0x6a, 0x14, 0x72, 0x4c, 0xa9, 0xf1, 0x59, 0x80, 0x5d, - 0xd7, 0x73, 0xc3, 0xbd, 0x47, 0x4c, 0xd6, 0xc1, 0xef, 0x75, 0xaf, 0x69, 0x0c, 0x68, 0x60, 0x8b, - 0x2f, 0xcf, 0x8a, 0x27, 0x64, 0x9e, 0x7a, 0xdf, 0x32, 0xb6, 0x9b, 0xa9, 0x3c, 0x9c, 0x05, 0x8c, - 0x81, 0x59, 0x51, 0xdb, 0x8f, 0xc8, 0x35, 0x74, 0xd2, 0xae, 0xb4, 0x0d, 0x33, 0x01, 0x0d, 0x7b, - 0x1d, 0x76, 0x62, 0x9c, 0x1e, 0xb9, 0x1b, 0xb8, 0xdb, 0x06, 0xca, 0xf6, 0xa8, 0x31, 0x2d, 0xbf, - 0x0a, 0x67, 0x12, 0x2c, 0x8c, 0x94, 0x7d, 0xc8, 0x87, 0x4c, 0x03, 0xc0, 0xa3, 0x5c, 0xe6, 0xb0, - 0xb1, 0x68, 0x1b, 0xd9, 0x3a, 0xf4, 0x58, 0x08, 0xe7, 0x1c, 0x01, 0xb3, 0xff, 0x7c, 0x0a, 0xe4, - 0xfd, 0xf7, 0x10, 0xe2, 0xca, 0xbc, 0xf5, 0x9a, 0x78, 0x84, 0x5b, 0xaf, 0x1b, 0x30, 0xe7, 0x7a, - 0x6e, 0xe4, 0x3a, 0x6d, 0x6e, 0xdc, 0x91, 0xdb, 0xa9, 0xf2, 0x5e, 0x9e, 0xdb, 0x30, 0x60, 0x19, - 0x78, 0x12, 0x6d, 0xc9, 0x2d, 0x28, 0xf2, 0xfd, 0x46, 0x4e, 0xe0, 0xd1, 0x2f, 0xe9, 0xb9, 0x7f, - 0x86, 0x08, 0x69, 0x12, 0x98, 0xf8, 0xe1, 0x43, 0xa4, 0x2b, 0xd1, 0xc7, 0x6f, 0x39, 0x8f, 0xe3, - 0xc3, 0x47, 0x0a, 0x8e, 0x7d, 0x2d, 0x18, 0x96, 0x5d, 0xc7, 0x6d, 0xf7, 0x02, 0x1a, 0x63, 0x99, - 0x4a, 0x62, 0xb9, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0xb2, 0x0b, 0x73, 0xb2, 0x4c, 0xb8, 0x5c, 0x4d, - 0x3f, 0xe2, 0x57, 0x72, 0xd7, 0xba, 0x6b, 0x06, 0x26, 0x4c, 0xe0, 0x25, 0x3d, 0x38, 0xeb, 0x7a, - 0x0d, 0xdf, 0x6b, 0xb4, 0x7b, 0xa1, 0x7b, 0x40, 0xe3, 0x78, 0xa2, 0x47, 0x21, 0x76, 0xe1, 0xf8, - 0xa8, 0x7c, 0x76, 0x23, 0x8d, 0x0e, 0xfb, 0x29, 0x90, 0x2f, 0x5b, 0x70, 0xa1, 0xe1, 0x7b, 0x21, - 0x8f, 0xff, 0x3f, 0xa0, 0x57, 0x83, 0xc0, 0x0f, 0x04, 0xed, 0xd2, 0x23, 0xd2, 0xe6, 0x36, 0xc5, - 0xb5, 0x2c, 0x94, 0x98, 0x4d, 0x89, 0xbc, 0x03, 0x33, 0xdd, 0xc0, 0x3f, 0x70, 0x9b, 0x34, 0x90, - 0xee, 0x7b, 0x9b, 0x79, 0xe4, 0x23, 0xa9, 0x49, 0x9c, 0xb1, 0xe8, 0x51, 0x25, 0xa8, 0xe9, 0xd9, - 0xff, 0x7b, 0x16, 0xe6, 0x93, 0xd5, 0xc9, 0x2f, 0x00, 0x74, 0x03, 0xbf, 0x43, 0xa3, 0x3d, 0xaa, - 0xe3, 0x42, 0x6e, 0x8e, 0x9b, 0xf6, 0x42, 0xe1, 0x53, 0x2e, 0x2f, 0x4c, 0x5c, 0xc4, 0xa5, 0x68, - 0x50, 0x24, 0x01, 0x4c, 0xef, 0x8b, 0x6d, 0x57, 0x6a, 0x21, 0x6f, 0xe4, 0xa2, 0x33, 0x49, 0xca, - 0x3c, 0xa0, 0x41, 0x16, 0xa1, 0x22, 0x44, 0x76, 0xa0, 0x70, 0x8f, 0xee, 0xe4, 0x13, 0x73, 0x7d, - 0x87, 0xca, 0xd3, 0x4c, 0x75, 0xfa, 0xf8, 0xa8, 0x5c, 0xb8, 0x43, 0x77, 0x90, 0x21, 0x67, 0xdf, - 0xd5, 0x14, 0x77, 0xf7, 0x52, 0x54, 0x8c, 0xf9, 0x5d, 0x09, 0x47, 0x00, 0xf1, 0x5d, 0xb2, 0x08, - 0x15, 0x21, 0xf2, 0x0e, 0x94, 0xee, 0x39, 0x07, 0x74, 0x37, 0xf0, 0xbd, 0x48, 0xfa, 0x59, 0x8d, - 0x19, 0x2a, 0x70, 0x47, 0xa1, 0x93, 0x74, 0xf9, 0xf6, 0xae, 0x0b, 0x31, 0x26, 0x47, 0x0e, 0x60, - 0xc6, 0xa3, 0xf7, 0x90, 0xb6, 0xdd, 0x46, 0x3e, 0xae, 0xf9, 0x37, 0x25, 0x36, 0x49, 0x99, 0xef, - 0x7b, 0xaa, 0x0c, 0x35, 0x2d, 0x36, 0x96, 0x77, 0xfd, 0x1d, 0x29, 0xa8, 0xc6, 0x1c, 0x4b, 0x7d, - 0x32, 0x15, 0x63, 0x79, 0xc3, 0xdf, 0x41, 0x86, 0x9c, 0xad, 0x91, 0x86, 0x76, 0xf2, 0x91, 0x62, - 0xea, 0x66, 0xbe, 0xce, 0x4d, 0x62, 0x8d, 0xc4, 0xa5, 0x68, 0x50, 0x64, 0x7d, 0xdb, 0x92, 0xc6, - 0x4a, 0x29, 0xa8, 0xc6, 0xec, 0xdb, 0xa4, 0xe9, 0x53, 0xf4, 0xad, 0x2a, 0x43, 0x4d, 0x8b, 0xd1, - 0x75, 0xa5, 0xe5, 0x2f, 0x1f, 0x51, 0x95, 0xb4, 0x23, 0x0a, 0xba, 0xaa, 0x0c, 0x35, 0x2d, 0xd6, - 0xdf, 0xe1, 0xfe, 0xe1, 0x3d, 0xa7, 0xbd, 0xef, 0x7a, 0x2d, 0x19, 0xe7, 0x38, 0x6e, 0x76, 0xdb, - 0xfd, 0xc3, 0x3b, 0x02, 0x9f, 0xd9, 0xdf, 0x71, 0x29, 0x1a, 0x14, 0xc9, 0x3f, 0xb2, 0x60, 0xaa, - 0xdb, 0xee, 0xb5, 0x5c, 0x6f, 0x69, 0x8e, 0xeb, 0x89, 0x9f, 0xc9, 0x53, 0x42, 0xaf, 0xd4, 0x38, - 0x6a, 0xa1, 0x28, 0xfe, 0xb4, 0xf6, 0xd9, 0xe3, 0x85, 0xbf, 0xf4, 0x67, 0xe5, 0x25, 0xea, 0x35, - 0xfc, 0xa6, 0xeb, 0xb5, 0x56, 0xef, 0x86, 0xbe, 0xb7, 0x82, 0xce, 0x3d, 0xa5, 0xa3, 0x4b, 0x9e, - 0x96, 0x3f, 0x09, 0xb3, 0x06, 0x8a, 0x87, 0x29, 0x7a, 0x73, 0xa6, 0xa2, 0xf7, 0x5b, 0x53, 0x30, - 0x67, 0x66, 0xd4, 0x1b, 0x42, 0xfb, 0xd2, 0x27, 0x8e, 0x89, 0x51, 0x4e, 0x1c, 0xec, 0x88, 0x69, - 0xdc, 0x1e, 0x29, 0xf3, 0xd6, 0x46, 0x6e, 0x0a, 0x77, 0x7c, 0xc4, 0x34, 0x0a, 0x43, 0x4c, 0x10, - 0x1d, 0xc1, 0xa1, 0x84, 0xa9, 0xad, 0x42, 0xb1, 0x2b, 0x26, 0xd5, 0xd6, 0x84, 0xaa, 0xf6, 0x02, - 0x40, 0x9c, 0x59, 0x4e, 0xde, 0x2a, 0x6a, 0x7d, 0xd8, 0xc8, 0x78, 0x67, 0xd4, 0x22, 0xcf, 0xc1, - 0x14, 0x53, 0x7d, 0x68, 0x53, 0x86, 0x61, 0xeb, 0x73, 0xfc, 0x35, 0x5e, 0x8a, 0x12, 0x4a, 0x5e, - 0x61, 0x5a, 0x6a, 0xac, 0xb0, 0xc8, 0xe8, 0xea, 0xf3, 0xb1, 0x96, 0x1a, 0xc3, 0x30, 0x51, 0x93, - 0xb1, 0x4e, 0x99, 0x7e, 0xc1, 0x65, 0x83, 0xc1, 0x3a, 0x57, 0x3a, 0x50, 0xc0, 0xb8, 0x5d, 0x29, - 0xa5, 0x8f, 0xf0, 0x35, 0x5d, 0x34, 0xec, 0x4a, 0x29, 0x38, 0xf6, 0xb5, 0x60, 0x1f, 0x23, 0x2f, - 0x44, 0x67, 0x85, 0xb3, 0xed, 0x80, 0xab, 0xcc, 0xaf, 0x9a, 0x67, 0xad, 0x1c, 0xd7, 0x90, 0x98, - 0xb5, 0xc3, 0x1f, 0xb6, 0xc6, 0x3b, 0x16, 0x7d, 0x01, 0xe6, 0x93, 0xbb, 0x50, 0xee, 0x37, 0x1f, - 0x5f, 0x9b, 0x84, 0x73, 0x37, 0x5b, 0xae, 0x97, 0xce, 0x16, 0x95, 0x95, 0x2c, 0xdc, 0x1a, 0x39, - 0x59, 0xb8, 0x8e, 0xe7, 0x92, 0xa9, 0xb8, 0xb3, 0xe3, 0xb9, 0x54, 0x5e, 0xf4, 0x64, 0x5d, 0xf2, - 0xa7, 0x16, 0x3c, 0xed, 0x34, 0xc5, 0xb9, 0xc0, 0x69, 0xcb, 0x52, 0x23, 0xc7, 0xad, 0x5c, 0xd1, - 0xe1, 0x98, 0xbb, 0x7c, 0xff, 0xc7, 0xaf, 0x54, 0x4e, 0xa0, 0x2a, 0x46, 0xfc, 0xa7, 0xe4, 0x17, - 0x3c, 0x7d, 0x52, 0x55, 0x3c, 0x91, 0x7d, 0xf2, 0x37, 0x60, 0x21, 0xf1, 0xc1, 0xd2, 0x12, 0x5e, - 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0x75, 0x97, 0xdf, 0x84, 0x0f, 0x3f, 0x94, 0xcf, 0x91, - 0x26, 0xdb, 0x57, 0x2c, 0x28, 0x09, 0xbb, 0x36, 0xd2, 0xdd, 0x94, 0x13, 0x66, 0xea, 0xe4, 0x5d, - 0xa9, 0x6d, 0x64, 0x38, 0x61, 0x32, 0x59, 0xbe, 0xef, 0x7a, 0x4d, 0x39, 0xca, 0x5a, 0x96, 0xbf, - 0xe1, 0x7a, 0x4d, 0xe4, 0x10, 0x2d, 0xed, 0x0b, 0x03, 0xed, 0x4d, 0xbf, 0x6e, 0xc1, 0x3c, 0x8f, - 0x81, 0x8d, 0xcf, 0x84, 0x2f, 0x6b, 0x67, 0x23, 0xc1, 0xc6, 0xa5, 0xa4, 0xb3, 0xd1, 0x83, 0xa3, - 0xf2, 0xac, 0x88, 0x9a, 0x4d, 0xfa, 0x1e, 0x7d, 0x4e, 0x1a, 0x92, 0xb8, 0x4b, 0xd4, 0xc4, 0xc8, - 0x76, 0x0e, 0x6d, 0x68, 0xad, 0x2b, 0x24, 0x18, 0xe3, 0xb3, 0xdf, 0x85, 0x39, 0x33, 0x98, 0x85, - 0xbc, 0x0c, 0xb3, 0x5d, 0xd7, 0x6b, 0x25, 0x83, 0x1e, 0xb5, 0xb1, 0xbd, 0x16, 0x83, 0xd0, 0xac, - 0xc7, 0x9b, 0xf9, 0x71, 0xb3, 0x94, 0x8d, 0xbe, 0xe6, 0x9b, 0xcd, 0xe2, 0x3f, 0x3c, 0xc7, 0x76, - 0x46, 0xd0, 0x54, 0xee, 0x39, 0xb6, 0x33, 0x68, 0xfc, 0xe4, 0x72, 0x6c, 0x67, 0x31, 0xf3, 0x7f, - 0x57, 0x8e, 0xed, 0x9f, 0x81, 0x51, 0x93, 0x2b, 0xb2, 0xfd, 0xee, 0x9e, 0x19, 0x98, 0xae, 0x7b, - 0x5c, 0x46, 0xa6, 0x4b, 0xa8, 0xfd, 0x1e, 0x5b, 0x36, 0xfa, 0x50, 0x5b, 0xe9, 0x45, 0x7b, 0xc4, - 0x83, 0x62, 0xe8, 0xb6, 0x0e, 0x5e, 0xca, 0xc9, 0xa6, 0xcd, 0x50, 0xc9, 0x87, 0x19, 0xe2, 0x80, - 0x58, 0x56, 0x88, 0x82, 0x8c, 0xfd, 0xdd, 0x09, 0x58, 0x4c, 0x9f, 0xbc, 0xf3, 0x76, 0x6a, 0x20, - 0x5f, 0xb7, 0x60, 0xde, 0xe9, 0x45, 0x7b, 0xd4, 0x8b, 0xd4, 0xc5, 0x56, 0x2e, 0x6f, 0x86, 0x24, - 0xfb, 0xce, 0x48, 0x61, 0x95, 0xa0, 0x85, 0x29, 0xda, 0xe4, 0xaf, 0xc0, 0x74, 0xe4, 0x76, 0xa8, - 0xdf, 0x13, 0xf6, 0xb8, 0x82, 0x38, 0x17, 0x6f, 0x8b, 0x22, 0x54, 0x30, 0xf2, 0x3c, 0x3b, 0xc7, - 0x30, 0x45, 0x26, 0xa0, 0xd2, 0xfb, 0x75, 0x31, 0x36, 0x20, 0x8a, 0x72, 0xd4, 0x35, 0xec, 0x8f, - 0xc3, 0x88, 0x69, 0x27, 0xed, 0xab, 0x40, 0xd0, 0x6f, 0xb7, 0x77, 0x9c, 0xc6, 0xfe, 0x1d, 0xd7, - 0x6b, 0xfa, 0xf7, 0xb8, 0x4c, 0x5a, 0x85, 0x52, 0x20, 0x63, 0x0f, 0x43, 0x39, 0x7d, 0xb4, 0x50, - 0x53, 0x41, 0x89, 0x21, 0xc6, 0x75, 0xec, 0x3f, 0x9c, 0x80, 0x69, 0x19, 0x28, 0xfb, 0x18, 0x7c, - 0xe0, 0xf7, 0x13, 0x97, 0xa3, 0x1b, 0xb9, 0xc4, 0xf7, 0x0e, 0x74, 0x80, 0x0f, 0x53, 0x0e, 0xf0, - 0x6f, 0xe4, 0x43, 0xee, 0x64, 0xef, 0xf7, 0x3f, 0x28, 0xc2, 0x42, 0x2a, 0xf0, 0x98, 0x29, 0xa6, - 0x7d, 0x4e, 0x9f, 0xb7, 0x73, 0x8d, 0x6d, 0xd6, 0x41, 0x1d, 0x27, 0xfb, 0x7f, 0x86, 0x89, 0x24, - 0xc1, 0xb7, 0x72, 0x7b, 0xff, 0xe0, 0x2f, 0xf3, 0x05, 0x8f, 0xe8, 0xcf, 0x48, 0xbe, 0x6d, 0xc1, - 0x39, 0xa7, 0xff, 0x01, 0x09, 0x69, 0x40, 0xbb, 0x95, 0xfb, 0xcb, 0x14, 0xd5, 0xa7, 0x24, 0x93, - 0x59, 0xef, 0x74, 0x60, 0x16, 0x2b, 0xf6, 0x7f, 0xb6, 0xe0, 0xc9, 0x81, 0x21, 0xf4, 0x3c, 0x03, - 0x53, 0x90, 0x84, 0x4a, 0x99, 0x91, 0x73, 0xa2, 0x10, 0x7d, 0x99, 0x9a, 0x4e, 0x9a, 0x93, 0x26, - 0x4f, 0x5e, 0x82, 0x39, 0xae, 0xac, 0x31, 0xe9, 0x19, 0xd1, 0xae, 0xbc, 0x0b, 0xe2, 0xb7, 0x02, - 0x75, 0xa3, 0x1c, 0x13, 0xb5, 0xec, 0x6f, 0x5b, 0xb0, 0x34, 0x28, 0x1f, 0xcf, 0x10, 0x96, 0x8a, - 0xbf, 0x9e, 0x8a, 0x23, 0x28, 0xf7, 0xc5, 0x11, 0xa4, 0x6c, 0x15, 0x2a, 0x64, 0xc0, 0x30, 0x13, - 0x14, 0x1e, 0xe2, 0x26, 0xff, 0x0d, 0x0b, 0x2e, 0x0e, 0x58, 0xf0, 0x7d, 0xf1, 0x24, 0xd6, 0x23, - 0xc7, 0x93, 0x4c, 0x0c, 0x1b, 0x4f, 0x62, 0xff, 0x51, 0x01, 0x16, 0x25, 0x3f, 0xb1, 0xc6, 0xfe, - 0x4a, 0x22, 0x1a, 0xe3, 0xa7, 0x52, 0xd1, 0x18, 0xe7, 0xd3, 0xf5, 0xff, 0x32, 0x14, 0xe3, 0x83, - 0x15, 0x8a, 0xf1, 0x17, 0x13, 0x70, 0x21, 0x33, 0x4d, 0x10, 0xf9, 0x5a, 0xc6, 0xee, 0x75, 0x27, - 0xe7, 0x7c, 0x44, 0x43, 0xee, 0x5f, 0xe3, 0xc6, 0x2f, 0xfc, 0xaa, 0x19, 0x37, 0x20, 0x76, 0xa3, - 0xdd, 0x53, 0xc8, 0xac, 0x34, 0x62, 0x08, 0x81, 0xfd, 0x4b, 0x05, 0xb8, 0x32, 0x2c, 0xa2, 0x0f, - 0x68, 0x88, 0x59, 0x98, 0x08, 0x31, 0x7b, 0x4c, 0x9a, 0xc5, 0xa9, 0x44, 0x9b, 0xfd, 0x93, 0x49, - 0xbd, 0xed, 0xf5, 0xcf, 0xcf, 0xa1, 0x1c, 0x07, 0xa6, 0x99, 0xf6, 0xa9, 0x52, 0x0d, 0xc7, 0xa2, - 0x70, 0xba, 0x2e, 0x8a, 0x1f, 0x1c, 0x95, 0xcf, 0xc6, 0xc9, 0x2a, 0x64, 0x21, 0xaa, 0x46, 0xe4, - 0x0a, 0xcc, 0x04, 0x02, 0xaa, 0x82, 0x6a, 0xa4, 0xf7, 0x85, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x32, - 0xd4, 0xf5, 0xc9, 0xd3, 0xca, 0xc9, 0x72, 0x92, 0x53, 0xc9, 0xdb, 0x30, 0x13, 0xaa, 0x34, 0xc0, - 0x42, 0x71, 0x79, 0x71, 0xc8, 0x58, 0x2d, 0x76, 0x18, 0x57, 0x39, 0x81, 0xc5, 0xf7, 0xe9, 0x8c, - 0xc1, 0x1a, 0x25, 0xb1, 0xf5, 0x39, 0x58, 0x18, 0xbd, 0xa1, 0xff, 0x0c, 0x4c, 0x22, 0x98, 0x96, - 0xcf, 0x24, 0xca, 0xdb, 0xb8, 0xad, 0x9c, 0xe2, 0x32, 0xa4, 0xd7, 0x2e, 0x3f, 0xdb, 0x29, 0x7b, - 0x8c, 0x22, 0x65, 0xff, 0xc0, 0x82, 0x59, 0x39, 0x47, 0x1e, 0x43, 0xd0, 0xda, 0xdd, 0x64, 0xd0, - 0xda, 0xd5, 0x5c, 0x24, 0xd6, 0x80, 0x88, 0xb5, 0xbb, 0x30, 0x67, 0xe6, 0xa7, 0x23, 0x9f, 0x35, - 0x24, 0xae, 0x35, 0x4e, 0xc6, 0x27, 0x25, 0x93, 0x63, 0x69, 0x6c, 0xff, 0x76, 0x49, 0xf7, 0x22, - 0x3f, 0xbb, 0x9a, 0x33, 0xdf, 0x3a, 0x71, 0xe6, 0x9b, 0x13, 0x6f, 0x22, 0xff, 0x89, 0x77, 0x0b, - 0x66, 0x94, 0x58, 0x94, 0xca, 0xc3, 0xb3, 0xa6, 0x1b, 0x2f, 0xd3, 0x40, 0x18, 0x32, 0x63, 0xb9, - 0xf0, 0x33, 0xa8, 0x1e, 0x43, 0x2d, 0xae, 0x35, 0x1a, 0xf2, 0x0e, 0xcc, 0xde, 0xf3, 0x83, 0xfd, - 0xb6, 0xef, 0xf0, 0x24, 0xe4, 0x90, 0xc7, 0xcd, 0xb1, 0x36, 0xdc, 0x8a, 0x58, 0x8a, 0x3b, 0x31, - 0x7e, 0x34, 0x89, 0x91, 0x0a, 0x2c, 0x74, 0x5c, 0x0f, 0xa9, 0xd3, 0xd4, 0xb1, 0x69, 0x93, 0x22, - 0xef, 0xb1, 0x52, 0xad, 0xb7, 0x92, 0x60, 0x4c, 0xd7, 0xe7, 0x26, 0x98, 0x20, 0x61, 0x6d, 0x90, - 0xc9, 0x4d, 0x6b, 0xe3, 0x4f, 0xc6, 0xa4, 0x05, 0x43, 0x04, 0x13, 0x24, 0xcb, 0x31, 0x45, 0x9b, - 0x7c, 0x11, 0x66, 0x42, 0x99, 0x7c, 0x2e, 0x1f, 0x97, 0x03, 0x7d, 0xb6, 0x17, 0x48, 0xe3, 0xa1, - 0x54, 0x25, 0xa8, 0x09, 0x92, 0x4d, 0x38, 0xaf, 0xcc, 0x27, 0x89, 0x87, 0xa2, 0xa6, 0xe2, 0x5c, - 0x45, 0x98, 0x01, 0xc7, 0xcc, 0x56, 0x4c, 0x95, 0xe3, 0x79, 0x1f, 0xc5, 0x4d, 0x9d, 0x71, 0xb9, - 0xc5, 0xd7, 0x5f, 0x13, 0x25, 0xf4, 0xa4, 0xd0, 0xcb, 0x99, 0x31, 0x42, 0x2f, 0xeb, 0x70, 0x21, - 0x0d, 0xe2, 0x49, 0xa8, 0x78, 0xde, 0x2b, 0x63, 0x0b, 0xad, 0x65, 0x55, 0xc2, 0xec, 0xb6, 0xe4, - 0x0e, 0x94, 0x02, 0xca, 0x0f, 0x59, 0x15, 0xe5, 0xe4, 0x34, 0xb2, 0x3b, 0x27, 0x2a, 0x04, 0x18, - 0xe3, 0x62, 0xe3, 0xee, 0x24, 0x33, 0x11, 0xdf, 0xca, 0xf1, 0x85, 0x52, 0x39, 0xf6, 0x03, 0x92, - 0xc3, 0xd9, 0xff, 0x76, 0x01, 0xce, 0x24, 0x6c, 0x40, 0xe4, 0x59, 0x28, 0xf2, 0xac, 0x5c, 0x5c, - 0x5a, 0xcd, 0xc4, 0x12, 0x55, 0x74, 0x8e, 0x80, 0x91, 0x5f, 0xb6, 0x60, 0xa1, 0x9b, 0xb8, 0xdc, - 0x50, 0x82, 0x7c, 0x5c, 0xf3, 0x65, 0x02, 0xa9, 0x91, 0xc3, 0x3f, 0x49, 0x0c, 0xd3, 0xd4, 0x99, - 0x3c, 0x90, 0x3e, 0xd1, 0x6d, 0x1a, 0xf0, 0xda, 0x52, 0xd1, 0xd3, 0x28, 0xd6, 0x92, 0x60, 0x4c, - 0xd7, 0x67, 0x23, 0xcc, 0xbf, 0x6e, 0x9c, 0x37, 0xf0, 0x2a, 0x0a, 0x01, 0xc6, 0xb8, 0xc8, 0x6b, - 0x30, 0x2f, 0x13, 0xd0, 0xd6, 0xfc, 0xe6, 0x75, 0x27, 0xdc, 0x93, 0x27, 0x1c, 0x7d, 0x22, 0x5b, - 0x4b, 0x40, 0x31, 0x55, 0x9b, 0x7f, 0x5b, 0x9c, 0xe5, 0x97, 0x23, 0x98, 0x4a, 0x3e, 0x71, 0xb0, - 0x96, 0x04, 0x63, 0xba, 0x3e, 0x79, 0xde, 0xd8, 0x86, 0xc4, 0xed, 0xb9, 0x96, 0x06, 0x19, 0x5b, - 0x51, 0x05, 0x16, 0x7a, 0xfc, 0x40, 0xd8, 0x54, 0x40, 0xb9, 0x1e, 0x35, 0xc1, 0xdb, 0x49, 0x30, - 0xa6, 0xeb, 0x93, 0x57, 0xe1, 0x4c, 0xc0, 0x84, 0xad, 0x46, 0x20, 0xae, 0xd4, 0xf5, 0x8d, 0x29, - 0x9a, 0x40, 0x4c, 0xd6, 0x25, 0xaf, 0xc3, 0xd9, 0x38, 0x5f, 0xa3, 0x42, 0x20, 0xee, 0xd8, 0x75, - 0xf2, 0xb0, 0x4a, 0xba, 0x02, 0xf6, 0xb7, 0x21, 0x7f, 0x0b, 0x16, 0x8d, 0x9e, 0xd8, 0xf0, 0x9a, - 0xf4, 0xbe, 0xcc, 0xa9, 0xc7, 0xdf, 0xae, 0x59, 0x4b, 0xc1, 0xb0, 0xaf, 0x36, 0xf9, 0x14, 0xcc, - 0x37, 0xfc, 0x76, 0x9b, 0xcb, 0x38, 0x91, 0x5e, 0x5f, 0x24, 0xcf, 0x13, 0x69, 0x06, 0x13, 0x10, - 0x4c, 0xd5, 0x24, 0x37, 0x80, 0xf8, 0x3b, 0x4c, 0xbd, 0xa2, 0xcd, 0xd7, 0xc5, 0x23, 0xeb, 0x4c, - 0xe3, 0x38, 0x93, 0x8c, 0xc8, 0x78, 0xb3, 0xaf, 0x06, 0x66, 0xb4, 0xe2, 0xb9, 0xc7, 0x8c, 0x08, - 0xd6, 0xf9, 0x3c, 0xde, 0x83, 0x4b, 0x9b, 0x2f, 0x1e, 0x1a, 0xbe, 0x1a, 0xc0, 0x94, 0x08, 0x90, - 0xc9, 0x27, 0x8b, 0x9e, 0x99, 0x69, 0x3b, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4a, 0xe4, 0x17, 0xa0, - 0xb4, 0xa3, 0x9e, 0x5d, 0xe0, 0xa9, 0xf3, 0xc6, 0xde, 0x17, 0x53, 0x2f, 0x88, 0xc4, 0xc7, 0x73, - 0x0d, 0xc0, 0x98, 0x24, 0x79, 0x0e, 0x66, 0xaf, 0xd7, 0x2a, 0x7a, 0x16, 0x9e, 0xe5, 0xa3, 0x3f, - 0xc9, 0x9a, 0xa0, 0x09, 0x60, 0x2b, 0x4c, 0xab, 0x6f, 0x24, 0xf9, 0x92, 0x49, 0x86, 0x36, 0xc6, - 0x6a, 0xf3, 0x7b, 0x70, 0xac, 0x2f, 0x9d, 0x4b, 0xd5, 0x96, 0xe5, 0xa8, 0x6b, 0x90, 0xb7, 0x61, - 0x56, 0xee, 0x17, 0x5c, 0x36, 0x9d, 0x7f, 0xb4, 0xe8, 0x68, 0x8c, 0x51, 0xa0, 0x89, 0x8f, 0x5f, - 0xde, 0xf2, 0x6c, 0xf4, 0xf4, 0x5a, 0xaf, 0xdd, 0x5e, 0xba, 0xc0, 0xe5, 0x66, 0x7c, 0x79, 0x1b, - 0x83, 0xd0, 0xac, 0x47, 0x5e, 0x54, 0xfe, 0x4c, 0x1f, 0x4a, 0xdc, 0x66, 0x6b, 0x7f, 0x26, 0xad, - 0x74, 0x0f, 0x08, 0xa0, 0xb8, 0xf8, 0x10, 0x47, 0xa2, 0x1d, 0x58, 0x56, 0x1a, 0x5f, 0xff, 0x22, - 0x59, 0x5a, 0x4a, 0x98, 0x4a, 0x96, 0xef, 0x0c, 0xac, 0x89, 0x27, 0x60, 0x21, 0x3b, 0x50, 0x70, - 0xda, 0x3b, 0x4b, 0x4f, 0xe6, 0xa1, 0xba, 0x56, 0x36, 0xab, 0x72, 0x46, 0x71, 0xa7, 0xc7, 0xca, - 0x66, 0x15, 0x19, 0x72, 0xe2, 0xc2, 0xa4, 0xd3, 0xde, 0x09, 0x97, 0x96, 0xf9, 0x9a, 0xcd, 0x8d, - 0x48, 0x6c, 0x3c, 0xd8, 0xac, 0x86, 0xc8, 0x49, 0xd8, 0x5f, 0x9e, 0xd0, 0x17, 0x35, 0x3a, 0x91, - 0xf1, 0xbb, 0xe6, 0x02, 0xb2, 0xf2, 0x78, 0x27, 0xbc, 0xef, 0x19, 0x14, 0xb1, 0xf7, 0x65, 0x2e, - 0x9f, 0xae, 0x16, 0x19, 0xb9, 0xa4, 0x88, 0x4a, 0x26, 0x69, 0x16, 0xa7, 0xe7, 0xa4, 0xc0, 0xb0, - 0x7f, 0x17, 0xb4, 0xd1, 0x2f, 0xe5, 0x0b, 0x14, 0x40, 0xd1, 0x0d, 0x23, 0xd7, 0xcf, 0x31, 0x68, - 0x38, 0x95, 0xdd, 0x98, 0xc7, 0x24, 0x70, 0x00, 0x0a, 0x52, 0x8c, 0xa6, 0xd7, 0x72, 0xbd, 0xfb, - 0xf2, 0xf3, 0x6f, 0xe5, 0xee, 0xe4, 0x23, 0x68, 0x72, 0x00, 0x0a, 0x52, 0xe4, 0xae, 0x98, 0xd4, - 0xf9, 0xbc, 0x09, 0xbf, 0x59, 0x4d, 0xd1, 0x4b, 0x4e, 0xee, 0xbb, 0x50, 0x08, 0x3b, 0xae, 0x54, - 0x97, 0xc6, 0xa4, 0x55, 0xdf, 0xda, 0xc8, 0xa2, 0x55, 0xdf, 0xda, 0x40, 0x46, 0x84, 0x7c, 0xd5, - 0x02, 0x70, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x6d, 0x9d, 0x19, 0xf3, 0xd5, 0x82, 0x8a, 0xc6, - 0x97, 0x22, 0xcd, 0xdd, 0x5a, 0x63, 0x28, 0x1a, 0x94, 0xc9, 0x3b, 0x30, 0xed, 0x88, 0xf7, 0xd1, - 0xa4, 0x87, 0x76, 0x3e, 0x8f, 0xfe, 0xa5, 0x38, 0xe0, 0x66, 0x1a, 0x09, 0x42, 0x45, 0x90, 0xd1, - 0x8e, 0x02, 0x87, 0xee, 0xba, 0xfb, 0xd2, 0x38, 0x54, 0x1f, 0xfb, 0xe1, 0x02, 0x86, 0x2c, 0x8b, - 0xb6, 0x04, 0xa1, 0x22, 0x28, 0xde, 0xab, 0x76, 0x3c, 0x47, 0xc7, 0xdd, 0xe5, 0x13, 0x9d, 0x69, - 0x46, 0xf2, 0x19, 0xef, 0x55, 0x9b, 0x84, 0x30, 0x49, 0x97, 0x1c, 0xc0, 0x94, 0xc3, 0x5f, 0x6e, - 0x94, 0x47, 0x31, 0xcc, 0xe3, 0x15, 0xc8, 0x54, 0x1f, 0x70, 0xe1, 0x22, 0xdf, 0x87, 0x94, 0xd4, - 0xc8, 0x6f, 0x58, 0x30, 0x2d, 0x9c, 0x87, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x0b, 0xa7, 0x90, 0x25, - 0x5d, 0x3a, 0x36, 0x4b, 0x57, 0xa0, 0x8f, 0x6a, 0xcf, 0x48, 0x51, 0x7a, 0xa2, 0x6b, 0xb3, 0xe2, - 0x6e, 0xf9, 0x53, 0x30, 0x67, 0x62, 0x19, 0xc9, 0xb9, 0xf9, 0xc7, 0x05, 0x00, 0xde, 0xd1, 0x22, - 0xd3, 0x46, 0x87, 0xa7, 0x74, 0xdd, 0xf3, 0x9b, 0xf9, 0x3c, 0xb9, 0x69, 0x26, 0xcc, 0x00, 0x99, - 0xbf, 0x75, 0xcf, 0x6f, 0xa2, 0x24, 0x42, 0x5a, 0x30, 0xd9, 0x75, 0xa2, 0xbd, 0xfc, 0xb3, 0x73, - 0xcc, 0x88, 0x90, 0xd3, 0x68, 0x0f, 0x39, 0x01, 0xf2, 0x9e, 0x05, 0xd3, 0x22, 0x3f, 0x87, 0xba, - 0x38, 0x19, 0xdb, 0x81, 0x41, 0xf5, 0xd9, 0x8a, 0x48, 0x02, 0x22, 0x47, 0x50, 0xeb, 0x38, 0xb2, - 0x14, 0x15, 0xd9, 0xe5, 0xf7, 0x2d, 0x98, 0x33, 0xab, 0x66, 0x0c, 0xd3, 0xcf, 0x99, 0xc3, 0x94, - 0x67, 0x7f, 0x98, 0x23, 0xfe, 0xdf, 0x2c, 0x30, 0xde, 0x50, 0x8f, 0x7d, 0xb8, 0xad, 0xa1, 0x7d, - 0xb8, 0x27, 0x46, 0xf4, 0xe1, 0x2e, 0x8c, 0xe4, 0xc3, 0x3d, 0x39, 0xba, 0x0f, 0x77, 0x71, 0xb0, - 0x0f, 0xb7, 0xfd, 0x4d, 0x0b, 0xce, 0xf6, 0xed, 0x36, 0x4c, 0x0f, 0x0e, 0x7c, 0x3f, 0x1a, 0xe0, - 0xfb, 0x88, 0x31, 0x08, 0xcd, 0x7a, 0x64, 0x1d, 0x16, 0xe5, 0x03, 0x06, 0xf5, 0x6e, 0xdb, 0xcd, - 0xcc, 0x9c, 0xb2, 0x9d, 0x82, 0x63, 0x5f, 0x0b, 0xfb, 0x77, 0x2d, 0x98, 0x35, 0xe2, 0xad, 0xd9, - 0x77, 0xf0, 0xb8, 0x74, 0xc9, 0x46, 0xec, 0xaa, 0xc6, 0x2f, 0xaa, 0x04, 0x4c, 0xdc, 0x99, 0xb6, - 0x8c, 0xf4, 0xd6, 0xf1, 0x9d, 0x29, 0x2b, 0x45, 0x09, 0x15, 0x89, 0x8b, 0x69, 0x97, 0x77, 0x7a, - 0xc1, 0x4c, 0x5c, 0x4c, 0xbb, 0xc8, 0x21, 0x9c, 0x1c, 0x3b, 0x10, 0x48, 0xf7, 0x7e, 0xe3, 0xa9, - 0x08, 0x27, 0x88, 0x50, 0xc0, 0xc8, 0x25, 0x28, 0x50, 0xaf, 0x29, 0xad, 0x17, 0xfa, 0x31, 0xc7, - 0xab, 0x5e, 0x13, 0x59, 0xb9, 0xfd, 0x26, 0xcc, 0xd5, 0x69, 0x23, 0xa0, 0xd1, 0x1b, 0xf4, 0x70, - 0xe8, 0xd7, 0x21, 0xd9, 0x6c, 0x4f, 0xbd, 0x0e, 0xc9, 0x9a, 0xb3, 0x72, 0xfb, 0x9f, 0x59, 0x90, - 0x7a, 0xcf, 0xc4, 0xb8, 0x3f, 0xb1, 0x06, 0xde, 0x9f, 0x98, 0x36, 0xf7, 0x89, 0x13, 0x6d, 0xee, - 0x37, 0x80, 0x74, 0xd8, 0x52, 0x48, 0xbc, 0xde, 0x23, 0x0d, 0x47, 0x71, 0x76, 0x87, 0xbe, 0x1a, - 0x98, 0xd1, 0xca, 0xfe, 0xa7, 0x82, 0x59, 0xf3, 0x85, 0x93, 0x87, 0x77, 0x40, 0x0f, 0x8a, 0x1c, - 0x95, 0xb4, 0x9e, 0x8d, 0x69, 0x79, 0xee, 0xcf, 0x92, 0x14, 0x0f, 0xa4, 0x5c, 0xf2, 0x9c, 0x9a, - 0xfd, 0x47, 0x82, 0x57, 0xe3, 0x09, 0x94, 0x21, 0x78, 0xed, 0x24, 0x79, 0xbd, 0x9e, 0x97, 0xac, - 0xcc, 0xe6, 0x91, 0xac, 0x00, 0x74, 0x69, 0xd0, 0xa0, 0x5e, 0xa4, 0xa2, 0x4e, 0x8a, 0x32, 0xfe, - 0x51, 0x97, 0xa2, 0x51, 0xc3, 0xfe, 0x06, 0x5b, 0x40, 0xb1, 0x73, 0x27, 0xb9, 0x92, 0xf6, 0xd8, - 0x4c, 0x2f, 0x0e, 0xed, 0xb0, 0x69, 0xc4, 0x22, 0x4c, 0x3c, 0x24, 0x16, 0xe1, 0x23, 0x30, 0x1d, - 0xf8, 0x6d, 0x5a, 0x09, 0xbc, 0xb4, 0x83, 0x0b, 0xb2, 0x62, 0xbc, 0x89, 0x0a, 0x6e, 0xff, 0x9a, - 0x05, 0x8b, 0xe9, 0x60, 0xa9, 0xdc, 0xdd, 0x48, 0xcd, 0x88, 0xee, 0xc2, 0xe8, 0x11, 0xdd, 0xf6, - 0x7b, 0x8c, 0xc9, 0xc8, 0x6d, 0xec, 0xbb, 0x9e, 0x08, 0x82, 0x66, 0x3d, 0xf7, 0x11, 0x98, 0xa6, - 0xf2, 0xfd, 0x47, 0x61, 0x04, 0xd6, 0x4c, 0xaa, 0x67, 0x1f, 0x15, 0x9c, 0x54, 0x60, 0x41, 0x5d, - 0x7d, 0x29, 0xcb, 0xbd, 0x48, 0xde, 0xa0, 0x2d, 0x85, 0xeb, 0x49, 0x30, 0xa6, 0xeb, 0xdb, 0x5f, - 0x82, 0x59, 0x63, 0x53, 0xe2, 0xf2, 0xfb, 0xbe, 0xd3, 0x88, 0xd2, 0x72, 0xef, 0x2a, 0x2b, 0x44, - 0x01, 0xe3, 0x17, 0x0c, 0x22, 0x96, 0x23, 0x25, 0xf7, 0x64, 0x04, 0x87, 0x84, 0x32, 0x64, 0x01, - 0x6d, 0xd1, 0xfb, 0x2a, 0xfb, 0xb8, 0x42, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x1e, 0x66, 0x54, - 0x8a, 0x1d, 0x9e, 0xa7, 0x42, 0x19, 0xbf, 0xcd, 0x3c, 0x15, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, - 0xc1, 0x8c, 0xca, 0x04, 0xf4, 0xf0, 0xda, 0x4c, 0x14, 0x85, 0x9e, 0x7b, 0xdd, 0x0f, 0x23, 0x95, - 0xbe, 0x48, 0xdc, 0xcf, 0xdd, 0xdc, 0xe0, 0x65, 0xa8, 0xa1, 0xf6, 0x8b, 0xb0, 0x90, 0xba, 0xa7, - 0x1d, 0x22, 0xa9, 0xc5, 0xef, 0x17, 0x60, 0xce, 0xbc, 0xae, 0x1b, 0x62, 0x15, 0x0f, 0x2f, 0x1c, - 0x33, 0xae, 0xd8, 0x0a, 0x23, 0x5e, 0xb1, 0x99, 0x77, 0x9a, 0x93, 0xa7, 0x7b, 0xa7, 0x59, 0xcc, - 0xe7, 0x4e, 0xd3, 0xb8, 0x7b, 0x9f, 0x7a, 0x7c, 0x77, 0xef, 0xbf, 0x53, 0x84, 0xf9, 0x64, 0x96, - 0xc4, 0x21, 0x46, 0xf2, 0xf9, 0xbe, 0x91, 0x1c, 0xd1, 0xa6, 0x5f, 0x18, 0xd7, 0xa6, 0x3f, 0x39, - 0xae, 0x4d, 0xbf, 0xf8, 0x08, 0x36, 0xfd, 0x7e, 0x8b, 0xfc, 0xd4, 0xd0, 0x16, 0xf9, 0x4f, 0x6b, - 0xaf, 0xbc, 0xe9, 0x84, 0x1b, 0x4b, 0xec, 0x95, 0x47, 0x92, 0xc3, 0xb0, 0xe6, 0x37, 0x33, 0xbd, - 0x1b, 0x67, 0x1e, 0x62, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, 0x0e, - 0x74, 0x2f, 0xc3, 0xac, 0x9c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, 0xd6, - 0xe3, 0x0f, 0x68, 0x27, 0xdf, 0x17, 0xe7, 0x57, 0x24, 0xe6, 0x03, 0xda, 0xa9, 0xf7, 0xc8, 0xd3, - 0xf5, 0xed, 0x2f, 0xc2, 0x85, 0x4c, 0x33, 0x02, 0x37, 0xe1, 0x72, 0xed, 0x88, 0x36, 0x65, 0x05, - 0x83, 0x8d, 0x54, 0xe2, 0xfd, 0xe5, 0x3b, 0x03, 0x6b, 0xe2, 0x09, 0x58, 0xec, 0xef, 0x14, 0x60, - 0x3e, 0xf9, 0xfa, 0x22, 0xb9, 0xa7, 0x8d, 0x8e, 0xb9, 0xd8, 0x3b, 0x05, 0x5a, 0x23, 0xf3, 0xde, - 0xc0, 0xcb, 0x8a, 0x7b, 0x7c, 0x7e, 0xed, 0xe8, 0x34, 0x80, 0xa7, 0x47, 0x58, 0xde, 0x12, 0x48, - 0x72, 0xfc, 0x81, 0xc5, 0x38, 0x48, 0x4f, 0x9e, 0x66, 0x73, 0xa7, 0x1e, 0xc7, 0xcd, 0x69, 0x52, - 0x68, 0x90, 0x65, 0x7b, 0xcb, 0x01, 0x0d, 0xdc, 0x5d, 0x57, 0xbf, 0x1c, 0xcd, 0x25, 0xf7, 0x5b, - 0xb2, 0x0c, 0x35, 0xd4, 0x7e, 0x6f, 0x02, 0xe2, 0x57, 0xf5, 0xf9, 0x13, 0x65, 0xa1, 0x71, 0x72, - 0x90, 0xc3, 0x76, 0x63, 0xdc, 0x77, 0x00, 0x63, 0x8c, 0xd2, 0x63, 0xda, 0x28, 0xc1, 0x04, 0xc5, - 0x9f, 0xc0, 0x6b, 0xfa, 0x0e, 0x2c, 0xa4, 0x92, 0x42, 0xe4, 0x9e, 0x39, 0xf5, 0x47, 0x05, 0x28, - 0xe9, 0xb4, 0x1a, 0xe4, 0x93, 0x09, 0x33, 0x4e, 0xa9, 0xfa, 0x61, 0xe3, 0xfd, 0x9c, 0x3d, 0xbf, - 0xf9, 0xe0, 0xa8, 0xbc, 0xa0, 0x2b, 0xa7, 0x4c, 0x32, 0x97, 0xa0, 0xd0, 0x0b, 0xda, 0xe9, 0x73, - 0xda, 0x6d, 0xdc, 0x44, 0x56, 0x4e, 0xee, 0xa7, 0xed, 0x28, 0x5b, 0x39, 0xa5, 0x02, 0x11, 0x07, - 0x9a, 0xc1, 0xf6, 0x13, 0xb6, 0x4b, 0xee, 0xf8, 0xcd, 0xc3, 0xf4, 0x7b, 0x3b, 0x55, 0xbf, 0x79, - 0x88, 0x1c, 0x42, 0x5e, 0x83, 0x79, 0x19, 0xbd, 0x64, 0xbe, 0x42, 0x5e, 0x88, 0x2f, 0xdf, 0xb7, - 0x13, 0x50, 0x4c, 0xd5, 0x66, 0xbb, 0xec, 0xdd, 0xd0, 0xf7, 0x78, 0x3e, 0xdc, 0xa9, 0xe4, 0x4d, - 0xdd, 0x8d, 0xfa, 0x9b, 0x37, 0xb9, 0x39, 0x49, 0xd7, 0x48, 0x04, 0x48, 0x4d, 0x3f, 0x2c, 0x40, - 0x8a, 0xac, 0x0b, 0xdc, 0x8c, 0x5b, 0xbe, 0xa3, 0xcc, 0x55, 0xaf, 0x28, 0xbc, 0xac, 0xec, 0xc1, - 0xd1, 0x09, 0x86, 0x3e, 0xdd, 0xd2, 0xbe, 0x0d, 0x0b, 0xa9, 0x0e, 0x53, 0xe7, 0x6a, 0x2b, 0xfb, - 0x5c, 0x3d, 0xdc, 0x13, 0x39, 0xff, 0xc2, 0x82, 0xb3, 0x7d, 0x22, 0x60, 0xd8, 0x38, 0xbe, 0xf4, - 0x66, 0x34, 0xf1, 0xe8, 0x9b, 0x51, 0x61, 0xb4, 0xcd, 0xa8, 0xba, 0xf3, 0xbd, 0x1f, 0x5e, 0x7e, - 0xe2, 0xfb, 0x3f, 0xbc, 0xfc, 0xc4, 0x1f, 0xff, 0xf0, 0xf2, 0x13, 0xef, 0x1d, 0x5f, 0xb6, 0xbe, - 0x77, 0x7c, 0xd9, 0xfa, 0xfe, 0xf1, 0x65, 0xeb, 0x8f, 0x8f, 0x2f, 0x5b, 0xff, 0xe9, 0xf8, 0xb2, - 0xf5, 0xcd, 0x1f, 0x5d, 0x7e, 0xe2, 0xb3, 0x9f, 0x8e, 0x27, 0xe8, 0xaa, 0x9a, 0xa0, 0xfc, 0xc7, - 0xc7, 0xd4, 0x74, 0x5c, 0xed, 0xee, 0xb7, 0x56, 0xd9, 0x04, 0x5d, 0xd5, 0x25, 0x6a, 0x82, 0xfe, - 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xbb, 0x6e, 0x5a, 0xfc, 0x9e, 0x00, 0x00, + 0xa0, 0x0f, 0x8e, 0xca, 0x73, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xfb, 0x53, + 0x00, 0x6a, 0xba, 0xd2, 0x2e, 0xf9, 0x28, 0x94, 0x42, 0x1a, 0x09, 0xaa, 0xf2, 0x06, 0x41, 0x5c, + 0xcc, 0xa8, 0x42, 0x8c, 0xe1, 0x64, 0x1f, 0x8a, 0x5d, 0xa7, 0x17, 0x52, 0x39, 0xf8, 0x37, 0x72, + 0x19, 0xfc, 0x1a, 0xc3, 0x28, 0x4e, 0x68, 0xfc, 0x27, 0x0a, 0x1a, 0xe4, 0x2b, 0x16, 0x00, 0x4d, + 0x0e, 0xd8, 0xd8, 0x96, 0x12, 0x49, 0x32, 0x1e, 0x53, 0xd6, 0x07, 0xd5, 0xf9, 0xe3, 0xa3, 0x32, + 0x18, 0x43, 0x6f, 0x90, 0x25, 0xf7, 0x60, 0xc6, 0x51, 0x32, 0x7f, 0xf2, 0x34, 0x64, 0x3e, 0x3f, + 0x38, 0xe9, 0x49, 0xab, 0x89, 0x91, 0xaf, 0x59, 0x30, 0x1f, 0xd2, 0x48, 0x0e, 0x15, 0x93, 0x3c, + 0x52, 0xe1, 0x1d, 0x73, 0xd2, 0xd5, 0x13, 0x38, 0x85, 0x04, 0x4d, 0x96, 0x61, 0x8a, 0xae, 0x62, + 0xe5, 0x3a, 0x75, 0x9a, 0x34, 0xe0, 0xe7, 0x72, 0xa9, 0x49, 0x8d, 0xcf, 0x8a, 0x81, 0x53, 0xb3, + 0x62, 0x94, 0x61, 0x8a, 0xae, 0x62, 0x65, 0xcb, 0x0d, 0x02, 0x5f, 0xb2, 0x32, 0x93, 0x13, 0x2b, + 0x06, 0x4e, 0xcd, 0x8a, 0x51, 0x86, 0x29, 0xba, 0xf6, 0xb7, 0xcf, 0xc0, 0xbc, 0x5a, 0x48, 0xb1, + 0x66, 0x2f, 0xcc, 0x40, 0x03, 0x34, 0xfb, 0x35, 0x13, 0x88, 0xc9, 0xba, 0xac, 0xb1, 0x58, 0xaa, + 0x49, 0xc5, 0x5e, 0x37, 0xae, 0x9b, 0x40, 0x4c, 0xd6, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, + 0xcb, 0xe0, 0x31, 0xef, 0x2a, 0x63, 0xf9, 0x10, 0x5f, 0xf7, 0xb0, 0x7f, 0x21, 0x0a, 0x2a, 0xdc, + 0x92, 0x19, 0x25, 0x8c, 0x9b, 0x72, 0x71, 0xe4, 0xb3, 0x3e, 0x93, 0x76, 0x53, 0x31, 0x1a, 0xc9, + 0x32, 0x4c, 0x91, 0xcf, 0x50, 0xf6, 0x8b, 0xa7, 0xa8, 0xec, 0x7f, 0x16, 0x66, 0x3a, 0xce, 0xfd, + 0x7a, 0x2f, 0x68, 0x3d, 0xfa, 0xa1, 0x42, 0xba, 0xd7, 0x09, 0x2c, 0xa8, 0xf1, 0x91, 0x2f, 0x5b, + 0x86, 0xc8, 0x99, 0xe6, 0xc8, 0xef, 0xe4, 0x2b, 0x72, 0xf4, 0x5e, 0x39, 0x50, 0xf8, 0xf4, 0xa9, + 0xde, 0x33, 0x8f, 0x5d, 0xf5, 0x66, 0x6a, 0xa4, 0x58, 0x20, 0x5a, 0x8d, 0x2c, 0x9d, 0xaa, 0x1a, + 0xb9, 0x96, 0x20, 0x86, 0x29, 0xe2, 0x9c, 0x1f, 0xb1, 0xe6, 0x34, 0x3f, 0x70, 0xaa, 0xfc, 0xd4, + 0x13, 0xc4, 0x30, 0x45, 0x7c, 0xf0, 0x79, 0x73, 0xf6, 0x74, 0xce, 0x9b, 0x73, 0x39, 0x9c, 0x37, + 0x4f, 0x56, 0xc5, 0xcf, 0x8c, 0xab, 0x8a, 0x93, 0x1b, 0x40, 0x9a, 0x87, 0x9e, 0xd3, 0x71, 0x1b, + 0x52, 0x58, 0xf2, 0x6d, 0x73, 0x9e, 0xdb, 0x23, 0x96, 0xa5, 0x20, 0x23, 0xeb, 0x7d, 0x35, 0x30, + 0xa3, 0x15, 0x89, 0x60, 0xa6, 0xab, 0x34, 0xae, 0x85, 0x3c, 0x66, 0xbf, 0xd2, 0xc0, 0x84, 0xbf, + 0x00, 0x5b, 0x78, 0xaa, 0x04, 0x35, 0x25, 0xb2, 0x09, 0xe7, 0x3b, 0xae, 0x57, 0xf3, 0x9b, 0x61, + 0x8d, 0x06, 0xd2, 0xda, 0x52, 0xa7, 0xd1, 0xd2, 0x22, 0xef, 0x1b, 0x7e, 0x82, 0xde, 0xca, 0x80, + 0x63, 0x66, 0x2b, 0xfb, 0x7f, 0x5a, 0xb0, 0xb8, 0xd6, 0xf6, 0x7b, 0xcd, 0x3b, 0x4e, 0xd4, 0xd8, + 0x13, 0x57, 0xe5, 0xe4, 0x35, 0x98, 0x71, 0xbd, 0x88, 0x06, 0x07, 0x4e, 0x5b, 0xee, 0x4f, 0xb6, + 0x32, 0x9f, 0x6e, 0xc8, 0xf2, 0x07, 0x47, 0xe5, 0xf9, 0xf5, 0x5e, 0xc0, 0xdd, 0xe9, 0x84, 0xb4, + 0x42, 0xdd, 0x86, 0x7c, 0xdb, 0x82, 0xb3, 0xe2, 0xb2, 0x7d, 0xdd, 0x89, 0x9c, 0x5b, 0x3d, 0x1a, + 0xb8, 0x54, 0x5d, 0xb7, 0x8f, 0x29, 0xa8, 0xd2, 0xbc, 0x2a, 0x02, 0x87, 0xb1, 0xa2, 0xbe, 0x95, + 0xa6, 0x8c, 0xfd, 0xcc, 0xd8, 0xbf, 0x52, 0x80, 0x27, 0x07, 0xe2, 0x22, 0xcb, 0x30, 0xe1, 0x36, + 0xe5, 0xa7, 0x83, 0xc4, 0x3b, 0xb1, 0xd1, 0xc4, 0x09, 0xb7, 0x49, 0x56, 0xb8, 0xce, 0x19, 0xd0, + 0x30, 0x54, 0x37, 0xaf, 0x25, 0xad, 0x1e, 0xca, 0x52, 0x34, 0x6a, 0x90, 0x32, 0x14, 0xb9, 0x6b, + 0xa5, 0x3c, 0x4f, 0x70, 0x2d, 0x96, 0x7b, 0x31, 0xa2, 0x28, 0x27, 0xbf, 0x68, 0x01, 0x08, 0x06, + 0xd9, 0x69, 0x44, 0xee, 0x92, 0x98, 0x6f, 0x37, 0x31, 0xcc, 0x82, 0xcb, 0xf8, 0x3f, 0x1a, 0x54, + 0xc9, 0x36, 0x4c, 0x31, 0x85, 0xd6, 0x6f, 0x3e, 0xf2, 0xa6, 0xc8, 0xaf, 0x64, 0x6a, 0x1c, 0x07, + 0x4a, 0x5c, 0xac, 0xaf, 0x02, 0x1a, 0xf5, 0x02, 0x8f, 0x75, 0x2d, 0xdf, 0x06, 0x67, 0x04, 0x17, + 0xa8, 0x4b, 0xd1, 0xa8, 0x61, 0xff, 0xcb, 0x09, 0x38, 0x9f, 0xc5, 0x3a, 0xdb, 0x6d, 0xa6, 0x04, + 0xb7, 0xf2, 0x68, 0xfc, 0x99, 0xfc, 0xfb, 0x47, 0xfa, 0x8d, 0x68, 0xef, 0x0a, 0xe9, 0xd9, 0x26, + 0xe9, 0x92, 0xcf, 0xe8, 0x1e, 0x9a, 0x78, 0xc4, 0x1e, 0xd2, 0x98, 0x53, 0xbd, 0xf4, 0x0c, 0x4c, + 0x86, 0x6c, 0xe4, 0x0b, 0xc9, 0xeb, 0x0e, 0x3e, 0x46, 0x1c, 0xc2, 0x6a, 0xf4, 0x3c, 0x37, 0x92, + 0xf1, 0x08, 0xba, 0xc6, 0x6d, 0xcf, 0x8d, 0x90, 0x43, 0xec, 0x6f, 0x4d, 0xc0, 0xf2, 0xe0, 0x8f, + 0x22, 0xdf, 0xb2, 0x00, 0x9a, 0xec, 0xb8, 0x12, 0x72, 0xa7, 0x5e, 0xe1, 0x67, 0xe3, 0x9c, 0x56, + 0x1f, 0xae, 0x2b, 0x4a, 0xb1, 0xd3, 0x95, 0x2e, 0x0a, 0xd1, 0x60, 0x84, 0xbc, 0xa0, 0xa6, 0x3e, + 0xbf, 0xaa, 0x11, 0x8b, 0x49, 0xb7, 0xd9, 0xd2, 0x10, 0x34, 0x6a, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, + 0x68, 0xd8, 0x75, 0x74, 0x74, 0x07, 0x3f, 0x8f, 0xde, 0x54, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, + 0x3b, 0x04, 0x9f, 0x39, 0x39, 0xcf, 0xdb, 0xff, 0xc3, 0x82, 0x8b, 0x6b, 0xed, 0x5e, 0x18, 0xd1, + 0xe0, 0xff, 0x1b, 0x1f, 0xb6, 0xff, 0x65, 0xc1, 0x53, 0x03, 0xbe, 0xf9, 0x31, 0xb8, 0xb2, 0xbd, + 0x93, 0x74, 0x65, 0xbb, 0x3d, 0xee, 0x94, 0xce, 0xfc, 0x8e, 0x01, 0x1e, 0x6d, 0xbf, 0x69, 0xc1, + 0x19, 0x26, 0xb6, 0x9a, 0x7e, 0x2b, 0xa7, 0x8d, 0xf3, 0x59, 0x28, 0xfe, 0x3c, 0xdb, 0x80, 0xd2, + 0x93, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0x6c, 0xcd, 0x38, 0x5d, 0xf7, 0x2d, 0x1a, 0xf0, 0x0d, 0xa8, + 0x90, 0x5c, 0x33, 0x15, 0x0d, 0x41, 0xa3, 0x96, 0xfd, 0x69, 0x90, 0xce, 0x62, 0xa9, 0x15, 0x67, + 0x0d, 0xb3, 0xe2, 0xec, 0xff, 0x30, 0x01, 0x86, 0xf1, 0xe3, 0x31, 0xcc, 0x64, 0x2f, 0x31, 0x93, + 0xc7, 0x3c, 0xb8, 0x1b, 0xa6, 0x9c, 0x41, 0xc1, 0x3c, 0x07, 0xa9, 0x60, 0x9e, 0x9b, 0xb9, 0x51, + 0x3c, 0x39, 0x96, 0xe7, 0x07, 0x16, 0x3c, 0x15, 0x57, 0xee, 0xb7, 0x4b, 0x3e, 0x5c, 0x2c, 0xbd, + 0x0c, 0xb3, 0x4e, 0xdc, 0x4c, 0xce, 0x1b, 0x23, 0x92, 0x42, 0x83, 0xd0, 0xac, 0x17, 0xfb, 0xa0, + 0x17, 0x1e, 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0xcf, 0x27, 0xe0, 0x52, 0xff, 0x97, + 0xa9, 0x05, 0x35, 0xdc, 0x25, 0xff, 0x2b, 0x30, 0x17, 0xc9, 0x06, 0xc6, 0xf6, 0xa0, 0xa3, 0x3a, + 0xb7, 0x0d, 0x18, 0x26, 0x6a, 0xb2, 0x96, 0x0d, 0xb1, 0x94, 0xeb, 0x0d, 0xbf, 0xab, 0x22, 0x18, + 0x74, 0xcb, 0x35, 0x03, 0x86, 0x89, 0x9a, 0xda, 0x37, 0x74, 0xf2, 0xd4, 0x7d, 0x43, 0xeb, 0x70, + 0x41, 0x79, 0xc3, 0x5d, 0xf3, 0x83, 0x35, 0xbf, 0xd3, 0x6d, 0x53, 0x19, 0xc3, 0xc0, 0x98, 0xbd, + 0x24, 0x9b, 0x5c, 0xc0, 0xac, 0x4a, 0x98, 0xdd, 0xd6, 0xfe, 0x41, 0x01, 0xce, 0xc5, 0xdd, 0xbe, + 0xe6, 0x7b, 0x4d, 0x97, 0xfb, 0x14, 0xbe, 0x0a, 0x93, 0xd1, 0x61, 0x57, 0x75, 0xf6, 0x5f, 0x55, + 0xec, 0x6c, 0x1f, 0x76, 0xd9, 0x68, 0x5f, 0xcc, 0x68, 0xc2, 0x2d, 0xc3, 0xbc, 0x11, 0xd9, 0xd4, + 0xab, 0x43, 0x8c, 0xc0, 0x4b, 0xc9, 0xd9, 0xfc, 0xe0, 0xa8, 0x9c, 0x11, 0xd4, 0xbc, 0xa2, 0x31, + 0x25, 0xe7, 0x3c, 0xb9, 0x0b, 0xf3, 0x6d, 0x27, 0x8c, 0x6e, 0x77, 0x9b, 0x4e, 0x44, 0xb7, 0x5d, + 0xe9, 0xa1, 0x31, 0x5a, 0x60, 0x80, 0xbe, 0xca, 0xde, 0x4c, 0x60, 0xc2, 0x14, 0x66, 0x72, 0x00, + 0x84, 0x95, 0x6c, 0x07, 0x8e, 0x17, 0x8a, 0xaf, 0x62, 0xf4, 0x46, 0x0f, 0x44, 0xd0, 0x27, 0xc3, + 0xcd, 0x3e, 0x6c, 0x98, 0x41, 0x81, 0x3c, 0x07, 0x53, 0x01, 0x75, 0x42, 0x39, 0x98, 0xa5, 0x78, + 0xfd, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x17, 0xd4, 0xd4, 0x43, 0x16, 0xd4, 0x9f, 0x5a, 0x30, 0x1f, + 0x0f, 0xd3, 0x63, 0xd8, 0x59, 0x3b, 0xc9, 0x9d, 0xf5, 0x7a, 0x5e, 0x22, 0x71, 0xc0, 0x66, 0xfa, + 0x07, 0x53, 0xe6, 0xf7, 0x71, 0xc7, 0xf0, 0x2f, 0x42, 0x49, 0xad, 0x6a, 0xa5, 0xb2, 0x8e, 0x79, + 0xc0, 0x4e, 0x28, 0x33, 0x46, 0x40, 0x93, 0x24, 0x82, 0x31, 0x3d, 0xb6, 0x95, 0x37, 0xe5, 0x36, + 0x2d, 0xa7, 0xbd, 0xde, 0xca, 0xd5, 0xf6, 0x9d, 0xb5, 0x95, 0xab, 0x36, 0xe4, 0x36, 0x5c, 0xec, + 0x06, 0x3e, 0x0f, 0xab, 0x5d, 0xa7, 0x4e, 0xb3, 0xed, 0x7a, 0x54, 0x59, 0x31, 0x84, 0x27, 0xc5, + 0x53, 0xc7, 0x47, 0xe5, 0x8b, 0xb5, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0x30, 0x6b, 0x72, 0x88, + 0xc0, 0xac, 0xbf, 0xa3, 0x6d, 0x85, 0x34, 0x94, 0xe1, 0x51, 0x9f, 0xcb, 0x6b, 0x28, 0x33, 0xc4, + 0x7a, 0x3c, 0xa5, 0x2a, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0x0d, 0x52, 0x53, 0x8f, 0x68, 0x90, 0x8a, + 0xfd, 0xeb, 0xa7, 0x7f, 0x92, 0xfe, 0xf5, 0x33, 0x1f, 0x28, 0xff, 0xfa, 0xf7, 0x8b, 0xb0, 0x98, + 0xd6, 0x40, 0x4e, 0x3f, 0xe8, 0xec, 0xef, 0x59, 0xb0, 0xa8, 0x56, 0x8f, 0xa0, 0x49, 0xd5, 0x55, + 0xc3, 0x66, 0x4e, 0x8b, 0x56, 0xe8, 0x52, 0x3a, 0x1a, 0x7f, 0x3b, 0x45, 0x0d, 0xfb, 0xe8, 0x93, + 0xb7, 0x61, 0x56, 0x5b, 0xe4, 0x1f, 0x29, 0x02, 0x6d, 0x81, 0x6b, 0x51, 0x31, 0x0a, 0x34, 0xf1, + 0x91, 0xf7, 0x2d, 0x80, 0x86, 0xda, 0xe6, 0xd4, 0xea, 0xba, 0x95, 0xd7, 0xea, 0xd2, 0x1b, 0x68, + 0xac, 0x2c, 0xeb, 0xa2, 0x10, 0x0d, 0xc2, 0xe4, 0x57, 0xb8, 0x2d, 0x5e, 0x6b, 0x77, 0x22, 0xca, + 0x7f, 0x6c, 0xdf, 0xe1, 0x13, 0x14, 0xd3, 0x58, 0x95, 0x32, 0x40, 0x21, 0x26, 0x98, 0xb0, 0x5f, + 0x05, 0xed, 0xed, 0xc9, 0xc4, 0x16, 0xf7, 0xf7, 0xac, 0x39, 0xd1, 0x9e, 0x9c, 0x82, 0x5a, 0x6c, + 0x5d, 0x53, 0x00, 0x8c, 0xeb, 0xd8, 0x5f, 0x80, 0xf9, 0xd7, 0x03, 0xa7, 0xbb, 0xe7, 0x72, 0x9b, + 0x37, 0x3b, 0x5b, 0x7d, 0x04, 0xa6, 0x9d, 0x66, 0x33, 0x2b, 0x71, 0x44, 0x45, 0x14, 0xa3, 0x82, + 0x0f, 0x75, 0x8c, 0xb2, 0x7f, 0xdf, 0x02, 0x12, 0xdf, 0x1b, 0xba, 0x5e, 0x6b, 0xcb, 0x89, 0x1a, + 0x7b, 0xec, 0x7c, 0xb4, 0xc7, 0x4b, 0xb3, 0xce, 0x47, 0xd7, 0x35, 0x04, 0x8d, 0x5a, 0xe4, 0x5d, + 0x98, 0x15, 0xff, 0xde, 0xd2, 0x16, 0x82, 0xb1, 0x23, 0x08, 0xc4, 0x86, 0xc2, 0x79, 0x12, 0xb3, + 0xf0, 0x7a, 0x4c, 0x01, 0x4d, 0x72, 0xac, 0xab, 0x36, 0xbc, 0xdd, 0x76, 0xef, 0x7e, 0x73, 0x27, + 0xee, 0xaa, 0x6e, 0xe0, 0xef, 0xba, 0x6d, 0x9a, 0xee, 0xaa, 0x9a, 0x28, 0x46, 0x05, 0x1f, 0xae, + 0xab, 0xfe, 0x8d, 0x05, 0xe7, 0x37, 0xc2, 0xc8, 0xf5, 0xd7, 0x69, 0x18, 0xb1, 0x6d, 0x85, 0x09, + 0x9f, 0x5e, 0x7b, 0x18, 0xc7, 0xed, 0x75, 0x58, 0x94, 0x77, 0x98, 0xbd, 0x9d, 0x90, 0x46, 0x86, + 0x1e, 0xaf, 0xd7, 0xf1, 0x5a, 0x0a, 0x8e, 0x7d, 0x2d, 0x18, 0x16, 0x79, 0x99, 0x19, 0x63, 0x29, + 0x24, 0xb1, 0xd4, 0x53, 0x70, 0xec, 0x6b, 0x61, 0x7f, 0xbf, 0x00, 0xe7, 0xf8, 0x67, 0xa4, 0x82, + 0x2e, 0xbe, 0x31, 0x28, 0xe8, 0x62, 0xcc, 0xa5, 0xcc, 0x69, 0x3d, 0x42, 0xc8, 0xc5, 0xdf, 0xb5, + 0x60, 0xa1, 0x99, 0xec, 0xe9, 0x7c, 0x6c, 0x3a, 0x59, 0x63, 0x28, 0x5c, 0xb6, 0x52, 0x85, 0x98, + 0xa6, 0x4f, 0x7e, 0xd5, 0x82, 0x85, 0x24, 0x9b, 0x4a, 0xba, 0x9f, 0x42, 0x27, 0x69, 0x1f, 0xeb, + 0x64, 0x79, 0x88, 0x69, 0x16, 0xec, 0x3f, 0x9c, 0x90, 0x43, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, + 0x94, 0xa2, 0x76, 0x28, 0x0a, 0xe5, 0xd7, 0x8e, 0x79, 0x22, 0xdc, 0xde, 0xac, 0x0b, 0xf7, 0x81, + 0x58, 0x69, 0x93, 0x25, 0x4c, 0xf9, 0x54, 0xb4, 0x38, 0xe1, 0x46, 0x57, 0x12, 0xce, 0xe5, 0x28, + 0xba, 0xbd, 0x56, 0x4b, 0x13, 0x96, 0x25, 0x8c, 0xb0, 0xa2, 0x65, 0xff, 0x96, 0x05, 0xa5, 0x1b, + 0xbe, 0x92, 0x23, 0x3f, 0x9b, 0x83, 0xa1, 0x47, 0xeb, 0x83, 0xfa, 0x9a, 0x32, 0x3e, 0x62, 0xbc, + 0x96, 0x30, 0xf3, 0x3c, 0x6d, 0xe0, 0x5e, 0xe1, 0xf9, 0xb3, 0x18, 0xaa, 0x1b, 0xfe, 0xce, 0x40, + 0xd3, 0xe3, 0xaf, 0x15, 0xe1, 0xcc, 0x1b, 0xce, 0x21, 0xf5, 0x22, 0x67, 0xf4, 0x4d, 0xe2, 0x65, + 0x98, 0x75, 0xba, 0xfc, 0x1e, 0xcc, 0xd0, 0xf1, 0x63, 0xcb, 0x49, 0x0c, 0x42, 0xb3, 0x5e, 0x2c, + 0xd0, 0x44, 0x76, 0x9d, 0x2c, 0x51, 0xb4, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0x72, 0x03, 0x88, 0x8c, + 0x46, 0xad, 0x34, 0x1a, 0x7e, 0xcf, 0x13, 0x22, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xab, 0xaf, + 0x06, 0x66, 0xb4, 0x22, 0x9f, 0x87, 0xa5, 0x06, 0xc7, 0x2c, 0x8f, 0x1e, 0x26, 0x46, 0x71, 0xfc, + 0xd4, 0x71, 0x02, 0x6b, 0x03, 0xea, 0xe1, 0x40, 0x0c, 0x8c, 0xd3, 0x30, 0xf2, 0x03, 0xa7, 0x45, + 0x4d, 0xbc, 0x53, 0x49, 0x4e, 0xeb, 0x7d, 0x35, 0x30, 0xa3, 0x15, 0xf9, 0x12, 0x94, 0xa2, 0xbd, + 0x80, 0x86, 0x7b, 0x7e, 0xbb, 0x29, 0xfd, 0x16, 0xc6, 0xb4, 0xb4, 0xc9, 0xd1, 0xdf, 0x56, 0x58, + 0x8d, 0xe9, 0xad, 0x8a, 0x30, 0xa6, 0x49, 0x02, 0x98, 0x0a, 0x1b, 0x7e, 0x97, 0x86, 0x52, 0x65, + 0xbf, 0x91, 0x0b, 0x75, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x02, 0x4a, 0x4a, 0xf6, 0xef, 0x4d, + 0xc0, 0x9c, 0x59, 0x71, 0x08, 0xd9, 0xf4, 0x15, 0x0b, 0xe6, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x5b, + 0xd8, 0xaf, 0xf2, 0xd1, 0x28, 0x18, 0xaa, 0x75, 0x1a, 0x39, 0x6e, 0xdb, 0x30, 0x85, 0x19, 0x64, + 0x30, 0x41, 0x94, 0x7c, 0xdd, 0x82, 0x85, 0xd8, 0xcd, 0x2d, 0x36, 0xa4, 0xe5, 0xca, 0x88, 0x16, + 0xf5, 0x57, 0x93, 0x94, 0x30, 0x4d, 0xda, 0xde, 0x81, 0xc5, 0xf4, 0x68, 0xb3, 0xae, 0xec, 0x3a, + 0x72, 0xad, 0x17, 0xe2, 0xae, 0xac, 0x39, 0x61, 0x88, 0x1c, 0x42, 0x9e, 0x87, 0x99, 0x8e, 0x13, + 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x5e, 0x2c, 0x18, 0x02, 0x49, 0x96, 0xa3, 0xae, 0x61, 0x7f, 0x1c, + 0xe6, 0xb6, 0x1c, 0xaf, 0x45, 0x9b, 0x52, 0x0e, 0x3f, 0x3c, 0xa6, 0xed, 0x47, 0x93, 0x30, 0x6b, + 0x9c, 0xcd, 0x4e, 0xff, 0x9c, 0x95, 0x48, 0xa9, 0x51, 0xc8, 0x31, 0xa5, 0xc6, 0x67, 0x01, 0x76, + 0x5d, 0xcf, 0x0d, 0xf7, 0x1e, 0x31, 0x59, 0x07, 0xbf, 0xd7, 0xbd, 0xa6, 0x31, 0xa0, 0x81, 0x2d, + 0xbe, 0x3c, 0x2b, 0x9e, 0x90, 0x79, 0xea, 0x7d, 0xcb, 0xd8, 0x6e, 0xa6, 0xf2, 0x70, 0x16, 0x30, + 0x06, 0x66, 0x45, 0x6d, 0x3f, 0x22, 0xd7, 0xd0, 0x49, 0xbb, 0xd2, 0x36, 0xcc, 0x04, 0x34, 0xec, + 0x75, 0xd8, 0x89, 0x71, 0x7a, 0xe4, 0x6e, 0xe0, 0x6e, 0x1b, 0x28, 0xdb, 0xa3, 0xc6, 0xb4, 0xfc, + 0x2a, 0x9c, 0x49, 0xb0, 0x30, 0x52, 0xf6, 0x21, 0x1f, 0x32, 0x0d, 0x00, 0x8f, 0x72, 0x99, 0xc3, + 0xc6, 0xa2, 0x6d, 0x64, 0xeb, 0xd0, 0x63, 0x21, 0x9c, 0x73, 0x04, 0xcc, 0xfe, 0xf3, 0x29, 0x90, + 0xf7, 0xdf, 0x43, 0x88, 0x2b, 0xf3, 0xd6, 0x6b, 0xe2, 0x11, 0x6e, 0xbd, 0x6e, 0xc0, 0x9c, 0xeb, + 0xb9, 0x91, 0xeb, 0xb4, 0xb9, 0x71, 0x47, 0x6e, 0xa7, 0xca, 0x7b, 0x79, 0x6e, 0xc3, 0x80, 0x65, + 0xe0, 0x49, 0xb4, 0x25, 0xb7, 0xa0, 0xc8, 0xf7, 0x1b, 0x39, 0x81, 0x47, 0xbf, 0xa4, 0xe7, 0xfe, + 0x19, 0x22, 0xa4, 0x49, 0x60, 0xe2, 0x87, 0x0f, 0x91, 0xae, 0x44, 0x1f, 0xbf, 0xe5, 0x3c, 0x8e, + 0x0f, 0x1f, 0x29, 0x38, 0xf6, 0xb5, 0x60, 0x58, 0x76, 0x1d, 0xb7, 0xdd, 0x0b, 0x68, 0x8c, 0x65, + 0x2a, 0x89, 0xe5, 0x5a, 0x0a, 0x8e, 0x7d, 0x2d, 0xc8, 0x2e, 0xcc, 0xc9, 0x32, 0xe1, 0x72, 0x35, + 0xfd, 0x88, 0x5f, 0xc9, 0x5d, 0xeb, 0xae, 0x19, 0x98, 0x30, 0x81, 0x97, 0xf4, 0xe0, 0xac, 0xeb, + 0x35, 0x7c, 0xaf, 0xd1, 0xee, 0x85, 0xee, 0x01, 0x8d, 0xe3, 0x89, 0x1e, 0x85, 0xd8, 0x85, 0xe3, + 0xa3, 0xf2, 0xd9, 0x8d, 0x34, 0x3a, 0xec, 0xa7, 0x40, 0xbe, 0x6c, 0xc1, 0x85, 0x86, 0xef, 0x85, + 0x3c, 0xfe, 0xff, 0x80, 0x5e, 0x0d, 0x02, 0x3f, 0x10, 0xb4, 0x4b, 0x8f, 0x48, 0x9b, 0xdb, 0x14, + 0xd7, 0xb2, 0x50, 0x62, 0x36, 0x25, 0xf2, 0x0e, 0xcc, 0x74, 0x03, 0xff, 0xc0, 0x6d, 0xd2, 0x40, + 0xba, 0xef, 0x6d, 0xe6, 0x91, 0x8f, 0xa4, 0x26, 0x71, 0xc6, 0xa2, 0x47, 0x95, 0xa0, 0xa6, 0x67, + 0xff, 0xef, 0x59, 0x98, 0x4f, 0x56, 0x27, 0xbf, 0x00, 0xd0, 0x0d, 0xfc, 0x0e, 0x8d, 0xf6, 0xa8, + 0x8e, 0x0b, 0xb9, 0x39, 0x6e, 0xda, 0x0b, 0x85, 0x4f, 0xb9, 0xbc, 0x30, 0x71, 0x11, 0x97, 0xa2, + 0x41, 0x91, 0x04, 0x30, 0xbd, 0x2f, 0xb6, 0x5d, 0xa9, 0x85, 0xbc, 0x91, 0x8b, 0xce, 0x24, 0x29, + 0xf3, 0x80, 0x06, 0x59, 0x84, 0x8a, 0x10, 0xd9, 0x81, 0xc2, 0x3d, 0xba, 0x93, 0x4f, 0xcc, 0xf5, + 0x1d, 0x2a, 0x4f, 0x33, 0xd5, 0xe9, 0xe3, 0xa3, 0x72, 0xe1, 0x0e, 0xdd, 0x41, 0x86, 0x9c, 0x7d, + 0x57, 0x53, 0xdc, 0xdd, 0x4b, 0x51, 0x31, 0xe6, 0x77, 0x25, 0x1c, 0x01, 0xc4, 0x77, 0xc9, 0x22, + 0x54, 0x84, 0xc8, 0x3b, 0x50, 0xba, 0xe7, 0x1c, 0xd0, 0xdd, 0xc0, 0xf7, 0x22, 0xe9, 0x67, 0x35, + 0x66, 0xa8, 0xc0, 0x1d, 0x85, 0x4e, 0xd2, 0xe5, 0xdb, 0xbb, 0x2e, 0xc4, 0x98, 0x1c, 0x39, 0x80, + 0x19, 0x8f, 0xde, 0x43, 0xda, 0x76, 0x1b, 0xf9, 0xb8, 0xe6, 0xdf, 0x94, 0xd8, 0x24, 0x65, 0xbe, + 0xef, 0xa9, 0x32, 0xd4, 0xb4, 0xd8, 0x58, 0xde, 0xf5, 0x77, 0xa4, 0xa0, 0x1a, 0x73, 0x2c, 0xf5, + 0xc9, 0x54, 0x8c, 0xe5, 0x0d, 0x7f, 0x07, 0x19, 0x72, 0xb6, 0x46, 0x1a, 0xda, 0xc9, 0x47, 0x8a, + 0xa9, 0x9b, 0xf9, 0x3a, 0x37, 0x89, 0x35, 0x12, 0x97, 0xa2, 0x41, 0x91, 0xf5, 0x6d, 0x4b, 0x1a, + 0x2b, 0xa5, 0xa0, 0x1a, 0xb3, 0x6f, 0x93, 0xa6, 0x4f, 0xd1, 0xb7, 0xaa, 0x0c, 0x35, 0x2d, 0x46, + 0xd7, 0x95, 0x96, 0xbf, 0x7c, 0x44, 0x55, 0xd2, 0x8e, 0x28, 0xe8, 0xaa, 0x32, 0xd4, 0xb4, 0x58, + 0x7f, 0x87, 0xfb, 0x87, 0xf7, 0x9c, 0xf6, 0xbe, 0xeb, 0xb5, 0x64, 0x9c, 0xe3, 0xb8, 0xd9, 0x6d, + 0xf7, 0x0f, 0xef, 0x08, 0x7c, 0x66, 0x7f, 0xc7, 0xa5, 0x68, 0x50, 0x24, 0xff, 0xc8, 0x82, 0xa9, + 0x6e, 0xbb, 0xd7, 0x72, 0xbd, 0xa5, 0x39, 0xae, 0x27, 0x7e, 0x26, 0x4f, 0x09, 0xbd, 0x52, 0xe3, + 0xa8, 0x85, 0xa2, 0xf8, 0xd3, 0xda, 0x67, 0x8f, 0x17, 0xfe, 0xd2, 0x9f, 0x95, 0x97, 0xa8, 0xd7, + 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xbd, 0x1b, 0xfa, 0xde, 0x0a, 0x3a, 0xf7, 0x94, 0x8e, 0x2e, 0x79, + 0x5a, 0xfe, 0x24, 0xcc, 0x1a, 0x28, 0x1e, 0xa6, 0xe8, 0xcd, 0x99, 0x8a, 0xde, 0x6f, 0x4d, 0xc1, + 0x9c, 0x99, 0x51, 0x6f, 0x08, 0xed, 0x4b, 0x9f, 0x38, 0x26, 0x46, 0x39, 0x71, 0xb0, 0x23, 0xa6, + 0x71, 0x7b, 0xa4, 0xcc, 0x5b, 0x1b, 0xb9, 0x29, 0xdc, 0xf1, 0x11, 0xd3, 0x28, 0x0c, 0x31, 0x41, + 0x74, 0x04, 0x87, 0x12, 0xa6, 0xb6, 0x0a, 0xc5, 0xae, 0x98, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x0b, + 0x00, 0x71, 0x66, 0x39, 0x79, 0xab, 0xa8, 0xf5, 0x61, 0x23, 0xe3, 0x9d, 0x51, 0x8b, 0x3c, 0x07, + 0x53, 0x4c, 0xf5, 0xa1, 0x4d, 0x19, 0x86, 0xad, 0xcf, 0xf1, 0xd7, 0x78, 0x29, 0x4a, 0x28, 0x79, + 0x85, 0x69, 0xa9, 0xb1, 0xc2, 0x22, 0xa3, 0xab, 0xcf, 0xc7, 0x5a, 0x6a, 0x0c, 0xc3, 0x44, 0x4d, + 0xc6, 0x3a, 0x65, 0xfa, 0x05, 0x97, 0x0d, 0x06, 0xeb, 0x5c, 0xe9, 0x40, 0x01, 0xe3, 0x76, 0xa5, + 0x94, 0x3e, 0xc2, 0xd7, 0x74, 0xd1, 0xb0, 0x2b, 0xa5, 0xe0, 0xd8, 0xd7, 0x82, 0x7d, 0x8c, 0xbc, + 0x10, 0x9d, 0x15, 0xce, 0xb6, 0x03, 0xae, 0x32, 0xbf, 0x6a, 0x9e, 0xb5, 0x72, 0x5c, 0x43, 0x62, + 0xd6, 0x0e, 0x7f, 0xd8, 0x1a, 0xef, 0x58, 0xf4, 0x05, 0x98, 0x4f, 0xee, 0x42, 0xb9, 0xdf, 0x7c, + 0x7c, 0x6d, 0x12, 0xce, 0xdd, 0x6c, 0xb9, 0x5e, 0x3a, 0x5b, 0x54, 0x56, 0xb2, 0x70, 0x6b, 0xe4, + 0x64, 0xe1, 0x3a, 0x9e, 0x4b, 0xa6, 0xe2, 0xce, 0x8e, 0xe7, 0x52, 0x79, 0xd1, 0x93, 0x75, 0xc9, + 0x9f, 0x5a, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x45, + 0x87, 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xaa, 0x18, 0xf1, 0x9f, 0x92, 0x5f, + 0xf0, 0xf4, 0x49, 0x55, 0xf1, 0x44, 0xf6, 0xc9, 0xdf, 0x80, 0x85, 0xc4, 0x07, 0x4b, 0x4b, 0x78, + 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xd7, 0x5d, 0x7e, 0x13, 0x3e, 0xfc, 0x50, 0x3e, 0x47, + 0x9a, 0x6c, 0x5f, 0xb1, 0xa0, 0x24, 0xec, 0xda, 0x48, 0x77, 0x53, 0x4e, 0x98, 0xa9, 0x93, 0x77, + 0xa5, 0xb6, 0x91, 0xe1, 0x84, 0xc9, 0x64, 0xf9, 0xbe, 0xeb, 0x35, 0xe5, 0x28, 0x6b, 0x59, 0xfe, + 0x86, 0xeb, 0x35, 0x91, 0x43, 0xb4, 0xb4, 0x2f, 0x0c, 0xb4, 0x37, 0xfd, 0xba, 0x05, 0xf3, 0x3c, + 0x06, 0x36, 0x3e, 0x13, 0xbe, 0xac, 0x9d, 0x8d, 0x04, 0x1b, 0x97, 0x92, 0xce, 0x46, 0x0f, 0x8e, + 0xca, 0xb3, 0x22, 0x6a, 0x36, 0xe9, 0x7b, 0xf4, 0x39, 0x69, 0x48, 0xe2, 0x2e, 0x51, 0x13, 0x23, + 0xdb, 0x39, 0xb4, 0xa1, 0xb5, 0xae, 0x90, 0x60, 0x8c, 0xcf, 0x7e, 0x17, 0xe6, 0xcc, 0x60, 0x16, + 0xf2, 0x32, 0xcc, 0x76, 0x5d, 0xaf, 0x95, 0x0c, 0x7a, 0xd4, 0xc6, 0xf6, 0x5a, 0x0c, 0x42, 0xb3, + 0x1e, 0x6f, 0xe6, 0xc7, 0xcd, 0x52, 0x36, 0xfa, 0x9a, 0x6f, 0x36, 0x8b, 0xff, 0xf0, 0x1c, 0xdb, + 0x19, 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xa0, 0xf1, 0x93, 0xcb, 0xb1, 0x9d, 0xc5, 0xcc, 0xff, + 0x5d, 0x39, 0xb6, 0x7f, 0x06, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0xee, + 0x71, 0x19, 0x99, 0x2e, 0xa1, 0xf6, 0x7b, 0x6c, 0xd9, 0xe8, 0x43, 0x6d, 0xa5, 0x17, 0xed, 0x11, + 0x0f, 0x8a, 0xa1, 0xdb, 0x3a, 0x78, 0x29, 0x27, 0x9b, 0x36, 0x43, 0x25, 0x1f, 0x66, 0x88, 0x03, + 0x62, 0x59, 0x21, 0x0a, 0x32, 0xf6, 0x77, 0x0b, 0xb0, 0x98, 0x3e, 0x79, 0xe7, 0xed, 0xd4, 0x40, + 0xbe, 0x6e, 0xc1, 0xbc, 0xd3, 0x8b, 0xf6, 0xa8, 0x17, 0xa9, 0x8b, 0xad, 0x5c, 0xde, 0x0c, 0x49, + 0xf6, 0x9d, 0x91, 0xc2, 0x2a, 0x41, 0x0b, 0x53, 0xb4, 0xc9, 0x5f, 0x81, 0xe9, 0xc8, 0xed, 0x50, + 0xbf, 0x27, 0xec, 0x71, 0x05, 0x71, 0x2e, 0xde, 0x16, 0x45, 0xa8, 0x60, 0xe4, 0x79, 0x76, 0x8e, + 0x61, 0x8a, 0x4c, 0x40, 0xa5, 0xf7, 0xeb, 0x62, 0x6c, 0x40, 0x14, 0xe5, 0xa8, 0x6b, 0x90, 0xfb, + 0x30, 0x2d, 0xdc, 0x1f, 0x94, 0x9f, 0xcb, 0x56, 0x4e, 0x16, 0x02, 0xe1, 0x61, 0x11, 0x0f, 0x81, + 0xf8, 0x1f, 0xa2, 0x22, 0x67, 0x7f, 0x1c, 0x46, 0x4c, 0x78, 0x69, 0x5f, 0x05, 0x82, 0x7e, 0xbb, + 0xbd, 0xe3, 0x34, 0xf6, 0xef, 0xb8, 0x5e, 0xd3, 0xbf, 0xc7, 0xa5, 0xe1, 0x2a, 0x94, 0x02, 0x19, + 0xf5, 0x18, 0xca, 0x89, 0xab, 0xc5, 0xa9, 0x0a, 0x87, 0x0c, 0x31, 0xae, 0x63, 0xff, 0xe1, 0x04, + 0x4c, 0xcb, 0x10, 0xdd, 0xc7, 0xe0, 0x7d, 0xbf, 0x9f, 0xb8, 0x96, 0xdd, 0xc8, 0x25, 0xb2, 0x78, + 0xa0, 0xeb, 0x7d, 0x98, 0x72, 0xbd, 0x7f, 0x23, 0x1f, 0x72, 0x27, 0xfb, 0xdd, 0xff, 0x41, 0x11, + 0x16, 0x52, 0x21, 0xcf, 0x4c, 0x25, 0xee, 0x73, 0x37, 0xbd, 0x9d, 0x6b, 0x54, 0xb5, 0x0e, 0x27, + 0x39, 0xd9, 0xf3, 0x34, 0x4c, 0xa4, 0x27, 0xbe, 0x95, 0xdb, 0xcb, 0x0b, 0x7f, 0x99, 0xa9, 0x78, + 0x44, 0x4f, 0x4a, 0xf2, 0x6d, 0x0b, 0xce, 0x39, 0xfd, 0x4f, 0x57, 0x48, 0xd3, 0xdd, 0xad, 0xdc, + 0xdf, 0xc4, 0xa8, 0x3e, 0x25, 0x99, 0xcc, 0x7a, 0x21, 0x04, 0xb3, 0x58, 0xb1, 0xff, 0xb3, 0x05, + 0x4f, 0x0e, 0x0c, 0xde, 0xe7, 0xb9, 0x9f, 0x82, 0x24, 0x54, 0xca, 0x8c, 0x9c, 0x53, 0x94, 0xe8, + 0x6b, 0xdc, 0x74, 0xba, 0x9e, 0x34, 0x79, 0xf2, 0x12, 0xcc, 0x71, 0x35, 0x91, 0x49, 0xcf, 0x88, + 0x76, 0xe5, 0x2d, 0x14, 0xbf, 0x8f, 0xa8, 0x1b, 0xe5, 0x98, 0xa8, 0x65, 0x7f, 0xdb, 0x82, 0xa5, + 0x41, 0x99, 0x80, 0x86, 0xb0, 0x91, 0xfc, 0xf5, 0x54, 0x04, 0x43, 0xb9, 0x2f, 0x82, 0x21, 0x65, + 0x25, 0x51, 0xc1, 0x0a, 0x86, 0x81, 0xa2, 0xf0, 0x10, 0x07, 0xfd, 0x6f, 0x58, 0x70, 0x71, 0xc0, + 0x82, 0xef, 0x8b, 0x64, 0xb1, 0x1e, 0x39, 0x92, 0x65, 0x62, 0xd8, 0x48, 0x16, 0xfb, 0x8f, 0x0a, + 0xb0, 0x28, 0xf9, 0x89, 0xcf, 0x0a, 0xaf, 0x24, 0xe2, 0x40, 0x7e, 0x2a, 0x15, 0x07, 0x72, 0x3e, + 0x5d, 0xff, 0x2f, 0x83, 0x40, 0x3e, 0x58, 0x41, 0x20, 0x7f, 0x31, 0x01, 0x17, 0x32, 0x13, 0x14, + 0x91, 0xaf, 0x65, 0xec, 0x5e, 0x77, 0x72, 0xce, 0x84, 0x34, 0xe4, 0xfe, 0x35, 0x6e, 0xe4, 0xc4, + 0xaf, 0x9a, 0x11, 0x0b, 0x62, 0x37, 0xda, 0x3d, 0x85, 0x9c, 0x4e, 0x23, 0x06, 0x2f, 0xd8, 0xbf, + 0x54, 0x80, 0x2b, 0xc3, 0x22, 0xfa, 0x80, 0x06, 0xb7, 0x85, 0x89, 0xe0, 0xb6, 0xc7, 0xa4, 0x59, + 0x9c, 0x4a, 0x9c, 0xdb, 0x3f, 0x99, 0xd4, 0xdb, 0x5e, 0xff, 0xfc, 0x1c, 0xca, 0x65, 0x61, 0x9a, + 0x69, 0x9f, 0x2a, 0xc9, 0x71, 0x2c, 0x0a, 0xa7, 0xeb, 0xa2, 0xf8, 0xc1, 0x51, 0xf9, 0x6c, 0x9c, + 0x26, 0x43, 0x16, 0xa2, 0x6a, 0x44, 0xae, 0xc0, 0x4c, 0x20, 0xa0, 0x2a, 0x9c, 0x47, 0xfa, 0x7d, + 0x88, 0x32, 0xd4, 0x50, 0xf2, 0x25, 0x43, 0x5d, 0x9f, 0x3c, 0xad, 0x6c, 0x30, 0x27, 0xb9, 0xb3, + 0xbc, 0x0d, 0x33, 0xa1, 0x4a, 0x40, 0x2c, 0x14, 0x97, 0x17, 0x87, 0x8c, 0x12, 0x73, 0x76, 0x68, + 0x5b, 0x65, 0x23, 0x16, 0xdf, 0xa7, 0x73, 0x15, 0x6b, 0x94, 0xc4, 0xd6, 0x27, 0x70, 0x61, 0x6e, + 0x87, 0xfe, 0xd3, 0x37, 0x89, 0x60, 0x5a, 0x3e, 0xd0, 0x28, 0xef, 0x01, 0xb7, 0x72, 0x8a, 0x08, + 0x91, 0xfe, 0xc2, 0xfc, 0x54, 0xa9, 0x2c, 0x41, 0x8a, 0x94, 0xfd, 0x03, 0x0b, 0x66, 0xe5, 0x1c, + 0x79, 0x0c, 0xe1, 0x72, 0x77, 0x93, 0xe1, 0x72, 0x57, 0x73, 0x91, 0x58, 0x03, 0x62, 0xe5, 0xee, + 0xc2, 0x9c, 0x99, 0x19, 0x8f, 0x7c, 0xd6, 0x90, 0xb8, 0xd6, 0x38, 0xb9, 0xa6, 0x94, 0x4c, 0x8e, + 0xa5, 0xb1, 0xfd, 0xdb, 0x25, 0xdd, 0x8b, 0xfc, 0xec, 0x6a, 0xce, 0x7c, 0xeb, 0xc4, 0x99, 0x6f, + 0x4e, 0xbc, 0x89, 0xfc, 0x27, 0xde, 0x2d, 0x98, 0x51, 0x62, 0x51, 0x2a, 0x0f, 0xcf, 0x9a, 0x0e, + 0xc4, 0x4c, 0x03, 0x61, 0xc8, 0x8c, 0xe5, 0xc2, 0xcf, 0xa0, 0x7a, 0x0c, 0xb5, 0xb8, 0xd6, 0x68, + 0xc8, 0x3b, 0x30, 0x7b, 0xcf, 0x0f, 0xf6, 0xdb, 0xbe, 0xc3, 0xd3, 0x9f, 0x43, 0x1e, 0x77, 0xd6, + 0xda, 0x64, 0x2c, 0xa2, 0x38, 0xee, 0xc4, 0xf8, 0xd1, 0x24, 0x46, 0x2a, 0xb0, 0xd0, 0x71, 0x3d, + 0xa4, 0x4e, 0x53, 0x47, 0xc5, 0x4d, 0x8a, 0x8c, 0xcb, 0x4a, 0xb5, 0xde, 0x4a, 0x82, 0x31, 0x5d, + 0x9f, 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0xa6, 0x55, 0xad, 0x8d, 0x3f, 0x19, 0x93, 0x16, 0x0c, + 0x11, 0xc6, 0x90, 0x2c, 0xc7, 0x14, 0x6d, 0xf2, 0x45, 0x98, 0x09, 0x65, 0xda, 0xbb, 0x7c, 0x9c, + 0x1d, 0xf4, 0xd9, 0x5e, 0x20, 0x8d, 0x87, 0x52, 0x95, 0xa0, 0x26, 0x48, 0x36, 0xe1, 0xbc, 0x32, + 0x9f, 0x24, 0x9e, 0xa8, 0x9a, 0x8a, 0xb3, 0x24, 0x61, 0x06, 0x1c, 0x33, 0x5b, 0x31, 0x55, 0x8e, + 0x67, 0x9c, 0x14, 0x77, 0x84, 0xc6, 0xb5, 0x1a, 0x5f, 0x7f, 0x4d, 0x94, 0xd0, 0x93, 0x82, 0x3e, + 0x67, 0xc6, 0x08, 0xfa, 0xac, 0xc3, 0x85, 0x34, 0x88, 0xa7, 0xbf, 0xe2, 0x19, 0xb7, 0x8c, 0x2d, + 0xb4, 0x96, 0x55, 0x09, 0xb3, 0xdb, 0x92, 0x3b, 0x50, 0x0a, 0x28, 0x3f, 0x64, 0x55, 0x94, 0x7b, + 0xd5, 0xc8, 0x8e, 0xa4, 0xa8, 0x10, 0x60, 0x8c, 0x8b, 0x8d, 0xbb, 0x93, 0xcc, 0x81, 0x7c, 0x2b, + 0xc7, 0xb7, 0x51, 0xe5, 0xd8, 0x0f, 0x48, 0x4b, 0x67, 0xff, 0xdb, 0x05, 0x38, 0x93, 0xb0, 0x01, + 0x91, 0x67, 0xa1, 0xc8, 0xf3, 0x81, 0x71, 0x69, 0x35, 0x13, 0x4b, 0x54, 0xd1, 0x39, 0x02, 0x46, + 0x7e, 0xd9, 0x82, 0x85, 0x6e, 0xe2, 0x5a, 0x45, 0x09, 0xf2, 0x71, 0x0d, 0xa7, 0x09, 0xa4, 0xc6, + 0xeb, 0x01, 0x49, 0x62, 0x98, 0xa6, 0xce, 0xe4, 0x81, 0xf4, 0xc6, 0x6e, 0xd3, 0x80, 0xd7, 0x96, + 0x8a, 0x9e, 0x46, 0xb1, 0x96, 0x04, 0x63, 0xba, 0x3e, 0x1b, 0x61, 0xfe, 0x75, 0xe3, 0xbc, 0xbe, + 0x57, 0x51, 0x08, 0x30, 0xc6, 0x45, 0x5e, 0x83, 0x79, 0x99, 0xfa, 0xb6, 0xe6, 0x37, 0xaf, 0x3b, + 0xe1, 0x9e, 0x3c, 0xe1, 0xe8, 0x13, 0xd9, 0x5a, 0x02, 0x8a, 0xa9, 0xda, 0xfc, 0xdb, 0xe2, 0xfc, + 0xc2, 0x1c, 0xc1, 0x54, 0xf2, 0x71, 0x85, 0xb5, 0x24, 0x18, 0xd3, 0xf5, 0xc9, 0xf3, 0xc6, 0x36, + 0x24, 0xee, 0xed, 0xb5, 0x34, 0xc8, 0xd8, 0x8a, 0x2a, 0xb0, 0xd0, 0xe3, 0x07, 0xc2, 0xa6, 0x02, + 0xca, 0xf5, 0xa8, 0x09, 0xde, 0x4e, 0x82, 0x31, 0x5d, 0x9f, 0xbc, 0x0a, 0x67, 0x02, 0x26, 0x6c, + 0x35, 0x02, 0x71, 0x99, 0xaf, 0xef, 0x6a, 0xd1, 0x04, 0x62, 0xb2, 0x2e, 0x79, 0x1d, 0xce, 0xc6, + 0x99, 0x22, 0x15, 0x02, 0x71, 0xbb, 0xaf, 0xd3, 0x96, 0x55, 0xd2, 0x15, 0xb0, 0xbf, 0x0d, 0xf9, + 0x5b, 0xb0, 0x68, 0xf4, 0xc4, 0x86, 0xd7, 0xa4, 0xf7, 0x65, 0x36, 0x3f, 0xfe, 0x6a, 0xce, 0x5a, + 0x0a, 0x86, 0x7d, 0xb5, 0xc9, 0xa7, 0x60, 0xbe, 0xe1, 0xb7, 0xdb, 0x5c, 0xc6, 0x89, 0xc4, 0xfe, + 0x22, 0x6d, 0x9f, 0x48, 0x70, 0x98, 0x80, 0x60, 0xaa, 0x26, 0xb9, 0x01, 0xc4, 0xdf, 0x61, 0xea, + 0x15, 0x6d, 0xbe, 0x2e, 0x9e, 0x77, 0x67, 0x1a, 0xc7, 0x99, 0x64, 0x2c, 0xc8, 0x9b, 0x7d, 0x35, + 0x30, 0xa3, 0x15, 0xcf, 0x7a, 0x66, 0xc4, 0xce, 0xce, 0xe7, 0xf1, 0x12, 0x5d, 0xda, 0x7c, 0xf1, + 0xd0, 0xc0, 0xd9, 0x00, 0xa6, 0x44, 0x68, 0x4e, 0x3e, 0xf9, 0xfb, 0xcc, 0x1c, 0xdf, 0xf1, 0x1e, + 0x21, 0x4a, 0x51, 0x52, 0x22, 0xbf, 0x00, 0xa5, 0x1d, 0xf5, 0xe0, 0x03, 0x4f, 0xda, 0x37, 0xf6, + 0xbe, 0x98, 0x7a, 0xbb, 0x24, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x24, 0xc9, 0x73, 0x30, 0x7b, 0xbd, + 0x56, 0xd1, 0xb3, 0xf0, 0x2c, 0x1f, 0xfd, 0x49, 0xd6, 0x04, 0x4d, 0x00, 0x5b, 0x61, 0x5a, 0x7d, + 0x23, 0xc9, 0x37, 0x54, 0x32, 0xb4, 0x31, 0x56, 0x9b, 0xdf, 0xc0, 0x63, 0x7d, 0xe9, 0x5c, 0xaa, + 0xb6, 0x2c, 0x47, 0x5d, 0x83, 0xbc, 0x0d, 0xb3, 0x72, 0xbf, 0xe0, 0xb2, 0xe9, 0xfc, 0xa3, 0xc5, + 0x65, 0x63, 0x8c, 0x02, 0x4d, 0x7c, 0xfc, 0xda, 0x98, 0xe7, 0xc1, 0xa7, 0xd7, 0x7a, 0xed, 0xf6, + 0xd2, 0x05, 0x2e, 0x37, 0xe3, 0x6b, 0xe3, 0x18, 0x84, 0x66, 0x3d, 0xf2, 0xa2, 0xf2, 0xa4, 0xfa, + 0x50, 0xe2, 0x1e, 0x5d, 0x7b, 0x52, 0x69, 0xa5, 0x7b, 0x40, 0xe8, 0xc6, 0xc5, 0x87, 0xb8, 0x30, + 0xed, 0xc0, 0xb2, 0xd2, 0xf8, 0xfa, 0x17, 0xc9, 0xd2, 0x52, 0xc2, 0x54, 0xb2, 0x7c, 0x67, 0x60, + 0x4d, 0x3c, 0x01, 0x0b, 0xd9, 0x81, 0x82, 0xd3, 0xde, 0x59, 0x7a, 0x32, 0x0f, 0xd5, 0xb5, 0xb2, + 0x59, 0x95, 0x33, 0x8a, 0xbb, 0x5b, 0x56, 0x36, 0xab, 0xc8, 0x90, 0x13, 0x17, 0x26, 0x9d, 0xf6, + 0x4e, 0xb8, 0xb4, 0xcc, 0xd7, 0x6c, 0x6e, 0x44, 0x62, 0xe3, 0xc1, 0x66, 0x35, 0x44, 0x4e, 0xc2, + 0xfe, 0xf2, 0x84, 0xbe, 0xa8, 0xd1, 0x29, 0x94, 0xdf, 0x35, 0x17, 0x90, 0x95, 0xc7, 0x0b, 0xe5, + 0x7d, 0x0f, 0xb0, 0x88, 0xbd, 0x2f, 0x73, 0xf9, 0x74, 0xb5, 0xc8, 0xc8, 0x25, 0x39, 0x55, 0x32, + 0x3d, 0xb4, 0x38, 0x3d, 0x27, 0x05, 0x86, 0xfd, 0x5d, 0xd0, 0x46, 0xbf, 0x94, 0x17, 0x52, 0x00, + 0x45, 0x37, 0x8c, 0x5c, 0x3f, 0xc7, 0x70, 0xe5, 0x54, 0x5e, 0x65, 0x1e, 0x0d, 0xc1, 0x01, 0x28, + 0x48, 0x31, 0x9a, 0x5e, 0xcb, 0xf5, 0xee, 0xcb, 0xcf, 0xbf, 0x95, 0xbb, 0x7b, 0x91, 0xa0, 0xc9, + 0x01, 0x28, 0x48, 0x91, 0xbb, 0x62, 0x52, 0xe7, 0xf3, 0x1a, 0xfd, 0x66, 0x35, 0x45, 0x2f, 0x39, + 0xb9, 0xef, 0x42, 0x21, 0xec, 0xb8, 0x52, 0x5d, 0x1a, 0x93, 0x56, 0x7d, 0x6b, 0x23, 0x8b, 0x56, + 0x7d, 0x6b, 0x03, 0x19, 0x11, 0xf2, 0x55, 0x0b, 0xc0, 0xe9, 0xec, 0x38, 0x61, 0xe8, 0x34, 0xb5, + 0x75, 0x66, 0xcc, 0xf7, 0x12, 0x2a, 0x1a, 0x5f, 0x8a, 0x34, 0x77, 0xa8, 0x8d, 0xa1, 0x68, 0x50, + 0x26, 0xef, 0xc0, 0xb4, 0x23, 0x5e, 0x66, 0x93, 0xbe, 0xe1, 0xf9, 0x3c, 0x37, 0x98, 0xe2, 0x80, + 0x9b, 0x69, 0x24, 0x08, 0x15, 0x41, 0x46, 0x3b, 0x0a, 0x1c, 0xba, 0xeb, 0xee, 0x4b, 0xe3, 0x50, + 0x7d, 0xec, 0x27, 0x13, 0x18, 0xb2, 0x2c, 0xda, 0x12, 0x84, 0x8a, 0xa0, 0x78, 0x29, 0xdb, 0xf1, + 0x1c, 0x1d, 0xf1, 0x97, 0x4f, 0x5c, 0xa8, 0x19, 0x43, 0x68, 0xbc, 0x94, 0x6d, 0x12, 0xc2, 0x24, + 0x5d, 0x72, 0x00, 0x53, 0x0e, 0x7f, 0x33, 0x52, 0x1e, 0xc5, 0x30, 0x8f, 0xf7, 0x27, 0x53, 0x7d, + 0xc0, 0x85, 0x8b, 0x7c, 0x99, 0x52, 0x52, 0x23, 0xbf, 0x61, 0xc1, 0xb4, 0x70, 0x5b, 0x66, 0x0a, + 0x29, 0xfb, 0xf6, 0x2f, 0x9c, 0x42, 0x7e, 0x76, 0xe9, 0x52, 0x2d, 0x9d, 0x90, 0x3e, 0xaa, 0x7d, + 0x32, 0x45, 0xe9, 0x89, 0x4e, 0xd5, 0x8a, 0xbb, 0xe5, 0x4f, 0xc1, 0x9c, 0x89, 0x65, 0x24, 0xb7, + 0xea, 0x1f, 0x17, 0x00, 0x78, 0x47, 0x8b, 0x1c, 0x1f, 0x1d, 0x9e, 0x4c, 0x76, 0xcf, 0x6f, 0xe6, + 0xf3, 0xd8, 0xa7, 0x99, 0xaa, 0x03, 0x64, 0xe6, 0xd8, 0x3d, 0xbf, 0x89, 0x92, 0x08, 0x69, 0xc1, + 0x64, 0xd7, 0x89, 0xf6, 0xf2, 0xcf, 0x0b, 0x32, 0x23, 0x82, 0x5d, 0xa3, 0x3d, 0xe4, 0x04, 0xc8, + 0x7b, 0x56, 0xec, 0x1a, 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xf5, 0xd9, 0x8a, 0x74, 0x86, 0x11, 0x23, + 0x38, 0xd0, 0x45, 0x66, 0xf9, 0x7d, 0x0b, 0xe6, 0xcc, 0xaa, 0x19, 0xc3, 0xf4, 0x73, 0xe6, 0x30, + 0xe5, 0xd9, 0x1f, 0xe6, 0x88, 0xff, 0x37, 0x0b, 0x8c, 0xd7, 0xdb, 0x63, 0xef, 0x71, 0x6b, 0x68, + 0xef, 0xf1, 0x89, 0x11, 0xbd, 0xc7, 0x0b, 0x23, 0x79, 0x8f, 0x4f, 0x8e, 0xee, 0x3d, 0x5e, 0x1c, + 0xec, 0x3d, 0x6e, 0x7f, 0xd3, 0x82, 0xb3, 0x7d, 0xbb, 0x0d, 0xd3, 0x83, 0x03, 0xdf, 0x8f, 0x06, + 0x78, 0x5d, 0x62, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x87, 0x45, 0xf9, 0x74, 0x42, 0xbd, 0xdb, 0x76, + 0x33, 0x73, 0xb6, 0x6c, 0xa7, 0xe0, 0xd8, 0xd7, 0xc2, 0xfe, 0xae, 0x05, 0xb3, 0x46, 0xa4, 0x37, + 0xfb, 0x0e, 0x1e, 0x11, 0x2f, 0xd9, 0x88, 0x9d, 0xe4, 0xf8, 0x45, 0x95, 0x80, 0x89, 0x3b, 0xd3, + 0x96, 0x91, 0x58, 0x3b, 0xbe, 0x33, 0x65, 0xa5, 0x28, 0xa1, 0x22, 0x65, 0x32, 0xed, 0xf2, 0x4e, + 0x2f, 0x98, 0x29, 0x93, 0x69, 0x17, 0x39, 0x84, 0x93, 0x63, 0x07, 0x02, 0x19, 0x58, 0x60, 0x3c, + 0x52, 0xe1, 0x04, 0x11, 0x0a, 0x18, 0xb9, 0x04, 0x05, 0xea, 0x35, 0xa5, 0xf5, 0x42, 0x3f, 0x23, + 0x79, 0xd5, 0x6b, 0x22, 0x2b, 0xb7, 0xdf, 0x84, 0xb9, 0x3a, 0x6d, 0x04, 0x34, 0x7a, 0x83, 0x1e, + 0x0e, 0xfd, 0x2e, 0x25, 0x9b, 0xed, 0xa9, 0x77, 0x29, 0x59, 0x73, 0x56, 0x6e, 0xff, 0x33, 0x0b, + 0x52, 0x2f, 0xa9, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x71, 0xa2, 0xcd, + 0xfd, 0x06, 0x90, 0x0e, 0x5b, 0x0a, 0x89, 0x77, 0x83, 0xa4, 0xe1, 0x28, 0xce, 0x2b, 0xd1, 0x57, + 0x03, 0x33, 0x5a, 0xd9, 0xff, 0x54, 0x30, 0x6b, 0xbe, 0xad, 0xf2, 0xf0, 0x0e, 0xe8, 0x41, 0x91, + 0xa3, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, 0xfd, 0xf9, 0x99, 0xe2, 0x81, 0x94, 0x4b, 0x9e, 0x53, + 0xb3, 0xff, 0x48, 0xf0, 0x6a, 0x3c, 0xbe, 0x32, 0x04, 0xaf, 0x9d, 0x24, 0xaf, 0xd7, 0xf3, 0x92, + 0x95, 0xd9, 0x3c, 0x92, 0x15, 0x80, 0x2e, 0x0d, 0x1a, 0xd4, 0x8b, 0x54, 0xbc, 0x4b, 0x51, 0x46, + 0x5e, 0xea, 0x52, 0x34, 0x6a, 0xd8, 0xdf, 0x60, 0x0b, 0x28, 0x76, 0x2b, 0x25, 0x57, 0xd2, 0xbe, + 0xa2, 0xe9, 0xc5, 0xa1, 0x5d, 0x45, 0x8d, 0x28, 0x88, 0x89, 0x87, 0x44, 0x41, 0x7c, 0x04, 0xa6, + 0x03, 0xbf, 0x4d, 0x2b, 0x81, 0x97, 0x76, 0x70, 0x41, 0x56, 0x8c, 0x37, 0x51, 0xc1, 0xed, 0x5f, + 0xb3, 0x60, 0x31, 0x1d, 0xa6, 0x95, 0xbb, 0x03, 0xab, 0x19, 0x4b, 0x5e, 0x18, 0x3d, 0x96, 0xdc, + 0x7e, 0x8f, 0x31, 0x19, 0xb9, 0x8d, 0x7d, 0xd7, 0x13, 0xe1, 0xd7, 0xac, 0xe7, 0x3e, 0x02, 0xd3, + 0x54, 0xbe, 0x3c, 0x29, 0x8c, 0xc0, 0x9a, 0x49, 0xf5, 0xe0, 0xa4, 0x82, 0x93, 0x0a, 0x2c, 0xa8, + 0xab, 0x2f, 0x65, 0xb9, 0x17, 0x69, 0x23, 0xb4, 0xa5, 0x70, 0x3d, 0x09, 0xc6, 0x74, 0x7d, 0xfb, + 0x4b, 0x30, 0x6b, 0x6c, 0x4a, 0x5c, 0x7e, 0xdf, 0x77, 0x1a, 0x51, 0x5a, 0xee, 0x5d, 0x65, 0x85, + 0x28, 0x60, 0xfc, 0x82, 0x41, 0x44, 0x91, 0xa4, 0xe4, 0x9e, 0x8c, 0x1d, 0x91, 0x50, 0x86, 0x2c, + 0xa0, 0x2d, 0x7a, 0x5f, 0xe5, 0x3d, 0x57, 0xc8, 0x90, 0x15, 0xa2, 0x80, 0xd9, 0xcf, 0xc3, 0x8c, + 0x4a, 0xee, 0xc3, 0x33, 0x64, 0x28, 0xe3, 0xb7, 0x99, 0x21, 0xc3, 0x0f, 0x22, 0xe4, 0x10, 0xfb, + 0x2d, 0x98, 0x51, 0x39, 0x88, 0x1e, 0x5e, 0x9b, 0x89, 0xa2, 0xd0, 0x73, 0xaf, 0xfb, 0x61, 0xa4, + 0x12, 0x27, 0x89, 0xfb, 0xb9, 0x9b, 0x1b, 0xbc, 0x0c, 0x35, 0xd4, 0x7e, 0x11, 0x16, 0x52, 0xf7, + 0xb4, 0x43, 0xa4, 0xd3, 0xf8, 0xbd, 0x02, 0xcc, 0x99, 0xd7, 0x75, 0x43, 0xac, 0xe2, 0xe1, 0x85, + 0x63, 0xc6, 0x15, 0x5b, 0x61, 0xc4, 0x2b, 0x36, 0xf3, 0x4e, 0x73, 0xf2, 0x74, 0xef, 0x34, 0x8b, + 0xf9, 0xdc, 0x69, 0x1a, 0x77, 0xef, 0x53, 0x8f, 0xef, 0xee, 0xfd, 0x77, 0x8a, 0x30, 0x9f, 0xcc, + 0xcf, 0x38, 0xc4, 0x48, 0x3e, 0xdf, 0x37, 0x92, 0x23, 0xda, 0xf4, 0x0b, 0xe3, 0xda, 0xf4, 0x27, + 0xc7, 0xb5, 0xe9, 0x17, 0x1f, 0xc1, 0xa6, 0xdf, 0x6f, 0x91, 0x9f, 0x1a, 0xda, 0x22, 0xff, 0x69, + 0xed, 0x95, 0x37, 0x9d, 0x70, 0x63, 0x89, 0xbd, 0xf2, 0x48, 0x72, 0x18, 0xd6, 0xfc, 0x66, 0xa6, + 0x77, 0xe3, 0xcc, 0x43, 0x6c, 0x97, 0x41, 0xa6, 0x13, 0xdd, 0xe8, 0xd7, 0x86, 0x1f, 0x1a, 0xc1, + 0x81, 0xee, 0x65, 0x98, 0x95, 0xf3, 0x89, 0xab, 0xa0, 0x90, 0x54, 0x5f, 0xeb, 0x31, 0x08, 0xcd, + 0x7a, 0xfc, 0xe9, 0xee, 0xe4, 0xcb, 0xe6, 0xfc, 0x8a, 0xc4, 0x7c, 0xba, 0x3b, 0xf5, 0x12, 0x7a, + 0xba, 0xbe, 0xfd, 0x45, 0xb8, 0x90, 0x69, 0x46, 0xe0, 0x26, 0x5c, 0xae, 0x1d, 0xd1, 0xa6, 0xac, + 0x60, 0xb0, 0x91, 0x4a, 0xf9, 0xbf, 0x7c, 0x67, 0x60, 0x4d, 0x3c, 0x01, 0x8b, 0xfd, 0x9d, 0x02, + 0xcc, 0x27, 0xdf, 0x7d, 0x24, 0xf7, 0xb4, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x40, 0x6b, 0xe4, 0xfc, + 0x1b, 0x78, 0x59, 0x71, 0x8f, 0xcf, 0xaf, 0x1d, 0x9d, 0x80, 0xf0, 0xf4, 0x08, 0xcb, 0x5b, 0x02, + 0x49, 0x8e, 0x3f, 0xed, 0x18, 0x87, 0x07, 0xca, 0xd3, 0x6c, 0xee, 0xd4, 0xe3, 0x88, 0x3d, 0x4d, + 0x0a, 0x0d, 0xb2, 0x6c, 0x6f, 0x39, 0xa0, 0x81, 0xbb, 0xeb, 0xea, 0x37, 0xab, 0xb9, 0xe4, 0x7e, + 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x4d, 0x40, 0xfc, 0x9e, 0x3f, 0x7f, 0x1c, 0x2d, 0x34, 0x4e, + 0x0e, 0x72, 0xd8, 0x6e, 0x8c, 0xfb, 0x02, 0x61, 0x8c, 0x51, 0x7a, 0x4c, 0x1b, 0x25, 0x98, 0xa0, + 0xf8, 0x13, 0x78, 0xc7, 0xdf, 0x81, 0x85, 0x54, 0x3a, 0x8a, 0xdc, 0x73, 0xb6, 0xfe, 0xa8, 0x00, + 0x25, 0x1d, 0xae, 0x43, 0x3e, 0x99, 0x30, 0xe3, 0x94, 0xaa, 0x1f, 0x36, 0x5e, 0xee, 0xd9, 0xf3, + 0x9b, 0x0f, 0x8e, 0xca, 0x0b, 0xba, 0x72, 0xca, 0x24, 0x73, 0x09, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, + 0xa7, 0xdd, 0xc6, 0x4d, 0x64, 0xe5, 0x66, 0x88, 0x51, 0xe1, 0xb1, 0x86, 0x18, 0xb1, 0x5d, 0x72, + 0xc7, 0x6f, 0x1e, 0xa6, 0x5f, 0xfa, 0xa9, 0xfa, 0xcd, 0x43, 0xe4, 0x10, 0xf2, 0x1a, 0xcc, 0xcb, + 0xb8, 0x29, 0xf3, 0xfd, 0xf3, 0x42, 0x7c, 0xf9, 0xbe, 0x9d, 0x80, 0x62, 0xaa, 0x36, 0xdb, 0x65, + 0xef, 0x86, 0xbe, 0xc7, 0x33, 0xf1, 0x4e, 0x25, 0x6f, 0xea, 0x6e, 0xd4, 0xdf, 0xbc, 0xc9, 0xcd, + 0x49, 0xba, 0x46, 0x22, 0x34, 0x6b, 0xfa, 0xa1, 0xa1, 0x59, 0xeb, 0x02, 0x37, 0xe3, 0x96, 0xef, + 0x28, 0x73, 0xd5, 0x2b, 0x0a, 0x2f, 0x2b, 0x7b, 0x70, 0x74, 0x82, 0xa1, 0x4f, 0xb7, 0xb4, 0x6f, + 0xc3, 0x42, 0xaa, 0xc3, 0xd4, 0xb9, 0xda, 0xca, 0x3e, 0x57, 0x0f, 0xf7, 0x38, 0xcf, 0xbf, 0xb0, + 0xe0, 0x6c, 0x9f, 0x08, 0x18, 0x36, 0x82, 0x30, 0xbd, 0x19, 0x4d, 0x3c, 0xfa, 0x66, 0x54, 0x18, + 0x6d, 0x33, 0xaa, 0xee, 0x7c, 0xef, 0x87, 0x97, 0x9f, 0xf8, 0xfe, 0x0f, 0x2f, 0x3f, 0xf1, 0xc7, + 0x3f, 0xbc, 0xfc, 0xc4, 0x7b, 0xc7, 0x97, 0xad, 0xef, 0x1d, 0x5f, 0xb6, 0xbe, 0x7f, 0x7c, 0xd9, + 0xfa, 0xe3, 0xe3, 0xcb, 0xd6, 0x7f, 0x3a, 0xbe, 0x6c, 0x7d, 0xf3, 0x47, 0x97, 0x9f, 0xf8, 0xec, + 0xa7, 0xe3, 0x09, 0xba, 0xaa, 0x26, 0x28, 0xff, 0xf1, 0x31, 0x35, 0x1d, 0x57, 0xbb, 0xfb, 0xad, + 0x55, 0x36, 0x41, 0x57, 0x75, 0x89, 0x9a, 0xa0, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xf0, + 0x4e, 0x06, 0x76, 0x9f, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7762,6 +7763,20 @@ func (m *PrometheusMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Headers) > 0 { + for iNdEx := len(m.Headers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Headers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } i-- if m.Insecure { dAtA[i] = 1 @@ -11568,6 +11583,12 @@ func (m *PrometheusMetric) Size() (n int) { n += 1 + sovGenerated(uint64(*m.Timeout)) } n += 2 + if len(m.Headers) > 0 { + for _, e := range m.Headers { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -13520,12 +13541,18 @@ func (this *PrometheusMetric) String() string { if this == nil { return "nil" } + repeatedStringForHeaders := "[]WebMetricHeader{" + for _, f := range this.Headers { + repeatedStringForHeaders += strings.Replace(strings.Replace(f.String(), "WebMetricHeader", "WebMetricHeader", 1), `&`, ``, 1) + "," + } + repeatedStringForHeaders += "}" s := strings.Join([]string{`&PrometheusMetric{`, `Address:` + fmt.Sprintf("%v", this.Address) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "PrometheusAuth", "PrometheusAuth", 1), `&`, ``, 1) + `,`, `Timeout:` + valueToStringGenerated(this.Timeout) + `,`, `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, + `Headers:` + repeatedStringForHeaders + `,`, `}`, }, "") return s @@ -26829,6 +26856,40 @@ func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { } } m.Insecure = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Headers", 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 + } + m.Headers = append(m.Headers, WebMetricHeader{}) + if err := m.Headers[len(m.Headers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex 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 30ba6edf71..ea7c60a531 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1150,6 +1150,12 @@ message PrometheusMetric { // Insecure skips host TLS verification optional bool insecure = 5; + + // Headers are optional HTTP headers to use in the request + // +optional + // +patchMergeKey=key + // +patchStrategy=merge + repeated WebMetricHeader headers = 6; } // RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index bbb3a48f17..f91a313c76 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3465,11 +3465,31 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall Format: "", }, }, + "headers": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "key", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Headers are optional HTTP headers to use in the request", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 3d47a9e8c1..2ec2d88b97 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1926,6 +1926,11 @@ func (in *PrometheusMetric) DeepCopyInto(out *PrometheusMetric) { *out = new(int64) **out = **in } + if in.Headers != nil { + in, out := &in.Headers, &out.Headers + *out = make([]WebMetricHeader, len(*in)) + copy(*out, *in) + } return } From 5d5be4fb6e24335f9b464ecf5019376920cf59a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 04:37:20 -0500 Subject: [PATCH 128/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 (#2941) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.20.1 to 1.20.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/efs/v1.20.2/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.20.1...service/efs/v1.20.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 16 ++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 7c8a6f03c1..ec512b054d 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/antonmedv/expr v1.12.7 github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.20.0 + github.com/aws/aws-sdk-go-v2 v1.20.1 github.com/aws/aws-sdk-go-v2/config v1.18.32 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 @@ -84,14 +84,14 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect - github.com/aws/smithy-go v1.14.0 // indirect + github.com/aws/smithy-go v1.14.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 2d132ec8d3..6dfeb2b88a 100644 --- a/go.sum +++ b/go.sum @@ -101,24 +101,27 @@ 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.20.0 h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8= github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= +github.com/aws/aws-sdk-go-v2 v1.20.1 h1:rZBf5DWr7YGrnlTK4kgDQGn1ltqOg5orCYb/UhOFZkg= +github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= github.com/aws/aws-sdk-go-v2/config v1.18.32 h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI= github.com/aws/aws-sdk-go-v2/config v1.18.32/go.mod h1:U3ZF0fQRRA4gnbn9GGvOWLoT2EzzZfAWeKwnVrm1rDc= github.com/aws/aws-sdk-go-v2/credentials v1.13.31 h1:vJyON3lG7R8VOErpJJBclBADiWTwzcwdkQpTKx8D2sk= github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 h1:zr/gxAZkMcvP71ZhQOcvdm8ReLjFgIXnIn0fw5AM7mo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8tf4bRTUanzEYvhw7KkPXIMpO0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 h1:c8ed/T9T2K5I+h/JzmF5tpI46+OODQ74dzmdo+QnaMg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 h1:hNeAAymUY5gu11WrrmFb3CVIp9Dar9hbo44yzzcQpzA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 h1:GH10a37HtUcvUMg/4DR4SSYgmOaTVBBFB0npgn0LBTs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1 h1:tqKfJHzTsHbq1dSZTj74hkpzbQSTsFLaKFd5vuG3Vao= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.1/go.mod h1:7MMONtI4lt6a8RgV5OOXrnu8G42PaerBfeAkmcmhk1w= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 h1:8TXQKxY0UjNAt/9nkDtfGechuri15a+yw9QtsEuOLtE= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY= @@ -127,8 +130,9 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9Le github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs= github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= -github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io= github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.1 h1:EFKMUmH/iHMqLiwoEDx2rRjRQpI1YCn5jTysoaDujFs= +github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From d20c7f59280951a8aca10200f960c0115fa0038f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:16:46 +0000 Subject: [PATCH 129/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 (#2944) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.1 to 1.27.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.1...service/s3/v1.27.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ec512b054d..78e33d577b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.1 github.com/aws/aws-sdk-go-v2/config v1.18.32 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 6dfeb2b88a..f427303b2a 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 h1:hNeAAymUY5gu11Wrrm github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1 h1:GH10a37HtUcvUMg/4DR4SSYgmOaTVBBFB0npgn0LBTs= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.1/go.mod h1:n5d20Ru90sRlxu6/oAWDbXON7cWL+MHeiNzI5cEv9r0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 h1:8TXQKxY0UjNAt/9nkDtfGechuri15a+yw9QtsEuOLtE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= From fdb26d1d3f00c9990b8ee7793d712a91984c80c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:59:30 +0000 Subject: [PATCH 130/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 (#2943) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.32 to 1.18.33. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.32...config/v1.18.33) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 36 ++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 78e33d577b..8c26a93f3c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.0 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.1 - github.com/aws/aws-sdk-go-v2/config v1.18.32 + github.com/aws/aws-sdk-go-v2/config v1.18.33 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 // indirect github.com/aws/smithy-go v1.14.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index f427303b2a..91ee34c4c3 100644 --- a/go.sum +++ b/go.sum @@ -101,36 +101,32 @@ 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.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= github.com/aws/aws-sdk-go-v2 v1.20.1 h1:rZBf5DWr7YGrnlTK4kgDQGn1ltqOg5orCYb/UhOFZkg= github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2/config v1.18.32 h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI= -github.com/aws/aws-sdk-go-v2/config v1.18.32/go.mod h1:U3ZF0fQRRA4gnbn9GGvOWLoT2EzzZfAWeKwnVrm1rDc= -github.com/aws/aws-sdk-go-v2/credentials v1.13.31 h1:vJyON3lG7R8VOErpJJBclBADiWTwzcwdkQpTKx8D2sk= -github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA= +github.com/aws/aws-sdk-go-v2/config v1.18.33 h1:JKcw5SFxFW/rpM4mOPjv0VQ11E2kxW13F3exWOy7VZU= +github.com/aws/aws-sdk-go-v2/config v1.18.33/go.mod h1:hXO/l9pgY3K5oZJldamP0pbZHdPqqk+4/maa7DSD3cA= +github.com/aws/aws-sdk-go-v2/credentials v1.13.32 h1:lIH1eKPcCY1ylR4B6PkBGRWMHO3aVenOKJHWiS4/G2w= +github.com/aws/aws-sdk-go-v2/credentials v1.13.32/go.mod h1:lL8U3v/Y79YRG69WlAho0OHIKUXCyFvSXaIvfo81sls= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 h1:DK/9C+UN/X+1+Wm8pqaDksQr2tSLzq+8X1/rI/ZxKEQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8/go.mod h1:ce7BgLQfYr5hQFdy67oX2svto3ufGtm6oBvmsHScI1Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 h1:c8ed/T9T2K5I+h/JzmF5tpI46+OODQ74dzmdo+QnaMg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 h1:hNeAAymUY5gu11WrrmFb3CVIp9Dar9hbo44yzzcQpzA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 h1:fc0ukRAiP1syoSGZYu+DaE+FulSYhTiJ8WpVu5jElU4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 h1:8TXQKxY0UjNAt/9nkDtfGechuri15a+yw9QtsEuOLtE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.1/go.mod h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9LeH2gqNtBe0MhTedA8MGI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= -github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 h1:dGAseBFEYxth10V23b5e2mAS+tX7oVbfYHD6dnDdAsg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32/go.mod h1:4jwAWKEkCR0anWk5+1RbfSg1R5Gzld7NLiuaq5bTR/Y= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 h1:A2RlEMo4SJSwbNoUUgkxTAEMduAy/8wG3eB2b2lP4gY= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.2/go.mod h1:ju+nNXUunfIFamXUIZQiICjnO/TPlOmWcYhZcSy7xaE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 h1:OJELEgyaT2kmaBGZ+myyZbTTLobfe3ox3FSh5eYK9Qs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2/go.mod h1:ubDBBaDFs1GHijSOTi8ljppML15GLG0HxhILtbjNNYQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 h1:ympg1+Lnq33XLhcK/xTG4yZHPs1Oyxu+6DEWbl7qOzA= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.2/go.mod h1:FQ/DQcOfESELfJi5ED+IPPAjI5xC6nxtSolVVB773jM= github.com/aws/smithy-go v1.14.1 h1:EFKMUmH/iHMqLiwoEDx2rRjRQpI1YCn5jTysoaDujFs= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From e1c61368b12f397f3604098d9b28005b49df8ee4 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Tue, 8 Aug 2023 10:50:16 -0500 Subject: [PATCH 131/159] feat: enable self service notification support (#2930) * self service rollouts Signed-off-by: zachaller * cleanup Signed-off-by: zachaller * update function name Signed-off-by: zachaller * continue sending other api's on error Signed-off-by: zachaller * update go mod Signed-off-by: zachaller * fix tests Signed-off-by: zachaller * codegen Signed-off-by: zachaller * codegen Signed-off-by: zachaller * add docs Signed-off-by: zachaller * put self serve notifications behind a flag Signed-off-by: zachaller * put self serve notifications behind a flag Signed-off-by: zachaller * remove un-needed len check Signed-off-by: zachaller * fix up typo and cleanup Signed-off-by: zachaller * cleanup wording Signed-off-by: zachaller --------- Signed-off-by: zachaller --- cmd/rollouts-controller/main.go | 86 ++++++++------ controller/controller.go | 105 +++++++++--------- controller/controller_test.go | 50 ++++----- docs/features/notifications.md | 16 +++ docs/generated/notification-services/email.md | 2 +- .../generated/notification-services/github.md | 8 +- .../notification-services/pagerduty.md | 4 +- .../notification-services/pagerduty_v2.md | 78 +++++++++++++ .../notification-services/rocketchat.md | 2 +- docs/generated/notification-services/slack.md | 6 +- docs/generated/notification-services/teams.md | 4 +- go.mod | 30 ++--- go.sum | 104 +++++++++++------ mkdocs.yml | 1 + utils/record/record.go | 32 +++--- utils/record/record_test.go | 14 +-- 16 files changed, 353 insertions(+), 189 deletions(-) create mode 100755 docs/generated/notification-services/pagerduty_v2.md diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index bb3cfeba1a..2b603ec8b6 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "github.com/argoproj/argo-rollouts/utils/record" + "github.com/argoproj/pkg/kubeclientmetrics" smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned" log "github.com/sirupsen/logrus" @@ -44,31 +46,32 @@ const ( func newCommand() *cobra.Command { var ( - clientConfig clientcmd.ClientConfig - rolloutResyncPeriod int64 - logLevel string - logFormat string - klogLevel int - metricsPort int - healthzPort int - instanceID string - qps float32 - burst int - rolloutThreads int - experimentThreads int - analysisThreads int - serviceThreads int - ingressThreads int - istioVersion string - trafficSplitVersion string - ambassadorVersion string - ingressVersion string - appmeshCRDVersion string - albIngressClasses []string - nginxIngressClasses []string - awsVerifyTargetGroup bool - namespaced bool - printVersion bool + clientConfig clientcmd.ClientConfig + rolloutResyncPeriod int64 + logLevel string + logFormat string + klogLevel int + metricsPort int + healthzPort int + instanceID string + qps float32 + burst int + rolloutThreads int + experimentThreads int + analysisThreads int + serviceThreads int + ingressThreads int + istioVersion string + trafficSplitVersion string + ambassadorVersion string + ingressVersion string + appmeshCRDVersion string + albIngressClasses []string + nginxIngressClasses []string + awsVerifyTargetGroup bool + namespaced bool + printVersion bool + selfServiceNotificationEnabled bool ) electOpts := controller.NewLeaderElectionOptions() var command = cobra.Command{ @@ -151,12 +154,31 @@ func newCommand() *cobra.Command { } istioDynamicInformerFactory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(istioPrimaryDynamicClient, resyncDuration, namespace, nil) - controllerNamespaceInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( + var notificationConfigNamespace string + if selfServiceNotificationEnabled { + notificationConfigNamespace = metav1.NamespaceAll + } else { + notificationConfigNamespace = defaults.Namespace() + } + notificationSecretInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( kubeClient, resyncDuration, - kubeinformers.WithNamespace(defaults.Namespace())) - configMapInformer := controllerNamespaceInformerFactory.Core().V1().ConfigMaps() - secretInformer := controllerNamespaceInformerFactory.Core().V1().Secrets() + kubeinformers.WithNamespace(notificationConfigNamespace), + kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { + options.Kind = "Secrete" + options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationSecret) + }), + ) + + notificationConfigMapInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( + kubeClient, + resyncDuration, + kubeinformers.WithNamespace(notificationConfigNamespace), + kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { + options.Kind = "ConfigMap" + options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationConfigMap) + }), + ) mode, err := ingressutil.DetermineIngressMode(ingressVersion, kubeClient.DiscoveryClient) checkError(err) @@ -182,8 +204,8 @@ func newCommand() *cobra.Command { istioPrimaryDynamicClient, istioDynamicInformerFactory.ForResource(istioutil.GetIstioVirtualServiceGVR()).Informer(), istioDynamicInformerFactory.ForResource(istioutil.GetIstioDestinationRuleGVR()).Informer(), - configMapInformer, - secretInformer, + notificationConfigMapInformerFactory, + notificationSecretInformerFactory, resyncDuration, instanceID, metricsPort, @@ -196,7 +218,6 @@ func newCommand() *cobra.Command { istioDynamicInformerFactory, namespaced, kubeInformerFactory, - controllerNamespaceInformerFactory, jobInformerFactory) if err = cm.Run(ctx, rolloutThreads, serviceThreads, ingressThreads, experimentThreads, analysisThreads, electOpts); err != nil { @@ -240,6 +261,7 @@ func newCommand() *cobra.Command { command.Flags().DurationVar(&electOpts.LeaderElectionLeaseDuration, "leader-election-lease-duration", controller.DefaultLeaderElectionLeaseDuration, "The duration that non-leader candidates will wait after observing a leadership renewal until attempting to acquire leadership of a led but unrenewed leader slot. This is effectively the maximum duration that a leader can be stopped before it is replaced by another candidate. This is only applicable if leader election is enabled.") command.Flags().DurationVar(&electOpts.LeaderElectionRenewDeadline, "leader-election-renew-deadline", controller.DefaultLeaderElectionRenewDeadline, "The interval between attempts by the acting master to renew a leadership slot before it stops leading. This must be less than or equal to the lease duration. This is only applicable if leader election is enabled.") command.Flags().DurationVar(&electOpts.LeaderElectionRetryPeriod, "leader-election-retry-period", controller.DefaultLeaderElectionRetryPeriod, "The duration the clients should wait between attempting acquisition and renewal of a leadership. This is only applicable if leader election is enabled.") + command.Flags().BoolVar(&selfServiceNotificationEnabled, "self-service-notification-enabled", false, "Allows rollouts controller to pull notification config from the namespace that the rollout resource is in. This is useful for self-service notification.") return &command } diff --git a/controller/controller.go b/controller/controller.go index 5e5fb3fb2e..5429cfe743 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -154,14 +154,15 @@ type Manager struct { namespace string - dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - namespaced bool - kubeInformerFactory kubeinformers.SharedInformerFactory - controllerNamespaceInformerFactory kubeinformers.SharedInformerFactory - jobInformerFactory kubeinformers.SharedInformerFactory - istioPrimaryDynamicClient dynamic.Interface + dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + namespaced bool + kubeInformerFactory kubeinformers.SharedInformerFactory + notificationConfigMapInformerFactory kubeinformers.SharedInformerFactory + notificationSecretInformerFactory kubeinformers.SharedInformerFactory + jobInformerFactory kubeinformers.SharedInformerFactory + istioPrimaryDynamicClient dynamic.Interface } // NewManager returns a new manager to manage all the controllers @@ -184,8 +185,8 @@ func NewManager( istioPrimaryDynamicClient dynamic.Interface, istioVirtualServiceInformer cache.SharedIndexInformer, istioDestinationRuleInformer cache.SharedIndexInformer, - configMapInformer coreinformers.ConfigMapInformer, - secretInformer coreinformers.SecretInformer, + notificationConfigMapInformerFactory kubeinformers.SharedInformerFactory, + notificationSecretInformerFactory kubeinformers.SharedInformerFactory, resyncPeriod time.Duration, instanceID string, metricsPort int, @@ -198,10 +199,8 @@ func NewManager( istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory, namespaced bool, kubeInformerFactory kubeinformers.SharedInformerFactory, - controllerNamespaceInformerFactory kubeinformers.SharedInformerFactory, jobInformerFactory kubeinformers.SharedInformerFactory, ) *Manager { - runtime.Must(rolloutscheme.AddToScheme(scheme.Scheme)) log.Info("Creating event broadcaster") @@ -224,9 +223,9 @@ func NewManager( ingressWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "Ingresses") refResolver := rollout.NewInformerBasedWorkloadRefResolver(namespace, dynamicclientset, discoveryClient, argoprojclientset, rolloutsInformer.Informer()) - apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), secretInformer.Informer(), configMapInformer.Informer()) + apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), notificationSecretInformerFactory.Core().V1().Secrets().Informer(), notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer()) recorder := record.NewEventRecorder(kubeclientset, metrics.MetricRolloutEventsTotal, metrics.MetricNotificationFailedTotal, metrics.MetricNotificationSuccessTotal, metrics.MetricNotificationSend, apiFactory) - notificationsController := notificationcontroller.NewController(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, + notificationsController := notificationcontroller.NewControllerWithNamespaceSupport(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, notificationcontroller.WithToUnstructured(func(obj metav1.Object) (*unstructured.Unstructured, error) { data, err := json.Marshal(obj) if err != nil { @@ -320,42 +319,43 @@ func NewManager( }) cm := &Manager{ - wg: &sync.WaitGroup{}, - metricsServer: metricsServer, - healthzServer: healthzServer, - rolloutSynced: rolloutsInformer.Informer().HasSynced, - serviceSynced: servicesInformer.Informer().HasSynced, - ingressSynced: ingressWrap.HasSynced, - jobSynced: jobInformer.Informer().HasSynced, - experimentSynced: experimentsInformer.Informer().HasSynced, - analysisRunSynced: analysisRunInformer.Informer().HasSynced, - analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, - clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, - replicasSetSynced: replicaSetInformer.Informer().HasSynced, - configMapSynced: configMapInformer.Informer().HasSynced, - secretSynced: secretInformer.Informer().HasSynced, - rolloutWorkqueue: rolloutWorkqueue, - experimentWorkqueue: experimentWorkqueue, - analysisRunWorkqueue: analysisRunWorkqueue, - serviceWorkqueue: serviceWorkqueue, - ingressWorkqueue: ingressWorkqueue, - rolloutController: rolloutController, - serviceController: serviceController, - ingressController: ingressController, - experimentController: experimentController, - analysisController: analysisController, - notificationsController: notificationsController, - refResolver: refResolver, - namespace: namespace, - kubeClientSet: kubeclientset, - dynamicInformerFactory: dynamicInformerFactory, - clusterDynamicInformerFactory: clusterDynamicInformerFactory, - istioDynamicInformerFactory: istioDynamicInformerFactory, - namespaced: namespaced, - kubeInformerFactory: kubeInformerFactory, - controllerNamespaceInformerFactory: controllerNamespaceInformerFactory, - jobInformerFactory: jobInformerFactory, - istioPrimaryDynamicClient: istioPrimaryDynamicClient, + wg: &sync.WaitGroup{}, + metricsServer: metricsServer, + healthzServer: healthzServer, + rolloutSynced: rolloutsInformer.Informer().HasSynced, + serviceSynced: servicesInformer.Informer().HasSynced, + ingressSynced: ingressWrap.HasSynced, + jobSynced: jobInformer.Informer().HasSynced, + experimentSynced: experimentsInformer.Informer().HasSynced, + analysisRunSynced: analysisRunInformer.Informer().HasSynced, + analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, + clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, + replicasSetSynced: replicaSetInformer.Informer().HasSynced, + configMapSynced: notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer().HasSynced, + secretSynced: notificationSecretInformerFactory.Core().V1().Secrets().Informer().HasSynced, + rolloutWorkqueue: rolloutWorkqueue, + experimentWorkqueue: experimentWorkqueue, + analysisRunWorkqueue: analysisRunWorkqueue, + serviceWorkqueue: serviceWorkqueue, + ingressWorkqueue: ingressWorkqueue, + rolloutController: rolloutController, + serviceController: serviceController, + ingressController: ingressController, + experimentController: experimentController, + analysisController: analysisController, + notificationsController: notificationsController, + refResolver: refResolver, + namespace: namespace, + kubeClientSet: kubeclientset, + dynamicInformerFactory: dynamicInformerFactory, + clusterDynamicInformerFactory: clusterDynamicInformerFactory, + istioDynamicInformerFactory: istioDynamicInformerFactory, + namespaced: namespaced, + kubeInformerFactory: kubeInformerFactory, + jobInformerFactory: jobInformerFactory, + istioPrimaryDynamicClient: istioPrimaryDynamicClient, + notificationConfigMapInformerFactory: notificationConfigMapInformerFactory, + notificationSecretInformerFactory: notificationSecretInformerFactory, } _, err := rolloutsConfig.InitializeConfig(kubeclientset, defaults.DefaultRolloutsConfigMapName) @@ -470,7 +470,10 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT c.clusterDynamicInformerFactory.Start(ctx.Done()) } c.kubeInformerFactory.Start(ctx.Done()) - c.controllerNamespaceInformerFactory.Start(ctx.Done()) + + c.notificationConfigMapInformerFactory.Start(ctx.Done()) + c.notificationSecretInformerFactory.Start(ctx.Done()) + c.jobInformerFactory.Start(ctx.Done()) // Check if Istio installed on cluster before starting dynamicInformerFactory diff --git a/controller/controller_test.go b/controller/controller_test.go index 1a601c9248..f724ef0712 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -67,27 +67,29 @@ func (f *fixture) newManager(t *testing.T) *Manager { analysisRunWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "AnalysisRuns") cm := &Manager{ - wg: &sync.WaitGroup{}, - healthzServer: NewHealthzServer(fmt.Sprintf(listenAddr, 8080)), - rolloutSynced: alwaysReady, - experimentSynced: alwaysReady, - analysisRunSynced: alwaysReady, - analysisTemplateSynced: alwaysReady, - clusterAnalysisTemplateSynced: alwaysReady, - serviceSynced: alwaysReady, - ingressSynced: alwaysReady, - jobSynced: alwaysReady, - replicasSetSynced: alwaysReady, - configMapSynced: alwaysReady, - secretSynced: alwaysReady, - rolloutWorkqueue: rolloutWorkqueue, - serviceWorkqueue: serviceWorkqueue, - ingressWorkqueue: ingressWorkqueue, - experimentWorkqueue: experimentWorkqueue, - analysisRunWorkqueue: analysisRunWorkqueue, - kubeClientSet: f.kubeclient, - namespace: "", - namespaced: false, + wg: &sync.WaitGroup{}, + healthzServer: NewHealthzServer(fmt.Sprintf(listenAddr, 8080)), + rolloutSynced: alwaysReady, + experimentSynced: alwaysReady, + analysisRunSynced: alwaysReady, + analysisTemplateSynced: alwaysReady, + clusterAnalysisTemplateSynced: alwaysReady, + serviceSynced: alwaysReady, + ingressSynced: alwaysReady, + jobSynced: alwaysReady, + replicasSetSynced: alwaysReady, + configMapSynced: alwaysReady, + secretSynced: alwaysReady, + rolloutWorkqueue: rolloutWorkqueue, + serviceWorkqueue: serviceWorkqueue, + ingressWorkqueue: ingressWorkqueue, + experimentWorkqueue: experimentWorkqueue, + analysisRunWorkqueue: analysisRunWorkqueue, + kubeClientSet: f.kubeclient, + namespace: "", + namespaced: false, + notificationSecretInformerFactory: kubeinformers.NewSharedInformerFactoryWithOptions(f.kubeclient, noResyncPeriodFunc()), + notificationConfigMapInformerFactory: kubeinformers.NewSharedInformerFactoryWithOptions(f.kubeclient, noResyncPeriodFunc()), } metricsAddr := fmt.Sprintf(listenAddr, 8090) @@ -120,7 +122,6 @@ func (f *fixture) newManager(t *testing.T) *Manager { cm.dynamicInformerFactory = dynamicInformerFactory cm.clusterDynamicInformerFactory = dynamicInformerFactory cm.kubeInformerFactory = k8sI - cm.controllerNamespaceInformerFactory = k8sI cm.jobInformerFactory = k8sI cm.istioPrimaryDynamicClient = dynamicClient cm.istioDynamicInformerFactory = dynamicInformerFactory @@ -253,8 +254,8 @@ func TestNewManager(t *testing.T) { dynamicClient, istioVirtualServiceInformer, istioDestinationRuleInformer, - k8sI.Core().V1().ConfigMaps(), - k8sI.Core().V1().Secrets(), + k8sI, + k8sI, noResyncPeriodFunc(), "test", 8090, @@ -268,7 +269,6 @@ func TestNewManager(t *testing.T) { false, nil, nil, - nil, ) assert.NotNil(t, cm) diff --git a/docs/features/notifications.md b/docs/features/notifications.md index 3a7dfb2e4e..5574ab566f 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -50,6 +50,22 @@ stringData: Learn more about supported services and configuration settings in services [documentation](../generated/notification-services/overview.md). +## Namespace based configuration + +!!! important +Available since v1.6 + +A common installation method for Argo Rollouts is to install it in a dedicated namespace to manage a whole cluster. In this case, the administrator is the only +person who can configure notifications in that namespace generally. However, in some cases, it is required to allow end-users to configure notifications +for their Rollout resources. For example, the end-user can configure notifications for their Rollouts in the namespace where they have access to and their rollout is running in. + +To use this feature all you need to do is create the same configmap named `argo-rollouts-notification-configmap` and possibly +a secret `argo-rollouts-notification-secret` in the namespace where the rollout object lives. When it is configured this way the controller +will send notifications using both the controller level configuration (the configmap located in the same namespaces as the controller) as well as +the configmap located in the same namespaces where the rollout object is at. + +To enable you need to add a flag to the controller `--self-service-notification-enabled` + ## Default Trigger templates Currently the following triggers have [built-in templates](https://github.com/argoproj/argo-rollouts/tree/master/manifests/notifications). diff --git a/docs/generated/notification-services/email.md b/docs/generated/notification-services/email.md index e3c4b7d9e6..b81ab6cde8 100755 --- a/docs/generated/notification-services/email.md +++ b/docs/generated/notification-services/email.md @@ -46,7 +46,7 @@ data: ## Template -Notification templates support specifying subject for email notifications: +[Notification templates](../templates.md) support specifying subject for email notifications: ```yaml apiVersion: v1 diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index 2b5bbf1e8c..c24ea00f43 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -12,7 +12,7 @@ The GitHub notification service changes commit status using [GitHub Apps](https: ## Configuration 1. Create a GitHub Apps using https://github.com/settings/apps/new -2. Change repository permissions to enable write commit statuses +2. Change repository permissions to enable write commit statuses and/or deployments ![2](https://user-images.githubusercontent.com/18019529/108397381-3ca57980-725b-11eb-8d17-5b8992dc009e.png) 3. Generate a private key, and download it automatically ![3](https://user-images.githubusercontent.com/18019529/108397926-d4a36300-725b-11eb-83fe-74795c8c3e03.png) @@ -69,6 +69,12 @@ template.app-deployed: | state: success label: "continuous-delivery/{{.app.metadata.name}}" targetURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" + deployment: + state: success + environment: production + environmentURL: "https://{{.app.metadata.name}}.example.com" + logURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" + requiredContexts: [] ``` **Notes**: diff --git a/docs/generated/notification-services/pagerduty.md b/docs/generated/notification-services/pagerduty.md index 849b4db802..0e1ab96533 100755 --- a/docs/generated/notification-services/pagerduty.md +++ b/docs/generated/notification-services/pagerduty.md @@ -35,7 +35,7 @@ data: ## Template -Notification templates support specifying subject for pagerduty notifications: +[Notification templates](../templates.md) support specifying subject for pagerduty notifications: ```yaml apiVersion: v1 @@ -63,4 +63,4 @@ kind: Rollout metadata: annotations: notifications.argoproj.io/subscribe.on-rollout-aborted.pagerduty: "" -``` \ No newline at end of file +``` diff --git a/docs/generated/notification-services/pagerduty_v2.md b/docs/generated/notification-services/pagerduty_v2.md new file mode 100755 index 0000000000..21e8d942e4 --- /dev/null +++ b/docs/generated/notification-services/pagerduty_v2.md @@ -0,0 +1,78 @@ +# PagerDuty V2 + +## Parameters + +The PagerDuty notification service is used to trigger PagerDuty events and requires specifying the following settings: + +* `serviceKeys` - a dictionary with the following structure: + * `service-name: $pagerduty-key-service-name` where `service-name` is the name you want to use for the service to make events for, and `$pagerduty-key-service-name` is a reference to the secret that contains the actual PagerDuty integration key (Events API v2 integration) + +If you want multiple Argo apps to trigger events to their respective PagerDuty services, create an integration key in each service you want to setup alerts for. + +To create a PagerDuty integration key, [follow these instructions](https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration) to add an Events API v2 integration to the service of your choice. + +## Configuration + +The following snippet contains sample PagerDuty service configuration. It assumes the service you want to alert on is called `my-service`. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: +stringData: + pagerduty-key-my-service: +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.pagerdutyv2: | + serviceKeys: + my-service: $pagerduty-key-my-service +``` + +## Template + +[Notification templates](../templates.md) support specifying subject for PagerDuty notifications: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + template.rollout-aborted: | + message: Rollout {{.rollout.metadata.name}} is aborted. + pagerdutyv2: + summary: "Rollout {{.rollout.metadata.name}} is aborted." + severity: "critical" + source: "{{.rollout.metadata.name}}" +``` + +The parameters for the PagerDuty configuration in the template generally match with the payload for the Events API v2 endpoint. All parameters are strings. + +* `summary` - (required) A brief text summary of the event, used to generate the summaries/titles of any associated alerts. +* `severity` - (required) The perceived severity of the status the event is describing with respect to the affected system. Allowed values: `critical`, `warning`, `error`, `info` +* `source` - (required) The unique location of the affected system, preferably a hostname or FQDN. +* `component` - Component of the source machine that is responsible for the event. +* `group` - Logical grouping of components of a service. +* `class` - The class/type of the event. +* `url` - The URL that should be used for the link "View in ArgoCD" in PagerDuty. + +The `timestamp` and `custom_details` parameters are not currently supported. + +## Annotation + +Annotation sample for PagerDuty notifications: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + annotations: + notifications.argoproj.io/subscribe.on-rollout-aborted.pagerdutyv2: "" +``` diff --git a/docs/generated/notification-services/rocketchat.md b/docs/generated/notification-services/rocketchat.md index 554f42a808..f115705013 100755 --- a/docs/generated/notification-services/rocketchat.md +++ b/docs/generated/notification-services/rocketchat.md @@ -64,7 +64,7 @@ metadata: ## Templates -Notification templates can be customized with RocketChat [attachments](https://developer.rocket.chat/api/rest-api/methods/chat/postmessage#attachments-detail). +[Notification templates](../templates.md) can be customized with RocketChat [attachments](https://developer.rocket.chat/api/rest-api/methods/chat/postmessage#attachments-detail). *Note: Attachments structure in Rocketchat is same with Slack attachments [feature](https://api.slack.com/messaging/composing/layouts).* diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 0cd9a0f177..876445bfec 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -50,7 +50,7 @@ The Slack notification service configuration includes following settings: token: $slack-token ``` -1. Add annotation in application yaml file to enable notifications for specific argocd app +1. Add annotation in application yaml file to enable notifications for specific argocd app. The following example uses the [on-sync-succeeded trigger](../catalog.md#triggers): ```yaml apiVersion: argoproj.io/v1alpha1 @@ -60,7 +60,7 @@ The Slack notification service configuration includes following settings: notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel ``` -1. Annotation with more than one trigger multiple of destinations and recipients +1. Annotation with more than one [trigger](../catalog.md#triggers), with multiple destinations and recipients ```yaml apiVersion: argoproj.io/v1alpha1 @@ -82,7 +82,7 @@ The Slack notification service configuration includes following settings: ## Templates -Notification templates can be customized to leverage slack message blocks and attachments +[Notification templates](../templates.md) can be customized to leverage slack message blocks and attachments [feature](https://api.slack.com/messaging/composing/layouts). ![](https://user-images.githubusercontent.com/426437/72776856-6dcef880-3bc8-11ea-8e3b-c72df16ee8e6.png) diff --git a/docs/generated/notification-services/teams.md b/docs/generated/notification-services/teams.md index eb50f5538c..b5b9a228c4 100755 --- a/docs/generated/notification-services/teams.md +++ b/docs/generated/notification-services/teams.md @@ -48,7 +48,7 @@ metadata: ![](https://user-images.githubusercontent.com/18019529/114271500-9d2b8880-9a4c-11eb-85c1-f6935f0431d5.png) -Notification templates can be customized to leverage teams message sections, facts, themeColor, summary and potentialAction [feature](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using). +[Notification templates](../templates.md) can be customized to leverage teams message sections, facts, themeColor, summary and potentialAction [feature](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using). ```yaml template.app-sync-succeeded: | @@ -123,4 +123,4 @@ You can set a summary of the message that will be shown on Notifcation & Activit template.app-sync-succeeded: | teams: summary: "Sync Succeeded" -``` \ No newline at end of file +``` diff --git a/go.mod b/go.mod index 8c26a93f3c..b5ef398e23 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/antonmedv/expr v1.12.7 - github.com/argoproj/notifications-engine v0.4.0 + github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.1 github.com/aws/aws-sdk-go-v2/config v1.18.33 @@ -65,11 +65,10 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PagerDuty/go-pagerduty v1.6.0 // indirect - github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 // 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 github.com/google/go-github/v41 v41.0.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect github.com/matryer/is v1.4.0 // indirect github.com/russross/blackfriday v1.6.0 // indirect ) @@ -78,8 +77,9 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.32 // indirect @@ -96,6 +96,7 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.11.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect @@ -110,12 +111,13 @@ require ( github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect @@ -127,7 +129,7 @@ require ( github.com/hashicorp/go-hclog v0.14.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.1 // indirect github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect - github.com/huandu/xstrings v1.3.2 // indirect + github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect @@ -158,7 +160,9 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/slack-go/slack v0.12.1 // indirect + github.com/shopspring/decimal v1.2.0 // indirect + github.com/slack-go/slack v0.12.2 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect @@ -167,12 +171,12 @@ require ( github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.5.0 // indirect + golang.org/x/crypto v0.7.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect diff --git a/go.sum b/go.sum index 91ee34c4c3..8707fbce34 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,7 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -68,14 +69,16 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PagerDuty/go-pagerduty v1.6.0 h1:am81SzvG5Pw+s3JZ5yEy6kGvsXXklTNRrGr3d8WKpsU= -github.com/PagerDuty/go-pagerduty v1.6.0/go.mod h1:7eaBLzsDpK7VUvU0SJ5mohczQkoWrrr5CjDaw5gh1as= +github.com/PagerDuty/go-pagerduty v1.7.0 h1:S1NcMKECxT5hJwV4VT+QzeSsSiv4oWl1s2821dUqG/8= +github.com/PagerDuty/go-pagerduty v1.7.0/go.mod h1:PuFyJKRz1liIAH4h5KVXVD18Obpp1ZXRdxHvmGXooro= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -91,11 +94,10 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/antonmedv/expr v1.12.7 h1:jfV/l/+dHWAadLwAtESXNxXdfbK9bE4+FNMHYCMntwk= github.com/antonmedv/expr v1.12.7/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.0 h1:XyE4jAw0oeRQKL9vlDQBnycmqhN7EIqUdWgPsSUqnkQ= -github.com/argoproj/notifications-engine v0.4.0/go.mod h1:uGas18+DbCCwjif1zSwWWuwR0xJ18FXF+c2dkhPbF2k= +github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= +github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= @@ -134,16 +136,17 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh63t1Oo= github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 h1:5+NghM1Zred9Z078QEZtm28G/kfDfZN/92gkDlLwGVA= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0/go.mod h1:Xg3xPRN5Mcq6GDqeUVhFbjEWMb4JHCyWEeeBGEYQoTU= +github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= +github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -157,6 +160,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +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/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -211,6 +217,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -277,9 +284,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -342,8 +348,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= +github.com/google/go-github/v53 v53.0.0 h1:T1RyHbSnpHYnoF0ZYKiIPSgPtuJ8G6vgc0MKodXsQDQ= +github.com/google/go-github/v53 v53.0.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= @@ -388,7 +394,6 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -396,7 +401,6 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S 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-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -408,10 +412,11 @@ github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -497,14 +502,12 @@ 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/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.10/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.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= @@ -517,7 +520,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.29/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -527,6 +530,7 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= @@ -588,7 +592,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -628,14 +631,16 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/servicemeshinterface/smi-sdk-go v0.5.0 h1:9cZdhvGbGDlmnp9qqmcQL+RL6KZ3IzHfDLoA5Axg8n0= github.com/servicemeshinterface/smi-sdk-go v0.5.0/go.mod h1:nm1Slf3pfaZPP3g2tE/K5wDmQ1uWVSP0p3uu5rQAQLc= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= -github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= +github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ= +github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -647,6 +652,9 @@ github.com/spaceapegames/go-wavefront v1.8.1 h1:Xuby0uBfw1WVxD9d+l8Gh+zINqnBfd0R github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDvT/MON9v+4pbdagA8As= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -702,6 +710,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -727,8 +736,10 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +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 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= 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= @@ -761,6 +772,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -809,16 +821,20 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.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 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -830,9 +846,10 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -890,19 +907,28 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/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-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/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= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.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 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +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 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 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= @@ -912,6 +938,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.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 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -972,6 +1001,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/mkdocs.yml b/mkdocs.yml index 6f851fa425..471359c778 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -84,6 +84,7 @@ nav: - generated/notification-services/opsgenie.md - generated/notification-services/overview.md - generated/notification-services/pagerduty.md + - generated/notification-services/pagerduty_v2.md - generated/notification-services/pushover.md - generated/notification-services/rocketchat.md - generated/notification-services/slack.md diff --git a/utils/record/record.go b/utils/record/record.go index c41dbd34c7..87d83092f7 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -5,6 +5,7 @@ import ( "crypto/sha1" "encoding/base64" "encoding/json" + "fmt" "regexp" "strings" "time" @@ -17,7 +18,6 @@ import ( "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - "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" @@ -207,12 +207,21 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o if kind == "Rollout" { e.RolloutEventCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - err := e.sendNotifications(object, opts) + + apis, err := e.apiFactory.GetAPIsFromNamespace(namespace) if err != nil { - logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + + for _, api := range apis { + err := e.sendNotifications(api, object, opts) + if err != nil { + logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } } logFn := logCtx.Infof @@ -239,7 +248,7 @@ func NewAPIFactorySettings() api.Settings { } // Send notifications for triggered event if user is subscribed -func (e *EventRecorderAdapter) sendNotifications(object runtime.Object, opts EventOptions) error { +func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) error { logCtx := logutil.WithObject(object) _, namespace, name := logutil.KindNamespaceName(logCtx) startTime := timeutil.Now() @@ -248,16 +257,11 @@ func (e *EventRecorderAdapter) sendNotifications(object runtime.Object, opts Eve e.NotificationSendPerformance.WithLabelValues(namespace, name).Observe(duration.Seconds()) logCtx.WithField("time_ms", duration.Seconds()*1e3).Debug("Notification sent") }() - notificationsAPI, err := e.apiFactory.GetAPI() - if err != nil { - // don't return error if notifications are not configured and rollout has no subscribers - subsFromAnnotations := subscriptions.Annotations(object.(metav1.Object).GetAnnotations()) - logCtx.Infof("subsFromAnnotations: %s", subsFromAnnotations) - if errors.IsNotFound(err) && len(subsFromAnnotations.GetDestinations(nil, map[string][]string{})) == 0 { - return nil - } - return err + + if notificationsAPI == nil { + return fmt.Errorf("notificationsAPI is nil") } + cfg := notificationsAPI.GetConfig() destByTrigger := cfg.GetGlobalDestinations(object.(metav1.Object).GetLabels()) destByTrigger.Merge(subscriptions.NewAnnotations(object.(metav1.Object).GetAnnotations()).GetDestinations(cfg.DefaultTriggers, cfg.ServiceDefaultTriggers)) diff --git a/utils/record/record_test.go b/utils/record/record_test.go index fb8794bcf5..d7e64af1fa 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -112,7 +112,7 @@ func TestSendNotifications(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.NoError(t, err) } @@ -139,7 +139,7 @@ func TestSendNotificationsWhenCondition(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.NoError(t, err) } @@ -339,7 +339,7 @@ func TestSendNotificationsFails(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -348,7 +348,7 @@ func TestSendNotificationsFails(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -379,7 +379,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -388,7 +388,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -418,7 +418,7 @@ func TestSendNotificationsNoTrigger(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "MissingReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "MissingReason"}) assert.Error(t, err) } From 2684a5c43d40a780f13d1ff50a65506fac7a0109 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 9 Aug 2023 00:50:08 -0500 Subject: [PATCH 132/159] chore: bump gotestsum and fix flakey test causing nil channel send (#2934) * chore: bump gotestsum Signed-off-by: zachaller * Change order of defer prevent using closed channel So deferes are called in a last-in-first-out order this means, that we would close the channel before canceling the context which could lead to a nil pointer usage. Let's just manually control order. Signed-off-by: zachaller * cleanup Signed-off-by: zachaller * change order to always be able to cleanup Signed-off-by: zachaller * deregister callback to avoid sending on closed channel Signed-off-by: zachaller --------- Signed-off-by: zachaller --- hack/installers/install-dev-tools.sh | 2 +- test/fixtures/when.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hack/installers/install-dev-tools.sh b/hack/installers/install-dev-tools.sh index 0e5f67f00a..16ead66083 100755 --- a/hack/installers/install-dev-tools.sh +++ b/hack/installers/install-dev-tools.sh @@ -7,7 +7,7 @@ PATH="${DIST_PATH}:${PATH}" mkdir -p ${DIST_PATH} -gotestsum_version=1.8.1 +gotestsum_version=1.10.1 OS=$(go env GOOS) ARCH=$(go env GOARCH) diff --git a/test/fixtures/when.go b/test/fixtures/when.go index dbb90fc49e..82e84d3a42 100644 --- a/test/fixtures/when.go +++ b/test/fixtures/when.go @@ -335,11 +335,9 @@ func (w *When) WatchRolloutStatus(expectedStatus string, timeouts ...time.Durati controller := viewcontroller.NewRolloutViewController(w.namespace, w.rollout.GetName(), w.kubeClient, w.rolloutClient) ctx, cancel := context.WithCancel(w.Context) - defer cancel() controller.Start(ctx) rolloutUpdates := make(chan *rollout.RolloutInfo) - defer close(rolloutUpdates) controller.RegisterCallback(func(roInfo *rollout.RolloutInfo) { rolloutUpdates <- roInfo }) @@ -347,6 +345,11 @@ func (w *When) WatchRolloutStatus(expectedStatus string, timeouts ...time.Durati go controller.Run(ctx) finalStatus := statusOptions.WatchStatus(ctx.Done(), rolloutUpdates) + controller.DeregisterCallbacks() + + cancel() + close(rolloutUpdates) + if finalStatus == expectedStatus { w.log.Infof("expected status %s", finalStatus) } else { From f5088fe1751aab3015c3ff83d6aec83ed30b6f7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 00:50:48 -0500 Subject: [PATCH 133/159] chore(deps): bump actions/setup-go from 4.0.1 to 4.1.0 (#2947) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4.0.1 to 4.1.0. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4.0.1...v4.1.0) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 6 +++--- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 59c587fa84..749a4b4f55 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v4.1.0 with: go-version: '1.20' - uses: actions/checkout@v3.1.0 diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index 7a3a109950..59fece9c6e 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -24,7 +24,7 @@ jobs: with: python-version: 3.x - name: Set up Go - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v4.1.0 with: go-version: '1.20' - name: build diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 067b36513c..1b5d170f12 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v4.1.0 with: go-version: ${{ env.GOLANG_VERSION }} - name: Checkout code @@ -51,7 +51,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v4.1.0 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -103,7 +103,7 @@ jobs: - name: Checkout code uses: actions/checkout@v3.1.0 - name: Setup Golang - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v4.1.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 4aab75e472..a0c157cd3b 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@v4.0.1 # v3.5.0 + uses: actions/setup-go@v4.1.0 # v3.5.0 with: go-version: ${{ inputs.go-version }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index eb6d176da7..ae80d1f4e0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -91,7 +91,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v4.0.1 # v4.0.1 + uses: actions/setup-go@v4.1.0 # v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} @@ -165,7 +165,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v4.0.1 # v4.0.0 + uses: actions/setup-go@v4.1.0 # v4.0.0 with: go-version: ${{ env.GOLANG_VERSION }} From 0b81ca2b47b942c1181493ab83b2895e593ccf42 Mon Sep 17 00:00:00 2001 From: Gerald Nunn Date: Thu, 10 Aug 2023 13:41:05 -0700 Subject: [PATCH 134/159] feat(analysis): Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes #2888 (#2903) * Add rollout matchLabels to analysisrun * Add rollout matchLabels to analysisrun Signed-off-by: Gerald Nunn * Update label to use template labels instead of match labels * use ro labels Signed-off-by: zachaller * use ro labels Signed-off-by: zachaller * back to selector Signed-off-by: zachaller --------- Signed-off-by: Gerald Nunn Signed-off-by: zachaller Co-authored-by: zachaller --- rollout/analysis.go | 5 +++++ rollout/analysis_test.go | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/rollout/analysis.go b/rollout/analysis.go index 912237d9c3..b2528aaf3b 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -460,6 +460,11 @@ func (c *rolloutContext) newAnalysisRunFromRollout(rolloutAnalysis *v1alpha1.Rol for k, v := range rolloutAnalysis.AnalysisRunMetadata.Labels { run.Labels[k] = v } + + for k, v := range c.rollout.Spec.Selector.MatchLabels { + run.Labels[k] = v + } + run.Annotations = map[string]string{ annotations.RevisionAnnotation: revision, } diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index f6fa6c4bf2..f0313d7ea0 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -2337,7 +2337,7 @@ func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } -func TestCreateAnalysisRunWithCustomAnalysisRunMetadata(t *testing.T) { +func TestCreateAnalysisRunWithCustomAnalysisRunMetadataAndROCopyLabels(t *testing.T) { f := newFixture(t) defer f.Close() @@ -2346,6 +2346,8 @@ func TestCreateAnalysisRunWithCustomAnalysisRunMetadata(t *testing.T) { }} at := analysisTemplate("bar") r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r1.ObjectMeta.Labels = make(map[string]string) + r1.Spec.Selector.MatchLabels["my-label"] = "1234" r2 := bumpVersion(r1) ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ @@ -2386,4 +2388,5 @@ func TestCreateAnalysisRunWithCustomAnalysisRunMetadata(t *testing.T) { assert.Equal(t, expectedArName, createdAr.Name) assert.Equal(t, "testAnnotationValue", createdAr.Annotations["testAnnotationKey"]) assert.Equal(t, "testLabelValue", createdAr.Labels["testLabelKey"]) + assert.Equal(t, "1234", createdAr.Labels["my-label"]) } From 91cf2b1f02746a09ddd070713e08a3849ae579e0 Mon Sep 17 00:00:00 2001 From: Andy Chen Date: Thu, 10 Aug 2023 16:51:58 -0700 Subject: [PATCH 135/159] docs: update supported k8s version (#2949) Resolves #2718 Signed-off-by: Andy Chen --- docs/installation.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 5949d4eece..e144459f2e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -102,12 +102,9 @@ docker run quay.io/argoproj/kubectl-argo-rollouts:master version ## Supported versions -At any point in time the officially supported version of Argo Rollouts is the latest released one, on Kubernetes versions N and N-1 (as supported by the Kubernetes project itself). +Check [e2e testing file]( https://github.com/argoproj/argo-rollouts/blob/master/.github/workflows/e2e.yaml#L40-L44) to see what the Kubernetes version is being fully tested. -For example if the latest minor version of Argo Rollouts is 1.2.1 and supported Kubernetes versions are 1.24, 1.23 and 1.22 then the following combinations are supported: - -* Argo Rollouts 1.2.1 on Kubernetes 1.24 -* Argo Rollouts 1.2.1 on Kubernetes 1.23 +You can switch to different tags to see what relevant Kubernetes versions were being tested for the respective version. ## Upgrading Argo Rollouts From eca94d132e9cd217947fc50224cc2f5ad81f45b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Aug 2023 20:45:24 -0500 Subject: [PATCH 136/159] chore(deps): bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 (#2951) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.12.7 to 1.13.0. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.12.7...v1.13.0) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b5ef398e23..1db7e8588d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.12.7 + github.com/antonmedv/expr v1.13.0 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.20.1 diff --git a/go.sum b/go.sum index 8707fbce34..0ceac4ce29 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.12.7 h1:jfV/l/+dHWAadLwAtESXNxXdfbK9bE4+FNMHYCMntwk= -github.com/antonmedv/expr v1.12.7/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.13.0 h1:8YrTtlCzlOtXw+hpeCLDLL2uo0C0k6jmYpYTGws5c5w= +github.com/antonmedv/expr v1.13.0/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= From fec76d6368f2ff89c2f5977ac988d8586a5cdd94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Aug 2023 20:54:47 -0500 Subject: [PATCH 137/159] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 (#2950) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.20.2 to 1.21.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.21.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.20.2...service/s3/v1.21.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1db7e8588d..e5ed90b004 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.20.1 github.com/aws/aws-sdk-go-v2/config v1.18.33 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index 0ceac4ce29..604f38b70a 100644 --- a/go.sum +++ b/go.sum @@ -119,8 +119,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 h1:fc0ukRAiP1syoSGZYu+DaE+FulS github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2 h1:8TXQKxY0UjNAt/9nkDtfGechuri15a+yw9QtsEuOLtE= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.20.2/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 h1:dGAseBFEYxth10V23b5e2mAS+tX7oVbfYHD6dnDdAsg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32/go.mod h1:4jwAWKEkCR0anWk5+1RbfSg1R5Gzld7NLiuaq5bTR/Y= github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 h1:A2RlEMo4SJSwbNoUUgkxTAEMduAy/8wG3eB2b2lP4gY= From 744c0348f01a09e0dfb635f9846b93c19f6b767d Mon Sep 17 00:00:00 2001 From: Bart Smykla Date: Tue, 22 Aug 2023 08:03:25 +0200 Subject: [PATCH 138/159] fix(controller): typo fix ("Secrete" -> "Secret") in secret informer (#2965) fix: typo fix ("Secrete" -> "Secret") in secret informer Signed-off-by: Bart Smykla --- cmd/rollouts-controller/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 2b603ec8b6..ad7190c585 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -165,7 +165,7 @@ func newCommand() *cobra.Command { resyncDuration, kubeinformers.WithNamespace(notificationConfigNamespace), kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { - options.Kind = "Secrete" + options.Kind = "Secret" options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationSecret) }), ) From 5804a34fa62a2b352e11663aa9c268fc90de8167 Mon Sep 17 00:00:00 2001 From: Andy Chen Date: Thu, 31 Aug 2023 14:16:35 -0700 Subject: [PATCH 139/159] fix(controller): rollback should skip all steps to active rs within RollbackWindow (#2953) * fix(canary): skip steps when in rollback window and rs is still active Resolve #2939 Signed-off-by: Andy Chen * test(canary): add case where rollback when in window and rs is still active Signed-off-by: Andy Chen * test(replicaset): add test case for IsActive function Signed-off-by: Andy Chen --------- Signed-off-by: Andy Chen Co-authored-by: Yohan Belval Co-authored-by: zachaller --- rollout/canary.go | 11 +++++-- rollout/canary_test.go | 49 +++++++++++++++++++++++++++++ utils/replicaset/replicaset.go | 9 ++++++ utils/replicaset/replicaset_test.go | 12 +++++++ utils/time/now.go | 5 +++ 5 files changed, 83 insertions(+), 3 deletions(-) diff --git a/rollout/canary.go b/rollout/canary.go index 7c31506a82..dff4b52d50 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -359,13 +359,18 @@ func (c *rolloutContext) syncRolloutStatusCanary() error { if replicasetutil.PodTemplateOrStepsChanged(c.rollout, c.newRS) { c.resetRolloutStatus(&newStatus) - if c.newRS != nil && c.rollout.Status.StableRS == replicasetutil.GetPodTemplateHash(c.newRS) { - if stepCount > 0 { + if c.newRS != nil && stepCount > 0 { + if c.rollout.Status.StableRS == replicasetutil.GetPodTemplateHash(c.newRS) { // If we get here, we detected that we've moved back to the stable ReplicaSet - c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to stable") + c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to stable ReplicaSets") + newStatus.CurrentStepIndex = &stepCount + } else if c.isRollbackWithinWindow() && replicasetutil.IsActive(c.newRS) { + // Else if we get here we detected that we are within the rollback window we can skip steps and move back to the active ReplicaSet + c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to active ReplicaSets within RollbackWindow") newStatus.CurrentStepIndex = &stepCount } } + newStatus = c.calculateRolloutConditions(newStatus) return c.persistRolloutStatus(&newStatus) } diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 1811f6a4c4..9f66cf1078 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -846,6 +846,55 @@ func TestRollBackToStable(t *testing.T) { assert.Equal(t, calculatePatch(r2, expectedPatch), patch) } +func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(10), + }} + + r1 := newCanaryRollout("foo", 1, nil, steps, int32Ptr(0), intstr.FromInt(1), intstr.FromInt(0)) + r2 := bumpVersion(r1) + + // For the fast rollback to work, we need to: + // 1. Have the previous revision be active (i.e. not scaled down) + // 2. Be in rollback window (within window revisions and previous creation timestamp) + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 1, 1) + r2.Spec.RollbackWindow = &v1alpha1.RollbackWindowSpec{Revisions: 1} + rs1.CreationTimestamp = timeutil.MetaTime(time.Now().Add(-1 * time.Hour)) + rs2.CreationTimestamp = timeutil.MetaNow() + + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + f.serviceLister = append(f.serviceLister) + + // Switch back to version 1 + r2.Spec.Template = r1.Spec.Template + + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + // Since old replicaset is still active, expect twice the number of replicas + r2 = updateCanaryRolloutStatus(r2, rs2PodHash, 2, 2, 2, false) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + f.expectUpdateReplicaSetAction(rs1) + f.expectUpdateReplicaSetAction(rs1) + rolloutPatchIndex := f.expectPatchRolloutAction(r2) + f.run(getKey(r2, t)) + + expectedStepIndex := len(steps) + patch := f.getPatchedRolloutWithoutConditions(rolloutPatchIndex) + + // Assert current pod hash is the old replicaset and steps were skipped + assert.Regexp(t, fmt.Sprintf(`"currentPodHash":"%s"`, rs1PodHash), patch) + assert.Regexp(t, fmt.Sprintf(`"currentStepIndex":%d`, expectedStepIndex), patch) +} + func TestGradualShiftToNewStable(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/utils/replicaset/replicaset.go b/utils/replicaset/replicaset.go index 8554cdf94b..9aec161b66 100644 --- a/utils/replicaset/replicaset.go +++ b/utils/replicaset/replicaset.go @@ -341,6 +341,15 @@ func FindActiveOrLatest(newRS *appsv1.ReplicaSet, oldRSs []*appsv1.ReplicaSet) * } } +// IsActive returns if replica set is active (has, or at least ought to have pods). +func IsActive(rs *appsv1.ReplicaSet) bool { + if rs == nil { + return false + } + + return len(controller.FilterActiveReplicaSets([]*appsv1.ReplicaSet{rs})) > 0 +} + // GetReplicaCountForReplicaSets returns the sum of Replicas of the given replica sets. func GetReplicaCountForReplicaSets(replicaSets []*appsv1.ReplicaSet) int32 { totalReplicas := int32(0) diff --git a/utils/replicaset/replicaset_test.go b/utils/replicaset/replicaset_test.go index 40c7d1ae2c..23bf320955 100644 --- a/utils/replicaset/replicaset_test.go +++ b/utils/replicaset/replicaset_test.go @@ -153,6 +153,18 @@ func TestFindOldReplicaSets(t *testing.T) { } } +func TestIsActive(t *testing.T) { + rs1 := generateRS(generateRollout("foo")) + *(rs1.Spec.Replicas) = 1 + + rs2 := generateRS(generateRollout("foo")) + *(rs2.Spec.Replicas) = 0 + + assert.False(t, IsActive(nil)) + assert.True(t, IsActive(&rs1)) + assert.False(t, IsActive(&rs2)) +} + func TestGetReplicaCountForReplicaSets(t *testing.T) { rs1 := generateRS(generateRollout("foo")) *(rs1.Spec.Replicas) = 1 diff --git a/utils/time/now.go b/utils/time/now.go index 4103857811..1b51cb3cc0 100644 --- a/utils/time/now.go +++ b/utils/time/now.go @@ -13,3 +13,8 @@ var Now = time.Now var MetaNow = func() metav1.Time { return metav1.Time{Time: Now()} } + +// MetaTime is a wrapper around metav1.Time and used to override behavior in tests. +var MetaTime = func(time time.Time) metav1.Time { + return metav1.Time{Time: time} +} From 7eae71ed89f1a3769864435bddebe3ca05384df3 Mon Sep 17 00:00:00 2001 From: pasha-codefresh Date: Tue, 5 Sep 2023 19:03:51 +0300 Subject: [PATCH 140/159] fix: analysis step should be ignored after promote (#3016) * fix: analysis step should be ignored after promote in case if result was inconclusive Signed-off-by: pashakostohrys * fix: analysis step should be ignored after promote in case if result was inconclusive Signed-off-by: pashakostohrys --------- Signed-off-by: pashakostohrys --- .../cmd/promote/promote.go | 18 ++++- .../cmd/promote/promote_test.go | 66 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl-argo-rollouts/cmd/promote/promote.go b/pkg/kubectl-argo-rollouts/cmd/promote/promote.go index d71d68573f..166f24c934 100644 --- a/pkg/kubectl-argo-rollouts/cmd/promote/promote.go +++ b/pkg/kubectl-argo-rollouts/cmd/promote/promote.go @@ -34,6 +34,7 @@ const ( setCurrentStepIndex = `{"status":{"currentStepIndex":%d}}` unpausePatch = `{"spec":{"paused":false}}` clearPauseConditionsPatch = `{"status":{"pauseConditions":null}}` + clearPauseConditionsAndControllerPausePatch = `{"status":{"pauseConditions":null, "controllerPause":false, "currentStepIndex":%d}}` unpauseAndClearPauseConditionsPatch = `{"spec":{"paused":false},"status":{"pauseConditions":null}}` promoteFullPatch = `{"status":{"promoteFull":true}}` clearPauseConditionsPatchWithStep = `{"status":{"pauseConditions":null, "currentStepIndex":%d}}` @@ -133,6 +134,10 @@ func PromoteRollout(rolloutIf clientset.RolloutInterface, name string, skipCurre return ro, nil } +func isInconclusive(rollout *v1alpha1.Rollout) bool { + return rollout.Spec.Strategy.Canary != nil && rollout.Status.Canary.CurrentStepAnalysisRunStatus != nil && rollout.Status.Canary.CurrentStepAnalysisRunStatus.Status == v1alpha1.AnalysisPhaseInconclusive +} + func getPatches(rollout *v1alpha1.Rollout, skipCurrentStep, skipAllStep, full bool) ([]byte, []byte, []byte) { var specPatch, statusPatch, unifiedPatch []byte switch { @@ -160,7 +165,18 @@ func getPatches(rollout *v1alpha1.Rollout, skipCurrentStep, skipAllStep, full bo if rollout.Spec.Paused { specPatch = []byte(unpausePatch) } - if len(rollout.Status.PauseConditions) > 0 { + // in case if canary rollout in inconclusive state, we want to unset controller pause , clean pause conditions and increment step index + // so that rollout can proceed to next step + // without such patch, rollout will be stuck in inconclusive state in case if next step is pause step + if isInconclusive(rollout) && len(rollout.Status.PauseConditions) > 0 && rollout.Status.ControllerPause { + _, index := replicasetutil.GetCurrentCanaryStep(rollout) + if index != nil { + if *index < int32(len(rollout.Spec.Strategy.Canary.Steps)) { + *index++ + } + statusPatch = []byte(fmt.Sprintf(clearPauseConditionsAndControllerPausePatch, *index)) + } + } else if len(rollout.Status.PauseConditions) > 0 { statusPatch = []byte(clearPauseConditionsPatch) } else if rollout.Spec.Strategy.Canary != nil { // we only want to clear pause conditions, or increment step index (never both) diff --git a/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go b/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go index 25c2b9929d..4a31c0a255 100644 --- a/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go +++ b/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go @@ -490,3 +490,69 @@ func TestPromoteCmdAlreadyFullyPromoted(t *testing.T) { assert.Equal(t, stdout, "rollout 'guestbook' fully promoted\n") assert.Empty(t, stderr) } + +func TestPromoteInconclusiveStep(t *testing.T) { + ro := v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guestbook", + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.RolloutSpec{ + Paused: true, + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + Steps: []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32Ptr(1), + }, + { + SetWeight: pointer.Int32Ptr(2), + }, + }, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + PauseConditions: []v1alpha1.PauseCondition{{ + Reason: v1alpha1.PauseReasonCanaryPauseStep, + }}, + ControllerPause: true, + Canary: v1alpha1.CanaryStatus{ + CurrentStepAnalysisRunStatus: &v1alpha1.RolloutAnalysisRunStatus{ + Status: v1alpha1.AnalysisPhaseInconclusive, + }, + }, + }, + } + + tf, o := options.NewFakeArgoRolloutsOptions(&ro) + defer tf.Cleanup() + fakeClient := o.RolloutsClient.(*fakeroclient.Clientset) + fakeClient.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { + if patchAction, ok := action.(kubetesting.PatchAction); ok { + patchRo := v1alpha1.Rollout{} + err := json.Unmarshal(patchAction.GetPatch(), &patchRo) + if err != nil { + panic(err) + } + ro.Status.CurrentStepIndex = patchRo.Status.CurrentStepIndex + ro.Status.ControllerPause = patchRo.Status.ControllerPause + ro.Status.PauseConditions = patchRo.Status.PauseConditions + } + return true, &ro, nil + }) + + cmd := NewCmdPromote(o) + cmd.PersistentPreRunE = o.PersistentPreRunE + cmd.SetArgs([]string{"guestbook"}) + + err := cmd.Execute() + assert.Nil(t, err) + assert.Equal(t, false, ro.Status.ControllerPause) + assert.Empty(t, ro.Status.PauseConditions) + + stdout := o.Out.(*bytes.Buffer).String() + stderr := o.ErrOut.(*bytes.Buffer).String() + assert.Equal(t, stdout, "rollout 'guestbook' promoted\n") + assert.Empty(t, stderr) +} From 9456150b7c68dda834066b40a3f5440cf2c8ab52 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 30 Aug 2023 09:24:31 -0600 Subject: [PATCH 141/159] chore: change file name for readthedocs compatibility (#2999) change file name for readthedoc compat Signed-off-by: zachaller --- .readthedocs.yml => .readthedocs.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .readthedocs.yml => .readthedocs.yaml (100%) diff --git a/.readthedocs.yml b/.readthedocs.yaml similarity index 100% rename from .readthedocs.yml rename to .readthedocs.yaml From 8d7d655e51f36ad7ea8de76b2cabe9964aa0f5e2 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 5 Oct 2023 10:30:50 -0600 Subject: [PATCH 142/159] fix: missing notification on error (#3076) * fix: missing notification on error Signed-off-by: zachaller * fix tests Signed-off-by: zachaller * aggregate errors Signed-off-by: zachaller * fix bad stat counts Signed-off-by: zachaller * return errors Signed-off-by: zachaller * fix tests on return of errors Signed-off-by: zachaller * change case on logs Signed-off-by: zachaller * missed a case Signed-off-by: zachaller --------- Signed-off-by: zachaller --- utils/record/record.go | 40 ++++++++++++++++++++++++------------- utils/record/record_test.go | 14 ++++++------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/utils/record/record.go b/utils/record/record.go index 87d83092f7..ef0cf23b17 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -218,9 +218,7 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o err := e.sendNotifications(api, object, opts) if err != nil { logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) - e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } } @@ -248,7 +246,7 @@ func NewAPIFactorySettings() api.Settings { } // Send notifications for triggered event if user is subscribed -func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) error { +func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) []error { logCtx := logutil.WithObject(object) _, namespace, name := logutil.KindNamespaceName(logCtx) startTime := timeutil.Now() @@ -259,7 +257,7 @@ func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, objec }() if notificationsAPI == nil { - return fmt.Errorf("notificationsAPI is nil") + return []error{fmt.Errorf("NotificationsAPI is nil")} } cfg := notificationsAPI.GetConfig() @@ -274,39 +272,53 @@ func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, objec objMap, err := toObjectMap(object) if err != nil { - return err + return []error{err} } emptyCondition := hash("") + // We should not return in these loops because we want other configured notifications to still send if they can. + errors := []error{} for _, destination := range destinations { res, err := notificationsAPI.RunTrigger(trigger, objMap) if err != nil { - log.Errorf("Failed to execute condition of trigger %s: %v", trigger, err) - return err + log.Errorf("Failed to run trigger, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + errors = append(errors, err) + continue } log.Infof("Trigger %s result: %v", trigger, res) for _, c := range res { - log.Infof("Res When Condition hash: %s, Templates: %s", c.Key, c.Templates) + log.Infof("Result when condition hash: %s, templates: %s", c.Key, c.Templates) s := strings.Split(c.Key, ".")[1] if s != emptyCondition && c.Triggered == true { err = notificationsAPI.Send(objMap, c.Templates, destination) if err != nil { - log.Errorf("notification error: %s", err.Error()) - return err + log.Errorf("Failed to execute the sending of notification on not empty condition, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + errors = append(errors, err) + continue } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } else if s == emptyCondition { err = notificationsAPI.Send(objMap, c.Templates, destination) if err != nil { - log.Errorf("notification error: %s", err.Error()) - return err + log.Errorf("Failed to execute the sending of notification on empty condition, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + errors = append(errors, err) + continue } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } } } - - return nil + if len(errors) == 0 { + return nil + } + return errors } // This function is copied over from notification engine to make sure we honour emptyCondition diff --git a/utils/record/record_test.go b/utils/record/record_test.go index d7e64af1fa..97650bae46 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -113,7 +113,7 @@ func TestSendNotifications(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.NoError(t, err) + assert.Nil(t, err) } func TestSendNotificationsWhenCondition(t *testing.T) { @@ -140,7 +140,7 @@ func TestSendNotificationsWhenCondition(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.NoError(t, err) + assert.Nil(t, err) } func TestSendNotificationsWhenConditionTime(t *testing.T) { @@ -340,7 +340,7 @@ func TestSendNotificationsFails(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) }) t.Run("GetAPIError", func(t *testing.T) { @@ -349,7 +349,7 @@ func TestSendNotificationsFails(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.NotNil(t, err) }) } @@ -380,7 +380,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) }) t.Run("GetAPIError", func(t *testing.T) { @@ -389,7 +389,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.NotNil(t, err) }) } @@ -419,7 +419,7 @@ func TestSendNotificationsNoTrigger(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "MissingReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) } func TestNewAPIFactorySettings(t *testing.T) { From 725dd4d30ee0995c27b1919729d2ca605774b784 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 5 Oct 2023 08:14:05 -0600 Subject: [PATCH 143/159] fix: sync notification controller configmaps/secrets first (#3075) sync notification controller configmaps/secrets first before starting other informers Signed-off-by: zachaller --- controller/controller.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 5429cfe743..afe4bc769b 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -463,6 +463,12 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT // Start the informer factories to begin populating the informer caches log.Info("Starting Controllers") + c.notificationConfigMapInformerFactory.Start(ctx.Done()) + c.notificationSecretInformerFactory.Start(ctx.Done()) + if ok := cache.WaitForCacheSync(ctx.Done(), c.configMapSynced, c.secretSynced); !ok { + log.Fatalf("failed to wait for configmap/secret caches to sync, exiting") + } + // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // Start method is non-blocking and runs all registered informers in a dedicated goroutine. c.dynamicInformerFactory.Start(ctx.Done()) @@ -471,9 +477,6 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT } c.kubeInformerFactory.Start(ctx.Done()) - c.notificationConfigMapInformerFactory.Start(ctx.Done()) - c.notificationSecretInformerFactory.Start(ctx.Done()) - c.jobInformerFactory.Start(ctx.Done()) // Check if Istio installed on cluster before starting dynamicInformerFactory From 0d9983ef82718f2c8c20ab2b6c4423afe3b14410 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 11 Oct 2023 14:38:45 -0600 Subject: [PATCH 144/159] fix: bump notification-engine to fix double send on self server notifications (#3095) * bump notification-engine to fix double send on self server notifications Signed-off-by: zachaller * codegen Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .../generated/notification-services/awssqs.md | 106 ++++++++++++++++ .../generated/notification-services/github.md | 11 +- .../notification-services/googlechat.md | 19 +-- .../notification-services/grafana.md | 6 + .../notification-services/overview.md | 1 + docs/generated/notification-services/slack.md | 82 ++++++------ go.mod | 56 ++++---- go.sum | 120 ++++++++++++------ mkdocs.yml | 1 + 9 files changed, 291 insertions(+), 111 deletions(-) create mode 100755 docs/generated/notification-services/awssqs.md diff --git a/docs/generated/notification-services/awssqs.md b/docs/generated/notification-services/awssqs.md new file mode 100755 index 0000000000..6bbc47cbbc --- /dev/null +++ b/docs/generated/notification-services/awssqs.md @@ -0,0 +1,106 @@ +# AWS SQS + +## Parameters + +This notification service is capable of sending simple messages to AWS SQS queue. + +* `queue` - name of the queue you are intending to send messages to. Can be overwriten with target destination annotation. +* `region` - region of the sqs queue can be provided via env variable AWS_DEFAULT_REGION +* `key` - optional, aws access key must be either referenced from a secret via variable or via env variable AWS_ACCESS_KEY_ID +* `secret` - optional, aws access secret must be either referenced from a secret via variableor via env variable AWS_SECRET_ACCESS_KEY +* `account` optional, external accountId of the queue +* `endpointUrl` optional, useful for development with localstack + +## Example + +### Using Secret for credential retrieval: + +Resource Annotation: +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + annotations: + notifications.argoproj.io/subscribe.on-deployment-ready.awssqs: "overwrite-myqueue" +``` + +* ConfigMap +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.awssqs: | + region: "us-east-2" + queue: "myqueue" + account: "1234567" + key: "$awsaccess_key" + secret: "$awsaccess_secret" + + template.deployment-ready: | + message: | + Deployment {{.obj.metadata.name}} is ready! + + trigger.on-deployment-ready: | + - when: any(obj.status.conditions, {.type == 'Available' && .status == 'True'}) + send: [deployment-ready] + - oncePer: obj.metadata.annotations["generation"] + +``` + Secret +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: +stringData: + awsaccess_key: test + awsaccess_secret: test +``` + + +### Minimal configuration using AWS Env variables + +Ensure following list of enviromental variable is injected via OIDC, or other method. And assuming SQS is local to the account. +You may skip usage of secret for sensitive data and omit other parameters. (Setting parameters via ConfigMap takes precedent.) + +Variables: + +```bash +export AWS_ACCESS_KEY_ID="test" +export AWS_SECRET_ACCESS_KEY="test" +export AWS_DEFAULT_REGION="us-east-1" +``` + +Resource Annotation: +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + annotations: + notifications.argoproj.io/subscribe.on-deployment-ready.awssqs: "" +``` + +* ConfigMap +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.awssqs: | + queue: "myqueue" + + template.deployment-ready: | + message: | + Deployment {{.obj.metadata.name}} is ready! + + trigger.on-deployment-ready: | + - when: any(obj.status.conditions, {.type == 'Available' && .status == 'True'}) + send: [deployment-ready] + - oncePer: obj.metadata.annotations["generation"] + +``` diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index c24ea00f43..913efef6ec 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -12,7 +12,7 @@ The GitHub notification service changes commit status using [GitHub Apps](https: ## Configuration 1. Create a GitHub Apps using https://github.com/settings/apps/new -2. Change repository permissions to enable write commit statuses and/or deployments +2. Change repository permissions to enable write commit statuses and/or deployments and/or pull requests comments ![2](https://user-images.githubusercontent.com/18019529/108397381-3ca57980-725b-11eb-8d17-5b8992dc009e.png) 3. Generate a private key, and download it automatically ![3](https://user-images.githubusercontent.com/18019529/108397926-d4a36300-725b-11eb-83fe-74795c8c3e03.png) @@ -75,8 +75,17 @@ template.app-deployed: | environmentURL: "https://{{.app.metadata.name}}.example.com" logURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" requiredContexts: [] + autoMerge: true + pullRequestComment: + content: | + Application {{.app.metadata.name}} is now running new version of deployments manifests. + See more here: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true ``` **Notes**: - If the message is set to 140 characters or more, it will be truncated. - If `github.repoURLPath` and `github.revisionPath` are same as above, they can be omitted. +- Automerge is optional and `true` by default for github deployments to ensure the requested ref is up to date with the default branch. + Setting this option to `false` is required if you would like to deploy older refs in your default branch. + For more information see the [Github Deployment API Docs](https://docs.github.com/en/rest/deployments/deployments?apiVersion=2022-11-28#create-a-deployment). +- If `github.pullRequestComment.content` is set to 65536 characters or more, it will be truncated. diff --git a/docs/generated/notification-services/googlechat.md b/docs/generated/notification-services/googlechat.md index 041ea6e022..fa3bdce8da 100755 --- a/docs/generated/notification-services/googlechat.md +++ b/docs/generated/notification-services/googlechat.md @@ -59,24 +59,27 @@ A card message can be defined as follows: ```yaml template.app-sync-succeeded: | googlechat: - cards: | + cardsV2: | - header: title: ArgoCD Bot Notification sections: - widgets: - - textParagraph: + - decoratedText: text: The app {{ .app.metadata.name }} has successfully synced! - widgets: - - keyValue: + - decoratedText: topLabel: Repository - content: {{ call .repo.RepoURLToHTTPS .app.spec.source.repoURL }} - - keyValue: + text: {{ call .repo.RepoURLToHTTPS .app.spec.source.repoURL }} + - decoratedText: topLabel: Revision - content: {{ .app.spec.source.targetRevision }} - - keyValue: + text: {{ .app.spec.source.targetRevision }} + - decoratedText: topLabel: Author - content: {{ (call .repo.GetCommitMetadata .app.status.sync.revision).Author }} + text: {{ (call .repo.GetCommitMetadata .app.status.sync.revision).Author }} ``` +All [Card fields](https://developers.google.com/chat/api/reference/rest/v1/cards#Card_1) are supported and can be used +in notifications. It is also possible to use the previous (now deprecated) `cards` key to use the legacy card fields, +but this is not recommended as Google has deprecated this field and recommends using the newer `cardsV2`. The card message can be written in JSON too. diff --git a/docs/generated/notification-services/grafana.md b/docs/generated/notification-services/grafana.md index ff567b71c1..a36672d0fa 100755 --- a/docs/generated/notification-services/grafana.md +++ b/docs/generated/notification-services/grafana.md @@ -4,6 +4,12 @@ To be able to create Grafana annotation with argocd-notifications you have to cr ![sample](https://user-images.githubusercontent.com/18019529/112024976-0f106080-8b78-11eb-9658-7663305899be.png) +Available parameters : + +* `apiURL` - the server url, e.g. https://grafana.example.com +* `apiKey` - the API key for the serviceaccount +* `insecureSkipVerify` - optional bool, true or false + 1. Login to your Grafana instance as `admin` 2. On the left menu, go to Configuration / API Keys 3. Click "Add API Key" diff --git a/docs/generated/notification-services/overview.md b/docs/generated/notification-services/overview.md index 15e674f654..265e575755 100755 --- a/docs/generated/notification-services/overview.md +++ b/docs/generated/notification-services/overview.md @@ -38,6 +38,7 @@ metadata: ## Service Types +* [AwsSqs](./awssqs.md) * [Email](./email.md) * [GitHub](./github.md) * [Slack](./slack.md) diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 876445bfec..15937597c1 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -29,56 +29,56 @@ The Slack notification service configuration includes following settings: 1. Invite your slack bot to this channel **otherwise slack bot won't be able to deliver notifications to this channel** 1. Store Oauth access token in `argocd-notifications-secret` secret -```yaml - apiVersion: v1 - kind: Secret - metadata: - name: - stringData: - slack-token: -``` + ```yaml + apiVersion: v1 + kind: Secret + metadata: + name: + stringData: + slack-token: + ``` 1. Define service type slack in data section of `argocd-notifications-cm` configmap: -```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: - data: - service.slack: | - token: $slack-token -``` + ```yaml + apiVersion: v1 + kind: ConfigMap + metadata: + name: + data: + service.slack: | + token: $slack-token + ``` 1. Add annotation in application yaml file to enable notifications for specific argocd app. The following example uses the [on-sync-succeeded trigger](../catalog.md#triggers): -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel -``` + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel + ``` 1. Annotation with more than one [trigger](../catalog.md#triggers), with multiple destinations and recipients -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscriptions: | - - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] - destinations: - - service: slack - recipients: [my-channel-1, my-channel-2] - - service: email - recipients: [recipient-1, recipient-2, recipient-3 ] - - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] - destinations: - - service: slack - recipients: [my-channel-21, my-channel-22] -``` + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscriptions: | + - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] + destinations: + - service: slack + recipients: [my-channel-1, my-channel-2] + - service: email + recipients: [recipient-1, recipient-2, recipient-3 ] + - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] + destinations: + - service: slack + recipients: [my-channel-21, my-channel-22] + ``` ## Templates diff --git a/go.mod b/go.mod index e5ed90b004..955e644fff 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.13.0 - github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 + github.com/antonmedv/expr v1.15.3 + github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.20.1 + github.com/aws/aws-sdk-go-v2 v1.21.1 github.com/aws/aws-sdk-go-v2/config v1.18.33 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 + google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 @@ -57,7 +57,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go/compute v1.20.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect @@ -82,16 +82,17 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.32 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 // indirect - github.com/aws/smithy-go v1.14.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.41 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect + github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -120,10 +121,13 @@ require ( github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/gregdel/pushover v1.1.0 // indirect + github.com/gregdel/pushover v1.2.1 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v0.14.1 // indirect @@ -162,7 +166,7 @@ require ( github.com/prometheus/procfs v0.10.1 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/slack-go/slack v0.12.2 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect @@ -170,21 +174,23 @@ require ( github.com/valyala/fastjson v1.6.3 // indirect github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect github.com/xlab/treeprint v1.1.0 // indirect + go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.7.0 // indirect + golang.org/x/crypto v0.11.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect + google.golang.org/api v0.132.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // 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 604f38b70a..6265f6e972 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= @@ -91,11 +91,11 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.13.0 h1:8YrTtlCzlOtXw+hpeCLDLL2uo0C0k6jmYpYTGws5c5w= -github.com/antonmedv/expr v1.13.0/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= +github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= -github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= +github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee h1:ZYILioq4v6OIsr7uh0Pcx7JY4KpJ9qs8qbjRqM6HWMY= +github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee/go.mod h1:VG9FXG0ddIVGc7NcSTRapaUjCPCYqOji//z6mmBYwCE= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -103,34 +103,55 @@ 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.20.1 h1:rZBf5DWr7YGrnlTK4kgDQGn1ltqOg5orCYb/UhOFZkg= +github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= +github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= +github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= +github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.18.33 h1:JKcw5SFxFW/rpM4mOPjv0VQ11E2kxW13F3exWOy7VZU= github.com/aws/aws-sdk-go-v2/config v1.18.33/go.mod h1:hXO/l9pgY3K5oZJldamP0pbZHdPqqk+4/maa7DSD3cA= -github.com/aws/aws-sdk-go-v2/credentials v1.13.32 h1:lIH1eKPcCY1ylR4B6PkBGRWMHO3aVenOKJHWiS4/G2w= github.com/aws/aws-sdk-go-v2/credentials v1.13.32/go.mod h1:lL8U3v/Y79YRG69WlAho0OHIKUXCyFvSXaIvfo81sls= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 h1:DK/9C+UN/X+1+Wm8pqaDksQr2tSLzq+8X1/rI/ZxKEQ= +github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9rmEzEhbZFh9JQW/Bg= +github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8/go.mod h1:ce7BgLQfYr5hQFdy67oX2svto3ufGtm6oBvmsHScI1Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 h1:c8ed/T9T2K5I+h/JzmF5tpI46+OODQ74dzmdo+QnaMg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 h1:hNeAAymUY5gu11WrrmFb3CVIp9Dar9hbo44yzzcQpzA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 h1:fc0ukRAiP1syoSGZYu+DaE+FulSYhTiJ8WpVu5jElU4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 h1:dGAseBFEYxth10V23b5e2mAS+tX7oVbfYHD6dnDdAsg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32/go.mod h1:4jwAWKEkCR0anWk5+1RbfSg1R5Gzld7NLiuaq5bTR/Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 h1:A2RlEMo4SJSwbNoUUgkxTAEMduAy/8wG3eB2b2lP4gY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= github.com/aws/aws-sdk-go-v2/service/sso v1.13.2/go.mod h1:ju+nNXUunfIFamXUIZQiICjnO/TPlOmWcYhZcSy7xaE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 h1:OJELEgyaT2kmaBGZ+myyZbTTLobfe3ox3FSh5eYK9Qs= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 h1:vuGK1vHNP9zx0PfOrtPumbwR2af0ATQ1Z2H6p75AgRQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2/go.mod h1:ubDBBaDFs1GHijSOTi8ljppML15GLG0HxhILtbjNNYQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 h1:ympg1+Lnq33XLhcK/xTG4yZHPs1Oyxu+6DEWbl7qOzA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.21.2/go.mod h1:FQ/DQcOfESELfJi5ED+IPPAjI5xC6nxtSolVVB773jM= -github.com/aws/smithy-go v1.14.1 h1:EFKMUmH/iHMqLiwoEDx2rRjRQpI1YCn5jTysoaDujFs= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -165,7 +186,11 @@ github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEM 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/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/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/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -200,6 +225,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -217,7 +243,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -339,6 +365,7 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -367,14 +394,20 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -387,8 +420,8 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregdel/pushover v1.1.0 h1:dwHyvrcpZCOS9V1fAnKPaGRRI5OC55cVaKhMybqNsKQ= -github.com/gregdel/pushover v1.1.0/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to= +github.com/gregdel/pushover v1.2.1 h1:IPPJCdzXz60gMqnlzS0ZAW5z5aS1gI4nU+YM0Pe+ssA= +github.com/gregdel/pushover v1.2.1/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -622,8 +655,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= @@ -653,8 +686,8 @@ github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDv github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -680,6 +713,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= @@ -716,6 +750,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= @@ -734,12 +770,14 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 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 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= 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= @@ -825,16 +863,18 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug 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 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -848,7 +888,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -919,16 +959,18 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.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 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.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 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= 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= @@ -938,11 +980,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.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 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1030,6 +1074,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= +google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1069,12 +1115,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= 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= @@ -1088,8 +1134,10 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/mkdocs.yml b/mkdocs.yml index 471359c778..8506973d4f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,7 @@ nav: - Overview: features/notifications.md - Services: - generated/notification-services/alertmanager.md + - generated/notification-services/awssqs.md - generated/notification-services/email.md - generated/notification-services/github.md - generated/notification-services/googlechat.md From 270f297315a80953ec9701b59a98c4ecb35e174c Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 12 Oct 2023 13:00:01 -0600 Subject: [PATCH 145/159] fix: keep rs informer updated (#3091) * keep rs informer updated Signed-off-by: zachaller * correct bad log Signed-off-by: zachaller * add error context Signed-off-by: zachaller --------- Signed-off-by: zachaller --- rollout/controller.go | 3 ++- rollout/replicaset.go | 4 +++- rollout/replicaset_test.go | 21 +++++++++++++++++---- rollout/sync.go | 10 +++++++++- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/rollout/controller.go b/rollout/controller.go index b5c51914ae..899bc25516 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -131,6 +131,7 @@ type reconcilerBase struct { replicaSetSynced cache.InformerSynced rolloutsInformer cache.SharedIndexInformer rolloutsLister listers.RolloutLister + replicaSetInformer cache.SharedIndexInformer rolloutsSynced cache.InformerSynced rolloutsIndexer cache.Indexer servicesLister v1.ServiceLister @@ -175,7 +176,6 @@ func NewController(cfg ControllerConfig) *Controller { controllerutil.EnqueueAfter(obj, duration, cfg.RolloutWorkQueue) }, } - base := reconcilerBase{ kubeclientset: cfg.KubeClientSet, argoprojclientset: cfg.ArgoProjClientset, @@ -184,6 +184,7 @@ func NewController(cfg ControllerConfig) *Controller { replicaSetLister: cfg.ReplicaSetInformer.Lister(), replicaSetSynced: cfg.ReplicaSetInformer.Informer().HasSynced, rolloutsInformer: cfg.RolloutsInformer.Informer(), + replicaSetInformer: cfg.ReplicaSetInformer.Informer(), rolloutsIndexer: cfg.RolloutsInformer.Informer().GetIndexer(), rolloutsLister: cfg.RolloutsInformer.Lister(), rolloutsSynced: cfg.RolloutsInformer.Informer().HasSynced, diff --git a/rollout/replicaset.go b/rollout/replicaset.go index dceff65aa0..fad23e756e 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -35,6 +35,7 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) if err == nil { c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) + c.replicaSetInformer.GetIndexer().Update(rs) } return err } @@ -56,9 +57,10 @@ func (c *rolloutContext) addScaleDownDelay(rs *appsv1.ReplicaSet, scaleDownDelay } deadline := timeutil.MetaNow().Add(scaleDownDelaySeconds).UTC().Format(time.RFC3339) patch := fmt.Sprintf(addScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, deadline) - _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) + rs, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) if err == nil { c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) + c.replicaSetInformer.GetIndexer().Update(rs) } return err } diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index b1588ff4ce..7baba5e7a3 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -195,16 +195,29 @@ func TestReconcileNewReplicaSet(t *testing.T) { rollout := newBlueGreenRollout("foo", test.rolloutReplicas, nil, "", "") fake := fake.Clientset{} k8sfake := k8sfake.Clientset{} + + f := newFixture(t) + defer f.Close() + f.objects = append(f.objects, rollout) + f.replicaSetLister = append(f.replicaSetLister, oldRS, newRS) + f.kubeobjects = append(f.kubeobjects, oldRS, newRS) + _, informers, k8sInformer := f.newController(noResyncPeriodFunc) + stopCh := make(chan struct{}) + informers.Start(stopCh) + informers.WaitForCacheSync(stopCh) + close(stopCh) + roCtx := rolloutContext{ log: logutil.WithRollout(rollout), rollout: rollout, newRS: newRS, stableRS: oldRS, reconcilerBase: reconcilerBase{ - argoprojclientset: &fake, - kubeclientset: &k8sfake, - recorder: record.NewFakeEventRecorder(), - resyncPeriod: 30 * time.Second, + argoprojclientset: &fake, + kubeclientset: &k8sfake, + recorder: record.NewFakeEventRecorder(), + resyncPeriod: 30 * time.Second, + replicaSetInformer: k8sInformer.Apps().V1().ReplicaSets().Informer(), }, pauseContext: &pauseContext{ rollout: rollout, diff --git a/rollout/sync.go b/rollout/sync.go index 98990b4596..a4682fad70 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -85,7 +85,14 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { if annotationsUpdated || minReadySecondsNeedsUpdate || affinityNeedsUpdate { rsCopy.Spec.MinReadySeconds = c.rollout.Spec.MinReadySeconds rsCopy.Spec.Template.Spec.Affinity = replicasetutil.GenerateReplicaSetAffinity(*c.rollout) - return c.kubeclientset.AppsV1().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) + rs, err := c.kubeclientset.AppsV1().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) + if err != nil { + c.log.WithError(err).Error("Error: updating replicaset revision") + return nil, fmt.Errorf("error updating replicaset revision: %v", err) + } + c.log.Infof("Synced revision on ReplicaSet '%s' to '%s'", rs.Name, newRevision) + c.replicaSetInformer.GetIndexer().Update(rs) + return rs, nil } // Should use the revision in existingNewRS's annotation, since it set by before @@ -360,6 +367,7 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, scaled = true revision, _ := replicasetutil.Revision(rs) c.recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.ScalingReplicaSetReason}, conditions.ScalingReplicaSetMessage, scalingOperation, rs.Name, revision, oldScale, newScale) + c.replicaSetInformer.GetIndexer().Update(rs) } } return scaled, rs, err From e1ba61f2512f0195ca335ebbc74db83a7b130257 Mon Sep 17 00:00:00 2001 From: AS <11219262+ashutosh16@users.noreply.github.com> Date: Fri, 13 Oct 2023 06:55:48 -0700 Subject: [PATCH 146/159] chore: add missing rollout fields (#3062) * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> --------- Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> --- pkg/apiclient/rollout/rollout.pb.go | 573 +++++-- pkg/apiclient/rollout/rollout.proto | 10 + pkg/apiclient/rollout/rollout.swagger.json | 905 +++++++++- .../info/analysisrun_info.go | 6 + ui/src/models/rollout/generated/api.ts | 1487 +++++++++++++++-- 5 files changed, 2695 insertions(+), 286 deletions(-) diff --git a/pkg/apiclient/rollout/rollout.pb.go b/pkg/apiclient/rollout/rollout.pb.go index 4f36576290..54e4c099a2 100644 --- a/pkg/apiclient/rollout/rollout.pb.go +++ b/pkg/apiclient/rollout/rollout.pb.go @@ -1380,28 +1380,87 @@ func (m *JobInfo) GetStartedAt() *v1.Time { return nil } +type AnalysisRunSpecAndStatus struct { + Spec *v1alpha1.AnalysisRunSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` + Status *v1alpha1.AnalysisRunStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AnalysisRunSpecAndStatus) Reset() { *m = AnalysisRunSpecAndStatus{} } +func (m *AnalysisRunSpecAndStatus) String() string { return proto.CompactTextString(m) } +func (*AnalysisRunSpecAndStatus) ProtoMessage() {} +func (*AnalysisRunSpecAndStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_99101d942e8912a7, []int{18} +} +func (m *AnalysisRunSpecAndStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AnalysisRunSpecAndStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AnalysisRunSpecAndStatus.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AnalysisRunSpecAndStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnalysisRunSpecAndStatus.Merge(m, src) +} +func (m *AnalysisRunSpecAndStatus) XXX_Size() int { + return m.Size() +} +func (m *AnalysisRunSpecAndStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AnalysisRunSpecAndStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AnalysisRunSpecAndStatus proto.InternalMessageInfo + +func (m *AnalysisRunSpecAndStatus) GetSpec() *v1alpha1.AnalysisRunSpec { + if m != nil { + return m.Spec + } + return nil +} + +func (m *AnalysisRunSpecAndStatus) GetStatus() *v1alpha1.AnalysisRunStatus { + if m != nil { + return m.Status + } + return nil +} + type AnalysisRunInfo struct { - ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` - Icon string `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"` - Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Successful int32 `protobuf:"varint,5,opt,name=successful,proto3" json:"successful,omitempty"` - Failed int32 `protobuf:"varint,6,opt,name=failed,proto3" json:"failed,omitempty"` - Inconclusive int32 `protobuf:"varint,7,opt,name=inconclusive,proto3" json:"inconclusive,omitempty"` - Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` - Jobs []*JobInfo `protobuf:"bytes,9,rep,name=jobs,proto3" json:"jobs,omitempty"` - NonJobInfo []*NonJobInfo `protobuf:"bytes,10,rep,name=nonJobInfo,proto3" json:"nonJobInfo,omitempty"` - Metrics []*Metrics `protobuf:"bytes,11,rep,name=metrics,proto3" json:"metrics,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` + // + //field type from 161 -170 will be deprecated in future. + Icon string `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"` + Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Successful int32 `protobuf:"varint,5,opt,name=successful,proto3" json:"successful,omitempty"` + Failed int32 `protobuf:"varint,6,opt,name=failed,proto3" json:"failed,omitempty"` + Inconclusive int32 `protobuf:"varint,7,opt,name=inconclusive,proto3" json:"inconclusive,omitempty"` + Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` + Jobs []*JobInfo `protobuf:"bytes,9,rep,name=jobs,proto3" json:"jobs,omitempty"` + NonJobInfo []*NonJobInfo `protobuf:"bytes,10,rep,name=nonJobInfo,proto3" json:"nonJobInfo,omitempty"` + Metrics []*Metrics `protobuf:"bytes,11,rep,name=metrics,proto3" json:"metrics,omitempty"` + // The new API changes should use SpecAndStatus field type. + SpecAndStatus *AnalysisRunSpecAndStatus `protobuf:"bytes,12,opt,name=specAndStatus,proto3" json:"specAndStatus,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AnalysisRunInfo) Reset() { *m = AnalysisRunInfo{} } func (m *AnalysisRunInfo) String() string { return proto.CompactTextString(m) } func (*AnalysisRunInfo) ProtoMessage() {} func (*AnalysisRunInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{18} + return fileDescriptor_99101d942e8912a7, []int{19} } func (m *AnalysisRunInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1507,6 +1566,13 @@ func (m *AnalysisRunInfo) GetMetrics() []*Metrics { return nil } +func (m *AnalysisRunInfo) GetSpecAndStatus() *AnalysisRunSpecAndStatus { + if m != nil { + return m.SpecAndStatus + } + return nil +} + type NonJobInfo struct { Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` @@ -1521,7 +1587,7 @@ func (m *NonJobInfo) Reset() { *m = NonJobInfo{} } func (m *NonJobInfo) String() string { return proto.CompactTextString(m) } func (*NonJobInfo) ProtoMessage() {} func (*NonJobInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{19} + return fileDescriptor_99101d942e8912a7, []int{20} } func (m *NonJobInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1659,7 @@ func (m *Metrics) Reset() { *m = Metrics{} } func (m *Metrics) String() string { return proto.CompactTextString(m) } func (*Metrics) ProtoMessage() {} func (*Metrics) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{20} + return fileDescriptor_99101d942e8912a7, []int{21} } func (m *Metrics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,6 +1742,7 @@ func init() { proto.RegisterType((*PodInfo)(nil), "rollout.PodInfo") proto.RegisterType((*ContainerInfo)(nil), "rollout.ContainerInfo") proto.RegisterType((*JobInfo)(nil), "rollout.JobInfo") + proto.RegisterType((*AnalysisRunSpecAndStatus)(nil), "rollout.AnalysisRunSpecAndStatus") proto.RegisterType((*AnalysisRunInfo)(nil), "rollout.AnalysisRunInfo") proto.RegisterType((*NonJobInfo)(nil), "rollout.NonJobInfo") proto.RegisterType((*Metrics)(nil), "rollout.Metrics") @@ -1686,117 +1753,121 @@ func init() { } var fileDescriptor_99101d942e8912a7 = []byte{ - // 1751 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6f, 0x1c, 0x49, - 0x15, 0x57, 0x7b, 0x3c, 0xf6, 0xf8, 0x8d, 0x3f, 0xc6, 0xe5, 0x6c, 0xb6, 0x77, 0x36, 0x58, 0xa6, - 0x17, 0x09, 0xc7, 0x40, 0xb7, 0x93, 0x8d, 0xb2, 0x2c, 0x1f, 0x87, 0x90, 0x58, 0xde, 0xa0, 0xec, - 0x12, 0x3a, 0xc0, 0x0a, 0x24, 0x88, 0x6a, 0x7a, 0xca, 0xe3, 0x4e, 0x7a, 0xba, 0x9a, 0xae, 0xea, - 0x09, 0x23, 0x6b, 0x0e, 0xf0, 0x0f, 0x70, 0xe0, 0x5f, 0x58, 0x09, 0x71, 0x42, 0x48, 0x5c, 0x38, - 0x70, 0x45, 0x1c, 0x91, 0xf8, 0x07, 0x50, 0xc4, 0x85, 0x23, 0x17, 0xce, 0xa8, 0x5e, 0x57, 0x57, - 0x7f, 0x78, 0xec, 0x38, 0xb2, 0x21, 0x7b, 0x9a, 0x7a, 0xef, 0xd5, 0x7b, 0xef, 0x57, 0xf3, 0x3e, - 0xaa, 0xfa, 0xc1, 0x7b, 0xc9, 0xf3, 0x91, 0x47, 0x93, 0x30, 0x88, 0x42, 0x16, 0x4b, 0x2f, 0xe5, - 0x51, 0xc4, 0x33, 0xf3, 0xeb, 0x26, 0x29, 0x97, 0x9c, 0x2c, 0x6b, 0xb2, 0x7f, 0x63, 0xc4, 0xf9, - 0x28, 0x62, 0x4a, 0xc1, 0xa3, 0x71, 0xcc, 0x25, 0x95, 0x21, 0x8f, 0x45, 0xbe, 0xad, 0xff, 0x68, - 0x14, 0xca, 0xe3, 0x6c, 0xe0, 0x06, 0x7c, 0xec, 0xd1, 0x74, 0xc4, 0x93, 0x94, 0x3f, 0xc3, 0xc5, - 0xd7, 0xb4, 0xbe, 0xf0, 0xb4, 0x37, 0xe1, 0x19, 0xce, 0xe4, 0x16, 0x8d, 0x92, 0x63, 0x7a, 0xcb, - 0x1b, 0xb1, 0x98, 0xa5, 0x54, 0xb2, 0xa1, 0xb6, 0x76, 0xe7, 0xf9, 0xd7, 0x85, 0x1b, 0x72, 0xb5, - 0x7d, 0x4c, 0x83, 0xe3, 0x30, 0x66, 0xe9, 0xb4, 0xd4, 0x1f, 0x33, 0x49, 0xbd, 0xc9, 0x69, 0xad, - 0x77, 0x35, 0x42, 0xa4, 0x06, 0xd9, 0x91, 0xc7, 0xc6, 0x89, 0x9c, 0xe6, 0x42, 0xe7, 0x01, 0xf4, - 0xfc, 0xdc, 0xef, 0xc3, 0xf8, 0x88, 0x7f, 0x3f, 0x63, 0xe9, 0x94, 0x10, 0x58, 0x8c, 0xe9, 0x98, - 0xd9, 0xd6, 0x8e, 0xb5, 0xbb, 0xe2, 0xe3, 0x9a, 0xdc, 0x80, 0x15, 0xf5, 0x2b, 0x12, 0x1a, 0x30, - 0x7b, 0x01, 0x05, 0x25, 0xc3, 0xb9, 0x03, 0xd7, 0x2a, 0x56, 0x1e, 0x85, 0x42, 0xe6, 0x96, 0x6a, - 0x5a, 0x56, 0x53, 0xeb, 0xd7, 0x16, 0x6c, 0x3c, 0x61, 0xf2, 0xe1, 0x98, 0x8e, 0x98, 0xcf, 0x7e, - 0x9e, 0x31, 0x21, 0x89, 0x0d, 0xc5, 0x3f, 0xab, 0xf7, 0x17, 0xa4, 0xb2, 0x15, 0xf0, 0x58, 0x52, - 0x75, 0xea, 0x02, 0x81, 0x61, 0x90, 0x6b, 0xd0, 0x0e, 0x95, 0x1d, 0xbb, 0x85, 0x92, 0x9c, 0x20, - 0x3d, 0x68, 0x49, 0x3a, 0xb2, 0x17, 0x91, 0xa7, 0x96, 0x75, 0x44, 0xed, 0x26, 0xa2, 0x63, 0x20, - 0x3f, 0x8c, 0x87, 0x5c, 0x9f, 0xe5, 0xd5, 0x98, 0xfa, 0xd0, 0x49, 0xd9, 0x24, 0x14, 0x21, 0x8f, - 0x11, 0x52, 0xcb, 0x37, 0x74, 0xdd, 0x53, 0xab, 0xe9, 0xe9, 0x21, 0xbc, 0xe5, 0x33, 0x21, 0x69, - 0x2a, 0x1b, 0xce, 0x5e, 0xff, 0xcf, 0xff, 0x29, 0xbc, 0xf5, 0x38, 0xe5, 0x63, 0x2e, 0xd9, 0x65, - 0x4d, 0x29, 0x8d, 0xa3, 0x2c, 0x8a, 0x10, 0x6e, 0xc7, 0xc7, 0xb5, 0x73, 0x08, 0x5b, 0xf7, 0x06, - 0xfc, 0x0a, 0x70, 0x1e, 0xc2, 0x96, 0xcf, 0x64, 0x3a, 0xbd, 0xb4, 0xa1, 0xa7, 0xb0, 0xa9, 0x6d, - 0x7c, 0x4a, 0x65, 0x70, 0x7c, 0x30, 0x61, 0x31, 0x9a, 0x91, 0xd3, 0xc4, 0x98, 0x51, 0x6b, 0x72, - 0x17, 0xba, 0x69, 0x99, 0x96, 0x68, 0xa8, 0x7b, 0xfb, 0x9a, 0x5b, 0x54, 0x72, 0x25, 0x65, 0xfd, - 0xea, 0x46, 0xe7, 0x29, 0xac, 0x7d, 0x52, 0x78, 0x53, 0x8c, 0xf3, 0xf3, 0x98, 0xec, 0xc3, 0x16, - 0x9d, 0xd0, 0x30, 0xa2, 0x83, 0x88, 0x19, 0x3d, 0x61, 0x2f, 0xec, 0xb4, 0x76, 0x57, 0xfc, 0x79, - 0x22, 0xe7, 0x3e, 0x6c, 0x34, 0xea, 0x85, 0xec, 0x43, 0xa7, 0x68, 0x00, 0xb6, 0xb5, 0xd3, 0x3a, - 0x13, 0xa8, 0xd9, 0xe5, 0x7c, 0x00, 0xdd, 0x1f, 0xb1, 0x54, 0xe5, 0x1a, 0x62, 0xdc, 0x85, 0x8d, - 0x42, 0xa4, 0xd9, 0x1a, 0x69, 0x93, 0xed, 0xfc, 0x76, 0x09, 0xba, 0x15, 0x93, 0xe4, 0x31, 0x00, - 0x1f, 0x3c, 0x63, 0x81, 0xfc, 0x98, 0x49, 0x8a, 0x4a, 0xdd, 0xdb, 0xfb, 0x6e, 0xde, 0x6b, 0xdc, - 0x6a, 0xaf, 0x71, 0x93, 0xe7, 0x23, 0xc5, 0x10, 0xae, 0xea, 0x35, 0xee, 0xe4, 0x96, 0xfb, 0x3d, - 0xa3, 0xe7, 0x57, 0x6c, 0x90, 0xeb, 0xb0, 0x24, 0x24, 0x95, 0x99, 0xd0, 0xc1, 0xd3, 0x94, 0xaa, - 0xa4, 0x31, 0x13, 0xa2, 0xac, 0xd3, 0x82, 0x54, 0xe1, 0x0b, 0x03, 0x1e, 0xeb, 0x52, 0xc5, 0xb5, - 0xaa, 0x2e, 0x21, 0x55, 0x27, 0x1b, 0x4d, 0x75, 0xa9, 0x1a, 0x5a, 0xed, 0x17, 0x92, 0x25, 0xf6, - 0x52, 0xbe, 0x5f, 0xad, 0x55, 0x94, 0x04, 0x93, 0x9f, 0xb2, 0x70, 0x74, 0x2c, 0xed, 0xe5, 0x3c, - 0x4a, 0x86, 0x41, 0x1c, 0x58, 0xa5, 0x81, 0xcc, 0x68, 0xa4, 0x37, 0x74, 0x70, 0x43, 0x8d, 0xa7, - 0xba, 0x48, 0xca, 0xe8, 0x70, 0x6a, 0xaf, 0xec, 0x58, 0xbb, 0x6d, 0x3f, 0x27, 0x14, 0xea, 0x20, - 0x4b, 0x53, 0x16, 0x4b, 0x1b, 0x90, 0x5f, 0x90, 0x4a, 0x32, 0x64, 0x22, 0x4c, 0xd9, 0xd0, 0xee, - 0xe6, 0x12, 0x4d, 0x2a, 0x49, 0x96, 0x0c, 0x55, 0x17, 0xb6, 0x57, 0x73, 0x89, 0x26, 0x15, 0x4a, - 0x93, 0x12, 0xf6, 0x1a, 0xca, 0x4a, 0x06, 0xd9, 0x81, 0x6e, 0x9a, 0xf7, 0x05, 0x36, 0xbc, 0x27, - 0xed, 0x75, 0x04, 0x59, 0x65, 0x91, 0x6d, 0x00, 0xdd, 0xe1, 0x55, 0x88, 0x37, 0x70, 0x43, 0x85, - 0x43, 0x3e, 0x54, 0x16, 0x92, 0x28, 0x0c, 0xe8, 0x13, 0x26, 0x85, 0xdd, 0xc3, 0x5c, 0x7a, 0xbb, - 0xcc, 0x25, 0x23, 0xd3, 0x79, 0x5f, 0xee, 0x55, 0xaa, 0xec, 0x17, 0x09, 0x4b, 0xc3, 0x31, 0x8b, - 0xa5, 0xb0, 0x37, 0x1b, 0xaa, 0x07, 0x46, 0x96, 0xab, 0x56, 0xf6, 0x92, 0x6f, 0xc1, 0x2a, 0x8d, - 0x69, 0x34, 0x15, 0xa1, 0xf0, 0xb3, 0x58, 0xd8, 0x04, 0x75, 0x6d, 0xa3, 0x7b, 0xaf, 0x14, 0xa2, - 0x72, 0x6d, 0x37, 0xb9, 0x0b, 0x60, 0x5a, 0xb9, 0xb0, 0xb7, 0x50, 0xf7, 0xba, 0xd1, 0xbd, 0x5f, - 0x88, 0x50, 0xb3, 0xb2, 0x93, 0xfc, 0x0c, 0xda, 0x2a, 0xf2, 0xc2, 0xbe, 0x86, 0x2a, 0x1f, 0xb9, - 0xe5, 0x75, 0xeb, 0x16, 0xd7, 0x2d, 0x2e, 0x9e, 0x16, 0x35, 0x50, 0xa6, 0xb0, 0xe1, 0x14, 0xd7, - 0xad, 0x7b, 0x9f, 0xc6, 0x34, 0x9d, 0x3e, 0x91, 0x2c, 0xf1, 0x73, 0xb3, 0xce, 0x9f, 0x17, 0x60, - 0xbd, 0x7e, 0xea, 0xff, 0x41, 0xb1, 0x14, 0xa9, 0xbf, 0x50, 0x4f, 0x7d, 0x73, 0xb1, 0xb4, 0x1a, - 0x17, 0x4b, 0x59, 0x5c, 0x8b, 0x67, 0x15, 0x57, 0xbb, 0x5e, 0x5c, 0x8d, 0x94, 0x58, 0x7a, 0x8d, - 0x94, 0x68, 0xc6, 0x75, 0xf9, 0x75, 0xe2, 0xea, 0xfc, 0xa7, 0x05, 0xeb, 0x75, 0xeb, 0xff, 0xc7, - 0x66, 0x53, 0xfc, 0xaf, 0xad, 0x33, 0xfe, 0xd7, 0xc5, 0xb9, 0xff, 0xab, 0xaa, 0xca, 0x36, 0x5e, - 0x7f, 0x9a, 0x52, 0xfc, 0x00, 0x33, 0x03, 0x9b, 0x4d, 0xc7, 0xd7, 0x94, 0xe2, 0xd3, 0x40, 0x86, - 0x13, 0x86, 0xbd, 0xa6, 0xe3, 0x6b, 0x4a, 0xc5, 0x21, 0x51, 0x46, 0xd9, 0x0b, 0xec, 0x31, 0x1d, - 0xbf, 0x20, 0x73, 0xef, 0xf8, 0x6f, 0x08, 0xdd, 0x61, 0x0c, 0x5d, 0x6f, 0x0b, 0xd0, 0x6c, 0x0b, - 0x7d, 0xe8, 0x48, 0x36, 0x4e, 0x22, 0x2a, 0x19, 0x76, 0x9a, 0x15, 0xdf, 0xd0, 0xe4, 0xab, 0xb0, - 0x29, 0x02, 0x1a, 0xb1, 0x07, 0xfc, 0x45, 0xfc, 0x80, 0xd1, 0x61, 0x14, 0xc6, 0x0c, 0x9b, 0xce, - 0x8a, 0x7f, 0x5a, 0xa0, 0x50, 0xe3, 0xdb, 0x48, 0xd8, 0x6b, 0x78, 0x3f, 0x69, 0x8a, 0x7c, 0x09, - 0x16, 0x13, 0x3e, 0x14, 0xf6, 0x3a, 0x06, 0xb8, 0x67, 0x02, 0xfc, 0x98, 0x0f, 0x31, 0xb0, 0x28, - 0x55, 0xff, 0x69, 0x12, 0xc6, 0x23, 0x6c, 0x3b, 0x1d, 0x1f, 0xd7, 0xc8, 0xe3, 0xf1, 0xc8, 0xee, - 0x69, 0x1e, 0x8f, 0x47, 0xce, 0x9f, 0x2c, 0x58, 0xd6, 0x9a, 0x6f, 0x38, 0xe2, 0xa6, 0xa5, 0xe7, - 0xc5, 0xa2, 0x5b, 0x3a, 0x46, 0x02, 0x7b, 0xaa, 0xc0, 0x68, 0x63, 0x24, 0x72, 0xda, 0xf9, 0x10, - 0xd6, 0x6a, 0x1d, 0x67, 0xee, 0x0b, 0xc5, 0xbc, 0x37, 0x17, 0x2a, 0xef, 0x4d, 0xe7, 0xdf, 0x16, - 0x2c, 0x7f, 0x97, 0x0f, 0x3e, 0x07, 0xc7, 0xde, 0x06, 0x18, 0x33, 0x99, 0x86, 0x81, 0x7a, 0x75, - 0xe8, 0xb3, 0x57, 0x38, 0xe4, 0x23, 0x58, 0x29, 0x6f, 0x99, 0x36, 0x82, 0xdb, 0xbb, 0x18, 0xb8, - 0x1f, 0x84, 0x63, 0xe6, 0x97, 0xca, 0xce, 0x67, 0x2d, 0xd8, 0x68, 0x74, 0x81, 0xcf, 0x71, 0x93, - 0xdc, 0x06, 0x10, 0x59, 0x10, 0x30, 0x21, 0x8e, 0xb2, 0x48, 0x87, 0xbe, 0xc2, 0x51, 0x7a, 0x47, - 0x34, 0x8c, 0xd8, 0x10, 0x8b, 0xbd, 0xed, 0x6b, 0x4a, 0xbd, 0x1e, 0xc2, 0x38, 0xe0, 0x71, 0x10, - 0x65, 0xa2, 0x28, 0xf9, 0xb6, 0x5f, 0xe3, 0xa9, 0x9c, 0x60, 0x69, 0xca, 0x53, 0x2c, 0xfb, 0xb6, - 0x9f, 0x13, 0xaa, 0xb0, 0x9e, 0xf1, 0x81, 0x2a, 0xf8, 0x7a, 0x61, 0xe9, 0x3c, 0xf1, 0x51, 0x4a, - 0xde, 0x07, 0x88, 0x79, 0xac, 0x79, 0x36, 0xe0, 0xde, 0x2d, 0xb3, 0xf7, 0x13, 0x23, 0xf2, 0x2b, - 0xdb, 0xc8, 0x9e, 0xea, 0xf8, 0x2a, 0xa4, 0xc2, 0xee, 0x36, 0xac, 0x7f, 0x9c, 0xf3, 0xfd, 0x62, - 0x83, 0xf3, 0x99, 0x05, 0x50, 0x9a, 0x51, 0x58, 0x27, 0x34, 0xca, 0x8a, 0xa4, 0xce, 0x89, 0x33, - 0x33, 0xac, 0x9e, 0x4d, 0xad, 0xf3, 0xb3, 0x69, 0xf1, 0x32, 0xd9, 0xf4, 0x07, 0x0b, 0x96, 0x35, - 0xf6, 0xb9, 0x75, 0xb7, 0x07, 0x3d, 0x1d, 0xad, 0xfb, 0x3c, 0x1e, 0x86, 0x32, 0x34, 0x39, 0x71, - 0x8a, 0xaf, 0xce, 0x18, 0xf0, 0x2c, 0x96, 0x08, 0xb8, 0xed, 0xe7, 0x84, 0x6a, 0x97, 0xd5, 0xa8, - 0x3d, 0x0a, 0xc7, 0x61, 0x8e, 0xb9, 0xed, 0x9f, 0x16, 0xa8, 0xb8, 0xab, 0x0c, 0xc8, 0x52, 0xbd, - 0x31, 0xcf, 0x98, 0x1a, 0xef, 0xf6, 0xbf, 0xd6, 0x60, 0x5d, 0xbf, 0xa7, 0x9f, 0xb0, 0x74, 0x12, - 0x06, 0x8c, 0x08, 0x58, 0x3f, 0x64, 0xb2, 0xfa, 0xc8, 0x7e, 0x67, 0xde, 0x6b, 0x1e, 0xbf, 0x92, - 0xfb, 0x73, 0x1f, 0xfa, 0xce, 0xfe, 0xaf, 0xfe, 0xfe, 0xcf, 0xdf, 0x2c, 0xec, 0x91, 0x5d, 0x1c, - 0x2d, 0x4c, 0x6e, 0x95, 0xf3, 0x81, 0x13, 0xf3, 0xe9, 0x31, 0xcb, 0xd7, 0x33, 0x2f, 0x54, 0x2e, - 0x66, 0xd0, 0xc3, 0x0f, 0xa2, 0x4b, 0xb9, 0xbd, 0x8b, 0x6e, 0xf7, 0x89, 0x7b, 0x51, 0xb7, 0xde, - 0x0b, 0xe5, 0x73, 0xdf, 0x22, 0x13, 0xe8, 0xa9, 0x2f, 0x99, 0x8a, 0x31, 0x41, 0xbe, 0x30, 0xcf, - 0x87, 0x99, 0x0f, 0xf4, 0xed, 0xb3, 0xc4, 0xce, 0x4d, 0x84, 0xf1, 0x1e, 0xf9, 0xe2, 0xb9, 0x30, - 0xf0, 0xd8, 0xbf, 0xb4, 0x60, 0xb3, 0x79, 0xee, 0x57, 0x7a, 0xee, 0x37, 0xc5, 0xe5, 0xa7, 0xa4, - 0xe3, 0xa1, 0xef, 0x9b, 0xe4, 0xcb, 0xaf, 0xf4, 0x6d, 0xce, 0xfe, 0x63, 0x58, 0x3d, 0x64, 0xd2, - 0x7c, 0xe1, 0x91, 0xeb, 0x6e, 0x3e, 0x74, 0x71, 0x8b, 0xa1, 0x8b, 0x7b, 0x30, 0x4e, 0xe4, 0xb4, - 0x5f, 0x3e, 0x6a, 0x6b, 0x1f, 0x98, 0xce, 0x3b, 0xe8, 0x72, 0x8b, 0x6c, 0x16, 0x2e, 0xcb, 0xaf, - 0xcb, 0xdf, 0x5b, 0xea, 0x0d, 0x55, 0x1d, 0x15, 0x90, 0xed, 0xca, 0xd3, 0x6d, 0xce, 0x0c, 0xa1, - 0x7f, 0x70, 0xb9, 0x77, 0xb0, 0xb6, 0x56, 0xa4, 0x42, 0xff, 0x2b, 0x17, 0x49, 0x05, 0x7d, 0x7d, - 0x7e, 0xc3, 0xda, 0x43, 0xc4, 0xf5, 0x89, 0x44, 0x05, 0xf1, 0xdc, 0x51, 0xc5, 0x1b, 0x41, 0x9c, - 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x59, 0xb0, 0x5a, 0x1d, 0x72, 0x90, 0x1b, 0xe5, 0x03, 0xf7, 0xf4, - 0xec, 0xe3, 0xaa, 0xd0, 0xde, 0x41, 0xb4, 0x6e, 0xff, 0xe6, 0x45, 0xd0, 0x52, 0x85, 0x43, 0x61, - 0xfd, 0x4b, 0x3e, 0x35, 0x2b, 0xb2, 0x1a, 0xe7, 0x5c, 0x65, 0x1d, 0x35, 0xe6, 0x69, 0x57, 0x05, - 0xd5, 0x47, 0xa8, 0x8f, 0xfa, 0x87, 0xe7, 0x43, 0xd5, 0xdc, 0x99, 0x27, 0x98, 0xf4, 0x4e, 0xcc, - 0x87, 0xda, 0xcc, 0x3b, 0xc1, 0xf7, 0xd1, 0xb7, 0xf7, 0xf6, 0x66, 0xde, 0x89, 0xa4, 0xa3, 0x99, - 0x3a, 0xc8, 0x1f, 0x2d, 0xe8, 0x56, 0xa6, 0x6d, 0xe4, 0x5d, 0x73, 0x88, 0xd3, 0x33, 0xb8, 0xab, - 0x3a, 0xc7, 0x3d, 0x3c, 0xc7, 0x37, 0xfb, 0x77, 0x2f, 0x78, 0x8e, 0x2c, 0x1e, 0x72, 0xef, 0xa4, - 0x78, 0x55, 0xcc, 0x8a, 0x5c, 0xa9, 0xce, 0xb1, 0x2a, 0xb9, 0x32, 0x67, 0xbc, 0xf5, 0x46, 0x72, - 0x25, 0x55, 0x38, 0x14, 0xd6, 0xc7, 0xb0, 0xac, 0x87, 0x3e, 0x67, 0x76, 0xa4, 0xf2, 0x16, 0xa8, - 0x0c, 0x93, 0x9c, 0xb7, 0xd1, 0xdd, 0x26, 0xd9, 0x28, 0xdc, 0x4d, 0x72, 0xe1, 0x77, 0x0e, 0xfe, - 0xfa, 0x72, 0xdb, 0xfa, 0xdb, 0xcb, 0x6d, 0xeb, 0x1f, 0x2f, 0xb7, 0xad, 0x9f, 0x7c, 0x70, 0xe1, - 0xf1, 0x76, 0x7d, 0x98, 0x3e, 0x58, 0x42, 0x14, 0xef, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa1, - 0x08, 0xa7, 0x61, 0x6c, 0x17, 0x00, 0x00, + // 1821 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4f, 0x6f, 0x1c, 0x49, + 0x15, 0x57, 0x7b, 0x3c, 0xf6, 0xf8, 0x8d, 0xff, 0x96, 0xb3, 0xd9, 0xde, 0xd9, 0x60, 0x79, 0x7b, + 0x91, 0x70, 0x0c, 0x74, 0x3b, 0xde, 0x28, 0xcb, 0xf2, 0xe7, 0x60, 0x12, 0xcb, 0x1b, 0x94, 0xec, + 0x86, 0x36, 0xb0, 0x02, 0x09, 0xa2, 0x72, 0x4f, 0x79, 0xdc, 0x49, 0x4f, 0x57, 0xd3, 0x55, 0x3d, + 0x61, 0x64, 0xcd, 0x01, 0xbe, 0x00, 0x07, 0xbe, 0x02, 0x12, 0xe2, 0x84, 0x90, 0xb8, 0x70, 0xe0, + 0x8a, 0x38, 0x22, 0xf1, 0x05, 0x50, 0x84, 0x90, 0x38, 0x70, 0xe0, 0xc2, 0x19, 0xd5, 0xeb, 0xea, + 0xea, 0x3f, 0x1e, 0x27, 0x8e, 0x6c, 0x36, 0x39, 0x4d, 0xbf, 0xf7, 0xea, 0xbd, 0xf7, 0xab, 0xaa, + 0xf7, 0x5e, 0x55, 0xbd, 0x81, 0xf7, 0x93, 0xa7, 0x03, 0x8f, 0x26, 0x61, 0x10, 0x85, 0x2c, 0x96, + 0x5e, 0xca, 0xa3, 0x88, 0x67, 0xe6, 0xd7, 0x4d, 0x52, 0x2e, 0x39, 0x99, 0xd7, 0x64, 0xef, 0xc6, + 0x80, 0xf3, 0x41, 0xc4, 0x94, 0x82, 0x47, 0xe3, 0x98, 0x4b, 0x2a, 0x43, 0x1e, 0x8b, 0x7c, 0x58, + 0xef, 0xc1, 0x20, 0x94, 0x27, 0xd9, 0x91, 0x1b, 0xf0, 0xa1, 0x47, 0xd3, 0x01, 0x4f, 0x52, 0xfe, + 0x04, 0x3f, 0xbe, 0xaa, 0xf5, 0x85, 0xa7, 0xbd, 0x09, 0xcf, 0x70, 0x46, 0xb7, 0x68, 0x94, 0x9c, + 0xd0, 0x5b, 0xde, 0x80, 0xc5, 0x2c, 0xa5, 0x92, 0xf5, 0xb5, 0xb5, 0xdb, 0x4f, 0xbf, 0x26, 0xdc, + 0x90, 0xab, 0xe1, 0x43, 0x1a, 0x9c, 0x84, 0x31, 0x4b, 0xc7, 0xa5, 0xfe, 0x90, 0x49, 0xea, 0x8d, + 0xce, 0x6a, 0xbd, 0xab, 0x11, 0x22, 0x75, 0x94, 0x1d, 0x7b, 0x6c, 0x98, 0xc8, 0x71, 0x2e, 0x74, + 0xee, 0xc1, 0xaa, 0x9f, 0xfb, 0xbd, 0x1f, 0x1f, 0xf3, 0xef, 0x66, 0x2c, 0x1d, 0x13, 0x02, 0xb3, + 0x31, 0x1d, 0x32, 0xdb, 0xda, 0xb4, 0xb6, 0x16, 0x7c, 0xfc, 0x26, 0x37, 0x60, 0x41, 0xfd, 0x8a, + 0x84, 0x06, 0xcc, 0x9e, 0x41, 0x41, 0xc9, 0x70, 0x6e, 0xc3, 0xb5, 0x8a, 0x95, 0x07, 0xa1, 0x90, + 0xb9, 0xa5, 0x9a, 0x96, 0xd5, 0xd4, 0xfa, 0xa5, 0x05, 0x2b, 0x87, 0x4c, 0xde, 0x1f, 0xd2, 0x01, + 0xf3, 0xd9, 0x4f, 0x33, 0x26, 0x24, 0xb1, 0xa1, 0x58, 0x59, 0x3d, 0xbe, 0x20, 0x95, 0xad, 0x80, + 0xc7, 0x92, 0xaa, 0x59, 0x17, 0x08, 0x0c, 0x83, 0x5c, 0x83, 0x76, 0xa8, 0xec, 0xd8, 0x2d, 0x94, + 0xe4, 0x04, 0x59, 0x85, 0x96, 0xa4, 0x03, 0x7b, 0x16, 0x79, 0xea, 0xb3, 0x8e, 0xa8, 0xdd, 0x44, + 0x74, 0x02, 0xe4, 0xfb, 0x71, 0x9f, 0xeb, 0xb9, 0xbc, 0x1c, 0x53, 0x0f, 0x3a, 0x29, 0x1b, 0x85, + 0x22, 0xe4, 0x31, 0x42, 0x6a, 0xf9, 0x86, 0xae, 0x7b, 0x6a, 0x35, 0x3d, 0xdd, 0x87, 0xb7, 0x7c, + 0x26, 0x24, 0x4d, 0x65, 0xc3, 0xd9, 0xab, 0x2f, 0xfe, 0x8f, 0xe1, 0xad, 0x47, 0x29, 0x1f, 0x72, + 0xc9, 0x2e, 0x6b, 0x4a, 0x69, 0x1c, 0x67, 0x51, 0x84, 0x70, 0x3b, 0x3e, 0x7e, 0x3b, 0x07, 0xb0, + 0xbe, 0x77, 0xc4, 0xaf, 0x00, 0xe7, 0x01, 0xac, 0xfb, 0x4c, 0xa6, 0xe3, 0x4b, 0x1b, 0x7a, 0x0c, + 0x6b, 0xda, 0xc6, 0x67, 0x54, 0x06, 0x27, 0xfb, 0x23, 0x16, 0xa3, 0x19, 0x39, 0x4e, 0x8c, 0x19, + 0xf5, 0x4d, 0xee, 0x40, 0x37, 0x2d, 0xc3, 0x12, 0x0d, 0x75, 0x77, 0xaf, 0xb9, 0x45, 0x26, 0x57, + 0x42, 0xd6, 0xaf, 0x0e, 0x74, 0x1e, 0xc3, 0xd2, 0x27, 0x85, 0x37, 0xc5, 0x78, 0x71, 0x1c, 0x93, + 0x1d, 0x58, 0xa7, 0x23, 0x1a, 0x46, 0xf4, 0x28, 0x62, 0x46, 0x4f, 0xd8, 0x33, 0x9b, 0xad, 0xad, + 0x05, 0x7f, 0x9a, 0xc8, 0xb9, 0x0b, 0x2b, 0x8d, 0x7c, 0x21, 0x3b, 0xd0, 0x29, 0x0a, 0x80, 0x6d, + 0x6d, 0xb6, 0xce, 0x05, 0x6a, 0x46, 0x39, 0x1f, 0x42, 0xf7, 0x07, 0x2c, 0x55, 0xb1, 0x86, 0x18, + 0xb7, 0x60, 0xa5, 0x10, 0x69, 0xb6, 0x46, 0xda, 0x64, 0x3b, 0xbf, 0x99, 0x83, 0x6e, 0xc5, 0x24, + 0x79, 0x04, 0xc0, 0x8f, 0x9e, 0xb0, 0x40, 0x3e, 0x64, 0x92, 0xa2, 0x52, 0x77, 0x77, 0xc7, 0xcd, + 0x6b, 0x8d, 0x5b, 0xad, 0x35, 0x6e, 0xf2, 0x74, 0xa0, 0x18, 0xc2, 0x55, 0xb5, 0xc6, 0x1d, 0xdd, + 0x72, 0x3f, 0x35, 0x7a, 0x7e, 0xc5, 0x06, 0xb9, 0x0e, 0x73, 0x42, 0x52, 0x99, 0x09, 0xbd, 0x79, + 0x9a, 0x52, 0x99, 0x34, 0x64, 0x42, 0x94, 0x79, 0x5a, 0x90, 0x6a, 0xfb, 0xc2, 0x80, 0xc7, 0x3a, + 0x55, 0xf1, 0x5b, 0x65, 0x97, 0x90, 0xaa, 0x92, 0x0d, 0xc6, 0x3a, 0x55, 0x0d, 0xad, 0xc6, 0x0b, + 0xc9, 0x12, 0x7b, 0x2e, 0x1f, 0xaf, 0xbe, 0xd5, 0x2e, 0x09, 0x26, 0x3f, 0x63, 0xe1, 0xe0, 0x44, + 0xda, 0xf3, 0xf9, 0x2e, 0x19, 0x06, 0x71, 0x60, 0x91, 0x06, 0x32, 0xa3, 0x91, 0x1e, 0xd0, 0xc1, + 0x01, 0x35, 0x9e, 0xaa, 0x22, 0x29, 0xa3, 0xfd, 0xb1, 0xbd, 0xb0, 0x69, 0x6d, 0xb5, 0xfd, 0x9c, + 0x50, 0xa8, 0x83, 0x2c, 0x4d, 0x59, 0x2c, 0x6d, 0x40, 0x7e, 0x41, 0x2a, 0x49, 0x9f, 0x89, 0x30, + 0x65, 0x7d, 0xbb, 0x9b, 0x4b, 0x34, 0xa9, 0x24, 0x59, 0xd2, 0x57, 0x55, 0xd8, 0x5e, 0xcc, 0x25, + 0x9a, 0x54, 0x28, 0x4d, 0x48, 0xd8, 0x4b, 0x28, 0x2b, 0x19, 0x64, 0x13, 0xba, 0x69, 0x5e, 0x17, + 0x58, 0x7f, 0x4f, 0xda, 0xcb, 0x08, 0xb2, 0xca, 0x22, 0x1b, 0x00, 0xba, 0xc2, 0xab, 0x2d, 0x5e, + 0xc1, 0x01, 0x15, 0x0e, 0xf9, 0x48, 0x59, 0x48, 0xa2, 0x30, 0xa0, 0x87, 0x4c, 0x0a, 0x7b, 0x15, + 0x63, 0xe9, 0xed, 0x32, 0x96, 0x8c, 0x4c, 0xc7, 0x7d, 0x39, 0x56, 0xa9, 0xb2, 0x9f, 0x25, 0x2c, + 0x0d, 0x87, 0x2c, 0x96, 0xc2, 0x5e, 0x6b, 0xa8, 0xee, 0x1b, 0x59, 0xae, 0x5a, 0x19, 0x4b, 0xbe, + 0x09, 0x8b, 0x34, 0xa6, 0xd1, 0x58, 0x84, 0xc2, 0xcf, 0x62, 0x61, 0x13, 0xd4, 0xb5, 0x8d, 0xee, + 0x5e, 0x29, 0x44, 0xe5, 0xda, 0x68, 0x72, 0x07, 0xc0, 0x94, 0x72, 0x61, 0xaf, 0xa3, 0xee, 0x75, + 0xa3, 0x7b, 0xb7, 0x10, 0xa1, 0x66, 0x65, 0x24, 0xf9, 0x09, 0xb4, 0xd5, 0xce, 0x0b, 0xfb, 0x1a, + 0xaa, 0x7c, 0xec, 0x96, 0xc7, 0xad, 0x5b, 0x1c, 0xb7, 0xf8, 0xf1, 0xb8, 0xc8, 0x81, 0x32, 0x84, + 0x0d, 0xa7, 0x38, 0x6e, 0xdd, 0xbb, 0x34, 0xa6, 0xe9, 0xf8, 0x50, 0xb2, 0xc4, 0xcf, 0xcd, 0x3a, + 0x7f, 0x9a, 0x81, 0xe5, 0xfa, 0xac, 0xff, 0x0f, 0xc9, 0x52, 0x84, 0xfe, 0x4c, 0x3d, 0xf4, 0xcd, + 0xc1, 0xd2, 0x6a, 0x1c, 0x2c, 0x65, 0x72, 0xcd, 0x9e, 0x97, 0x5c, 0xed, 0x7a, 0x72, 0x35, 0x42, + 0x62, 0xee, 0x15, 0x42, 0xa2, 0xb9, 0xaf, 0xf3, 0xaf, 0xb2, 0xaf, 0xce, 0x7f, 0x5b, 0xb0, 0x5c, + 0xb7, 0xfe, 0x39, 0x16, 0x9b, 0x62, 0x5d, 0x5b, 0xe7, 0xac, 0xeb, 0xec, 0xd4, 0x75, 0x55, 0x59, + 0xd9, 0xc6, 0xe3, 0x4f, 0x53, 0x8a, 0x1f, 0x60, 0x64, 0x60, 0xb1, 0xe9, 0xf8, 0x9a, 0x52, 0x7c, + 0x1a, 0xc8, 0x70, 0xc4, 0xb0, 0xd6, 0x74, 0x7c, 0x4d, 0xa9, 0x7d, 0x48, 0x94, 0x51, 0xf6, 0x0c, + 0x6b, 0x4c, 0xc7, 0x2f, 0xc8, 0xdc, 0x3b, 0xae, 0x86, 0xd0, 0x15, 0xc6, 0xd0, 0xf5, 0xb2, 0x00, + 0xcd, 0xb2, 0xd0, 0x83, 0x8e, 0x64, 0xc3, 0x24, 0xa2, 0x92, 0x61, 0xa5, 0x59, 0xf0, 0x0d, 0x4d, + 0xbe, 0x02, 0x6b, 0x22, 0xa0, 0x11, 0xbb, 0xc7, 0x9f, 0xc5, 0xf7, 0x18, 0xed, 0x47, 0x61, 0xcc, + 0xb0, 0xe8, 0x2c, 0xf8, 0x67, 0x05, 0x0a, 0x35, 0xde, 0x8d, 0x84, 0xbd, 0x84, 0xe7, 0x93, 0xa6, + 0xc8, 0x17, 0x61, 0x36, 0xe1, 0x7d, 0x61, 0x2f, 0xe3, 0x06, 0xaf, 0x9a, 0x0d, 0x7e, 0xc4, 0xfb, + 0xb8, 0xb1, 0x28, 0x55, 0x6b, 0x9a, 0x84, 0xf1, 0x00, 0xcb, 0x4e, 0xc7, 0xc7, 0x6f, 0xe4, 0xf1, + 0x78, 0x60, 0xaf, 0x6a, 0x1e, 0x8f, 0x07, 0xce, 0x1f, 0x2d, 0x98, 0xd7, 0x9a, 0xaf, 0x79, 0xc7, + 0x4d, 0x49, 0xcf, 0x93, 0x45, 0x97, 0x74, 0xdc, 0x09, 0xac, 0xa9, 0x02, 0x77, 0x1b, 0x77, 0x22, + 0xa7, 0x9d, 0x8f, 0x60, 0xa9, 0x56, 0x71, 0xa6, 0xde, 0x50, 0xcc, 0x7d, 0x73, 0xa6, 0x72, 0xdf, + 0x74, 0xfe, 0x63, 0xc1, 0xfc, 0x77, 0xf8, 0xd1, 0x1b, 0x30, 0xed, 0x0d, 0x80, 0x21, 0x93, 0x69, + 0x18, 0xa8, 0x5b, 0x87, 0x9e, 0x7b, 0x85, 0x43, 0x3e, 0x86, 0x85, 0xf2, 0x94, 0x69, 0x23, 0xb8, + 0xed, 0x8b, 0x81, 0xfb, 0x5e, 0x38, 0x64, 0x7e, 0xa9, 0xec, 0xfc, 0xd3, 0x02, 0xbb, 0x52, 0x05, + 0x0e, 0x13, 0x16, 0xec, 0xc5, 0xfd, 0xc3, 0x1c, 0x1a, 0x85, 0x59, 0x91, 0xb0, 0x40, 0x4f, 0xff, + 0xe1, 0xe5, 0xea, 0x73, 0xc3, 0x8b, 0x8f, 0xa6, 0xc9, 0xa0, 0xb6, 0x2a, 0xdd, 0xdd, 0x4f, 0xaf, + 0xce, 0x09, 0x9a, 0x2d, 0x96, 0xd9, 0xf9, 0x77, 0x0b, 0x56, 0x1a, 0xe5, 0xee, 0x0d, 0x3e, 0x0d, + 0x36, 0x00, 0x44, 0x16, 0x04, 0x4c, 0x88, 0xe3, 0x2c, 0xd2, 0x31, 0x5e, 0xe1, 0x28, 0xbd, 0x63, + 0x1a, 0x46, 0xac, 0x8f, 0x55, 0xad, 0xed, 0x6b, 0x4a, 0x5d, 0x93, 0xc2, 0x38, 0xe0, 0x71, 0x10, + 0x65, 0xa2, 0xa8, 0x6d, 0x6d, 0xbf, 0xc6, 0x53, 0xc1, 0xcf, 0xd2, 0x94, 0xa7, 0x58, 0xdf, 0xda, + 0x7e, 0x4e, 0xa8, 0x0a, 0xf2, 0x84, 0x1f, 0xa9, 0xca, 0x56, 0xaf, 0x20, 0x3a, 0x21, 0x7c, 0x94, + 0x92, 0x0f, 0x00, 0x62, 0x1e, 0x6b, 0x9e, 0x0d, 0x38, 0x76, 0xdd, 0x8c, 0xfd, 0xc4, 0x88, 0xfc, + 0xca, 0x30, 0xb2, 0xad, 0x8e, 0x36, 0x15, 0xbb, 0xc2, 0xee, 0x36, 0xac, 0x3f, 0xcc, 0xf9, 0x7e, + 0x31, 0x80, 0x1c, 0xc0, 0x92, 0xa8, 0xc6, 0x20, 0x96, 0xc2, 0xee, 0xee, 0x7b, 0xd3, 0x8e, 0xac, + 0x5a, 0xb0, 0xfa, 0x75, 0x3d, 0xe7, 0xd7, 0x16, 0x40, 0x89, 0x47, 0x4d, 0x7a, 0x44, 0xa3, 0xac, + 0x28, 0x03, 0x39, 0x71, 0x6e, 0x4e, 0xd6, 0xf3, 0xaf, 0xf5, 0xe2, 0xfc, 0x9b, 0xbd, 0x4c, 0xfe, + 0xfd, 0xde, 0x82, 0x79, 0xbd, 0x08, 0x53, 0x2b, 0xd5, 0x36, 0xac, 0xea, 0x6d, 0xbf, 0xcb, 0xe3, + 0x7e, 0x28, 0x43, 0x13, 0x5c, 0x67, 0xf8, 0x6a, 0x8e, 0x01, 0xcf, 0x62, 0x89, 0x80, 0xdb, 0x7e, + 0x4e, 0xa8, 0x03, 0xa6, 0xba, 0xfd, 0x0f, 0xc2, 0x61, 0x98, 0x63, 0x6e, 0xfb, 0x67, 0x05, 0x2a, + 0x80, 0x54, 0x28, 0x65, 0xa9, 0x1e, 0x98, 0x87, 0x5e, 0x8d, 0xb7, 0xfb, 0xaf, 0x25, 0x58, 0xd6, + 0x2f, 0x90, 0x43, 0x96, 0x8e, 0xc2, 0x80, 0x11, 0x01, 0xcb, 0x07, 0x4c, 0x56, 0x9f, 0x25, 0xef, + 0x4c, 0x7b, 0xff, 0x60, 0x5f, 0xa1, 0x37, 0xf5, 0x69, 0xe4, 0xec, 0xfc, 0xe2, 0x6f, 0xff, 0xf8, + 0xd5, 0xcc, 0x36, 0xd9, 0xc2, 0x66, 0xcc, 0xe8, 0x56, 0xd9, 0x51, 0x39, 0x35, 0x8f, 0xb5, 0x49, + 0xfe, 0x3d, 0xf1, 0x42, 0xe5, 0x62, 0x02, 0xab, 0xf8, 0x84, 0xbc, 0x94, 0xdb, 0x3b, 0xe8, 0x76, + 0x87, 0xb8, 0x17, 0x75, 0xeb, 0x3d, 0x53, 0x3e, 0x77, 0x2c, 0x32, 0x82, 0x55, 0xf5, 0xf6, 0xab, + 0x18, 0x13, 0xe4, 0x0b, 0xd3, 0x7c, 0x98, 0x8e, 0x4a, 0xcf, 0x3e, 0x4f, 0xec, 0xdc, 0x44, 0x18, + 0xef, 0x93, 0xf7, 0x5e, 0x08, 0x03, 0xa7, 0xfd, 0x73, 0x0b, 0xd6, 0x9a, 0xf3, 0x7e, 0xa9, 0xe7, + 0x5e, 0x53, 0x5c, 0x3e, 0xbe, 0x1d, 0x0f, 0x7d, 0xdf, 0x24, 0x5f, 0x7a, 0xa9, 0x6f, 0x33, 0xf7, + 0x1f, 0xc2, 0xe2, 0x01, 0x93, 0xe6, 0x4d, 0x4c, 0xae, 0xbb, 0x79, 0x9b, 0xca, 0x2d, 0xda, 0x54, + 0xee, 0xfe, 0x30, 0x91, 0xe3, 0x5e, 0xf9, 0x0c, 0xa8, 0x3d, 0xc9, 0x9d, 0x77, 0xd0, 0xe5, 0x3a, + 0x59, 0x2b, 0x5c, 0x96, 0xef, 0xf1, 0xdf, 0x59, 0xea, 0xd6, 0x59, 0x6d, 0xae, 0x90, 0x8d, 0xca, + 0x65, 0x77, 0x4a, 0xd7, 0xa5, 0xb7, 0x7f, 0xb9, 0x43, 0x43, 0x5b, 0x2b, 0x42, 0xa1, 0xf7, 0xe5, + 0x8b, 0x84, 0x82, 0xbe, 0x70, 0x7c, 0xdd, 0xda, 0x46, 0xc4, 0xf5, 0x1e, 0x4e, 0x05, 0xf1, 0xd4, + 0xe6, 0xce, 0x6b, 0x41, 0x9c, 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x5a, 0xb0, 0x58, 0x6d, 0x0b, 0x91, + 0x1b, 0x65, 0x7d, 0x3d, 0xdb, 0x2d, 0xba, 0x2a, 0xb4, 0xb7, 0x11, 0xad, 0xdb, 0xbb, 0x79, 0x11, + 0xb4, 0x54, 0xe1, 0x50, 0x58, 0xff, 0x9c, 0xf7, 0x19, 0x8b, 0xa8, 0xc6, 0xce, 0x60, 0x99, 0x47, + 0x8d, 0x0e, 0xe4, 0x55, 0x41, 0xf5, 0x11, 0xea, 0x83, 0xde, 0xc1, 0x8b, 0xa1, 0x6a, 0xee, 0xc4, + 0x13, 0x4c, 0x7a, 0xa7, 0xe6, 0x69, 0x3b, 0xf1, 0x4e, 0xf1, 0x46, 0xf9, 0xad, 0xed, 0xed, 0x89, + 0x77, 0x2a, 0xe9, 0x60, 0xa2, 0x26, 0xf2, 0x07, 0x0b, 0xba, 0x95, 0xfe, 0x24, 0x79, 0xd7, 0x4c, + 0xe2, 0x6c, 0xd7, 0xf2, 0xaa, 0xe6, 0xb1, 0x87, 0xf3, 0xf8, 0x46, 0xef, 0xce, 0x05, 0xe7, 0x91, + 0xc5, 0x7d, 0xee, 0x9d, 0x16, 0xd7, 0x93, 0x49, 0x11, 0x2b, 0xd5, 0xce, 0x5f, 0x25, 0x56, 0xa6, + 0x34, 0x04, 0x5f, 0x4b, 0xac, 0xa4, 0x0a, 0x87, 0xc2, 0xfa, 0x08, 0xe6, 0x75, 0x9b, 0xec, 0xdc, + 0x8a, 0x54, 0x9e, 0x02, 0x95, 0xf6, 0x9b, 0xf3, 0x36, 0xba, 0x5b, 0x23, 0x2b, 0x85, 0xbb, 0x51, + 0x2e, 0xfc, 0xf6, 0xfe, 0x5f, 0x9e, 0x6f, 0x58, 0x7f, 0x7d, 0xbe, 0x61, 0xfd, 0xfd, 0xf9, 0x86, + 0xf5, 0xa3, 0x0f, 0x2f, 0xfc, 0x87, 0x40, 0xfd, 0xef, 0x87, 0xa3, 0x39, 0x44, 0xf1, 0xc1, 0xff, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x35, 0xff, 0xe4, 0x9e, 0x18, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3496,6 +3567,57 @@ func (m *JobInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AnalysisRunSpecAndStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AnalysisRunSpecAndStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AnalysisRunSpecAndStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Status != nil { + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Spec != nil { + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *AnalysisRunInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3520,6 +3642,18 @@ func (m *AnalysisRunInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SpecAndStatus != nil { + { + size, err := m.SpecAndStatus.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } if len(m.Metrics) > 0 { for iNdEx := len(m.Metrics) - 1; iNdEx >= 0; iNdEx-- { { @@ -4287,6 +4421,26 @@ func (m *JobInfo) Size() (n int) { return n } +func (m *AnalysisRunSpecAndStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Spec != nil { + l = m.Spec.Size() + n += 1 + l + sovRollout(uint64(l)) + } + if m.Status != nil { + l = m.Status.Size() + n += 1 + l + sovRollout(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AnalysisRunInfo) Size() (n int) { if m == nil { return 0 @@ -4338,6 +4492,10 @@ func (m *AnalysisRunInfo) Size() (n int) { n += 1 + l + sovRollout(uint64(l)) } } + if m.SpecAndStatus != nil { + l = m.SpecAndStatus.Size() + n += 1 + l + sovRollout(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7736,6 +7894,129 @@ func (m *JobInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *AnalysisRunSpecAndStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AnalysisRunSpecAndStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AnalysisRunSpecAndStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &v1alpha1.AnalysisRunSpec{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Status == nil { + m.Status = &v1alpha1.AnalysisRunStatus{} + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRollout(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRollout + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AnalysisRunInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8062,6 +8343,42 @@ func (m *AnalysisRunInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpecAndStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpecAndStatus == nil { + m.SpecAndStatus = &AnalysisRunSpecAndStatus{} + } + if err := m.SpecAndStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRollout(dAtA[iNdEx:]) diff --git a/pkg/apiclient/rollout/rollout.proto b/pkg/apiclient/rollout/rollout.proto index 0d21c5d9d6..7949baddd4 100644 --- a/pkg/apiclient/rollout/rollout.proto +++ b/pkg/apiclient/rollout/rollout.proto @@ -148,8 +148,16 @@ message JobInfo { k8s.io.apimachinery.pkg.apis.meta.v1.Time startedAt = 5; } +message AnalysisRunSpecAndStatus { + github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec spec = 1; + github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus status = 2; +} + message AnalysisRunInfo { k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta objectMeta = 1; + /* + field type from 161 -170 will be deprecated in future. + */ string icon = 2; int64 revision = 3; string status = 4; @@ -160,6 +168,8 @@ message AnalysisRunInfo { repeated JobInfo jobs = 9; repeated NonJobInfo nonJobInfo = 10; repeated Metrics metrics = 11; + /* The new API changes should use SpecAndStatus field type. */ + AnalysisRunSpecAndStatus specAndStatus = 12; } message NonJobInfo { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index fb30b4b62e..490c5bcab8 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -598,6 +598,77 @@ }, "title": "AnalysisRunMetadata extra labels to add to the AnalysisRun" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec": { + "type": "object", + "properties": { + "metrics": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Metric" + }, + "title": "Metrics contains the list of metrics to query as part of an analysis run\n+patchMergeKey=name\n+patchStrategy=merge" + }, + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Argument" + }, + "title": "Args are the list of arguments used in this run\n+optional\n+patchMergeKey=name\n+patchStrategy=merge" + }, + "terminate": { + "type": "boolean", + "title": "Terminate is used to prematurely stop the run (e.g. rollout completed and analysis is no longer desired)" + }, + "dryRun": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun" + }, + "title": "DryRun object contains the settings for running the analysis in Dry-Run mode\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + }, + "measurementRetention": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention" + }, + "title": "MeasurementRetention object contains the settings for retaining the number of measurements during the analysis\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + } + }, + "title": "AnalysisRunSpec is the spec for a AnalysisRun resource" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus": { + "type": "object", + "properties": { + "phase": { + "type": "string", + "title": "Phase is the status of the analysis run" + }, + "message": { + "type": "string", + "title": "Message is a message explaining current status" + }, + "metricResults": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricResult" + }, + "title": "MetricResults contains the metrics collected during the run" + }, + "startedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "StartedAt indicates when the analysisRun first started" + }, + "runSummary": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary", + "title": "RunSummary contains the final results from the metric executions" + }, + "dryRunSummary": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary", + "title": "DryRunSummary contains the final results from the metric executions in the dry-run mode" + } + }, + "title": "AnalysisRunStatus is the status for a AnalysisRun resource" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStrategy": { "type": "object", "properties": { @@ -710,6 +781,24 @@ }, "title": "AppMeshVirtualService holds information on the virtual service the rollout needs to modify" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Argument": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the argument" + }, + "value": { + "type": "string", + "title": "Value is the value of the argument\n+optional" + }, + "valueFrom": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ValueFrom", + "title": "ValueFrom is a reference to where a secret is stored. This field is one of the fields with valueFrom\n+optional" + } + }, + "title": "Argument is an argument to an AnalysisRun" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ArgumentValueFrom": { "type": "object", "properties": { @@ -970,6 +1059,105 @@ }, "title": "CanaryStrategy defines parameters for a Replica Based Canary" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetric": { + "type": "object", + "properties": { + "interval": { + "type": "string" + }, + "metricDataQueries": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricDataQuery" + } + } + }, + "title": "CloudWatchMetric defines the cloudwatch query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricDataQuery": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "expression": { + "type": "string" + }, + "label": { + "type": "string" + }, + "metricStat": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStat" + }, + "period": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString" + }, + "returnData": { + "type": "boolean" + } + }, + "title": "CloudWatchMetricDataQuery defines the cloudwatch query" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStat": { + "type": "object", + "properties": { + "metric": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetric" + }, + "period": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString" + }, + "stat": { + "type": "string" + }, + "unit": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetric": { + "type": "object", + "properties": { + "dimensions": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetricDimension" + } + }, + "metricName": { + "type": "string" + }, + "namespace": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetricDimension": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric": { + "type": "object", + "properties": { + "interval": { + "type": "string" + }, + "query": { + "type": "string" + }, + "apiVersion": { + "type": "string", + "description": "ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated." + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun": { "type": "object", "properties": { @@ -989,6 +1177,20 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.GraphiteMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the Graphite server" + }, + "query": { + "type": "string", + "title": "Query is a raw Graphite query to perform" + } + }, + "title": "GraphiteMetric defines the Graphite query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.HeaderRoutingMatch": { "type": "object", "properties": { @@ -1002,6 +1204,20 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.InfluxdbMetric": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile is the name of the secret holding InfluxDB account configuration" + }, + "query": { + "type": "string", + "title": "Query is a raw InfluxDB flux query to perform" + } + }, + "title": "InfluxdbMetric defines the InfluxDB Flux query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.IstioDestinationRule": { "type": "object", "properties": { @@ -1070,30 +1286,322 @@ "description": "A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type." } }, - "title": "IstioVirtualService holds information on the virtual service the rollout needs to modify" - }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MangedRoutes": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } + "title": "IstioVirtualService holds information on the virtual service the rollout needs to modify" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.JobMetric": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/k8s.io.api.batch.v1.JobSpec" + } + }, + "title": "JobMetric defines a job to run which acts as a metric" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaMetric": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "application": { + "type": "string" + }, + "canaryConfigName": { + "type": "string" + }, + "metricsAccountName": { + "type": "string" + }, + "configurationAccountName": { + "type": "string" + }, + "storageAccountName": { + "type": "string" + }, + "threshold": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaThreshold" + }, + "scopes": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaScope" + } + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaScope": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "controlScope": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail" + }, + "experimentScope": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaThreshold": { + "type": "object", + "properties": { + "pass": { + "type": "string", + "format": "int64" + }, + "marginal": { + "type": "string", + "format": "int64" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MangedRoutes": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Measurement": { + "type": "object", + "properties": { + "phase": { + "type": "string", + "title": "Phase is the status of this single measurement" + }, + "message": { + "type": "string", + "title": "Message contains a message describing current condition (e.g. error messages)" + }, + "startedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "StartedAt is the timestamp in which this measurement started to be measured" + }, + "finishedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "FinishedAt is the timestamp in which this measurement completed and value was collected" + }, + "value": { + "type": "string", + "title": "Value is the measured value of the metric" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Metadata stores additional metadata about this metric result, used by the different providers\n(e.g. kayenta run ID, job name)" + }, + "resumeAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "ResumeAt is the timestamp when the analysisRun should try to resume the measurement" + } + }, + "title": "Measurement is a point in time result value of a single metric, and the time it was measured" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention": { + "type": "object", + "properties": { + "metricName": { + "type": "string", + "description": "MetricName is the name of the metric on which this retention policy should be applied." + }, + "limit": { + "type": "integer", + "format": "int32", + "description": "Limit is the maximum number of measurements to be retained for this given metric." + } + }, + "description": "MeasurementRetention defines the settings for retaining the number of measurements during the analysis." + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Metric": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the metric" + }, + "interval": { + "type": "string", + "title": "Interval defines an interval string (e.g. 30s, 5m, 1h) between each measurement.\nIf omitted, will perform a single measurement" + }, + "initialDelay": { + "type": "string", + "title": "InitialDelay how long the AnalysisRun should wait before starting this metric" + }, + "count": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "description": "Count is the number of times to run the measurement. If both interval and count are omitted,\nthe effective count is 1. If only interval is specified, metric runs indefinitely.\nIf count \u003e 1, interval must be specified." + }, + "successCondition": { + "type": "string", + "title": "SuccessCondition is an expression which determines if a measurement is considered successful\nExpression is a goevaluate expression. The keyword `result` is a variable reference to the\nvalue of measurement. Results can be both structured data or primitive.\nExamples:\n result \u003e 10\n (result.requests_made * result.requests_succeeded / 100) \u003e= 90" + }, + "failureCondition": { + "type": "string", + "title": "FailureCondition is an expression which determines if a measurement is considered failed\nIf both success and failure conditions are specified, and the measurement does not fall into\neither condition, the measurement is considered Inconclusive" + }, + "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)" + }, + "inconclusiveLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "InconclusiveLimit is the maximum number of times the measurement is allowed to measure\nInconclusive, before the entire metric is considered Inconclusive (default: 0)" + }, + "consecutiveErrorLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "ConsecutiveErrorLimit is the maximum number of times the measurement is allowed to error in\nsuccession, before the metric is considered error (default: 4)" + }, + "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" + } + }, + "title": "Metric defines a metric in which to perform analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricProvider": { + "type": "object", + "properties": { + "prometheus": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric", + "title": "Prometheus specifies the prometheus metric to query" + }, + "kayenta": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaMetric", + "title": "Kayenta specifies a Kayenta metric" + }, + "web": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetric", + "title": "Web specifies a generic HTTP web metric" + }, + "datadog": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric", + "title": "Datadog specifies a datadog metric to query" + }, + "wavefront": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WavefrontMetric", + "title": "Wavefront specifies the wavefront metric to query" + }, + "newRelic": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NewRelicMetric", + "title": "NewRelic specifies the newrelic metric to query" + }, + "job": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.JobMetric", + "title": "Job specifies the job metric run" + }, + "cloudWatch": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetric", + "title": "CloudWatch specifies the cloudWatch metric to query" + }, + "graphite": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.GraphiteMetric", + "title": "Graphite specifies the Graphite metric to query" + }, + "influxdb": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.InfluxdbMetric", + "title": "Influxdb specifies the influxdb metric to query" + }, + "skywalking": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SkyWalkingMetric", + "title": "SkyWalking specifies the skywalking metric to query" + }, + "plugin": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "byte" + }, + "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nPlugin specifies the hashicorp go-plugin metric to query" + } + }, + "title": "MetricProvider which external system to use to verify the analysis\nOnly one of the fields in this struct should be non-nil" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricResult": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the metric" + }, + "phase": { + "type": "string", + "title": "Phase is the overall aggregate status of the metric" + }, + "measurements": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Measurement" + }, + "title": "Measurements holds the most recent measurements collected for the metric" + }, + "message": { + "type": "string", + "title": "Message contains a message describing current condition (e.g. error messages)" + }, + "count": { + "type": "integer", + "format": "int32", + "title": "Count is the number of times the metric was measured without Error\nThis is equal to the sum of Successful, Failed, Inconclusive" + }, + "successful": { + "type": "integer", + "format": "int32", + "title": "Successful is the number of times the metric was measured Successful" + }, + "failed": { + "type": "integer", + "format": "int32", + "title": "Failed is the number of times the metric was measured Failed" + }, + "inconclusive": { + "type": "integer", + "format": "int32", + "title": "Inconclusive is the number of times the metric was measured Inconclusive" + }, + "error": { + "type": "integer", + "format": "int32", + "title": "Error is the number of times an error was encountered during measurement" + }, + "consecutiveError": { + "type": "integer", + "format": "int32", + "title": "ConsecutiveError is the number of times an error was encountered during measurement in succession\nResets to zero when non-errors are encountered" + }, + "dryRun": { + "type": "boolean", + "title": "DryRun indicates whether this metric is running in a dry-run mode or not" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "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." + } + }, + "title": "MetricResult contain a list of the most recent measurements for a single metric along with\ncounters on how often the measurement" }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention": { + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NewRelicMetric": { "type": "object", "properties": { - "metricName": { + "profile": { "type": "string", - "description": "MetricName is the name of the metric on which this retention policy should be applied." + "title": "Profile is the name of the secret holding NR account configuration" }, - "limit": { - "type": "integer", - "format": "int32", - "description": "Limit is the maximum number of measurements to be retained for this given metric." + "query": { + "type": "string", + "title": "Query is a raw newrelic NRQL query to perform" } }, - "description": "MeasurementRetention defines the settings for retaining the number of measurements during the analysis." + "title": "NewRelicMetric defines the newrelic query to perform canary analysis" }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NginxTrafficRouting": { "type": "object", @@ -1198,6 +1706,50 @@ }, "title": "PreferredDuringSchedulingIgnoredDuringExecution defines the weight of the anti-affinity injection" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth": { + "type": "object", + "properties": { + "sigv4": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config", + "title": "+optional" + } + }, + "title": "PrometheusMetric defines the prometheus query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the prometheus server" + }, + "query": { + "type": "string", + "title": "Query is a raw prometheus query to perform" + }, + "authentication": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth", + "title": "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus\n+optional" + }, + "timeout": { + "type": "string", + "format": "int64", + "title": "Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds.\n+optional" + }, + "insecure": { + "type": "boolean", + "title": "Insecure skips host TLS verification" + }, + "headers": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader" + }, + "title": "Headers are optional HTTP headers to use in the request\n+optional\n+patchMergeKey=key\n+patchStrategy=merge" + } + }, + "title": "PrometheusMetric defines the prometheus query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": { "type": "object", "title": "RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution" @@ -1708,6 +2260,37 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "format": "int32", + "title": "This is equal to the sum of Successful, Failed, Inconclusive" + }, + "successful": { + "type": "integer", + "format": "int32", + "title": "Successful is the number of times the metric was measured Successful" + }, + "failed": { + "type": "integer", + "format": "int32", + "title": "Failed is the number of times the metric was measured Failed" + }, + "inconclusive": { + "type": "integer", + "format": "int32", + "title": "Inconclusive is the number of times the metric was measured Inconclusive" + }, + "error": { + "type": "integer", + "format": "int32", + "title": "Error is the number of times an error was encountered during measurement" + } + }, + "title": "RunSummary contains the final results from the metric executions" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SMITrafficRouting": { "type": "object", "properties": { @@ -1722,6 +2305,40 @@ }, "title": "SMITrafficRouting configuration for TrafficSplit Custom Resource to control traffic routing" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail": { + "type": "object", + "properties": { + "scope": { + "type": "string" + }, + "region": { + "type": "string" + }, + "step": { + "type": "string", + "format": "int64" + }, + "start": { + "type": "string" + }, + "end": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretKeyRef": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the secret" + }, + "key": { + "type": "string", + "description": "Key is the key of the secret to select from." + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetCanaryScale": { "type": "object", "properties": { @@ -1779,6 +2396,37 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Region is the AWS Region to sign the SigV4 Request" + }, + "profile": { + "type": "string", + "title": "Profile is the Credential Profile used to sign the SigV4 Request" + }, + "roleArn": { + "type": "string", + "title": "RoleARN is the IAM role used to sign the SIgV4 Request" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SkyWalkingMetric": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "query": { + "type": "string" + }, + "interval": { + "type": "string" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StickinessConfig": { "type": "object", "properties": { @@ -1882,6 +2530,86 @@ }, "title": "TrafficWeights describes the current status of how traffic has been split" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ValueFrom": { + "type": "object", + "properties": { + "secretKeyRef": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretKeyRef", + "title": "Secret is a reference to where a secret is stored. This field is one of the fields with valueFrom\n+optional" + }, + "fieldRef": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.FieldRef", + "title": "FieldRef is a reference to the fields in metadata which we are referencing. This field is one of the fields with\nvalueFrom\n+optional" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WavefrontMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the wavefront server" + }, + "query": { + "type": "string", + "title": "Query is a raw wavefront query to perform" + } + }, + "title": "WavefrontMetric defines the wavefront query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetric": { + "type": "object", + "properties": { + "method": { + "type": "string", + "title": "Method is the method of the web metric (empty defaults to GET)" + }, + "url": { + "type": "string", + "title": "URL is the address of the web metric" + }, + "headers": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader" + }, + "title": "+patchMergeKey=key\n+patchStrategy=merge\nHeaders are optional HTTP headers to use in the request" + }, + "body": { + "type": "string", + "title": "Body is the body of the web metric (must be POST/PUT)" + }, + "timeoutSeconds": { + "type": "string", + "format": "int64", + "title": "TimeoutSeconds is the timeout for the request in seconds (default: 10)" + }, + "jsonPath": { + "type": "string", + "title": "JSONPath is a JSON Path to use as the result variable (default: \"{$}\")" + }, + "insecure": { + "type": "boolean", + "title": "Insecure skips host TLS verification" + }, + "jsonBody": { + "type": "string", + "format": "byte", + "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nJSONBody is the body of the web metric in a json format (method must be POST/PUT)" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WeightDestination": { "type": "object", "properties": { @@ -1958,6 +2686,131 @@ } } }, + "k8s.io.api.batch.v1.JobSpec": { + "type": "object", + "properties": { + "parallelism": { + "type": "integer", + "format": "int32", + "title": "Specifies the maximum desired number of pods the job should\nrun at any given time. The actual number of pods running in steady state will\nbe less than this number when ((.spec.completions - .status.successful) \u003c .spec.parallelism),\ni.e. when the work left to do is less than max parallelism.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" + }, + "completions": { + "type": "integer", + "format": "int32", + "title": "Specifies the desired number of successfully finished pods the\njob should be run with. Setting to nil means that the success of any\npod signals the success of all pods, and allows parallelism to have any positive\nvalue. Setting to 1 means that parallelism is limited to 1 and the success of that\npod signals the success of the job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" + }, + "activeDeadlineSeconds": { + "type": "string", + "format": "int64", + "title": "Specifies the duration in seconds relative to the startTime that the job\nmay be continuously active before the system tries to terminate it; value\nmust be positive integer. If a Job is suspended (at creation or through an\nupdate), this timer will effectively be stopped and reset when the Job is\nresumed again.\n+optional" + }, + "podFailurePolicy": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicy", + "description": "Specifies the policy of handling failed pods. In particular, it allows to\nspecify the set of actions and conditions which need to be\nsatisfied to take the associated action.\nIf empty, the default behaviour applies - the counter of failed pods,\nrepresented by the jobs's .status.failed field, is incremented and it is\nchecked against the backoffLimit. This field cannot be used in combination\nwith restartPolicy=OnFailure.\n\nThis field is alpha-level. To use this field, you must enable the\n`JobPodFailurePolicy` feature gate (disabled by default).\n+optional" + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "title": "Specifies the number of retries before marking this job failed.\nDefaults to 6\n+optional" + }, + "selector": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", + "title": "A label query over pods that should match the pod count.\nNormally, the system sets this field for you.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n+optional" + }, + "manualSelector": { + "type": "boolean", + "title": "manualSelector controls generation of pod labels and pod selectors.\nLeave `manualSelector` unset unless you are certain what you are doing.\nWhen false or unset, the system pick labels unique to this job\nand appends those labels to the pod template. When true,\nthe user is responsible for picking unique labels and specifying\nthe selector. Failure to pick a unique label may cause this\nand other jobs to not function correctly. However, You may see\n`manualSelector=true` in jobs that were created with the old `extensions/v1beta1`\nAPI.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector\n+optional" + }, + "template": { + "$ref": "#/definitions/k8s.io.api.core.v1.PodTemplateSpec", + "title": "Describes the pod that will be created when executing a job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/" + }, + "ttlSecondsAfterFinished": { + "type": "integer", + "format": "int32", + "title": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished\nexecution (either Complete or Failed). If this field is set,\nttlSecondsAfterFinished after the Job finishes, it is eligible to be\nautomatically deleted. When the Job is being deleted, its lifecycle\nguarantees (e.g. finalizers) will be honored. If this field is unset,\nthe Job won't be automatically deleted. If this field is set to zero,\nthe Job becomes eligible to be deleted immediately after it finishes.\n+optional" + }, + "completionMode": { + "type": "string", + "description": "CompletionMode specifies how Pod completions are tracked. It can be\n`NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have\nbeen .spec.completions successfully completed Pods. Each Pod completion is\nhomologous to each other.\n\n`Indexed` means that the Pods of a\nJob get an associated completion index from 0 to (.spec.completions - 1),\navailable in the annotation batch.kubernetes.io/job-completion-index.\nThe Job is considered complete when there is one successfully completed Pod\nfor each index.\nWhen value is `Indexed`, .spec.completions must be specified and\n`.spec.parallelism` must be less than or equal to 10^5.\nIn addition, The Pod name takes the form\n`$(job-name)-$(index)-$(random-string)`,\nthe Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future.\nIf the Job controller observes a mode that it doesn't recognize, which\nis possible during upgrades due to version skew, the controller\nskips updates for the Job.\n+optional" + }, + "suspend": { + "type": "boolean", + "description": "Suspend specifies whether the Job controller should create Pods or not. If\na Job is created with suspend set to true, no Pods are created by the Job\ncontroller. If a Job is suspended after creation (i.e. the flag goes from\nfalse to true), the Job controller will delete all active Pods associated\nwith this Job. Users must design their workload to gracefully handle this.\nSuspending a Job will reset the StartTime field of the Job, effectively\nresetting the ActiveDeadlineSeconds timer too. Defaults to false.\n\n+optional" + } + }, + "description": "JobSpec describes how the job execution will look like." + }, + "k8s.io.api.batch.v1.PodFailurePolicy": { + "type": "object", + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyRule" + }, + "title": "A list of pod failure policy rules. The rules are evaluated in order.\nOnce a rule matches a Pod failure, the remaining of the rules are ignored.\nWhen no rule matches the Pod failure, the default handling applies - the\ncounter of pod failures is incremented and it is checked against\nthe backoffLimit. At most 20 elements are allowed.\n+listType=atomic" + } + }, + "description": "PodFailurePolicy describes how failed pods influence the backoffLimit." + }, + "k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement": { + "type": "object", + "properties": { + "containerName": { + "type": "string", + "title": "Restricts the check for exit codes to the container with the\nspecified name. When null, the rule applies to all containers.\nWhen specified, it should match one the container or initContainer\nnames in the pod template.\n+optional" + }, + "operator": { + "type": "string", + "description": "Represents the relationship between the container exit code(s) and the\nspecified values. Containers completed with success (exit code 0) are\nexcluded from the requirement check. Possible values are:\n- In: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is in the set of specified values.\n- NotIn: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is not in the set of specified values.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown operator by assuming the requirement is not satisfied." + }, + "values": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + }, + "title": "Specifies the set of values. Each returned container exit code (might be\nmultiple in case of multiple containers) is checked against this set of\nvalues with respect to the operator. The list of values must be ordered\nand must not contain duplicates. Value '0' cannot be used for the In operator.\nAt least one element is required. At most 255 elements are allowed.\n+listType=set" + } + }, + "description": "PodFailurePolicyOnExitCodesRequirement describes the requirement for handling\na failed pod based on its container exit codes. In particular, it lookups the\n.state.terminated.exitCode for each app container and init container status,\nrepresented by the .status.containerStatuses and .status.initContainerStatuses\nfields in the Pod status, respectively. Containers completed with success\n(exit code 0) are excluded from the requirement check." + }, + "k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Specifies the required Pod condition type. To match a pod condition\nit is required that specified type equals the pod condition type." + }, + "status": { + "type": "string", + "description": "Specifies the required Pod condition status. To match a pod condition\nit is required that the specified status equals the pod condition status.\nDefaults to True." + } + }, + "description": "PodFailurePolicyOnPodConditionsPattern describes a pattern for matching\nan actual pod condition type." + }, + "k8s.io.api.batch.v1.PodFailurePolicyRule": { + "type": "object", + "properties": { + "action": { + "type": "string", + "description": "Specifies the action taken on a pod failure when the requirements are satisfied.\nPossible values are:\n- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown action by skipping the rule." + }, + "onExitCodes": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement", + "title": "Represents the requirement on the container exit codes.\n+optional" + }, + "onPodConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern" + }, + "title": "Represents the requirement on the pod conditions. The requirement is represented\nas a list of pod condition patterns. The requirement is satisfied if at\nleast one pattern matches an actual pod condition. At most 20 elements are allowed.\n+listType=atomic" + } + }, + "description": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met.\nOne of OnExitCodes and onPodConditions, but not both, can be used in each rule." + }, "k8s.io.api.core.v1.AWSElasticBlockStoreVolumeSource": { "type": "object", "properties": { @@ -4677,7 +5530,8 @@ "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta" }, "icon": { - "type": "string" + "type": "string", + "description": "field type from 161 -170 will be deprecated in future." }, "revision": { "type": "string", @@ -4719,6 +5573,21 @@ "items": { "$ref": "#/definitions/rollout.Metrics" } + }, + "specAndStatus": { + "$ref": "#/definitions/rollout.AnalysisRunSpecAndStatus", + "description": "The new API changes should use SpecAndStatus field type." + } + } + }, + "rollout.AnalysisRunSpecAndStatus": { + "type": "object", + "properties": { + "spec": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec" + }, + "status": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus" } } }, diff --git a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go index 9c60ccad87..abf19b1273 100644 --- a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go +++ b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go @@ -26,6 +26,12 @@ func getAnalysisRunInfo(ownerUID types.UID, allAnalysisRuns []*v1alpha1.Analysis UID: run.UID, }, } + + arInfo.SpecAndStatus = &rollout.AnalysisRunSpecAndStatus{ + Spec: &run.Spec, + Status: &run.Status, + } + if run.Spec.Metrics != nil { for _, metric := range run.Spec.Metrics { diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 151eb4b672..fe2a8eca01 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -208,6 +208,86 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun */ annotations?: { [key: string]: string; }; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec { + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + metrics?: Array; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + args?: Array; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + terminate?: boolean; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + dryRun?: Array; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + measurementRetention?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + phase?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + message?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + metricResults?: Array; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + startedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + runSummary?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + dryRunSummary?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary; +} /** * * @export @@ -348,6 +428,31 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AppMeshVirt */ routes?: Array; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + value?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + valueFrom?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom; +} /** * * @export @@ -668,204 +773,815 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrat canaryMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + stableMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + scaleDownDelaySeconds?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + scaleDownDelayRevisionLimit?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + abortScaleDownDelaySeconds?: number; + /** + * DynamicStableScale is a traffic routing feature which dynamically scales the stable ReplicaSet to minimize total pods which are running during an update. This is calculated by scaling down the stable as traffic is increased to canary. When disabled (the default behavior) the stable ReplicaSet remains fully scaled to support instantaneous aborts. + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + dynamicStableScale?: boolean; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + pingPong?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + minPodsPerReplicaSet?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ + interval?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ + metricDataQueries?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + id?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + expression?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + label?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + metricStat?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + period?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + returnData?: boolean; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + metric?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + period?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + stat?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + unit?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric { + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + dimensions?: Array; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + metricName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + namespace?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ + value?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + interval?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + query?: string; + /** + * ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + apiVersion?: string; +} +/** + * DryRun defines the settings for running the analysis in Dry-Run mode. + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun { + /** + * Name of the metric which needs to be evaluated in the Dry-Run mode. Wildcard '*' is supported and denotes all the available metrics. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + */ + metricName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + */ + fieldPath?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ + headerName?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ + headerValue?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ + profile?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + canarySubsetName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + stableSubsetName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + virtualService?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + destinationRule?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + virtualServices?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + name?: string; + /** + * A list of HTTP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + routes?: Array; + /** + * A list of TLS/HTTPS routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + tlsRoutes?: Array; + /** + * A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + tcpRoutes?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric { + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1ObjectMeta} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ + metadata?: K8sIoApimachineryPkgApisMetaV1ObjectMeta; + /** + * + * @type {K8sIoApiBatchV1JobSpec} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ + spec?: K8sIoApiBatchV1JobSpec; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + application?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + canaryConfigName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + metricsAccountName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + configurationAccountName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + storageAccountName?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + threshold?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + scopes?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + name?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + controlScope?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + experimentScope?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ + pass?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ + marginal?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + */ + name?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + phase?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + message?: string; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + startedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + finishedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + value?: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + metadata?: { [key: string]: string; }; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + resumeAt?: K8sIoApimachineryPkgApisMetaV1Time; +} +/** + * MeasurementRetention defines the settings for retaining the number of measurements during the analysis. + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention { + /** + * MetricName is the name of the metric on which this retention policy should be applied. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ + metricName?: string; + /** + * Limit is the maximum number of measurements to be retained for this given metric. + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ + limit?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + interval?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + initialDelay?: string; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + count?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + successCondition?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + failureCondition?: string; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + failureLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + inconclusiveLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + consecutiveErrorLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + provider?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider + */ + prometheus?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - stableMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; + kayenta?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - scaleDownDelaySeconds?: number; + web?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - scaleDownDelayRevisionLimit?: number; + datadog?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - abortScaleDownDelaySeconds?: number; + wavefront?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric; /** - * DynamicStableScale is a traffic routing feature which dynamically scales the stable ReplicaSet to minimize total pods which are running during an update. This is calculated by scaling down the stable as traffic is increased to canary. When disabled (the default behavior) the stable ReplicaSet remains fully scaled to support instantaneous aborts. - * @type {boolean} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - dynamicStableScale?: boolean; + newRelic?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - pingPong?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec; + job?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - minPodsPerReplicaSet?: number; -} -/** - * DryRun defines the settings for running the analysis in Dry-Run mode. - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun { + cloudWatch?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric; /** - * Name of the metric which needs to be evaluated in the Dry-Run mode. Wildcard '*' is supported and denotes all the available metrics. - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - metricName?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef { + graphite?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - fieldPath?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch { + influxdb?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - headerName?: string; + skywalking?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - headerValue?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + plugin?: { [key: string]: string; }; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ name?: string; /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - canarySubsetName?: string; + phase?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult + */ + measurements?: Array; /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - stableSubsetName?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting { + message?: string; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - virtualService?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService; + count?: number; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - destinationRule?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule; + successful?: number; /** * - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - virtualServices?: Array; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService { + failed?: number; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - name?: string; + inconclusive?: number; /** - * A list of HTTP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - routes?: Array; + error?: number; /** - * A list of TLS/HTTPS routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - tlsRoutes?: Array; + consecutiveError?: number; /** - * A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - tcpRoutes?: Array; + dryRun?: boolean; + /** + * Metadata stores additional metadata about this metric. It is used by different providers to store 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. + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult + */ + metadata?: { [key: string]: string; }; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ - name?: string; -} -/** - * MeasurementRetention defines the settings for retaining the number of measurements during the analysis. - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention { + profile?: string; /** - * MetricName is the name of the metric on which this retention policy should be applied. + * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention - */ - metricName?: string; - /** - * Limit is the maximum number of measurements to be retained for this given metric. - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ - limit?: number; + query?: string; } /** * @@ -993,6 +1709,62 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PreferredDu */ weight?: number; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth + */ + sigv4?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + query?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + authentication?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + timeout?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + insecure?: boolean; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + headers?: Array; +} /** * * @export @@ -1642,46 +2414,139 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutTraf /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + method?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + path?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + /** + * + * @type {{ [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + headers?: { [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary { + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + count?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + successful?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + failed?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + inconclusive?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + error?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ + rootService?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ + trafficSplitName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail { /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - method?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + scope?: string; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - path?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + region?: string; /** * - * @type {{ [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - headers?: { [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }; + step?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail + */ + start?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail + */ + end?: string; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ - rootService?: string; + name?: string; /** - * + * Key is the key of the secret to select from. * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ - trafficSplitName?: string; + key?: string; } /** * @@ -1752,6 +2617,56 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SetMirrorRo */ percentage?: number; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + profile?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + roleArn?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + query?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + interval?: string; +} /** * * @export @@ -1885,6 +2800,118 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TrafficWeig */ verified?: boolean; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ + secretKeyRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ + fieldRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + method?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + url?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + headers?: Array; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + body?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + timeoutSeconds?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + jsonPath?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + insecure?: boolean; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + jsonBody?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ + key?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ + value?: string; +} /** * * @export @@ -1997,6 +3024,161 @@ export interface GrpcGatewayRuntimeStreamError { */ details?: Array; } +/** + * JobSpec describes how the job execution will look like. + * @export + * @interface K8sIoApiBatchV1JobSpec + */ +export interface K8sIoApiBatchV1JobSpec { + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + parallelism?: number; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + completions?: number; + /** + * + * @type {string} + * @memberof K8sIoApiBatchV1JobSpec + */ + activeDeadlineSeconds?: string; + /** + * + * @type {K8sIoApiBatchV1PodFailurePolicy} + * @memberof K8sIoApiBatchV1JobSpec + */ + podFailurePolicy?: K8sIoApiBatchV1PodFailurePolicy; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + backoffLimit?: number; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1LabelSelector} + * @memberof K8sIoApiBatchV1JobSpec + */ + selector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; + /** + * + * @type {boolean} + * @memberof K8sIoApiBatchV1JobSpec + */ + manualSelector?: boolean; + /** + * + * @type {K8sIoApiCoreV1PodTemplateSpec} + * @memberof K8sIoApiBatchV1JobSpec + */ + template?: K8sIoApiCoreV1PodTemplateSpec; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + ttlSecondsAfterFinished?: number; + /** + * CompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. `NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. `Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job. +optional + * @type {string} + * @memberof K8sIoApiBatchV1JobSpec + */ + completionMode?: string; + /** + * Suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false. +optional + * @type {boolean} + * @memberof K8sIoApiBatchV1JobSpec + */ + suspend?: boolean; +} +/** + * PodFailurePolicy describes how failed pods influence the backoffLimit. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicy + */ +export interface K8sIoApiBatchV1PodFailurePolicy { + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicy + */ + rules?: Array; +} +/** + * PodFailurePolicyOnExitCodesRequirement describes the requirement for handling a failed pod based on its container exit codes. In particular, it lookups the .state.terminated.exitCode for each app container and init container status, represented by the .status.containerStatuses and .status.initContainerStatuses fields in the Pod status, respectively. Containers completed with success (exit code 0) are excluded from the requirement check. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ +export interface K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement { + /** + * + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + containerName?: string; + /** + * Represents the relationship between the container exit code(s) and the specified values. Containers completed with success (exit code 0) are excluded from the requirement check. Possible values are: - In: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is in the set of specified values. - NotIn: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is not in the set of specified values. Additional values are considered to be added in the future. Clients should react to an unknown operator by assuming the requirement is not satisfied. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + operator?: string; + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + values?: Array; +} +/** + * PodFailurePolicyOnPodConditionsPattern describes a pattern for matching an actual pod condition type. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ +export interface K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern { + /** + * Specifies the required Pod condition type. To match a pod condition it is required that specified type equals the pod condition type. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ + type?: string; + /** + * Specifies the required Pod condition status. To match a pod condition it is required that the specified status equals the pod condition status. Defaults to True. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ + status?: string; +} +/** + * PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of OnExitCodes and onPodConditions, but not both, can be used in each rule. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyRule + */ +export interface K8sIoApiBatchV1PodFailurePolicyRule { + /** + * Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are: - FailJob: indicates that the pod's job is marked as Failed and all running pods are terminated. - Ignore: indicates that the counter towards the .backoffLimit is not incremented and a replacement pod is created. - Count: indicates that the pod is handled in the default way - the counter towards the .backoffLimit is incremented. Additional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + action?: string; + /** + * + * @type {K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + onExitCodes?: K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement; + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + onPodConditions?: Array; +} /** * Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling. * @export @@ -5503,7 +6685,7 @@ export interface RolloutAnalysisRunInfo { */ objectMeta?: K8sIoApimachineryPkgApisMetaV1ObjectMeta; /** - * + * field type from 161 -170 will be deprecated in future. * @type {string} * @memberof RolloutAnalysisRunInfo */ @@ -5562,6 +6744,31 @@ export interface RolloutAnalysisRunInfo { * @memberof RolloutAnalysisRunInfo */ metrics?: Array; + /** + * + * @type {RolloutAnalysisRunSpecAndStatus} + * @memberof RolloutAnalysisRunInfo + */ + specAndStatus?: RolloutAnalysisRunSpecAndStatus; +} +/** + * + * @export + * @interface RolloutAnalysisRunSpecAndStatus + */ +export interface RolloutAnalysisRunSpecAndStatus { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec} + * @memberof RolloutAnalysisRunSpecAndStatus + */ + spec?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus} + * @memberof RolloutAnalysisRunSpecAndStatus + */ + status?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus; } /** * From 487ccfd77443d1d16a30bf637bfcdaa2fa9afabb Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 25 Oct 2023 09:13:06 -0500 Subject: [PATCH 147/159] fix dependency mismatch breaking build due to cherry pick conflict Signed-off-by: zachaller --- go.mod | 22 +++++++++++----------- go.sum | 55 ++++++++++++++++++++++--------------------------------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index 955e644fff..2858c544a0 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.21.1 - github.com/aws/aws-sdk-go-v2/config v1.18.33 + github.com/aws/aws-sdk-go-v2 v1.21.2 + github.com/aws/aws-sdk-go-v2/config v1.19.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 github.com/blang/semver v3.5.1+incompatible @@ -82,16 +82,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.41 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 6265f6e972..674e220433 100644 --- a/go.sum +++ b/go.sum @@ -105,51 +105,40 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= -github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.18.33 h1:JKcw5SFxFW/rpM4mOPjv0VQ11E2kxW13F3exWOy7VZU= -github.com/aws/aws-sdk-go-v2/config v1.18.33/go.mod h1:hXO/l9pgY3K5oZJldamP0pbZHdPqqk+4/maa7DSD3cA= -github.com/aws/aws-sdk-go-v2/credentials v1.13.32/go.mod h1:lL8U3v/Y79YRG69WlAho0OHIKUXCyFvSXaIvfo81sls= -github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9rmEzEhbZFh9JQW/Bg= -github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8/go.mod h1:ce7BgLQfYr5hQFdy67oX2svto3ufGtm6oBvmsHScI1Q= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= +github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/config v1.19.1 h1:oe3vqcGftyk40icfLymhhhNysAwk0NfiwkDi2GTPMXs= +github.com/aws/aws-sdk-go-v2/config v1.19.1/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32/go.mod h1:4jwAWKEkCR0anWk5+1RbfSg1R5Gzld7NLiuaq5bTR/Y= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.2/go.mod h1:ju+nNXUunfIFamXUIZQiICjnO/TPlOmWcYhZcSy7xaE= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 h1:vuGK1vHNP9zx0PfOrtPumbwR2af0ATQ1Z2H6p75AgRQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2/go.mod h1:ubDBBaDFs1GHijSOTi8ljppML15GLG0HxhILtbjNNYQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.2/go.mod h1:FQ/DQcOfESELfJi5ED+IPPAjI5xC6nxtSolVVB773jM= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From bd1565c2045472236320b0fe7768ddb36dc6a0ac Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 25 Oct 2023 09:14:55 -0500 Subject: [PATCH 148/159] make codegen Signed-off-by: zachaller --- .../rollouts/v1alpha1/openapi_generated.go | 148 ++++++++++++++---- 1 file changed, 117 insertions(+), 31 deletions(-) diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index f91a313c76..01b39597e2 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -52,6 +52,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AppMeshVirtualService": schema_pkg_apis_rollouts_v1alpha1_AppMeshVirtualService(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument": schema_pkg_apis_rollouts_v1alpha1_Argument(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ArgumentValueFrom": schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication": schema_pkg_apis_rollouts_v1alpha1_Authentication(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef": schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStatus": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStatus(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStrategy": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStrategy(ref), @@ -93,12 +94,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MetricResult": schema_pkg_apis_rollouts_v1alpha1_MetricResult(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NewRelicMetric": schema_pkg_apis_rollouts_v1alpha1_NewRelicMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NginxTrafficRouting": schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config": schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ObjectRef": schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PauseCondition": schema_pkg_apis_rollouts_v1alpha1_PauseCondition(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PingPongSpec": schema_pkg_apis_rollouts_v1alpha1_PingPongSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PodTemplateMetadata": schema_pkg_apis_rollouts_v1alpha1_PodTemplateMetadata(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExecution(ref), - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth": schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusMetric": schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_RequiredDuringSchedulingIgnoredDuringExecution(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RollbackWindowSpec": schema_pkg_apis_rollouts_v1alpha1_RollbackWindowSpec(ref), @@ -1099,6 +1100,35 @@ func schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref common.ReferenceCal } } +func schema_pkg_apis_rollouts_v1alpha1_Authentication(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Authentication method", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "sigv4": { + SchemaProps: spec.SchemaProps{ + Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), + }, + }, + "oauth2": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 config", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, + } +} + func schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1805,16 +1835,39 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac Type: []string{"object"}, Properties: map[string]spec.Schema{ "interval": { + SchemaProps: spec.SchemaProps{ + Description: "Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric.", + Type: []string{"string"}, + Format: "", + }, + }, + "query": { SchemaProps: spec.SchemaProps{ Type: []string{"string"}, Format: "", }, }, - "query": { + "queries": { SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", + Description: "Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "formula": { + SchemaProps: spec.SchemaProps{ + Description: "Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2", + Type: []string{"string"}, + Format: "", }, }, "apiVersion": { @@ -1825,7 +1878,6 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac }, }, }, - Required: []string{"query"}, }, }, } @@ -3242,6 +3294,54 @@ func schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref common.ReferenceC } } +func schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "tokenUrl": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 provider token URL", + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 client ID", + Type: []string{"string"}, + Format: "", + }, + }, + "clientSecret": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 client secret", + Type: []string{"string"}, + Format: "", + }, + }, + "scopes": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 scopes", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3402,27 +3502,6 @@ func schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExe } } -func schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PrometheusMetric defines the prometheus query to perform canary analysis", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "sigv4": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, - } -} - func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3446,9 +3525,9 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, "authentication": { SchemaProps: spec.SchemaProps{ - Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", + Description: "Authentication details", Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"), + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), }, }, "timeout": { @@ -3489,7 +3568,7 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } @@ -5458,12 +5537,19 @@ func schema_pkg_apis_rollouts_v1alpha1_WebMetric(ref common.ReferenceCallback) c Format: "byte", }, }, + "authentication": { + SchemaProps: spec.SchemaProps{ + Description: "Authentication details", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), + }, + }, }, Required: []string{"url"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } From e47e130299b05fd980fa85470bca9d3a71c57ed0 Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Fri, 29 Sep 2023 15:01:46 -0700 Subject: [PATCH 149/159] fix: prevent hot loop when fully promoted rollout is aborted (#3064) * fix: prevent hot loop when fully promoted rollout is aborted Signed-off-by: Jesse Suen * test: change expectations of abort tests Signed-off-by: Jesse Suen --------- Signed-off-by: Jesse Suen --- experiments/controller_test.go | 6 ++-- experiments/experiment_test.go | 2 +- experiments/replicaset_test.go | 4 +-- rollout/analysis_test.go | 64 +++++++++++++++++----------------- rollout/bluegreen_test.go | 16 ++++----- rollout/canary_test.go | 51 +++++++++++++-------------- rollout/controller.go | 5 +++ rollout/controller_test.go | 4 +-- rollout/experiment_test.go | 14 ++++---- rollout/service_test.go | 4 +-- test/e2e/istio_test.go | 4 +-- 11 files changed, 89 insertions(+), 85 deletions(-) diff --git a/experiments/controller_test.go b/experiments/controller_test.go index 1e7eb14f13..9babd92d21 100644 --- a/experiments/controller_test.go +++ b/experiments/controller_test.go @@ -805,7 +805,7 @@ func TestAddInvalidSpec(t *testing.T) { "status":{ } }`, nil, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestKeepInvalidSpec(t *testing.T) { @@ -852,7 +852,7 @@ func TestUpdateInvalidSpec(t *testing.T) { "status":{ } }`, nil, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } @@ -892,7 +892,7 @@ func TestRemoveInvalidSpec(t *testing.T) { "status":{ } }`, templateStatus, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestRun(t *testing.T) { diff --git a/experiments/experiment_test.go b/experiments/experiment_test.go index 0853a3b361..ae8df335af 100644 --- a/experiments/experiment_test.go +++ b/experiments/experiment_test.go @@ -282,7 +282,7 @@ func TestSuccessAfterDurationPasses(t *testing.T) { "phase": "Successful" } }`, templateStatuses, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } // TestDontRequeueWithoutDuration verifies we don't requeue if an experiment does not have diff --git a/experiments/replicaset_test.go b/experiments/replicaset_test.go index e4d1cdf231..030414f2df 100644 --- a/experiments/replicaset_test.go +++ b/experiments/replicaset_test.go @@ -42,7 +42,7 @@ func TestCreateMultipleRS(t *testing.T) { "status":{ } }`, templateStatus, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCreateMissingRS(t *testing.T) { @@ -72,7 +72,7 @@ func TestCreateMissingRS(t *testing.T) { generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, now()), generateTemplatesStatus("baz", 0, 0, v1alpha1.TemplateStatusProgressing, now()), } - assert.Equal(t, calculatePatch(e, expectedPatch, templateStatuses, cond), patch) + assert.JSONEq(t, calculatePatch(e, expectedPatch, templateStatuses, cond), patch) } func TestTemplateHasMultipleRS(t *testing.T) { diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index f0313d7ea0..de9a5e1db3 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -180,7 +180,7 @@ func TestCreateBackgroundAnalysisRun(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestCreateBackgroundAnalysisRunWithTemplates(t *testing.T) { @@ -241,7 +241,7 @@ func TestCreateBackgroundAnalysisRunWithTemplates(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestCreateBackgroundAnalysisRunWithClusterTemplates(t *testing.T) { @@ -303,7 +303,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplates(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestInvalidSpecMissingClusterTemplatesBackgroundAnalysis(t *testing.T) { @@ -339,7 +339,7 @@ func TestInvalidSpecMissingClusterTemplatesBackgroundAnalysis(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T) { @@ -416,7 +416,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } // TestCreateAnalysisRunWithCollision ensures we will create an new analysis run with a new name @@ -487,7 +487,7 @@ func TestCreateAnalysisRunWithCollision(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedAR.Name)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedAR.Name)), patch) } // TestCreateAnalysisRunWithCollisionAndSemanticEquality will ensure we do not create an extra @@ -550,7 +550,7 @@ func TestCreateAnalysisRunWithCollisionAndSemanticEquality(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ar.Name)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ar.Name)), patch) } func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { @@ -611,7 +611,7 @@ func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { @@ -653,7 +653,7 @@ func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestFailCreateBackgroundAnalysisRunIfInvalidTemplateRef(t *testing.T) { @@ -698,7 +698,7 @@ func TestFailCreateBackgroundAnalysisRunIfInvalidTemplateRef(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { @@ -745,7 +745,7 @@ func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestDoNothingWithAnalysisRunsWhileBackgroundAnalysisRunRunning(t *testing.T) { @@ -798,7 +798,7 @@ func TestDoNothingWithAnalysisRunsWhileBackgroundAnalysisRunRunning(t *testing.T patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDoNothingWhileStepBasedAnalysisRunRunning(t *testing.T) { @@ -847,7 +847,7 @@ func TestDoNothingWhileStepBasedAnalysisRunRunning(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestCancelOlderAnalysisRuns(t *testing.T) { @@ -915,7 +915,7 @@ func TestCancelOlderAnalysisRuns(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestDeleteAnalysisRunsWithNoMatchingRS(t *testing.T) { @@ -971,7 +971,7 @@ func TestDeleteAnalysisRunsWithNoMatchingRS(t *testing.T) { deletedAr := f.getDeletedAnalysisRun(deletedIndex) assert.Equal(t, deletedAr, arWithDiffPodHash.Name) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDeleteAnalysisRunsAfterRSDelete(t *testing.T) { @@ -1083,7 +1083,7 @@ func TestIncrementStepAfterSuccessfulAnalysisRun(t *testing.T) { }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition)), patch) } func TestPausedOnInconclusiveBackgroundAnalysisRun(t *testing.T) { @@ -1152,7 +1152,7 @@ func TestPausedOnInconclusiveBackgroundAnalysisRun(t *testing.T) { }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) } func TestPausedStepAfterInconclusiveAnalysisRun(t *testing.T) { @@ -1215,7 +1215,7 @@ func TestPausedStepAfterInconclusiveAnalysisRun(t *testing.T) { } }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) } func TestErrorConditionAfterErrorAnalysisRunStep(t *testing.T) { @@ -1282,7 +1282,7 @@ func TestErrorConditionAfterErrorAnalysisRunStep(t *testing.T) { errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) + ": " + ar.Status.Message condition := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, errmsg, false) expectedPatch = fmt.Sprintf(expectedPatch, condition, now, errmsg) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestErrorConditionAfterErrorAnalysisRunBackground(t *testing.T) { @@ -1358,7 +1358,7 @@ func TestErrorConditionAfterErrorAnalysisRunBackground(t *testing.T) { condition := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, now, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, now, errmsg)), patch) } func TestCancelAnalysisRunsWhenAborted(t *testing.T) { @@ -1419,7 +1419,7 @@ func TestCancelAnalysisRunsWhenAborted(t *testing.T) { }` errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, now, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, now, errmsg)), patch) } func TestCancelBackgroundAnalysisRunWhenRolloutIsCompleted(t *testing.T) { @@ -1521,7 +1521,7 @@ func TestDoNotCreateBackgroundAnalysisRunAfterInconclusiveRun(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDoNotCreateBackgroundAnalysisRunOnNewCanaryRollout(t *testing.T) { @@ -1647,7 +1647,7 @@ func TestCreatePrePromotionAnalysisRun(t *testing.T) { } } }`, ar.Name) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } // TestDoNotCreatePrePromotionAnalysisProgressedRollout ensures a pre-promotion analysis is not created after a Rollout @@ -1771,7 +1771,7 @@ func TestDoNotCreatePrePromotionAnalysisRunOnNotReadyReplicaSet(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchRolloutIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestRolloutPrePromotionAnalysisBecomesInconclusive(t *testing.T) { @@ -1841,7 +1841,7 @@ func TestRolloutPrePromotionAnalysisBecomesInconclusive(t *testing.T) { } } }`, now, now) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisSwitchServiceAfterSuccess(t *testing.T) { @@ -1905,7 +1905,7 @@ func TestRolloutPrePromotionAnalysisSwitchServiceAfterSuccess(t *testing.T) { "message": null } }`, rs2PodHash, rs2PodHash, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisHonorAutoPromotionSeconds(t *testing.T) { @@ -1971,7 +1971,7 @@ func TestRolloutPrePromotionAnalysisHonorAutoPromotionSeconds(t *testing.T) { "message": null } }`, rs2PodHash, rs2PodHash, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisDoNothingOnInconclusiveAnalysis(t *testing.T) { @@ -2096,7 +2096,7 @@ func TestAbortRolloutOnErrorPrePromotionAnalysis(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) progressingFalseAborted, _ := newProgressingCondition(conditions.RolloutAbortedReason, r2, "") newConditions := updateConditionsPatch(*r2, progressingFalseAborted) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } func TestCreatePostPromotionAnalysisRun(t *testing.T) { @@ -2143,7 +2143,7 @@ func TestCreatePostPromotionAnalysisRun(t *testing.T) { } } }`, ar.Name) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPostPromotionAnalysisSuccess(t *testing.T) { @@ -2199,7 +2199,7 @@ func TestRolloutPostPromotionAnalysisSuccess(t *testing.T) { "message": null } }`, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } // TestPostPromotionAnalysisRunHandleInconclusive ensures that the Rollout does not scale down a old ReplicaSet if @@ -2264,7 +2264,7 @@ func TestPostPromotionAnalysisRunHandleInconclusive(t *testing.T) { "message": "InconclusiveAnalysisRun" } }`) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { @@ -2334,7 +2334,7 @@ func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) progressingFalseAborted, _ := newProgressingCondition(conditions.RolloutAbortedReason, r2, "") newConditions := updateConditionsPatch(*r2, progressingFalseAborted) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } func TestCreateAnalysisRunWithCustomAnalysisRunMetadataAndROCopyLabels(t *testing.T) { diff --git a/rollout/bluegreen_test.go b/rollout/bluegreen_test.go index 42b521a565..cff894e8ca 100644 --- a/rollout/bluegreen_test.go +++ b/rollout/bluegreen_test.go @@ -290,7 +290,7 @@ func TestBlueGreenHandlePause(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchRolloutIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("AddPause", func(t *testing.T) { f := newFixture(t) @@ -334,7 +334,7 @@ func TestBlueGreenHandlePause(t *testing.T) { } }` now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, v1alpha1.PauseReasonBlueGreenPause, now)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, v1alpha1.PauseReasonBlueGreenPause, now)), patch) }) @@ -376,7 +376,7 @@ func TestBlueGreenHandlePause(t *testing.T) { } }` addedConditions := generateConditionsPatchWithPause(true, conditions.RolloutPausedReason, rs2, true, "", true, false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, addedConditions)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, addedConditions)), patch) }) t.Run("NoActionsAfterPausing", func(t *testing.T) { @@ -417,7 +417,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("NoActionsAfterPausedOnInconclusiveRun", func(t *testing.T) { @@ -468,7 +468,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("NoAutoPromoteBeforeDelayTimePasses", func(t *testing.T) { @@ -509,7 +509,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("AutoPromoteAfterDelayTimePasses", func(t *testing.T) { @@ -813,7 +813,7 @@ func TestBlueGreenHandlePause(t *testing.T) { "conditions": %s } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedUnpausePatch, unpauseConditions)), unpausePatch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedUnpausePatch, unpauseConditions)), unpausePatch) generatedConditions := generateConditionsPatchWithCompleted(true, conditions.ReplicaSetUpdatedReason, rs2, true, "", true) expected2ndPatchWithoutSubs := `{ @@ -1453,7 +1453,7 @@ func TestBlueGreenAbort(t *testing.T) { } }`, rs1PodHash, expectedConditions, rs1PodHash, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestBlueGreenHandlePauseAutoPromoteWithConditions(t *testing.T) { diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 9f66cf1078..1d8af7d80e 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -182,7 +182,7 @@ func TestCanaryRolloutEnterPauseState(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) expectedPatchWithoutObservedGen := fmt.Sprintf(expectedPatchTemplate, v1alpha1.PauseReasonCanaryPauseStep, now, conditions, v1alpha1.PauseReasonCanaryPauseStep) expectedPatch := calculatePatch(r2, expectedPatchWithoutObservedGen) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCanaryRolloutNoProgressWhilePaused(t *testing.T) { @@ -257,7 +257,7 @@ func TestCanaryRolloutUpdatePauseConditionWhilePaused(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(addPausedConditionPatch) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestCanaryRolloutResetProgressDeadlineOnRetry(t *testing.T) { @@ -300,7 +300,7 @@ func TestCanaryRolloutResetProgressDeadlineOnRetry(t *testing.T) { "message": "more replicas need to be updated" } }`, retryCondition) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutIncrementStepAfterUnPaused(t *testing.T) { @@ -342,7 +342,7 @@ func TestCanaryRolloutIncrementStepAfterUnPaused(t *testing.T) { }` generatedConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) expectedPatch := calculatePatch(r2, fmt.Sprintf(expectedPatchTemplate, generatedConditions)) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCanaryRolloutUpdateStatusWhenAtEndOfSteps(t *testing.T) { @@ -383,7 +383,7 @@ func TestCanaryRolloutUpdateStatusWhenAtEndOfSteps(t *testing.T) { }` expectedPatch := fmt.Sprintf(expectedPatchWithoutStableRS, expectedStableRS, generateConditionsPatchWithCompleted(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", true)) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestResetCurrentStepIndexOnStepChange(t *testing.T) { @@ -426,7 +426,7 @@ func TestResetCurrentStepIndexOnStepChange(t *testing.T) { }` newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, expectedCurrentStepHash, newConditions) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { @@ -467,7 +467,7 @@ func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, newConditions) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutCreateFirstReplicasetNoSteps(t *testing.T) { @@ -505,7 +505,7 @@ func TestCanaryRolloutCreateFirstReplicasetNoSteps(t *testing.T) { newConditions := generateConditionsPatchWithCompleted(false, conditions.ReplicaSetUpdatedReason, rs, false, "", true) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, newConditions)), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, newConditions)), patch) } func TestCanaryRolloutCreateFirstReplicasetWithSteps(t *testing.T) { @@ -545,7 +545,7 @@ func TestCanaryRolloutCreateFirstReplicasetWithSteps(t *testing.T) { }` expectedPatch := fmt.Sprintf(expectedPatchWithSub, generateConditionsPatchWithCompleted(false, conditions.ReplicaSetUpdatedReason, rs, false, "", true)) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestCanaryRolloutCreateNewReplicaWithCorrectWeight(t *testing.T) { @@ -843,7 +843,7 @@ func TestRollBackToStable(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs1, false, "", true) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, hash.ComputePodTemplateHash(&r2.Spec.Template, r2.Status.CollisionCount), newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { @@ -935,7 +935,7 @@ func TestGradualShiftToNewStable(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRollBackToStableAndStepChange(t *testing.T) { @@ -983,7 +983,7 @@ func TestRollBackToStableAndStepChange(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs1, false, "", true) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, newPodHash, newStepHash, newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutIncrementStepIfSetWeightsAreCorrect(t *testing.T) { @@ -1019,7 +1019,7 @@ func TestCanaryRolloutIncrementStepIfSetWeightsAreCorrect(t *testing.T) { } }` newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs3, false, "", false) - assert.Equal(t, calculatePatch(r3, fmt.Sprintf(expectedPatch, newConditions)), patch) + assert.JSONEq(t, calculatePatch(r3, fmt.Sprintf(expectedPatch, newConditions)), patch) } func TestSyncRolloutWaitAddToQueue(t *testing.T) { @@ -1171,7 +1171,7 @@ func TestSyncRolloutWaitIncrementStepIndex(t *testing.T) { "currentStepIndex":2 } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutStatusHPAStatusFields(t *testing.T) { @@ -1215,7 +1215,7 @@ func TestCanaryRolloutStatusHPAStatusFields(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRolloutWithoutConditions(index) - assert.Equal(t, calculatePatch(r2, expectedPatchWithSub), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatchWithSub), patch) } func TestCanaryRolloutWithCanaryService(t *testing.T) { @@ -1656,7 +1656,7 @@ func TestCanaryRolloutScaleWhilePaused(t *testing.T) { patch := f.getPatchedRolloutWithoutConditions(patchIndex) expectedPatch := calculatePatch(r2, OnlyObservedGenerationPatch) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestResumeRolloutAfterPauseDuration(t *testing.T) { @@ -1756,7 +1756,7 @@ func TestNoResumeAfterPauseDurationIfUserPaused(t *testing.T) { "message": "manually paused" } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestHandleNilNewRSOnScaleAndImageChange(t *testing.T) { @@ -1803,7 +1803,7 @@ func TestHandleNilNewRSOnScaleAndImageChange(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestHandleCanaryAbort(t *testing.T) { @@ -1850,10 +1850,10 @@ func TestHandleCanaryAbort(t *testing.T) { }` errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) newConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) }) - t.Run("Do not reset currentStepCount if newRS is stableRS", func(t *testing.T) { + t.Run("Do not reset currentStepCount and reset abort if newRS is stableRS", func(t *testing.T) { f := newFixture(t) defer f.Close() @@ -1881,13 +1881,12 @@ func TestHandleCanaryAbort(t *testing.T) { patch := f.getPatchedRollout(patchIndex) expectedPatch := `{ "status":{ - "conditions": %s, - "phase": "Degraded", - "message": "%s: %s" + "abort": null, + "abortedAt": null, + "conditions": %s } }` - errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 1) - newConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r1, false, "", true) - assert.Equal(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) + newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r1, false, "", true) + assert.JSONEq(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions)), patch) }) } diff --git a/rollout/controller.go b/rollout/controller.go index 899bc25516..75601661ca 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -56,6 +56,7 @@ import ( logutil "github.com/argoproj/argo-rollouts/utils/log" "github.com/argoproj/argo-rollouts/utils/record" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" + rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" serviceutil "github.com/argoproj/argo-rollouts/utils/service" timeutil "github.com/argoproj/argo-rollouts/utils/time" unstructuredutil "github.com/argoproj/argo-rollouts/utils/unstructured" @@ -521,6 +522,10 @@ func (c *Controller) newRolloutContext(rollout *v1alpha1.Rollout) (*rolloutConte }, reconcilerBase: c.reconcilerBase, } + if rolloututil.IsFullyPromoted(rollout) && roCtx.pauseContext.IsAborted() { + logCtx.Warnf("Removing abort condition from fully promoted rollout") + roCtx.pauseContext.RemoveAbort() + } // carry over existing recorded weights roCtx.newStatus.Canary.Weights = rollout.Status.Canary.Weights return &roCtx, nil diff --git a/rollout/controller_test.go b/rollout/controller_test.go index d2c78d70c1..a893353053 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -1346,7 +1346,7 @@ func TestSwitchInvalidSpecMessage(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } // TestPodTemplateHashEquivalence verifies the hash is computed consistently when there are slight @@ -1549,7 +1549,7 @@ func TestSwitchBlueGreenToCanary(t *testing.T) { "selector": "foo=bar" } }`, addedConditions, conditions.ComputeStepHash(r)) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func newInvalidSpecCondition(reason string, resourceObj runtime.Object, optionalMessage string) (v1alpha1.RolloutCondition, string) { diff --git a/rollout/experiment_test.go b/rollout/experiment_test.go index bcd10cad92..233dd16ca5 100644 --- a/rollout/experiment_test.go +++ b/rollout/experiment_test.go @@ -69,7 +69,7 @@ func TestRolloutCreateExperiment(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestRolloutCreateClusterTemplateExperiment(t *testing.T) { @@ -126,7 +126,7 @@ func TestRolloutCreateClusterTemplateExperiment(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestCreateExperimentWithCollision(t *testing.T) { @@ -178,7 +178,7 @@ func TestCreateExperimentWithCollision(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, createdEx.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, createdEx.Name, conds)), patch) } func TestCreateExperimentWithCollisionAndSemanticEquality(t *testing.T) { @@ -229,7 +229,7 @@ func TestCreateExperimentWithCollisionAndSemanticEquality(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestRolloutExperimentProcessingDoNothing(t *testing.T) { @@ -267,7 +267,7 @@ func TestRolloutExperimentProcessingDoNothing(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } @@ -314,7 +314,7 @@ func TestAbortRolloutAfterFailedExperiment(t *testing.T) { }` now := timeutil.Now().UTC().Format(time.RFC3339) generatedConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, generatedConditions, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2))), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, generatedConditions, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2))), patch) } func TestPauseRolloutAfterInconclusiveExperiment(t *testing.T) { @@ -481,7 +481,7 @@ func TestRolloutExperimentFinishedIncrementStep(t *testing.T) { }` generatedConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, generatedConditions)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, generatedConditions)), patch) } func TestRolloutDoNotCreateExperimentWithoutStableRS(t *testing.T) { diff --git a/rollout/service_test.go b/rollout/service_test.go index 393faf87a0..e29ee53b4a 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -144,7 +144,7 @@ func TestActiveServiceNotFound(t *testing.T) { } }` _, pausedCondition := newInvalidSpecCondition(conditions.InvalidSpecReason, notUsedActiveSvc, errmsg) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) } func TestPreviewServiceNotFound(t *testing.T) { @@ -173,7 +173,7 @@ func TestPreviewServiceNotFound(t *testing.T) { } }` _, pausedCondition := newInvalidSpecCondition(conditions.InvalidSpecReason, notUsedPreviewSvc, errmsg) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) } diff --git a/test/e2e/istio_test.go b/test/e2e/istio_test.go index 2f993f09bc..7ecbd66fdf 100644 --- a/test/e2e/istio_test.go +++ b/test/e2e/istio_test.go @@ -303,7 +303,7 @@ func (s *IstioSuite) TestIstioAbortUpdate() { Then(). When(). AbortRollout(). - WaitForRolloutStatus("Degraded"). + WaitForRolloutStatus("Healthy"). Then(). ExpectRevisionPodCount("1", 1). When(). @@ -316,7 +316,7 @@ func (s *IstioSuite) TestIstioAbortUpdate() { Then(). When(). AbortRollout(). - WaitForRolloutStatus("Degraded"). + WaitForRolloutStatus("Healthy"). Then(). ExpectRevisionPodCount("2", 1) } From 5b40f081f459c0c1265aa3070cc44cca94830db8 Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Mon, 23 Oct 2023 05:51:57 -0700 Subject: [PATCH 150/159] fix: rollback to stable with dynamicStableScale could overwhelm stable pods (#3077) * fix: rollback to stable with dynamicStableScale could go under maxUnavailable Signed-off-by: Jesse Suen * test: add unit tests Signed-off-by: Jesse Suen * test: add e2e tests Signed-off-by: Jesse Suen * refactor: move isReplicaSetReferenced to replicaset.go Signed-off-by: Jesse Suen --------- Signed-off-by: Jesse Suen --- rollout/bluegreen.go | 7 +- rollout/canary.go | 49 ++++---- rollout/canary_test.go | 118 ++++++++++++++++++ rollout/replicaset.go | 55 +++++++++ rollout/replicaset_test.go | 182 ++++++++++++++++++++++++++++ rollout/service.go | 15 ++- rollout/service_test.go | 47 +++---- rollout/trafficrouting.go | 43 ++++--- rollout/trafficrouting_test.go | 97 ++++++++++++++- test/e2e/canary_test.go | 60 +++++++++ test/fixtures/common.go | 8 ++ test/fixtures/when.go | 12 ++ utils/replicaset/canary.go | 9 +- utils/replicaset/replicaset.go | 11 -- utils/replicaset/replicaset_test.go | 42 ------- 15 files changed, 631 insertions(+), 124 deletions(-) diff --git a/rollout/bluegreen.go b/rollout/bluegreen.go index 887e022e28..f1bcf7a7bb 100644 --- a/rollout/bluegreen.go +++ b/rollout/bluegreen.go @@ -220,10 +220,9 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForBlueGreen(oldRSs []*appsv1.Re annotationedRSs := int32(0) rolloutReplicas := defaults.GetReplicasOrDefault(c.rollout.Spec.Replicas) for _, targetRS := range oldRSs { - if replicasetutil.IsStillReferenced(c.rollout.Status, targetRS) { - // We should technically never get here because we shouldn't be passing a replicaset list - // which includes referenced ReplicaSets. But we check just in case - c.log.Warnf("Prevented inadvertent scaleDown of RS '%s'", targetRS.Name) + if c.isReplicaSetReferenced(targetRS) { + // We might get here if user interrupted an an update in order to move back to stable. + c.log.Infof("Skip scale down of older RS '%s': still referenced", targetRS.Name) continue } if *targetRS.Spec.Replicas == 0 { diff --git a/rollout/canary.go b/rollout/canary.go index dff4b52d50..b443db507e 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -180,10 +180,9 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli annotationedRSs := int32(0) for _, targetRS := range oldRSs { - if replicasetutil.IsStillReferenced(c.rollout.Status, targetRS) { - // We should technically never get here because we shouldn't be passing a replicaset list - // which includes referenced ReplicaSets. But we check just in case - c.log.Warnf("Prevented inadvertent scaleDown of RS '%s'", targetRS.Name) + if c.isReplicaSetReferenced(targetRS) { + // We might get here if user interrupted an an update in order to move back to stable. + c.log.Infof("Skip scale down of older RS '%s': still referenced", targetRS.Name) continue } if maxScaleDown <= 0 { @@ -220,15 +219,8 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli // and doesn't yet have scale down deadline. This happens when a user changes their // mind in the middle of an V1 -> V2 update, and then applies a V3. We are deciding // what to do with the defunct, intermediate V2 ReplicaSet right now. - if !c.replicaSetReferencedByCanaryTraffic(targetRS) { - // It is safe to scale the intermediate RS down, if no traffic is directed to it. - c.log.Infof("scaling down intermediate RS '%s'", targetRS.Name) - } else { - c.log.Infof("Skip scaling down intermediate RS '%s': still referenced by service", targetRS.Name) - // This ReplicaSet is still referenced by the service. It is not safe to scale - // this down. - continue - } + // It is safe to scale the intermediate RS down, since no traffic is directed to it. + c.log.Infof("scaling down intermediate RS '%s'", targetRS.Name) } } if *targetRS.Spec.Replicas == desiredReplicaCount { @@ -248,19 +240,26 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli return totalScaledDown, nil } -func (c *rolloutContext) replicaSetReferencedByCanaryTraffic(rs *appsv1.ReplicaSet) bool { - rsPodHash := replicasetutil.GetPodTemplateHash(rs) - ro := c.rollout - - if ro.Status.Canary.Weights == nil { - return false - } - - if ro.Status.Canary.Weights.Canary.PodTemplateHash == rsPodHash || ro.Status.Canary.Weights.Stable.PodTemplateHash == rsPodHash { - return true +// isDynamicallyRollingBackToStable returns true if we were in the middle of an canary update with +// dynamic stable scaling, but was interrupted and are now rolling back to stable RS. This is similar +// to, but different than aborting. With abort, desired hash != stable hash and so we know the +// two hashes to balance traffic against. But with dynamically rolling back to stable, the +// desired hash == stable hash, and so we must use the *previous* desired hash and balance traffic +// between previous desired vs. stable hash, in order to safely shift traffic back to stable. +// This function also returns the previous desired hash (where we are weighted to) +func isDynamicallyRollingBackToStable(ro *v1alpha1.Rollout, desiredRS *appsv1.ReplicaSet) (bool, string) { + if rolloututil.IsFullyPromoted(ro) && ro.Spec.Strategy.Canary.TrafficRouting != nil && ro.Spec.Strategy.Canary.DynamicStableScale { + if ro.Status.Canary.Weights != nil { + currSelector := ro.Status.Canary.Weights.Canary.PodTemplateHash + desiredSelector := replicasetutil.GetPodTemplateHash(desiredRS) + if currSelector != desiredSelector { + if desiredRS.Status.AvailableReplicas < *ro.Spec.Replicas { + return true, currSelector + } + } + } } - - return false + return false, "" } // canProceedWithScaleDownAnnotation returns whether or not it is safe to proceed with annotating diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 1d8af7d80e..b275170eec 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -1890,3 +1891,120 @@ func TestHandleCanaryAbort(t *testing.T) { assert.JSONEq(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions)), patch) }) } + +func TestIsDynamicallyRollingBackToStable(t *testing.T) { + newRSWithHashAndReplicas := func(hash string, available int32) *appsv1.ReplicaSet { + return &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: hash, + }, + }, + Status: v1.ReplicaSetStatus{ + AvailableReplicas: available, + }, + } + } + + testCases := []struct { + name string + status v1alpha1.RolloutStatus + trafficRoutingDisabled bool + dynamicStableScalingDisabled bool + rsHash string + rsAvailableReplicas *int32 // if nil, will set to rollout replicas + trafficWeights *v1alpha1.TrafficWeights + expectedResult bool + }{ + { + name: "desired RS != stable RS", + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "def456"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not using traffic routing", + trafficRoutingDisabled: true, + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not using dynamicStableScaling", + dynamicStableScalingDisabled: true, + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "weighted selector == desired RS", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }, + }, + }, + rsHash: "abc123", + expectedResult: false, + }, + { + name: "weighted selector != desired RS, desired not fully available", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "def456", + }, + }, + }, + }, + rsHash: "abc123", + rsAvailableReplicas: pointer.Int32(1), + expectedResult: true, + }, + { + name: "weighted selector != desired RS, desired RS is fully available", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "def456", + }, + }, + }, + }, + rsHash: "abc123", + expectedResult: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + ro := newCanaryRollout("test", 10, nil, nil, nil, intstr.FromInt(0), intstr.FromInt(1)) + if !tc.trafficRoutingDisabled { + ro.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{} + } + if !tc.dynamicStableScalingDisabled { + ro.Spec.Strategy.Canary.DynamicStableScale = true + } + ro.Status = tc.status + + desiredRS := newRSWithHashAndReplicas(tc.rsHash, 1) + if tc.rsAvailableReplicas != nil { + desiredRS.Status.AvailableReplicas = *tc.rsAvailableReplicas + } + + rbToStable, _ := isDynamicallyRollingBackToStable(ro, desiredRS) + + assert.Equal(t, tc.expectedResult, rbToStable) + }) + } +} diff --git a/rollout/replicaset.go b/rollout/replicaset.go index fad23e756e..7d9a71f62a 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -7,6 +7,7 @@ import ( "time" appsv1 "k8s.io/api/apps/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" patchtypes "k8s.io/apimachinery/pkg/types" @@ -15,6 +16,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" + serviceutil "github.com/argoproj/argo-rollouts/utils/service" timeutil "github.com/argoproj/argo-rollouts/utils/time" ) @@ -296,3 +298,56 @@ func (c *rolloutContext) scaleDownDelayHelper(rs *appsv1.ReplicaSet, annotatione return annotationedRSs, desiredReplicaCount, nil } + +// isReplicaSetReferenced returns if the given ReplicaSet is still being referenced by any of +// the current, stable, blue-green services. Used to determine if the ReplicaSet can +// safely be scaled to zero, or deleted. +func (c *rolloutContext) isReplicaSetReferenced(rs *appsv1.ReplicaSet) bool { + rsPodHash := replicasetutil.GetPodTemplateHash(rs) + if rsPodHash == "" { + return false + } + ro := c.rollout + referencesToCheck := []string{ + ro.Status.StableRS, + ro.Status.CurrentPodHash, + ro.Status.BlueGreen.ActiveSelector, + ro.Status.BlueGreen.PreviewSelector, + } + if ro.Status.Canary.Weights != nil { + referencesToCheck = append(referencesToCheck, ro.Status.Canary.Weights.Canary.PodTemplateHash, ro.Status.Canary.Weights.Stable.PodTemplateHash) + } + for _, ref := range referencesToCheck { + if ref == rsPodHash { + return true + } + } + + // The above are static, lightweight checks to see if the selectors we record in our status are + // still referencing the ReplicaSet in question. Those checks aren't always enough. Next, we do + // a deeper check to look up the actual service objects, and see if they are still referencing + // the ReplicaSet. If so, we cannot scale it down. + var servicesToCheck []string + if ro.Spec.Strategy.Canary != nil { + servicesToCheck = []string{ro.Spec.Strategy.Canary.CanaryService, ro.Spec.Strategy.Canary.StableService} + } else { + servicesToCheck = []string{ro.Spec.Strategy.BlueGreen.ActiveService, ro.Spec.Strategy.BlueGreen.PreviewService} + } + for _, svcName := range servicesToCheck { + if svcName == "" { + continue + } + svc, err := c.servicesLister.Services(c.rollout.Namespace).Get(svcName) + if err != nil { + if k8serrors.IsNotFound(err) { + // service doesn't exist + continue + } + return true + } + if serviceutil.GetRolloutSelectorLabel(svc) == rsPodHash { + return true + } + } + return false +} diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index 7baba5e7a3..262bd23dd7 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -8,6 +8,9 @@ import ( "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" + k8sinformers "k8s.io/client-go/informers" k8sfake "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" "k8s.io/utils/pointer" @@ -353,3 +356,182 @@ func TestReconcileOldReplicaSet(t *testing.T) { }) } } + +func TestIsReplicaSetReferenced(t *testing.T) { + newRSWithPodTemplateHash := func(hash string) *appsv1.ReplicaSet { + return &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: hash, + }, + }, + } + } + + testCases := []struct { + name string + status v1alpha1.RolloutStatus + canaryService string + stableService string + activeService string + previewService string + services []runtime.Object + rsHash string + expectedResult bool + }{ + { + name: "empty hash", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not referenced", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "def456", + expectedResult: false, + }, + { + name: "stable rs referenced", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "current rs referenced", + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123"}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "active referenced", + status: v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{ActiveSelector: "abc123"}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "active referenced", + status: v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{PreviewSelector: "abc123"}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "traffic routed canary current pod hash", + status: v1alpha1.RolloutStatus{Canary: v1alpha1.CanaryStatus{Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "traffic routed canary current pod hash", + status: v1alpha1.RolloutStatus{Canary: v1alpha1.CanaryStatus{Weights: &v1alpha1.TrafficWeights{ + Stable: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "canary service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + canaryService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "stable service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + stableService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "active service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "preview service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + previewService: "mysvc2", + services: []runtime.Object{newService("mysvc2", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "service not found", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + previewService: "mysvc2", + rsHash: "def456", + expectedResult: false, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + + fake := fake.Clientset{} + k8sfake := k8sfake.NewSimpleClientset(tc.services...) + informers := k8sinformers.NewSharedInformerFactory(k8sfake, 0) + servicesLister := informers.Core().V1().Services().Lister() + stopchan := make(chan struct{}) + defer close(stopchan) + informers.Start(stopchan) + informers.WaitForCacheSync(stopchan) + + var r *v1alpha1.Rollout + if tc.activeService != "" { + r = newBlueGreenRollout("test", 1, nil, tc.activeService, tc.previewService) + } else { + r = newCanaryRollout("test", 1, nil, nil, nil, intstr.FromInt(0), intstr.FromInt(1)) + r.Spec.Strategy.Canary.CanaryService = tc.canaryService + r.Spec.Strategy.Canary.StableService = tc.stableService + } + r.Status = tc.status + + roCtx := &rolloutContext{ + rollout: r, + log: logutil.WithRollout(r), + reconcilerBase: reconcilerBase{ + servicesLister: servicesLister, + argoprojclientset: &fake, + kubeclientset: k8sfake, + recorder: record.NewFakeEventRecorder(), + }, + } + rs := newRSWithPodTemplateHash(tc.rsHash) + stillReferenced := roCtx.isReplicaSetReferenced(rs) + + assert.Equal( + t, + tc.expectedResult, + stillReferenced, + ) + }) + } +} diff --git a/rollout/service.go b/rollout/service.go index f808cb55fc..69739b9315 100644 --- a/rollout/service.go +++ b/rollout/service.go @@ -147,7 +147,7 @@ func (c *rolloutContext) awsVerifyTargetGroups(svc *corev1.Service) error { return nil } - c.targetsVerified = pointer.BoolPtr(false) + c.targetsVerified = pointer.Bool(false) // get endpoints of service endpoints, err := c.kubeclientset.CoreV1().Endpoints(svc.Namespace).Get(ctx, svc.Name, metav1.GetOptions{}) @@ -177,7 +177,7 @@ func (c *rolloutContext) awsVerifyTargetGroups(svc *corev1.Service) error { } c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedRegistrationMessage, svc.Name, tgb.Spec.TargetGroupARN, verifyRes.EndpointsRegistered) } - c.targetsVerified = pointer.BoolPtr(true) + c.targetsVerified = pointer.Bool(true) return nil } @@ -266,6 +266,17 @@ func (c *rolloutContext) reconcileStableAndCanaryService() error { return nil } + if dynamicallyRollingBackToStable, currSelector := isDynamicallyRollingBackToStable(c.rollout, c.newRS); dynamicallyRollingBackToStable { + // User may have interrupted an update in order go back to stableRS, and is using dynamic + // stable scaling. If that is the case, the stableRS might be undersized and if we blindly + // switch service selector we could overwhelm stableRS pods. + // If we get here, we detected that the canary service needs to be pointed back to + // stable, but stable is not fully available. Skip the service switch for now. + c.log.Infof("delaying fully promoted service switch of '%s' from %s to %s: ReplicaSet '%s' not fully available", + c.rollout.Spec.Strategy.Canary.CanaryService, currSelector, replicasetutil.GetPodTemplateHash(c.newRS), c.newRS.Name) + return nil + } + err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.newRS, true) if err != nil { return err diff --git a/rollout/service_test.go b/rollout/service_test.go index e29ee53b4a..cb15367a3a 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -437,26 +437,26 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { TargetHealthDescriptions: []elbv2types.TargetHealthDescription{ { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("1.2.3.4"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("1.2.3.4"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("5.6.7.8"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("5.6.7.8"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("2.4.6.8"), // irrelevant - Port: pointer.Int32Ptr(81), // wrong port + Id: pointer.String("2.4.6.8"), // irrelevant + Port: pointer.Int32(81), // wrong port }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("9.8.7.6"), // irrelevant ip - Port: pointer.Int32Ptr(80), + Id: pointer.String("9.8.7.6"), // irrelevant ip + Port: pointer.Int32(80), }, }, }, @@ -464,8 +464,8 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { fakeELB.On("DescribeTargetHealth", mock.Anything, mock.Anything).Return(&thOut, nil) r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ @@ -491,6 +491,7 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) @@ -536,26 +537,26 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { TargetHealthDescriptions: []elbv2types.TargetHealthDescription{ { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("1.2.3.4"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("1.2.3.4"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("5.6.7.8"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("5.6.7.8"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("2.4.6.8"), // irrelevant - Port: pointer.Int32Ptr(80), // wrong port + Id: pointer.String("2.4.6.8"), // irrelevant + Port: pointer.Int32(80), // wrong port }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("9.8.7.6"), // irrelevant ip - Port: pointer.Int32Ptr(80), + Id: pointer.String("9.8.7.6"), // irrelevant ip + Port: pointer.Int32(80), }, }, }, @@ -563,8 +564,8 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { fakeELB.On("DescribeTargetHealth", mock.Anything, mock.Anything).Return(&thOut, nil) r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ Ingress: "ingress", @@ -589,6 +590,7 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) @@ -624,8 +626,8 @@ func TestCanaryAWSVerifyTargetGroupsSkip(t *testing.T) { defer f.Close() r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ Ingress: "ingress", @@ -652,6 +654,7 @@ func TestCanaryAWSVerifyTargetGroupsSkip(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index c7b3bf7055..a87e31a9e8 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -163,25 +163,20 @@ func (c *rolloutContext) reconcileTrafficRouting() error { canaryHash = c.newRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] } - if rolloututil.IsFullyPromoted(c.rollout) { - // when we are fully promoted. desired canary weight should be 0 + if dynamicallyRollingBackToStable, prevDesiredHash := isDynamicallyRollingBackToStable(c.rollout, c.newRS); dynamicallyRollingBackToStable { + desiredWeight = c.calculateDesiredWeightOnAbortOrStableRollback() + // Since stableRS == desiredRS, we must balance traffic between the + // *previous desired* vs. stable (as opposed to current desired vs. stable). + // The previous desired is remembered in Status.Canary.Weights.Canary.PodTemplateHash. + // See: https://github.com/argoproj/argo-rollouts/issues/3020 + canaryHash = prevDesiredHash + } else if rolloututil.IsFullyPromoted(c.rollout) { err := reconciler.RemoveManagedRoutes() if err != nil { return err } } else if c.pauseContext.IsAborted() { - // when aborted, desired canary weight should immediately be 0 (100% to stable), *unless* - // we are using dynamic stable scaling. In that case, we are dynamically decreasing the - // weight to the canary according to the availability of the stable (whatever it can support). - if c.rollout.Spec.Strategy.Canary.DynamicStableScale { - desiredWeight = 100 - ((100 * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) - if c.rollout.Status.Canary.Weights != nil { - // This ensures that if we are already at a lower weight, then we will not - // increase the weight because stable availability is flapping (e.g. pod restarts) - desiredWeight = minInt(desiredWeight, c.rollout.Status.Canary.Weights.Canary.Weight) - } - } - + desiredWeight = c.calculateDesiredWeightOnAbortOrStableRollback() if (c.rollout.Spec.Strategy.Canary.DynamicStableScale && desiredWeight == 0) || !c.rollout.Spec.Strategy.Canary.DynamicStableScale { // If we are using dynamic stable scale we need to also make sure that desiredWeight=0 aka we are completely // done with aborting before resetting the canary service selectors back to stable @@ -295,6 +290,26 @@ func (c *rolloutContext) reconcileTrafficRouting() error { return nil } +// calculateDesiredWeightOnAbortOrStableRollback returns the desired weight to use when we are either +// aborting, or rolling back to stable RS. +func (c *rolloutContext) calculateDesiredWeightOnAbortOrStableRollback() int32 { + if !c.rollout.Spec.Strategy.Canary.DynamicStableScale { + // When aborting or rolling back to stable RS and dynamicStableScaling is disabled, + // then desired canary weight should immediately be 0 (100% to stable) since we can trust + // that it is fully scaled up + return 0 + } + // When using dynamic stable scaling, we must dynamically decreasing the weight to the canary + // according to the availability of the stable (whatever it can support). + desiredWeight := 100 - ((100 * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) + if c.rollout.Status.Canary.Weights != nil { + // This ensures that if we are already at a lower weight, then we will not + // increase the weight because stable availability is flapping (e.g. pod restarts) + desiredWeight = minInt(desiredWeight, c.rollout.Status.Canary.Weights.Canary.Weight) + } + return desiredWeight +} + // trafficWeightUpdatedMessage returns a message we emit for the kubernetes event whenever we adjust traffic weights func trafficWeightUpdatedMessage(prev, new *v1alpha1.TrafficWeights) string { var details []string diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index 21aea362ae..a8f5520ea2 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -2,6 +2,7 @@ package rollout import ( "errors" + "fmt" "strconv" "testing" "time" @@ -752,8 +753,8 @@ func TestCanaryWithTrafficRoutingAddScaleDownDelay(t *testing.T) { defer f.Close() r1 := newCanaryRollout("foo", 1, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromInt(1), intstr.FromInt(1)) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromInt(1), intstr.FromInt(1)) r1.Spec.Strategy.Canary.CanaryService = "canary" r1.Spec.Strategy.Canary.StableService = "stable" r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ @@ -765,6 +766,7 @@ func TestCanaryWithTrafficRoutingAddScaleDownDelay(t *testing.T) { rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] r2 = updateCanaryRolloutStatus(r2, rs2PodHash, 2, 1, 2, false) r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) completedCondition, _ := newCompletedCondition(true) @@ -1153,3 +1155,94 @@ func TestRolloutReplicaIsAvailableAndGenerationNotBeModifiedShouldModifyVirtualS }).Once().Return(nil) f.run(getKey(r1, t)) } + +// This makes sure we don't set weight to zero if we are rolling back to stable with DynamicStableScale +func TestDontWeightToZeroWhenDynamicallyRollingBackToStable(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32(90), + }, + { + Pause: &v1alpha1.RolloutPause{}, + }, + } + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32(1), intstr.FromInt(1), intstr.FromInt(1)) + r1.Spec.Strategy.Canary.DynamicStableScale = true + r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + SMI: &v1alpha1.SMITrafficRouting{}, + } + r1.Spec.Strategy.Canary.CanaryService = "canary" + r1.Spec.Strategy.Canary.StableService = "stable" + r1.Status.ReadyReplicas = 10 + r1.Status.AvailableReplicas = 10 + r2 := bumpVersion(r1) + + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 9, 9) + + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + canarySelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs2PodHash} + stableSelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs1PodHash} + canarySvc := newService("canary", 80, canarySelector, r1) + stableSvc := newService("stable", 80, stableSelector, r1) + + // simulate rollback to stable + r2.Spec = r1.Spec + r2.Status.StableRS = rs1PodHash + r2.Status.CurrentPodHash = rs1PodHash // will cause IsFullyPromoted() to be true + r2.Status.Canary.Weights = &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + Weight: 10, + ServiceName: "canary", + PodTemplateHash: rs2PodHash, + }, + Stable: v1alpha1.WeightDestination{ + Weight: 90, + ServiceName: "stable", + PodTemplateHash: rs1PodHash, + }, + } + + f.kubeobjects = append(f.kubeobjects, rs1, rs2, canarySvc, stableSvc) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + f.expectUpdateReplicaSetAction(rs1) // Updates the revision annotation from 1 to 3 + f.expectUpdateReplicaSetAction(rs1) // repeat of the above (not sure why) + scaleUpIndex := f.expectUpdateReplicaSetAction(rs1) // this one scales the stable RS to 10 + f.expectPatchRolloutAction(r2) + + f.fakeTrafficRouting = newUnmockedFakeTrafficRoutingReconciler() + f.fakeTrafficRouting.On("UpdateHash", mock.Anything, mock.Anything, mock.Anything).Return(func(canaryHash, stableHash string, additionalDestinations ...v1alpha1.WeightDestination) error { + // make sure UpdateHash was called with previous desired hash (not current pod hash) + if canaryHash != rs2PodHash { + return fmt.Errorf("UpdateHash was called with canary hash: %s. Expected: %s", canaryHash, rs2PodHash) + } + if stableHash != rs1PodHash { + return fmt.Errorf("UpdateHash was called with stable hash: %s. Expected: %s", canaryHash, rs1PodHash) + } + return nil + + }) + f.fakeTrafficRouting.On("SetWeight", mock.Anything, mock.Anything).Return(func(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) error { + // make sure SetWeight was not changed + if desiredWeight != 10 { + return fmt.Errorf("SetWeight was called with unexpected weight: %d. Expected: 10", desiredWeight) + } + return nil + }) + f.fakeTrafficRouting.On("SetHeaderRoute", mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("RemoveManagedRoutes", mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(pointer.BoolPtr(true), nil) + f.run(getKey(r1, t)) + + // Make sure we scale up stable ReplicaSet to 10 + rs1Updated := f.getUpdatedReplicaSet(scaleUpIndex) + assert.Equal(t, int32(10), *rs1Updated.Spec.Replicas) +} diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index fe22175074..bc5e60b6c3 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -13,6 +13,7 @@ import ( corev1 "k8s.io/api/core/v1" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/test/fixtures" ) @@ -620,3 +621,62 @@ func (s *CanarySuite) TestCanaryDynamicStableScale() { ExpectServiceSelector("dynamic-stable-scale-canary", map[string]string{"app": "dynamic-stable-scale", "rollouts-pod-template-hash": "868d98995b"}, false). ExpectRevisionPodCount("1", 4) } + +// TestCanaryDynamicStableScaleRollbackToStable verifies when we rollback to stable with +// DynamicStableScale enabled, we do so in a safe manner without shifting traffic back to stable +// before it can handle it +func (s *CanarySuite) TestCanaryDynamicStableScaleRollbackToStable() { + s.Given(). + RolloutObjects(`@functional/canary-dynamic-stable-scale.yaml`). + When(). + ApplyManifests(). + MarkPodsReady("1", 4). // mark all 4 pods ready + WaitForRolloutStatus("Healthy"). + UpdateSpec(). + MarkPodsReady("2", 1). // mark 1 of 1 canary pods ready + WaitForRolloutStatus("Paused"). + Sleep(2*time.Second). + Then(). + ExpectRevisionPodCount("1", 3). + ExpectRevisionPodCount("2", 1). + When(). + UndoRollout(1). // Rollback to stable (revision 1) + Sleep(2*time.Second). + Then(). + ExpectRevisionPodCount("3", 4). // Ensure we fully scale up the stable (now revision 3) + ExpectRevisionPodCount("2", 1). // And do not scale down the previous desired (revision 2) + Assert(func(t *fixtures.Then) { + // Make sure canary service is still pointing to the previous desired (revision 2) + rs3 := t.GetReplicaSetByRevision("3") + rs2 := t.GetReplicaSetByRevision("2") + canarySvc, stableSvc := t.GetServices() + assert.Equal(s.T(), rs2.Labels[rov1.DefaultRolloutUniqueLabelKey], canarySvc.Spec.Selector["rollouts-pod-template-hash"]) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], stableSvc.Spec.Selector["rollouts-pod-template-hash"]) + + // Ensure we did not touch the weights even though we are "fully promoted" + ro := t.GetRollout() + assert.Equal(s.T(), rs2.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Canary.PodTemplateHash) + assert.Equal(s.T(), int32(25), ro.Status.Canary.Weights.Canary.Weight) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Stable.PodTemplateHash) + assert.Equal(s.T(), int32(75), ro.Status.Canary.Weights.Stable.Weight) + }). + When(). + MarkPodsReady("3", 1). // marks the 4th pod of stableRS/newRS (revision 3) ready + WaitForRevisionPodCount("2", 0). // make sure we scale down the previous desired (revision 2) + Then(). + Assert(func(t *fixtures.Then) { + // Make sure canary/stable service is updated to point to revision 3 + rs3 := t.GetReplicaSetByRevision("3") + canarySvc, stableSvc := t.GetServices() + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], canarySvc.Spec.Selector["rollouts-pod-template-hash"]) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], stableSvc.Spec.Selector["rollouts-pod-template-hash"]) + + // Ensure we are 100% back to stable + ro := t.GetRollout() + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Canary.PodTemplateHash) + assert.Equal(s.T(), int32(0), ro.Status.Canary.Weights.Canary.Weight) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Stable.PodTemplateHash) + assert.Equal(s.T(), int32(100), ro.Status.Canary.Weights.Stable.Weight) + + }) +} diff --git a/test/fixtures/common.go b/test/fixtures/common.go index 9e060df865..670d2dd2f4 100644 --- a/test/fixtures/common.go +++ b/test/fixtures/common.go @@ -71,6 +71,7 @@ func (c *Common) CheckError(err error) { } } +// Rollout returns the original rollout manifest used in the test func (c *Common) Rollout() *rov1.Rollout { var ro rov1.Rollout err := runtime.DefaultUnstructuredConverter.FromUnstructured(c.rollout.Object, &ro) @@ -78,6 +79,13 @@ func (c *Common) Rollout() *rov1.Rollout { return &ro } +// GetRollout returns the live rollout object in the cluster +func (c *Common) GetRollout() *rov1.Rollout { + ro, err := c.rolloutClient.ArgoprojV1alpha1().Rollouts(c.namespace).Get(context.TODO(), c.Rollout().GetName(), metav1.GetOptions{}) + c.CheckError(err) + return ro +} + func (c *Common) PrintRollout(name string) { streams := genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr} o := options.NewArgoRolloutsOptions(streams) diff --git a/test/fixtures/when.go b/test/fixtures/when.go index 82e84d3a42..0fa77610f4 100644 --- a/test/fixtures/when.go +++ b/test/fixtures/when.go @@ -25,12 +25,14 @@ import ( "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apiclient/rollout" + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/abort" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/promote" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/restart" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/retry" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/status" + "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/undo" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/options" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/viewcontroller" rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" @@ -185,6 +187,16 @@ func (w *When) RetryRollout() *When { return w } +func (w *When) UndoRollout(toRevision int64) *When { + if w.rollout == nil { + w.t.Fatal("Rollout not set") + } + _, err := undo.RunUndoRollout(w.dynamicClient.Resource(v1alpha1.RolloutGVR).Namespace(w.namespace), w.kubeClient, w.rollout.GetName(), toRevision) + w.CheckError(err) + w.log.Infof("Undo rollout to %d", toRevision) + return w +} + func (w *When) RestartRollout() *When { if w.rollout == nil { w.t.Fatal("Rollout not set") diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index a751cd2be2..40eadb7848 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -41,8 +41,13 @@ func AtDesiredReplicaCountsForCanary(ro *v1alpha1.Rollout, newRS, stableRS *apps return false } } - if GetAvailableReplicaCountForReplicaSets(olderRSs) != int32(0) { - return false + if ro.Spec.Strategy.Canary.TrafficRouting == nil { + // For basic canary, all older ReplicaSets must be scaled to zero since they serve traffic. + // For traffic weighted canary, it's okay if they are still scaled up, since the traffic + // router will prevent them from serving traffic + if GetAvailableReplicaCountForReplicaSets(olderRSs) != int32(0) { + return false + } } return true } diff --git a/utils/replicaset/replicaset.go b/utils/replicaset/replicaset.go index 9aec161b66..b2664afd53 100644 --- a/utils/replicaset/replicaset.go +++ b/utils/replicaset/replicaset.go @@ -592,17 +592,6 @@ func (o ReplicaSetsByRevisionNumber) Less(i, j int) bool { return iRevision < jRevision } -// IsStillReferenced returns if the given ReplicaSet is still being referenced by any of -// the current, stable, blue-green active references. Used to determine if the ReplicaSet can -// safely be scaled to zero, or deleted. -func IsStillReferenced(status v1alpha1.RolloutStatus, rs *appsv1.ReplicaSet) bool { - hash := GetPodTemplateHash(rs) - if hash != "" && (hash == status.StableRS || hash == status.CurrentPodHash || hash == status.BlueGreen.ActiveSelector) { - return true - } - return false -} - // HasScaleDownDeadline returns whether or not the given ReplicaSet is annotated with a scale-down delay func HasScaleDownDeadline(rs *appsv1.ReplicaSet) bool { if rs == nil || rs.Annotations == nil { diff --git a/utils/replicaset/replicaset_test.go b/utils/replicaset/replicaset_test.go index 23bf320955..462fa2b835 100644 --- a/utils/replicaset/replicaset_test.go +++ b/utils/replicaset/replicaset_test.go @@ -1078,48 +1078,6 @@ func TestNeedsRestart(t *testing.T) { }) } -func TestIsStillReferenced(t *testing.T) { - newRSWithPodTemplateHash := func(hash string) *appsv1.ReplicaSet { - return &appsv1.ReplicaSet{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - v1alpha1.DefaultRolloutUniqueLabelKey: hash, - }, - }, - } - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := &appsv1.ReplicaSet{} - assert.False(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("") - assert.False(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{CurrentPodHash: "abc123"} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{ActiveSelector: "abc123"}} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("def456") - assert.False(t, IsStillReferenced(status, rs)) - } -} - func TestHasScaleDownDeadline(t *testing.T) { { assert.False(t, HasScaleDownDeadline(nil)) From d68e8de2e8bd70c3a4ad6c0195537e08571fb03a Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Wed, 4 Oct 2023 06:14:01 -0700 Subject: [PATCH 151/159] fix: inopportune scaling events would lose some status fields (#3060) fix: inopportune scaling events would result in loss of data Signed-off-by: Jesse Suen --- rollout/sync.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rollout/sync.go b/rollout/sync.go index a4682fad70..25c0c14813 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -281,10 +281,11 @@ func (c *rolloutContext) syncReplicasOnly() error { if err != nil { return err } + newStatus := c.rollout.Status.DeepCopy() // NOTE: it is possible for newRS to be nil (e.g. when template and replicas changed at same time) if c.rollout.Spec.Strategy.BlueGreen != nil { - previewSvc, activeSvc, err := c.getPreviewAndActiveServices() + _, activeSvc, err := c.getPreviewAndActiveServices() if err != nil { return nil } @@ -293,7 +294,15 @@ func (c *rolloutContext) syncReplicasOnly() error { // so we can abort this resync return err } - return c.syncRolloutStatusBlueGreen(previewSvc, activeSvc) + activeRS, _ := replicasetutil.GetReplicaSetByTemplateHash(c.allRSs, newStatus.BlueGreen.ActiveSelector) + if activeRS != nil { + newStatus.HPAReplicas = activeRS.Status.Replicas + newStatus.AvailableReplicas = activeRS.Status.AvailableReplicas + } else { + // when we do not have an active replicaset, accounting is done on the default rollout selector + newStatus.HPAReplicas = replicasetutil.GetActualReplicaCountForReplicaSets(c.allRSs) + newStatus.AvailableReplicas = replicasetutil.GetAvailableReplicaCountForReplicaSets(c.allRSs) + } } // The controller wants to use the rolloutCanary method to reconcile the rollout if the rollout is not paused. // If there are no scaling events, the rollout should only sync its status @@ -303,9 +312,10 @@ func (c *rolloutContext) syncReplicasOnly() error { // so we can abort this resync return err } - return c.syncRolloutStatusCanary() + newStatus.AvailableReplicas = replicasetutil.GetAvailableReplicaCountForReplicaSets(c.allRSs) + newStatus.HPAReplicas = replicasetutil.GetActualReplicaCountForReplicaSets(c.allRSs) } - return fmt.Errorf("no rollout strategy provided") + return c.persistRolloutStatus(newStatus) } // isScalingEvent checks whether the provided rollout has been updated with a scaling event From 40a80c834471c787873aff9fd1aa9f08e9ae4b9a Mon Sep 17 00:00:00 2001 From: zachaller Date: Mon, 30 Oct 2023 16:13:23 -0500 Subject: [PATCH 152/159] make codegen Signed-off-by: zachaller --- .../rollouts/v1alpha1/openapi_generated.go | 148 ++++-------------- 1 file changed, 31 insertions(+), 117 deletions(-) diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 01b39597e2..f91a313c76 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -52,7 +52,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AppMeshVirtualService": schema_pkg_apis_rollouts_v1alpha1_AppMeshVirtualService(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument": schema_pkg_apis_rollouts_v1alpha1_Argument(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ArgumentValueFrom": schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref), - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication": schema_pkg_apis_rollouts_v1alpha1_Authentication(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef": schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStatus": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStatus(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStrategy": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStrategy(ref), @@ -94,12 +93,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MetricResult": schema_pkg_apis_rollouts_v1alpha1_MetricResult(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NewRelicMetric": schema_pkg_apis_rollouts_v1alpha1_NewRelicMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NginxTrafficRouting": schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref), - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config": schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ObjectRef": schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PauseCondition": schema_pkg_apis_rollouts_v1alpha1_PauseCondition(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PingPongSpec": schema_pkg_apis_rollouts_v1alpha1_PingPongSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PodTemplateMetadata": schema_pkg_apis_rollouts_v1alpha1_PodTemplateMetadata(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExecution(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth": schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusMetric": schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_RequiredDuringSchedulingIgnoredDuringExecution(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RollbackWindowSpec": schema_pkg_apis_rollouts_v1alpha1_RollbackWindowSpec(ref), @@ -1100,35 +1099,6 @@ func schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref common.ReferenceCal } } -func schema_pkg_apis_rollouts_v1alpha1_Authentication(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Authentication method", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "sigv4": { - SchemaProps: spec.SchemaProps{ - Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), - }, - }, - "oauth2": { - SchemaProps: spec.SchemaProps{ - Description: "OAuth2 config", - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, - } -} - func schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1835,39 +1805,16 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac Type: []string{"object"}, Properties: map[string]spec.Schema{ "interval": { - SchemaProps: spec.SchemaProps{ - Description: "Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric.", - Type: []string{"string"}, - Format: "", - }, - }, - "query": { SchemaProps: spec.SchemaProps{ Type: []string{"string"}, Format: "", }, }, - "queries": { - SchemaProps: spec.SchemaProps{ - Description: "Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "formula": { + "query": { SchemaProps: spec.SchemaProps{ - Description: "Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2", - Type: []string{"string"}, - Format: "", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "apiVersion": { @@ -1878,6 +1825,7 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac }, }, }, + Required: []string{"query"}, }, }, } @@ -3294,54 +3242,6 @@ func schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref common.ReferenceC } } -func schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "tokenUrl": { - SchemaProps: spec.SchemaProps{ - Description: "OAuth2 provider token URL", - Type: []string{"string"}, - Format: "", - }, - }, - "clientId": { - SchemaProps: spec.SchemaProps{ - Description: "OAuth2 client ID", - Type: []string{"string"}, - Format: "", - }, - }, - "clientSecret": { - SchemaProps: spec.SchemaProps{ - Description: "OAuth2 client secret", - Type: []string{"string"}, - Format: "", - }, - }, - "scopes": { - SchemaProps: spec.SchemaProps{ - Description: "OAuth2 scopes", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - }, - }, - } -} - func schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3502,6 +3402,27 @@ func schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExe } } +func schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "PrometheusMetric defines the prometheus query to perform canary analysis", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "sigv4": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, + } +} + func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3525,9 +3446,9 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, "authentication": { SchemaProps: spec.SchemaProps{ - Description: "Authentication details", + Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"), }, }, "timeout": { @@ -3568,7 +3489,7 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } @@ -5537,19 +5458,12 @@ func schema_pkg_apis_rollouts_v1alpha1_WebMetric(ref common.ReferenceCallback) c Format: "byte", }, }, - "authentication": { - SchemaProps: spec.SchemaProps{ - Description: "Authentication details", - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), - }, - }, }, Required: []string{"url"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } From c5a45520691371d2e008d57b2780155a8169af22 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 30 Oct 2023 17:23:34 -0500 Subject: [PATCH 153/159] fix: docs require build.os to be defined (#3133) * fix read the docs build Signed-off-by: zachaller * fix read the docs build Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .readthedocs.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7b50ab9415..7b5d5d427f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,4 +4,8 @@ mkdocs: fail_on_warning: false python: install: - - requirements: docs/requirements.txt \ No newline at end of file + - requirements: docs/requirements.txt +build: + os: "ubuntu-22.04" + tools: + python: "3.7" \ No newline at end of file From 1dca34e84fa50e27ea0101c71ec6c061ede06626 Mon Sep 17 00:00:00 2001 From: Dennis Nguyen <1750375+dnguy078@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:03:46 -0700 Subject: [PATCH 154/159] fix: istio destionationrule subsets enforcement (#3126) * istio destionationrule subsets enforcement Signed-off-by: Dennis Nguyen * add users Signed-off-by: Dennis Nguyen * add test case for failure cases Signed-off-by: Dennis Nguyen --------- Signed-off-by: Dennis Nguyen --- USERS.md | 1 + rollout/trafficrouting/istio/istio.go | 17 ++++ rollout/trafficrouting/istio/istio_test.go | 110 +++++++++++++++++++++ 3 files changed, 128 insertions(+) diff --git a/USERS.md b/USERS.md index 587548a806..674fd17e26 100644 --- a/USERS.md +++ b/USERS.md @@ -21,6 +21,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Ibotta](https://home.ibotta.com/) 1. [Intuit](https://www.intuit.com/) 1. [New Relic](https://newrelic.com/) +1. [Nextdoor](https://nextdoor.com/) 1. [Nitro](https://www.gonitro.com) 1. [Nozzle](https://nozzle.io) 1. [Opensurvey Inc.](https://opensurvey.co.kr) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index 70b0cc0e68..d4b136c8ea 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -255,6 +255,23 @@ func (r *Reconciler) reconcileVirtualService(obj *unstructured.Unstructured, vsv if err = ValidateHTTPRoutes(r.rollout, vsvcRouteNames, httpRoutes); err != nil { return nil, false, err } + + host, err := r.getDestinationRuleHost() + if err != nil { + return nil, false, err + } + + if host != "" { + var routeDestinations []VirtualServiceRouteDestination + for i, routes := range httpRoutes { + for _, r := range routes.Route { + if r.Destination.Host == host { + routeDestinations = append(routeDestinations, VirtualServiceRouteDestination{Destination: r.Destination, Weight: r.Weight}) + } + } + httpRoutes[i].Route = routeDestinations + } + } } // TLS Routes diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index ea6474ef5f..20ceb86bed 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -465,6 +465,31 @@ spec: subset: 'canary-subset' weight: 0` +const singleRouteSubsetMultipleDestRuleVsvc = `apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: vsvc + namespace: default +spec: + gateways: + - istio-rollout-gateway + hosts: + - istio-rollout.dev.argoproj.io + http: + - route: + - destination: + host: rollout-service + subset: stable + weight: 100 + - destination: + host: rollout-service + subset: canary + weight: 0 + - destination: + host: additional-service + subset: stable-subset + weight: 20` + const singleRouteTlsVsvc = `apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: @@ -695,6 +720,91 @@ func TestHttpReconcileWeightsBaseCase(t *testing.T) { } } +func TestHttpReconcileMultipleDestRule(t *testing.T) { + ro := rolloutWithDestinationRule() + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil + + dRule1 := unstructuredutil.StrToUnstructuredUnsafe(` +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: istio-destrule + namespace: default +spec: + host: rollout-service + subsets: + - name: stable + - name: canary +`) + dRule2 := unstructuredutil.StrToUnstructuredUnsafe(` +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: additional-istio-destrule + namespace: default +spec: + host: additional-service + subsets: + - name: stable-subset +`) + + obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) + client := testutil.NewFakeDynamicClient(obj, dRule1, dRule2) + vsvcLister, druleLister := getIstioListers(client) + r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) + client.ClearActions() + + vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes + vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes + vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes + modifiedObj, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) + assert.Nil(t, err) + assert.NotNil(t, modifiedObj) + + httpRoutes := extractHttpRoutes(t, modifiedObj) + + // Assertions + assert.Equal(t, httpRoutes[0].Route[0].Destination.Host, "rollout-service") + assert.Equal(t, httpRoutes[0].Route[1].Destination.Host, "rollout-service") + if httpRoutes[0].Route[0].Destination.Subset == "stable" || httpRoutes[0].Route[1].Destination.Subset == "canary" { + assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(90)) + assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(10)) + } else { + assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(10)) + assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(90)) + } + + assert.Equal(t, httpRoutes[0].Route[2].Destination.Host, "additional-service") + assert.Equal(t, httpRoutes[0].Route[2].Destination.Subset, "stable-subset") + assert.Equal(t, httpRoutes[0].Route[2].Weight, int64(20)) +} + +func TestHttpReconcileInvalidMultipleDestRule(t *testing.T) { + ro := rolloutWithDestinationRule() + // set to invalid destination rule + ro.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule = &v1alpha1.IstioDestinationRule{ + Name: "invalid-destination-rule", + CanarySubsetName: "canary", + StableSubsetName: "stable", + } + + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil + + obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) + client := testutil.NewFakeDynamicClient(obj) + vsvcLister, druleLister := getIstioListers(client) + r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) + client.ClearActions() + + vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes + vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes + vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes + _, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) + assert.Error(t, err, "expected destination rule not found") +} + func TestHttpReconcileHeaderRouteHostBased(t *testing.T) { ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) obj := unstructuredutil.StrToUnstructuredUnsafe(regularVsvc) From 19b0e9a3aaa55dfc9eaef36d03897905b78397ea Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 1 Nov 2023 10:04:14 -0500 Subject: [PATCH 155/159] bump slsa: https://github.com/argoproj/argo-cd/pull/16200 to fix release Signed-off-by: zachaller --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ae80d1f4e0..58ec57f524 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} From 3498a2021412466ae7c4359f82e62ec686578259 Mon Sep 17 00:00:00 2001 From: Justin Marquis <76892343+34fathombelow@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:09:06 -0700 Subject: [PATCH 156/159] chore: upgrade cosign (#3139) Signed-off-by: Justin Marquis Signed-off-by: zachaller --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index a0c157cd3b..10e2df49d5 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -76,7 +76,7 @@ jobs: - name: Install cosign uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 # v3.1.1 with: - cosign-release: 'v2.0.2' + cosign-release: 'v2.2.0' - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 58ec57f524..403aaab60d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,9 +170,9 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@204a51a57a74d190b284a0ce69b44bc37201f343 # v3.0.3 + uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 with: - cosign-release: 'v2.0.2' + cosign-release: 'v2.2.0' - name: Generate SBOM (spdx) id: spdx-builder From 2184a072279c0aca36a6c6fd3840fd7d83593ad5 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 2 Nov 2023 12:50:50 -0500 Subject: [PATCH 157/159] fix: Revert "fix: istio destionationrule subsets enforcement (#3126)" (#3147) Revert "fix: istio destionationrule subsets enforcement (#3126)" This reverts commit 04e11195fb4046e897574478c51fb14692a07578. Signed-off-by: zachaller --- USERS.md | 1 - rollout/trafficrouting/istio/istio.go | 17 ---- rollout/trafficrouting/istio/istio_test.go | 110 --------------------- 3 files changed, 128 deletions(-) diff --git a/USERS.md b/USERS.md index 674fd17e26..587548a806 100644 --- a/USERS.md +++ b/USERS.md @@ -21,7 +21,6 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Ibotta](https://home.ibotta.com/) 1. [Intuit](https://www.intuit.com/) 1. [New Relic](https://newrelic.com/) -1. [Nextdoor](https://nextdoor.com/) 1. [Nitro](https://www.gonitro.com) 1. [Nozzle](https://nozzle.io) 1. [Opensurvey Inc.](https://opensurvey.co.kr) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index d4b136c8ea..70b0cc0e68 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -255,23 +255,6 @@ func (r *Reconciler) reconcileVirtualService(obj *unstructured.Unstructured, vsv if err = ValidateHTTPRoutes(r.rollout, vsvcRouteNames, httpRoutes); err != nil { return nil, false, err } - - host, err := r.getDestinationRuleHost() - if err != nil { - return nil, false, err - } - - if host != "" { - var routeDestinations []VirtualServiceRouteDestination - for i, routes := range httpRoutes { - for _, r := range routes.Route { - if r.Destination.Host == host { - routeDestinations = append(routeDestinations, VirtualServiceRouteDestination{Destination: r.Destination, Weight: r.Weight}) - } - } - httpRoutes[i].Route = routeDestinations - } - } } // TLS Routes diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index 20ceb86bed..ea6474ef5f 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -465,31 +465,6 @@ spec: subset: 'canary-subset' weight: 0` -const singleRouteSubsetMultipleDestRuleVsvc = `apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: vsvc - namespace: default -spec: - gateways: - - istio-rollout-gateway - hosts: - - istio-rollout.dev.argoproj.io - http: - - route: - - destination: - host: rollout-service - subset: stable - weight: 100 - - destination: - host: rollout-service - subset: canary - weight: 0 - - destination: - host: additional-service - subset: stable-subset - weight: 20` - const singleRouteTlsVsvc = `apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: @@ -720,91 +695,6 @@ func TestHttpReconcileWeightsBaseCase(t *testing.T) { } } -func TestHttpReconcileMultipleDestRule(t *testing.T) { - ro := rolloutWithDestinationRule() - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil - - dRule1 := unstructuredutil.StrToUnstructuredUnsafe(` -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: istio-destrule - namespace: default -spec: - host: rollout-service - subsets: - - name: stable - - name: canary -`) - dRule2 := unstructuredutil.StrToUnstructuredUnsafe(` -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: additional-istio-destrule - namespace: default -spec: - host: additional-service - subsets: - - name: stable-subset -`) - - obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) - client := testutil.NewFakeDynamicClient(obj, dRule1, dRule2) - vsvcLister, druleLister := getIstioListers(client) - r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) - client.ClearActions() - - vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes - vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes - vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes - modifiedObj, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) - assert.Nil(t, err) - assert.NotNil(t, modifiedObj) - - httpRoutes := extractHttpRoutes(t, modifiedObj) - - // Assertions - assert.Equal(t, httpRoutes[0].Route[0].Destination.Host, "rollout-service") - assert.Equal(t, httpRoutes[0].Route[1].Destination.Host, "rollout-service") - if httpRoutes[0].Route[0].Destination.Subset == "stable" || httpRoutes[0].Route[1].Destination.Subset == "canary" { - assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(90)) - assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(10)) - } else { - assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(10)) - assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(90)) - } - - assert.Equal(t, httpRoutes[0].Route[2].Destination.Host, "additional-service") - assert.Equal(t, httpRoutes[0].Route[2].Destination.Subset, "stable-subset") - assert.Equal(t, httpRoutes[0].Route[2].Weight, int64(20)) -} - -func TestHttpReconcileInvalidMultipleDestRule(t *testing.T) { - ro := rolloutWithDestinationRule() - // set to invalid destination rule - ro.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule = &v1alpha1.IstioDestinationRule{ - Name: "invalid-destination-rule", - CanarySubsetName: "canary", - StableSubsetName: "stable", - } - - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil - - obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) - client := testutil.NewFakeDynamicClient(obj) - vsvcLister, druleLister := getIstioListers(client) - r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) - client.ClearActions() - - vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes - vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes - vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes - _, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) - assert.Error(t, err, "expected destination rule not found") -} - func TestHttpReconcileHeaderRouteHostBased(t *testing.T) { ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) obj := unstructuredutil.StrToUnstructuredUnsafe(regularVsvc) From 79fbb6075bdf8698eb5dc53a6e6fe097a0bdf5ca Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 4 Dec 2023 09:32:53 -0600 Subject: [PATCH 158/159] fix: rollouts getting stuck due to bad rs informer updates (#3200) * fix: for rollouts getting stuck due to bad rs informer updates Signed-off-by: Zach Aller * fix error msg Signed-off-by: Zach Aller * change logic Signed-off-by: Zach Aller * error fmt Signed-off-by: Zach Aller * change if logic Signed-off-by: Zach Aller * add test Signed-off-by: Zach Aller * cleanup test Signed-off-by: Zach Aller * cleanup test Signed-off-by: Zach Aller * do not double call Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/replicaset.go | 20 +++++++++++----- rollout/replicaset_test.go | 47 ++++++++++++++++++++++++++++++++++---- rollout/sync.go | 18 ++++++++++++--- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/rollout/replicaset.go b/rollout/replicaset.go index 7d9a71f62a..401e1b579d 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -35,9 +35,13 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { } patch := fmt.Sprintf(removeScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) - if err == nil { - c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) - c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + 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 } @@ -60,9 +64,13 @@ func (c *rolloutContext) addScaleDownDelay(rs *appsv1.ReplicaSet, scaleDownDelay deadline := timeutil.MetaNow().Add(scaleDownDelaySeconds).UTC().Format(time.RFC3339) patch := fmt.Sprintf(addScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, deadline) rs, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) - if err == nil { - c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) - c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + 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/replicaset_test.go b/rollout/replicaset_test.go index 262bd23dd7..d93fa7c546 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -1,6 +1,7 @@ package rollout import ( + "fmt" "strconv" "testing" "time" @@ -134,8 +135,9 @@ func TestReconcileNewReplicaSet(t *testing.T) { abortScaleDownAnnotated bool abortScaleDownDelayPassed bool expectedNewReplicas int + failRSUpdate bool + abort bool }{ - { name: "New Replica Set matches rollout replica: No scale", rolloutReplicas: 10, @@ -163,6 +165,7 @@ func TestReconcileNewReplicaSet(t *testing.T) { newReplicas: 10, // ScaleDownOnAbort: true, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: true, abortScaleDownDelayPassed: true, scaleExpected: true, @@ -174,6 +177,7 @@ func TestReconcileNewReplicaSet(t *testing.T) { newReplicas: 8, // ScaleDownOnAbort: true, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: true, abortScaleDownDelayPassed: false, scaleExpected: false, @@ -184,10 +188,20 @@ func TestReconcileNewReplicaSet(t *testing.T) { rolloutReplicas: 10, newReplicas: 10, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: false, scaleExpected: false, expectedNewReplicas: 0, }, + { + name: "Fail to update RS: No scale and add default annotation", + rolloutReplicas: 10, + newReplicas: 10, + scaleExpected: false, + failRSUpdate: true, + abort: true, + abortScaleDownDelaySeconds: -1, + }, } for i := range tests { test := tests[i] @@ -199,6 +213,12 @@ func TestReconcileNewReplicaSet(t *testing.T) { fake := fake.Clientset{} k8sfake := k8sfake.Clientset{} + if test.failRSUpdate { + k8sfake.PrependReactor("patch", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { + return true, &appsv1.ReplicaSet{}, fmt.Errorf("should not patch replica set") + }) + } + f := newFixture(t) defer f.Close() f.objects = append(f.objects, rollout) @@ -226,15 +246,22 @@ func TestReconcileNewReplicaSet(t *testing.T) { rollout: rollout, }, } - roCtx.enqueueRolloutAfter = func(obj interface{}, duration time.Duration) {} + roCtx.enqueueRolloutAfter = func(obj any, duration time.Duration) {} + + rollout.Status.Abort = test.abort + roCtx.stableRS.Status.AvailableReplicas = int32(test.rolloutReplicas) + rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AbortScaleDownDelaySeconds: &test.abortScaleDownDelaySeconds, + }, + } + if test.abortScaleDownDelaySeconds > 0 { - rollout.Status.Abort = true rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ BlueGreen: &v1alpha1.BlueGreenStrategy{ AbortScaleDownDelaySeconds: &test.abortScaleDownDelaySeconds, }, } - if test.abortScaleDownAnnotated { var deadline string if test.abortScaleDownDelayPassed { @@ -246,7 +273,19 @@ func TestReconcileNewReplicaSet(t *testing.T) { } } + if test.abortScaleDownDelaySeconds < 0 { + rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AbortScaleDownDelaySeconds: nil, + }, + } + } + scaled, err := roCtx.reconcileNewReplicaSet() + if test.failRSUpdate { + assert.Error(t, err) + return + } if err != nil { t.Errorf("unexpected error: %v", err) return diff --git a/rollout/sync.go b/rollout/sync.go index 25c0c14813..2baeac1698 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -91,7 +91,10 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { return nil, fmt.Errorf("error updating replicaset revision: %v", err) } c.log.Infof("Synced revision on ReplicaSet '%s' to '%s'", rs.Name, newRevision) - c.replicaSetInformer.GetIndexer().Update(rs) + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return nil, fmt.Errorf("error updating replicaset informer in syncReplicaSetRevision: %w", err) + } return rs, nil } @@ -372,12 +375,21 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, if fullScaleDown && !c.shouldDelayScaleDownOnAbort() { delete(rsCopy.Annotations, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) } + rs, err = c.kubeclientset.AppsV1().ReplicaSets(rsCopy.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) - if err == nil && sizeNeedsUpdate { + if err != nil { + return scaled, rs, fmt.Errorf("error updating replicaset %s: %w", rs.Name, err) + } + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + err = fmt.Errorf("error updating replicaset informer in scaleReplicaSet: %w", err) + return scaled, rs, err + } + + if sizeNeedsUpdate { scaled = true revision, _ := replicasetutil.Revision(rs) c.recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.ScalingReplicaSetReason}, conditions.ScalingReplicaSetMessage, scalingOperation, rs.Name, revision, oldScale, newScale) - c.replicaSetInformer.GetIndexer().Update(rs) } } return scaled, rs, err From c7f7d1eaa9dfab501c768e7869ad7d2d0338c489 Mon Sep 17 00:00:00 2001 From: Linus Ekman <46067241+linus345@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:06:32 +0100 Subject: [PATCH 159/159] build(deps): always resolve momentjs version 2.29.4 (#3182) Before this change both version 2.29.1 and version 2.29.4 of momentjs were brougth in. The bump from v2.29.1 -> v2.29.4 remediates two CVEs: CVE-2022-24785 [1] and CVE-2022-31129 [2]. The most notable change comes with the bump from v2.29.1 -> v2.29.2 which introduces a breaking change to remediate CVE-2022-24785: Forward slash and backward slash is no longer allowed in locale names. Locales containing either of those characters will not be loaded from the filesystem any longer [3]. Other than that it looks like there's only patch fixes which can be seen in the full changelog [4]. [1] https://github.com/moment/moment/security/advisories/GHSA-8hfj-j24r-96c4 [2] https://github.com/moment/moment/security/advisories/GHSA-wc69-rhjr-hc9g [3] https://gist.github.com/ichernev/1904b564f6679d9aac1ae08ce13bc45c [4] https://github.com/moment/moment/blob/536ad0c348f2f99009755698f491080757a48221/CHANGELOG.md Signed-off-by: Linus Ekman --- ui/package.json | 3 ++- ui/yarn.lock | 7 +------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ui/package.json b/ui/package.json index fac0a758f3..e7d8217969 100644 --- a/ui/package.json +++ b/ui/package.json @@ -71,6 +71,7 @@ "webpack-merge": "^5.7.3" }, "resolutions": { - "@types/react": "16.9.3" + "@types/react": "16.9.3", + "moment": "2.29.4" } } diff --git a/ui/yarn.lock b/ui/yarn.lock index 29f5446d37..447790e646 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -7973,12 +7973,7 @@ moment-timezone@^0.5.33: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.20.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -moment@^2.29.4: +moment@2.29.4, "moment@>= 2.9.0", moment@^2.20.1, moment@^2.29.4: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==