From ec26d7f7be710ac551c4be3fa35de6ada9433362 Mon Sep 17 00:00:00 2001 From: Rafael Franzke Date: Wed, 22 Dec 2021 15:01:29 +0100 Subject: [PATCH] Revendor `gardener/gardener@v1.38` and update Golang version to `1.17` (#364) * Revendor gardener/gardener, update Golang version * Address PR review feedback --- .test-defs/bastion-test.yaml | 2 +- .test-defs/infrastructure-test.yaml | 2 +- .test-defs/provider-gcp.yaml | 2 +- Dockerfile | 4 +- ...d.gardener.cloud_etcdcopybackupstasks.yaml | 197 ++ .../20-crd-druid.gardener.cloud_etcds.yaml | 56 +- ...crd-extensions.gardener.cloud_workers.yaml | 21 + ...urces.gardener.cloud_managedresources.yaml | 24 +- go.mod | 4 +- go.sum | 16 +- hack/tools.go | 1 + .../v1alpha1/zz_generated.conversion.go | 1 + .../config/v1alpha1/zz_generated.deepcopy.go | 1 + .../config/v1alpha1/zz_generated.defaults.go | 1 + pkg/apis/config/zz_generated.deepcopy.go | 1 + .../gcp/v1alpha1/zz_generated.conversion.go | 1 + .../gcp/v1alpha1/zz_generated.deepcopy.go | 1 + .../gcp/v1alpha1/zz_generated.defaults.go | 1 + pkg/apis/gcp/zz_generated.deepcopy.go | 1 + .../etcd-druid/api/v1alpha1/etcd_types.go | 109 +- .../api/v1alpha1/groupversion_info.go | 2 + .../api/v1alpha1/zz_generated.deepcopy.go | 188 +- .../etcd-druid/api/validation/etcd.go | 57 +- .../api/validation/etcdcopybackupstask.go | 68 + .../etcd-druid/pkg/utils/miscellaneous.go | 226 ++ .../gardener/gardener/charts/images.yaml | 10 +- .../pkg/controller/backupbucket/controller.go | 5 +- .../pkg/controller/backupentry/controller.go | 5 +- .../backupentry/genericactuator/actuator.go | 32 +- .../pkg/controller/backupentry/util.go | 4 + .../pkg/controller/bastion/controller.go | 5 +- .../extensions/pkg/controller/cmd/cmd.go | 3 +- .../pkg/controller/controlplane/controller.go | 5 +- .../controlplane/genericactuator/actuator.go | 94 +- .../pkg/controller/dnsrecord/controller.go | 5 +- .../controller/infrastructure/controller.go | 5 +- .../pkg/controller/worker/controller.go | 5 +- .../pkg/controller/worker/machines.go | 6 +- .../pkg/controller/worker/reconciler.go | 5 +- .../extensions/pkg/webhook/handler.go | 1 + .../extensions/pkg/webhook/mutator.go | 17 + .../extensions/pkg/webhook/registration.go | 1 + .../extensions/pkg/webhook/webhook.go | 19 +- .../gardener/gardener/hack/check-docforge.sh | 39 + .../hack/generate-imagename-constants.sh | 10 +- .../gardener/hack/generate-seed-crds.sh | 5 +- .../gardener/gardener/hack/tools.mk | 6 + .../gardener/gardener/hack/update-codegen.sh | 2 +- .../gardener/pkg/apis/core/helper/helpers.go | 21 + .../pkg/apis/core/types_secretbinding.go | 11 + .../gardener/pkg/apis/core/types_seed.go | 39 +- .../gardener/pkg/apis/core/types_shoot.go | 7 + .../v1alpha1/constants/types_constants.go | 3 + .../pkg/apis/core/v1alpha1/defaults.go | 46 +- .../pkg/apis/core/v1alpha1/generated.pb.go | 3100 +++++++++++------ .../pkg/apis/core/v1alpha1/generated.proto | 71 +- .../pkg/apis/core/v1alpha1/helper/helper.go | 13 - .../apis/core/v1alpha1/types_secretbinding.go | 12 + .../pkg/apis/core/v1alpha1/types_seed.go | 43 +- .../pkg/apis/core/v1alpha1/types_shoot.go | 10 + .../core/v1alpha1/zz_generated.conversion.go | 162 + .../core/v1alpha1/zz_generated.deepcopy.go | 115 + .../core/v1alpha1/zz_generated.defaults.go | 5 + .../core/v1beta1/constants/types_constants.go | 12 +- .../pkg/apis/core/v1beta1/defaults.go | 46 +- .../pkg/apis/core/v1beta1/generated.pb.go | 2515 +++++++++---- .../pkg/apis/core/v1beta1/generated.proto | 71 +- .../core/v1beta1/helper/condition_builder.go | 52 +- .../pkg/apis/core/v1beta1/helper/errors.go | 56 + .../pkg/apis/core/v1beta1/helper/helper.go | 98 +- .../apis/core/v1beta1/types_secretbinding.go | 12 + .../pkg/apis/core/v1beta1/types_seed.go | 43 +- .../pkg/apis/core/v1beta1/types_shoot.go | 10 + .../core/v1beta1/zz_generated.conversion.go | 162 + .../core/v1beta1/zz_generated.deepcopy.go | 115 + .../core/v1beta1/zz_generated.defaults.go | 5 + .../pkg/apis/core/validation/backupentry.go | 2 - .../pkg/apis/core/validation/secretbinding.go | 24 + .../pkg/apis/core/validation/shoot.go | 71 +- .../pkg/apis/core/zz_generated.deepcopy.go | 115 + .../apis/extensions/v1alpha1/types_worker.go | 12 + .../v1alpha1/zz_generated.deepcopy.go | 33 + .../apis/extensions/validation/backupentry.go | 1 - .../pkg/apis/extensions/validation/worker.go | 8 + .../pkg/apis/resources/v1alpha1/types.go | 37 +- .../pkg/client/kubernetes/cache/cache.go | 7 +- .../gardener/pkg/client/kubernetes/client.go | 67 +- .../clientmap/internal/garden_clientmap.go | 7 +- .../clientmap/internal/generic_clientmap.go | 14 +- .../kubernetes/clientmap/internal/log.go | 21 + .../clientmap/internal/plant_clientmap.go | 7 +- .../clientmap/internal/seed_clientmap.go | 7 +- .../clientmap/internal/shoot_clientmap.go | 54 +- .../pkg/client/kubernetes/clientset.go | 8 +- .../gardener/pkg/client/kubernetes/options.go | 31 +- .../pkg/controllerutils/associations.go | 10 +- .../gardener/pkg/controllerutils/worker.go | 72 +- .../pkg/extensions/customresources.go | 1 + .../gardener/pkg/features/features.go | 47 +- .../pkg/gardenlet/apis/config/types.go | 50 + .../apis/config/v1alpha1/defaults.go | 8 + .../gardenlet/apis/config/v1alpha1/types.go | 62 + .../v1alpha1/zz_generated.conversion.go | 136 + .../config/v1alpha1/zz_generated.deepcopy.go | 124 + .../apis/config/zz_generated.deepcopy.go | 124 + .../pkg/gardenlet/features/features.go | 21 +- .../gardener/gardener/pkg/logger/logger.go | 32 + .../gardener/gardener/pkg/logger/logrus.go | 32 +- .../gardener/pkg/operation/botanist/addons.go | 128 +- .../pkg/operation/botanist/backupentry.go | 55 +- .../pkg/operation/botanist/botanist.go | 15 +- .../operation/botanist/clusterautoscaler.go | 4 - .../component/backupentry/backupentry.go | 54 +- .../clusterautoscaler/cluster_autoscaler.go | 91 +- .../botanist/component/coredns/coredns.go | 10 +- .../botanist/component/coredns/monitoring.go | 12 +- .../component/dependencywatchdog/access.go | 96 + .../{dependency_watchdog.go => bootstrap.go} | 116 +- .../botanist/component/etcd/bootstrap.go | 642 +++- .../operation/botanist/component/etcd/etcd.go | 82 +- .../etcdcopybackupstask.go | 202 ++ .../crds/templates/crd-dnsowner.tpl.yaml | 2 +- .../crds/templates/crd-dnsprovider.tpl.yaml | 26 + .../crds/templates/crd-worker.tpl.yaml | 21 + .../component/extensions/dns/dnsentry.go | 4 +- .../component/extensions/dns/dnsowner.go | 4 +- .../component/extensions/dns/dnsprovider.go | 4 +- .../extensions/dnsrecord/dnsrecord.go | 22 +- .../infrastructure/infrastructure.go | 4 +- .../scripts/download-cloud-config.tpl.sh | 10 +- .../scripts/execute-cloud-config.tpl.sh | 44 +- .../operatingsystemconfig.go | 54 +- .../original/components/kubelet.go | 2 + .../original/components/kubelet/config.go | 6 +- .../component/extensions/worker/worker.go | 41 + .../component/gardeneraccess/access.go | 148 + .../gardener_kube_scheduler.go | 17 +- .../component/istio/ingress_gateway.go | 2 +- .../kubeapiserver/dependency_watchdog.go | 12 +- .../component/kubeapiserver/kube_apiserver.go | 2 + .../component/kubeapiserver/monitoring.go | 5 +- .../kube_controller_manager.go | 75 +- .../kubecontrollermanager/monitoring.go | 5 +- .../kubecontrollermanager/shoot_resources.go | 38 +- .../component/kubescheduler/monitoring.go | 5 +- .../component/logging/kube_rbac_proxy.go | 108 +- .../component/metricsserver/metrics_server.go | 5 + .../resourcemanager/resource_manager.go | 288 +- .../seedadmissioncontroller.go | 9 +- .../vpnseedserver/vpn_seed_server.go | 95 +- .../botanist/component/vpnshoot/logging.go | 42 + .../botanist/component/vpnshoot/monitoring.go | 43 + .../botanist/component/vpnshoot/vpnshoot.go | 596 ++++ .../pkg/operation/botanist/controlplane.go | 28 +- .../operation/botanist/dependency_watchdog.go | 43 + .../gardener/pkg/operation/botanist/dns.go | 6 +- .../pkg/operation/botanist/dnsrecord.go | 37 +- .../pkg/operation/botanist/dnsresources.go | 5 +- .../gardener/pkg/operation/botanist/etcd.go | 9 + .../operation/botanist/etcdcopybackupstask.go | 96 + .../pkg/operation/botanist/etcdencryption.go | 2 +- .../pkg/operation/botanist/gardeneraccess.go | 43 + .../botanist/kubecontrollermanager.go | 1 - .../pkg/operation/botanist/logging.go | 36 +- .../operation/botanist/managedresources.go | 26 +- .../pkg/operation/botanist/migration.go | 44 + .../pkg/operation/botanist/monitoring.go | 26 +- .../botanist/operatingsystemconfig.go | 24 +- .../operation/botanist/resource_manager.go | 31 +- .../pkg/operation/botanist/secrets.go | 74 +- .../pkg/operation/botanist/vpnshoot.go | 100 + .../pkg/operation/botanist/wanted_secrets.go | 228 +- .../gardener/pkg/operation/botanist/worker.go | 1 + .../gardener/pkg/operation/common/types.go | 9 - .../gardener/pkg/operation/common/utils.go | 33 +- .../gardener/pkg/operation/garden/garden.go | 4 +- .../gardener/pkg/operation/operation.go | 21 +- .../gardener/pkg/operation/seed/components.go | 126 +- .../gardener/pkg/operation/seed/seed.go | 120 +- .../gardener/pkg/operation/shoot/status.go | 7 +- .../gardener/pkg/operation/shoot/types.go | 22 +- .../controller/rootcapublisher/add.go | 143 + .../controller/rootcapublisher/reconciler.go | 94 + .../webhook/projectedtokenmount/add.go | 72 + .../webhook/projectedtokenmount/handler.go | 184 + .../webhook/tokeninvalidator/add.go | 34 + .../webhook/tokeninvalidator/handler.go | 70 + .../scheduler/controller/shoot/reconciler.go | 15 +- .../scheduler/controller/shoot/scheduler.go | 1 - .../gardener/pkg/utils/gardener/seed.go | 37 +- .../gardener/pkg/utils/gardener/shoot.go | 17 + .../pkg/utils/kubernetes/eventhandler.go | 5 - .../managedresources/managedresources.go | 21 + .../pkg/utils/managedresources/registry.go | 2 +- .../gardener/pkg/utils/miscellaneous.go | 9 + .../gardener/test/framework/gardener_utils.go | 5 + .../test/framework/gardenerframework.go | 11 +- .../gardener/test/framework/k8s_utils.go | 4 + .../gardener/test/framework/shoot_utils.go | 5 + .../test/framework/shootcreationframework.go | 28 +- .../gardener/test/framework/shootframework.go | 30 +- .../test/framework/shootmigrationtest.go | 45 +- .../gardener/test/framework/worker_utils.go | 18 +- .../api/analysis/v1alpha1/message.gen.json | 47 +- .../api/meta/v1alpha1/status.gen.json | 123 +- .../v1alpha3/destination_rule.gen.json | 634 ++-- .../v1alpha3/destination_rule.pb.go | 586 +++- .../v1alpha3/destination_rule.proto | 149 +- .../networking/v1alpha3/envoy_filter.gen.json | 417 ++- .../networking/v1alpha3/envoy_filter.pb.go | 303 +- .../networking/v1alpha3/envoy_filter.proto | 65 +- .../v1alpha3/envoy_filter_deepcopy.gen.go | 42 +- .../v1alpha3/envoy_filter_json.gen.go | 42 +- .../api/networking/v1alpha3/gateway.gen.json | 129 +- .../api/networking/v1alpha3/gateway.pb.go | 6 +- .../api/networking/v1alpha3/gateway.proto | 10 +- .../v1alpha3/service_entry.gen.json | 121 +- .../networking/v1alpha3/service_entry.pb.go | 87 +- .../networking/v1alpha3/service_entry.proto | 17 +- .../api/networking/v1alpha3/sidecar.gen.json | 207 +- .../api/networking/v1alpha3/sidecar.pb.go | 3 + .../api/networking/v1alpha3/sidecar.proto | 5 +- .../v1alpha3/virtual_service.gen.json | 1013 +++--- .../networking/v1alpha3/virtual_service.pb.go | 515 ++- .../networking/v1alpha3/virtual_service.proto | 51 +- .../v1alpha3/workload_entry.gen.json | 37 +- .../networking/v1alpha3/workload_entry.pb.go | 3 + .../networking/v1alpha3/workload_entry.proto | 3 + .../v1alpha3/workload_group.gen.json | 205 +- .../v1beta1/destination_rule.gen.json | 634 ++-- .../networking/v1beta1/destination_rule.pb.go | 584 +++- .../networking/v1beta1/destination_rule.proto | 133 +- .../api/networking/v1beta1/gateway.gen.json | 129 +- .../api/networking/v1beta1/gateway.pb.go | 19 +- .../api/networking/v1beta1/gateway.proto | 19 +- .../networking/v1beta1/service_entry.gen.json | 91 +- .../networking/v1beta1/service_entry.pb.go | 87 +- .../networking/v1beta1/service_entry.proto | 17 +- .../api/networking/v1beta1/sidecar.gen.json | 207 +- .../api/networking/v1beta1/sidecar.pb.go | 3 + .../api/networking/v1beta1/sidecar.proto | 5 +- .../v1beta1/virtual_service.gen.json | 1013 +++--- .../networking/v1beta1/virtual_service.pb.go | 508 ++- .../networking/v1beta1/virtual_service.proto | 50 +- .../v1beta1/workload_entry.gen.json | 37 +- .../networking/v1beta1/workload_entry.pb.go | 3 + .../networking/v1beta1/workload_entry.proto | 4 +- .../pkg/apis/networking/v1alpha3/types.gen.go | 20 +- .../v1alpha3/zz_generated.deepcopy.gen.go | 1 + .../pkg/apis/networking/v1beta1/types.gen.go | 20 +- .../v1beta1/zz_generated.deepcopy.gen.go | 1 + vendor/modules.txt | 15 +- 252 files changed, 16474 insertions(+), 6620 deletions(-) create mode 100644 example/20-crd-druid.gardener.cloud_etcdcopybackupstasks.yaml create mode 100644 vendor/github.com/gardener/etcd-druid/api/validation/etcdcopybackupstask.go create mode 100644 vendor/github.com/gardener/etcd-druid/pkg/utils/miscellaneous.go create mode 100755 vendor/github.com/gardener/gardener/hack/check-docforge.sh create mode 100644 vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/log.go create mode 100644 vendor/github.com/gardener/gardener/pkg/logger/logger.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go rename vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/{dependency_watchdog.go => bootstrap.go} (78%) create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcdcopybackupstask/etcdcopybackupstask.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardeneraccess/access.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/logging.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/monitoring.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/vpnshoot.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/dependency_watchdog.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/etcdcopybackupstask.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/gardeneraccess.go create mode 100644 vendor/github.com/gardener/gardener/pkg/operation/botanist/vpnshoot.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/controller/rootcapublisher/add.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/controller/rootcapublisher/reconciler.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/webhook/projectedtokenmount/add.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/webhook/projectedtokenmount/handler.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/webhook/tokeninvalidator/add.go create mode 100644 vendor/github.com/gardener/gardener/pkg/resourcemanager/webhook/tokeninvalidator/handler.go diff --git a/.test-defs/bastion-test.yaml b/.test-defs/bastion-test.yaml index 14805eade..ebf49430e 100644 --- a/.test-defs/bastion-test.yaml +++ b/.test-defs/bastion-test.yaml @@ -15,4 +15,4 @@ spec: --service-account="${SERVICEACCOUNT_JSON}" --region=$REGION - image: golang:1.16.3 + image: golang:1.17.5 diff --git a/.test-defs/infrastructure-test.yaml b/.test-defs/infrastructure-test.yaml index 487555986..75c5012ff 100644 --- a/.test-defs/infrastructure-test.yaml +++ b/.test-defs/infrastructure-test.yaml @@ -15,4 +15,4 @@ spec: --service-account="${SERVICEACCOUNT_JSON}" --region=$REGION - image: golang:1.16.3 + image: golang:1.17.5 diff --git a/.test-defs/provider-gcp.yaml b/.test-defs/provider-gcp.yaml index a035b3474..cf95bbae2 100644 --- a/.test-defs/provider-gcp.yaml +++ b/.test-defs/provider-gcp.yaml @@ -15,4 +15,4 @@ spec: --zone=$ZONE --network-worker-cidr=$NETWORK_WORKER_CIDR - image: golang:1.16.3 + image: golang:1.17.5 diff --git a/Dockerfile b/Dockerfile index c1eb4cb67..d8c7bc974 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ ############# builder -FROM golang:1.16.3 AS builder +FROM golang:1.17.5 AS builder WORKDIR /go/src/github.com/gardener/gardener-extension-provider-gcp COPY . . RUN make install ############# base image -FROM alpine:3.13.4 AS base +FROM alpine:3.13.7 AS base ############# gardener-extension-provider-gcp FROM base AS gardener-extension-provider-gcp diff --git a/example/20-crd-druid.gardener.cloud_etcdcopybackupstasks.yaml b/example/20-crd-druid.gardener.cloud_etcdcopybackupstasks.yaml new file mode 100644 index 000000000..320b04591 --- /dev/null +++ b/example/20-crd-druid.gardener.cloud_etcdcopybackupstasks.yaml @@ -0,0 +1,197 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + name: etcdcopybackupstasks.druid.gardener.cloud +spec: + group: druid.gardener.cloud + names: + kind: EtcdCopyBackupsTask + listKind: EtcdCopyBackupsTaskList + plural: etcdcopybackupstasks + singular: etcdcopybackupstask + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: EtcdCopyBackupsTask is a task for copying etcd backups from a + source to a target store. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: EtcdCopyBackupsTaskSpec defines the parameters for the copy + backups task. + properties: + maxBackupAge: + description: MaxBackupAge is the maximum age in days that a backup + must have in order to be copied. By default all backups will be + copied. + format: int32 + type: integer + maxBackups: + description: MaxBackups is the maximum number of backups that will + be copied starting with the most recent ones. + format: int32 + type: integer + sourceStore: + description: SourceStore defines the specification of the source object + store provider for storing backups. + properties: + container: + description: Container is the name of the container the backup + is stored at. + type: string + prefix: + description: Prefix is the prefix used for the store. + type: string + provider: + description: Provider is the name of the backup provider. + type: string + secretRef: + description: SecretRef is the reference to the secret which used + to connect to the backup store. + properties: + name: + description: Name is unique within a namespace to reference + a secret resource. + type: string + namespace: + description: Namespace defines the space within which the + secret name must be unique. + type: string + type: object + required: + - prefix + type: object + targetStore: + description: TargetStore defines the specification of the target object + store provider for storing backups. + properties: + container: + description: Container is the name of the container the backup + is stored at. + type: string + prefix: + description: Prefix is the prefix used for the store. + type: string + provider: + description: Provider is the name of the backup provider. + type: string + secretRef: + description: SecretRef is the reference to the secret which used + to connect to the backup store. + properties: + name: + description: Name is unique within a namespace to reference + a secret resource. + type: string + namespace: + description: Namespace defines the space within which the + secret name must be unique. + type: string + type: object + required: + - prefix + type: object + waitForFinalSnapshot: + description: WaitForFinalSnapshot defines the parameters for waiting + for a final full snapshot before copying backups. + properties: + enabled: + description: Enabled specifies whether to wait for a final full + snapshot before copying backups. + type: boolean + timeout: + description: Timeout is the timeout for waiting for a final full + snapshot. When this timeout expires, the copying of backups + will be performed anyway. No timeout or 0 means wait forever. + type: string + required: + - enabled + type: object + required: + - sourceStore + - targetStore + type: object + status: + description: EtcdCopyBackupsTaskStatus defines the observed state of the + copy backups task. + properties: + conditions: + description: Conditions represents the latest available observations + of an object's current state. + items: + description: Condition holds the information about the state of + a resource. + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + lastUpdateTime: + description: Last time the condition was updated. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of the Etcd condition. + type: string + required: + - lastTransitionTime + - lastUpdateTime + - message + - reason + - status + - type + type: object + type: array + lastError: + description: LastError represents the last occurred error. + type: string + observedGeneration: + description: ObservedGeneration is the most recent generation observed + for this resource. + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/example/20-crd-druid.gardener.cloud_etcds.yaml b/example/20-crd-druid.gardener.cloud_etcds.yaml index 4edbd816c..88bff48f1 100644 --- a/example/20-crd-druid.gardener.cloud_etcds.yaml +++ b/example/20-crd-druid.gardener.cloud_etcds.yaml @@ -51,10 +51,33 @@ spec: description: BackupSpec defines parametes associated with the full and delta snapshots of etcd properties: - backupCompactionSchedule: - description: BackupCompactionSchedule defines the cron standard - for compacting the snapstore - type: string + compactionResources: + description: 'CompactionResources defines the compute Resources + required by compaction job. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + type: object compression: description: SnapshotCompression defines the specification for compression of Snapshots. @@ -108,6 +131,31 @@ spec: image: description: Image defines the etcd container image and tag type: string + ownerCheck: + description: OwnerCheck defines parameters related to checking + if the cluster owner, as specified in the owner DNS record, + is the expected one. + properties: + dnsCacheTTL: + description: DNSCacheTTL is the DNS cache TTL for owner checks. + type: string + id: + description: ID is the owner id value that is expected to + be found in the owner DNS record. + type: string + interval: + description: Interval is the time interval between owner checks. + type: string + name: + description: Name is the domain name of the owner DNS record. + type: string + timeout: + description: Timeout is the timeout for owner checks. + type: string + required: + - id + - name + type: object port: description: Port define the port on which etcd-backup-restore server will exposed. diff --git a/example/20-crd-extensions.gardener.cloud_workers.yaml b/example/20-crd-extensions.gardener.cloud_workers.yaml index 2fec095a8..4e4048665 100644 --- a/example/20-crd-extensions.gardener.cloud_workers.yaml +++ b/example/20-crd-extensions.gardener.cloud_workers.yaml @@ -99,6 +99,10 @@ spec: description: KubeletDataVolumeName contains the name of a dataVolume that should be used for storing kubelet state. type: string + kubernetesVersion: + description: KubernetesVersion is the kubernetes version in + this worker pool + type: string labels: additionalProperties: type: string @@ -180,6 +184,23 @@ spec: name: description: Name is the name of this worker pool. type: string + nodeTemplate: + description: NodeTemplate contains resource information of the + machine which is used by Cluster Autoscaler to generate nodeTemplate + during scaling a nodeGroup from zero + properties: + capacity: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Capacity represents the expected Node capacity. + type: object + required: + - capacity + type: object providerConfig: description: ProviderConfig is a provider specific configuration for the worker pool. diff --git a/example/20-crd-resources.gardener.cloud_managedresources.yaml b/example/20-crd-resources.gardener.cloud_managedresources.yaml index 98926aab1..62309bca5 100644 --- a/example/20-crd-resources.gardener.cloud_managedresources.yaml +++ b/example/20-crd-resources.gardener.cloud_managedresources.yaml @@ -13,10 +13,30 @@ spec: kind: ManagedResource listKind: ManagedResourceList plural: managedresources + shortNames: + - mr singular: managedresource scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - description: The class identifies which resource manager is responsible for + this ManagedResource. + jsonPath: .spec.class + name: Class + type: date + - description: ' Indicates whether all resources have been applied.' + jsonPath: .status.conditions[?(@.type=="ResourcesApplied")].status + name: Applied + type: string + - description: Indicates whether all resources are healthy. + jsonPath: .status.conditions[?(@.type=="ResourcesHealthy")].status + name: Healthy + type: string + - description: creation timestamp + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: ManagedResource describes a list of managed resources. @@ -205,6 +225,8 @@ spec: type: object served: true storage: true + subresources: + status: {} status: acceptedNames: kind: "" diff --git a/go.mod b/go.mod index e236d0a42..a52b93adb 100644 --- a/go.mod +++ b/go.mod @@ -8,8 +8,8 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible github.com/ahmetb/gen-crd-api-reference-docs v0.2.0 github.com/coreos/go-systemd/v22 v22.3.2 - github.com/gardener/etcd-druid v0.6.1-0.20211022081522-071746e9d0bd - github.com/gardener/gardener v1.36.0 + github.com/gardener/etcd-druid v0.7.0 + github.com/gardener/gardener v1.38.1 github.com/gardener/machine-controller-manager v0.36.0 github.com/go-logr/logr v0.4.0 github.com/golang/mock v1.6.0 diff --git a/go.sum b/go.sum index 95f7b9512..50644cccb 100644 --- a/go.sum +++ b/go.sum @@ -224,8 +224,8 @@ github.com/gardener/etcd-druid v0.1.12/go.mod h1:yZrUQY9clD8/ZXK+MmEq8OS1TaKJeip github.com/gardener/etcd-druid v0.1.15/go.mod h1:BHXG8N04Dl4On7Ie6cErwmpvzncNrmeb+HO7Sqrhf+A= github.com/gardener/etcd-druid v0.3.0/go.mod h1:uxZjZ57gIgpX554vGp495g2i8DByoS3OkVtiqsxtbwk= github.com/gardener/etcd-druid v0.5.0/go.mod h1:Ca2ZM9dyMdZI6k5RW4wu8CG8q5cNeF/HSE2P+hut0+g= -github.com/gardener/etcd-druid v0.6.1-0.20211022081522-071746e9d0bd h1:u/Y/3mlnrU9zMf2Z29AfRki+PjJlbADmhUYX+sxdb5M= -github.com/gardener/etcd-druid v0.6.1-0.20211022081522-071746e9d0bd/go.mod h1:BukSWtT9sxjCa3H4q2biJMIo52o+57MuBBifzzZkhPo= +github.com/gardener/etcd-druid v0.7.0 h1:l1cH4VzaVbG1PSt+VTyQuzHFwworMQHK+5SXUS+7Mp8= +github.com/gardener/etcd-druid v0.7.0/go.mod h1:mxKujGcT1iduAa9bos1LWMEJUIOlOL/TegicbsiH2Vk= github.com/gardener/external-dns-management v0.7.3/go.mod h1:Y3om11E865x4aQ7cmcHjknb8RMgCO153huRb/SvP+9o= github.com/gardener/external-dns-management v0.7.7/go.mod h1:egCe/FPOsUbXA4WV0ne3h7nAD/nLT09hNt/FQQXK+ec= github.com/gardener/external-dns-management v0.7.18 h1:15uIyFfZSbR8fivnXvqb1Dvv4QqzfNYxEFUQ9K+mpsE= @@ -237,8 +237,8 @@ github.com/gardener/gardener v1.6.5/go.mod h1:w5IHIQDccvSxZJFOtBa8YConyyFgt07DBH github.com/gardener/gardener v1.11.3/go.mod h1:5DzqfOm+G8UftKu5zUbYJ+9Cnfd4XrvRNDabkM9AIp4= github.com/gardener/gardener v1.17.1/go.mod h1:uucRHq0xV46xd9MpJJjRswx/Slq3+ipbbJg09FVUtvM= github.com/gardener/gardener v1.23.0/go.mod h1:xS/sYyzYsq2W0C79mT98G/qoOTvy/hHTfApHIVF3v2o= -github.com/gardener/gardener v1.36.0 h1:JfkSDsOI5QKylDJpzpBXZ4IxmhK+n5AMhOyWj/pYIGg= -github.com/gardener/gardener v1.36.0/go.mod h1:aVEbZy2WybsuwfXfUFNfOYz1JOmMjEOeYbv+sN9PzE0= +github.com/gardener/gardener v1.38.1 h1:lqI3VTSgrD9L5sAT3QlVFTBCutc2ey9dvDrSODSWWho= +github.com/gardener/gardener v1.38.1/go.mod h1:f/JP0PoYUe3OUKDIYRHKELauY8YJvxhfoadVS+C9yk4= github.com/gardener/gardener-resource-manager v0.10.0/go.mod h1:0pKTHOhvU91eQB0EYr/6Ymd7lXc/5Hi8P8tF/gpV0VQ= github.com/gardener/gardener-resource-manager v0.13.1/go.mod h1:0No/XttYRUwDn5lSppq9EqlKdo/XJQ44aCZz5BVu3Vw= github.com/gardener/gardener-resource-manager v0.18.0/go.mod h1:k53Yw2iDAIpTxnChQY9qFHrRtuPQWJDNnCP9eE6TnWQ= @@ -1306,11 +1306,11 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= istio.io/api v0.0.0-20201123152548-197f11e4ea09/go.mod h1:88HN3o1fSD1jo+Z1WTLlJfMm9biopur6Ct9BFKjiB64= -istio.io/api v0.0.0-20210520012029-891c0c12abfd h1:dWjRhE9EVXl6Zxi6Bas3LQwt9sX0iUMXCT0kBFZtDhA= -istio.io/api v0.0.0-20210520012029-891c0c12abfd/go.mod h1:nsSFw1LIMmGL7r/+6fJI6FxeG/UGlLxRK8bkojIvBVs= +istio.io/api v0.0.0-20211118170605-3f0f902cdfd1 h1:unlpbrna/y/ofrSDcEnpT2O+ViQoVKzXGPw+M8ayEn0= +istio.io/api v0.0.0-20211118170605-3f0f902cdfd1/go.mod h1:lavaUNsnT7RGyMFNOGgV5XvOgP3fkTSZkxP/0H/ISt4= istio.io/client-go v1.8.1/go.mod h1:Qymv71lwIqjDTkaE2NqBYLL+Bl5KsCfzEDhntXypHYY= -istio.io/client-go v1.10.1 h1:21x+zCjnkBqFXVcrPdnao+f0rTH8EdkRreZy8yTa/2Q= -istio.io/client-go v1.10.1/go.mod h1:xiCalTDM2HqP1KGxMOt+OOkqCLOI6QrwQMb95cSWw9U= +istio.io/client-go v1.12.0 h1:AO847P/Dt2k1ZJtwoFck2Joap1CZv+g1eGXNhZs7mek= +istio.io/client-go v1.12.0/go.mod h1:Y46Rc0vTVHogmIXnGMCsb19Bc0XIMhOEnZUr+5ZxMmo= istio.io/gogo-genproto v0.0.0-20190930162913-45029607206a/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= istio.io/gogo-genproto v0.0.0-20210113155706-4daf5697332f h1:9710FpGLvIJ1GGEbpuTh1smVBv+r8cJfR3G82ouSxIQ= istio.io/gogo-genproto v0.0.0-20210113155706-4daf5697332f/go.mod h1:6BwTZRNbWS570wHX/uR1Wqk5e0157TofTAUMzT7N4+s= diff --git a/hack/tools.go b/hack/tools.go index 8dba95db4..f08b1b7e3 100644 --- a/hack/tools.go +++ b/hack/tools.go @@ -1,3 +1,4 @@ +//go:build tools // +build tools // Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file diff --git a/pkg/apis/config/v1alpha1/zz_generated.conversion.go b/pkg/apis/config/v1alpha1/zz_generated.conversion.go index 1820fea2d..14cf058fe 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/config/v1alpha1/zz_generated.conversion.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go index 8bed12e43..418e85ffe 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/config/v1alpha1/zz_generated.defaults.go b/pkg/apis/config/v1alpha1/zz_generated.defaults.go index 95e01b69d..fe2d0232f 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/config/v1alpha1/zz_generated.defaults.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/config/zz_generated.deepcopy.go b/pkg/apis/config/zz_generated.deepcopy.go index 41a70c285..58662bf35 100644 --- a/pkg/apis/config/zz_generated.deepcopy.go +++ b/pkg/apis/config/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/gcp/v1alpha1/zz_generated.conversion.go b/pkg/apis/gcp/v1alpha1/zz_generated.conversion.go index 98bab597a..8376be271 100644 --- a/pkg/apis/gcp/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/gcp/v1alpha1/zz_generated.conversion.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/gcp/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/gcp/v1alpha1/zz_generated.deepcopy.go index 8a8fe9a83..8e34bfc81 100644 --- a/pkg/apis/gcp/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/gcp/v1alpha1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/gcp/v1alpha1/zz_generated.defaults.go b/pkg/apis/gcp/v1alpha1/zz_generated.defaults.go index 95e01b69d..fe2d0232f 100644 --- a/pkg/apis/gcp/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/gcp/v1alpha1/zz_generated.defaults.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/pkg/apis/gcp/zz_generated.deepcopy.go b/pkg/apis/gcp/zz_generated.deepcopy.go index 7eb75c21d..3729195c4 100644 --- a/pkg/apis/gcp/zz_generated.deepcopy.go +++ b/pkg/apis/gcp/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/etcd_types.go b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/etcd_types.go index 12a44e874..0dc08b268 100644 --- a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/etcd_types.go +++ b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/etcd_types.go @@ -103,6 +103,24 @@ type CompressionSpec struct { Policy *CompressionPolicy `json:"policy,omitempty"` } +// OwnerCheckSpec defines parameters related to checking if the cluster owner, as specified in the owner DNS record, +// is the expected one. +type OwnerCheckSpec struct { + // Name is the domain name of the owner DNS record. + Name string `json:"name"` + // ID is the owner id value that is expected to be found in the owner DNS record. + ID string `json:"id"` + // Interval is the time interval between owner checks. + // +optional + Interval *metav1.Duration `json:"interval,omitempty"` + // Timeout is the timeout for owner checks. + // +optional + Timeout *metav1.Duration `json:"timeout,omitempty"` + // DNSCacheTTL is the DNS cache TTL for owner checks. + // +optional + DNSCacheTTL *metav1.Duration `json:"dnsCacheTTL,omitempty"` +} + // BackupSpec defines parametes associated with the full and delta snapshots of etcd type BackupSpec struct { // Port define the port on which etcd-backup-restore server will exposed. @@ -120,6 +138,10 @@ type BackupSpec struct { // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ // +optional Resources *corev1.ResourceRequirements `json:"resources,omitempty"` + // CompactionResources defines the compute Resources required by compaction job. + // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // +optional + CompactionResources *corev1.ResourceRequirements `json:"compactionResources,omitempty"` // FullSnapshotSchedule defines the cron standard schedule for full snapshots. // +optional FullSnapshotSchedule *string `json:"fullSnapshotSchedule,omitempty"` @@ -141,12 +163,13 @@ type BackupSpec struct { // EnableProfiling defines if profiling should be enabled for the etcd-backup-restore-sidecar // +optional EnableProfiling *bool `json:"enableProfiling,omitempty"` - // BackupCompactionSchedule defines the cron standard for compacting the snapstore - // +optional - BackupCompactionSchedule *string `json:"backupCompactionSchedule,omitempty"` // EtcdSnapshotTimeout defines the timeout duration for etcd FullSnapshot operation // +optional EtcdSnapshotTimeout *metav1.Duration `json:"etcdSnapshotTimeout,omitempty"` + // OwnerCheck defines parameters related to checking if the cluster owner, as specified in the owner DNS record, + // is the expected one. + // +optional + OwnerCheck *OwnerCheckSpec `json:"ownerCheck,omitempty"` } // EtcdConfig defines parameters associated etcd deployed @@ -289,7 +312,7 @@ const ( EtcdMemberStatusReady EtcdMemberConditionStatus = "Ready" // EtcdMemberStatusNotReady means a etcd member is not ready. EtcdMemberStatusNotReady EtcdMemberConditionStatus = "NotReady" - // EtcdMemberStatusUnknown means the status of an etcd member is unkown. + // EtcdMemberStatusUnknown means the status of an etcd member is unknown. EtcdMemberStatusUnknown EtcdMemberConditionStatus = "Unknown" ) @@ -393,3 +416,81 @@ type EtcdList struct { metav1.ListMeta `json:"metadata,omitempty"` Items []Etcd `json:"items"` } + +// EtcdCopyBackupsTaskSpec defines the parameters for the copy backups task. +type EtcdCopyBackupsTaskSpec struct { + // SourceStore defines the specification of the source object store provider for storing backups. + SourceStore StoreSpec `json:"sourceStore"` + // TargetStore defines the specification of the target object store provider for storing backups. + TargetStore StoreSpec `json:"targetStore"` + // MaxBackupAge is the maximum age in days that a backup must have in order to be copied. + // By default all backups will be copied. + // +optional + MaxBackupAge *uint32 `json:"maxBackupAge,omitempty"` + // MaxBackups is the maximum number of backups that will be copied starting with the most recent ones. + // +optional + MaxBackups *uint32 `json:"maxBackups,omitempty"` + // WaitForFinalSnapshot defines the parameters for waiting for a final full snapshot before copying backups. + // +optional + WaitForFinalSnapshot *WaitForFinalSnapshotSpec `json:"waitForFinalSnapshot,omitempty"` +} + +// WaitForFinalSnapshotSpec defines the parameters for waiting for a final full snapshot before copying backups. +type WaitForFinalSnapshotSpec struct { + // Enabled specifies whether to wait for a final full snapshot before copying backups. + Enabled bool `json:"enabled"` + // Timeout is the timeout for waiting for a final full snapshot. When this timeout expires, the copying of backups + // will be performed anyway. No timeout or 0 means wait forever. + // +optional + Timeout *metav1.Duration `json:"timeout,omitempty"` +} + +// EtcdCopyBackupsTaskStatus defines the observed state of the copy backups task. +type EtcdCopyBackupsTaskStatus struct { + // Conditions represents the latest available observations of an object's current state. + // +patchMergeKey=type + // +patchStrategy=merge + // +optional + Conditions []Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` + // ObservedGeneration is the most recent generation observed for this resource. + // +optional + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + // LastError represents the last occurred error. + // +optional + LastError *string `json:"lastError,omitempty"` +} + +const ( + // EtcdCopyBackupsTaskSucceeded is a condition type indicating that a EtcdCopyBackupsTask has succeeded. + EtcdCopyBackupsTaskSucceeded ConditionType = "Succeeded" + // EtcdCopyBackupsTaskFailed is a condition type indicating that a EtcdCopyBackupsTask has failed. + EtcdCopyBackupsTaskFailed ConditionType = "Failed" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + +// EtcdCopyBackupsTask is a task for copying etcd backups from a source to a target store. +type EtcdCopyBackupsTask struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec EtcdCopyBackupsTaskSpec `json:"spec,omitempty"` + Status EtcdCopyBackupsTaskStatus `json:"status,omitempty"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// +kubebuilder:object:root=true + +// EtcdCopyBackupsTaskList contains a list of EtcdCopyBackupsTask objects. +type EtcdCopyBackupsTaskList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []EtcdCopyBackupsTask `json:"items"` +} diff --git a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/groupversion_info.go b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/groupversion_info.go index cb517fb7a..a652389ed 100644 --- a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/groupversion_info.go +++ b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/groupversion_info.go @@ -39,6 +39,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(GroupVersion, &Etcd{}, &EtcdList{}, + &EtcdCopyBackupsTask{}, + &EtcdCopyBackupsTaskList{}, ) metav1.AddToGroupVersion(scheme, GroupVersion) diff --git a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/zz_generated.deepcopy.go index 957e9b61d..f94820503 100644 --- a/vendor/github.com/gardener/etcd-druid/api/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/etcd-druid/api/v1alpha1/zz_generated.deepcopy.go @@ -52,6 +52,11 @@ func (in *BackupSpec) DeepCopyInto(out *BackupSpec) { *out = new(v1.ResourceRequirements) (*in).DeepCopyInto(*out) } + if in.CompactionResources != nil { + in, out := &in.CompactionResources, &out.CompactionResources + *out = new(v1.ResourceRequirements) + (*in).DeepCopyInto(*out) + } if in.FullSnapshotSchedule != nil { in, out := &in.FullSnapshotSchedule, &out.FullSnapshotSchedule *out = new(string) @@ -87,16 +92,16 @@ func (in *BackupSpec) DeepCopyInto(out *BackupSpec) { *out = new(bool) **out = **in } - if in.BackupCompactionSchedule != nil { - in, out := &in.BackupCompactionSchedule, &out.BackupCompactionSchedule - *out = new(string) - **out = **in - } if in.EtcdSnapshotTimeout != nil { in, out := &in.EtcdSnapshotTimeout, &out.EtcdSnapshotTimeout *out = new(metav1.Duration) **out = **in } + if in.OwnerCheck != nil { + in, out := &in.OwnerCheck, &out.OwnerCheck + *out = new(OwnerCheckSpec) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupSpec. @@ -253,6 +258,129 @@ func (in *EtcdConfig) DeepCopy() *EtcdConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdCopyBackupsTask) DeepCopyInto(out *EtcdCopyBackupsTask) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdCopyBackupsTask. +func (in *EtcdCopyBackupsTask) DeepCopy() *EtcdCopyBackupsTask { + if in == nil { + return nil + } + out := new(EtcdCopyBackupsTask) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EtcdCopyBackupsTask) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdCopyBackupsTaskList) DeepCopyInto(out *EtcdCopyBackupsTaskList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]EtcdCopyBackupsTask, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdCopyBackupsTaskList. +func (in *EtcdCopyBackupsTaskList) DeepCopy() *EtcdCopyBackupsTaskList { + if in == nil { + return nil + } + out := new(EtcdCopyBackupsTaskList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EtcdCopyBackupsTaskList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdCopyBackupsTaskSpec) DeepCopyInto(out *EtcdCopyBackupsTaskSpec) { + *out = *in + in.SourceStore.DeepCopyInto(&out.SourceStore) + in.TargetStore.DeepCopyInto(&out.TargetStore) + if in.MaxBackupAge != nil { + in, out := &in.MaxBackupAge, &out.MaxBackupAge + *out = new(uint32) + **out = **in + } + if in.MaxBackups != nil { + in, out := &in.MaxBackups, &out.MaxBackups + *out = new(uint32) + **out = **in + } + if in.WaitForFinalSnapshot != nil { + in, out := &in.WaitForFinalSnapshot, &out.WaitForFinalSnapshot + *out = new(WaitForFinalSnapshotSpec) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdCopyBackupsTaskSpec. +func (in *EtcdCopyBackupsTaskSpec) DeepCopy() *EtcdCopyBackupsTaskSpec { + if in == nil { + return nil + } + out := new(EtcdCopyBackupsTaskSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdCopyBackupsTaskStatus) DeepCopyInto(out *EtcdCopyBackupsTaskStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ObservedGeneration != nil { + in, out := &in.ObservedGeneration, &out.ObservedGeneration + *out = new(int64) + **out = **in + } + if in.LastError != nil { + in, out := &in.LastError, &out.LastError + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdCopyBackupsTaskStatus. +func (in *EtcdCopyBackupsTaskStatus) DeepCopy() *EtcdCopyBackupsTaskStatus { + if in == nil { + return nil + } + out := new(EtcdCopyBackupsTaskStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EtcdList) DeepCopyInto(out *EtcdList) { *out = *in @@ -432,6 +560,36 @@ func (in *EtcdStatus) DeepCopy() *EtcdStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OwnerCheckSpec) DeepCopyInto(out *OwnerCheckSpec) { + *out = *in + if in.Interval != nil { + in, out := &in.Interval, &out.Interval + *out = new(metav1.Duration) + **out = **in + } + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(metav1.Duration) + **out = **in + } + if in.DNSCacheTTL != nil { + in, out := &in.DNSCacheTTL, &out.DNSCacheTTL + *out = new(metav1.Duration) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OwnerCheckSpec. +func (in *OwnerCheckSpec) DeepCopy() *OwnerCheckSpec { + if in == nil { + return nil + } + out := new(OwnerCheckSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SharedConfig) DeepCopyInto(out *SharedConfig) { *out = *in @@ -504,3 +662,23 @@ func (in *TLSConfig) DeepCopy() *TLSConfig { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WaitForFinalSnapshotSpec) DeepCopyInto(out *WaitForFinalSnapshotSpec) { + *out = *in + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(metav1.Duration) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WaitForFinalSnapshotSpec. +func (in *WaitForFinalSnapshotSpec) DeepCopy() *WaitForFinalSnapshotSpec { + if in == nil { + return nil + } + out := new(WaitForFinalSnapshotSpec) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/github.com/gardener/etcd-druid/api/validation/etcd.go b/vendor/github.com/gardener/etcd-druid/api/validation/etcd.go index d00b632af..faab34a89 100644 --- a/vendor/github.com/gardener/etcd-druid/api/validation/etcd.go +++ b/vendor/github.com/gardener/etcd-druid/api/validation/etcd.go @@ -18,18 +18,19 @@ import ( "strings" "github.com/gardener/etcd-druid/api/v1alpha1" + "github.com/gardener/etcd-druid/pkg/utils" apiequality "k8s.io/apimachinery/pkg/api/equality" apivalidation "k8s.io/apimachinery/pkg/api/validation" "k8s.io/apimachinery/pkg/util/validation/field" ) -// ValidateEtcd validates Etcd object. +// ValidateEtcd validates a Etcd object. func ValidateEtcd(etcd *v1alpha1.Etcd) field.ErrorList { var allErrs field.ErrorList allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&etcd.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) - allErrs = append(allErrs, ValidateEtcdSpec(etcd, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidateEtcdSpec(&etcd.Spec, etcd.Name, etcd.Namespace, field.NewPath("spec"))...) return allErrs } @@ -45,19 +46,37 @@ func ValidateEtcdUpdate(new, old *v1alpha1.Etcd) field.ErrorList { return allErrs } -// ValidateEtcdSpec validates the specification of an Etd object. -func ValidateEtcdSpec(etcd *v1alpha1.Etcd, path *field.Path) field.ErrorList { +// ValidateEtcdSpec validates the specification of a Etcd object. +func ValidateEtcdSpec(spec *v1alpha1.EtcdSpec, name, namespace string, path *field.Path) field.ErrorList { var allErrs field.ErrorList - if etcd.Spec.Backup.Store != nil { - prefix := etcd.Spec.Backup.Store.Prefix - allErrs = append(allErrs, validateBackupStorePrefix(prefix, etcd.Name, etcd.Namespace, path.Child("backup.store"))...) + if spec.Backup.Store != nil { + allErrs = append(allErrs, validateStore(spec.Backup.Store, name, namespace, path.Child("backup.store"))...) + } + + if spec.Backup.OwnerCheck != nil { + ownerCheckPath := path.Child("backup.ownerCheck") + if spec.Backup.OwnerCheck.Name == "" { + allErrs = append(allErrs, field.Required(ownerCheckPath.Child("name"), "field is required")) + } + if spec.Backup.OwnerCheck.ID == "" { + allErrs = append(allErrs, field.Required(ownerCheckPath.Child("id"), "field is required")) + } + if spec.Backup.OwnerCheck.Interval != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Backup.OwnerCheck.Interval.Duration), ownerCheckPath.Child("interval"))...) + } + if spec.Backup.OwnerCheck.Timeout != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Backup.OwnerCheck.Timeout.Duration), ownerCheckPath.Child("timeout"))...) + } + if spec.Backup.OwnerCheck.DNSCacheTTL != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Backup.OwnerCheck.DNSCacheTTL.Duration), ownerCheckPath.Child("dnsCacheTTL"))...) + } } return allErrs } -// ValidateEtcdSpecUpdate validates the specification of an Etcd before an update. +// ValidateEtcdSpecUpdate validates the specification of a Etcd object before an update. func ValidateEtcdSpecUpdate(new, old *v1alpha1.EtcdSpec, deletionTimestampSet bool, path *field.Path) field.ErrorList { var allErrs field.ErrorList @@ -67,18 +86,32 @@ func ValidateEtcdSpecUpdate(new, old *v1alpha1.EtcdSpec, deletionTimestampSet bo } if new.Backup.Store != nil && old.Backup.Store != nil { - allErrs = append(allErrs, apivalidation.ValidateImmutableField(new.Backup.Store.Prefix, old.Backup.Store.Prefix, path.Child("backup.store.prefix"))...) + allErrs = append(allErrs, validateStoreUpdate(new.Backup.Store, old.Backup.Store, path.Child("backup.store"))...) } return allErrs } -func validateBackupStorePrefix(prefix, name, ns string, path *field.Path) field.ErrorList { +func validateStore(store *v1alpha1.StoreSpec, name, namespace string, path *field.Path) field.ErrorList { var allErrs field.ErrorList - if !(strings.Contains(prefix, ns) && strings.Contains(prefix, name)) { - allErrs = append(allErrs, field.Invalid(path.Child("prefix"), prefix, "field value must contain object name and namespace")) + if !(strings.Contains(store.Prefix, namespace) && strings.Contains(store.Prefix, name)) { + allErrs = append(allErrs, field.Invalid(path.Child("prefix"), store.Prefix, "must contain object name and namespace")) } + if store.Provider != nil && *store.Provider != "" { + if _, err := utils.StorageProviderFromInfraProvider(store.Provider); err != nil { + allErrs = append(allErrs, field.Invalid(path.Child("provider"), store.Provider, err.Error())) + } + } + + return allErrs +} + +func validateStoreUpdate(new, old *v1alpha1.StoreSpec, path *field.Path) field.ErrorList { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateImmutableField(new.Prefix, old.Prefix, path.Child("prefix"))...) + return allErrs } diff --git a/vendor/github.com/gardener/etcd-druid/api/validation/etcdcopybackupstask.go b/vendor/github.com/gardener/etcd-druid/api/validation/etcdcopybackupstask.go new file mode 100644 index 000000000..bbf4d6afd --- /dev/null +++ b/vendor/github.com/gardener/etcd-druid/api/validation/etcdcopybackupstask.go @@ -0,0 +1,68 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package validation + +import ( + "github.com/gardener/etcd-druid/api/v1alpha1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + apivalidation "k8s.io/apimachinery/pkg/api/validation" + "k8s.io/apimachinery/pkg/util/validation/field" +) + +// ValidateEtcdCopyBackupsTask validates a EtcdCopyBackupsTask object. +func ValidateEtcdCopyBackupsTask(task *v1alpha1.EtcdCopyBackupsTask) field.ErrorList { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&task.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + allErrs = append(allErrs, ValidateEtcdCopyBackupsTaskSpec(&task.Spec, task.Name, task.Namespace, field.NewPath("spec"))...) + + return allErrs +} + +// ValidateEtcdCopyBackupsTaskUpdate validates a EtcdCopyBackupsTask object before an update. +func ValidateEtcdCopyBackupsTaskUpdate(new, old *v1alpha1.EtcdCopyBackupsTask) field.ErrorList { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))...) + allErrs = append(allErrs, ValidateEtcdCopyBackupsTaskSpecUpdate(&new.Spec, &old.Spec, new.DeletionTimestamp != nil, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidateEtcdCopyBackupsTask(new)...) + + return allErrs +} + +// ValidateEtcdCopyBackupsTaskSpec validates the specification of a EtcdCopyBackupsTask object. +func ValidateEtcdCopyBackupsTaskSpec(spec *v1alpha1.EtcdCopyBackupsTaskSpec, name, namespace string, path *field.Path) field.ErrorList { + var allErrs field.ErrorList + + allErrs = append(allErrs, validateStore(&spec.SourceStore, name, namespace, path.Child("sourceStore"))...) + allErrs = append(allErrs, validateStore(&spec.TargetStore, name, namespace, path.Child("targetStore"))...) + + return allErrs +} + +// ValidateEtcdCopyBackupsTaskSpecUpdate validates the specification of a EtcdCopyBackupsTask object before an update. +func ValidateEtcdCopyBackupsTaskSpecUpdate(new, old *v1alpha1.EtcdCopyBackupsTaskSpec, deletionTimestampSet bool, path *field.Path) field.ErrorList { + var allErrs field.ErrorList + + if deletionTimestampSet && !apiequality.Semantic.DeepEqual(new, old) { + allErrs = append(allErrs, apivalidation.ValidateImmutableField(new, old, path)...) + return allErrs + } + + allErrs = append(allErrs, validateStoreUpdate(&new.SourceStore, &old.SourceStore, path.Child("sourceStore"))...) + allErrs = append(allErrs, validateStoreUpdate(&new.TargetStore, &old.TargetStore, path.Child("targetStore"))...) + + return allErrs +} diff --git a/vendor/github.com/gardener/etcd-druid/pkg/utils/miscellaneous.go b/vendor/github.com/gardener/etcd-druid/pkg/utils/miscellaneous.go new file mode 100644 index 000000000..b10df51b1 --- /dev/null +++ b/vendor/github.com/gardener/etcd-druid/pkg/utils/miscellaneous.go @@ -0,0 +1,226 @@ +// Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "fmt" + "time" + + druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + crashLoopBackOff = "CrashLoopBackOff" +) + +const ( + aws = "aws" + azure = "azure" + gcp = "gcp" + alicloud = "alicloud" + openstack = "openstack" + dell = "dell" + openshift = "openshift" +) + +const ( + s3 = "S3" + abs = "ABS" + gcs = "GCS" + oss = "OSS" + swift = "Swift" + local = "Local" + ecs = "ECS" + ocs = "OCS" +) + +// ValueExists returns true or false, depending on whether the given string +// is part of the given []string list . +func ValueExists(value string, list []string) bool { + for _, v := range list { + if v == value { + return true + } + } + return false +} + +// MergeMaps takes two maps , and merges them. If defines a value with a key +// already existing in the map, the value for that key will be overwritten. +func MergeMaps(a, b map[string]interface{}) map[string]interface{} { + var values = map[string]interface{}{} + + for i, v := range b { + existing, ok := a[i] + values[i] = v + + switch elem := v.(type) { + case map[string]interface{}: + if ok { + if extMap, ok := existing.(map[string]interface{}); ok { + values[i] = MergeMaps(extMap, elem) + } + } + default: + values[i] = v + } + } + + for i, v := range a { + if _, ok := values[i]; !ok { + values[i] = v + } + } + + return values +} + +// MergeStringMaps merges the content of the newMaps with the oldMap. If a key already exists then +// it gets overwritten by the last value with the same key. +func MergeStringMaps(oldMap map[string]string, newMaps ...map[string]string) map[string]string { + var out map[string]string + + if oldMap != nil { + out = make(map[string]string) + } + for k, v := range oldMap { + out[k] = v + } + + for _, newMap := range newMaps { + if newMap != nil && out == nil { + out = make(map[string]string) + } + + for k, v := range newMap { + out[k] = v + } + } + + return out +} + +// TimeElapsed takes a and a checks whether the elapsed time until now is less than the . +// If yes, it returns true, otherwise it returns false. +func TimeElapsed(timestamp *metav1.Time, duration time.Duration) bool { + if timestamp == nil { + return true + } + + var ( + end = metav1.NewTime(timestamp.Time.Add(duration)) + now = metav1.Now() + ) + return !now.Before(&end) +} + +func nameAndNamespace(namespaceOrName string, nameOpt ...string) (namespace, name string) { + if len(nameOpt) > 1 { + panic(fmt.Sprintf("more than name/namespace for key specified: %s/%v", namespaceOrName, nameOpt)) + } + if len(nameOpt) == 0 { + name = namespaceOrName + return + } + namespace = namespaceOrName + name = nameOpt[0] + return +} + +// Key creates a new client.ObjectKey from the given parameters. +// There are only two ways to call this function: +// - If only namespaceOrName is set, then a client.ObjectKey with name set to namespaceOrName is returned. +// - If namespaceOrName and one nameOpt is given, then a client.ObjectKey with namespace set to namespaceOrName +// and name set to nameOpt[0] is returned. +// For all other cases, this method panics. +func Key(namespaceOrName string, nameOpt ...string) client.ObjectKey { + namespace, name := nameAndNamespace(namespaceOrName, nameOpt...) + return client.ObjectKey{Namespace: namespace, Name: name} +} + +// GetStoreValues converts the values in the StoreSpec to a map, or returns an error if the storage provider is unsupported. +func GetStoreValues(store *druidv1alpha1.StoreSpec) (map[string]interface{}, error) { + storageProvider, err := StorageProviderFromInfraProvider(store.Provider) + if err != nil { + return nil, err + } + storeValues := map[string]interface{}{ + "storePrefix": store.Prefix, + "storageProvider": storageProvider, + } + if store.Container != nil { + storeValues["storageContainer"] = store.Container + } + if store.SecretRef != nil { + storeValues["storeSecret"] = store.SecretRef.Name + } + return storeValues, nil +} + +// StorageProviderFromInfraProvider converts infra to object store provider. +func StorageProviderFromInfraProvider(infra *druidv1alpha1.StorageProvider) (string, error) { + if infra == nil || len(*infra) == 0 { + return "", nil + } + + switch *infra { + case aws, s3: + return s3, nil + case azure, abs: + return abs, nil + case alicloud, oss: + return oss, nil + case openstack, swift: + return swift, nil + case gcp, gcs: + return gcs, nil + case dell, ecs: + return ecs, nil + case openshift, ocs: + return ocs, nil + case local: + return local, nil + default: + return "", fmt.Errorf("unsupported storage provider: %v", *infra) + } +} + +// IsPodInCrashloopBackoff checks if the pod is in CrashloopBackoff from its status fields. +func IsPodInCrashloopBackoff(status v1.PodStatus) bool { + for _, containerStatus := range status.ContainerStatuses { + if isContainerInCrashLoopBackOff(containerStatus.State) { + return true + } + } + return false +} + +func isContainerInCrashLoopBackOff(containerState v1.ContainerState) bool { + if containerState.Waiting != nil { + return containerState.Waiting.Reason == crashLoopBackOff + } + return false +} + +// Max returns the larger of x or y. +func Max(x, y int) int { + if y > x { + return x + } + return x +} diff --git a/vendor/github.com/gardener/gardener/charts/images.yaml b/vendor/github.com/gardener/gardener/charts/images.yaml index 08c1d3a23..130bdd7ad 100644 --- a/vendor/github.com/gardener/gardener/charts/images.yaml +++ b/vendor/github.com/gardener/gardener/charts/images.yaml @@ -30,7 +30,7 @@ images: - name: etcd-druid sourceRepository: github.com/gardener/etcd-druid repository: eu.gcr.io/gardener-project/gardener/etcd-druid - tag: "v0.5.2" + tag: "v0.7.3" - name: dependency-watchdog sourceRepository: github.com/gardener/dependency-watchdog repository: eu.gcr.io/gardener-project/gardener/dependency-watchdog @@ -95,7 +95,7 @@ images: - name: vpn-seed-server sourceRepository: github.com/gardener/vpn2 repository: eu.gcr.io/gardener-project/gardener/vpn-seed-server - tag: "0.5.0" + tag: "0.6.0" # Monitoring - name: alertmanager @@ -139,7 +139,7 @@ images: - name: vpn-shoot-client sourceRepository: github.com/gardener/vpn2 repository: eu.gcr.io/gardener-project/gardener/vpn-shoot-client - tag: "0.5.0" + tag: "0.6.0" - name: coredns sourceRepository: github.com/coredns/coredns repository: coredns/coredns @@ -278,11 +278,11 @@ images: - name: istio-proxy sourceRepository: github.com/istio/istio repository: gcr.io/istio-release/proxyv2 - tag: "1.10.2-distroless" + tag: "1.12.0-distroless" - name: istio-istiod sourceRepository: github.com/istio/istio repository: gcr.io/istio-release/pilot - tag: "1.10.2-distroless" + tag: "1.12.0-distroless" # External Authorization Server for the Istio Endpoint of Reversed VPN - name: ext-authz-server diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go index c45b9dc78..1a0fb195e 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go @@ -67,7 +67,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go index 29ade9af0..bb9513945 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go @@ -66,7 +66,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go index a7d2b874b..d71fbf6b5 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go @@ -16,6 +16,8 @@ package genericactuator import ( "context" + "fmt" + "strings" "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" @@ -90,12 +92,7 @@ func (a *actuator) deployEtcdBackupSecret(ctx context.Context, be *extensionsv1a return err } - etcdSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: v1beta1constants.BackupSecretName, - Namespace: shootTechnicalID, - }, - } + etcdSecret := emptyEtcdBackupSecret(be.Name) _, err = controllerutils.GetAndCreateOrMergePatch(ctx, a.client, etcdSecret, func() error { etcdSecret.Data = etcdSecretData @@ -106,9 +103,32 @@ func (a *actuator) deployEtcdBackupSecret(ctx context.Context, be *extensionsv1a // Delete deletes the BackupEntry. func (a *actuator) Delete(ctx context.Context, be *extensionsv1alpha1.BackupEntry) error { + if err := a.deleteEtcdBackupSecret(ctx, be.Name); err != nil { + return err + } return a.backupEntryDelegate.Delete(ctx, be) } +func (a *actuator) deleteEtcdBackupSecret(ctx context.Context, secretName string) error { + etcdSecret := emptyEtcdBackupSecret(secretName) + return kutil.DeleteObject(ctx, a.client, etcdSecret) +} + +func emptyEtcdBackupSecret(backupEntryName string) *corev1.Secret { + secretName := v1beta1constants.BackupSecretName + if strings.HasPrefix(backupEntryName, v1beta1constants.BackupSourcePrefix) { + secretName = fmt.Sprintf("%s-%s", v1beta1constants.BackupSourcePrefix, v1beta1constants.BackupSecretName) + } + shootTechnicalID, _ := backupentry.ExtractShootDetailsFromBackupEntryName(backupEntryName) + + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: shootTechnicalID, + }, + } +} + // Restore restores the BackupEntry. func (a *actuator) Restore(ctx context.Context, be *extensionsv1alpha1.BackupEntry) error { return a.Reconcile(ctx, be) diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/util.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/util.go index 684ab18d3..56eca7a49 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/util.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/util.go @@ -15,11 +15,15 @@ package backupentry import ( + "fmt" "strings" + + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" ) // ExtractShootDetailsFromBackupEntryName returns Shoot resource technicalID its UID from provided . func ExtractShootDetailsFromBackupEntryName(backupEntryName string) (shootTechnicalID, shootUID string) { + backupEntryName = strings.TrimPrefix(backupEntryName, fmt.Sprintf("%s-", v1beta1constants.BackupSourcePrefix)) tokens := strings.Split(backupEntryName, "--") shootUID = tokens[len(tokens)-1] shootTechnicalID = strings.TrimSuffix(backupEntryName, "--"+shootUID) diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go index 867fb4316..0e939fc6d 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go @@ -60,7 +60,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/cmd.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/cmd.go index 27f4ce9f7..42d8fd4bf 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/cmd.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/cmd.go @@ -17,12 +17,13 @@ package cmd import ( "os" + "github.com/go-logr/logr" "sigs.k8s.io/controller-runtime/pkg/log" ) var ( // Log is log.Log. Exposed for testing. - Log = log.Log + Log logr.Logger = log.Log // Exit calls os.Exit. Exposed for testing. Exit = os.Exit ) diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go index e0b6e1ae8..639524722 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go @@ -65,7 +65,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), extensionspredicate.ShootNotFailed(), } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go index c9b1af15e..b5cfcafa5 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go @@ -230,8 +230,10 @@ func (a *actuator) reconcileControlPlane( ctx context.Context, cp *extensionsv1alpha1.ControlPlane, cluster *extensionscontroller.Cluster, -) (bool, error) { - +) ( + bool, + error, +) { if len(a.shootWebhooks) > 0 { if err := ReconcileShootWebhooks(ctx, a.client, cp.Namespace, a.providerName, a.webhookServerPort, a.shootWebhooks, cluster); err != nil { return false, fmt.Errorf("could not reconcile shoot webhooks: %w", err) @@ -239,10 +241,17 @@ func (a *actuator) reconcileControlPlane( } // Deploy secrets - a.logger.Info("Deploying secrets", "controlplane", kutil.ObjectName(cp)) - deployedSecrets, err := a.secrets.Deploy(ctx, a.clientset, a.gardenerClientset, cp.Namespace) - if err != nil { - return false, fmt.Errorf("could not deploy secrets for controlplane '%s': %w", kutil.ObjectName(cp), err) + var ( + deployedSecrets map[string]*corev1.Secret + err error + ) + + if a.secrets != nil { + a.logger.Info("Deploying secrets", "controlplane", kutil.ObjectName(cp)) + deployedSecrets, err = a.secrets.Deploy(ctx, a.clientset, a.gardenerClientset, cp.Namespace) + if err != nil { + return false, fmt.Errorf("could not deploy secrets for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } // Get config chart values @@ -289,17 +298,20 @@ func (a *actuator) reconcileControlPlane( } } - // Get control plane chart values - values, err := a.vp.GetControlPlaneChartValues(ctx, cp, cluster, checksums, scaledDown) - if err != nil { - return false, err - } - // Apply control plane chart version := cluster.Shoot.Spec.Kubernetes.Version - a.logger.Info("Applying control plane chart", "controlplane", kutil.ObjectName(cp)) - if err := a.controlPlaneChart.Apply(ctx, a.chartApplier, cp.Namespace, a.imageVector, a.gardenerClientset.Version(), version, values); err != nil { - return false, fmt.Errorf("could not apply control plane chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + + if a.controlPlaneChart != nil { + // Get control plane chart values + values, err := a.vp.GetControlPlaneChartValues(ctx, cp, cluster, checksums, scaledDown) + if err != nil { + return false, err + } + + a.logger.Info("Applying control plane chart", "controlplane", kutil.ObjectName(cp)) + if err := a.controlPlaneChart.Apply(ctx, a.chartApplier, cp.Namespace, a.imageVector, a.gardenerClientset.Version(), version, values); err != nil { + return false, fmt.Errorf("could not apply control plane chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } // Create shoot chart renderer @@ -308,19 +320,21 @@ func (a *actuator) reconcileControlPlane( return false, fmt.Errorf("could not create chart renderer for shoot '%s': %w", cp.Namespace, err) } - // Get control plane shoot chart values - values, err = a.vp.GetControlPlaneShootChartValues(ctx, cp, cluster, checksums) - if err != nil { - return false, err - } + if a.controlPlaneShootChart != nil { + // Get control plane shoot chart values + values, err := a.vp.GetControlPlaneShootChartValues(ctx, cp, cluster, checksums) + if err != nil { + return false, err + } - if err := managedresources.RenderChartAndCreate(ctx, cp.Namespace, ControlPlaneShootChartResourceName, false, a.client, chartRenderer, a.controlPlaneShootChart, values, a.imageVector, metav1.NamespaceSystem, version, true, false); err != nil { - return false, fmt.Errorf("could not apply control plane shoot chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + if err := managedresources.RenderChartAndCreate(ctx, cp.Namespace, ControlPlaneShootChartResourceName, false, a.client, chartRenderer, a.controlPlaneShootChart, values, a.imageVector, metav1.NamespaceSystem, version, true, false); err != nil { + return false, fmt.Errorf("could not apply control plane shoot chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } if a.controlPlaneShootCRDsChart != nil { // Get control plane shoot CRDs chart values - values, err = a.vp.GetControlPlaneShootCRDsChartValues(ctx, cp, cluster) + values, err := a.vp.GetControlPlaneShootCRDsChartValues(ctx, cp, cluster) if err != nil { return false, err } @@ -330,14 +344,16 @@ func (a *actuator) reconcileControlPlane( } } - // Get storage classes - values, err = a.vp.GetStorageClassesChartValues(ctx, cp, cluster) - if err != nil { - return false, err - } + if a.storageClassesChart != nil { + // Get storage class chart values + values, err := a.vp.GetStorageClassesChartValues(ctx, cp, cluster) + if err != nil { + return false, err + } - if err := managedresources.RenderChartAndCreate(ctx, cp.Namespace, StorageClassesChartResourceName, false, a.client, chartRenderer, a.storageClassesChart, values, a.imageVector, metav1.NamespaceSystem, version, true, true); err != nil { - return false, fmt.Errorf("could not apply storage classes chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + if err := managedresources.RenderChartAndCreate(ctx, cp.Namespace, StorageClassesChartResourceName, false, a.client, chartRenderer, a.storageClassesChart, values, a.imageVector, metav1.NamespaceSystem, version, true, true); err != nil { + return false, fmt.Errorf("could not apply storage classes chart for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } return requeue, nil @@ -422,9 +438,11 @@ func (a *actuator) deleteControlPlane( } // Delete control plane objects - a.logger.Info("Deleting control plane objects", "controlplane", kutil.ObjectName(cp)) - if err := a.controlPlaneChart.Delete(ctx, a.client, cp.Namespace); client.IgnoreNotFound(err) != nil { - return fmt.Errorf("could not delete control plane objects for controlplane '%s': %w", kutil.ObjectName(cp), err) + if a.controlPlaneChart != nil { + a.logger.Info("Deleting control plane objects", "controlplane", kutil.ObjectName(cp)) + if err := a.controlPlaneChart.Delete(ctx, a.client, cp.Namespace); client.IgnoreNotFound(err) != nil { + return fmt.Errorf("could not delete control plane objects for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } if a.configChart != nil { @@ -435,10 +453,12 @@ func (a *actuator) deleteControlPlane( } } - // Delete secrets - a.logger.Info("Deleting secrets", "controlplane", kutil.ObjectName(cp)) - if err := a.secrets.Delete(ctx, a.clientset, cp.Namespace); client.IgnoreNotFound(err) != nil { - return fmt.Errorf("could not delete secrets for controlplane '%s': %w", kutil.ObjectName(cp), err) + if a.secrets != nil { + // Delete secrets + a.logger.Info("Deleting secrets", "controlplane", kutil.ObjectName(cp)) + if err := a.secrets.Delete(ctx, a.clientset, cp.Namespace); client.IgnoreNotFound(err) != nil { + return fmt.Errorf("could not delete secrets for controlplane '%s': %w", kutil.ObjectName(cp), err) + } } if len(a.shootWebhooks) > 0 { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go index af7248a9d..aeabe87bb 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go @@ -65,7 +65,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), extensionspredicate.ShootNotFailed(), } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go index a967b0d9c..00af1eee5 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go @@ -71,7 +71,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), extensionspredicate.ShootNotFailed(), } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go index e4cee8a8f..40cb9def4 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go @@ -70,7 +70,10 @@ func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { predicate.Or( predicateutils.HasOperationAnnotation(), extensionspredicate.LastOperationNotSuccessful(), - extensionspredicate.IsDeleting(), + predicate.And( + predicate.GenerationChangedPredicate{}, + extensionspredicate.IsDeleting(), + ), ), extensionspredicate.ShootNotFailed(), } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/machines.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/machines.go index 2fe5c13b9..633c9f47f 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/machines.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/machines.go @@ -119,7 +119,11 @@ func (m MachineDeployments) HasSecret(secretName string) bool { // WorkerPoolHash returns a hash value for a given worker pool and a given cluster resource. func WorkerPoolHash(pool extensionsv1alpha1.WorkerPool, cluster *extensionscontroller.Cluster, additionalData ...string) (string, error) { - shootVersionMajorMinor, err := util.VersionMajorMinor(cluster.Shoot.Spec.Kubernetes.Version) + kubernetesVersion := cluster.Shoot.Spec.Kubernetes.Version + if pool.KubernetesVersion != nil { + kubernetesVersion = *pool.KubernetesVersion + } + shootVersionMajorMinor, err := util.VersionMajorMinor(kubernetesVersion) if err != nil { return "", err } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/reconciler.go index 97eb4abcd..e862b917b 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/reconciler.go @@ -211,6 +211,10 @@ func (r *reconciler) reconcile(ctx context.Context, logger logr.Logger, worker * } func (r *reconciler) restore(ctx context.Context, logger logr.Logger, worker *extensionsv1alpha1.Worker, cluster *extensionscontroller.Cluster) (reconcile.Result, error) { + if err := controllerutils.EnsureFinalizer(ctx, r.reader, r.client, worker, FinalizerName); err != nil { + return reconcile.Result{}, err + } + if err := r.statusUpdater.Processing(ctx, worker, gardencorev1beta1.LastOperationTypeRestore, "Restoring the worker"); err != nil { return reconcile.Result{}, err } @@ -229,7 +233,6 @@ func (r *reconciler) restore(ctx context.Context, logger logr.Logger, worker *ex return reconcile.Result{}, fmt.Errorf("error removing annotation from worker: %+v", err) } - // requeue to trigger reconciliation return reconcile.Result{}, nil } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go index daa7befc1..a699a7fea 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go @@ -54,6 +54,7 @@ func NewBuilder(mgr manager.Manager, logger logr.Logger) *HandlerBuilder { // WithMutator adds the given mutator for the given types to the HandlerBuilder. func (b *HandlerBuilder) WithMutator(mutator Mutator, types ...client.Object) *HandlerBuilder { + mutator = hybridMutator(mutator) b.mutatorMap[mutator] = append(b.mutatorMap[mutator], types...) return b diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/mutator.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/mutator.go index 3025c8cf6..0926b71a6 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/mutator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/mutator.go @@ -16,8 +16,10 @@ package webhook import ( "context" + "fmt" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" ) // Mutator validates and if needed mutates objects. @@ -33,6 +35,21 @@ type MutatorWithShootClient interface { // "old" is optional and it must always be checked for nil. Mutate(ctx context.Context, new, old client.Object, shootClient client.Client) error } +type mutatorWrapper struct { + Mutator +} + +// InjectFunc calls the inject.Func on the handler mutators. +func (d *mutatorWrapper) InjectFunc(f inject.Func) error { + if err := f(d.Mutator); err != nil { + return fmt.Errorf("could not inject into the mutator: %w", err) + } + return nil +} + +func hybridMutator(mut Mutator) Mutator { + return &mutatorWrapper{mut} +} // MutateFunc is a func to be used directly as an implementation for Mutator type MutateFunc func(ctx context.Context, new, old client.Object) error diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go index 653d11c53..57eb8f6f7 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go @@ -66,6 +66,7 @@ func RegisterWebhooks(ctx context.Context, mgr manager.Manager, namespace, provi AdmissionReviewVersions: []string{"v1", "v1beta1"}, Name: fmt.Sprintf("%s.%s.extensions.gardener.cloud", webhook.Name, strings.TrimPrefix(providerName, "provider-")), NamespaceSelector: webhook.Selector, + ObjectSelector: webhook.ObjectSelector, Rules: rules, SideEffects: &sideEffects, TimeoutSeconds: pointer.Int32(10), diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go index d0575a94c..327a9fe9d 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go @@ -39,15 +39,16 @@ const ( // Webhook is the specification of a webhook. type Webhook struct { - Name string - Kind string - Provider string - Path string - Target string - Types []client.Object - Webhook *admission.Webhook - Handler http.Handler - Selector *metav1.LabelSelector + Name string + Kind string + Provider string + Path string + Target string + Types []client.Object + Webhook *admission.Webhook + Handler http.Handler + Selector *metav1.LabelSelector + ObjectSelector *metav1.LabelSelector } // Args contains Webhook creation arguments. diff --git a/vendor/github.com/gardener/gardener/hack/check-docforge.sh b/vendor/github.com/gardener/gardener/hack/check-docforge.sh new file mode 100755 index 000000000..d333651c1 --- /dev/null +++ b/vendor/github.com/gardener/gardener/hack/check-docforge.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +docCommitHash="12922abea4c5afa207cc9c09b18414cd2348890c" + +echo "> Check Docforge Manifest" +repoPath=${1-"$(readlink -f $(dirname ${0})/..)"} +manifestPath=${2-"${repoPath}/.docforge/manifest.yaml"} +diffDirs=${3-".docforge/;docs/"} +repoName=${4-"gardener"} +useToken=${5-false} + +tmpDir=$(mktemp -d) +function cleanup { + rm -rf "$tmpDir" +} +trap cleanup EXIT ERR INT TERM + +curl https://raw.githubusercontent.com/gardener/documentation/${docCommitHash}/.ci/check-manifest --output ${tmpDir}/check-manifest-script.sh && chmod +x ${tmpDir}/check-manifest-script.sh +curl https://raw.githubusercontent.com/gardener/documentation/${docCommitHash}/.ci/check-manifest-config --output ${tmpDir}/manifest-config +scriptPath="${tmpDir}/check-manifest-script.sh" +configPath="${tmpDir}/manifest-config" + +${scriptPath} --repo-path ${repoPath} --repo-name ${repoName} --use-token ${useToken} --manifest-path ${manifestPath} --diff-dirs ${diffDirs} --config-path ${configPath} diff --git a/vendor/github.com/gardener/gardener/hack/generate-imagename-constants.sh b/vendor/github.com/gardener/gardener/hack/generate-imagename-constants.sh index 36caf016f..816835876 100755 --- a/vendor/github.com/gardener/gardener/hack/generate-imagename-constants.sh +++ b/vendor/github.com/gardener/gardener/hack/generate-imagename-constants.sh @@ -22,18 +22,18 @@ function camelCase { sed -r 's/(.)-+(.)/\1\U\2/g;s/^[a-z]/\U&/' <<< "$1" } -PATH_CHARTS="$(dirname $0)/../charts" +package_name="${1:-charts}" out=" $(cat "$(dirname $0)/LICENSE_BOILERPLATE.txt" | sed "s/YEAR/$(date +%Y)/g") // Code generated by $(basename $0). DO NOT EDIT. -package charts +package $package_name const (" -for image_name in $(yaml2json < "$PATH_CHARTS/images.yaml" | jq -r '[.images[].name] | unique | .[]'); do +for image_name in $(yaml2json < "images.yaml" | jq -r '[.images[].name] | unique | .[]'); do variable_name="$(camelCase "$image_name")" out=" @@ -47,5 +47,5 @@ $out ) " -echo "$out" > "$PATH_CHARTS/images.go" -goimports -l -w "$PATH_CHARTS/images.go" +echo "$out" > "images.go" +goimports -l -w "images.go" diff --git a/vendor/github.com/gardener/gardener/hack/generate-seed-crds.sh b/vendor/github.com/gardener/gardener/hack/generate-seed-crds.sh index 40fc6eb43..2fb85bdea 100755 --- a/vendor/github.com/gardener/gardener/hack/generate-seed-crds.sh +++ b/vendor/github.com/gardener/gardener/hack/generate-seed-crds.sh @@ -72,7 +72,10 @@ generate_group () { controller-gen crd paths="$package_path" output:crd:dir="$output_dir" output:stdout while IFS= read -r crd; do - mv "$crd" "$output_dir/$file_name_prefix$(basename $crd)" + crd_out="$output_dir/$file_name_prefix$(basename $crd)" + if [ "$crd" != "$crd_out" ]; then + mv "$crd" "$crd_out" + fi done < <(ls "$output_dir/${group}"_*.yaml) } diff --git a/vendor/github.com/gardener/gardener/hack/tools.mk b/vendor/github.com/gardener/gardener/hack/tools.mk index 35e9f8973..4254242f3 100755 --- a/vendor/github.com/gardener/gardener/hack/tools.mk +++ b/vendor/github.com/gardener/gardener/hack/tools.mk @@ -22,6 +22,7 @@ HACK_PKG_PATH := $(shell go list -tags tools -f '{{ .Dir }}' github.com/gardener/gardener/hack) TOOLS_BIN_DIR := $(TOOLS_DIR)/bin CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen +DOCFORGE := $(TOOLS_BIN_DIR)/docforge GEN_CRD_API_REFERENCE_DOCS := $(TOOLS_BIN_DIR)/gen-crd-api-reference-docs GOIMPORTS := $(TOOLS_BIN_DIR)/goimports GOLANGCI_LINT := $(TOOLS_BIN_DIR)/golangci-lint @@ -39,6 +40,7 @@ YQ := $(TOOLS_BIN_DIR)/yq GOLANGCI_LINT_VERSION ?= v1.42.1 HELM_VERSION ?= v3.5.4 YQ_VERSION ?= v4.9.6 +DOCFORGE_VERSION ?= v0.21.0 export TOOLS_BIN_DIR := $(TOOLS_BIN_DIR) export PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH) @@ -110,3 +112,7 @@ $(YAML2JSON): go.mod $(YQ): $(call tool_version_file,$(YQ),$(YQ_VERSION)) curl -L -o $(YQ) https://github.com/mikefarah/yq/releases/download/$(YQ_VERSION)/yq_$(shell uname -s | tr '[:upper:]' '[:lower:]')_$(shell uname -m | sed 's/x86_64/amd64/') chmod +x $(YQ) + +$(DOCFORGE): $(call tool_version_file,$(DOCFORGE),$(DOCFORGE_VERSION)) + curl -L -o $(DOCFORGE) https://github.com/gardener/docforge/releases/download/$(DOCFORGE_VERSION)/docforge-$(shell uname -s | tr '[:upper:]' '[:lower:]')-$(shell uname -m | sed 's/x86_64/amd64/') + chmod +x $(DOCFORGE) diff --git a/vendor/github.com/gardener/gardener/hack/update-codegen.sh b/vendor/github.com/gardener/gardener/hack/update-codegen.sh index e99afcbf1..82217b3e4 100755 --- a/vendor/github.com/gardener/gardener/hack/update-codegen.sh +++ b/vendor/github.com/gardener/gardener/hack/update-codegen.sh @@ -381,7 +381,7 @@ if [[ $# -gt 0 && "$1" == "--parallel" ]]; then scheduler_groups \ gardenlet_groups \ shoottolerationrestriction_groups \ - landscapergardenlet_groups + landscapergardenlet_groups \ landscapercontrolplane_groups else authentication_groups diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/helper/helpers.go b/vendor/github.com/gardener/gardener/pkg/apis/core/helper/helpers.go index aed056178..e2caedf30 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/helper/helpers.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/helper/helpers.go @@ -16,9 +16,11 @@ package helper import ( "fmt" + "strings" "github.com/gardener/gardener/pkg/apis/core" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + "github.com/gardener/gardener/pkg/utils" "github.com/Masterminds/semver" corev1 "k8s.io/api/core/v1" @@ -392,3 +394,22 @@ func CalculateSeedUsage(shootList []*core.Shoot) map[string]int { return m } + +// GetSecretBindingTypes returns the SecretBinding provider types. +func GetSecretBindingTypes(secretBinding *core.SecretBinding) []string { + return strings.Split(secretBinding.Provider.Type, ",") +} + +// SecretBindingHasType checks if the given SecretBinding has the given provider type. +func SecretBindingHasType(secretBinding *core.SecretBinding, providerType string) bool { + if secretBinding.Provider == nil { + return false + } + + types := GetSecretBindingTypes(secretBinding) + if len(types) == 0 { + return false + } + + return utils.ValueExists(providerType, types) +} diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_secretbinding.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_secretbinding.go index cb66ce201..7c64cf734 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_secretbinding.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_secretbinding.go @@ -31,6 +31,17 @@ type SecretBinding struct { SecretRef corev1.SecretReference // Quotas is a list of references to Quota objects in the same or another namespace. Quotas []corev1.ObjectReference + // Provider defines the provider type of the SecretBinding. + Provider *SecretBindingProvider +} + +// SecretBindingProvider defines the provider type of the SecretBinding. +type SecretBindingProvider struct { + // Type is the type of the provider. + // + // For backwards compatibility, the field can contain multiple providers separated by a comma. + // However the usage of single SecretBinding (hence Secret) for different cloud providers is strongly discouraged. + Type string } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go index 6e17a08e5..5e6b3b00f 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go @@ -68,8 +68,8 @@ type SeedSpec struct { Networks SeedNetworks // Provider defines the provider type and region for this Seed cluster. Provider SeedProvider - // SecretRef is a reference to a Secret object containing the Kubeconfig and the cloud provider credentials for - // the account the Seed cluster has been deployed to. + // SecretRef is a reference to a Secret object containing the Kubeconfig of the Kubernetes + // cluster to be registered as Seed. SecretRef *corev1.SecretReference // Settings contains certain settings for this seed cluster. Settings *SeedSettings @@ -206,6 +206,10 @@ type SeedSettings struct { LoadBalancerServices *SeedSettingLoadBalancerServices // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler + // SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. + OwnerChecks *SeedSettingOwnerChecks + // DependencyWatchdog controls certain settings for the dependency-watchdog components deployed in the seed. + DependencyWatchdog *SeedSettingDependencyWatchdog } // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the @@ -246,6 +250,37 @@ type SeedSettingVerticalPodAutoscaler struct { Enabled bool } +// SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. +type SeedSettingOwnerChecks struct { + // Enabled controls whether owner checks are enabled for shoots scheduled on this seed. It + // is enabled by default because it is a prerequisite for control plane migration. + Enabled bool +} + +// SeedSettingDependencyWatchdog controls the dependency-watchdog settings for the seed. +type SeedSettingDependencyWatchdog struct { + // Endpoint controls the endpoint settings for the dependency-watchdog for the seed. + Endpoint *SeedSettingDependencyWatchdogEndpoint + // Probe controls the probe settings for the dependency-watchdog for the seed. + Probe *SeedSettingDependencyWatchdogProbe +} + +// SeedSettingDependencyWatchdogEndpoint controls the endpoint settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogEndpoint struct { + // Enabled controls whether the endpoint controller of the dependency-watchdog should be enabled. This controller + // helps to alleviate the delay where control plane components remain unavailable by finding the respective pods in + // CrashLoopBackoff status and restarting them once their dependants become ready and available again. + Enabled bool +} + +// SeedSettingDependencyWatchdogProbe controls the probe settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogProbe struct { + // Enabled controls whether the probe controller of the dependency-watchdog should be enabled. This controller + // scales down the kube-controller-manager of shoot clusters in case their respective kube-apiserver is not + // reachable via its external ingress in order to avoid melt-down situations. + Enabled bool +} + // SeedTaint describes a taint on a seed. type SeedTaint struct { // Key is the taint key to be applied to a seed. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go index 0b8f05167..b399ff6a9 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go @@ -663,6 +663,8 @@ type KubeletConfig struct { ImageGCHighThresholdPercent *int32 // ImageGCLowThresholdPercent describes the percent of the disk to which garbage collection attempts to free. ImageGCLowThresholdPercent *int32 + // SerializeImagePulls describes whether the images are pulled one at a time. + SerializeImagePulls *bool } // KubeletConfigEviction contains kubelet eviction thresholds supporting either a resource.Quantity or a percentage based value. @@ -890,6 +892,11 @@ type WorkerKubernetes struct { // Kubelet contains configuration settings for all kubelets of this worker pool. // If set, all `spec.kubernetes.kubelet` settings will be overwritten for this worker pool (no merge of settings). Kubelet *KubeletConfig + // Version is the semantic Kubernetes version to use for the Kubelet in this Worker Group. + // If not specified the kubelet version is derived from the global shoot cluster kubernetes version. + // version must be equal or lower than the version of the shoot kubernetes version. + // Only one minor version difference to other worker groups and global kubernetes version is allowed. + Version *string } // Machine contains information about the machine type and image. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go index 33152bf68..ac39fe75a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go @@ -143,6 +143,9 @@ const ( LabelSeedProvider = "seed.gardener.cloud/provider" // LabelShootProvider is used to identify the shoot provider. LabelShootProvider = "shoot.gardener.cloud/provider" + // LabelShootProviderPrefix is used to prefix label that indicates the provider type. + // The label key is in the form provider.shoot.gardener.cloud/. + LabelShootProviderPrefix = "provider.shoot.gardener.cloud/" // LabelNetworkingProvider is used to identify the networking provider for the cni plugin. LabelNetworkingProvider = "networking.shoot.gardener.cloud/provider" // LabelExtensionPrefix is used to prefix extension specific labels. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go index 901d902e9..c83bd9d03 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go @@ -119,14 +119,31 @@ func SetDefaults_Seed(obj *Seed) { if obj.Spec.Settings.VerticalPodAutoscaler == nil { obj.Spec.Settings.VerticalPodAutoscaler = &SeedSettingVerticalPodAutoscaler{Enabled: true} } + + if obj.Spec.Settings.OwnerChecks == nil { + obj.Spec.Settings.OwnerChecks = &SeedSettingOwnerChecks{Enabled: true} + } + + if obj.Spec.Settings.DependencyWatchdog == nil { + obj.Spec.Settings.DependencyWatchdog = &SeedSettingDependencyWatchdog{} + } +} + +// SetDefaults_SeedSettingDependencyWatchdog sets defaults for SeedSettingDependencyWatchdog objects. +func SetDefaults_SeedSettingDependencyWatchdog(obj *SeedSettingDependencyWatchdog) { + if obj.Endpoint == nil { + obj.Endpoint = &SeedSettingDependencyWatchdogEndpoint{Enabled: true} + } + if obj.Probe == nil { + obj.Probe = &SeedSettingDependencyWatchdogProbe{Enabled: true} + } } // SetDefaults_Shoot sets default values for Shoot objects. func SetDefaults_Shoot(obj *Shoot) { k8sVersionLessThan116, _ := versionutils.CompareVersions(obj.Spec.Kubernetes.Version, "<", "1.16") - k8sVersionGreaterOrEqualThan122, _ := versionutils.CompareVersions(obj.Spec.Kubernetes.Version, ">=", "1.22") // Error is ignored here because we cannot do anything meaningful with it. - // k8sVersionLessThan116 and k8sVersionGreaterOrEqualThan122 will default to `false`. + // k8sVersionLessThan116 will default to `false`. if obj.Spec.Kubernetes.AllowPrivilegedContainers == nil { obj.Spec.Kubernetes.AllowPrivilegedContainers = pointer.Bool(true) @@ -219,6 +236,9 @@ func SetDefaults_Shoot(obj *Shoot) { if obj.Spec.Kubernetes.Kubelet.ImageGCLowThresholdPercent == nil { obj.Spec.Kubernetes.Kubelet.ImageGCLowThresholdPercent = pointer.Int32(40) } + if obj.Spec.Kubernetes.Kubelet.SerializeImagePulls == nil { + obj.Spec.Kubernetes.Kubelet.SerializeImagePulls = pointer.Bool(true) + } var ( kubeReservedMemory = resource.MustParse("1Gi") @@ -249,13 +269,23 @@ func SetDefaults_Shoot(obj *Shoot) { obj.Spec.Kubernetes.KubeAPIServer.EnableAnonymousAuthentication = pointer.Bool(false) } - if k8sVersionGreaterOrEqualThan122 { - for i := range obj.Spec.Provider.Workers { - if obj.Spec.Provider.Workers[i].CRI != nil { - continue - } - obj.Spec.Provider.Workers[i].CRI = &CRI{Name: CRINameContainerD} + for i, worker := range obj.Spec.Provider.Workers { + kubernetesVersion := obj.Spec.Kubernetes.Version + if worker.Kubernetes != nil && worker.Kubernetes.Version != nil { + kubernetesVersion = *worker.Kubernetes.Version + } + + if k8sVersionGreaterOrEqualThan122, _ := versionutils.CompareVersions(kubernetesVersion, ">=", "1.22"); !k8sVersionGreaterOrEqualThan122 { + // Error is ignored here because we cannot do anything meaningful with it. + // k8sVersionLessThan116 and k8sVersionGreaterOrEqualThan122 will default to `false`. + continue + } + + if worker.CRI != nil { + continue } + + obj.Spec.Provider.Workers[i].CRI = &CRI{Name: CRINameContainerD} } } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go index 4385e9846..323a3c138 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go @@ -3051,10 +3051,38 @@ func (m *SecretBindingList) XXX_DiscardUnknown() { var xxx_messageInfo_SecretBindingList proto.InternalMessageInfo +func (m *SecretBindingProvider) Reset() { *m = SecretBindingProvider{} } +func (*SecretBindingProvider) ProtoMessage() {} +func (*SecretBindingProvider) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{107} +} +func (m *SecretBindingProvider) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SecretBindingProvider) 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 *SecretBindingProvider) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecretBindingProvider.Merge(m, src) +} +func (m *SecretBindingProvider) XXX_Size() int { + return m.Size() +} +func (m *SecretBindingProvider) XXX_DiscardUnknown() { + xxx_messageInfo_SecretBindingProvider.DiscardUnknown(m) +} + +var xxx_messageInfo_SecretBindingProvider proto.InternalMessageInfo + func (m *Seed) Reset() { *m = Seed{} } func (*Seed) ProtoMessage() {} func (*Seed) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{107} + return fileDescriptor_f1caaec5647a9dbf, []int{108} } func (m *Seed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3082,7 +3110,7 @@ var xxx_messageInfo_Seed proto.InternalMessageInfo func (m *SeedBackup) Reset() { *m = SeedBackup{} } func (*SeedBackup) ProtoMessage() {} func (*SeedBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{108} + return fileDescriptor_f1caaec5647a9dbf, []int{109} } func (m *SeedBackup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3110,7 +3138,7 @@ var xxx_messageInfo_SeedBackup proto.InternalMessageInfo func (m *SeedDNS) Reset() { *m = SeedDNS{} } func (*SeedDNS) ProtoMessage() {} func (*SeedDNS) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{109} + return fileDescriptor_f1caaec5647a9dbf, []int{110} } func (m *SeedDNS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3138,7 +3166,7 @@ var xxx_messageInfo_SeedDNS proto.InternalMessageInfo func (m *SeedDNSProvider) Reset() { *m = SeedDNSProvider{} } func (*SeedDNSProvider) ProtoMessage() {} func (*SeedDNSProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{110} + return fileDescriptor_f1caaec5647a9dbf, []int{111} } func (m *SeedDNSProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3166,7 +3194,7 @@ var xxx_messageInfo_SeedDNSProvider proto.InternalMessageInfo func (m *SeedList) Reset() { *m = SeedList{} } func (*SeedList) ProtoMessage() {} func (*SeedList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{111} + return fileDescriptor_f1caaec5647a9dbf, []int{112} } func (m *SeedList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3194,7 +3222,7 @@ var xxx_messageInfo_SeedList proto.InternalMessageInfo func (m *SeedNetworks) Reset() { *m = SeedNetworks{} } func (*SeedNetworks) ProtoMessage() {} func (*SeedNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{112} + return fileDescriptor_f1caaec5647a9dbf, []int{113} } func (m *SeedNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3222,7 +3250,7 @@ var xxx_messageInfo_SeedNetworks proto.InternalMessageInfo func (m *SeedProvider) Reset() { *m = SeedProvider{} } func (*SeedProvider) ProtoMessage() {} func (*SeedProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{113} + return fileDescriptor_f1caaec5647a9dbf, []int{114} } func (m *SeedProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3250,7 +3278,7 @@ var xxx_messageInfo_SeedProvider proto.InternalMessageInfo func (m *SeedSelector) Reset() { *m = SeedSelector{} } func (*SeedSelector) ProtoMessage() {} func (*SeedSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{114} + return fileDescriptor_f1caaec5647a9dbf, []int{115} } func (m *SeedSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3275,10 +3303,94 @@ func (m *SeedSelector) XXX_DiscardUnknown() { var xxx_messageInfo_SeedSelector proto.InternalMessageInfo +func (m *SeedSettingDependencyWatchdog) Reset() { *m = SeedSettingDependencyWatchdog{} } +func (*SeedSettingDependencyWatchdog) ProtoMessage() {} +func (*SeedSettingDependencyWatchdog) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{116} +} +func (m *SeedSettingDependencyWatchdog) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdog) 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 *SeedSettingDependencyWatchdog) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdog.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdog) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdog) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdog.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdog proto.InternalMessageInfo + +func (m *SeedSettingDependencyWatchdogEndpoint) Reset() { *m = SeedSettingDependencyWatchdogEndpoint{} } +func (*SeedSettingDependencyWatchdogEndpoint) ProtoMessage() {} +func (*SeedSettingDependencyWatchdogEndpoint) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{117} +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdogEndpoint) 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 *SeedSettingDependencyWatchdogEndpoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint proto.InternalMessageInfo + +func (m *SeedSettingDependencyWatchdogProbe) Reset() { *m = SeedSettingDependencyWatchdogProbe{} } +func (*SeedSettingDependencyWatchdogProbe) ProtoMessage() {} +func (*SeedSettingDependencyWatchdogProbe) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{118} +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdogProbe) 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 *SeedSettingDependencyWatchdogProbe) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdogProbe.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdogProbe.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdogProbe proto.InternalMessageInfo + func (m *SeedSettingExcessCapacityReservation) Reset() { *m = SeedSettingExcessCapacityReservation{} } func (*SeedSettingExcessCapacityReservation) ProtoMessage() {} func (*SeedSettingExcessCapacityReservation) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{115} + return fileDescriptor_f1caaec5647a9dbf, []int{119} } func (m *SeedSettingExcessCapacityReservation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3306,7 +3418,7 @@ var xxx_messageInfo_SeedSettingExcessCapacityReservation proto.InternalMessageIn func (m *SeedSettingLoadBalancerServices) Reset() { *m = SeedSettingLoadBalancerServices{} } func (*SeedSettingLoadBalancerServices) ProtoMessage() {} func (*SeedSettingLoadBalancerServices) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{116} + return fileDescriptor_f1caaec5647a9dbf, []int{120} } func (m *SeedSettingLoadBalancerServices) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3331,10 +3443,38 @@ func (m *SeedSettingLoadBalancerServices) XXX_DiscardUnknown() { var xxx_messageInfo_SeedSettingLoadBalancerServices proto.InternalMessageInfo +func (m *SeedSettingOwnerChecks) Reset() { *m = SeedSettingOwnerChecks{} } +func (*SeedSettingOwnerChecks) ProtoMessage() {} +func (*SeedSettingOwnerChecks) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{121} +} +func (m *SeedSettingOwnerChecks) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingOwnerChecks) 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 *SeedSettingOwnerChecks) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingOwnerChecks.Merge(m, src) +} +func (m *SeedSettingOwnerChecks) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingOwnerChecks) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingOwnerChecks.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingOwnerChecks proto.InternalMessageInfo + func (m *SeedSettingScheduling) Reset() { *m = SeedSettingScheduling{} } func (*SeedSettingScheduling) ProtoMessage() {} func (*SeedSettingScheduling) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{117} + return fileDescriptor_f1caaec5647a9dbf, []int{122} } func (m *SeedSettingScheduling) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3362,7 +3502,7 @@ var xxx_messageInfo_SeedSettingScheduling proto.InternalMessageInfo func (m *SeedSettingShootDNS) Reset() { *m = SeedSettingShootDNS{} } func (*SeedSettingShootDNS) ProtoMessage() {} func (*SeedSettingShootDNS) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{118} + return fileDescriptor_f1caaec5647a9dbf, []int{123} } func (m *SeedSettingShootDNS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3390,7 +3530,7 @@ var xxx_messageInfo_SeedSettingShootDNS proto.InternalMessageInfo func (m *SeedSettingVerticalPodAutoscaler) Reset() { *m = SeedSettingVerticalPodAutoscaler{} } func (*SeedSettingVerticalPodAutoscaler) ProtoMessage() {} func (*SeedSettingVerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{119} + return fileDescriptor_f1caaec5647a9dbf, []int{124} } func (m *SeedSettingVerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3418,7 +3558,7 @@ var xxx_messageInfo_SeedSettingVerticalPodAutoscaler proto.InternalMessageInfo func (m *SeedSettings) Reset() { *m = SeedSettings{} } func (*SeedSettings) ProtoMessage() {} func (*SeedSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{120} + return fileDescriptor_f1caaec5647a9dbf, []int{125} } func (m *SeedSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3446,7 +3586,7 @@ var xxx_messageInfo_SeedSettings proto.InternalMessageInfo func (m *SeedSpec) Reset() { *m = SeedSpec{} } func (*SeedSpec) ProtoMessage() {} func (*SeedSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{121} + return fileDescriptor_f1caaec5647a9dbf, []int{126} } func (m *SeedSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3474,7 +3614,7 @@ var xxx_messageInfo_SeedSpec proto.InternalMessageInfo func (m *SeedStatus) Reset() { *m = SeedStatus{} } func (*SeedStatus) ProtoMessage() {} func (*SeedStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{122} + return fileDescriptor_f1caaec5647a9dbf, []int{127} } func (m *SeedStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3642,7 @@ var xxx_messageInfo_SeedStatus proto.InternalMessageInfo func (m *SeedTaint) Reset() { *m = SeedTaint{} } func (*SeedTaint) ProtoMessage() {} func (*SeedTaint) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{123} + return fileDescriptor_f1caaec5647a9dbf, []int{128} } func (m *SeedTaint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3530,7 +3670,7 @@ var xxx_messageInfo_SeedTaint proto.InternalMessageInfo func (m *SeedVolume) Reset() { *m = SeedVolume{} } func (*SeedVolume) ProtoMessage() {} func (*SeedVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{124} + return fileDescriptor_f1caaec5647a9dbf, []int{129} } func (m *SeedVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3558,7 +3698,7 @@ var xxx_messageInfo_SeedVolume proto.InternalMessageInfo func (m *SeedVolumeProvider) Reset() { *m = SeedVolumeProvider{} } func (*SeedVolumeProvider) ProtoMessage() {} func (*SeedVolumeProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{125} + return fileDescriptor_f1caaec5647a9dbf, []int{130} } func (m *SeedVolumeProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3586,7 +3726,7 @@ var xxx_messageInfo_SeedVolumeProvider proto.InternalMessageInfo func (m *ServiceAccountConfig) Reset() { *m = ServiceAccountConfig{} } func (*ServiceAccountConfig) ProtoMessage() {} func (*ServiceAccountConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{126} + return fileDescriptor_f1caaec5647a9dbf, []int{131} } func (m *ServiceAccountConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3614,7 +3754,7 @@ var xxx_messageInfo_ServiceAccountConfig proto.InternalMessageInfo func (m *Shoot) Reset() { *m = Shoot{} } func (*Shoot) ProtoMessage() {} func (*Shoot) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{127} + return fileDescriptor_f1caaec5647a9dbf, []int{132} } func (m *Shoot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3642,7 +3782,7 @@ var xxx_messageInfo_Shoot proto.InternalMessageInfo func (m *ShootAdvertisedAddress) Reset() { *m = ShootAdvertisedAddress{} } func (*ShootAdvertisedAddress) ProtoMessage() {} func (*ShootAdvertisedAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{128} + return fileDescriptor_f1caaec5647a9dbf, []int{133} } func (m *ShootAdvertisedAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3670,7 +3810,7 @@ var xxx_messageInfo_ShootAdvertisedAddress proto.InternalMessageInfo func (m *ShootExtensionStatus) Reset() { *m = ShootExtensionStatus{} } func (*ShootExtensionStatus) ProtoMessage() {} func (*ShootExtensionStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{129} + return fileDescriptor_f1caaec5647a9dbf, []int{134} } func (m *ShootExtensionStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3698,7 +3838,7 @@ var xxx_messageInfo_ShootExtensionStatus proto.InternalMessageInfo func (m *ShootExtensionStatusList) Reset() { *m = ShootExtensionStatusList{} } func (*ShootExtensionStatusList) ProtoMessage() {} func (*ShootExtensionStatusList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{130} + return fileDescriptor_f1caaec5647a9dbf, []int{135} } func (m *ShootExtensionStatusList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3726,7 +3866,7 @@ var xxx_messageInfo_ShootExtensionStatusList proto.InternalMessageInfo func (m *ShootList) Reset() { *m = ShootList{} } func (*ShootList) ProtoMessage() {} func (*ShootList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{131} + return fileDescriptor_f1caaec5647a9dbf, []int{136} } func (m *ShootList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3754,7 +3894,7 @@ var xxx_messageInfo_ShootList proto.InternalMessageInfo func (m *ShootMachineImage) Reset() { *m = ShootMachineImage{} } func (*ShootMachineImage) ProtoMessage() {} func (*ShootMachineImage) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{132} + return fileDescriptor_f1caaec5647a9dbf, []int{137} } func (m *ShootMachineImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3782,7 +3922,7 @@ var xxx_messageInfo_ShootMachineImage proto.InternalMessageInfo func (m *ShootNetworks) Reset() { *m = ShootNetworks{} } func (*ShootNetworks) ProtoMessage() {} func (*ShootNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{133} + return fileDescriptor_f1caaec5647a9dbf, []int{138} } func (m *ShootNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3810,7 +3950,7 @@ var xxx_messageInfo_ShootNetworks proto.InternalMessageInfo func (m *ShootSpec) Reset() { *m = ShootSpec{} } func (*ShootSpec) ProtoMessage() {} func (*ShootSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{134} + return fileDescriptor_f1caaec5647a9dbf, []int{139} } func (m *ShootSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3838,7 +3978,7 @@ var xxx_messageInfo_ShootSpec proto.InternalMessageInfo func (m *ShootState) Reset() { *m = ShootState{} } func (*ShootState) ProtoMessage() {} func (*ShootState) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{135} + return fileDescriptor_f1caaec5647a9dbf, []int{140} } func (m *ShootState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3866,7 +4006,7 @@ var xxx_messageInfo_ShootState proto.InternalMessageInfo func (m *ShootStateList) Reset() { *m = ShootStateList{} } func (*ShootStateList) ProtoMessage() {} func (*ShootStateList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{136} + return fileDescriptor_f1caaec5647a9dbf, []int{141} } func (m *ShootStateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3894,7 +4034,7 @@ var xxx_messageInfo_ShootStateList proto.InternalMessageInfo func (m *ShootStateSpec) Reset() { *m = ShootStateSpec{} } func (*ShootStateSpec) ProtoMessage() {} func (*ShootStateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{137} + return fileDescriptor_f1caaec5647a9dbf, []int{142} } func (m *ShootStateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3922,7 +4062,7 @@ var xxx_messageInfo_ShootStateSpec proto.InternalMessageInfo func (m *ShootStatus) Reset() { *m = ShootStatus{} } func (*ShootStatus) ProtoMessage() {} func (*ShootStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{138} + return fileDescriptor_f1caaec5647a9dbf, []int{143} } func (m *ShootStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3950,7 +4090,7 @@ var xxx_messageInfo_ShootStatus proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{139} + return fileDescriptor_f1caaec5647a9dbf, []int{144} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3978,7 +4118,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *VerticalPodAutoscaler) Reset() { *m = VerticalPodAutoscaler{} } func (*VerticalPodAutoscaler) ProtoMessage() {} func (*VerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{140} + return fileDescriptor_f1caaec5647a9dbf, []int{145} } func (m *VerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4006,7 +4146,7 @@ var xxx_messageInfo_VerticalPodAutoscaler proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{141} + return fileDescriptor_f1caaec5647a9dbf, []int{146} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4034,7 +4174,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeType) Reset() { *m = VolumeType{} } func (*VolumeType) ProtoMessage() {} func (*VolumeType) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{142} + return fileDescriptor_f1caaec5647a9dbf, []int{147} } func (m *VolumeType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4062,7 +4202,7 @@ var xxx_messageInfo_VolumeType proto.InternalMessageInfo func (m *WatchCacheSizes) Reset() { *m = WatchCacheSizes{} } func (*WatchCacheSizes) ProtoMessage() {} func (*WatchCacheSizes) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{143} + return fileDescriptor_f1caaec5647a9dbf, []int{148} } func (m *WatchCacheSizes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4090,7 +4230,7 @@ var xxx_messageInfo_WatchCacheSizes proto.InternalMessageInfo func (m *Worker) Reset() { *m = Worker{} } func (*Worker) ProtoMessage() {} func (*Worker) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{144} + return fileDescriptor_f1caaec5647a9dbf, []int{149} } func (m *Worker) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4118,7 +4258,7 @@ var xxx_messageInfo_Worker proto.InternalMessageInfo func (m *WorkerKubernetes) Reset() { *m = WorkerKubernetes{} } func (*WorkerKubernetes) ProtoMessage() {} func (*WorkerKubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{145} + return fileDescriptor_f1caaec5647a9dbf, []int{150} } func (m *WorkerKubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4146,7 +4286,7 @@ var xxx_messageInfo_WorkerKubernetes proto.InternalMessageInfo func (m *WorkerSystemComponents) Reset() { *m = WorkerSystemComponents{} } func (*WorkerSystemComponents) ProtoMessage() {} func (*WorkerSystemComponents) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{146} + return fileDescriptor_f1caaec5647a9dbf, []int{151} } func (m *WorkerSystemComponents) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4286,6 +4426,7 @@ func init() { proto.RegisterType((*ResourceWatchCacheSize)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ResourceWatchCacheSize") proto.RegisterType((*SecretBinding)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SecretBinding") proto.RegisterType((*SecretBindingList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SecretBindingList") + proto.RegisterType((*SecretBindingProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SecretBindingProvider") proto.RegisterType((*Seed)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.Seed") proto.RegisterType((*SeedBackup)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedBackup") proto.RegisterType((*SeedDNS)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedDNS") @@ -4294,9 +4435,13 @@ func init() { proto.RegisterType((*SeedNetworks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedNetworks") proto.RegisterType((*SeedProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedProvider") proto.RegisterType((*SeedSelector)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSelector") + proto.RegisterType((*SeedSettingDependencyWatchdog)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingDependencyWatchdog") + proto.RegisterType((*SeedSettingDependencyWatchdogEndpoint)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingDependencyWatchdogEndpoint") + proto.RegisterType((*SeedSettingDependencyWatchdogProbe)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingDependencyWatchdogProbe") proto.RegisterType((*SeedSettingExcessCapacityReservation)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingExcessCapacityReservation") proto.RegisterType((*SeedSettingLoadBalancerServices)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingLoadBalancerServices") proto.RegisterMapType((map[string]string)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingLoadBalancerServices.AnnotationsEntry") + proto.RegisterType((*SeedSettingOwnerChecks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingOwnerChecks") proto.RegisterType((*SeedSettingScheduling)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingScheduling") proto.RegisterType((*SeedSettingShootDNS)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingShootDNS") proto.RegisterType((*SeedSettingVerticalPodAutoscaler)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedSettingVerticalPodAutoscaler") @@ -4336,614 +4481,627 @@ func init() { } var fileDescriptor_f1caaec5647a9dbf = []byte{ - // 9706 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0x98, 0x7a, 0xc8, 0x21, 0x87, 0x6f, 0x48, 0x2e, 0x59, 0xfb, 0x71, 0xbc, 0xbd, 0xbd, 0x9d, - 0x55, 0xeb, 0x4e, 0xd9, 0x8b, 0x64, 0xae, 0x4f, 0x27, 0x59, 0x77, 0xa7, 0xbb, 0xd3, 0x71, 0x66, - 0xb8, 0xbb, 0xa3, 0x5d, 0xee, 0xf2, 0x6a, 0x96, 0x77, 0x3a, 0xc9, 0xd0, 0xa9, 0xd9, 0x5d, 0x1c, - 0xf6, 0xb1, 0xa7, 0x7b, 0xae, 0xbb, 0x87, 0x4b, 0xee, 0x29, 0x91, 0x72, 0xb6, 0xe4, 0xd8, 0x42, - 0x82, 0x04, 0x76, 0xa0, 0x40, 0x12, 0xe4, 0x0f, 0x04, 0x81, 0x82, 0x24, 0x90, 0xe3, 0x20, 0x0a, - 0x9c, 0x04, 0xfe, 0x61, 0xff, 0xb0, 0x20, 0x07, 0x8a, 0x91, 0x38, 0x86, 0x62, 0x38, 0x54, 0xc4, - 0x18, 0x89, 0x93, 0x38, 0x3f, 0x02, 0x23, 0x08, 0xb0, 0x70, 0x82, 0xa0, 0x3e, 0xba, 0xbb, 0xfa, - 0x8b, 0x1c, 0x76, 0x2f, 0x79, 0xb7, 0xbf, 0xc8, 0xa9, 0x7a, 0xfd, 0x5e, 0x7d, 0xbc, 0x7a, 0xf5, - 0xea, 0xd5, 0xab, 0xf7, 0xa0, 0xd5, 0x33, 0xfd, 0xcd, 0xe1, 0xfa, 0xa2, 0xee, 0xf4, 0xaf, 0xf4, - 0x34, 0xd7, 0x20, 0x36, 0x71, 0xa3, 0x7f, 0x06, 0x5b, 0xbd, 0x2b, 0xda, 0xc0, 0xf4, 0xae, 0xe8, - 0x8e, 0x4b, 0xae, 0x6c, 0x3f, 0xad, 0x59, 0x83, 0x4d, 0xed, 0xe9, 0x2b, 0x3d, 0x5a, 0xa9, 0xf9, - 0xc4, 0x58, 0x1c, 0xb8, 0x8e, 0xef, 0xa0, 0x67, 0x22, 0x24, 0x8b, 0xc1, 0xb7, 0xd1, 0x3f, 0x83, - 0xad, 0xde, 0x22, 0x45, 0xb2, 0x48, 0x91, 0x2c, 0x06, 0x48, 0xce, 0x37, 0x8f, 0x44, 0x79, 0x9d, - 0xf8, 0x69, 0xc2, 0xe7, 0x7f, 0x42, 0xc6, 0xe1, 0xf4, 0x9c, 0x2b, 0xac, 0x78, 0x7d, 0xb8, 0xc1, - 0x7e, 0xb1, 0x1f, 0xec, 0x3f, 0x01, 0xfe, 0xd4, 0xd6, 0xb3, 0xde, 0xa2, 0xe9, 0x50, 0xc4, 0x57, - 0xb4, 0xa1, 0xef, 0x78, 0xba, 0x66, 0x99, 0x76, 0xef, 0xca, 0x76, 0x1a, 0xb3, 0x2a, 0x81, 0x8a, - 0x26, 0x1c, 0x08, 0xe3, 0xae, 0x6b, 0x7a, 0x16, 0xcc, 0x47, 0x23, 0x98, 0xbe, 0xa6, 0x6f, 0x9a, - 0x36, 0x71, 0x77, 0x83, 0xce, 0x5d, 0x71, 0x89, 0xe7, 0x0c, 0x5d, 0x9d, 0x1c, 0xe9, 0x2b, 0xef, - 0x4a, 0x9f, 0xf8, 0x5a, 0x16, 0xad, 0x2b, 0x79, 0x5f, 0xb9, 0x43, 0xdb, 0x37, 0xfb, 0x69, 0x32, - 0x3f, 0x75, 0xd8, 0x07, 0x9e, 0xbe, 0x49, 0xfa, 0x5a, 0xea, 0xbb, 0x67, 0xf2, 0xbe, 0x1b, 0xfa, - 0xa6, 0x75, 0xc5, 0xb4, 0x7d, 0xcf, 0x77, 0x93, 0x1f, 0xa9, 0x1f, 0x81, 0xea, 0x92, 0x61, 0x38, - 0x36, 0x7a, 0x0a, 0x26, 0x89, 0xad, 0xad, 0x5b, 0xc4, 0x58, 0x50, 0x2e, 0x29, 0x97, 0x6b, 0xcd, - 0x53, 0xdf, 0xdb, 0x6b, 0xbc, 0x6f, 0x7f, 0xaf, 0x31, 0xb9, 0xcc, 0x8b, 0x71, 0x50, 0xaf, 0x7e, - 0xad, 0x02, 0x13, 0xec, 0x23, 0x0f, 0xfd, 0xa2, 0x02, 0xa7, 0xb7, 0x86, 0xeb, 0xc4, 0xb5, 0x89, - 0x4f, 0xbc, 0xb6, 0xe6, 0x6d, 0xae, 0x3b, 0x9a, 0xcb, 0x51, 0xd4, 0x3f, 0x72, 0x7d, 0xb1, 0x00, - 0x0b, 0x2e, 0xde, 0x48, 0xe3, 0x6b, 0x3e, 0xb2, 0xbf, 0xd7, 0x38, 0x9d, 0x51, 0x81, 0xb3, 0xa8, - 0xa3, 0xbb, 0x30, 0x6d, 0xf7, 0x4c, 0x7b, 0xa7, 0x63, 0xf7, 0x5c, 0xe2, 0x79, 0x0b, 0x15, 0xd6, - 0x9a, 0xa5, 0x42, 0xad, 0xb9, 0x25, 0x21, 0x6a, 0xce, 0xed, 0xef, 0x35, 0xa6, 0xe5, 0x12, 0x1c, - 0x23, 0xa4, 0x7e, 0x45, 0x81, 0x53, 0x4b, 0x46, 0xdf, 0xf4, 0x3c, 0xd3, 0xb1, 0x57, 0xad, 0x61, - 0xcf, 0xb4, 0xd1, 0x25, 0x18, 0xb7, 0xb5, 0x3e, 0x61, 0x43, 0x32, 0xd5, 0x9c, 0x16, 0xa3, 0x3a, - 0x7e, 0x4b, 0xeb, 0x13, 0xcc, 0x6a, 0xd0, 0x2b, 0x30, 0xa1, 0x3b, 0xf6, 0x86, 0xd9, 0x13, 0x0d, - 0xfd, 0x89, 0x45, 0x3e, 0x93, 0x8b, 0xf2, 0x4c, 0xb2, 0xf6, 0x09, 0x0e, 0x58, 0xc4, 0xda, 0xdd, - 0xe5, 0x1d, 0x9f, 0xd8, 0x94, 0x4c, 0x13, 0xf6, 0xf7, 0x1a, 0x13, 0x2d, 0x86, 0x00, 0x0b, 0x44, - 0xea, 0x55, 0xa8, 0x2d, 0x59, 0xc4, 0xf5, 0x4d, 0xbb, 0x87, 0x9e, 0x87, 0x59, 0xd2, 0xd7, 0x4c, - 0x0b, 0x13, 0x9d, 0x98, 0xdb, 0xc4, 0xf5, 0x16, 0x94, 0x4b, 0x63, 0x97, 0xa7, 0x9a, 0x68, 0x7f, - 0xaf, 0x31, 0xbb, 0x1c, 0xab, 0xc1, 0x09, 0x48, 0xf5, 0x1d, 0x05, 0xea, 0x4b, 0x43, 0xc3, 0xf4, - 0x39, 0x7e, 0xe4, 0x41, 0x5d, 0xa3, 0x3f, 0x57, 0x1d, 0xcb, 0xd4, 0x77, 0xc5, 0x34, 0xbf, 0x5c, - 0x68, 0x60, 0x97, 0x22, 0x3c, 0xcd, 0x53, 0xfb, 0x7b, 0x8d, 0xba, 0x54, 0x80, 0x65, 0x2a, 0xea, - 0x26, 0xc8, 0x75, 0xe8, 0x75, 0x98, 0xe6, 0xbd, 0x5c, 0xd1, 0x06, 0x98, 0x6c, 0x88, 0x46, 0x7c, - 0x40, 0x1a, 0xb4, 0x80, 0xd2, 0xe2, 0xed, 0xf5, 0x37, 0x89, 0xee, 0x63, 0xb2, 0x41, 0x5c, 0x62, - 0xeb, 0x84, 0xcf, 0x5f, 0x4b, 0xfa, 0x18, 0xc7, 0x50, 0xa9, 0x3f, 0x52, 0x60, 0x6e, 0x69, 0x5b, - 0x33, 0x2d, 0x6d, 0xdd, 0xb4, 0x4c, 0x7f, 0xf7, 0x33, 0x8e, 0x4d, 0x46, 0x98, 0xc0, 0x35, 0x78, - 0x64, 0x68, 0x6b, 0xfc, 0x3b, 0x8b, 0xac, 0xf0, 0x29, 0xbb, 0xb3, 0x3b, 0x20, 0x94, 0xf5, 0xe8, - 0x50, 0x3f, 0xb6, 0xbf, 0xd7, 0x78, 0x64, 0x2d, 0x1b, 0x04, 0xe7, 0x7d, 0x8b, 0x30, 0x9c, 0x93, - 0xaa, 0x5e, 0x75, 0xac, 0x61, 0x5f, 0x60, 0x1d, 0x63, 0x58, 0xcf, 0xef, 0xef, 0x35, 0xce, 0xad, - 0x65, 0x42, 0xe0, 0x9c, 0x2f, 0xd5, 0xef, 0x57, 0x60, 0xba, 0xa9, 0xe9, 0x5b, 0xc3, 0x41, 0x73, - 0xa8, 0x6f, 0x11, 0x1f, 0x7d, 0x1e, 0x6a, 0x54, 0x72, 0x19, 0x9a, 0xaf, 0x89, 0x91, 0xfc, 0xc9, - 0x5c, 0xf6, 0x63, 0xb3, 0x48, 0xa1, 0xa3, 0xb1, 0x5d, 0x21, 0xbe, 0xd6, 0x44, 0x62, 0x4c, 0x20, - 0x2a, 0xc3, 0x21, 0x56, 0xd4, 0x83, 0x71, 0x6f, 0x40, 0x74, 0xc1, 0xdc, 0xcb, 0x85, 0x98, 0x45, - 0x6e, 0x72, 0x77, 0x40, 0xf4, 0x68, 0x1a, 0xe8, 0x2f, 0xcc, 0x08, 0x20, 0x07, 0x26, 0x3c, 0x5f, - 0xf3, 0x87, 0x74, 0x7c, 0x28, 0xa9, 0x6b, 0xe5, 0x49, 0x31, 0x74, 0xcd, 0x59, 0x41, 0x6c, 0x82, - 0xff, 0xc6, 0x82, 0x8c, 0xfa, 0x43, 0x05, 0xe6, 0x64, 0xf0, 0x9b, 0xa6, 0xe7, 0xa3, 0x9f, 0x4e, - 0x0d, 0xe8, 0xe2, 0x68, 0x03, 0x4a, 0xbf, 0x66, 0xc3, 0x39, 0x27, 0xc8, 0xd5, 0x82, 0x12, 0x69, - 0x30, 0x37, 0xa0, 0x6a, 0xfa, 0xa4, 0xcf, 0x19, 0xab, 0xa8, 0x4c, 0x93, 0xdb, 0xdc, 0x9c, 0x11, - 0xd4, 0xaa, 0x1d, 0x8a, 0x17, 0x73, 0xf4, 0xea, 0xe7, 0xe1, 0x8c, 0x0c, 0xb5, 0xea, 0x3a, 0xdb, - 0xa6, 0x41, 0x5c, 0xba, 0x18, 0xfc, 0xdd, 0x41, 0x6a, 0x31, 0x50, 0xe6, 0xc2, 0xac, 0x06, 0x7d, - 0x10, 0x26, 0x5c, 0xd2, 0x33, 0x1d, 0x9b, 0x4d, 0xf8, 0x54, 0x34, 0x78, 0x98, 0x95, 0x62, 0x51, - 0xab, 0xfe, 0xf7, 0x4a, 0x7c, 0xf0, 0xe8, 0x44, 0xa2, 0xbb, 0x50, 0x1b, 0x08, 0x52, 0x62, 0xf0, - 0x3a, 0xa5, 0x7b, 0x18, 0xb4, 0x3d, 0x1a, 0xd7, 0xa0, 0x04, 0x87, 0xc4, 0x90, 0x09, 0xb3, 0xc1, - 0xff, 0xad, 0x12, 0xb2, 0x98, 0xc9, 0xd4, 0xd5, 0x18, 0x22, 0x9c, 0x40, 0x8c, 0xee, 0xc0, 0x94, - 0x47, 0x74, 0x97, 0x50, 0xb9, 0x24, 0x38, 0x35, 0x53, 0x78, 0x75, 0x03, 0x20, 0x21, 0xbc, 0xe6, - 0x45, 0xf3, 0xa7, 0xc2, 0x0a, 0x1c, 0x21, 0x42, 0x17, 0x60, 0xdc, 0x23, 0xc4, 0x58, 0x18, 0x67, - 0x83, 0x5e, 0x63, 0x4b, 0x83, 0x10, 0x03, 0xb3, 0x52, 0xf5, 0xd7, 0xc6, 0x01, 0xa5, 0x19, 0x5b, - 0xee, 0x35, 0x2f, 0x11, 0x83, 0x5e, 0xa6, 0xd7, 0x62, 0x8d, 0x24, 0x10, 0xa3, 0xb7, 0x61, 0xc6, - 0xd2, 0x3c, 0xff, 0xf6, 0x80, 0xaa, 0x1f, 0x01, 0x77, 0xd4, 0x3f, 0xd2, 0x2c, 0x34, 0xbd, 0x37, - 0x65, 0x4c, 0xcd, 0xf9, 0xfd, 0xbd, 0xc6, 0x4c, 0xac, 0x08, 0xc7, 0x69, 0xa1, 0x2d, 0x98, 0xa2, - 0x05, 0xcb, 0xae, 0xeb, 0xb8, 0x62, 0xc8, 0x5f, 0x2a, 0x4c, 0x98, 0x61, 0x69, 0xce, 0xd0, 0x99, - 0x08, 0x7f, 0xe2, 0x08, 0x3f, 0xfa, 0x14, 0x20, 0x67, 0xdd, 0x23, 0xee, 0x36, 0x31, 0xae, 0x71, - 0x6d, 0x8b, 0x76, 0x97, 0xce, 0xcb, 0x58, 0xf3, 0xbc, 0x98, 0x43, 0x74, 0x3b, 0x05, 0x81, 0x33, - 0xbe, 0x42, 0x5b, 0x80, 0x42, 0x8d, 0x2d, 0x9c, 0xf6, 0x85, 0xea, 0xe8, 0x4c, 0x73, 0x8e, 0x12, - 0xbb, 0x96, 0x42, 0x81, 0x33, 0xd0, 0xaa, 0xbf, 0x5b, 0x81, 0x3a, 0x67, 0x92, 0x65, 0xdb, 0x77, - 0x77, 0x4f, 0x60, 0x6b, 0xd8, 0x88, 0x6d, 0x0d, 0xed, 0x12, 0x4b, 0x9d, 0xb5, 0x38, 0x77, 0x67, - 0xb0, 0x13, 0x3b, 0xc3, 0xd5, 0xd2, 0x94, 0x0e, 0xde, 0x18, 0xfe, 0x50, 0x81, 0x53, 0x12, 0xf4, - 0x09, 0xec, 0x0b, 0x24, 0xbe, 0x2f, 0xbc, 0x5c, 0xb6, 0x83, 0x39, 0xdb, 0x82, 0x1e, 0xeb, 0x17, - 0x13, 0xd9, 0x1f, 0x01, 0x58, 0x67, 0x32, 0xe5, 0x56, 0xa4, 0x24, 0x85, 0xb3, 0xde, 0x0c, 0x6b, - 0xb0, 0x04, 0x15, 0x0a, 0xab, 0x4a, 0xa6, 0xb0, 0xfa, 0xf3, 0x0a, 0xcc, 0xa7, 0xc6, 0x3a, 0x2d, - 0x40, 0x94, 0x77, 0x4b, 0x80, 0x54, 0xde, 0x15, 0x01, 0x32, 0x56, 0x48, 0x80, 0x5c, 0x86, 0x1a, - 0x1d, 0x53, 0x36, 0x37, 0x7c, 0x6b, 0x98, 0xa6, 0x1c, 0xd4, 0x15, 0x65, 0x38, 0xac, 0x55, 0x7f, - 0x47, 0x81, 0xb1, 0x16, 0xee, 0xa0, 0x0f, 0xc5, 0xd4, 0xdd, 0x47, 0x64, 0x75, 0xf7, 0xfe, 0x5e, - 0x63, 0xb2, 0x85, 0x3b, 0x92, 0xe6, 0xfb, 0x37, 0x15, 0x98, 0xd7, 0x1d, 0xdb, 0xd7, 0x28, 0xef, - 0x62, 0xbe, 0x37, 0x04, 0x3c, 0x58, 0x4c, 0xd3, 0x6b, 0x25, 0xb0, 0x35, 0x1f, 0x15, 0x2d, 0x98, - 0x4f, 0xd6, 0x78, 0x38, 0x4d, 0x5a, 0x5d, 0x83, 0xa9, 0x96, 0xe5, 0x0c, 0x8d, 0x8e, 0xbd, 0xe1, - 0x3c, 0x40, 0x65, 0xe5, 0x3f, 0x28, 0x30, 0xcd, 0xf0, 0xae, 0xba, 0xce, 0x86, 0x69, 0x91, 0x87, - 0x44, 0x6d, 0x96, 0x9b, 0x9c, 0x27, 0x1c, 0x99, 0x16, 0x2b, 0x03, 0x3e, 0x2c, 0x5a, 0xac, 0xdc, - 0xe6, 0x1c, 0x71, 0xf5, 0x8d, 0xc9, 0x78, 0xd7, 0x98, 0xc0, 0xba, 0x0c, 0x35, 0x5d, 0x6b, 0x0e, - 0x6d, 0xc3, 0x0a, 0x39, 0x83, 0x36, 0xb3, 0xb5, 0xc4, 0xcb, 0x70, 0x58, 0x8b, 0xde, 0x06, 0x88, - 0xcc, 0x0b, 0x62, 0x22, 0xae, 0x95, 0xb4, 0x69, 0x74, 0x89, 0x4f, 0x4f, 0xe5, 0x5e, 0x34, 0xfb, - 0x51, 0x1d, 0x96, 0xc8, 0xa1, 0xbf, 0x0a, 0x33, 0x62, 0x98, 0x3b, 0x7d, 0xad, 0x27, 0x0e, 0x7d, - 0x45, 0xc7, 0x6a, 0x45, 0xc2, 0xd4, 0x3c, 0x2b, 0x28, 0xcf, 0xc8, 0xa5, 0x1e, 0x8e, 0x93, 0x43, - 0xf7, 0x60, 0xba, 0x2f, 0x9f, 0x64, 0xc7, 0x4b, 0x6c, 0x2c, 0xd2, 0xb1, 0xb6, 0x79, 0x46, 0x50, - 0x9f, 0x8e, 0x1d, 0x82, 0x63, 0xb4, 0x32, 0xb4, 0xf1, 0xea, 0x71, 0x69, 0xe3, 0x1b, 0x30, 0xc9, - 0xd7, 0xb8, 0xb7, 0x30, 0xc1, 0x7a, 0xf8, 0x89, 0x42, 0x3d, 0xe4, 0xf2, 0x22, 0x32, 0x9a, 0xf1, - 0xdf, 0x1e, 0x0e, 0x90, 0xa3, 0xbb, 0x30, 0x4d, 0x45, 0x6d, 0x97, 0x58, 0x44, 0xf7, 0x1d, 0x77, - 0x61, 0xb2, 0x84, 0x4d, 0xaa, 0x2b, 0x21, 0xe2, 0x36, 0x0d, 0xb9, 0x04, 0xc7, 0x08, 0x85, 0x42, - 0xb0, 0x96, 0x2b, 0x04, 0xb7, 0xa1, 0xbe, 0x2d, 0x19, 0x17, 0xa6, 0xd8, 0x30, 0x7c, 0xb2, 0x50, - 0xcb, 0x22, 0x53, 0x43, 0xf3, 0xb4, 0xa0, 0x54, 0x97, 0xcd, 0x12, 0x32, 0x21, 0xf5, 0xdb, 0x35, - 0x98, 0x6f, 0x59, 0x43, 0xcf, 0x27, 0xee, 0x92, 0xb0, 0xfb, 0x12, 0x17, 0xbd, 0xa3, 0xc0, 0x39, - 0xf6, 0x6f, 0xdb, 0xb9, 0x6b, 0xb7, 0x89, 0xa5, 0xed, 0x2e, 0x6d, 0x50, 0x08, 0xc3, 0x38, 0x9a, - 0x20, 0x6a, 0x0f, 0xc5, 0xee, 0xce, 0xcc, 0x24, 0xdd, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xfa, 0xaa, - 0x02, 0x8f, 0x66, 0x54, 0xb5, 0x89, 0x45, 0x7c, 0x22, 0x24, 0xc1, 0x51, 0xdb, 0xf1, 0xf8, 0xfe, - 0x5e, 0xe3, 0xd1, 0x6e, 0x1e, 0x52, 0x9c, 0x4f, 0x8f, 0xee, 0xb2, 0xe7, 0x33, 0x6a, 0xaf, 0x6a, - 0xa6, 0x35, 0x74, 0x89, 0xd0, 0x69, 0x8f, 0xda, 0x9c, 0x8b, 0xfb, 0x7b, 0x8d, 0xf3, 0xdd, 0x5c, - 0xac, 0xf8, 0x00, 0x8a, 0xe8, 0x8b, 0x70, 0x36, 0xac, 0x5d, 0xb3, 0x6d, 0x42, 0x0c, 0x62, 0xdc, - 0x31, 0x85, 0x8a, 0x71, 0xf4, 0xa6, 0x3c, 0xba, 0xbf, 0xd7, 0x38, 0xdb, 0xcd, 0x42, 0x88, 0xb3, - 0xe9, 0xa0, 0x1e, 0x3c, 0x1e, 0x55, 0xf8, 0xa6, 0x65, 0xde, 0x63, 0x98, 0xee, 0x6c, 0xba, 0xc4, - 0xdb, 0x74, 0x2c, 0x83, 0xc9, 0x0b, 0xa5, 0xf9, 0xfe, 0xfd, 0xbd, 0xc6, 0xe3, 0xdd, 0x83, 0x00, - 0xf1, 0xc1, 0x78, 0x90, 0x01, 0xd3, 0x9e, 0xae, 0xd9, 0x1d, 0xdb, 0x27, 0xee, 0xb6, 0x66, 0x2d, - 0x4c, 0x14, 0xea, 0x20, 0x5f, 0xa3, 0x12, 0x1e, 0x1c, 0xc3, 0x8a, 0x9e, 0x85, 0x1a, 0xd9, 0x19, - 0x68, 0xb6, 0x41, 0xb8, 0x60, 0x98, 0x6a, 0x5e, 0xa0, 0x5b, 0xd2, 0xb2, 0x28, 0xbb, 0xbf, 0xd7, - 0x98, 0x0e, 0xfe, 0x5f, 0x71, 0x0c, 0x82, 0x43, 0x68, 0xf4, 0x05, 0x38, 0xd3, 0xd7, 0x76, 0x6e, - 0x39, 0x06, 0x61, 0x72, 0x8e, 0x8a, 0x3d, 0x36, 0x11, 0xb5, 0x42, 0xed, 0x5c, 0xd8, 0xdf, 0x6b, - 0x9c, 0x59, 0xc9, 0xc0, 0x87, 0x33, 0xa9, 0xd0, 0x69, 0xe8, 0x6b, 0x3b, 0xd7, 0x5c, 0x4d, 0x27, - 0x1b, 0x43, 0xeb, 0x0e, 0x71, 0xfb, 0xa6, 0xcd, 0x30, 0x75, 0x89, 0xee, 0xd8, 0x06, 0x95, 0x25, - 0xca, 0xe5, 0x2a, 0x9f, 0x86, 0x95, 0x83, 0x00, 0xf1, 0xc1, 0x78, 0xd4, 0xff, 0xa1, 0x40, 0x5d, - 0x88, 0x0a, 0xa6, 0xd9, 0xe9, 0x50, 0xd5, 0xe9, 0xbe, 0x2e, 0x44, 0xc2, 0x4b, 0xc5, 0x15, 0x08, - 0x8a, 0x2e, 0xd2, 0x1e, 0x58, 0x11, 0xe6, 0xb8, 0xd1, 0xdd, 0x8c, 0xed, 0xbf, 0x55, 0x72, 0xfb, - 0x67, 0xe4, 0x0e, 0xd9, 0xfa, 0xd5, 0xbd, 0x31, 0x98, 0x6a, 0x39, 0xb6, 0x61, 0x32, 0x15, 0xfe, - 0xe9, 0x98, 0x16, 0xfb, 0xb8, 0x2c, 0xc0, 0xef, 0xef, 0x35, 0x66, 0x42, 0x40, 0x49, 0xa2, 0x3f, - 0x17, 0x9e, 0x77, 0xb9, 0x5a, 0xfb, 0xfe, 0xf8, 0x39, 0xf5, 0xfe, 0x5e, 0xe3, 0x54, 0xf8, 0x59, - 0xfc, 0xe8, 0x8a, 0xb6, 0x01, 0xd1, 0x93, 0xc8, 0x1d, 0x57, 0xb3, 0x3d, 0x8e, 0x96, 0xb2, 0x13, - 0x17, 0x31, 0x7f, 0x79, 0x34, 0x76, 0xa2, 0x5f, 0x44, 0x07, 0x95, 0x9b, 0x29, 0x6c, 0x38, 0x83, - 0x02, 0x7a, 0x13, 0x66, 0x69, 0xe9, 0xda, 0xc0, 0xd0, 0x7c, 0x22, 0xc9, 0x92, 0xa3, 0xd0, 0x3c, - 0x27, 0x68, 0xce, 0xde, 0x8c, 0x61, 0xc2, 0x09, 0xcc, 0x5c, 0xeb, 0xd7, 0x3c, 0xc7, 0x66, 0x62, - 0x22, 0xa6, 0xf5, 0xd3, 0x52, 0x2c, 0x6a, 0xd1, 0x53, 0x30, 0xd9, 0x27, 0x9e, 0xa7, 0xf5, 0x08, - 0x5b, 0xf7, 0x53, 0xd1, 0xf6, 0xbe, 0xc2, 0x8b, 0x71, 0x50, 0x8f, 0x3e, 0x0c, 0x55, 0xdd, 0x31, - 0x88, 0xb7, 0x30, 0xc9, 0x4c, 0xf3, 0xe7, 0x18, 0x33, 0xd1, 0x82, 0xfb, 0x7b, 0x8d, 0x29, 0x76, - 0xac, 0xa3, 0xbf, 0x30, 0x07, 0x52, 0x7f, 0x99, 0xaa, 0xdc, 0x89, 0xb3, 0x4b, 0xde, 0x3d, 0x03, - 0x9f, 0x56, 0x76, 0xda, 0x3a, 0x39, 0x23, 0xa5, 0xfa, 0xf3, 0x15, 0x38, 0x43, 0x5b, 0xe8, 0x3a, - 0x96, 0x45, 0xf7, 0xa1, 0x81, 0xe5, 0xec, 0xf6, 0x89, 0x7d, 0x12, 0xf7, 0x05, 0x81, 0xc2, 0x52, - 0xc9, 0x55, 0x58, 0xfa, 0xa9, 0x71, 0x18, 0x2b, 0x32, 0x0e, 0x21, 0xbb, 0x1c, 0x32, 0x16, 0x7f, - 0xaa, 0xc0, 0x42, 0xd6, 0x58, 0x9c, 0xc0, 0x41, 0xc9, 0x8e, 0x1f, 0x94, 0x3a, 0x85, 0x8f, 0xd4, - 0xc9, 0xb6, 0xe7, 0x1c, 0x98, 0xfe, 0xb4, 0x02, 0xe7, 0x22, 0xf0, 0x8e, 0xed, 0xf9, 0x9a, 0x65, - 0x71, 0x4b, 0xc2, 0xf1, 0x4f, 0xfc, 0x5b, 0xb1, 0x13, 0xef, 0xed, 0x92, 0x7d, 0x95, 0x1b, 0x9f, - 0x6b, 0x18, 0xdc, 0x4d, 0x18, 0x06, 0x5f, 0x79, 0x90, 0x44, 0x0f, 0xb6, 0x11, 0xfe, 0x99, 0x02, - 0xe7, 0xb3, 0x3f, 0x3c, 0x01, 0xbe, 0x1a, 0xc4, 0xf9, 0xea, 0xc6, 0x03, 0xec, 0x76, 0x0e, 0x67, - 0xfd, 0x46, 0x25, 0xaf, 0xbb, 0xec, 0x50, 0xbe, 0x01, 0xa7, 0xe8, 0x49, 0xc9, 0xf3, 0x85, 0x2d, - 0xeb, 0x68, 0xf7, 0xba, 0x81, 0x95, 0xea, 0x14, 0x8e, 0xe3, 0xc0, 0x49, 0xa4, 0xe8, 0x16, 0x4c, - 0xd2, 0xd3, 0x11, 0xc5, 0x5f, 0x19, 0x1d, 0x7f, 0x28, 0xf7, 0xbb, 0xfc, 0x5b, 0x1c, 0x20, 0x41, - 0x3f, 0x0d, 0x33, 0x46, 0xb8, 0xa8, 0x0e, 0xb9, 0xd0, 0x49, 0x62, 0x65, 0x66, 0xc7, 0xb6, 0xfc, - 0x35, 0x8e, 0x23, 0x53, 0xff, 0xaf, 0x02, 0x17, 0x0e, 0x62, 0x2e, 0xe4, 0x02, 0xe8, 0xc1, 0x46, - 0xce, 0xef, 0xf5, 0x0b, 0x2b, 0x43, 0x01, 0x9a, 0x68, 0x91, 0x86, 0x45, 0x1e, 0x96, 0xa8, 0x64, - 0x5c, 0x1a, 0x55, 0x8e, 0xe9, 0xd2, 0x48, 0xfd, 0x9f, 0x8a, 0x2c, 0x8e, 0xe4, 0xc9, 0x7d, 0xe8, - 0xc4, 0x91, 0xdc, 0xf8, 0x5c, 0x53, 0xdc, 0x1f, 0x54, 0xe0, 0x52, 0xf6, 0x27, 0xd2, 0x0e, 0xfc, - 0x32, 0x4c, 0x0c, 0xb8, 0xfb, 0xc5, 0x18, 0xdb, 0x21, 0x2f, 0x53, 0xe1, 0xc2, 0x7d, 0x23, 0xee, - 0xef, 0x35, 0xce, 0x67, 0x49, 0x7b, 0xe1, 0x55, 0x21, 0xbe, 0x43, 0x66, 0xc2, 0x16, 0xc1, 0x35, - 0xad, 0x67, 0x46, 0x94, 0x2f, 0xda, 0x3a, 0xb1, 0x46, 0xb6, 0x3e, 0xbc, 0xa3, 0xc0, 0x6c, 0x8c, - 0xa7, 0xbd, 0x85, 0x2a, 0xe3, 0xd2, 0x62, 0x76, 0xfb, 0xd8, 0x6a, 0x89, 0x36, 0xf0, 0x58, 0xb1, - 0x87, 0x13, 0x14, 0x13, 0xa2, 0x56, 0x1e, 0xd6, 0x87, 0x4f, 0xd4, 0xca, 0xad, 0xcf, 0x11, 0xb5, - 0xdf, 0xaa, 0xe4, 0x75, 0x97, 0x89, 0xda, 0x1d, 0x98, 0x0a, 0x5c, 0xdc, 0x02, 0x91, 0x71, 0xad, - 0x74, 0xa3, 0x38, 0xbe, 0xe8, 0x8e, 0x3a, 0x28, 0xf1, 0x70, 0x44, 0x0c, 0x7d, 0x59, 0x01, 0x88, - 0xa6, 0x46, 0x2c, 0xac, 0xb5, 0x07, 0x38, 0x20, 0x92, 0x7e, 0x33, 0x4b, 0xd7, 0xb5, 0xc4, 0x17, - 0x12, 0x61, 0xf5, 0xd7, 0x2b, 0x80, 0xd2, 0x8d, 0xa7, 0x8a, 0xe7, 0x96, 0x69, 0x1b, 0x49, 0x05, - 0xfc, 0x86, 0x69, 0x1b, 0x98, 0xd5, 0x8c, 0xa0, 0x9a, 0xbe, 0x08, 0xa7, 0x7a, 0x96, 0xb3, 0xae, - 0x59, 0xd6, 0xae, 0xf0, 0x9b, 0x63, 0xab, 0xb4, 0xd6, 0x3c, 0x4d, 0xb7, 0xa7, 0x6b, 0xf1, 0x2a, - 0x9c, 0x84, 0x45, 0x03, 0x98, 0x73, 0xe9, 0x91, 0x57, 0x37, 0x2d, 0x76, 0x54, 0x71, 0x86, 0x7e, - 0x41, 0x9b, 0xca, 0x99, 0xfd, 0xbd, 0xc6, 0x1c, 0x4e, 0xe0, 0xc2, 0x29, 0xec, 0xe8, 0x49, 0x98, - 0x1c, 0xb8, 0x66, 0x5f, 0x73, 0x77, 0xd9, 0x61, 0xa8, 0xd6, 0xac, 0xd3, 0x7d, 0x6e, 0x95, 0x17, - 0xe1, 0xa0, 0x4e, 0xfd, 0xa6, 0x02, 0x63, 0xed, 0x5b, 0x5d, 0xa4, 0xc2, 0x84, 0xe1, 0xf4, 0x35, - 0xd3, 0x16, 0xa3, 0xc4, 0x9c, 0xcf, 0xda, 0xac, 0x04, 0x8b, 0x1a, 0xf4, 0x16, 0x4c, 0x05, 0x72, - 0xbc, 0xdc, 0x7d, 0x64, 0xfb, 0x56, 0x37, 0x74, 0xde, 0x08, 0x39, 0x2b, 0x28, 0xf1, 0x70, 0x44, - 0x45, 0xd5, 0x60, 0xbe, 0x7d, 0xab, 0xdb, 0xb1, 0x75, 0x6b, 0x68, 0x90, 0xe5, 0x1d, 0xf6, 0x87, - 0x76, 0xcd, 0xe4, 0x25, 0xc2, 0xe3, 0x8d, 0x75, 0x4d, 0x00, 0xe1, 0xa0, 0x8e, 0x82, 0x11, 0xfe, - 0x85, 0xf0, 0xd6, 0x62, 0x60, 0x02, 0x09, 0x0e, 0xea, 0xd4, 0x3f, 0xaa, 0x40, 0x5d, 0x6a, 0x10, - 0xea, 0xc3, 0x24, 0xef, 0x6f, 0xe0, 0x34, 0x71, 0xb5, 0x68, 0x1f, 0xe3, 0xcd, 0xe6, 0xe4, 0xf9, - 0x90, 0x7a, 0x38, 0xa0, 0x21, 0xcf, 0x53, 0x25, 0x7f, 0x9e, 0xd0, 0x22, 0x00, 0xf7, 0x09, 0x61, - 0x37, 0x7e, 0x7c, 0x83, 0x60, 0x4b, 0xa1, 0x1b, 0x96, 0x62, 0x09, 0x02, 0x5d, 0x10, 0x1c, 0x2d, - 0xb9, 0x8d, 0x48, 0xdc, 0xdc, 0x83, 0xea, 0x3d, 0xc7, 0x26, 0x9e, 0x30, 0xbf, 0x3f, 0xa8, 0x1e, - 0x4e, 0x51, 0x91, 0xf5, 0x19, 0x8a, 0x18, 0x73, 0xfc, 0xea, 0xaf, 0x2a, 0x00, 0x6d, 0xcd, 0xd7, - 0xb8, 0xad, 0x78, 0x04, 0x97, 0xbb, 0x0b, 0xb1, 0x95, 0x58, 0x4b, 0x5d, 0xeb, 0x8d, 0x7b, 0xe6, - 0xbd, 0xa0, 0xff, 0xe1, 0x36, 0xcf, 0xb1, 0x77, 0xcd, 0x7b, 0x04, 0xb3, 0x7a, 0xf4, 0x21, 0x98, - 0x22, 0xb6, 0xee, 0xee, 0x0e, 0x7c, 0xe1, 0x39, 0x53, 0xe3, 0xd7, 0xb2, 0xcb, 0x41, 0x21, 0x8e, - 0xea, 0xd5, 0xa7, 0x21, 0xae, 0xac, 0x1d, 0xde, 0x4a, 0x75, 0x1b, 0x6a, 0xcb, 0xb6, 0x31, 0x70, - 0x4c, 0xdb, 0x1f, 0xa1, 0x4f, 0x8f, 0xc3, 0xd8, 0xd0, 0xb5, 0x44, 0x97, 0xea, 0x02, 0x60, 0x6c, - 0x0d, 0xdf, 0xc4, 0xb4, 0x1c, 0x3d, 0x05, 0x93, 0x83, 0xa1, 0x3b, 0x70, 0xbc, 0xa0, 0x5f, 0xa1, - 0x56, 0xba, 0xca, 0x8b, 0x71, 0x50, 0xaf, 0xde, 0x57, 0x60, 0x6e, 0x79, 0x67, 0x60, 0xba, 0xcc, - 0xfd, 0x8f, 0xb8, 0x54, 0xe1, 0xa2, 0xdf, 0x6f, 0xf3, 0x7f, 0x45, 0x1b, 0xc2, 0xef, 0x05, 0x04, - 0x0e, 0xea, 0xd1, 0x06, 0xcc, 0x12, 0xf6, 0x39, 0x13, 0xaa, 0x5a, 0x68, 0xf2, 0x3e, 0x8a, 0x31, - 0x86, 0xbb, 0x97, 0xc6, 0xb0, 0xe0, 0x04, 0x56, 0xd4, 0x85, 0x59, 0xdd, 0xd2, 0x3c, 0xcf, 0xdc, - 0x30, 0xf5, 0xe8, 0x96, 0x7b, 0xaa, 0xf9, 0x21, 0xfa, 0x6d, 0x2b, 0x56, 0x73, 0x7f, 0xaf, 0x71, - 0x56, 0xb4, 0x33, 0x5e, 0x81, 0x13, 0x28, 0xd4, 0xaf, 0x57, 0x60, 0x66, 0x79, 0x67, 0xe0, 0x78, - 0x43, 0x97, 0x30, 0xd0, 0x13, 0xd0, 0x15, 0x9f, 0x82, 0xc9, 0x4d, 0xcd, 0x36, 0x2c, 0xe2, 0x8a, - 0xe9, 0x0b, 0xc7, 0xf6, 0x3a, 0x2f, 0xc6, 0x41, 0x3d, 0xfa, 0x02, 0x80, 0xa7, 0x6f, 0x12, 0x63, - 0x68, 0x99, 0x76, 0x60, 0xb8, 0xb8, 0x59, 0x68, 0x61, 0xc5, 0x3a, 0xd9, 0x0d, 0x71, 0x8a, 0xf5, - 0x1e, 0xfe, 0xc6, 0x12, 0x3d, 0xf5, 0x8f, 0x14, 0x98, 0x8f, 0x7d, 0x77, 0x02, 0x1a, 0x50, 0x2f, - 0xae, 0x01, 0x35, 0xcb, 0x77, 0x36, 0x47, 0xf1, 0xf9, 0x85, 0x0a, 0x3c, 0x92, 0x33, 0x28, 0xa9, - 0xfb, 0x37, 0xe5, 0xa4, 0xee, 0xdf, 0xb6, 0xa1, 0xee, 0x3b, 0x96, 0xf0, 0xc7, 0x08, 0xc6, 0xa0, - 0xd8, 0xed, 0xda, 0x9d, 0x10, 0x4f, 0x74, 0xbb, 0x16, 0x95, 0x79, 0x58, 0x26, 0xa4, 0xfe, 0xb6, - 0x02, 0x53, 0xe1, 0x69, 0x6b, 0x04, 0x57, 0x88, 0x13, 0xf4, 0x80, 0xbc, 0x0c, 0x35, 0xc3, 0xf4, - 0x64, 0xed, 0x88, 0xdd, 0xc0, 0xb7, 0x45, 0x19, 0x0e, 0x6b, 0xd5, 0x7f, 0x5d, 0x81, 0x73, 0x21, - 0xee, 0x40, 0x51, 0xa3, 0x87, 0xc3, 0x51, 0xb4, 0xb5, 0x0b, 0x42, 0xe2, 0x4a, 0x7b, 0x84, 0x24, - 0x6d, 0x9f, 0x4c, 0x8a, 0xd3, 0x7a, 0x96, 0x28, 0x45, 0xb7, 0xa0, 0xea, 0x51, 0x7a, 0x42, 0x0d, - 0x3b, 0xe2, 0x68, 0xb0, 0x9d, 0x8e, 0xb5, 0x17, 0x73, 0x34, 0xe8, 0x6d, 0x59, 0xfb, 0xe6, 0x47, - 0xa1, 0x4f, 0x1d, 0x8d, 0x19, 0xd8, 0xa3, 0x9b, 0x45, 0xda, 0x13, 0x23, 0x18, 0x91, 0x0c, 0x27, - 0xd1, 0x2c, 0x05, 0x5c, 0xfd, 0x77, 0x0a, 0x9c, 0x0a, 0x1b, 0x27, 0x4c, 0x08, 0x0f, 0x42, 0xeb, - 0x1d, 0x71, 0x2c, 0xd7, 0x42, 0x6b, 0x5b, 0xa1, 0xc1, 0xcc, 0xb3, 0xa4, 0x79, 0x50, 0xbb, 0x26, - 0x06, 0x0b, 0x9d, 0x87, 0x8a, 0x19, 0xf4, 0x05, 0x04, 0x7c, 0xa5, 0xd3, 0xc6, 0x15, 0xd3, 0x08, - 0x77, 0xe0, 0x4a, 0xee, 0x0e, 0x2c, 0x6d, 0x91, 0x63, 0x07, 0x6f, 0x91, 0xea, 0x3f, 0x54, 0xe0, - 0x4c, 0x40, 0x35, 0x18, 0xeb, 0xb6, 0x30, 0x5f, 0x1f, 0xb2, 0xcf, 0x1f, 0x3e, 0x9e, 0xb7, 0x61, - 0x9c, 0xc9, 0xe2, 0x42, 0x66, 0xed, 0x10, 0x21, 0x6d, 0x0e, 0x66, 0x88, 0xd4, 0xef, 0x28, 0x50, - 0xbf, 0x6e, 0xae, 0x13, 0x97, 0x5f, 0xab, 0x31, 0x9d, 0x37, 0xf6, 0xda, 0xa7, 0x9e, 0xf5, 0xd2, - 0x07, 0xed, 0xc2, 0x94, 0xd8, 0x3b, 0x42, 0xaf, 0xae, 0x62, 0x6f, 0x7a, 0x24, 0xda, 0x42, 0x26, - 0xcb, 0xfe, 0xcc, 0x01, 0x09, 0x1c, 0x51, 0x53, 0xdf, 0x86, 0xd3, 0x19, 0x1f, 0xa1, 0x06, 0x5b, - 0x8e, 0xae, 0x2f, 0x86, 0x37, 0x58, 0x5f, 0xae, 0x8f, 0x79, 0x39, 0x7a, 0x14, 0xc6, 0x88, 0x1d, - 0x78, 0x16, 0x4e, 0x52, 0x05, 0x6a, 0xd9, 0x36, 0x30, 0x2d, 0xa3, 0x62, 0xc7, 0x72, 0x62, 0x7a, - 0x06, 0x13, 0x3b, 0x37, 0x45, 0x19, 0x0e, 0x6b, 0xd5, 0x7f, 0x31, 0x0e, 0x8f, 0x5f, 0x77, 0x5c, - 0xf3, 0x9e, 0x63, 0xfb, 0x9a, 0xb5, 0xea, 0x18, 0x91, 0x7f, 0x82, 0x10, 0x61, 0x5f, 0x56, 0xe0, - 0x11, 0x7d, 0x30, 0xec, 0xd8, 0xa6, 0x6f, 0x6a, 0xc1, 0xb5, 0xf1, 0x2a, 0x71, 0x4d, 0xa7, 0xa8, - 0x9b, 0x02, 0x7b, 0x23, 0xd2, 0x5a, 0x5d, 0xcb, 0x42, 0x89, 0xf3, 0x68, 0x31, 0x6f, 0x09, 0xc3, - 0xb9, 0x6b, 0xb3, 0xc6, 0x75, 0x7d, 0xf6, 0x6e, 0xe5, 0x5e, 0xd4, 0xc5, 0x82, 0xde, 0x12, 0xed, - 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xfa, 0x22, 0x9c, 0x35, 0x79, 0xe3, 0x30, 0xd1, 0x0c, 0xd3, 0x26, - 0x9e, 0xc7, 0x7c, 0x06, 0xca, 0xb8, 0x03, 0x74, 0xb2, 0x10, 0xe2, 0x6c, 0x3a, 0xe8, 0x73, 0x00, - 0xde, 0xae, 0xad, 0x8b, 0xf1, 0xaf, 0x16, 0xa2, 0xca, 0xb5, 0xa6, 0x10, 0x0b, 0x96, 0x30, 0xd2, - 0x73, 0x02, 0xdf, 0x5a, 0x6d, 0x9d, 0x5f, 0x05, 0x2a, 0xfc, 0x9c, 0x70, 0x27, 0x28, 0xc4, 0x51, - 0xbd, 0xfa, 0x8f, 0x15, 0x98, 0x14, 0x0f, 0xc2, 0xd0, 0x07, 0x13, 0xc7, 0xe5, 0x50, 0x84, 0x25, - 0x8e, 0xcc, 0xf7, 0x98, 0x1d, 0x57, 0x18, 0x24, 0xc4, 0xc6, 0x5b, 0xec, 0xb4, 0x25, 0x28, 0x47, - 0xe6, 0x8d, 0x98, 0x3d, 0x37, 0x30, 0x79, 0x48, 0xd4, 0xd4, 0x5f, 0x51, 0x60, 0x3e, 0xf5, 0xd5, - 0x08, 0xdb, 0xc2, 0x09, 0xde, 0x46, 0xfe, 0xa8, 0x0e, 0xec, 0xf5, 0xdf, 0xd2, 0x6a, 0xa7, 0x4b, - 0xdc, 0xed, 0x70, 0x15, 0x7e, 0x55, 0x81, 0xb9, 0xe8, 0xde, 0x5c, 0xb4, 0x42, 0x29, 0xe1, 0x30, - 0x79, 0x23, 0x81, 0xac, 0xb9, 0x20, 0x3a, 0x3e, 0x97, 0xac, 0xc1, 0x29, 0xc2, 0xe8, 0x17, 0x14, - 0x98, 0xd3, 0xe2, 0xaf, 0xff, 0x02, 0xa9, 0x59, 0xcc, 0xb5, 0x3d, 0xf1, 0x94, 0x30, 0x6a, 0x4c, - 0xa2, 0xc2, 0xc3, 0x29, 0xba, 0xe8, 0xa3, 0x30, 0xad, 0x0d, 0xcc, 0xa5, 0xa1, 0x61, 0x52, 0xbd, - 0x20, 0x78, 0x32, 0xc6, 0x94, 0xd5, 0xa5, 0xd5, 0x4e, 0x58, 0x8e, 0x63, 0x50, 0xe1, 0xfb, 0x3e, - 0x31, 0x94, 0xe3, 0x65, 0xdf, 0xf7, 0x89, 0x51, 0x8c, 0xde, 0xf7, 0x89, 0xc1, 0x93, 0xa9, 0xa0, - 0xcf, 0xc2, 0xa3, 0x7c, 0xc3, 0x69, 0x6a, 0x9e, 0xa9, 0x2f, 0x0d, 0xfd, 0x4d, 0x62, 0xfb, 0xc1, - 0x81, 0x90, 0x1b, 0xa5, 0x98, 0xef, 0xd4, 0x72, 0x1e, 0x10, 0xce, 0xff, 0x1e, 0x39, 0x00, 0x8e, - 0x69, 0xe8, 0xa2, 0x43, 0xdc, 0x7d, 0xa7, 0x98, 0xf6, 0x7d, 0xbb, 0xd3, 0x6e, 0x89, 0xfe, 0x30, - 0x59, 0x11, 0xfd, 0xc6, 0x12, 0x09, 0xf4, 0x77, 0x15, 0x98, 0x11, 0x8c, 0x2e, 0x88, 0x4e, 0x32, - 0x16, 0xf8, 0x6c, 0x61, 0x86, 0x4c, 0x70, 0xfd, 0x22, 0x96, 0xb1, 0x73, 0x6f, 0xfd, 0xd0, 0xa5, - 0x33, 0x56, 0x87, 0xe3, 0x0d, 0x41, 0x5f, 0x53, 0xe0, 0x8c, 0x47, 0xdc, 0x6d, 0x53, 0x27, 0x4b, - 0xba, 0xee, 0x0c, 0xed, 0x60, 0x9e, 0x6b, 0x25, 0x9e, 0x5a, 0x75, 0x33, 0x10, 0x72, 0x47, 0xa2, - 0xac, 0x1a, 0x9c, 0xd9, 0x00, 0xf4, 0x33, 0x0a, 0x9c, 0xba, 0xab, 0xf9, 0xfa, 0x66, 0x4b, 0xd3, - 0x37, 0x99, 0x85, 0x86, 0xfb, 0x0e, 0x15, 0x5d, 0x39, 0xaf, 0xc5, 0x71, 0x71, 0xeb, 0x6b, 0xa2, - 0x10, 0x27, 0x29, 0x22, 0x1f, 0x6a, 0x2e, 0x79, 0x6b, 0x48, 0x3c, 0xdf, 0x5b, 0x00, 0x46, 0xfd, - 0x53, 0xe5, 0x27, 0x0d, 0x0b, 0x8c, 0x5c, 0xd9, 0x08, 0x7e, 0xe1, 0x90, 0x12, 0xea, 0xc1, 0xe3, - 0x9c, 0x7d, 0x97, 0x6c, 0xc7, 0xde, 0xed, 0x3b, 0x43, 0x2f, 0xb1, 0x04, 0xea, 0x6c, 0x09, 0x30, - 0x27, 0xaa, 0xe5, 0x83, 0x00, 0xf1, 0xc1, 0x78, 0xd0, 0xa7, 0xa1, 0x46, 0xb6, 0x89, 0xed, 0xdf, - 0xb9, 0x73, 0x73, 0x61, 0xba, 0xd0, 0x1e, 0xc9, 0xba, 0xb0, 0x2c, 0x70, 0xe0, 0x10, 0xdb, 0xf9, - 0x97, 0x01, 0xa5, 0x99, 0x12, 0xcd, 0xc1, 0xd8, 0x16, 0xe1, 0x8f, 0x84, 0xa7, 0x30, 0xfd, 0x17, - 0x9d, 0x81, 0xea, 0xb6, 0x66, 0x0d, 0xb9, 0xea, 0x5b, 0xc3, 0xfc, 0xc7, 0xf3, 0x95, 0x67, 0x15, - 0xf5, 0xbb, 0x0a, 0x9c, 0xcd, 0x1c, 0x36, 0x84, 0xe1, 0x1c, 0xf3, 0x3d, 0xb3, 0x57, 0x86, 0xbe, - 0xe6, 0x9b, 0x76, 0xaf, 0x63, 0x6f, 0x58, 0x66, 0x6f, 0x93, 0xab, 0x80, 0x55, 0xae, 0xb0, 0xac, - 0x64, 0x42, 0xe0, 0x9c, 0x2f, 0x51, 0x07, 0x4e, 0xf7, 0xb5, 0x9d, 0x14, 0xc2, 0x0a, 0x43, 0xc8, - 0xde, 0x9a, 0xaf, 0xa4, 0xab, 0x71, 0xd6, 0x37, 0xea, 0x37, 0xab, 0xf0, 0x18, 0x6d, 0x78, 0xb4, - 0x75, 0xae, 0x68, 0xb6, 0xd6, 0x7b, 0x8f, 0x6e, 0x51, 0xdf, 0x51, 0xe0, 0x91, 0xcd, 0x6c, 0xc5, - 0x56, 0xec, 0xde, 0xb8, 0x98, 0x7e, 0x7f, 0x90, 0xb2, 0xcc, 0x59, 0xf7, 0x40, 0x10, 0x9c, 0xd7, - 0x2a, 0xf4, 0x32, 0xcc, 0xd9, 0x8e, 0x41, 0x5a, 0x9d, 0x36, 0x5e, 0xd1, 0xbc, 0xad, 0x6e, 0x60, - 0xd6, 0xad, 0xf2, 0x1b, 0x8e, 0x5b, 0x89, 0x3a, 0x9c, 0x82, 0x46, 0xdb, 0x80, 0x06, 0x8e, 0xb1, - 0xbc, 0x6d, 0xea, 0x81, 0xb3, 0x59, 0xf1, 0x5b, 0x15, 0xf6, 0x9c, 0x6e, 0x35, 0x85, 0x0d, 0x67, - 0x50, 0x60, 0xaa, 0x39, 0x6d, 0xcc, 0x8a, 0x63, 0x9b, 0xbe, 0xe3, 0x32, 0xef, 0xc6, 0x52, 0x1a, - 0x2a, 0xe3, 0xf4, 0x5b, 0x99, 0x18, 0x71, 0x0e, 0x25, 0xf5, 0x7f, 0x29, 0x70, 0x8a, 0xf2, 0xc5, - 0xaa, 0xeb, 0xec, 0xec, 0xbe, 0x27, 0x59, 0xf2, 0x29, 0x18, 0xef, 0x3b, 0x46, 0x70, 0x1a, 0x3e, - 0x4b, 0x95, 0xcc, 0x15, 0xc7, 0x20, 0xf7, 0xf9, 0x55, 0xcf, 0xce, 0x2e, 0x73, 0x78, 0x65, 0x20, - 0xf2, 0xa9, 0x75, 0x2c, 0xff, 0xd4, 0xaa, 0xfe, 0xb1, 0xc2, 0xb5, 0xc5, 0xe0, 0xd0, 0xf8, 0xde, - 0x5c, 0x8a, 0x1f, 0x87, 0x19, 0x5a, 0xb6, 0xa2, 0xed, 0xac, 0xb6, 0x5f, 0x75, 0xac, 0xc0, 0x55, - 0x93, 0x39, 0x85, 0xdc, 0x90, 0x2b, 0x70, 0x1c, 0x4e, 0xfd, 0x93, 0x59, 0x60, 0x00, 0x16, 0xf1, - 0xdf, 0x93, 0x1d, 0x7b, 0x1a, 0xea, 0xfa, 0x60, 0xd8, 0xba, 0xda, 0x7d, 0x65, 0xe8, 0xf8, 0x9a, - 0xb8, 0xad, 0x62, 0x1a, 0x60, 0x6b, 0x75, 0x2d, 0x28, 0xc6, 0x32, 0x0c, 0x5d, 0xe4, 0xfa, 0x60, - 0x28, 0x04, 0xe7, 0xaa, 0xec, 0xdc, 0xc0, 0x16, 0x79, 0x6b, 0x75, 0x2d, 0x56, 0x87, 0x53, 0xd0, - 0xe8, 0x4b, 0x0a, 0x4c, 0x13, 0xb1, 0x00, 0xaf, 0x6b, 0xae, 0x21, 0xd6, 0x77, 0xf1, 0xfd, 0x3b, - 0x1c, 0xdd, 0x60, 0x59, 0x73, 0xdd, 0x79, 0x59, 0xa2, 0x81, 0x63, 0x14, 0x99, 0x1a, 0x2b, 0x7e, - 0xd3, 0xc9, 0x72, 0x8c, 0xe4, 0x8a, 0xaf, 0x0a, 0x35, 0x36, 0x0f, 0x08, 0xe7, 0x7f, 0x8f, 0xfe, - 0x91, 0x02, 0xe7, 0xc2, 0x5a, 0xd3, 0x36, 0xfb, 0xc3, 0x3e, 0x26, 0xba, 0xa5, 0x99, 0x7d, 0xa1, - 0xd3, 0x7e, 0xfa, 0xc1, 0xf5, 0x34, 0x8e, 0x9f, 0x8b, 0x9d, 0xec, 0x3a, 0x9c, 0xd3, 0x26, 0xf4, - 0x2b, 0x0a, 0x5c, 0x0a, 0xaa, 0x56, 0xe9, 0xc9, 0x72, 0xe8, 0x92, 0xc8, 0xe1, 0x57, 0x8c, 0xc9, - 0x64, 0x21, 0x29, 0xf8, 0xc4, 0xfe, 0x5e, 0xe3, 0xd2, 0xf2, 0x21, 0xb8, 0xf1, 0xa1, 0xd4, 0x63, - 0x1c, 0xd3, 0x75, 0x36, 0x7c, 0xa1, 0x04, 0x1f, 0x1b, 0xc7, 0x50, 0x1a, 0x38, 0x46, 0x11, 0xfd, - 0xba, 0x02, 0x8f, 0xc8, 0x05, 0x32, 0xc3, 0x70, 0xed, 0xf7, 0xf5, 0x07, 0xd7, 0x9a, 0x04, 0x01, - 0x6e, 0x6f, 0xca, 0xa9, 0xc4, 0x79, 0xcd, 0xa2, 0x22, 0xb8, 0xcf, 0x98, 0x93, 0x6b, 0xc8, 0x55, - 0x2e, 0x82, 0x39, 0xbf, 0x7a, 0x38, 0xa8, 0xa3, 0xa7, 0xcf, 0x81, 0x63, 0xac, 0x9a, 0x86, 0x77, - 0xd3, 0xec, 0x9b, 0x3e, 0x53, 0x61, 0xc7, 0xf8, 0x78, 0xac, 0x3a, 0xc6, 0x6a, 0xa7, 0xcd, 0xcb, - 0x71, 0x0c, 0x8a, 0xbd, 0xba, 0x31, 0xfb, 0x5a, 0x8f, 0xac, 0x0e, 0x2d, 0x6b, 0xd5, 0x75, 0x98, - 0x4d, 0xa2, 0x4d, 0x34, 0xc3, 0x32, 0x6d, 0x52, 0x50, 0x65, 0x65, 0x4b, 0xae, 0x93, 0x87, 0x14, - 0xe7, 0xd3, 0x43, 0x8b, 0x00, 0x1b, 0x9a, 0x69, 0x75, 0xef, 0x6a, 0x83, 0xdb, 0xf6, 0xc2, 0x0c, - 0x13, 0x63, 0xec, 0xe0, 0x77, 0x35, 0x2c, 0xc5, 0x12, 0x04, 0x63, 0x28, 0x2a, 0x0c, 0x31, 0xe1, - 0xaf, 0x70, 0x17, 0x66, 0x1f, 0x14, 0x43, 0x05, 0x18, 0xf9, 0x00, 0xde, 0x90, 0x68, 0xe0, 0x18, - 0x45, 0xf4, 0x15, 0x05, 0x66, 0xbd, 0x5d, 0xcf, 0x27, 0xfd, 0xb0, 0x11, 0xa7, 0x1e, 0x78, 0x23, - 0x98, 0xc1, 0xa6, 0x1b, 0xa3, 0x82, 0x13, 0x54, 0x91, 0x06, 0x8f, 0xb1, 0x81, 0xbd, 0xd6, 0xba, - 0x6e, 0xf6, 0x36, 0xc3, 0xe7, 0x34, 0xab, 0xc4, 0xd5, 0x89, 0xed, 0x2f, 0xcc, 0x31, 0xd6, 0x69, - 0xec, 0xef, 0x35, 0x1e, 0xeb, 0xe4, 0x83, 0xe1, 0x83, 0x70, 0xa0, 0xcf, 0xc1, 0x79, 0x51, 0x7d, - 0xd3, 0xb9, 0x9b, 0xa2, 0x30, 0xcf, 0x28, 0xb0, 0x37, 0x4e, 0x9d, 0x5c, 0x28, 0x7c, 0x00, 0x06, - 0x75, 0xaf, 0xc2, 0x4f, 0x24, 0xa9, 0x85, 0x84, 0x5e, 0x84, 0x53, 0x7d, 0xd2, 0x77, 0xdc, 0xdd, - 0xa5, 0x20, 0xc2, 0x8e, 0xb0, 0x92, 0xb1, 0x53, 0xe6, 0x4a, 0xbc, 0x0a, 0x27, 0x61, 0xe9, 0x66, - 0xc7, 0xc8, 0x5e, 0xed, 0x46, 0xdf, 0x57, 0xa2, 0xcd, 0xae, 0x93, 0xa8, 0xc3, 0x29, 0x68, 0xd4, - 0x82, 0x79, 0x51, 0xd6, 0xa1, 0x6a, 0x9f, 0x77, 0xd5, 0x25, 0xc1, 0xc5, 0x0b, 0xd5, 0x9f, 0xe6, - 0x3b, 0xc9, 0x4a, 0x9c, 0x86, 0xa7, 0xbd, 0xa0, 0x3f, 0xe4, 0x56, 0x8c, 0x47, 0xbd, 0xb8, 0x15, - 0xaf, 0xc2, 0x49, 0xd8, 0x40, 0x2f, 0x8f, 0x35, 0xa1, 0x1a, 0xf5, 0xe2, 0x56, 0xa2, 0x0e, 0xa7, - 0xa0, 0xd5, 0x3f, 0x1e, 0x87, 0x0f, 0x8c, 0xb0, 0xff, 0xa0, 0x7e, 0xf6, 0x70, 0x1f, 0x22, 0x0a, - 0x16, 0x83, 0x5b, 0xaf, 0xc5, 0x57, 0x86, 0x9a, 0xed, 0x9b, 0xfe, 0xee, 0x88, 0xd3, 0x33, 0xc8, - 0x99, 0x9e, 0xa3, 0xd3, 0x1b, 0x75, 0x3a, 0xbd, 0xbc, 0xe9, 0x3c, 0x3a, 0xc9, 0xd1, 0xa7, 0xbf, - 0x9f, 0x3d, 0xfd, 0x05, 0x47, 0xf5, 0x50, 0x76, 0x19, 0xe4, 0xb0, 0x4b, 0xc1, 0x51, 0x1d, 0x81, - 0xbd, 0xfe, 0xe3, 0x38, 0x3c, 0x31, 0xca, 0x46, 0x58, 0x90, 0xbf, 0x32, 0xb6, 0x9a, 0x63, 0xe5, - 0xaf, 0x3c, 0x17, 0xbf, 0x63, 0xe4, 0xaf, 0x0c, 0x92, 0xc7, 0xcd, 0x5f, 0x79, 0xa3, 0x7a, 0x5c, - 0xfc, 0x95, 0x37, 0xaa, 0x23, 0xf0, 0xd7, 0x9f, 0x27, 0xf7, 0x87, 0x70, 0xf3, 0xeb, 0xc0, 0x98, - 0x3e, 0x18, 0x16, 0x14, 0x52, 0xec, 0xca, 0xb2, 0xb5, 0xba, 0x86, 0x29, 0x0e, 0x84, 0x61, 0x82, - 0xf3, 0x4f, 0x41, 0x11, 0xc4, 0xdc, 0x33, 0x39, 0x4b, 0x62, 0x81, 0x89, 0x0e, 0x15, 0x19, 0x6c, - 0x92, 0x3e, 0x71, 0x35, 0xab, 0xeb, 0x3b, 0xae, 0xd6, 0x2b, 0x2a, 0x6d, 0xd8, 0x50, 0x2d, 0x27, - 0x70, 0xe1, 0x14, 0x76, 0x3a, 0x20, 0x03, 0xd3, 0x28, 0x28, 0x5f, 0xd8, 0x80, 0xac, 0x76, 0xda, - 0x98, 0xe2, 0x50, 0xbf, 0x5f, 0x03, 0xe9, 0xd5, 0x24, 0x3d, 0x73, 0x69, 0x96, 0xe5, 0xdc, 0x5d, - 0x75, 0xcd, 0x6d, 0xd3, 0x22, 0x3d, 0x62, 0x84, 0xcf, 0xea, 0x3c, 0x71, 0xb3, 0xcd, 0x14, 0xc0, - 0xa5, 0x3c, 0x20, 0x9c, 0xff, 0x3d, 0x55, 0x47, 0xe7, 0xf5, 0xe4, 0xfb, 0xf4, 0x52, 0x97, 0x73, - 0xa9, 0xd7, 0xee, 0x7c, 0x41, 0xa5, 0x8a, 0x71, 0x9a, 0x2e, 0xfa, 0x6b, 0x0a, 0x37, 0x18, 0x84, - 0x16, 0x52, 0x31, 0x69, 0xd7, 0x1f, 0xd4, 0xbd, 0x42, 0x64, 0x7a, 0x88, 0x8c, 0xb0, 0x71, 0x8a, - 0xe8, 0x57, 0x15, 0x38, 0xbb, 0x95, 0x65, 0xec, 0x14, 0x73, 0xbb, 0x5a, 0xb8, 0x2d, 0x39, 0xe6, - 0x53, 0x7e, 0x17, 0x9c, 0x09, 0x80, 0xb3, 0x5b, 0x12, 0x8e, 0x53, 0x68, 0xfd, 0x11, 0x72, 0xa0, - 0xf8, 0x38, 0x25, 0xec, 0x48, 0xd1, 0x38, 0x85, 0x15, 0x38, 0x4e, 0x11, 0xbd, 0x05, 0x53, 0x5b, - 0x81, 0xd1, 0x4d, 0x9c, 0xcf, 0xdb, 0x85, 0xc9, 0x4b, 0xa6, 0x3b, 0x7e, 0xeb, 0x1c, 0x16, 0xe2, - 0x88, 0x0a, 0x32, 0x61, 0x72, 0x8b, 0x4b, 0x23, 0x71, 0xae, 0x6e, 0x96, 0x57, 0xf9, 0xf9, 0xe1, - 0x4e, 0x14, 0xe1, 0x00, 0xbf, 0xec, 0x25, 0x53, 0x3b, 0xc4, 0x91, 0xf4, 0x1b, 0x0a, 0x9c, 0xdd, - 0x26, 0xae, 0x6f, 0xea, 0x49, 0x6b, 0xf3, 0x54, 0x89, 0x73, 0xc9, 0xab, 0x59, 0x18, 0x39, 0xab, - 0x64, 0x56, 0xe1, 0xec, 0x36, 0xa8, 0xff, 0x55, 0x81, 0x94, 0x41, 0x0b, 0xfd, 0x6d, 0x05, 0xa6, - 0x37, 0x88, 0xe6, 0x0f, 0x5d, 0x72, 0x4d, 0xf3, 0xc3, 0x27, 0x12, 0xaf, 0x3d, 0x10, 0x43, 0xda, - 0xe2, 0x55, 0x09, 0x33, 0xbf, 0xba, 0x0b, 0xe3, 0xa1, 0xc8, 0x55, 0x38, 0xd6, 0x84, 0xf3, 0x9f, - 0x84, 0xf9, 0xd4, 0x87, 0x47, 0xba, 0x5e, 0xf9, 0x2d, 0x61, 0x12, 0x4d, 0x46, 0xca, 0x7d, 0x03, - 0xaa, 0x9a, 0x61, 0x84, 0xd1, 0xf8, 0x9e, 0x2f, 0x78, 0x4d, 0x6d, 0xc8, 0x6f, 0x51, 0xd8, 0x4f, - 0xcc, 0xf1, 0xa2, 0xab, 0x80, 0xb4, 0xd8, 0x2d, 0xd4, 0x8a, 0x63, 0x04, 0xc7, 0x25, 0x66, 0x4c, - 0x5f, 0x4a, 0xd5, 0xe2, 0x8c, 0x2f, 0xd4, 0x4f, 0xc0, 0x6c, 0xfc, 0x11, 0xfd, 0x11, 0xdc, 0x99, - 0xd5, 0x9f, 0x57, 0x00, 0xa5, 0x23, 0xf0, 0x20, 0x0f, 0x6a, 0x02, 0x22, 0x98, 0xe4, 0xe5, 0xa2, - 0xae, 0xa9, 0x31, 0x4f, 0xeb, 0xc8, 0x19, 0x56, 0x14, 0x78, 0x38, 0x24, 0xa4, 0xfe, 0x85, 0x02, - 0x51, 0xd4, 0x2f, 0xf4, 0x31, 0xa8, 0x1b, 0xc4, 0xd3, 0x5d, 0x73, 0xe0, 0x47, 0x1d, 0x09, 0x7d, - 0x3b, 0xdb, 0x51, 0x15, 0x96, 0xe1, 0x90, 0x0a, 0x13, 0xbe, 0xe6, 0x6d, 0x75, 0xda, 0xe2, 0xe0, - 0xc8, 0xb6, 0xf9, 0x3b, 0xac, 0x04, 0x8b, 0x9a, 0xe8, 0x45, 0xfa, 0xd8, 0x08, 0x2f, 0xd2, 0xd1, - 0xc6, 0x03, 0x78, 0x7e, 0x8f, 0x0e, 0x7f, 0x7a, 0xaf, 0xfe, 0xdb, 0x0a, 0xc4, 0x23, 0xad, 0x15, - 0x1d, 0x82, 0x74, 0xbc, 0x80, 0xca, 0xb1, 0xc5, 0x0b, 0xf8, 0x30, 0x8b, 0x4a, 0xca, 0x63, 0x49, - 0xf3, 0xbb, 0x27, 0x39, 0x94, 0x28, 0x0f, 0x04, 0x1d, 0x42, 0xa0, 0xe7, 0x64, 0x8f, 0xd1, 0xa9, - 0xe6, 0x07, 0x82, 0x75, 0xc1, 0xdc, 0x40, 0xef, 0x8b, 0x88, 0x08, 0x61, 0xff, 0x63, 0xce, 0xa1, - 0x1f, 0x13, 0x9e, 0x81, 0xd5, 0x58, 0xd4, 0x86, 0x20, 0xd4, 0xc3, 0x7c, 0xec, 0xc3, 0xc8, 0x5d, - 0x50, 0xfd, 0x25, 0x05, 0x26, 0x45, 0x34, 0xa5, 0x11, 0x1c, 0x7d, 0x7b, 0x50, 0x65, 0xea, 0x7a, - 0x29, 0x4d, 0xa6, 0xbb, 0xe9, 0x38, 0x7e, 0x2c, 0xaa, 0x14, 0x73, 0xc5, 0x63, 0xff, 0x62, 0x8e, - 0x5f, 0xfd, 0xc6, 0x38, 0x5c, 0x12, 0x20, 0xa9, 0x6d, 0x3a, 0x5c, 0x84, 0xbb, 0x70, 0x5a, 0x4c, - 0x53, 0xdb, 0xd5, 0xcc, 0xf0, 0x7a, 0xae, 0xd8, 0x09, 0x4c, 0x5c, 0xdd, 0xa6, 0xd0, 0xe1, 0x2c, - 0x1a, 0x3c, 0x76, 0x0a, 0x2b, 0xbe, 0x4e, 0x34, 0xcb, 0xdf, 0x0c, 0x68, 0x57, 0xca, 0xc4, 0x4e, - 0x49, 0xe3, 0xc3, 0x99, 0x54, 0xd8, 0xf5, 0xa0, 0xa8, 0x68, 0xb9, 0x44, 0x93, 0xef, 0x26, 0x4b, - 0x78, 0xee, 0xad, 0x64, 0x62, 0xc4, 0x39, 0x94, 0x98, 0x29, 0x4b, 0xdb, 0x61, 0x27, 0x63, 0x4c, - 0x7c, 0xd7, 0x24, 0xdc, 0x35, 0xb7, 0x2a, 0xce, 0xb2, 0xf1, 0x2a, 0x9c, 0x84, 0x45, 0xcf, 0xc3, - 0x2c, 0xbb, 0x6e, 0x8d, 0x9e, 0x20, 0x57, 0xa3, 0xd0, 0xe2, 0xb7, 0x62, 0x35, 0x38, 0x01, 0xa9, - 0x7e, 0x5b, 0x81, 0x69, 0x99, 0x81, 0x46, 0x70, 0x9c, 0xdd, 0x96, 0x04, 0x76, 0x19, 0x6f, 0x54, - 0x99, 0xec, 0x88, 0x32, 0xfb, 0x74, 0xc6, 0x37, 0xec, 0xde, 0x8d, 0x24, 0x84, 0x7f, 0xa9, 0x7b, - 0xb7, 0xd4, 0x4e, 0x12, 0xde, 0xbb, 0x25, 0x6b, 0x70, 0x8a, 0x30, 0x7a, 0x0d, 0xc6, 0x74, 0xd7, - 0x14, 0x03, 0xf3, 0x6c, 0xb1, 0xf3, 0x09, 0xee, 0x44, 0x0f, 0x8f, 0x5a, 0xb8, 0x83, 0x29, 0x46, - 0xf5, 0x37, 0xc7, 0xa0, 0x2e, 0x05, 0x6b, 0x43, 0x2b, 0x65, 0xce, 0xb7, 0x11, 0xfa, 0xe0, 0x8c, - 0xbb, 0x02, 0x63, 0xbd, 0xc1, 0xb0, 0xe0, 0x01, 0x37, 0x44, 0x77, 0x8d, 0xa2, 0xeb, 0x0d, 0x86, - 0xe8, 0xd5, 0xf0, 0xc8, 0x5c, 0xec, 0x50, 0x1b, 0xba, 0x68, 0x26, 0x8e, 0xcd, 0x01, 0x7b, 0x8e, - 0xe7, 0xb2, 0xa7, 0x0d, 0x93, 0x9e, 0x38, 0x4f, 0x57, 0x4b, 0xc4, 0x0a, 0x94, 0x86, 0x5a, 0x1c, - 0xa0, 0xb9, 0x1e, 0x1e, 0x9c, 0xaf, 0x03, 0x22, 0x54, 0x0b, 0x18, 0xb2, 0x77, 0x12, 0xec, 0x88, - 0x51, 0xe3, 0x5a, 0xc0, 0x1a, 0x2b, 0xc1, 0xa2, 0x46, 0xfd, 0xb9, 0x0a, 0xa0, 0x34, 0x42, 0xf4, - 0x01, 0xa8, 0xb2, 0x57, 0x53, 0x62, 0xb1, 0x49, 0xf1, 0x8f, 0x34, 0xcf, 0xc3, 0xbc, 0x0e, 0x75, - 0xc5, 0x2b, 0xba, 0x62, 0x33, 0xc3, 0x6e, 0x7c, 0x05, 0x3d, 0xe9, 0xc9, 0x5d, 0xb0, 0x3f, 0x8d, - 0xe5, 0xee, 0x4f, 0x6b, 0x30, 0xd9, 0x37, 0x6d, 0xe6, 0xe8, 0x51, 0xcc, 0x62, 0xc0, 0xaf, 0xa4, - 0x38, 0x0a, 0x1c, 0xe0, 0x52, 0x7f, 0x54, 0xa1, 0x5c, 0x6c, 0xda, 0x3e, 0xb1, 0x35, 0x5b, 0x27, - 0xe8, 0x1e, 0x80, 0x36, 0xf4, 0x1d, 0xbe, 0xcd, 0x0b, 0x66, 0xfe, 0x54, 0xc1, 0x09, 0x0b, 0xb1, - 0x2e, 0x85, 0x18, 0xf9, 0x55, 0x51, 0xf4, 0x1b, 0x4b, 0xd4, 0x28, 0x6d, 0xdf, 0xec, 0x93, 0xd7, - 0x4c, 0xdb, 0x70, 0xee, 0x8a, 0xf1, 0x2d, 0x4d, 0xfb, 0x4e, 0x88, 0x91, 0xd3, 0x8e, 0x7e, 0x63, - 0x89, 0x1a, 0xfa, 0x34, 0x2c, 0xb0, 0x9c, 0x07, 0x36, 0x8b, 0x86, 0x29, 0x1a, 0xe7, 0x58, 0x56, - 0xb0, 0xf1, 0xd4, 0x58, 0xec, 0xb1, 0x85, 0x56, 0x0e, 0x0c, 0xce, 0xfd, 0x5a, 0xfd, 0x8e, 0x02, - 0x67, 0x33, 0xc7, 0x02, 0x5d, 0x83, 0xf9, 0xc8, 0x4d, 0x40, 0x16, 0x94, 0xb5, 0x28, 0xbc, 0xeb, - 0x8d, 0x24, 0x00, 0x4e, 0x7f, 0x83, 0x56, 0x42, 0x6d, 0x41, 0x16, 0xc4, 0xc2, 0xc7, 0xe0, 0x31, - 0x81, 0x2a, 0x4b, 0x56, 0xe3, 0xac, 0xef, 0xd4, 0xcf, 0xc6, 0x1a, 0x1c, 0x0d, 0x18, 0x5d, 0x1f, - 0xeb, 0xa4, 0x17, 0xba, 0x6d, 0x87, 0xeb, 0xa3, 0x49, 0x0b, 0x31, 0xaf, 0x43, 0x8f, 0xcb, 0x4f, - 0x0d, 0x42, 0x41, 0x14, 0x3c, 0x37, 0x50, 0x87, 0x00, 0xc2, 0x21, 0xc7, 0xb4, 0x7b, 0xa8, 0x07, - 0x35, 0x4d, 0x64, 0xe4, 0x10, 0xcc, 0xf6, 0x62, 0xb1, 0xc3, 0x96, 0x40, 0xc2, 0x7d, 0xf1, 0x82, - 0x5f, 0x38, 0x44, 0xae, 0xfe, 0x03, 0x05, 0xce, 0x65, 0x3f, 0x0e, 0x1a, 0x61, 0x87, 0xed, 0x43, - 0xdd, 0x8d, 0x3e, 0x13, 0x9c, 0xf9, 0x53, 0x72, 0x30, 0x13, 0x29, 0x43, 0x0f, 0xd5, 0x3e, 0x5a, - 0xae, 0xe3, 0x05, 0xb3, 0x93, 0x8c, 0x6f, 0x12, 0x2a, 0xf1, 0x52, 0x4b, 0xb0, 0x8c, 0x5f, 0x7d, - 0xa7, 0x02, 0x70, 0x8b, 0xf8, 0x77, 0x1d, 0x77, 0x8b, 0x8e, 0xd1, 0x7b, 0xea, 0x91, 0xda, 0x05, - 0x18, 0x1f, 0x38, 0x86, 0x27, 0x04, 0x15, 0x7b, 0x3d, 0xc6, 0xee, 0xb8, 0x59, 0x29, 0x6a, 0x40, - 0x95, 0x99, 0x82, 0xc5, 0x76, 0xc0, 0x94, 0x5f, 0xaa, 0xf0, 0x78, 0x98, 0x97, 0xf3, 0xc0, 0xcb, - 0xcc, 0xd3, 0xd5, 0x13, 0xea, 0xbc, 0x08, 0xbc, 0xcc, 0xcb, 0x70, 0x58, 0xab, 0xfe, 0xec, 0x38, - 0xc4, 0x72, 0xca, 0x44, 0x87, 0xf2, 0xf1, 0x63, 0x3a, 0x94, 0x7f, 0x1a, 0x16, 0x2c, 0x47, 0x33, - 0x9a, 0x9a, 0x45, 0xd9, 0xde, 0xed, 0xf2, 0xf9, 0xd0, 0xec, 0x1e, 0x09, 0x72, 0xc3, 0x30, 0x11, - 0x70, 0x33, 0x07, 0x06, 0xe7, 0x7e, 0x8d, 0x86, 0x52, 0x2a, 0x1b, 0xaa, 0x86, 0xac, 0x94, 0xce, - 0xb9, 0xb3, 0x28, 0xbb, 0x39, 0x87, 0x7b, 0x73, 0x3c, 0xdd, 0x0d, 0xfa, 0x8a, 0x02, 0x67, 0xc9, - 0x8e, 0x4f, 0x5c, 0x5b, 0xb3, 0xee, 0xb8, 0xda, 0xc6, 0x86, 0xa9, 0xc7, 0xbc, 0x88, 0x56, 0xf7, - 0xf7, 0x1a, 0x67, 0x97, 0xb3, 0x00, 0xee, 0xef, 0x35, 0x9e, 0x49, 0x27, 0x95, 0x0a, 0x9c, 0x9a, - 0x33, 0x3f, 0x61, 0xec, 0x98, 0x4d, 0xee, 0xfc, 0x73, 0x50, 0x3f, 0x82, 0x07, 0xec, 0x94, 0x6c, - 0xa2, 0xf9, 0xd6, 0x04, 0x48, 0x2e, 0xe5, 0x47, 0x88, 0x52, 0xfc, 0xf7, 0x14, 0x38, 0xa3, 0x5b, - 0x26, 0xb1, 0xfd, 0x84, 0xdf, 0x30, 0x5f, 0x1a, 0xaf, 0x16, 0x73, 0x76, 0x1f, 0x10, 0xbb, 0xd3, - 0x6e, 0x39, 0xb6, 0x4d, 0x74, 0xbf, 0x95, 0x81, 0x9d, 0x9f, 0x77, 0xb2, 0x6a, 0x70, 0x66, 0x6b, - 0x58, 0x87, 0x58, 0x79, 0xa7, 0x2d, 0xbf, 0xbe, 0x6a, 0x89, 0x32, 0x1c, 0xd6, 0xa2, 0xa7, 0xa1, - 0xde, 0x73, 0x9d, 0xe1, 0xc0, 0x6b, 0x31, 0xff, 0x26, 0xbe, 0xc2, 0x98, 0x3a, 0x71, 0x2d, 0x2a, - 0xc6, 0x32, 0x0c, 0xfa, 0x28, 0x4c, 0xf3, 0x9f, 0xab, 0x2e, 0xd9, 0x30, 0x77, 0xc4, 0x8a, 0x63, - 0xee, 0x12, 0xd7, 0xa4, 0x72, 0x1c, 0x83, 0x42, 0x1f, 0x82, 0x29, 0xd3, 0xf3, 0x86, 0xc4, 0x5d, - 0xc3, 0x37, 0x45, 0x84, 0x3f, 0x66, 0x60, 0xed, 0x04, 0x85, 0x38, 0xaa, 0x47, 0xbf, 0xa8, 0xc0, - 0xac, 0x4b, 0xde, 0x1a, 0x9a, 0x2e, 0x31, 0x18, 0x51, 0x4f, 0x38, 0xf6, 0x77, 0x4b, 0xbe, 0x26, - 0x58, 0xc4, 0x31, 0xac, 0x9c, 0xd3, 0x43, 0xd3, 0x44, 0xbc, 0x12, 0x27, 0x9a, 0x40, 0xc7, 0xca, - 0x33, 0x7b, 0xb6, 0x69, 0xf7, 0x96, 0xac, 0x9e, 0xb7, 0x50, 0x63, 0xab, 0x97, 0xab, 0x5e, 0x51, - 0x31, 0x96, 0x61, 0xd0, 0xc7, 0x61, 0x66, 0xe8, 0x51, 0xde, 0xed, 0x13, 0x3e, 0xc0, 0x53, 0x91, - 0xe3, 0xe1, 0x9a, 0x5c, 0x81, 0xe3, 0x70, 0xf4, 0xb4, 0x17, 0x14, 0x88, 0x61, 0x06, 0x1e, 0x5f, - 0x81, 0xb6, 0x73, 0x2d, 0x56, 0x83, 0x13, 0x90, 0xe7, 0x97, 0xe0, 0x74, 0x46, 0x37, 0x8f, 0xb4, - 0x40, 0xbe, 0x5d, 0x81, 0xf7, 0x1f, 0xca, 0x96, 0xe8, 0x5b, 0x0a, 0xd4, 0xc9, 0x8e, 0xef, 0x6a, - 0xa1, 0x1b, 0x24, 0x9d, 0xa3, 0xde, 0xf1, 0x2c, 0x82, 0xc5, 0xe5, 0x88, 0x12, 0x9f, 0xb7, 0x70, - 0xcf, 0x93, 0x6a, 0xb0, 0xdc, 0x20, 0xaa, 0xb5, 0xf3, 0xf8, 0x1b, 0xb2, 0xed, 0x4e, 0x24, 0xe1, - 0x10, 0x35, 0xe7, 0x5f, 0x82, 0xb9, 0x24, 0xe6, 0x23, 0x0d, 0xd5, 0x3f, 0xab, 0x40, 0x75, 0xd5, - 0xd2, 0x4e, 0x24, 0x5c, 0xe3, 0xe7, 0x63, 0x61, 0xb2, 0x8a, 0x05, 0x1f, 0x63, 0x6d, 0xcd, 0x0d, - 0xd2, 0xb7, 0x99, 0x08, 0xd2, 0xf7, 0x72, 0x09, 0x1a, 0x07, 0xc7, 0xe4, 0xfb, 0xbe, 0x02, 0x53, - 0x0c, 0xee, 0x04, 0xa2, 0x22, 0xbc, 0x11, 0x8f, 0x8a, 0xf0, 0x7c, 0xf1, 0x4e, 0xe5, 0x44, 0x43, - 0xf8, 0xc3, 0xa0, 0x33, 0x2c, 0xea, 0xd3, 0xeb, 0x72, 0xd6, 0x21, 0xde, 0x9b, 0xcb, 0x59, 0x41, - 0xea, 0x6e, 0x3a, 0xba, 0x66, 0xa5, 0x22, 0xd5, 0x1d, 0x98, 0x7a, 0xc8, 0x86, 0x29, 0x22, 0xa2, - 0x9c, 0x04, 0xbd, 0x29, 0xa6, 0xdb, 0x06, 0xb1, 0x52, 0x22, 0x7a, 0x41, 0x89, 0x87, 0x23, 0x12, - 0xea, 0x6f, 0x55, 0xa0, 0x2e, 0xcd, 0xe6, 0xbb, 0x12, 0x04, 0xef, 0x6a, 0x66, 0x8e, 0x8e, 0x0a, - 0x73, 0x73, 0x3c, 0x77, 0x84, 0xfc, 0x1c, 0x1e, 0xd4, 0xf5, 0x28, 0xae, 0x71, 0x29, 0x06, 0x97, - 0xe2, 0x23, 0x0b, 0x77, 0xeb, 0xa8, 0x00, 0xcb, 0x54, 0xd4, 0x7f, 0x59, 0x81, 0xc9, 0x55, 0xd7, - 0xa1, 0x73, 0x7c, 0x02, 0x02, 0x62, 0x3d, 0x26, 0x20, 0x0a, 0x2e, 0x5e, 0xde, 0xda, 0x5c, 0x11, - 0xf1, 0x66, 0x42, 0x44, 0x34, 0x4b, 0x51, 0x39, 0x58, 0x48, 0xfc, 0x40, 0x81, 0xba, 0x80, 0x3c, - 0x01, 0x31, 0xa1, 0xc5, 0xc5, 0xc4, 0x0b, 0x65, 0x3a, 0x96, 0x23, 0x28, 0xbe, 0xae, 0xc0, 0x8c, - 0x80, 0x58, 0x21, 0xfd, 0x75, 0xe2, 0xa2, 0xab, 0x30, 0xe9, 0x0d, 0xd9, 0x5c, 0x8a, 0x1e, 0x3d, - 0x26, 0x8b, 0x0a, 0x77, 0x5d, 0xd3, 0x59, 0xae, 0x29, 0x0e, 0x22, 0x45, 0xc7, 0xe4, 0x05, 0x38, - 0xf8, 0x98, 0x1e, 0xe8, 0x5c, 0xc7, 0x4a, 0x45, 0x3a, 0xc0, 0x8e, 0x45, 0x30, 0xab, 0xa1, 0xe7, - 0x28, 0xfa, 0x37, 0xb8, 0xa5, 0x62, 0xe7, 0x28, 0x5a, 0xed, 0x61, 0x5e, 0xae, 0xfe, 0xdc, 0x78, - 0x38, 0xda, 0x4c, 0x8e, 0x5d, 0x87, 0x29, 0xdd, 0x25, 0x9a, 0x4f, 0x8c, 0xe6, 0xee, 0x28, 0x8d, - 0x63, 0x0a, 0x5d, 0x2b, 0xf8, 0x02, 0x47, 0x1f, 0x53, 0xd5, 0x49, 0xbe, 0x78, 0xaa, 0x44, 0x6a, - 0x66, 0xee, 0xa5, 0xd3, 0x0b, 0x50, 0x75, 0xee, 0xda, 0xa1, 0xeb, 0xc5, 0x81, 0x84, 0x59, 0x57, - 0x6e, 0x53, 0x68, 0xcc, 0x3f, 0x92, 0xa3, 0x64, 0x8c, 0x1f, 0x10, 0x25, 0xa3, 0x0f, 0x93, 0x7d, - 0x36, 0x0d, 0xe5, 0x42, 0x25, 0xc6, 0x66, 0x54, 0x8e, 0x5c, 0xcd, 0x50, 0xe3, 0x80, 0x06, 0x55, - 0x82, 0xa9, 0x9e, 0xe6, 0x0d, 0x34, 0x9d, 0xc8, 0x4a, 0xf0, 0xad, 0xa0, 0x10, 0x47, 0xf5, 0xe8, - 0x5e, 0x3c, 0x98, 0xcd, 0x64, 0x09, 0x33, 0xa7, 0x68, 0x9f, 0x14, 0xbf, 0x86, 0x0f, 0x7e, 0x6e, - 0x40, 0x9b, 0xaf, 0x8e, 0x87, 0x6c, 0x2a, 0x04, 0x7f, 0x76, 0xa2, 0x24, 0xa5, 0x50, 0xa2, 0xa4, - 0x67, 0xa0, 0x3a, 0xd8, 0xd4, 0xbc, 0x80, 0x57, 0x83, 0x30, 0xeb, 0xd5, 0x55, 0x5a, 0x78, 0x7f, - 0xaf, 0x31, 0x2d, 0x48, 0xb3, 0xdf, 0x98, 0xc3, 0xa2, 0x21, 0x9c, 0xf6, 0x7c, 0xcd, 0x22, 0x5d, - 0x53, 0x98, 0x8f, 0x3c, 0x5f, 0xeb, 0x0f, 0x0a, 0x44, 0x4b, 0x67, 0x17, 0x57, 0xdd, 0x34, 0x2a, - 0x9c, 0x85, 0x1f, 0xfd, 0xac, 0x02, 0x0b, 0xac, 0x7c, 0x69, 0xe8, 0x3b, 0x3c, 0x47, 0x44, 0x44, - 0xfc, 0xe8, 0xf7, 0xb6, 0xec, 0xb0, 0xdf, 0xcd, 0xc1, 0x87, 0x73, 0x29, 0xa1, 0xb7, 0xe1, 0xac, - 0xa5, 0x79, 0xfe, 0x92, 0xee, 0x9b, 0xdb, 0xa6, 0xbf, 0x1b, 0x35, 0xa1, 0x7a, 0xe4, 0x26, 0x30, - 0xdf, 0x8d, 0x9b, 0x59, 0xc8, 0x70, 0x36, 0x0d, 0xf5, 0x7f, 0x2b, 0x80, 0xd2, 0x2c, 0x84, 0xfa, - 0x50, 0x33, 0xc8, 0x86, 0x36, 0xb4, 0xfc, 0x40, 0x13, 0x28, 0x1d, 0x6a, 0x29, 0x94, 0xce, 0x6d, - 0x81, 0x18, 0x87, 0x24, 0xd0, 0x00, 0xa6, 0xee, 0x6e, 0x9a, 0x3e, 0xb1, 0x4c, 0xcf, 0x7f, 0x50, - 0xa1, 0x9d, 0x42, 0xe5, 0xe7, 0xb5, 0x00, 0x33, 0x8e, 0x88, 0xa8, 0x7f, 0x7d, 0x0c, 0x6a, 0x47, - 0xc8, 0xc6, 0x39, 0x04, 0x24, 0x42, 0x3d, 0x50, 0x8d, 0x89, 0x94, 0x31, 0x9a, 0x31, 0xb5, 0xa6, - 0x95, 0x42, 0x86, 0x33, 0x08, 0xa0, 0xb7, 0xe1, 0x8c, 0x69, 0x6f, 0xb8, 0x9a, 0xe7, 0xbb, 0x43, - 0xdd, 0x1f, 0xba, 0xa4, 0x4c, 0x9c, 0x76, 0x66, 0x69, 0xe8, 0x64, 0xa0, 0xc3, 0x99, 0x44, 0xd0, - 0x06, 0x4c, 0xde, 0x75, 0xdc, 0x2d, 0x2a, 0x40, 0xc7, 0x4b, 0xa4, 0xf4, 0x79, 0x8d, 0xe1, 0x88, - 0x24, 0x27, 0xff, 0xed, 0xe1, 0x00, 0xb9, 0xfa, 0x7b, 0x0a, 0x54, 0xf9, 0xfb, 0xb5, 0x87, 0xe3, - 0x94, 0xc5, 0xda, 0x9a, 0x1b, 0x7b, 0x98, 0x9e, 0x7d, 0x18, 0xc4, 0xc3, 0x72, 0xf6, 0x61, 0x8d, - 0xcd, 0x51, 0x69, 0x7e, 0x6f, 0x4c, 0x74, 0x86, 0xe9, 0x0c, 0x1d, 0x38, 0x2d, 0xd4, 0xdf, 0x9b, - 0xe6, 0x06, 0xa1, 0x0c, 0xd6, 0xd6, 0x76, 0x3d, 0xf1, 0x7e, 0x9c, 0x89, 0xde, 0x56, 0xba, 0x1a, - 0x67, 0x7d, 0x83, 0xfe, 0x95, 0x42, 0x77, 0x67, 0xdf, 0x35, 0xf5, 0x72, 0x01, 0x7d, 0xc3, 0xc6, - 0x2d, 0xae, 0x70, 0x6c, 0xdc, 0x7c, 0xb0, 0x16, 0x6d, 0xd3, 0xac, 0xf4, 0xfe, 0x5e, 0xa3, 0x91, - 0x61, 0x9e, 0x0c, 0x0c, 0xea, 0x74, 0x68, 0xdf, 0xf9, 0xd1, 0x81, 0x20, 0xcc, 0xb8, 0x1f, 0x34, - 0x19, 0x5d, 0x87, 0xaa, 0xa7, 0x3b, 0x03, 0x72, 0x94, 0x30, 0xe5, 0xe1, 0x08, 0x77, 0xe9, 0x97, - 0x98, 0x23, 0x38, 0xff, 0x26, 0x4c, 0xcb, 0x2d, 0xcf, 0x30, 0x4f, 0xb4, 0x65, 0xf3, 0xc4, 0x91, - 0x6f, 0xf1, 0x64, 0x73, 0xc6, 0x6f, 0x57, 0x40, 0x24, 0xe4, 0x1b, 0xe1, 0x0a, 0xe3, 0xcd, 0x20, - 0x66, 0x69, 0x99, 0x2c, 0x84, 0xc9, 0x24, 0xe0, 0xd1, 0x20, 0xc8, 0x61, 0x4b, 0x91, 0x03, 0x13, - 0x96, 0xb6, 0x4e, 0xac, 0x20, 0x39, 0xdb, 0xb5, 0x12, 0xb9, 0xc3, 0x78, 0x60, 0x6d, 0x2f, 0x61, - 0xe8, 0xe6, 0x85, 0x58, 0x90, 0x39, 0xff, 0x1c, 0xd4, 0x25, 0xb0, 0x23, 0xd9, 0x84, 0x7e, 0xa0, - 0xc0, 0x74, 0x2c, 0x50, 0x59, 0x1f, 0xc6, 0xdc, 0xd0, 0x16, 0x50, 0xf4, 0x8e, 0x27, 0xf0, 0x6e, - 0x7a, 0xec, 0x00, 0x20, 0x4c, 0xe9, 0x84, 0x31, 0xcd, 0x2a, 0x0f, 0x2a, 0xa6, 0xd9, 0xd7, 0x14, - 0x38, 0x17, 0x74, 0x28, 0x1e, 0xda, 0x03, 0x5d, 0x86, 0x9a, 0x36, 0x30, 0x99, 0xe5, 0x57, 0x36, - 0x9e, 0x2f, 0xad, 0x76, 0x58, 0x19, 0x0e, 0x6b, 0xd1, 0x87, 0xa1, 0x16, 0xb0, 0x9e, 0xd0, 0xfc, - 0x42, 0xb9, 0x15, 0xde, 0x5a, 0x85, 0x10, 0xe8, 0x49, 0x29, 0xae, 0x6c, 0x35, 0xda, 0xa8, 0x43, - 0xc2, 0xfc, 0x8e, 0x5b, 0xfd, 0xa5, 0x0a, 0xcc, 0x70, 0x4b, 0x49, 0xd3, 0xb4, 0x0d, 0xd3, 0xee, - 0x9d, 0xc0, 0x06, 0x11, 0xcb, 0x2a, 0x5d, 0x79, 0x50, 0x59, 0xa5, 0x6f, 0xc0, 0xc4, 0x5b, 0x54, - 0x52, 0x05, 0x0c, 0x3e, 0x92, 0xc0, 0x08, 0x99, 0x97, 0x09, 0x39, 0x0f, 0x0b, 0x14, 0x2c, 0xf6, - 0x68, 0x6c, 0x58, 0x1e, 0x96, 0xd8, 0xa3, 0xb1, 0x46, 0xe7, 0xe7, 0xb7, 0x60, 0x39, 0x6c, 0x4f, - 0x60, 0xaa, 0xdf, 0x88, 0xe9, 0x02, 0x2f, 0x16, 0x0f, 0x61, 0x9a, 0x67, 0x4d, 0xe9, 0x25, 0xac, - 0x29, 0x9f, 0x2c, 0x4e, 0xe2, 0x60, 0x53, 0xca, 0x2f, 0x57, 0x00, 0x28, 0x18, 0xcf, 0xf6, 0x2b, - 0xfc, 0x2c, 0xa3, 0xec, 0xef, 0x53, 0xef, 0x95, 0x94, 0xed, 0x6a, 0x98, 0x26, 0x76, 0x2c, 0xb2, - 0xd9, 0xc7, 0x53, 0xc4, 0xc6, 0x17, 0xe0, 0xf8, 0x03, 0x5a, 0x80, 0xea, 0x6f, 0x28, 0xc0, 0x92, - 0x8e, 0xb4, 0x6f, 0x75, 0xd1, 0xc7, 0x61, 0xc6, 0xe4, 0x97, 0xa2, 0x6d, 0x39, 0xa6, 0x1c, 0xbb, - 0xb8, 0xe9, 0xc8, 0x15, 0x38, 0x0e, 0x87, 0x6c, 0x69, 0x5c, 0xcb, 0xa4, 0xda, 0x16, 0x0d, 0x09, - 0x63, 0xb2, 0x4f, 0x67, 0xcf, 0x8c, 0xfa, 0xe3, 0x0a, 0x9c, 0x4a, 0xc0, 0x8e, 0x70, 0x54, 0x39, - 0x1e, 0x09, 0x26, 0x85, 0x69, 0x1f, 0x3b, 0x81, 0x30, 0xed, 0x61, 0xc4, 0xf4, 0xf1, 0x63, 0x8e, - 0x98, 0xfe, 0x3d, 0x05, 0x58, 0x16, 0xe7, 0x13, 0x90, 0xa1, 0x9f, 0x8b, 0xcb, 0xd0, 0xe7, 0x0a, - 0xf3, 0x4e, 0x8e, 0xe8, 0xfc, 0x0b, 0x05, 0x58, 0x00, 0x65, 0xe1, 0x09, 0x22, 0x39, 0x57, 0x28, - 0x39, 0xce, 0x15, 0x97, 0x84, 0x6f, 0x46, 0xc2, 0xae, 0x28, 0xf9, 0x67, 0x7c, 0x58, 0x72, 0xbf, - 0x18, 0x8b, 0x8b, 0x92, 0xb4, 0x0b, 0x06, 0x7a, 0x1b, 0x66, 0xbc, 0x4d, 0xc7, 0xf1, 0x83, 0x13, - 0xbe, 0x98, 0xbd, 0x66, 0x71, 0xd7, 0xe8, 0xa0, 0x2f, 0x7c, 0x75, 0x76, 0x65, 0xe4, 0x38, 0x4e, - 0x4b, 0xfd, 0x1d, 0xd1, 0xfd, 0x23, 0x2c, 0x95, 0x13, 0x14, 0x7d, 0x1f, 0x4c, 0x88, 0xbe, 0xbc, - 0x0c, 0xd9, 0xbf, 0x29, 0x7a, 0x11, 0xc6, 0xbd, 0x1e, 0xc0, 0x8c, 0x25, 0xa7, 0x8a, 0x11, 0x8c, - 0x59, 0x28, 0xcb, 0x4c, 0x18, 0xde, 0x2e, 0x56, 0x8c, 0xe3, 0x04, 0xa8, 0x7c, 0x0c, 0x1a, 0xcf, - 0x33, 0xd9, 0xf2, 0x74, 0x0e, 0x6c, 0x06, 0x56, 0xe5, 0x0a, 0x1c, 0x87, 0x53, 0x5f, 0x81, 0x27, - 0x78, 0xd3, 0x99, 0x4f, 0xfa, 0xf2, 0x8e, 0x4e, 0x3c, 0xaf, 0xa5, 0x0d, 0x34, 0x9d, 0x9e, 0x43, - 0xd8, 0xab, 0x4e, 0x6e, 0x23, 0x7c, 0x2a, 0x19, 0x35, 0x37, 0xb4, 0x0d, 0xa4, 0x62, 0x10, 0x7d, - 0xa9, 0x02, 0x0d, 0x09, 0x67, 0xcc, 0x95, 0x26, 0xe0, 0xba, 0x6f, 0x2a, 0x50, 0xd7, 0x6c, 0xdb, - 0xf1, 0x35, 0xf9, 0xe6, 0x8a, 0x94, 0x08, 0x49, 0x9e, 0x4b, 0x6b, 0x71, 0x29, 0xa2, 0x93, 0xb8, - 0xa8, 0x96, 0x6a, 0xb0, 0xdc, 0x9c, 0xf3, 0x2f, 0xc1, 0x5c, 0xf2, 0xab, 0x23, 0x1d, 0x38, 0x9a, - 0x70, 0x56, 0x6a, 0x95, 0x14, 0x8a, 0xfd, 0x29, 0x98, 0xdc, 0x36, 0x3d, 0x33, 0x78, 0x68, 0x2d, - 0x0d, 0xe3, 0xab, 0xbc, 0x18, 0x07, 0xf5, 0xea, 0xcb, 0x70, 0x5a, 0xc6, 0xc1, 0xd6, 0xcd, 0xad, - 0xee, 0x51, 0x26, 0x62, 0x05, 0x2e, 0x49, 0x18, 0x32, 0x9f, 0x87, 0x1d, 0x05, 0xdd, 0x97, 0x27, - 0x02, 0x36, 0x17, 0xef, 0x17, 0xbe, 0xab, 0xc0, 0xa3, 0x24, 0x8f, 0x63, 0x04, 0xcf, 0xbf, 0x5e, - 0x76, 0x4a, 0x73, 0x59, 0x52, 0x44, 0x14, 0xca, 0xab, 0xc6, 0xf9, 0x4d, 0x43, 0xf7, 0x62, 0x79, - 0x08, 0xca, 0xf8, 0xa0, 0x66, 0xce, 0xf2, 0x41, 0x59, 0x08, 0x90, 0x0b, 0x35, 0x4f, 0xcc, 0x65, - 0xa9, 0x57, 0xac, 0x19, 0xbc, 0x21, 0xdc, 0xec, 0xc4, 0x2f, 0x1c, 0xd2, 0x41, 0xbf, 0xa6, 0xc0, - 0x19, 0x2b, 0x63, 0x69, 0x08, 0x59, 0x7f, 0xe7, 0x38, 0x96, 0x1d, 0x37, 0x5d, 0x66, 0xd5, 0xe0, - 0xcc, 0xb6, 0xa0, 0xbf, 0x9f, 0xfb, 0x5e, 0xb2, 0x5a, 0x22, 0x59, 0xd2, 0x61, 0x0b, 0xa0, 0xc0, - 0xd3, 0xc9, 0x7f, 0x33, 0xc9, 0xd5, 0x0f, 0x66, 0x5f, 0xd3, 0x61, 0x62, 0x9d, 0x69, 0xf0, 0x82, - 0xdf, 0x8b, 0x9f, 0x17, 0xf8, 0x41, 0x80, 0xeb, 0xd7, 0xfc, 0x7f, 0x2c, 0x50, 0xa3, 0x45, 0x80, - 0x75, 0xcb, 0xd1, 0xb7, 0x5a, 0x9d, 0x36, 0x0e, 0x44, 0x3b, 0xe3, 0xb1, 0x66, 0x58, 0x8a, 0x25, - 0x08, 0xf4, 0x59, 0x18, 0x33, 0x42, 0xa5, 0xef, 0x85, 0x32, 0xfa, 0x6e, 0xe4, 0xdb, 0x4b, 0x39, - 0x8a, 0x62, 0x45, 0x0e, 0xd4, 0x6c, 0xb1, 0xc3, 0x0b, 0xfe, 0x29, 0x9e, 0x49, 0x22, 0x54, 0x15, - 0x42, 0x0d, 0x25, 0x28, 0xc1, 0x21, 0x11, 0x4a, 0x30, 0x54, 0xe1, 0xab, 0x25, 0x09, 0x86, 0xfa, - 0xfb, 0x41, 0xa7, 0xab, 0x55, 0x59, 0x1b, 0x9f, 0x18, 0x5d, 0x1b, 0x9f, 0xc9, 0xd5, 0xc4, 0x37, - 0x60, 0xc2, 0xd7, 0x98, 0x8f, 0xc8, 0x64, 0x09, 0x17, 0x0d, 0xda, 0x81, 0x3b, 0x14, 0x4d, 0xa4, - 0x89, 0xb0, 0x9f, 0x1e, 0x16, 0xd8, 0x29, 0x37, 0xf2, 0x2c, 0xf3, 0x22, 0xa2, 0x57, 0x71, 0x6e, - 0xe4, 0xf9, 0x82, 0x38, 0x37, 0xf2, 0xff, 0xb1, 0x40, 0x8d, 0xb6, 0xa8, 0x7e, 0xc9, 0xb7, 0x00, - 0xf1, 0x94, 0x79, 0xa9, 0xec, 0xd2, 0xf4, 0x02, 0x0f, 0x61, 0xfe, 0x0b, 0x87, 0x04, 0x90, 0x0e, - 0x93, 0xe2, 0x40, 0x27, 0xc2, 0xd2, 0xbe, 0x50, 0x26, 0x34, 0x78, 0x90, 0x06, 0x8b, 0xbf, 0x5b, - 0x0c, 0x30, 0xab, 0x7f, 0x32, 0xce, 0xcf, 0xe2, 0xef, 0xa2, 0x53, 0x4d, 0x0f, 0x6a, 0x01, 0xb2, - 0x52, 0xc6, 0x8d, 0x20, 0x2f, 0x03, 0x1f, 0xd0, 0x30, 0x4b, 0x43, 0x88, 0x1c, 0xb5, 0xb2, 0xde, - 0x23, 0x48, 0x01, 0x94, 0x46, 0x7a, 0x8b, 0x90, 0x7d, 0xfb, 0x3c, 0x5e, 0xe8, 0xf6, 0xf9, 0x45, - 0x38, 0x15, 0x38, 0xe8, 0x18, 0x84, 0xd9, 0xbf, 0x85, 0x0b, 0x2b, 0x7b, 0x87, 0xd7, 0x8a, 0x57, - 0xe1, 0x24, 0x2c, 0xfa, 0xb6, 0x02, 0x4f, 0x70, 0xf7, 0xd9, 0x16, 0x95, 0xd6, 0x2c, 0x15, 0x12, - 0x89, 0x72, 0x2f, 0x45, 0x37, 0xb3, 0x13, 0x47, 0xbe, 0x99, 0xbd, 0xbc, 0xbf, 0xd7, 0x78, 0xa2, - 0x35, 0x02, 0x6e, 0x3c, 0x52, 0x0b, 0xd4, 0x1b, 0x30, 0x15, 0x2e, 0x61, 0xf4, 0xb8, 0xa4, 0x4e, - 0x46, 0x52, 0xf6, 0x06, 0xd9, 0xe5, 0xba, 0x65, 0x23, 0xa6, 0x5b, 0xf2, 0x73, 0xe0, 0xab, 0xb4, - 0x40, 0xa8, 0x99, 0xea, 0x7f, 0x53, 0x38, 0xcf, 0x8a, 0xb4, 0x61, 0x1a, 0xd4, 0xfb, 0x3c, 0x76, - 0x14, 0x7b, 0x3d, 0xa4, 0x14, 0x7f, 0xb7, 0xb4, 0x12, 0xa1, 0xc1, 0x32, 0x4e, 0xb4, 0x93, 0xce, - 0x6d, 0x77, 0xad, 0xa4, 0x7c, 0x19, 0x39, 0xc5, 0x1d, 0x4a, 0x7f, 0x23, 0x27, 0x05, 0x53, 0x0e, - 0x4e, 0x0a, 0x76, 0x78, 0xfa, 0x13, 0xf5, 0xff, 0x54, 0x20, 0x33, 0x68, 0x37, 0x52, 0x61, 0x82, - 0x3b, 0x42, 0xcb, 0x59, 0xff, 0xb8, 0x97, 0x34, 0x16, 0x35, 0xc8, 0x85, 0x33, 0xc2, 0xcb, 0xf8, - 0x06, 0xd9, 0x8d, 0xb2, 0xcd, 0x89, 0x85, 0x3c, 0xba, 0xaf, 0x21, 0x0b, 0x2a, 0xd3, 0x4d, 0x60, - 0xc2, 0x99, 0xb8, 0xd1, 0x6d, 0xee, 0xf6, 0x6f, 0x1b, 0x77, 0x9c, 0x2d, 0x62, 0x47, 0xec, 0x26, - 0x1e, 0x32, 0x3d, 0x1a, 0xb8, 0xfd, 0xa7, 0x00, 0x70, 0xf6, 0x77, 0x68, 0x1b, 0x50, 0x5f, 0xdb, - 0x49, 0x62, 0x2b, 0x11, 0x2b, 0x78, 0x25, 0x85, 0x0d, 0x67, 0x50, 0x60, 0x0e, 0xbb, 0x4c, 0x67, - 0x7d, 0x48, 0xae, 0x92, 0x59, 0x5b, 0x8f, 0xd9, 0x61, 0x97, 0xd3, 0x38, 0xd8, 0x80, 0xfc, 0x3a, - 0x9c, 0x63, 0x60, 0x4b, 0x06, 0x53, 0x53, 0x3d, 0x62, 0x2c, 0x19, 0x06, 0x7b, 0x44, 0x53, 0x36, - 0xdd, 0x9e, 0xfa, 0x67, 0x0a, 0x9c, 0x61, 0xb8, 0x93, 0x09, 0x93, 0x8e, 0x7f, 0x86, 0xe8, 0xf1, - 0x88, 0xd1, 0x22, 0xe5, 0xf2, 0x47, 0x24, 0x5a, 0x2e, 0x99, 0xc0, 0x04, 0x76, 0x1c, 0xd2, 0x61, - 0x49, 0xee, 0xb3, 0xba, 0xfb, 0xb0, 0x24, 0xb9, 0xcf, 0x6a, 0x7b, 0x8e, 0xbd, 0xf1, 0xfb, 0x0a, - 0x4c, 0x31, 0xf0, 0x87, 0xc5, 0xd3, 0x81, 0x35, 0x36, 0xa7, 0x33, 0xbf, 0xab, 0xc0, 0x7c, 0x2a, - 0x18, 0xc3, 0x08, 0xdc, 0x7f, 0x82, 0x26, 0xc4, 0x27, 0x93, 0x59, 0xb5, 0xea, 0x99, 0x51, 0x5a, - 0x5e, 0x83, 0x99, 0x98, 0xe9, 0x34, 0x7c, 0x81, 0xa7, 0x64, 0xbe, 0xc0, 0x93, 0x1f, 0xd8, 0x55, - 0x0e, 0x7c, 0x60, 0xf7, 0x4f, 0x67, 0xc4, 0x7c, 0xb3, 0xc3, 0xea, 0x1b, 0x30, 0xc1, 0x5e, 0xc1, - 0x05, 0x69, 0x5b, 0x3f, 0x51, 0xfc, 0x79, 0x9d, 0xc7, 0x37, 0x42, 0xfe, 0x3f, 0x16, 0x68, 0x51, - 0x1b, 0xe6, 0x74, 0xcb, 0x19, 0xd2, 0x63, 0xd6, 0x86, 0x69, 0x91, 0x5b, 0xd1, 0x9e, 0x1b, 0xbe, - 0xe6, 0x6f, 0x25, 0xea, 0x71, 0xea, 0x0b, 0xd4, 0x95, 0x8f, 0xaf, 0xcf, 0x16, 0xbd, 0x46, 0xe0, - 0xd1, 0xd3, 0xc2, 0x63, 0xab, 0x0b, 0x40, 0x82, 0xa9, 0x0b, 0x9c, 0xa3, 0x5e, 0x2a, 0x27, 0x5a, - 0x22, 0x51, 0x16, 0x16, 0x79, 0x58, 0xa2, 0x82, 0x3c, 0xa8, 0x6f, 0x46, 0x89, 0xbc, 0xc4, 0xe1, - 0xf5, 0xe5, 0xb2, 0x59, 0xc4, 0xb8, 0x9a, 0x26, 0x15, 0x60, 0x99, 0x0a, 0xf2, 0x00, 0x22, 0x85, - 0xbd, 0x54, 0xd6, 0x97, 0xe8, 0x28, 0x10, 0xf5, 0x34, 0x2a, 0xc3, 0x12, 0x19, 0x4a, 0xd4, 0x0e, - 0x1f, 0xb3, 0x0a, 0xdf, 0xd8, 0x62, 0x44, 0xa3, 0x37, 0xb1, 0x11, 0xd1, 0xa8, 0x0c, 0x4b, 0x64, - 0xe8, 0xf0, 0xf6, 0xa3, 0x27, 0xcc, 0xe2, 0xc8, 0xfb, 0x72, 0xd9, 0xb7, 0xe4, 0x42, 0x0b, 0x8e, - 0x0a, 0xb0, 0x4c, 0x05, 0x39, 0x00, 0xfd, 0xf0, 0x69, 0xb3, 0x38, 0xff, 0x16, 0xeb, 0x69, 0xf4, - 0x42, 0x9a, 0x1b, 0x73, 0xa2, 0xdf, 0x58, 0x22, 0x41, 0x8f, 0xdb, 0xa1, 0xf9, 0x03, 0x4a, 0x9c, - 0x0c, 0x47, 0x32, 0x7d, 0x7c, 0x2c, 0xd2, 0xa9, 0xeb, 0x6c, 0xdd, 0x3e, 0x26, 0xe9, 0xd3, 0xf7, - 0xf7, 0x1a, 0xd3, 0x4c, 0x98, 0xa4, 0xf4, 0xeb, 0xe8, 0xa6, 0x64, 0xfa, 0xa0, 0x9b, 0x12, 0x74, - 0x0d, 0xe6, 0x3d, 0xd9, 0xa1, 0x80, 0x09, 0x88, 0x19, 0xf6, 0x49, 0xf8, 0x18, 0xbe, 0x9b, 0x04, - 0xc0, 0xe9, 0x6f, 0xb8, 0x04, 0x24, 0x06, 0xfb, 0x7e, 0x56, 0x96, 0x80, 0xbc, 0x0c, 0x87, 0xb5, - 0xa9, 0xe4, 0xa7, 0xa7, 0x4e, 0x2a, 0xf9, 0xe9, 0x17, 0xe4, 0x6c, 0x97, 0x73, 0x25, 0xfc, 0xe5, - 0x8a, 0xa4, 0xbb, 0x4c, 0xa6, 0x5e, 0x9d, 0x3f, 0xa1, 0xd4, 0xab, 0xa8, 0x05, 0xf3, 0x44, 0x4e, - 0x43, 0xcb, 0x66, 0x08, 0x45, 0xe6, 0x85, 0xe5, 0x64, 0x25, 0x4e, 0xc3, 0xab, 0xff, 0x9e, 0x9e, - 0x6d, 0x03, 0x15, 0x98, 0x9c, 0x80, 0xd6, 0x49, 0x62, 0xe7, 0x82, 0x56, 0x39, 0x9d, 0x9d, 0xe4, - 0xfa, 0x99, 0xfe, 0x81, 0x02, 0xb3, 0x11, 0xd8, 0x09, 0xa8, 0x60, 0x46, 0x5c, 0x05, 0xfb, 0x64, - 0xc9, 0x8e, 0xe5, 0xe8, 0x61, 0xff, 0xaf, 0x22, 0x77, 0x8b, 0x69, 0x1a, 0x77, 0x25, 0x73, 0x96, - 0x52, 0x42, 0xb5, 0xcd, 0x4a, 0x33, 0x1a, 0xf5, 0x38, 0xc3, 0xbc, 0xf5, 0xc5, 0xd8, 0x36, 0x5f, - 0xc6, 0x4d, 0x35, 0x3b, 0xf7, 0xee, 0xa1, 0x7b, 0xbe, 0x2b, 0x2f, 0x7b, 0xee, 0x39, 0xb6, 0x54, - 0xd0, 0x35, 0x52, 0xea, 0xf2, 0xc1, 0xb9, 0x6d, 0xff, 0x09, 0x40, 0x5d, 0x3a, 0x32, 0xbe, 0x2b, - 0x06, 0xcc, 0x21, 0xd4, 0x75, 0xc7, 0xf6, 0x7c, 0x57, 0x93, 0xde, 0x42, 0x96, 0x25, 0x1a, 0xca, - 0x9b, 0x56, 0x84, 0x1a, 0xcb, 0x74, 0xe8, 0xee, 0x18, 0x32, 0xda, 0xd8, 0x83, 0xb0, 0x9b, 0x1e, - 0xc4, 0x5c, 0x1f, 0x05, 0x08, 0x34, 0xad, 0x30, 0x69, 0x7e, 0x18, 0xc3, 0xb2, 0xe3, 0x5d, 0x0f, - 0xeb, 0xb0, 0x04, 0x87, 0xde, 0x86, 0x19, 0x4b, 0x8e, 0x5e, 0x27, 0xf4, 0xc0, 0x62, 0x1e, 0x16, - 0xb1, 0x38, 0x78, 0xfc, 0x7e, 0x3f, 0x56, 0x84, 0xe3, 0xb4, 0xd0, 0x16, 0x4c, 0x59, 0x41, 0xc8, - 0x45, 0xa1, 0x0c, 0xbe, 0x54, 0x98, 0x30, 0xc3, 0xc2, 0xaf, 0x39, 0xc2, 0x9f, 0x38, 0xc2, 0x4f, - 0xf9, 0x2e, 0xfc, 0x51, 0xee, 0xaa, 0x23, 0xa2, 0x16, 0xf2, 0x5d, 0x58, 0xe4, 0x61, 0x89, 0x4a, - 0x8e, 0x29, 0xba, 0x56, 0xc8, 0x14, 0x3d, 0x84, 0xd3, 0x2e, 0xf1, 0xdd, 0xdd, 0xd6, 0xae, 0xce, - 0xf2, 0xbc, 0xba, 0x3e, 0x8b, 0xae, 0x38, 0x55, 0xec, 0x4d, 0x13, 0x4e, 0xa3, 0xc2, 0x59, 0xf8, - 0xe9, 0x61, 0x8f, 0x6a, 0x0e, 0x22, 0xa4, 0x00, 0x3b, 0xec, 0x51, 0xbd, 0x02, 0xb3, 0x52, 0xf4, - 0x31, 0xa8, 0xfb, 0x44, 0xdf, 0xb4, 0x4d, 0x5d, 0xb3, 0x3a, 0x6d, 0xa1, 0x96, 0x45, 0x1b, 0x71, - 0x54, 0x85, 0x65, 0x38, 0xd4, 0x84, 0xb1, 0xa1, 0x69, 0x08, 0x7d, 0xec, 0x27, 0x43, 0x13, 0x4f, - 0xa7, 0x7d, 0x7f, 0xaf, 0xf1, 0xfe, 0xc8, 0x69, 0x3e, 0xec, 0xc9, 0x95, 0xc1, 0x56, 0xef, 0x8a, - 0xbf, 0x3b, 0x20, 0xde, 0xe2, 0x5a, 0xa7, 0x8d, 0xe9, 0xc7, 0x59, 0xa6, 0xf9, 0x99, 0x23, 0x98, - 0xe6, 0xbf, 0xae, 0xc0, 0x69, 0x2d, 0x69, 0x9d, 0x22, 0xde, 0xc2, 0x6c, 0x09, 0xa9, 0x9c, 0x6d, - 0xf2, 0x8a, 0xe2, 0x1f, 0x2d, 0xa5, 0xe9, 0xe1, 0xac, 0x46, 0xa8, 0x37, 0x01, 0x22, 0x25, 0xa6, - 0xb4, 0x35, 0xfe, 0xbf, 0x54, 0xe1, 0x6c, 0x59, 0x07, 0x0b, 0x16, 0x16, 0x91, 0x25, 0x9f, 0x59, - 0xda, 0xf0, 0x89, 0x7b, 0xfb, 0xf6, 0x4a, 0x98, 0x98, 0xa3, 0x60, 0x5c, 0xc6, 0x28, 0x7d, 0x51, - 0x0a, 0x23, 0xce, 0xa1, 0xc4, 0x14, 0x38, 0x91, 0x2d, 0x00, 0xd3, 0xfd, 0x6e, 0xe8, 0x7a, 0xbe, - 0x70, 0xfa, 0xe6, 0x0a, 0x5c, 0xb2, 0x12, 0xa7, 0xe1, 0x93, 0x48, 0x78, 0x22, 0x9c, 0x71, 0x96, - 0x3c, 0x38, 0x85, 0x84, 0x67, 0xc3, 0x49, 0xc3, 0xcb, 0x48, 0xc2, 0x64, 0xc3, 0x4c, 0x76, 0x26, - 0x90, 0x44, 0x99, 0x88, 0xd3, 0xf0, 0xc8, 0x80, 0x0b, 0x2e, 0xd1, 0x9d, 0x7e, 0x9f, 0xd8, 0x06, - 0x0f, 0xa9, 0xab, 0xb9, 0x3d, 0xd3, 0xbe, 0xea, 0x6a, 0x0c, 0x50, 0x64, 0x34, 0xbe, 0xb4, 0xbf, - 0xd7, 0xb8, 0x80, 0x0f, 0x80, 0xc3, 0x07, 0x62, 0x41, 0x7d, 0x38, 0x35, 0x64, 0xe1, 0xbe, 0xdc, - 0x8e, 0xed, 0x13, 0x77, 0x5b, 0xb3, 0x0a, 0x66, 0x78, 0x62, 0x0b, 0x6b, 0x2d, 0x8e, 0x0a, 0x27, - 0x71, 0xa3, 0x5d, 0x2a, 0xa7, 0x44, 0x73, 0x24, 0x92, 0xb5, 0xe2, 0x81, 0x43, 0x71, 0x1a, 0x1d, - 0xce, 0xa2, 0xa1, 0xfe, 0x1d, 0x05, 0xc4, 0x7d, 0x30, 0x15, 0x5b, 0x92, 0xa1, 0xad, 0x96, 0x30, - 0xb2, 0x5d, 0x88, 0x65, 0x7a, 0xaf, 0x25, 0xbc, 0xf8, 0x3e, 0x28, 0xbd, 0x26, 0x98, 0x8a, 0x64, - 0x3c, 0xc7, 0x2c, 0x85, 0xcc, 0xfb, 0x4b, 0x30, 0x39, 0x70, 0xcd, 0xbe, 0xe6, 0xee, 0x8a, 0xed, - 0x76, 0x86, 0x87, 0x46, 0xd0, 0xdd, 0xdd, 0x01, 0xdd, 0x67, 0x83, 0x5a, 0xf5, 0x07, 0x0a, 0x88, - 0xaf, 0x59, 0x9c, 0xc6, 0x91, 0x82, 0xfc, 0x1d, 0x9e, 0x14, 0x3f, 0x0a, 0x33, 0x38, 0x96, 0x17, - 0x66, 0xf0, 0xb8, 0x62, 0xf6, 0x7d, 0x57, 0x81, 0x64, 0xd6, 0x56, 0xf4, 0x24, 0x4c, 0x8a, 0xe7, - 0x97, 0xe2, 0x01, 0x17, 0x77, 0xc4, 0xe5, 0x45, 0x38, 0xa8, 0x8b, 0x9f, 0x3c, 0xcb, 0xa8, 0xc0, - 0xd9, 0x4f, 0x4c, 0x0e, 0x51, 0x46, 0xf7, 0x66, 0x61, 0x82, 0xbf, 0x17, 0x44, 0x3f, 0x93, 0xe9, - 0xe5, 0x77, 0xb3, 0xc4, 0x93, 0xc4, 0x02, 0xce, 0x7c, 0xb1, 0x70, 0x52, 0x95, 0x03, 0xc3, 0x49, - 0x75, 0x79, 0x18, 0xd1, 0x32, 0x86, 0xc7, 0x16, 0xee, 0x88, 0x3c, 0x16, 0x22, 0x84, 0x28, 0x1a, - 0xc6, 0xec, 0x71, 0xe3, 0x25, 0x42, 0xa4, 0xf2, 0x21, 0x90, 0xac, 0x72, 0xb3, 0x07, 0x58, 0xe4, - 0xa2, 0xf7, 0x59, 0xd5, 0x12, 0x57, 0xb5, 0x62, 0xd4, 0x47, 0x78, 0x9f, 0x15, 0xae, 0xa6, 0x89, - 0xdc, 0xd5, 0xd4, 0x83, 0x49, 0xb1, 0x1e, 0x84, 0x74, 0x7c, 0xa1, 0x4c, 0x90, 0x50, 0xe9, 0x5d, - 0x3f, 0x2f, 0xc0, 0x01, 0x76, 0xba, 0xe7, 0xf6, 0xb5, 0x1d, 0xb3, 0x3f, 0xec, 0x33, 0x99, 0x58, - 0x95, 0x41, 0x59, 0x31, 0x0e, 0xea, 0x19, 0x28, 0xbf, 0xe3, 0x66, 0x6a, 0x9e, 0x0c, 0x2a, 0x52, - 0x31, 0x05, 0xf5, 0xe8, 0x33, 0x50, 0xeb, 0x6b, 0x3b, 0xdd, 0xa1, 0xdb, 0x23, 0xc2, 0x10, 0x97, - 0x6f, 0x86, 0x18, 0xfa, 0xa6, 0xb5, 0x48, 0x0f, 0x28, 0xbe, 0xbb, 0xd8, 0xb1, 0xfd, 0xdb, 0x6e, - 0xd7, 0x77, 0xc3, 0xc8, 0x85, 0x2b, 0x02, 0x0b, 0x0e, 0xf1, 0x21, 0x0b, 0x66, 0xfb, 0xda, 0xce, - 0x9a, 0xad, 0x85, 0x19, 0x63, 0xea, 0x05, 0x29, 0xb0, 0x5b, 0x89, 0x95, 0x18, 0x2e, 0x9c, 0xc0, - 0x9d, 0x71, 0x01, 0x32, 0x7d, 0x5c, 0x17, 0x20, 0x4b, 0xa1, 0xe7, 0xd3, 0x0c, 0x63, 0xc3, 0x47, - 0xb3, 0x2e, 0xc3, 0x0f, 0x76, 0x6a, 0x7a, 0x23, 0x74, 0x6a, 0x9a, 0x2d, 0x71, 0x6b, 0x71, 0x80, - 0x43, 0xd3, 0x36, 0xd4, 0x0d, 0xcd, 0xd7, 0x78, 0xa9, 0xb7, 0x70, 0xaa, 0x84, 0xad, 0xa4, 0x1d, - 0xe2, 0x91, 0xe2, 0xb8, 0x47, 0xb8, 0xb1, 0x4c, 0x08, 0xdd, 0xe6, 0x19, 0x45, 0x2c, 0xe2, 0x47, - 0x20, 0xcc, 0x5e, 0x36, 0xc7, 0x2d, 0xa2, 0x41, 0xfe, 0x8f, 0x14, 0x00, 0xce, 0xfe, 0x8e, 0xaa, - 0xa9, 0xfc, 0x05, 0xc6, 0x7c, 0x14, 0x51, 0x24, 0xf6, 0x68, 0xf3, 0x6f, 0x28, 0x30, 0xc7, 0xd3, - 0xd5, 0xb5, 0x9c, 0xfe, 0xc0, 0xb1, 0x09, 0x9d, 0x18, 0xc4, 0x46, 0xf5, 0x46, 0x09, 0xf9, 0xd0, - 0x4d, 0xa0, 0x14, 0x8e, 0x0c, 0x89, 0x52, 0x9c, 0x22, 0x8d, 0xfe, 0xb9, 0x02, 0x0b, 0xfd, 0x9c, - 0x30, 0xe9, 0x0b, 0xa7, 0x4b, 0xb8, 0x7d, 0x1e, 0x16, 0x7b, 0x9d, 0xa7, 0xd2, 0x3c, 0x0c, 0x0a, - 0xe7, 0x36, 0xae, 0xac, 0x87, 0x78, 0x99, 0xd7, 0xac, 0x7f, 0x05, 0xe6, 0x92, 0x3b, 0x81, 0x9c, - 0x02, 0x45, 0x39, 0xde, 0x14, 0x28, 0xea, 0x8b, 0x70, 0x2e, 0x7b, 0xd6, 0xa9, 0xd2, 0xc5, 0x32, - 0x0a, 0x89, 0x83, 0x4e, 0x14, 0x80, 0x93, 0x16, 0x62, 0x5e, 0xd7, 0x5c, 0xfc, 0xde, 0x8f, 0x2f, - 0xbe, 0xef, 0xf7, 0x7f, 0x7c, 0xf1, 0x7d, 0x3f, 0xfc, 0xf1, 0xc5, 0xf7, 0x7d, 0x69, 0xff, 0xa2, - 0xf2, 0xbd, 0xfd, 0x8b, 0xca, 0xef, 0xef, 0x5f, 0x54, 0x7e, 0xb8, 0x7f, 0x51, 0xf9, 0x4f, 0xfb, - 0x17, 0x95, 0xbf, 0xf5, 0x9f, 0x2f, 0xbe, 0xef, 0x33, 0xb5, 0xa0, 0x49, 0xff, 0x3f, 0x00, 0x00, - 0xff, 0xff, 0xcf, 0x16, 0xe9, 0xfc, 0x10, 0xbe, 0x00, 0x00, + // 9916 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0xbd, 0x7d, 0x6c, 0x24, 0xc9, + 0x75, 0x18, 0xae, 0x1e, 0x72, 0xc8, 0xe1, 0x1b, 0x92, 0x4b, 0xd6, 0x7e, 0x1c, 0x6f, 0x6f, 0x77, + 0xb9, 0x6a, 0xe9, 0xf4, 0xdb, 0xfb, 0x49, 0xe6, 0xfa, 0xf4, 0x61, 0xe9, 0x4e, 0x77, 0xa7, 0xe3, + 0xcc, 0x70, 0x77, 0x47, 0xbb, 0xdc, 0xe5, 0xd5, 0x2c, 0xef, 0x74, 0x27, 0x43, 0xa7, 0x66, 0x77, + 0x71, 0xd8, 0xc7, 0x9e, 0xee, 0xb9, 0xee, 0x1e, 0x2e, 0xb9, 0x27, 0x58, 0xca, 0x59, 0x96, 0x63, + 0x09, 0x09, 0x12, 0x38, 0x81, 0x02, 0x49, 0x90, 0x65, 0xc1, 0x08, 0x14, 0x24, 0x81, 0x1c, 0x05, + 0x51, 0xe0, 0x24, 0xf0, 0x1f, 0xf6, 0x1f, 0x16, 0xe4, 0x40, 0x31, 0x12, 0xc7, 0x50, 0x0c, 0x87, + 0x8a, 0x98, 0x20, 0x51, 0x12, 0xe7, 0x8f, 0xc0, 0x08, 0x02, 0x2c, 0x9c, 0x20, 0xa8, 0x8f, 0xee, + 0xae, 0xfe, 0x1a, 0x0e, 0xbb, 0xb9, 0xbc, 0xbb, 0xbf, 0xc8, 0xa9, 0x7a, 0xfd, 0x5e, 0x7d, 0xbe, + 0x7a, 0xef, 0xd5, 0xab, 0xf7, 0xa0, 0xd9, 0x35, 0xfd, 0xad, 0xc1, 0xc6, 0x92, 0xee, 0xf4, 0xae, + 0x76, 0x35, 0xd7, 0x20, 0x36, 0x71, 0xa3, 0x7f, 0xfa, 0xdb, 0xdd, 0xab, 0x5a, 0xdf, 0xf4, 0xae, + 0xea, 0x8e, 0x4b, 0xae, 0xee, 0x3c, 0xa9, 0x59, 0xfd, 0x2d, 0xed, 0xc9, 0xab, 0x5d, 0x5a, 0xa9, + 0xf9, 0xc4, 0x58, 0xea, 0xbb, 0x8e, 0xef, 0xa0, 0x0f, 0x45, 0x48, 0x96, 0x82, 0x6f, 0xa3, 0x7f, + 0xfa, 0xdb, 0xdd, 0x25, 0x8a, 0x64, 0x89, 0x22, 0x59, 0x0a, 0x90, 0x9c, 0x6f, 0x1c, 0x89, 0xf2, + 0x06, 0xf1, 0xd3, 0x84, 0xcf, 0xff, 0x9c, 0x8c, 0xc3, 0xe9, 0x3a, 0x57, 0x59, 0xf1, 0xc6, 0x60, + 0x93, 0xfd, 0x62, 0x3f, 0xd8, 0x7f, 0x02, 0xfc, 0x89, 0xed, 0x8f, 0x79, 0x4b, 0xa6, 0x43, 0x11, + 0x5f, 0xd5, 0x06, 0xbe, 0xe3, 0xe9, 0x9a, 0x65, 0xda, 0xdd, 0xab, 0x3b, 0x69, 0xcc, 0xaa, 0x04, + 0x2a, 0x9a, 0x30, 0x14, 0xc6, 0xdd, 0xd0, 0xf4, 0x2c, 0x98, 0x0f, 0x47, 0x30, 0x3d, 0x4d, 0xdf, + 0x32, 0x6d, 0xe2, 0xee, 0x05, 0x9d, 0xbb, 0xea, 0x12, 0xcf, 0x19, 0xb8, 0x3a, 0x39, 0xd2, 0x57, + 0xde, 0xd5, 0x1e, 0xf1, 0xb5, 0x2c, 0x5a, 0x57, 0xf3, 0xbe, 0x72, 0x07, 0xb6, 0x6f, 0xf6, 0xd2, + 0x64, 0x7e, 0xe1, 0xb0, 0x0f, 0x3c, 0x7d, 0x8b, 0xf4, 0xb4, 0xd4, 0x77, 0x1f, 0xca, 0xfb, 0x6e, + 0xe0, 0x9b, 0xd6, 0x55, 0xd3, 0xf6, 0x3d, 0xdf, 0x4d, 0x7e, 0xa4, 0x7e, 0x10, 0xaa, 0xcb, 0x86, + 0xe1, 0xd8, 0xe8, 0x09, 0x98, 0x24, 0xb6, 0xb6, 0x61, 0x11, 0x63, 0x41, 0xb9, 0xac, 0x5c, 0xa9, + 0x35, 0x4e, 0xfd, 0x60, 0x7f, 0xf1, 0x5d, 0x07, 0xfb, 0x8b, 0x93, 0x2b, 0xbc, 0x18, 0x07, 0xf5, + 0xea, 0x57, 0x2b, 0x30, 0xc1, 0x3e, 0xf2, 0xd0, 0xaf, 0x2b, 0x70, 0x7a, 0x7b, 0xb0, 0x41, 0x5c, + 0x9b, 0xf8, 0xc4, 0x6b, 0x69, 0xde, 0xd6, 0x86, 0xa3, 0xb9, 0x1c, 0x45, 0xfd, 0x83, 0x37, 0x96, + 0x0a, 0x2c, 0xc1, 0xa5, 0x9b, 0x69, 0x7c, 0x8d, 0x47, 0x0e, 0xf6, 0x17, 0x4f, 0x67, 0x54, 0xe0, + 0x2c, 0xea, 0xe8, 0x1e, 0x4c, 0xdb, 0x5d, 0xd3, 0xde, 0x6d, 0xdb, 0x5d, 0x97, 0x78, 0xde, 0x42, + 0x85, 0xb5, 0x66, 0xb9, 0x50, 0x6b, 0x6e, 0x4b, 0x88, 0x1a, 0x73, 0x07, 0xfb, 0x8b, 0xd3, 0x72, + 0x09, 0x8e, 0x11, 0x52, 0xbf, 0xa4, 0xc0, 0xa9, 0x65, 0xa3, 0x67, 0x7a, 0x9e, 0xe9, 0xd8, 0x6b, + 0xd6, 0xa0, 0x6b, 0xda, 0xe8, 0x32, 0x8c, 0xdb, 0x5a, 0x8f, 0xb0, 0x21, 0x99, 0x6a, 0x4c, 0x8b, + 0x51, 0x1d, 0xbf, 0xad, 0xf5, 0x08, 0x66, 0x35, 0xe8, 0x05, 0x98, 0xd0, 0x1d, 0x7b, 0xd3, 0xec, + 0x8a, 0x86, 0xfe, 0xdc, 0x12, 0x9f, 0xc9, 0x25, 0x79, 0x26, 0x59, 0xfb, 0xc4, 0x0a, 0x58, 0xc2, + 0xda, 0xbd, 0x95, 0x5d, 0x9f, 0xd8, 0x94, 0x4c, 0x03, 0x0e, 0xf6, 0x17, 0x27, 0x9a, 0x0c, 0x01, + 0x16, 0x88, 0xd4, 0x6b, 0x50, 0x5b, 0xb6, 0x88, 0xeb, 0x9b, 0x76, 0x17, 0x3d, 0x0d, 0xb3, 0xa4, + 0xa7, 0x99, 0x16, 0x26, 0x3a, 0x31, 0x77, 0x88, 0xeb, 0x2d, 0x28, 0x97, 0xc7, 0xae, 0x4c, 0x35, + 0xd0, 0xc1, 0xfe, 0xe2, 0xec, 0x4a, 0xac, 0x06, 0x27, 0x20, 0xd5, 0x37, 0x15, 0xa8, 0x2f, 0x0f, + 0x0c, 0xd3, 0xe7, 0xf8, 0x91, 0x07, 0x75, 0x8d, 0xfe, 0x5c, 0x73, 0x2c, 0x53, 0xdf, 0x13, 0xd3, + 0xfc, 0x7c, 0xa1, 0x81, 0x5d, 0x8e, 0xf0, 0x34, 0x4e, 0x1d, 0xec, 0x2f, 0xd6, 0xa5, 0x02, 0x2c, + 0x53, 0x51, 0xb7, 0x40, 0xae, 0x43, 0x2f, 0xc3, 0x34, 0xef, 0xe5, 0xaa, 0xd6, 0xc7, 0x64, 0x53, + 0x34, 0xe2, 0x3d, 0xd2, 0xa0, 0x05, 0x94, 0x96, 0xee, 0x6c, 0xbc, 0x46, 0x74, 0x1f, 0x93, 0x4d, + 0xe2, 0x12, 0x5b, 0x27, 0x7c, 0xfe, 0x9a, 0xd2, 0xc7, 0x38, 0x86, 0x4a, 0xfd, 0x89, 0x02, 0x73, + 0xcb, 0x3b, 0x9a, 0x69, 0x69, 0x1b, 0xa6, 0x65, 0xfa, 0x7b, 0xaf, 0x38, 0x36, 0x19, 0x61, 0x02, + 0xd7, 0xe1, 0x91, 0x81, 0xad, 0xf1, 0xef, 0x2c, 0xb2, 0xca, 0xa7, 0xec, 0xee, 0x5e, 0x9f, 0xd0, + 0xa5, 0x47, 0x87, 0xfa, 0xb1, 0x83, 0xfd, 0xc5, 0x47, 0xd6, 0xb3, 0x41, 0x70, 0xde, 0xb7, 0x08, + 0xc3, 0x39, 0xa9, 0xea, 0x45, 0xc7, 0x1a, 0xf4, 0x04, 0xd6, 0x31, 0x86, 0xf5, 0xfc, 0xc1, 0xfe, + 0xe2, 0xb9, 0xf5, 0x4c, 0x08, 0x9c, 0xf3, 0xa5, 0xfa, 0xc3, 0x0a, 0x4c, 0x37, 0x34, 0x7d, 0x7b, + 0xd0, 0x6f, 0x0c, 0xf4, 0x6d, 0xe2, 0xa3, 0xcf, 0x42, 0x8d, 0x72, 0x2e, 0x43, 0xf3, 0x35, 0x31, + 0x92, 0x3f, 0x9f, 0xbb, 0xfc, 0xd8, 0x2c, 0x52, 0xe8, 0x68, 0x6c, 0x57, 0x89, 0xaf, 0x35, 0x90, + 0x18, 0x13, 0x88, 0xca, 0x70, 0x88, 0x15, 0x75, 0x61, 0xdc, 0xeb, 0x13, 0x5d, 0x2c, 0xee, 0x95, + 0x42, 0x8b, 0x45, 0x6e, 0x72, 0xa7, 0x4f, 0xf4, 0x68, 0x1a, 0xe8, 0x2f, 0xcc, 0x08, 0x20, 0x07, + 0x26, 0x3c, 0x5f, 0xf3, 0x07, 0x74, 0x7c, 0x28, 0xa9, 0xeb, 0xe5, 0x49, 0x31, 0x74, 0x8d, 0x59, + 0x41, 0x6c, 0x82, 0xff, 0xc6, 0x82, 0x8c, 0xfa, 0x63, 0x05, 0xe6, 0x64, 0xf0, 0x5b, 0xa6, 0xe7, + 0xa3, 0x5f, 0x4c, 0x0d, 0xe8, 0xd2, 0x68, 0x03, 0x4a, 0xbf, 0x66, 0xc3, 0x39, 0x27, 0xc8, 0xd5, + 0x82, 0x12, 0x69, 0x30, 0x37, 0xa1, 0x6a, 0xfa, 0xa4, 0xc7, 0x17, 0x56, 0x51, 0x9e, 0x26, 0xb7, + 0xb9, 0x31, 0x23, 0xa8, 0x55, 0xdb, 0x14, 0x2f, 0xe6, 0xe8, 0xd5, 0xcf, 0xc2, 0x19, 0x19, 0x6a, + 0xcd, 0x75, 0x76, 0x4c, 0x83, 0xb8, 0x74, 0x33, 0xf8, 0x7b, 0xfd, 0xd4, 0x66, 0xa0, 0x8b, 0x0b, + 0xb3, 0x1a, 0xf4, 0x3e, 0x98, 0x70, 0x49, 0xd7, 0x74, 0x6c, 0x36, 0xe1, 0x53, 0xd1, 0xe0, 0x61, + 0x56, 0x8a, 0x45, 0xad, 0xfa, 0xdf, 0x2a, 0xf1, 0xc1, 0xa3, 0x13, 0x89, 0xee, 0x41, 0xad, 0x2f, + 0x48, 0x89, 0xc1, 0x6b, 0x97, 0xee, 0x61, 0xd0, 0xf6, 0x68, 0x5c, 0x83, 0x12, 0x1c, 0x12, 0x43, + 0x26, 0xcc, 0x06, 0xff, 0x37, 0x4b, 0xf0, 0x62, 0xc6, 0x53, 0xd7, 0x62, 0x88, 0x70, 0x02, 0x31, + 0xba, 0x0b, 0x53, 0x1e, 0xd1, 0x5d, 0x42, 0xf9, 0x92, 0x58, 0xa9, 0x99, 0xcc, 0xab, 0x13, 0x00, + 0x09, 0xe6, 0x35, 0x2f, 0x9a, 0x3f, 0x15, 0x56, 0xe0, 0x08, 0x11, 0xba, 0x00, 0xe3, 0x1e, 0x21, + 0xc6, 0xc2, 0x38, 0x1b, 0xf4, 0x1a, 0xdb, 0x1a, 0x84, 0x18, 0x98, 0x95, 0xaa, 0xdf, 0x1e, 0x07, + 0x94, 0x5e, 0xd8, 0x72, 0xaf, 0x79, 0x89, 0x18, 0xf4, 0x32, 0xbd, 0x16, 0x7b, 0x24, 0x81, 0x18, + 0xbd, 0x01, 0x33, 0x96, 0xe6, 0xf9, 0x77, 0xfa, 0x54, 0xfc, 0x08, 0x56, 0x47, 0xfd, 0x83, 0x8d, + 0x42, 0xd3, 0x7b, 0x4b, 0xc6, 0xd4, 0x98, 0x3f, 0xd8, 0x5f, 0x9c, 0x89, 0x15, 0xe1, 0x38, 0x2d, + 0xb4, 0x0d, 0x53, 0xb4, 0x60, 0xc5, 0x75, 0x1d, 0x57, 0x0c, 0xf9, 0x73, 0x85, 0x09, 0x33, 0x2c, + 0x8d, 0x19, 0x3a, 0x13, 0xe1, 0x4f, 0x1c, 0xe1, 0x47, 0x9f, 0x04, 0xe4, 0x6c, 0x78, 0xc4, 0xdd, + 0x21, 0xc6, 0x75, 0x2e, 0x6d, 0xd1, 0xee, 0xd2, 0x79, 0x19, 0x6b, 0x9c, 0x17, 0x73, 0x88, 0xee, + 0xa4, 0x20, 0x70, 0xc6, 0x57, 0x68, 0x1b, 0x50, 0x28, 0xb1, 0x85, 0xd3, 0xbe, 0x50, 0x1d, 0x7d, + 0xd1, 0x9c, 0xa3, 0xc4, 0xae, 0xa7, 0x50, 0xe0, 0x0c, 0xb4, 0xea, 0x1f, 0x54, 0xa0, 0xce, 0x17, + 0xc9, 0x8a, 0xed, 0xbb, 0x7b, 0x27, 0x70, 0x34, 0x6c, 0xc6, 0x8e, 0x86, 0x56, 0x89, 0xad, 0xce, + 0x5a, 0x9c, 0x7b, 0x32, 0xd8, 0x89, 0x93, 0xe1, 0x5a, 0x69, 0x4a, 0xc3, 0x0f, 0x86, 0x3f, 0x51, + 0xe0, 0x94, 0x04, 0x7d, 0x02, 0xe7, 0x02, 0x89, 0x9f, 0x0b, 0xcf, 0x97, 0xed, 0x60, 0xce, 0xb1, + 0xa0, 0xc7, 0xfa, 0xc5, 0x58, 0xf6, 0x07, 0x01, 0x36, 0x18, 0x4f, 0xb9, 0x1d, 0x09, 0x49, 0xe1, + 0xac, 0x37, 0xc2, 0x1a, 0x2c, 0x41, 0x85, 0xcc, 0xaa, 0x92, 0xc9, 0xac, 0xfe, 0xa2, 0x02, 0xf3, + 0xa9, 0xb1, 0x4e, 0x33, 0x10, 0xe5, 0xad, 0x62, 0x20, 0x95, 0xb7, 0x84, 0x81, 0x8c, 0x15, 0x62, + 0x20, 0x57, 0xa0, 0x46, 0xc7, 0x94, 0xcd, 0x0d, 0x3f, 0x1a, 0xa6, 0xe9, 0x0a, 0xea, 0x88, 0x32, + 0x1c, 0xd6, 0xaa, 0xbf, 0xaf, 0xc0, 0x58, 0x13, 0xb7, 0xd1, 0xfb, 0x63, 0xe2, 0xee, 0x23, 0xb2, + 0xb8, 0xfb, 0x60, 0x7f, 0x71, 0xb2, 0x89, 0xdb, 0x92, 0xe4, 0xfb, 0xd7, 0x15, 0x98, 0xd7, 0x1d, + 0xdb, 0xd7, 0xe8, 0xda, 0xc5, 0xfc, 0x6c, 0x08, 0xd6, 0x60, 0x31, 0x49, 0xaf, 0x99, 0xc0, 0xd6, + 0x78, 0x54, 0xb4, 0x60, 0x3e, 0x59, 0xe3, 0xe1, 0x34, 0x69, 0x75, 0x1d, 0xa6, 0x9a, 0x96, 0x33, + 0x30, 0xda, 0xf6, 0xa6, 0x73, 0x8c, 0xc2, 0xca, 0xbf, 0x53, 0x60, 0x9a, 0xe1, 0x5d, 0x73, 0x9d, + 0x4d, 0xd3, 0x22, 0xef, 0x10, 0xb1, 0x59, 0x6e, 0x72, 0x1e, 0x73, 0x64, 0x52, 0xac, 0x0c, 0xf8, + 0x4e, 0x91, 0x62, 0xe5, 0x36, 0xe7, 0xb0, 0xab, 0xaf, 0x4f, 0xc6, 0xbb, 0xc6, 0x18, 0xd6, 0x15, + 0xa8, 0xe9, 0x5a, 0x63, 0x60, 0x1b, 0x56, 0xb8, 0x32, 0x68, 0x33, 0x9b, 0xcb, 0xbc, 0x0c, 0x87, + 0xb5, 0xe8, 0x0d, 0x80, 0xc8, 0xbc, 0x20, 0x26, 0xe2, 0x7a, 0x49, 0x9b, 0x46, 0x87, 0xf8, 0x54, + 0x2b, 0xf7, 0xa2, 0xd9, 0x8f, 0xea, 0xb0, 0x44, 0x0e, 0xfd, 0x12, 0xcc, 0x88, 0x61, 0x6e, 0xf7, + 0xb4, 0xae, 0x50, 0xfa, 0x8a, 0x8e, 0xd5, 0xaa, 0x84, 0xa9, 0x71, 0x56, 0x50, 0x9e, 0x91, 0x4b, + 0x3d, 0x1c, 0x27, 0x87, 0xee, 0xc3, 0x74, 0x4f, 0xd6, 0x64, 0xc7, 0x4b, 0x1c, 0x2c, 0x92, 0x5a, + 0xdb, 0x38, 0x23, 0xa8, 0x4f, 0xc7, 0x94, 0xe0, 0x18, 0xad, 0x0c, 0x69, 0xbc, 0xfa, 0xb0, 0xa4, + 0xf1, 0x4d, 0x98, 0xe4, 0x7b, 0xdc, 0x5b, 0x98, 0x60, 0x3d, 0xfc, 0x78, 0xa1, 0x1e, 0x72, 0x7e, + 0x11, 0x19, 0xcd, 0xf8, 0x6f, 0x0f, 0x07, 0xc8, 0xd1, 0x3d, 0x98, 0xa6, 0xac, 0xb6, 0x43, 0x2c, + 0xa2, 0xfb, 0x8e, 0xbb, 0x30, 0x59, 0xc2, 0x26, 0xd5, 0x91, 0x10, 0x71, 0x9b, 0x86, 0x5c, 0x82, + 0x63, 0x84, 0x42, 0x26, 0x58, 0xcb, 0x65, 0x82, 0x3b, 0x50, 0xdf, 0x91, 0x8c, 0x0b, 0x53, 0x6c, + 0x18, 0x3e, 0x51, 0xa8, 0x65, 0x91, 0xa9, 0xa1, 0x71, 0x5a, 0x50, 0xaa, 0xcb, 0x66, 0x09, 0x99, + 0x90, 0xfa, 0x9d, 0x1a, 0xcc, 0x37, 0xad, 0x81, 0xe7, 0x13, 0x77, 0x59, 0xd8, 0x7d, 0x89, 0x8b, + 0xde, 0x54, 0xe0, 0x1c, 0xfb, 0xb7, 0xe5, 0xdc, 0xb3, 0x5b, 0xc4, 0xd2, 0xf6, 0x96, 0x37, 0x29, + 0x84, 0x61, 0x1c, 0x8d, 0x11, 0xb5, 0x06, 0xe2, 0x74, 0x67, 0x66, 0x92, 0x4e, 0x26, 0x46, 0x9c, + 0x43, 0x09, 0x7d, 0x45, 0x81, 0x47, 0x33, 0xaa, 0x5a, 0xc4, 0x22, 0x3e, 0x11, 0x9c, 0xe0, 0xa8, + 0xed, 0xb8, 0x78, 0xb0, 0xbf, 0xf8, 0x68, 0x27, 0x0f, 0x29, 0xce, 0xa7, 0x47, 0x4f, 0xd9, 0xf3, + 0x19, 0xb5, 0xd7, 0x34, 0xd3, 0x1a, 0xb8, 0x44, 0xc8, 0xb4, 0x47, 0x6d, 0xce, 0xa5, 0x83, 0xfd, + 0xc5, 0xf3, 0x9d, 0x5c, 0xac, 0x78, 0x08, 0x45, 0xf4, 0x79, 0x38, 0x1b, 0xd6, 0xae, 0xdb, 0x36, + 0x21, 0x06, 0x31, 0xee, 0x9a, 0x42, 0xc4, 0x38, 0x7a, 0x53, 0x1e, 0x3d, 0xd8, 0x5f, 0x3c, 0xdb, + 0xc9, 0x42, 0x88, 0xb3, 0xe9, 0xa0, 0x2e, 0x5c, 0x8c, 0x2a, 0x7c, 0xd3, 0x32, 0xef, 0x33, 0x4c, + 0x77, 0xb7, 0x5c, 0xe2, 0x6d, 0x39, 0x96, 0xc1, 0xf8, 0x85, 0xd2, 0x78, 0xf7, 0xc1, 0xfe, 0xe2, + 0xc5, 0xce, 0x30, 0x40, 0x3c, 0x1c, 0x0f, 0x32, 0x60, 0xda, 0xd3, 0x35, 0xbb, 0x6d, 0xfb, 0xc4, + 0xdd, 0xd1, 0xac, 0x85, 0x89, 0x42, 0x1d, 0xe4, 0x7b, 0x54, 0xc2, 0x83, 0x63, 0x58, 0xd1, 0xc7, + 0xa0, 0x46, 0x76, 0xfb, 0x9a, 0x6d, 0x10, 0xce, 0x18, 0xa6, 0x1a, 0x17, 0xe8, 0x91, 0xb4, 0x22, + 0xca, 0x1e, 0xec, 0x2f, 0x4e, 0x07, 0xff, 0xaf, 0x3a, 0x06, 0xc1, 0x21, 0x34, 0xfa, 0x1c, 0x9c, + 0xe9, 0x69, 0xbb, 0xb7, 0x1d, 0x83, 0x30, 0x3e, 0x47, 0xd9, 0x1e, 0x9b, 0x88, 0x5a, 0xa1, 0x76, + 0x2e, 0x1c, 0xec, 0x2f, 0x9e, 0x59, 0xcd, 0xc0, 0x87, 0x33, 0xa9, 0xd0, 0x69, 0xe8, 0x69, 0xbb, + 0xd7, 0x5d, 0x4d, 0x27, 0x9b, 0x03, 0xeb, 0x2e, 0x71, 0x7b, 0xa6, 0xcd, 0x30, 0x75, 0x88, 0xee, + 0xd8, 0x06, 0xe5, 0x25, 0xca, 0x95, 0x2a, 0x9f, 0x86, 0xd5, 0x61, 0x80, 0x78, 0x38, 0x1e, 0xf5, + 0xbf, 0x2b, 0x50, 0x17, 0xac, 0x82, 0x49, 0x76, 0x3a, 0x54, 0x75, 0x7a, 0xae, 0x0b, 0x96, 0xf0, + 0x5c, 0x71, 0x01, 0x82, 0xa2, 0x8b, 0xa4, 0x07, 0x56, 0x84, 0x39, 0x6e, 0x74, 0x2f, 0xe3, 0xf8, + 0x6f, 0x96, 0x3c, 0xfe, 0x19, 0xb9, 0x43, 0x8e, 0x7e, 0x75, 0x7f, 0x0c, 0xa6, 0x9a, 0x8e, 0x6d, + 0x98, 0x4c, 0x84, 0x7f, 0x32, 0x26, 0xc5, 0x5e, 0x94, 0x19, 0xf8, 0x83, 0xfd, 0xc5, 0x99, 0x10, + 0x50, 0xe2, 0xe8, 0x4f, 0x85, 0xfa, 0x2e, 0x17, 0x6b, 0xdf, 0x1d, 0xd7, 0x53, 0x1f, 0xec, 0x2f, + 0x9e, 0x0a, 0x3f, 0x8b, 0xab, 0xae, 0x68, 0x07, 0x10, 0xd5, 0x44, 0xee, 0xba, 0x9a, 0xed, 0x71, + 0xb4, 0x74, 0x39, 0x71, 0x16, 0xf3, 0xff, 0x8f, 0xb6, 0x9c, 0xe8, 0x17, 0x91, 0xa2, 0x72, 0x2b, + 0x85, 0x0d, 0x67, 0x50, 0x40, 0xaf, 0xc1, 0x2c, 0x2d, 0x5d, 0xef, 0x1b, 0x9a, 0x4f, 0x24, 0x5e, + 0x72, 0x14, 0x9a, 0xe7, 0x04, 0xcd, 0xd9, 0x5b, 0x31, 0x4c, 0x38, 0x81, 0x99, 0x4b, 0xfd, 0x9a, + 0xe7, 0xd8, 0x8c, 0x4d, 0xc4, 0xa4, 0x7e, 0x5a, 0x8a, 0x45, 0x2d, 0x7a, 0x02, 0x26, 0x7b, 0xc4, + 0xf3, 0xb4, 0x2e, 0x61, 0xfb, 0x7e, 0x2a, 0x3a, 0xde, 0x57, 0x79, 0x31, 0x0e, 0xea, 0xd1, 0x07, + 0xa0, 0xaa, 0x3b, 0x06, 0xf1, 0x16, 0x26, 0x99, 0x69, 0xfe, 0x1c, 0x5b, 0x4c, 0xb4, 0xe0, 0xc1, + 0xfe, 0xe2, 0x14, 0x53, 0xeb, 0xe8, 0x2f, 0xcc, 0x81, 0xd4, 0xdf, 0xa0, 0x22, 0x77, 0x42, 0x77, + 0xc9, 0xbb, 0x67, 0xe0, 0xd3, 0xca, 0xb4, 0xad, 0x93, 0x33, 0x52, 0xaa, 0xbf, 0x56, 0x81, 0x33, + 0xb4, 0x85, 0xae, 0x63, 0x59, 0xf4, 0x1c, 0xea, 0x5b, 0xce, 0x5e, 0x8f, 0xd8, 0x27, 0x71, 0x5f, + 0x10, 0x08, 0x2c, 0x95, 0x5c, 0x81, 0xa5, 0x97, 0x1a, 0x87, 0xb1, 0x22, 0xe3, 0x10, 0x2e, 0x97, + 0x43, 0xc6, 0xe2, 0x67, 0x0a, 0x2c, 0x64, 0x8d, 0xc5, 0x09, 0x28, 0x4a, 0x76, 0x5c, 0x51, 0x6a, + 0x17, 0x56, 0xa9, 0x93, 0x6d, 0xcf, 0x51, 0x98, 0x7e, 0x56, 0x81, 0x73, 0x11, 0x78, 0xdb, 0xf6, + 0x7c, 0xcd, 0xb2, 0xb8, 0x25, 0xe1, 0xe1, 0x4f, 0xfc, 0xeb, 0x31, 0x8d, 0xf7, 0x4e, 0xc9, 0xbe, + 0xca, 0x8d, 0xcf, 0x35, 0x0c, 0xee, 0x25, 0x0c, 0x83, 0x2f, 0x1c, 0x27, 0xd1, 0xe1, 0x36, 0xc2, + 0x3f, 0x57, 0xe0, 0x7c, 0xf6, 0x87, 0x27, 0xb0, 0xae, 0xfa, 0xf1, 0x75, 0x75, 0xf3, 0x18, 0xbb, + 0x9d, 0xb3, 0xb2, 0xbe, 0x57, 0xc9, 0xeb, 0x2e, 0x53, 0xca, 0x37, 0xe1, 0x14, 0xd5, 0x94, 0x3c, + 0x5f, 0xd8, 0xb2, 0x8e, 0x76, 0xaf, 0x1b, 0x58, 0xa9, 0x4e, 0xe1, 0x38, 0x0e, 0x9c, 0x44, 0x8a, + 0x6e, 0xc3, 0x24, 0xd5, 0x8e, 0x28, 0xfe, 0xca, 0xe8, 0xf8, 0x43, 0xbe, 0xdf, 0xe1, 0xdf, 0xe2, + 0x00, 0x09, 0xfa, 0x45, 0x98, 0x31, 0xc2, 0x4d, 0x75, 0xc8, 0x85, 0x4e, 0x12, 0x2b, 0x33, 0x3b, + 0xb6, 0xe4, 0xaf, 0x71, 0x1c, 0x99, 0xfa, 0x7f, 0x14, 0xb8, 0x30, 0x6c, 0x71, 0x21, 0x17, 0x40, + 0x0f, 0x0e, 0x72, 0x7e, 0xaf, 0x5f, 0x58, 0x18, 0x0a, 0xd0, 0x44, 0x9b, 0x34, 0x2c, 0xf2, 0xb0, + 0x44, 0x25, 0xe3, 0xd2, 0xa8, 0xf2, 0x90, 0x2e, 0x8d, 0xd4, 0xff, 0xa1, 0xc8, 0xec, 0x48, 0x9e, + 0xdc, 0x77, 0x1c, 0x3b, 0x92, 0x1b, 0x9f, 0x6b, 0x8a, 0xfb, 0xe3, 0x0a, 0x5c, 0xce, 0xfe, 0x44, + 0x3a, 0x81, 0x9f, 0x87, 0x89, 0x3e, 0x77, 0xbf, 0x18, 0x63, 0x27, 0xe4, 0x15, 0xca, 0x5c, 0xb8, + 0x6f, 0xc4, 0x83, 0xfd, 0xc5, 0xf3, 0x59, 0xdc, 0x5e, 0x78, 0x55, 0x88, 0xef, 0x90, 0x99, 0xb0, + 0x45, 0x70, 0x49, 0xeb, 0x43, 0x23, 0xf2, 0x17, 0x6d, 0x83, 0x58, 0x23, 0x5b, 0x1f, 0xde, 0x54, + 0x60, 0x36, 0xb6, 0xa6, 0xbd, 0x85, 0x2a, 0x5b, 0xa5, 0xc5, 0xec, 0xf6, 0xb1, 0xdd, 0x12, 0x1d, + 0xe0, 0xb1, 0x62, 0x0f, 0x27, 0x28, 0x26, 0x58, 0xad, 0x3c, 0xac, 0xef, 0x3c, 0x56, 0x2b, 0xb7, + 0x3e, 0x87, 0xd5, 0x7e, 0xb3, 0x92, 0xd7, 0x5d, 0xc6, 0x6a, 0x77, 0x61, 0x2a, 0x70, 0x71, 0x0b, + 0x58, 0xc6, 0xf5, 0xd2, 0x8d, 0xe2, 0xf8, 0xa2, 0x3b, 0xea, 0xa0, 0xc4, 0xc3, 0x11, 0x31, 0xf4, + 0x2b, 0x0a, 0x40, 0x34, 0x35, 0x62, 0x63, 0xad, 0x1f, 0xe3, 0x80, 0x48, 0xf2, 0xcd, 0x2c, 0xdd, + 0xd7, 0xd2, 0xba, 0x90, 0x08, 0xab, 0xbf, 0x5d, 0x01, 0x94, 0x6e, 0x3c, 0x15, 0x3c, 0xb7, 0x4d, + 0xdb, 0x48, 0x0a, 0xe0, 0x37, 0x4d, 0xdb, 0xc0, 0xac, 0x66, 0x04, 0xd1, 0xf4, 0x59, 0x38, 0xd5, + 0xb5, 0x9c, 0x0d, 0xcd, 0xb2, 0xf6, 0x84, 0xdf, 0x1c, 0xdb, 0xa5, 0xb5, 0xc6, 0x69, 0x7a, 0x3c, + 0x5d, 0x8f, 0x57, 0xe1, 0x24, 0x2c, 0xea, 0xc3, 0x9c, 0x4b, 0x55, 0x5e, 0xdd, 0xb4, 0x98, 0xaa, + 0xe2, 0x0c, 0xfc, 0x82, 0x36, 0x95, 0x33, 0x07, 0xfb, 0x8b, 0x73, 0x38, 0x81, 0x0b, 0xa7, 0xb0, + 0xa3, 0xc7, 0x61, 0xb2, 0xef, 0x9a, 0x3d, 0xcd, 0xdd, 0x63, 0xca, 0x50, 0xad, 0x51, 0xa7, 0xe7, + 0xdc, 0x1a, 0x2f, 0xc2, 0x41, 0x9d, 0xfa, 0x0d, 0x05, 0xc6, 0x5a, 0xb7, 0x3b, 0x48, 0x85, 0x09, + 0xc3, 0xe9, 0x69, 0xa6, 0x2d, 0x46, 0x89, 0x39, 0x9f, 0xb5, 0x58, 0x09, 0x16, 0x35, 0xe8, 0x75, + 0x98, 0x0a, 0xf8, 0x78, 0xb9, 0xfb, 0xc8, 0xd6, 0xed, 0x4e, 0xe8, 0xbc, 0x11, 0xae, 0xac, 0xa0, + 0xc4, 0xc3, 0x11, 0x15, 0x55, 0x83, 0xf9, 0xd6, 0xed, 0x4e, 0xdb, 0xd6, 0xad, 0x81, 0x41, 0x56, + 0x76, 0xd9, 0x1f, 0xda, 0x35, 0x93, 0x97, 0x08, 0x8f, 0x37, 0xd6, 0x35, 0x01, 0x84, 0x83, 0x3a, + 0x0a, 0x46, 0xf8, 0x17, 0xc2, 0x5b, 0x8b, 0x81, 0x09, 0x24, 0x38, 0xa8, 0x53, 0xff, 0xb4, 0x02, + 0x75, 0xa9, 0x41, 0xa8, 0x07, 0x93, 0xbc, 0xbf, 0x81, 0xd3, 0xc4, 0xb5, 0xa2, 0x7d, 0x8c, 0x37, + 0x9b, 0x93, 0xe7, 0x43, 0xea, 0xe1, 0x80, 0x86, 0x3c, 0x4f, 0x95, 0xfc, 0x79, 0x42, 0x4b, 0x00, + 0xdc, 0x27, 0x84, 0xdd, 0xf8, 0xf1, 0x03, 0x82, 0x6d, 0x85, 0x4e, 0x58, 0x8a, 0x25, 0x08, 0x74, + 0x41, 0xac, 0x68, 0xc9, 0x6d, 0x44, 0x5a, 0xcd, 0x5d, 0xa8, 0xde, 0x77, 0x6c, 0xe2, 0x09, 0xf3, + 0xfb, 0x71, 0xf5, 0x70, 0x8a, 0xb2, 0xac, 0x57, 0x28, 0x62, 0xcc, 0xf1, 0xab, 0xbf, 0xa9, 0x00, + 0xb4, 0x34, 0x5f, 0xe3, 0xb6, 0xe2, 0x11, 0x5c, 0xee, 0x2e, 0xc4, 0x76, 0x62, 0x2d, 0x75, 0xad, + 0x37, 0xee, 0x99, 0xf7, 0x83, 0xfe, 0x87, 0xc7, 0x3c, 0xc7, 0xde, 0x31, 0xef, 0x13, 0xcc, 0xea, + 0xd1, 0xfb, 0x61, 0x8a, 0xd8, 0xba, 0xbb, 0xd7, 0xf7, 0x85, 0xe7, 0x4c, 0x8d, 0x5f, 0xcb, 0xae, + 0x04, 0x85, 0x38, 0xaa, 0x57, 0x9f, 0x84, 0xb8, 0xb0, 0x76, 0x78, 0x2b, 0xd5, 0x1d, 0xa8, 0xad, + 0xd8, 0x46, 0xdf, 0x31, 0x6d, 0x7f, 0x84, 0x3e, 0x5d, 0x84, 0xb1, 0x81, 0x6b, 0x89, 0x2e, 0xd5, + 0x05, 0xc0, 0xd8, 0x3a, 0xbe, 0x85, 0x69, 0x39, 0x7a, 0x02, 0x26, 0xfb, 0x03, 0xb7, 0xef, 0x78, + 0x41, 0xbf, 0x42, 0xa9, 0x74, 0x8d, 0x17, 0xe3, 0xa0, 0x5e, 0x7d, 0xa0, 0xc0, 0xdc, 0xca, 0x6e, + 0xdf, 0x74, 0x99, 0xfb, 0x1f, 0x71, 0xa9, 0xc0, 0x45, 0xbf, 0xdf, 0xe1, 0xff, 0x8a, 0x36, 0x84, + 0xdf, 0x0b, 0x08, 0x1c, 0xd4, 0xa3, 0x4d, 0x98, 0x25, 0xec, 0x73, 0xc6, 0x54, 0xb5, 0xd0, 0xe4, + 0x7d, 0x14, 0x63, 0x0c, 0x77, 0x2f, 0x8d, 0x61, 0xc1, 0x09, 0xac, 0xa8, 0x03, 0xb3, 0xba, 0xa5, + 0x79, 0x9e, 0xb9, 0x69, 0xea, 0xd1, 0x2d, 0xf7, 0x54, 0xe3, 0xfd, 0xf4, 0xdb, 0x66, 0xac, 0xe6, + 0xc1, 0xfe, 0xe2, 0x59, 0xd1, 0xce, 0x78, 0x05, 0x4e, 0xa0, 0x50, 0xbf, 0x56, 0x81, 0x99, 0x95, + 0xdd, 0xbe, 0xe3, 0x0d, 0x5c, 0xc2, 0x40, 0x4f, 0x40, 0x56, 0x7c, 0x02, 0x26, 0xb7, 0x34, 0xdb, + 0xb0, 0x88, 0x2b, 0xa6, 0x2f, 0x1c, 0xdb, 0x1b, 0xbc, 0x18, 0x07, 0xf5, 0xe8, 0x73, 0x00, 0x9e, + 0xbe, 0x45, 0x8c, 0x81, 0x65, 0xda, 0x81, 0xe1, 0xe2, 0x56, 0xa1, 0x8d, 0x15, 0xeb, 0x64, 0x27, + 0xc4, 0x29, 0xf6, 0x7b, 0xf8, 0x1b, 0x4b, 0xf4, 0xd4, 0x3f, 0x55, 0x60, 0x3e, 0xf6, 0xdd, 0x09, + 0x48, 0x40, 0xdd, 0xb8, 0x04, 0xd4, 0x28, 0xdf, 0xd9, 0x1c, 0xc1, 0xe7, 0xcb, 0x15, 0x78, 0x24, + 0x67, 0x50, 0x52, 0xf7, 0x6f, 0xca, 0x49, 0xdd, 0xbf, 0xed, 0x40, 0xdd, 0x77, 0x2c, 0xe1, 0x8f, + 0x11, 0x8c, 0x41, 0xb1, 0xdb, 0xb5, 0xbb, 0x21, 0x9e, 0xe8, 0x76, 0x2d, 0x2a, 0xf3, 0xb0, 0x4c, + 0x48, 0xfd, 0x3d, 0x05, 0xa6, 0x42, 0x6d, 0x6b, 0x04, 0x57, 0x88, 0x13, 0xf4, 0x80, 0xbc, 0x02, + 0x35, 0xc3, 0xf4, 0x64, 0xe9, 0x88, 0xdd, 0xc0, 0xb7, 0x44, 0x19, 0x0e, 0x6b, 0xd5, 0x7f, 0x59, + 0x81, 0x73, 0x21, 0xee, 0x40, 0x50, 0xa3, 0xca, 0xe1, 0x28, 0xd2, 0xda, 0x05, 0xc1, 0x71, 0xa5, + 0x33, 0x42, 0xe2, 0xb6, 0x8f, 0x27, 0xd9, 0x69, 0x3d, 0x8b, 0x95, 0xa2, 0xdb, 0x50, 0xf5, 0x28, + 0x3d, 0x21, 0x86, 0x1d, 0x71, 0x34, 0xd8, 0x49, 0xc7, 0xda, 0x8b, 0x39, 0x1a, 0xf4, 0x86, 0x2c, + 0x7d, 0x73, 0x55, 0xe8, 0x93, 0x47, 0x5b, 0x0c, 0xec, 0xd1, 0xcd, 0x12, 0xed, 0x89, 0x11, 0x8c, + 0x48, 0x86, 0x93, 0x68, 0x96, 0x00, 0xae, 0xfe, 0x1b, 0x05, 0x4e, 0x85, 0x8d, 0x13, 0x26, 0x84, + 0xe3, 0x90, 0x7a, 0x47, 0x1c, 0xcb, 0xf5, 0xd0, 0xda, 0x56, 0x68, 0x30, 0xf3, 0x2c, 0x69, 0x1e, + 0xd4, 0xae, 0x8b, 0xc1, 0x42, 0xe7, 0xa1, 0x62, 0x06, 0x7d, 0x01, 0x01, 0x5f, 0x69, 0xb7, 0x70, + 0xc5, 0x34, 0xc2, 0x13, 0xb8, 0x92, 0x7b, 0x02, 0x4b, 0x47, 0xe4, 0xd8, 0xf0, 0x23, 0x52, 0xfd, + 0xfb, 0x0a, 0x9c, 0x09, 0xa8, 0x06, 0x63, 0xdd, 0x12, 0xe6, 0xeb, 0x43, 0xce, 0xf9, 0xc3, 0xc7, + 0xf3, 0x0e, 0x8c, 0x33, 0x5e, 0x5c, 0xc8, 0xac, 0x1d, 0x22, 0xa4, 0xcd, 0xc1, 0x0c, 0x91, 0xfa, + 0x5d, 0x05, 0xea, 0x37, 0xcc, 0x0d, 0xe2, 0xf2, 0x6b, 0x35, 0x26, 0xf3, 0xc6, 0x5e, 0xfb, 0xd4, + 0xb3, 0x5e, 0xfa, 0xa0, 0x3d, 0x98, 0x12, 0x67, 0x47, 0xe8, 0xd5, 0x55, 0xec, 0x4d, 0x8f, 0x44, + 0x5b, 0xf0, 0x64, 0xd9, 0x9f, 0x39, 0x20, 0x81, 0x23, 0x6a, 0xea, 0x1b, 0x70, 0x3a, 0xe3, 0x23, + 0xb4, 0xc8, 0xb6, 0xa3, 0xeb, 0x8b, 0xe1, 0x0d, 0xf6, 0x97, 0xeb, 0x63, 0x5e, 0x8e, 0x1e, 0x85, + 0x31, 0x62, 0x07, 0x9e, 0x85, 0x93, 0x54, 0x80, 0x5a, 0xb1, 0x0d, 0x4c, 0xcb, 0x28, 0xdb, 0xb1, + 0x9c, 0x98, 0x9c, 0xc1, 0xd8, 0xce, 0x2d, 0x51, 0x86, 0xc3, 0x5a, 0xf5, 0x9f, 0x8d, 0xc3, 0xc5, + 0x1b, 0x8e, 0x6b, 0xde, 0x77, 0x6c, 0x5f, 0xb3, 0xd6, 0x1c, 0x23, 0xf2, 0x4f, 0x10, 0x2c, 0xec, + 0x57, 0x14, 0x78, 0x44, 0xef, 0x0f, 0xda, 0xb6, 0xe9, 0x9b, 0x5a, 0x70, 0x6d, 0xbc, 0x46, 0x5c, + 0xd3, 0x29, 0xea, 0xa6, 0xc0, 0xde, 0x88, 0x34, 0xd7, 0xd6, 0xb3, 0x50, 0xe2, 0x3c, 0x5a, 0xcc, + 0x5b, 0xc2, 0x70, 0xee, 0xd9, 0xac, 0x71, 0x1d, 0x9f, 0xbd, 0x5b, 0xb9, 0x1f, 0x75, 0xb1, 0xa0, + 0xb7, 0x44, 0x2b, 0x13, 0x23, 0xce, 0xa1, 0x84, 0x3e, 0x0f, 0x67, 0x4d, 0xde, 0x38, 0x4c, 0x34, + 0xc3, 0xb4, 0x89, 0xe7, 0x31, 0x9f, 0x81, 0x32, 0xee, 0x00, 0xed, 0x2c, 0x84, 0x38, 0x9b, 0x0e, + 0xfa, 0x0c, 0x80, 0xb7, 0x67, 0xeb, 0x62, 0xfc, 0xab, 0x85, 0xa8, 0x72, 0xa9, 0x29, 0xc4, 0x82, + 0x25, 0x8c, 0x54, 0x4f, 0xe0, 0x47, 0xab, 0xad, 0xf3, 0xab, 0x40, 0x85, 0xeb, 0x09, 0x77, 0x83, + 0x42, 0x1c, 0xd5, 0xab, 0xff, 0x50, 0x81, 0x49, 0xf1, 0x20, 0x0c, 0xbd, 0x2f, 0xa1, 0x2e, 0x87, + 0x2c, 0x2c, 0xa1, 0x32, 0xdf, 0x67, 0x76, 0x5c, 0x61, 0x90, 0x10, 0x07, 0x6f, 0x31, 0x6d, 0x4b, + 0x50, 0x8e, 0xcc, 0x1b, 0x31, 0x7b, 0x6e, 0x60, 0xf2, 0x90, 0xa8, 0xa9, 0xdf, 0x52, 0x60, 0x3e, + 0xf5, 0xd5, 0x08, 0xc7, 0xc2, 0x09, 0xde, 0x46, 0xfe, 0xa4, 0x0e, 0xec, 0xf5, 0xdf, 0xf2, 0x5a, + 0xbb, 0x43, 0xdc, 0x9d, 0x70, 0x17, 0x7e, 0x45, 0x81, 0xb9, 0xe8, 0xde, 0x5c, 0xb4, 0x42, 0x29, + 0xe1, 0x30, 0x79, 0x33, 0x81, 0xac, 0xb1, 0x20, 0x3a, 0x3e, 0x97, 0xac, 0xc1, 0x29, 0xc2, 0xe8, + 0xcb, 0x0a, 0xcc, 0x69, 0xf1, 0xd7, 0x7f, 0x01, 0xd7, 0x2c, 0xe6, 0xda, 0x9e, 0x78, 0x4a, 0x18, + 0x35, 0x26, 0x51, 0xe1, 0xe1, 0x14, 0x5d, 0xf4, 0x61, 0x98, 0xd6, 0xfa, 0xe6, 0xf2, 0xc0, 0x30, + 0xa9, 0x5c, 0x10, 0x3c, 0x19, 0x63, 0xc2, 0xea, 0xf2, 0x5a, 0x3b, 0x2c, 0xc7, 0x31, 0xa8, 0xf0, + 0x7d, 0x9f, 0x18, 0xca, 0xf1, 0xb2, 0xef, 0xfb, 0xc4, 0x28, 0x46, 0xef, 0xfb, 0xc4, 0xe0, 0xc9, + 0x54, 0xd0, 0xa7, 0xe1, 0x51, 0x7e, 0xe0, 0x34, 0x34, 0xcf, 0xd4, 0x97, 0x07, 0xfe, 0x16, 0xb1, + 0xfd, 0x40, 0x21, 0xe4, 0x46, 0x29, 0xe6, 0x3b, 0xb5, 0x92, 0x07, 0x84, 0xf3, 0xbf, 0x47, 0x0e, + 0x80, 0x63, 0x1a, 0xba, 0xe8, 0x10, 0x77, 0xdf, 0x29, 0x26, 0x7d, 0xdf, 0x69, 0xb7, 0x9a, 0xa2, + 0x3f, 0x8c, 0x57, 0x44, 0xbf, 0xb1, 0x44, 0x02, 0xfd, 0x1d, 0x05, 0x66, 0xc4, 0x42, 0x17, 0x44, + 0x27, 0xd9, 0x12, 0xf8, 0x74, 0xe1, 0x05, 0x99, 0x58, 0xf5, 0x4b, 0x58, 0xc6, 0xce, 0xbd, 0xf5, + 0x43, 0x97, 0xce, 0x58, 0x1d, 0x8e, 0x37, 0x04, 0x7d, 0x55, 0x81, 0x33, 0x1e, 0x71, 0x77, 0x4c, + 0x9d, 0x2c, 0xeb, 0xba, 0x33, 0xb0, 0x83, 0x79, 0xae, 0x95, 0x78, 0x6a, 0xd5, 0xc9, 0x40, 0xc8, + 0x1d, 0x89, 0xb2, 0x6a, 0x70, 0x66, 0x03, 0xd0, 0x2f, 0x2b, 0x70, 0xea, 0x9e, 0xe6, 0xeb, 0x5b, + 0x4d, 0x4d, 0xdf, 0x62, 0x16, 0x1a, 0xee, 0x3b, 0x54, 0x74, 0xe7, 0xbc, 0x14, 0xc7, 0xc5, 0xad, + 0xaf, 0x89, 0x42, 0x9c, 0xa4, 0x88, 0x7c, 0xa8, 0xb9, 0xe4, 0xf5, 0x01, 0xf1, 0x7c, 0x6f, 0x01, + 0x18, 0xf5, 0x4f, 0x96, 0x9f, 0x34, 0x2c, 0x30, 0x72, 0x61, 0x23, 0xf8, 0x85, 0x43, 0x4a, 0xa8, + 0x0b, 0x17, 0xf9, 0xf2, 0x5d, 0xb6, 0x1d, 0x7b, 0xaf, 0xe7, 0x0c, 0xbc, 0xc4, 0x16, 0xa8, 0xb3, + 0x2d, 0xc0, 0x9c, 0xa8, 0x56, 0x86, 0x01, 0xe2, 0xe1, 0x78, 0xd0, 0xa7, 0xa0, 0x46, 0x76, 0x88, + 0xed, 0xdf, 0xbd, 0x7b, 0x6b, 0x61, 0xba, 0xd0, 0x19, 0xc9, 0xba, 0xb0, 0x22, 0x70, 0xe0, 0x10, + 0xdb, 0xf9, 0xe7, 0x01, 0xa5, 0x17, 0x25, 0x9a, 0x83, 0xb1, 0x6d, 0xc2, 0x1f, 0x09, 0x4f, 0x61, + 0xfa, 0x2f, 0x3a, 0x03, 0xd5, 0x1d, 0xcd, 0x1a, 0x70, 0xd1, 0xb7, 0x86, 0xf9, 0x8f, 0xa7, 0x2b, + 0x1f, 0x53, 0xd4, 0xef, 0x2b, 0x70, 0x36, 0x73, 0xd8, 0x10, 0x86, 0x73, 0xcc, 0xf7, 0xcc, 0x5e, + 0x1d, 0xf8, 0x9a, 0x6f, 0xda, 0xdd, 0xb6, 0xbd, 0x69, 0x99, 0xdd, 0x2d, 0x2e, 0x02, 0x56, 0xb9, + 0xc0, 0xb2, 0x9a, 0x09, 0x81, 0x73, 0xbe, 0x44, 0x6d, 0x38, 0xdd, 0xd3, 0x76, 0x53, 0x08, 0x2b, + 0x0c, 0x21, 0x7b, 0x6b, 0xbe, 0x9a, 0xae, 0xc6, 0x59, 0xdf, 0xa8, 0xdf, 0xa8, 0xc2, 0x63, 0xb4, + 0xe1, 0xd1, 0xd1, 0xb9, 0xaa, 0xd9, 0x5a, 0xf7, 0x6d, 0x7a, 0x44, 0x7d, 0x57, 0x81, 0x47, 0xb6, + 0xb2, 0x05, 0x5b, 0x71, 0x7a, 0xe3, 0x62, 0xf2, 0xfd, 0x30, 0x61, 0x99, 0x2f, 0xdd, 0xa1, 0x20, + 0x38, 0xaf, 0x55, 0xe8, 0x79, 0x98, 0xb3, 0x1d, 0x83, 0x34, 0xdb, 0x2d, 0xbc, 0xaa, 0x79, 0xdb, + 0x9d, 0xc0, 0xac, 0x5b, 0xe5, 0x37, 0x1c, 0xb7, 0x13, 0x75, 0x38, 0x05, 0x8d, 0x76, 0x00, 0xf5, + 0x1d, 0x63, 0x65, 0xc7, 0xd4, 0x03, 0x67, 0xb3, 0xe2, 0xb7, 0x2a, 0xec, 0x39, 0xdd, 0x5a, 0x0a, + 0x1b, 0xce, 0xa0, 0xc0, 0x44, 0x73, 0xda, 0x98, 0x55, 0xc7, 0x36, 0x7d, 0xc7, 0x65, 0xde, 0x8d, + 0xa5, 0x24, 0x54, 0xb6, 0xd2, 0x6f, 0x67, 0x62, 0xc4, 0x39, 0x94, 0xd4, 0xff, 0xa9, 0xc0, 0x29, + 0xba, 0x2e, 0xd6, 0x5c, 0x67, 0x77, 0xef, 0x6d, 0xb9, 0x24, 0x9f, 0x80, 0xf1, 0x9e, 0x63, 0x04, + 0xda, 0xf0, 0x59, 0x2a, 0x64, 0xae, 0x3a, 0x06, 0x79, 0xc0, 0xaf, 0x7a, 0x76, 0xf7, 0x98, 0xc3, + 0x2b, 0x03, 0x91, 0xb5, 0xd6, 0xb1, 0x7c, 0xad, 0x55, 0xfd, 0x33, 0x85, 0x4b, 0x8b, 0x81, 0xd2, + 0xf8, 0xf6, 0xdc, 0x8a, 0x1f, 0x85, 0x19, 0x5a, 0xb6, 0xaa, 0xed, 0xae, 0xb5, 0x5e, 0x74, 0xac, + 0xc0, 0x55, 0x93, 0x39, 0x85, 0xdc, 0x94, 0x2b, 0x70, 0x1c, 0x4e, 0xfd, 0xee, 0x29, 0x60, 0x00, + 0x16, 0xf1, 0xdf, 0x96, 0x1d, 0x7b, 0x12, 0xea, 0x7a, 0x7f, 0xd0, 0xbc, 0xd6, 0x79, 0x61, 0xe0, + 0xf8, 0x9a, 0xb8, 0xad, 0x62, 0x12, 0x60, 0x73, 0x6d, 0x3d, 0x28, 0xc6, 0x32, 0x0c, 0xdd, 0xe4, + 0x7a, 0x7f, 0x20, 0x18, 0xe7, 0x9a, 0xec, 0xdc, 0xc0, 0x36, 0x79, 0x73, 0x6d, 0x3d, 0x56, 0x87, + 0x53, 0xd0, 0xe8, 0x0b, 0x0a, 0x4c, 0x13, 0xb1, 0x01, 0x6f, 0x68, 0xae, 0x21, 0xf6, 0x77, 0xf1, + 0xf3, 0x3b, 0x1c, 0xdd, 0x60, 0x5b, 0x73, 0xd9, 0x79, 0x45, 0xa2, 0x81, 0x63, 0x14, 0x99, 0x18, + 0x2b, 0x7e, 0xd3, 0xc9, 0x72, 0x8c, 0xe4, 0x8e, 0xaf, 0x0a, 0x31, 0x36, 0x0f, 0x08, 0xe7, 0x7f, + 0x8f, 0xfe, 0x81, 0x02, 0xe7, 0xc2, 0x5a, 0xd3, 0x36, 0x7b, 0x83, 0x1e, 0x26, 0xba, 0xa5, 0x99, + 0x3d, 0x21, 0xd3, 0x7e, 0xea, 0xf8, 0x7a, 0x1a, 0xc7, 0xcf, 0xd9, 0x4e, 0x76, 0x1d, 0xce, 0x69, + 0x13, 0xfa, 0x96, 0x02, 0x97, 0x83, 0xaa, 0x35, 0xaa, 0x59, 0x0e, 0x5c, 0x12, 0x39, 0xfc, 0x8a, + 0x31, 0x99, 0x2c, 0xc4, 0x05, 0xdf, 0x7b, 0xb0, 0xbf, 0x78, 0x79, 0xe5, 0x10, 0xdc, 0xf8, 0x50, + 0xea, 0xb1, 0x15, 0xd3, 0x71, 0x36, 0x7d, 0x21, 0x04, 0x3f, 0xb4, 0x15, 0x43, 0x69, 0xe0, 0x18, + 0x45, 0xf4, 0xdb, 0x0a, 0x3c, 0x22, 0x17, 0xc8, 0x0b, 0x86, 0x4b, 0xbf, 0x2f, 0x1f, 0x5f, 0x6b, + 0x12, 0x04, 0xb8, 0xbd, 0x29, 0xa7, 0x12, 0xe7, 0x35, 0x8b, 0xb2, 0xe0, 0x1e, 0x5b, 0x9c, 0x5c, + 0x42, 0xae, 0x72, 0x16, 0xcc, 0xd7, 0xab, 0x87, 0x83, 0x3a, 0xaa, 0x7d, 0xf6, 0x1d, 0x63, 0xcd, + 0x34, 0xbc, 0x5b, 0x66, 0xcf, 0xf4, 0x99, 0x08, 0x3b, 0xc6, 0xc7, 0x63, 0xcd, 0x31, 0xd6, 0xda, + 0x2d, 0x5e, 0x8e, 0x63, 0x50, 0xec, 0xd5, 0x8d, 0xd9, 0xd3, 0xba, 0x64, 0x6d, 0x60, 0x59, 0x6b, + 0xae, 0xc3, 0x6c, 0x12, 0x2d, 0xa2, 0x19, 0x96, 0x69, 0x93, 0x82, 0x22, 0x2b, 0xdb, 0x72, 0xed, + 0x3c, 0xa4, 0x38, 0x9f, 0x1e, 0x5a, 0x02, 0xd8, 0xd4, 0x4c, 0xab, 0x73, 0x4f, 0xeb, 0xdf, 0xb1, + 0x17, 0x66, 0x18, 0x1b, 0x63, 0x8a, 0xdf, 0xb5, 0xb0, 0x14, 0x4b, 0x10, 0x6c, 0x41, 0x51, 0x66, + 0x88, 0x09, 0x7f, 0x85, 0xbb, 0x30, 0x7b, 0x5c, 0x0b, 0x2a, 0xc0, 0xc8, 0x07, 0xf0, 0xa6, 0x44, + 0x03, 0xc7, 0x28, 0xa2, 0x2f, 0x29, 0x30, 0xeb, 0xed, 0x79, 0x3e, 0xe9, 0x85, 0x8d, 0x38, 0x75, + 0xec, 0x8d, 0x60, 0x06, 0x9b, 0x4e, 0x8c, 0x0a, 0x4e, 0x50, 0x45, 0x1a, 0x3c, 0xc6, 0x06, 0xf6, + 0x7a, 0xf3, 0x86, 0xd9, 0xdd, 0x0a, 0x9f, 0xd3, 0xac, 0x11, 0x57, 0x27, 0xb6, 0xbf, 0x30, 0xc7, + 0x96, 0xce, 0xe2, 0xc1, 0xfe, 0xe2, 0x63, 0xed, 0x7c, 0x30, 0x3c, 0x0c, 0x07, 0xfa, 0x0c, 0x9c, + 0x17, 0xd5, 0xb7, 0x9c, 0x7b, 0x29, 0x0a, 0xf3, 0x8c, 0x02, 0x7b, 0xe3, 0xd4, 0xce, 0x85, 0xc2, + 0x43, 0x30, 0x50, 0x1d, 0xc1, 0x23, 0x2e, 0x33, 0xb8, 0x92, 0x70, 0xfd, 0x78, 0x0b, 0x88, 0xad, + 0x03, 0xa6, 0x23, 0x74, 0xd2, 0xd5, 0x38, 0xeb, 0x1b, 0x75, 0xbf, 0xc2, 0x95, 0x9b, 0xd4, 0x9e, + 0x44, 0xcf, 0xc2, 0xa9, 0x1e, 0xe9, 0x39, 0xee, 0xde, 0x72, 0x10, 0xac, 0x47, 0x18, 0xdc, 0x98, + 0xc2, 0xba, 0x1a, 0xaf, 0xc2, 0x49, 0x58, 0x7a, 0x6e, 0xb2, 0x1e, 0x5c, 0xeb, 0x44, 0xdf, 0x57, + 0xa2, 0x73, 0xb3, 0x9d, 0xa8, 0xc3, 0x29, 0x68, 0xd4, 0x84, 0x79, 0x51, 0xd6, 0xa6, 0x12, 0xa4, + 0x77, 0xcd, 0x25, 0xc1, 0x1d, 0x0e, 0x15, 0xc5, 0xe6, 0xdb, 0xc9, 0x4a, 0x9c, 0x86, 0xa7, 0xbd, + 0xa0, 0x3f, 0xe4, 0x56, 0x8c, 0x47, 0xbd, 0xb8, 0x1d, 0xaf, 0xc2, 0x49, 0xd8, 0x40, 0xc4, 0x8f, + 0x35, 0xa1, 0x1a, 0xf5, 0xe2, 0x76, 0xa2, 0x0e, 0xa7, 0xa0, 0xd5, 0x3f, 0x1b, 0x87, 0xf7, 0x8c, + 0x70, 0x94, 0xa1, 0x5e, 0xf6, 0x70, 0x1f, 0xc2, 0x55, 0x96, 0x82, 0x0b, 0xb4, 0xa5, 0x17, 0x06, + 0x9a, 0xed, 0x9b, 0xfe, 0xde, 0x88, 0xd3, 0xd3, 0xcf, 0x99, 0x9e, 0xa3, 0xd3, 0x1b, 0x75, 0x3a, + 0xbd, 0xbc, 0xe9, 0x3c, 0x3a, 0xc9, 0xd1, 0xa7, 0xbf, 0x97, 0x3d, 0xfd, 0x05, 0x47, 0xf5, 0xd0, + 0xe5, 0xd2, 0xcf, 0x59, 0x2e, 0x05, 0x47, 0x75, 0x84, 0xe5, 0xf5, 0xef, 0xc7, 0xe1, 0xbd, 0xa3, + 0x9c, 0xa9, 0x05, 0xd7, 0x57, 0xc6, 0xa9, 0xf5, 0x50, 0xd7, 0x57, 0x9e, 0xb7, 0xe0, 0x43, 0x5c, + 0x5f, 0x19, 0x24, 0x1f, 0xf6, 0xfa, 0xca, 0x1b, 0xd5, 0x87, 0xb5, 0xbe, 0xf2, 0x46, 0x75, 0x84, + 0xf5, 0xf5, 0x17, 0xc9, 0xf3, 0x21, 0x3c, 0x47, 0xdb, 0x30, 0xa6, 0xf7, 0x07, 0x05, 0x99, 0x14, + 0xbb, 0xfd, 0x6c, 0xae, 0xad, 0x63, 0x8a, 0x03, 0x61, 0x98, 0xe0, 0xeb, 0xa7, 0x20, 0x0b, 0x62, + 0x9e, 0x9e, 0x7c, 0x49, 0x62, 0x81, 0x89, 0x0e, 0x15, 0xe9, 0x6f, 0x91, 0x1e, 0x71, 0x35, 0xab, + 0xe3, 0x3b, 0xae, 0xd6, 0x2d, 0xca, 0x6d, 0xd8, 0x50, 0xad, 0x24, 0x70, 0xe1, 0x14, 0x76, 0x3a, + 0x20, 0x7d, 0xd3, 0x28, 0xc8, 0x5f, 0xd8, 0x80, 0xac, 0xb5, 0x5b, 0x98, 0xe2, 0x50, 0x7f, 0x58, + 0x03, 0xe9, 0x01, 0x26, 0x55, 0xdf, 0x34, 0xcb, 0x72, 0xee, 0xad, 0xb9, 0xe6, 0x8e, 0x69, 0x91, + 0x2e, 0x31, 0xc2, 0x17, 0x7a, 0x9e, 0xb8, 0x24, 0x67, 0xb2, 0xe4, 0x72, 0x1e, 0x10, 0xce, 0xff, + 0x9e, 0x4a, 0xb6, 0xf3, 0x7a, 0xf2, 0xa9, 0x7b, 0xa9, 0x7b, 0xbe, 0xd4, 0xc3, 0x79, 0xbe, 0xa1, + 0x52, 0xc5, 0x38, 0x4d, 0x17, 0xfd, 0x15, 0x85, 0xdb, 0x1e, 0x42, 0x63, 0xab, 0x98, 0xb4, 0x1b, + 0xc7, 0x75, 0x45, 0x11, 0x59, 0x31, 0x22, 0x7b, 0x6e, 0x9c, 0x22, 0xfa, 0x4d, 0x05, 0xce, 0x6e, + 0x67, 0xd9, 0x4d, 0xc5, 0xdc, 0xae, 0x15, 0x6e, 0x4b, 0x8e, 0x25, 0x96, 0x5f, 0x2b, 0x67, 0x02, + 0xe0, 0xec, 0x96, 0x84, 0xe3, 0x14, 0x1a, 0x92, 0x04, 0x1f, 0x28, 0x3e, 0x4e, 0x09, 0x93, 0x54, + 0x34, 0x4e, 0x61, 0x05, 0x8e, 0x53, 0x44, 0xaf, 0xc3, 0xd4, 0x76, 0x60, 0xbf, 0x13, 0xaa, 0x7e, + 0xab, 0x30, 0x79, 0xc9, 0x0a, 0xc8, 0x2f, 0xb0, 0xc3, 0x42, 0x1c, 0x51, 0x41, 0x26, 0x4c, 0x6e, + 0x73, 0x6e, 0x24, 0x54, 0xf4, 0x46, 0x79, 0xed, 0x81, 0xeb, 0x89, 0xa2, 0x08, 0x07, 0xf8, 0x65, + 0x87, 0x9b, 0xda, 0x21, 0x3e, 0xa9, 0x5f, 0x57, 0xe0, 0xec, 0x0e, 0x71, 0x7d, 0x53, 0x4f, 0x1a, + 0xae, 0xa7, 0x4a, 0xa8, 0x38, 0x2f, 0x66, 0x61, 0xe4, 0x4b, 0x25, 0xb3, 0x0a, 0x67, 0xb7, 0x41, + 0xfd, 0x2f, 0x0a, 0xa4, 0x6c, 0x63, 0xe8, 0x6f, 0x2a, 0x30, 0xbd, 0x49, 0x34, 0x7f, 0xe0, 0x92, + 0xeb, 0x9a, 0x1f, 0xbe, 0xb6, 0x78, 0xe9, 0x58, 0x6c, 0x72, 0x4b, 0xd7, 0x24, 0xcc, 0xfc, 0x16, + 0x30, 0x0c, 0xad, 0x22, 0x57, 0xe1, 0x58, 0x13, 0xce, 0x7f, 0x02, 0xe6, 0x53, 0x1f, 0x1e, 0xe9, + 0xa6, 0xe6, 0x77, 0x85, 0x75, 0x35, 0x19, 0x74, 0xf7, 0x55, 0xa8, 0x6a, 0x86, 0x11, 0x06, 0xf6, + 0x7b, 0xba, 0xe0, 0x8d, 0xb7, 0x21, 0x3f, 0x6b, 0x61, 0x3f, 0x31, 0xc7, 0x8b, 0xae, 0x01, 0xd2, + 0x62, 0x17, 0x5a, 0xab, 0x8e, 0x11, 0xa8, 0x4b, 0xcc, 0x2e, 0xbf, 0x9c, 0xaa, 0xc5, 0x19, 0x5f, + 0xa8, 0x1f, 0x87, 0xd9, 0xf8, 0x7b, 0xfc, 0x23, 0x78, 0x46, 0xab, 0xbf, 0xa6, 0x00, 0x4a, 0x07, + 0xf3, 0x41, 0x1e, 0xd4, 0x04, 0x44, 0x30, 0xc9, 0x2b, 0x45, 0xbd, 0x5c, 0x63, 0x4e, 0xdb, 0x91, + 0x5f, 0xad, 0x28, 0xf0, 0x70, 0x48, 0x48, 0xfd, 0x4b, 0x05, 0xa2, 0x00, 0x62, 0xe8, 0x23, 0x50, + 0x37, 0x88, 0xa7, 0xbb, 0x66, 0xdf, 0x8f, 0x3a, 0x12, 0xba, 0x89, 0xb6, 0xa2, 0x2a, 0x2c, 0xc3, + 0x21, 0x15, 0x26, 0x7c, 0xcd, 0xdb, 0x6e, 0xb7, 0x84, 0xe2, 0xc8, 0x8e, 0xf9, 0xbb, 0xac, 0x04, + 0x8b, 0x9a, 0xe8, 0x71, 0xfb, 0xd8, 0x08, 0x8f, 0xdb, 0xd1, 0xe6, 0x31, 0xbc, 0xe4, 0x47, 0x87, + 0xbf, 0xe2, 0x57, 0xff, 0x75, 0x05, 0xe2, 0x41, 0xdb, 0x8a, 0x0e, 0x41, 0x3a, 0xf4, 0x40, 0xe5, + 0xa1, 0x85, 0x1e, 0xf8, 0x00, 0x0b, 0x70, 0xca, 0xc3, 0x52, 0xf3, 0x6b, 0x2c, 0x39, 0x2a, 0x29, + 0x8f, 0x29, 0x1d, 0x42, 0xa0, 0xa7, 0x64, 0xe7, 0xd3, 0xa9, 0xc6, 0x7b, 0x82, 0x7d, 0xc1, 0x3c, + 0x4a, 0x1f, 0x88, 0xe0, 0x0a, 0x61, 0xff, 0x63, 0x7e, 0xa6, 0x1f, 0x11, 0x4e, 0x86, 0xd5, 0x58, + 0x00, 0x88, 0x20, 0x6a, 0xc4, 0x7c, 0xec, 0xc3, 0xc8, 0xf3, 0x50, 0xfd, 0x5b, 0x0a, 0x4c, 0x8a, + 0xc0, 0x4c, 0x23, 0xf8, 0x0c, 0x77, 0xa1, 0xca, 0xc4, 0xf5, 0x52, 0x92, 0x4c, 0x67, 0xcb, 0x71, + 0xfc, 0x58, 0x80, 0x2a, 0xe6, 0xd5, 0xc7, 0xfe, 0xc5, 0x1c, 0xbf, 0xfa, 0xf5, 0x71, 0xb8, 0x2c, + 0x40, 0x52, 0xc7, 0x74, 0xb8, 0x09, 0xf7, 0xe0, 0xb4, 0x98, 0xa6, 0x96, 0xab, 0x99, 0xe1, 0x4d, + 0x5f, 0x31, 0x0d, 0x4c, 0xdc, 0x02, 0xa7, 0xd0, 0xe1, 0x2c, 0x1a, 0x3c, 0x0c, 0x0b, 0x2b, 0xbe, + 0x41, 0x34, 0xcb, 0xdf, 0x0a, 0x68, 0x57, 0xca, 0x84, 0x61, 0x49, 0xe3, 0xc3, 0x99, 0x54, 0xd8, + 0x4d, 0xa3, 0xa8, 0x68, 0xba, 0x44, 0x93, 0xaf, 0x39, 0x4b, 0x38, 0x01, 0xae, 0x66, 0x62, 0xc4, + 0x39, 0x94, 0x98, 0x29, 0x4b, 0xdb, 0x65, 0x9a, 0x31, 0x26, 0xbe, 0x6b, 0x12, 0xee, 0xe5, 0x5b, + 0x15, 0xba, 0x6c, 0xbc, 0x0a, 0x27, 0x61, 0xd1, 0xd3, 0x30, 0xcb, 0x6e, 0x6e, 0xa3, 0xd7, 0xcc, + 0xd5, 0x28, 0x4a, 0xf9, 0xed, 0x58, 0x0d, 0x4e, 0x40, 0xaa, 0xdf, 0x51, 0x60, 0x5a, 0x5e, 0x40, + 0x23, 0xf8, 0xe0, 0xee, 0x48, 0x0c, 0xbb, 0x8c, 0x63, 0xab, 0x4c, 0x76, 0x44, 0x9e, 0x7d, 0x3a, + 0xe3, 0x1b, 0x76, 0x85, 0x47, 0x12, 0xcc, 0xbf, 0xd4, 0x15, 0x5e, 0xea, 0x24, 0x09, 0xaf, 0xf0, + 0x92, 0x35, 0x38, 0x45, 0x18, 0xbd, 0x04, 0x63, 0xba, 0x6b, 0x8a, 0x81, 0xf9, 0x58, 0x31, 0xfd, + 0x04, 0xb7, 0xa3, 0x37, 0x4c, 0x4d, 0xdc, 0xc6, 0x14, 0xa3, 0xfa, 0x3b, 0x63, 0x50, 0x97, 0xe2, + 0xbe, 0xa1, 0xd5, 0x32, 0xfa, 0x6d, 0x84, 0x3e, 0xd0, 0x71, 0x57, 0x61, 0xac, 0xdb, 0x1f, 0x14, + 0x54, 0x70, 0x43, 0x74, 0xd7, 0x29, 0xba, 0x6e, 0x7f, 0x80, 0x5e, 0x0c, 0x55, 0xe6, 0x62, 0x4a, + 0x6d, 0xe8, 0xed, 0x99, 0x50, 0x9b, 0x83, 0xe5, 0x39, 0x9e, 0xbb, 0x3c, 0x6d, 0x98, 0xf4, 0x84, + 0x3e, 0x5d, 0x2d, 0x11, 0x76, 0x50, 0x1a, 0x6a, 0xa1, 0x40, 0x73, 0x39, 0x3c, 0xd0, 0xaf, 0x03, + 0x22, 0x54, 0x0a, 0x18, 0xb0, 0x27, 0x17, 0x4c, 0xc5, 0xa8, 0x71, 0x29, 0x60, 0x9d, 0x95, 0x60, + 0x51, 0xa3, 0xfe, 0x6a, 0x05, 0x50, 0x1a, 0x21, 0x7a, 0x0f, 0x54, 0xd9, 0x03, 0x2c, 0xb1, 0xd9, + 0xa4, 0x50, 0x4a, 0x9a, 0xe7, 0x61, 0x5e, 0x87, 0x3a, 0xe2, 0x41, 0x5e, 0xb1, 0x99, 0x61, 0x97, + 0xc7, 0x82, 0x9e, 0xf4, 0x7a, 0x2f, 0x38, 0x9f, 0xc6, 0x72, 0xcf, 0xa7, 0x75, 0x98, 0xec, 0x99, + 0x36, 0xf3, 0x19, 0x29, 0x66, 0x31, 0xe0, 0xb7, 0x5b, 0x1c, 0x05, 0x0e, 0x70, 0xa9, 0x3f, 0xa9, + 0xd0, 0x55, 0x6c, 0xda, 0x3e, 0xb1, 0x35, 0x5b, 0x27, 0xe8, 0x3e, 0x80, 0x36, 0xf0, 0x1d, 0x7e, + 0xcc, 0x8b, 0xc5, 0xfc, 0xc9, 0x82, 0x13, 0x16, 0x62, 0x5d, 0x0e, 0x31, 0xf2, 0x5b, 0xa7, 0xe8, + 0x37, 0x96, 0xa8, 0x51, 0xda, 0xbe, 0xd9, 0x23, 0x2f, 0x99, 0xb6, 0xe1, 0xdc, 0x13, 0xe3, 0x5b, + 0x9a, 0xf6, 0xdd, 0x10, 0x23, 0xa7, 0x1d, 0xfd, 0xc6, 0x12, 0x35, 0xf4, 0x29, 0x58, 0x60, 0xe9, + 0x13, 0x6c, 0x16, 0x58, 0x53, 0x34, 0xce, 0xb1, 0xac, 0xe0, 0xe0, 0xa9, 0xb1, 0x30, 0x66, 0x0b, + 0xcd, 0x1c, 0x18, 0x9c, 0xfb, 0xb5, 0xfa, 0x5d, 0x05, 0xce, 0x66, 0x8e, 0x05, 0xba, 0x0e, 0xf3, + 0x91, 0xc7, 0x81, 0xcc, 0x28, 0x6b, 0x51, 0xa4, 0xd8, 0x9b, 0x49, 0x00, 0x9c, 0xfe, 0x06, 0xad, + 0x86, 0xd2, 0x82, 0xcc, 0x88, 0x85, 0xbb, 0xc2, 0x63, 0x02, 0x55, 0x16, 0xaf, 0xc6, 0x59, 0xdf, + 0xa9, 0x9f, 0x8e, 0x35, 0x38, 0x1a, 0x30, 0xba, 0x3f, 0x36, 0x48, 0x37, 0xf4, 0x00, 0x0f, 0xf7, + 0x47, 0x83, 0x16, 0x62, 0x5e, 0x87, 0x2e, 0xca, 0xaf, 0x16, 0x42, 0x46, 0x14, 0xbc, 0x5c, 0x50, + 0x07, 0x00, 0xc2, 0xb7, 0xc7, 0xb4, 0xbb, 0xa8, 0x0b, 0x35, 0x4d, 0x24, 0xf7, 0x10, 0x8b, 0xed, + 0xd9, 0x62, 0xca, 0x96, 0x40, 0xc2, 0xdd, 0xfa, 0x82, 0x5f, 0x38, 0x44, 0xae, 0xfe, 0x3d, 0x05, + 0xce, 0x65, 0xbf, 0x33, 0x1a, 0xe1, 0x84, 0xed, 0x41, 0xdd, 0x8d, 0x3e, 0x13, 0x2b, 0xf3, 0x17, + 0xe4, 0xb8, 0x28, 0x52, 0xb2, 0x1f, 0x2a, 0x7d, 0x34, 0x5d, 0xc7, 0x0b, 0x66, 0x27, 0x19, 0x2a, + 0x25, 0x14, 0xe2, 0xa5, 0x96, 0x60, 0x19, 0xbf, 0xfa, 0x66, 0x05, 0xe0, 0x36, 0xf1, 0xef, 0x39, + 0xee, 0x36, 0x1d, 0xa3, 0xb7, 0xd5, 0x7b, 0xb7, 0x0b, 0x30, 0xde, 0x77, 0x0c, 0x4f, 0x30, 0x2a, + 0xf6, 0x10, 0x8d, 0x5d, 0x97, 0xb3, 0x52, 0xb4, 0x08, 0x55, 0x66, 0x0a, 0x16, 0xc7, 0x01, 0x13, + 0x7e, 0xa9, 0xc0, 0xe3, 0x61, 0x5e, 0xce, 0x63, 0x38, 0x33, 0xa7, 0x59, 0x4f, 0x88, 0xf3, 0x22, + 0x86, 0x33, 0x2f, 0xc3, 0x61, 0xad, 0xfa, 0xc5, 0x71, 0x88, 0xa5, 0xa7, 0x89, 0x94, 0xf2, 0xf1, + 0x87, 0xa4, 0x94, 0x7f, 0x0a, 0x16, 0x2c, 0x47, 0x33, 0x1a, 0x9a, 0x45, 0x97, 0xbd, 0xdb, 0xe1, + 0xf3, 0xa1, 0xd9, 0x5d, 0x12, 0xa4, 0x99, 0x61, 0x2c, 0xe0, 0x56, 0x0e, 0x0c, 0xce, 0xfd, 0x1a, + 0x0d, 0xa4, 0xac, 0x38, 0x54, 0x0c, 0x59, 0x2d, 0x9d, 0xbe, 0x67, 0x49, 0xf6, 0x98, 0x0e, 0xcf, + 0xe6, 0x78, 0xe6, 0x1c, 0xf4, 0x25, 0x05, 0xce, 0x92, 0x5d, 0x9f, 0xb8, 0xb6, 0x66, 0xdd, 0x75, + 0xb5, 0xcd, 0x4d, 0x53, 0x8f, 0x39, 0x24, 0xad, 0x1d, 0xec, 0x2f, 0x9e, 0x5d, 0xc9, 0x02, 0x78, + 0xb0, 0xbf, 0xf8, 0xa1, 0x74, 0x7e, 0xaa, 0xc0, 0x3f, 0x3a, 0xf3, 0x13, 0xb6, 0x1c, 0xb3, 0xc9, + 0x9d, 0x7f, 0x0a, 0xea, 0x47, 0x70, 0xa6, 0x9d, 0x92, 0x4d, 0x34, 0xdf, 0x9c, 0x00, 0xc9, 0x3b, + 0xfd, 0x08, 0x01, 0x8f, 0x7f, 0x4b, 0x81, 0x33, 0xba, 0x65, 0x12, 0xdb, 0x4f, 0xb8, 0x20, 0xf3, + 0xad, 0xf1, 0x62, 0x31, 0xbf, 0xf9, 0x3e, 0xb1, 0xdb, 0xad, 0xa6, 0x63, 0xdb, 0x44, 0xf7, 0x9b, + 0x19, 0xd8, 0xb9, 0xbe, 0x93, 0x55, 0x83, 0x33, 0x5b, 0xc3, 0x3a, 0xc4, 0xca, 0xdb, 0x2d, 0xf9, + 0x21, 0x57, 0x53, 0x94, 0xe1, 0xb0, 0x16, 0x3d, 0x09, 0xf5, 0xae, 0xeb, 0x0c, 0xfa, 0x5e, 0x93, + 0xb9, 0x4a, 0xf1, 0x1d, 0xc6, 0xc4, 0x89, 0xeb, 0x51, 0x31, 0x96, 0x61, 0xd0, 0x87, 0x61, 0x9a, + 0xff, 0x5c, 0x73, 0xc9, 0xa6, 0xb9, 0x2b, 0x76, 0x1c, 0xf3, 0xbc, 0xb8, 0x2e, 0x95, 0xe3, 0x18, + 0x14, 0x7a, 0x3f, 0x4c, 0x99, 0x9e, 0x37, 0x20, 0xee, 0x3a, 0xbe, 0x25, 0x82, 0x05, 0x32, 0x03, + 0x6b, 0x3b, 0x28, 0xc4, 0x51, 0x3d, 0xfa, 0x75, 0x05, 0x66, 0x5d, 0xf2, 0xfa, 0xc0, 0x74, 0x89, + 0xc1, 0x88, 0x7a, 0xe2, 0x8d, 0x40, 0xa7, 0xe4, 0xc3, 0x84, 0x25, 0x1c, 0xc3, 0xca, 0x57, 0x7a, + 0x68, 0x9a, 0x88, 0x57, 0xe2, 0x44, 0x13, 0xe8, 0x58, 0x79, 0x66, 0xd7, 0x36, 0xed, 0xee, 0xb2, + 0xd5, 0xf5, 0x16, 0x6a, 0x6c, 0xf7, 0x72, 0xd1, 0x2b, 0x2a, 0xc6, 0x32, 0x0c, 0xfa, 0x28, 0xcc, + 0x0c, 0x3c, 0xba, 0x76, 0x7b, 0x84, 0x0f, 0xf0, 0x54, 0xe4, 0xc3, 0xb8, 0x2e, 0x57, 0xe0, 0x38, + 0x1c, 0xd5, 0xf6, 0x82, 0x02, 0x31, 0xcc, 0xc0, 0x43, 0x35, 0xd0, 0x76, 0xae, 0xc7, 0x6a, 0x70, + 0x02, 0xf2, 0xfc, 0x32, 0x9c, 0xce, 0xe8, 0xe6, 0x91, 0x36, 0xc8, 0x77, 0x2a, 0xf0, 0xee, 0x43, + 0x97, 0x25, 0xfa, 0xa6, 0x02, 0x75, 0xb2, 0xeb, 0xbb, 0x5a, 0xe8, 0x51, 0x49, 0xe7, 0xa8, 0xfb, + 0x70, 0x36, 0xc1, 0xd2, 0x4a, 0x44, 0x89, 0xcf, 0x5b, 0x78, 0xe6, 0x49, 0x35, 0x58, 0x6e, 0x10, + 0x95, 0xda, 0x79, 0x28, 0x0f, 0xd9, 0x76, 0x27, 0xf2, 0x79, 0x88, 0x9a, 0xf3, 0xcf, 0xc1, 0x5c, + 0x12, 0xf3, 0x91, 0x86, 0xea, 0x9f, 0x54, 0xa0, 0xba, 0x66, 0x69, 0x27, 0x12, 0xf9, 0xf1, 0xb3, + 0xb1, 0x88, 0x5b, 0xc5, 0xe2, 0x98, 0xb1, 0xb6, 0xe6, 0xc6, 0xfb, 0xdb, 0x4a, 0xc4, 0xfb, 0x7b, + 0xbe, 0x04, 0x8d, 0xe1, 0xe1, 0xfd, 0x7e, 0xa8, 0xc0, 0x14, 0x83, 0x3b, 0x81, 0x00, 0x0b, 0xaf, + 0xc6, 0x03, 0x2c, 0x3c, 0x5d, 0xbc, 0x53, 0x39, 0x81, 0x15, 0xfe, 0x24, 0xe8, 0x0c, 0x0b, 0x20, + 0xf5, 0xb2, 0x9c, 0xc0, 0x88, 0xf7, 0xe6, 0x4a, 0x56, 0xbc, 0xbb, 0x5b, 0x8e, 0xae, 0x59, 0xa9, + 0xa0, 0x77, 0x43, 0xb3, 0x18, 0xd9, 0x30, 0x45, 0x44, 0xc0, 0x94, 0xa0, 0x37, 0xc5, 0x64, 0xdb, + 0x20, 0xec, 0x4a, 0x44, 0x2f, 0x28, 0xf1, 0x70, 0x44, 0x42, 0xfd, 0xdd, 0x0a, 0xd4, 0xa5, 0xd9, + 0x7c, 0x4b, 0xe2, 0xe9, 0x5d, 0xcb, 0x4c, 0xf7, 0x51, 0x61, 0x1e, 0x93, 0xe7, 0x8e, 0x90, 0xea, + 0xc3, 0x83, 0xba, 0x1e, 0x85, 0x48, 0x2e, 0xb5, 0xc0, 0xa5, 0x50, 0xcb, 0xc2, 0x73, 0x3b, 0x2a, + 0xc0, 0x32, 0x15, 0xf5, 0x9f, 0x57, 0x60, 0x72, 0xcd, 0x75, 0xe8, 0x1c, 0x9f, 0x00, 0x83, 0xd8, + 0x88, 0x31, 0x88, 0x82, 0x9b, 0x97, 0xb7, 0x36, 0x97, 0x45, 0xbc, 0x96, 0x60, 0x11, 0x8d, 0x52, + 0x54, 0x86, 0x33, 0x89, 0x1f, 0x29, 0x50, 0x17, 0x90, 0x27, 0xc0, 0x26, 0xb4, 0x38, 0x9b, 0x78, + 0xa6, 0x4c, 0xc7, 0x72, 0x18, 0xc5, 0xd7, 0x14, 0x98, 0x11, 0x10, 0xab, 0xa4, 0xb7, 0x41, 0x5c, + 0x74, 0x0d, 0x26, 0xbd, 0x01, 0x9b, 0x4b, 0xd1, 0xa3, 0xc7, 0x64, 0x56, 0xe1, 0x6e, 0x68, 0x3a, + 0x4b, 0x5b, 0xc5, 0x41, 0xa4, 0x40, 0x9b, 0xbc, 0x00, 0x07, 0x1f, 0x53, 0x85, 0xce, 0x75, 0xac, + 0x54, 0xd0, 0x04, 0xec, 0x58, 0x04, 0xb3, 0x1a, 0xaa, 0x47, 0xd1, 0xbf, 0xc1, 0x2d, 0x15, 0xd3, + 0xa3, 0x68, 0xb5, 0x87, 0x79, 0xb9, 0xfa, 0xab, 0xe3, 0xe1, 0x68, 0x33, 0x3e, 0x76, 0x03, 0xa6, + 0x74, 0x97, 0x68, 0x3e, 0x31, 0x1a, 0x7b, 0xa3, 0x34, 0x8e, 0x09, 0x74, 0xcd, 0xe0, 0x0b, 0x1c, + 0x7d, 0x4c, 0x45, 0x27, 0xf9, 0xe2, 0xa9, 0x12, 0x89, 0x99, 0xb9, 0x97, 0x4e, 0xcf, 0x40, 0xd5, + 0xb9, 0x67, 0x87, 0xae, 0x17, 0x43, 0x09, 0xb3, 0xae, 0xdc, 0xa1, 0xd0, 0x98, 0x7f, 0x24, 0x07, + 0xdc, 0x18, 0x1f, 0x12, 0x70, 0xa3, 0x07, 0x93, 0x3d, 0x36, 0x0d, 0xe5, 0xa2, 0x2e, 0xc6, 0x66, + 0x54, 0x0e, 0x82, 0xcd, 0x50, 0xe3, 0x80, 0x06, 0x15, 0x82, 0xa9, 0x9c, 0xe6, 0xf5, 0x35, 0x9d, + 0xc8, 0x42, 0xf0, 0xed, 0xa0, 0x10, 0x47, 0xf5, 0xe8, 0x7e, 0x3c, 0x2e, 0xce, 0x64, 0x09, 0x33, + 0xa7, 0x68, 0x9f, 0x14, 0x0a, 0x87, 0x0f, 0x7e, 0x6e, 0x6c, 0x9c, 0xaf, 0x8c, 0x87, 0xcb, 0x54, + 0x30, 0xfe, 0xec, 0x9c, 0x4b, 0x4a, 0xa1, 0x9c, 0x4b, 0x1f, 0x82, 0x6a, 0x7f, 0x4b, 0xf3, 0x82, + 0xb5, 0x1a, 0x44, 0x6c, 0xaf, 0xae, 0xd1, 0xc2, 0x07, 0xfb, 0x8b, 0xd3, 0x82, 0x34, 0xfb, 0x8d, + 0x39, 0x2c, 0x1a, 0xc0, 0x69, 0xcf, 0xd7, 0x2c, 0xd2, 0x31, 0x85, 0xf9, 0xc8, 0xf3, 0xb5, 0x5e, + 0xbf, 0x40, 0xe0, 0x75, 0xee, 0x9a, 0x9c, 0x46, 0x85, 0xb3, 0xf0, 0xa3, 0x2f, 0x2a, 0xb0, 0xc0, + 0xca, 0x97, 0x07, 0xbe, 0xc3, 0xd3, 0x4d, 0x44, 0xc4, 0x8f, 0x7e, 0x6f, 0xcb, 0x94, 0xfd, 0x4e, + 0x0e, 0x3e, 0x9c, 0x4b, 0x09, 0xbd, 0x01, 0x67, 0x2d, 0xcd, 0xf3, 0x97, 0x75, 0xdf, 0xdc, 0x31, + 0xfd, 0xbd, 0xa8, 0x09, 0xd5, 0x23, 0x37, 0x81, 0xf9, 0x6e, 0xdc, 0xca, 0x42, 0x86, 0xb3, 0x69, + 0xa8, 0xff, 0x4b, 0x01, 0x94, 0x5e, 0x42, 0xa8, 0x07, 0x35, 0x83, 0x6c, 0x6a, 0x03, 0xcb, 0x0f, + 0x24, 0x81, 0xd2, 0x51, 0x9b, 0x42, 0xee, 0xdc, 0x12, 0x88, 0x71, 0x48, 0x02, 0xf5, 0x61, 0xea, + 0xde, 0x96, 0xe9, 0x13, 0xcb, 0xf4, 0xfc, 0xe3, 0x8a, 0x12, 0x15, 0x0a, 0x3f, 0x2f, 0x05, 0x98, + 0x71, 0x44, 0x44, 0xfd, 0xab, 0x63, 0x50, 0x3b, 0x42, 0x62, 0xcf, 0x01, 0x20, 0x11, 0x35, 0x82, + 0x4a, 0x4c, 0xa4, 0x8c, 0xd1, 0x8c, 0x89, 0x35, 0xcd, 0x14, 0x32, 0x9c, 0x41, 0x00, 0xbd, 0x01, + 0x67, 0x4c, 0x7b, 0xd3, 0xd5, 0x3c, 0xdf, 0x1d, 0xe8, 0xfe, 0xc0, 0x25, 0x65, 0x42, 0xbe, 0x33, + 0x4b, 0x43, 0x3b, 0x03, 0x1d, 0xce, 0x24, 0x82, 0x36, 0x61, 0xf2, 0x9e, 0xe3, 0x6e, 0x53, 0x06, + 0x3a, 0x5e, 0x22, 0x3b, 0xd0, 0x4b, 0x0c, 0x47, 0xc4, 0x39, 0xf9, 0x6f, 0x0f, 0x07, 0xc8, 0xd5, + 0x3f, 0x54, 0xa0, 0xca, 0x9f, 0xc2, 0xbd, 0x33, 0xb4, 0x2c, 0xd6, 0xd6, 0xdc, 0x30, 0xc6, 0x54, + 0xf7, 0x61, 0x10, 0xef, 0x14, 0xdd, 0x87, 0x35, 0x36, 0x47, 0xa4, 0xf9, 0xc3, 0x31, 0xd1, 0x19, + 0x26, 0x33, 0xb4, 0xe1, 0xb4, 0x10, 0x7f, 0x6f, 0x99, 0x9b, 0x84, 0x2e, 0xb0, 0x96, 0xb6, 0xe7, + 0x89, 0xa7, 0xe8, 0x8c, 0xf5, 0x36, 0xd3, 0xd5, 0x38, 0xeb, 0x1b, 0xf4, 0x2f, 0x14, 0x7a, 0x3a, + 0xfb, 0xae, 0xa9, 0x97, 0x8b, 0x0d, 0x1c, 0x36, 0x6e, 0x69, 0x95, 0x63, 0xe3, 0xe6, 0x83, 0xf5, + 0xe8, 0x98, 0x66, 0xa5, 0x0f, 0xf6, 0x17, 0x17, 0x33, 0xcc, 0x93, 0x81, 0x41, 0x9d, 0x0e, 0xed, + 0x9b, 0x3f, 0x19, 0x0a, 0xc2, 0x8c, 0xfb, 0x41, 0x93, 0xd1, 0x0d, 0xa8, 0x7a, 0xba, 0xd3, 0x27, + 0x47, 0x89, 0x78, 0x1e, 0x8e, 0x70, 0x87, 0x7e, 0x89, 0x39, 0x82, 0xf3, 0xaf, 0xc1, 0xb4, 0xdc, + 0xf2, 0x0c, 0xf3, 0x44, 0x4b, 0x36, 0x4f, 0x1c, 0xf9, 0x16, 0x4f, 0x36, 0x67, 0xfc, 0x5e, 0x05, + 0x44, 0x6e, 0xbf, 0x11, 0xae, 0x30, 0x5e, 0x0b, 0xc2, 0x9f, 0x96, 0x49, 0x68, 0x98, 0xcc, 0x27, + 0x1e, 0x0d, 0x82, 0x1c, 0x01, 0x15, 0x39, 0x30, 0x61, 0x69, 0x1b, 0xc4, 0x0a, 0xf2, 0xbc, 0x5d, + 0x2f, 0x91, 0x86, 0x8c, 0xc7, 0xe8, 0xf6, 0x12, 0x86, 0x6e, 0x5e, 0x88, 0x05, 0x99, 0xf3, 0x4f, + 0x41, 0x5d, 0x02, 0x3b, 0x92, 0x4d, 0xe8, 0x47, 0x0a, 0x4c, 0xc7, 0x62, 0x9e, 0xf5, 0x60, 0xcc, + 0x0d, 0x6d, 0x01, 0x45, 0xef, 0x78, 0x02, 0xef, 0xa6, 0xc7, 0x86, 0x00, 0x61, 0x4a, 0x27, 0x0c, + 0x8f, 0x56, 0x39, 0xae, 0xf0, 0x68, 0x5f, 0x55, 0xe0, 0x5c, 0xd0, 0xa1, 0x78, 0x94, 0x10, 0x74, + 0x05, 0x6a, 0x5a, 0xdf, 0x64, 0x96, 0x5f, 0xd9, 0x78, 0xbe, 0xbc, 0xd6, 0x66, 0x65, 0x38, 0xac, + 0x45, 0x1f, 0x80, 0x5a, 0xb0, 0xf4, 0x84, 0xe4, 0x17, 0xf2, 0xad, 0xf0, 0xd6, 0x2a, 0x84, 0x40, + 0x8f, 0x4b, 0x21, 0x6a, 0xab, 0xd1, 0x41, 0x1d, 0x12, 0xe6, 0x77, 0xdc, 0xea, 0x97, 0xc7, 0x60, + 0x86, 0x5b, 0x4a, 0x1a, 0xa6, 0x6d, 0x98, 0x76, 0xf7, 0x04, 0x0e, 0x88, 0x58, 0x82, 0xea, 0xca, + 0x71, 0x25, 0xa8, 0xbe, 0x09, 0x13, 0xaf, 0x53, 0x4e, 0x15, 0x2c, 0xf0, 0x91, 0x18, 0x46, 0xb8, + 0x78, 0x19, 0x93, 0xf3, 0xb0, 0x40, 0x81, 0x7c, 0x29, 0x4f, 0x78, 0x99, 0x97, 0xde, 0xb1, 0xa1, + 0x0d, 0x63, 0x4d, 0x4f, 0x67, 0x27, 0x09, 0x67, 0xc1, 0x53, 0x63, 0x5f, 0xbc, 0x53, 0x82, 0xa7, + 0xc6, 0x1a, 0x9d, 0x73, 0xce, 0x3d, 0x05, 0x67, 0x33, 0x47, 0xe3, 0x70, 0xc9, 0x50, 0xfd, 0x5e, + 0x05, 0x58, 0xfe, 0xde, 0x13, 0x58, 0x9b, 0xaf, 0xc6, 0x84, 0x97, 0x67, 0x8b, 0x87, 0x6f, 0xcd, + 0x33, 0xff, 0x74, 0x13, 0xe6, 0x9f, 0x4f, 0x14, 0x27, 0x31, 0xdc, 0xf6, 0xf3, 0x1b, 0x15, 0x00, + 0x0a, 0xc6, 0x33, 0x1d, 0x0b, 0xc7, 0xd0, 0x28, 0xf3, 0xfd, 0xd4, 0xdb, 0x25, 0x5d, 0xbd, 0x1a, + 0xa6, 0xc8, 0x1d, 0x8b, 0x2e, 0x19, 0xe2, 0xe9, 0x71, 0xe3, 0x1c, 0x63, 0xfc, 0x98, 0x38, 0x86, + 0xfa, 0x3d, 0x05, 0x58, 0xc2, 0x95, 0xd6, 0xed, 0x0e, 0xfa, 0x28, 0xcc, 0x98, 0xfc, 0x16, 0xb7, + 0x25, 0xc7, 0xd3, 0x63, 0x37, 0x4d, 0x6d, 0xb9, 0x02, 0xc7, 0xe1, 0x90, 0x2d, 0x8d, 0x6b, 0x99, + 0x34, 0xe3, 0xa2, 0x21, 0x87, 0xf2, 0x88, 0x9f, 0x56, 0xe0, 0x54, 0x02, 0x76, 0x04, 0xdd, 0xea, + 0xe1, 0xb0, 0x5c, 0x29, 0x44, 0xfd, 0xd8, 0x09, 0x84, 0xa8, 0x0f, 0xa3, 0xc5, 0x8f, 0x3f, 0xe4, + 0x68, 0xf1, 0x3f, 0x50, 0x80, 0x65, 0xb0, 0x3e, 0x01, 0xf6, 0xfb, 0x99, 0x38, 0xfb, 0x7d, 0xaa, + 0xf0, 0xda, 0xc9, 0xe1, 0xba, 0x7f, 0xa9, 0x00, 0x0b, 0x1e, 0x2d, 0x5c, 0x57, 0x24, 0x6f, 0x10, + 0x25, 0xc7, 0x1b, 0xe4, 0xb2, 0x70, 0x26, 0x49, 0x18, 0x42, 0x25, 0x87, 0x92, 0x0f, 0x48, 0xfe, + 0x22, 0x63, 0x71, 0x56, 0x92, 0xf6, 0x19, 0x41, 0x6f, 0xc0, 0x8c, 0xb7, 0xe5, 0x38, 0x7e, 0x60, + 0x92, 0x10, 0xb3, 0xd7, 0x28, 0xee, 0xcb, 0x1d, 0xf4, 0x85, 0xef, 0xce, 0x8e, 0x8c, 0x1c, 0xc7, + 0x69, 0xa9, 0xbf, 0x2f, 0xba, 0x7f, 0x84, 0xad, 0x72, 0x82, 0xac, 0xef, 0x7d, 0x09, 0xd6, 0x97, + 0x97, 0x1d, 0xfc, 0x77, 0x44, 0x2f, 0xc2, 0x98, 0xdf, 0x7d, 0x98, 0xb1, 0xe4, 0x34, 0x39, 0x62, + 0x61, 0x16, 0xca, 0xb0, 0x13, 0x86, 0xf6, 0x8b, 0x15, 0xe3, 0x38, 0x01, 0xca, 0x1f, 0x83, 0xc6, + 0xf3, 0x2c, 0xbe, 0x3c, 0x95, 0x05, 0x9b, 0x81, 0x35, 0xb9, 0x02, 0xc7, 0xe1, 0xd4, 0x6f, 0x55, + 0xe0, 0x22, 0x6f, 0x3b, 0xf3, 0xa2, 0x6f, 0x91, 0x3e, 0xb1, 0x0d, 0x62, 0xeb, 0x7b, 0x4c, 0x0e, + 0x36, 0x9c, 0x2e, 0xfa, 0xa2, 0x02, 0xb5, 0xe0, 0xc6, 0x4c, 0x74, 0xe4, 0x95, 0x12, 0x61, 0xd3, + 0x73, 0xc8, 0x84, 0x17, 0x76, 0x3c, 0xc6, 0x9c, 0xf8, 0x85, 0x43, 0xca, 0x68, 0x17, 0xaa, 0x7d, + 0xd7, 0xd9, 0x08, 0x74, 0xc0, 0x97, 0x8e, 0xbf, 0x09, 0x6b, 0x14, 0x3d, 0xdf, 0x71, 0xec, 0x5f, + 0xcc, 0x09, 0xaa, 0x18, 0x1e, 0x1f, 0xa9, 0xe9, 0xe8, 0x89, 0x64, 0x54, 0xe5, 0xd0, 0xe0, 0x93, + 0x8a, 0x51, 0x75, 0x07, 0xd4, 0xc3, 0xdb, 0x72, 0x14, 0x84, 0x2f, 0xc0, 0x7b, 0x25, 0x84, 0x2b, + 0xbb, 0x3a, 0xf1, 0xbc, 0xa6, 0xd6, 0xd7, 0x74, 0xaa, 0x00, 0xb3, 0xe7, 0xc4, 0xdc, 0x38, 0x7d, + 0x04, 0x94, 0x5f, 0xa8, 0xc0, 0xa2, 0x84, 0x33, 0xe6, 0xc3, 0x15, 0x70, 0x8f, 0x6f, 0x28, 0x50, + 0xd7, 0x6c, 0xdb, 0xf1, 0x35, 0xf9, 0xca, 0x94, 0x94, 0x9d, 0x9c, 0x2c, 0x5a, 0x4b, 0xcb, 0x11, + 0x9d, 0x84, 0x87, 0x84, 0x54, 0x83, 0xe5, 0xe6, 0x9c, 0x7f, 0x0e, 0xe6, 0x92, 0x5f, 0x1d, 0x49, + 0xd3, 0x6d, 0xc2, 0x39, 0xa9, 0x55, 0xec, 0x0a, 0xa6, 0xb9, 0x45, 0xf4, 0x6d, 0xef, 0x28, 0xe3, + 0xd8, 0xa0, 0x92, 0x75, 0x88, 0x44, 0xca, 0x49, 0xf0, 0x04, 0x4c, 0xee, 0x98, 0x9e, 0x19, 0x84, + 0x09, 0x90, 0x70, 0xbc, 0xc8, 0x8b, 0x71, 0x50, 0xaf, 0x3e, 0x0f, 0xa7, 0x65, 0x1c, 0x8c, 0x89, + 0xde, 0xee, 0x1c, 0xa5, 0x15, 0xab, 0x70, 0x59, 0xc2, 0x90, 0xf9, 0xb8, 0xf1, 0x28, 0xe8, 0xbe, + 0x5d, 0x0b, 0x78, 0x9e, 0x78, 0x7d, 0xf3, 0x7d, 0x05, 0x1e, 0x25, 0x79, 0xcb, 0x4e, 0xf0, 0x8d, + 0x97, 0xcb, 0xae, 0x8b, 0xdc, 0x75, 0x2d, 0x42, 0x6b, 0xe5, 0x55, 0xe3, 0xfc, 0xa6, 0xa1, 0xfb, + 0xb1, 0x84, 0x1c, 0x95, 0x52, 0xda, 0x64, 0xc6, 0x2c, 0x0f, 0x4b, 0xc7, 0x81, 0x5c, 0xa8, 0x79, + 0x62, 0x2e, 0x4b, 0xbd, 0xc1, 0xce, 0x58, 0x1b, 0xc2, 0x49, 0x54, 0xfc, 0xc2, 0x21, 0x1d, 0xf4, + 0x6d, 0x05, 0xce, 0x58, 0x19, 0xfb, 0x4b, 0x1c, 0xfc, 0x77, 0x1f, 0xc6, 0xde, 0xe5, 0x86, 0xf7, + 0xac, 0x1a, 0x9c, 0xd9, 0x16, 0xf4, 0x77, 0x73, 0x5f, 0xfb, 0x56, 0x4b, 0x64, 0x0d, 0x3b, 0x6c, + 0x03, 0x1c, 0xfd, 0xe1, 0x2f, 0xfa, 0x25, 0xa8, 0x3b, 0x11, 0x5b, 0x10, 0x2f, 0xb4, 0x6f, 0x96, + 0x6d, 0x9d, 0xc4, 0x69, 0xf8, 0x55, 0xa6, 0x54, 0x80, 0x65, 0x82, 0xe8, 0x6b, 0x0a, 0x20, 0x23, + 0x75, 0x7c, 0x88, 0xeb, 0x54, 0x7c, 0xfc, 0x87, 0x24, 0xbf, 0xbb, 0x49, 0x97, 0xe3, 0x8c, 0x56, + 0xa8, 0xff, 0x6a, 0x92, 0x0b, 0xea, 0xcc, 0x74, 0xae, 0xc3, 0xc4, 0x06, 0xd3, 0x75, 0x05, 0x33, + 0x28, 0xae, 0x59, 0x73, 0x95, 0x99, 0x6b, 0xa2, 0xfc, 0x7f, 0x2c, 0x50, 0xa3, 0x25, 0x80, 0x0d, + 0xcb, 0xd1, 0xb7, 0x9b, 0xed, 0x16, 0x0e, 0x84, 0x20, 0xb6, 0x01, 0x1b, 0x61, 0x29, 0x96, 0x20, + 0xd0, 0xa7, 0x61, 0xcc, 0x08, 0xd5, 0xa3, 0x67, 0xca, 0x68, 0x86, 0x91, 0xdb, 0x3e, 0xdd, 0x6e, + 0x14, 0x2b, 0x72, 0xa0, 0x66, 0x0b, 0x59, 0x58, 0x6c, 0xae, 0xe2, 0xf9, 0x66, 0x42, 0xa1, 0x3a, + 0x94, 0xe5, 0x83, 0x12, 0x1c, 0x12, 0xa1, 0x04, 0x43, 0x65, 0xb7, 0x5a, 0x92, 0x60, 0xa8, 0xe9, + 0x0e, 0xb3, 0x43, 0xac, 0xc9, 0x7a, 0xeb, 0xc4, 0xe8, 0x7a, 0xeb, 0x4c, 0xae, 0xce, 0xba, 0x09, + 0x13, 0xbe, 0xc6, 0xdc, 0xbf, 0x26, 0x4b, 0x78, 0x5f, 0xd1, 0x0e, 0xdc, 0xa5, 0x68, 0x22, 0x99, + 0x9d, 0xfd, 0xf4, 0xb0, 0xc0, 0x4e, 0x57, 0xe3, 0x0e, 0x4b, 0x07, 0x26, 0xe2, 0xfe, 0x15, 0x5f, + 0x8d, 0x3c, 0xab, 0x18, 0x5f, 0x8d, 0xfc, 0x7f, 0x2c, 0x50, 0xa3, 0x6d, 0xaa, 0x89, 0xf1, 0xf3, + 0x51, 0x44, 0x29, 0x58, 0x2e, 0xbb, 0x23, 0xbd, 0xc0, 0xf9, 0x9f, 0xff, 0xc2, 0x21, 0x01, 0xa4, + 0xc3, 0xa4, 0x30, 0x7d, 0x88, 0xe0, 0xd5, 0xcf, 0x94, 0x49, 0x20, 0x10, 0x24, 0xcb, 0xe3, 0x4f, + 0x92, 0x03, 0xcc, 0xea, 0x7f, 0x1a, 0xe7, 0x56, 0xab, 0xb7, 0xd0, 0x5f, 0xae, 0x0b, 0xb5, 0x00, + 0x59, 0x29, 0x33, 0x60, 0x90, 0xbd, 0x85, 0x0f, 0x68, 0x98, 0xcb, 0x25, 0x44, 0x8e, 0x9a, 0x59, + 0x4f, 0x8d, 0xa4, 0xd8, 0x68, 0x23, 0x3d, 0x33, 0xca, 0x76, 0x2c, 0x19, 0x2f, 0xe4, 0x58, 0xf2, + 0x2c, 0x9c, 0x0a, 0x7c, 0xef, 0x0c, 0xc2, 0xae, 0xb6, 0x84, 0x77, 0x3a, 0x7b, 0x62, 0xdb, 0x8c, + 0x57, 0xe1, 0x24, 0x2c, 0xfa, 0x8e, 0x02, 0xef, 0xe5, 0x9e, 0xf1, 0x4d, 0x7a, 0x94, 0xb1, 0x84, + 0x69, 0x24, 0xca, 0xd0, 0x16, 0x39, 0x5d, 0x4c, 0x1c, 0xd9, 0xe9, 0xe2, 0xca, 0xc1, 0xfe, 0xe2, + 0x7b, 0x9b, 0x23, 0xe0, 0xc6, 0x23, 0xb5, 0x40, 0xbd, 0x09, 0x53, 0xe1, 0x16, 0x46, 0x17, 0x25, + 0x81, 0x3d, 0xe2, 0xb2, 0x37, 0xc9, 0x1e, 0x97, 0xde, 0x17, 0x63, 0xd2, 0x3b, 0xd7, 0xdf, 0x5e, + 0xa4, 0x05, 0x42, 0x90, 0x57, 0xff, 0xab, 0xc2, 0xd7, 0xac, 0x48, 0x2e, 0xa8, 0x41, 0xbd, 0xc7, + 0xc3, 0xc2, 0xb1, 0x87, 0x81, 0x4a, 0xf1, 0x27, 0x89, 0xab, 0x11, 0x1a, 0x2c, 0xe3, 0x44, 0xbb, + 0xe9, 0x0c, 0x98, 0xd7, 0x4b, 0xf2, 0x97, 0x91, 0x13, 0x61, 0xa2, 0xf4, 0x37, 0x72, 0xea, 0x40, + 0x65, 0x78, 0xea, 0xc0, 0xc3, 0x93, 0x24, 0xa9, 0xff, 0xbb, 0x02, 0x99, 0xa1, 0xfd, 0x91, 0x0a, + 0x13, 0xfc, 0x8d, 0x83, 0x9c, 0x1b, 0x94, 0x3f, 0x80, 0xc0, 0xa2, 0x06, 0xb9, 0x70, 0x46, 0x3c, + 0x20, 0xb8, 0x49, 0xf6, 0xa2, 0x9c, 0x94, 0x62, 0x23, 0x8f, 0xee, 0x46, 0xcc, 0xe2, 0x45, 0x75, + 0x12, 0x98, 0x70, 0x26, 0x6e, 0x74, 0x87, 0xbf, 0xe8, 0xb1, 0x8d, 0xbb, 0xce, 0x36, 0xb1, 0xa3, + 0xe5, 0x26, 0xde, 0x28, 0x3e, 0x1a, 0xbc, 0xe8, 0x49, 0x01, 0xe0, 0xec, 0xef, 0xd0, 0x0e, 0xa0, + 0x9e, 0xb6, 0x9b, 0xc4, 0x56, 0x22, 0xa2, 0xf8, 0x6a, 0x0a, 0x1b, 0xce, 0xa0, 0xc0, 0x7c, 0xf1, + 0x99, 0x40, 0xff, 0x0e, 0xf1, 0x12, 0x61, 0x6d, 0x7d, 0xc8, 0xbe, 0xf8, 0x9c, 0xc6, 0xf0, 0xab, + 0x96, 0x97, 0xe1, 0x1c, 0x03, 0x5b, 0x36, 0x98, 0x0c, 0xef, 0x11, 0x63, 0xd9, 0x30, 0xd8, 0xfb, + 0xb8, 0xb2, 0x49, 0x39, 0xd5, 0x3f, 0x57, 0xe0, 0x0c, 0xc3, 0x9d, 0x4c, 0xab, 0xf6, 0xf0, 0x67, + 0x88, 0xea, 0x8e, 0x8c, 0x16, 0x29, 0x97, 0x65, 0x26, 0xd1, 0x72, 0xc9, 0x58, 0x2c, 0xb0, 0xe3, + 0x90, 0x8e, 0xfa, 0x33, 0x05, 0x16, 0xb2, 0xba, 0x7b, 0x02, 0x96, 0x78, 0x3b, 0x6e, 0x89, 0x6f, + 0x17, 0x5f, 0x2d, 0xc9, 0x0e, 0x67, 0x5b, 0xe6, 0x7f, 0xa8, 0xc0, 0x14, 0x03, 0x7f, 0xa7, 0x38, + 0x31, 0xb1, 0xc6, 0xe6, 0x74, 0xe6, 0x0f, 0x14, 0x98, 0x4f, 0xc5, 0x59, 0x19, 0x61, 0xf5, 0x9f, + 0xa0, 0xb1, 0xfd, 0xf1, 0x64, 0xee, 0xbd, 0x7a, 0x66, 0x00, 0xa6, 0x97, 0x60, 0x26, 0x76, 0xc9, + 0x10, 0x3e, 0xae, 0x55, 0x32, 0x1f, 0xd7, 0xca, 0x6f, 0x67, 0x2b, 0x43, 0xdf, 0xce, 0xfe, 0xe3, + 0x19, 0x31, 0xdf, 0x4c, 0x59, 0x7d, 0x15, 0x26, 0xd8, 0x03, 0xd7, 0x20, 0xb9, 0xf3, 0xc7, 0x8b, + 0xbf, 0x9c, 0xf5, 0xf8, 0x41, 0xc8, 0xff, 0xc7, 0x02, 0x2d, 0x6a, 0xc1, 0x9c, 0x6e, 0x39, 0x03, + 0xaa, 0x66, 0x6d, 0x9a, 0x16, 0xb9, 0x1d, 0x9d, 0xb9, 0x61, 0xa0, 0x8e, 0x66, 0xa2, 0x1e, 0xa7, + 0xbe, 0x40, 0x1d, 0x59, 0x7d, 0xfd, 0x58, 0xd1, 0x0b, 0x37, 0x1e, 0x18, 0x31, 0x54, 0x5b, 0x5d, + 0x00, 0x12, 0x4c, 0x5d, 0xe0, 0xf7, 0xf8, 0x5c, 0x39, 0xd6, 0x12, 0xb1, 0xb2, 0xb0, 0xc8, 0xc3, + 0x12, 0x15, 0xe4, 0x41, 0x7d, 0x2b, 0x4a, 0xf7, 0x27, 0x94, 0xd7, 0xe7, 0xcb, 0xe6, 0x1a, 0xe4, + 0x62, 0x9a, 0x54, 0x80, 0x65, 0x2a, 0xc8, 0x03, 0x88, 0x04, 0xf6, 0x52, 0xb9, 0xa1, 0x22, 0x55, + 0x20, 0xea, 0x69, 0x54, 0x86, 0x25, 0x32, 0x94, 0xa8, 0x1d, 0xbe, 0x53, 0x17, 0x76, 0x9a, 0x62, + 0x44, 0xa3, 0xe7, 0xee, 0x11, 0xd1, 0xa8, 0x0c, 0x4b, 0x64, 0xe8, 0xf0, 0xf6, 0xa2, 0xe8, 0x04, + 0x42, 0xe5, 0x7d, 0xbe, 0x6c, 0x98, 0x08, 0x21, 0x05, 0x47, 0x05, 0x58, 0xa6, 0x82, 0x1c, 0x80, + 0x5e, 0x18, 0xb5, 0x40, 0xe8, 0xbf, 0xc5, 0x7a, 0x1a, 0x05, 0x3f, 0xe0, 0xc6, 0x9c, 0xe8, 0x37, + 0x96, 0x48, 0x50, 0x75, 0x3b, 0x34, 0x7f, 0x40, 0x09, 0xcd, 0x70, 0x24, 0xd3, 0xc7, 0x47, 0x22, + 0x99, 0xba, 0xce, 0xf6, 0xed, 0x63, 0x92, 0x3c, 0xfd, 0x60, 0x7f, 0x71, 0x9a, 0x31, 0x93, 0x94, + 0x7c, 0x1d, 0xdd, 0x29, 0x4e, 0x0f, 0xbb, 0x53, 0x44, 0xd7, 0x61, 0xde, 0x93, 0xdd, 0x71, 0x18, + 0x83, 0x98, 0x61, 0x9f, 0x84, 0x71, 0x2e, 0x3a, 0x49, 0x00, 0x9c, 0xfe, 0x86, 0x73, 0x40, 0x62, + 0xb0, 0xef, 0x67, 0x65, 0x0e, 0xc8, 0xcb, 0x70, 0x58, 0x9b, 0x4a, 0x91, 0x7c, 0xea, 0xa4, 0x52, + 0x24, 0x7f, 0x4e, 0xce, 0x89, 0x3b, 0x57, 0xc2, 0x15, 0xb6, 0x48, 0x52, 0xdc, 0x64, 0x82, 0xe6, + 0xf9, 0x13, 0x4a, 0xd0, 0x8c, 0x9a, 0x30, 0x4f, 0xe4, 0x64, 0xd5, 0x6c, 0x86, 0x50, 0x64, 0x5e, + 0x58, 0x49, 0x56, 0xe2, 0x34, 0xbc, 0xfa, 0x6f, 0xa9, 0x6e, 0x1b, 0x88, 0xc0, 0xe4, 0x04, 0xa4, + 0x4e, 0x12, 0xd3, 0x0b, 0x9a, 0xe5, 0x64, 0x76, 0x92, 0xeb, 0x42, 0xfe, 0xc7, 0x0a, 0xcc, 0x46, + 0x60, 0x27, 0x20, 0x82, 0x19, 0x71, 0x11, 0xec, 0x13, 0x25, 0x3b, 0x96, 0x23, 0x87, 0xfd, 0xdf, + 0x8a, 0xdc, 0x2d, 0x26, 0x69, 0xdc, 0x93, 0xcc, 0x59, 0x4a, 0x09, 0xd1, 0x36, 0x2b, 0x19, 0x71, + 0xd4, 0xe3, 0x0c, 0xf3, 0xd6, 0xe7, 0x63, 0xc7, 0x7c, 0x19, 0x0f, 0xf4, 0xec, 0x0c, 0xdd, 0x87, + 0x9e, 0xf9, 0xae, 0xbc, 0xed, 0xb9, 0x53, 0xe8, 0x72, 0x41, 0xaf, 0x67, 0xa9, 0xcb, 0xc3, 0x33, + 0x60, 0xff, 0x23, 0x80, 0xba, 0xa4, 0x32, 0xbe, 0x25, 0x06, 0xcc, 0x01, 0xd4, 0x75, 0xc7, 0xf6, + 0x7c, 0x57, 0x93, 0x9e, 0x39, 0x97, 0x25, 0x1a, 0xf2, 0x9b, 0x66, 0x84, 0x1a, 0xcb, 0x74, 0xe8, + 0xe9, 0x18, 0x2e, 0xb4, 0xb1, 0xe3, 0xb0, 0x9b, 0x0e, 0x5b, 0x5c, 0x1f, 0x06, 0x08, 0x24, 0x2d, + 0xc2, 0xc3, 0x75, 0xd7, 0xa2, 0xf0, 0xb4, 0x6d, 0xef, 0x46, 0x58, 0x87, 0x25, 0x38, 0xf4, 0x06, + 0xcc, 0x58, 0x72, 0x60, 0x4a, 0x21, 0x07, 0x16, 0xf3, 0x45, 0x8a, 0x85, 0xb8, 0xe4, 0x9e, 0x30, + 0xb1, 0x22, 0x1c, 0xa7, 0x85, 0xb6, 0x61, 0xca, 0x0a, 0xa2, 0xa9, 0x0a, 0x61, 0xf0, 0xb9, 0xc2, + 0x84, 0x19, 0x16, 0x7e, 0xcd, 0x11, 0xfe, 0xc4, 0x11, 0x7e, 0xba, 0xee, 0xc2, 0x1f, 0xe5, 0xae, + 0x3a, 0x22, 0x6a, 0xe1, 0xba, 0x0b, 0x8b, 0x3c, 0x2c, 0x51, 0xc9, 0x31, 0x45, 0xd7, 0x0a, 0x99, + 0xa2, 0x07, 0x70, 0xda, 0x25, 0xbe, 0xbb, 0xd7, 0xdc, 0xd3, 0x59, 0x36, 0x68, 0xd7, 0x67, 0x81, + 0x53, 0xa7, 0x8a, 0x3d, 0x57, 0xc4, 0x69, 0x54, 0x38, 0x0b, 0x3f, 0x55, 0xf6, 0xa8, 0xe4, 0x20, + 0xa2, 0x85, 0x30, 0x65, 0x8f, 0xca, 0x15, 0x98, 0x95, 0xa2, 0x8f, 0x40, 0xdd, 0x27, 0xfa, 0x96, + 0x6d, 0xea, 0x9a, 0xd5, 0x6e, 0x09, 0xb1, 0x2c, 0x3a, 0x88, 0xa3, 0x2a, 0x2c, 0xc3, 0xa1, 0x06, + 0x8c, 0x0d, 0x4c, 0x43, 0xc8, 0x63, 0x3f, 0x1f, 0x9a, 0x78, 0xda, 0xad, 0x07, 0xfb, 0x8b, 0xef, + 0x8e, 0xde, 0xc3, 0x84, 0x3d, 0xb9, 0xda, 0xdf, 0xee, 0x5e, 0xf5, 0xf7, 0xfa, 0xc4, 0x5b, 0x5a, + 0x6f, 0xb7, 0x30, 0xfd, 0x38, 0xcb, 0x34, 0x3f, 0x73, 0x04, 0xd3, 0xfc, 0xd7, 0x14, 0x38, 0xad, + 0x25, 0xad, 0x53, 0xc4, 0x5b, 0x98, 0x2d, 0xc1, 0x95, 0xb3, 0x4d, 0x5e, 0x51, 0x68, 0xb3, 0xe5, + 0x34, 0x3d, 0x9c, 0xd5, 0x08, 0xf5, 0x16, 0x40, 0x24, 0xc4, 0x94, 0xb6, 0xc6, 0xff, 0xe7, 0x2a, + 0x9c, 0x2d, 0xeb, 0x7d, 0xc2, 0x22, 0x9e, 0xb2, 0x14, 0x55, 0xcb, 0x9b, 0x3e, 0x71, 0xef, 0xdc, + 0x59, 0x0d, 0xd3, 0xf7, 0x14, 0x0c, 0xb9, 0x1a, 0x25, 0x39, 0x4b, 0x61, 0xc4, 0x39, 0x94, 0x98, + 0x00, 0x27, 0x12, 0x81, 0x60, 0x7a, 0xde, 0x0d, 0x5c, 0xcf, 0x17, 0xef, 0x39, 0xb8, 0x00, 0x97, + 0xac, 0xc4, 0x69, 0xf8, 0x24, 0x12, 0x9e, 0x2e, 0x6b, 0x9c, 0xa5, 0x18, 0x4f, 0x21, 0xe1, 0x39, + 0xb3, 0xd2, 0xf0, 0x32, 0x92, 0x30, 0x25, 0x39, 0xe3, 0x9d, 0x09, 0x24, 0x51, 0xbe, 0xf2, 0x34, + 0x3c, 0x32, 0xe0, 0x82, 0x4b, 0x74, 0xa7, 0xd7, 0x23, 0xb6, 0xc1, 0xa3, 0x65, 0x6b, 0x6e, 0xd7, + 0xb4, 0xaf, 0xb9, 0x1a, 0x03, 0x14, 0x79, 0xcf, 0x2f, 0x1f, 0xec, 0x2f, 0x5e, 0xc0, 0x43, 0xe0, + 0xf0, 0x50, 0x2c, 0xa8, 0x07, 0xa7, 0x06, 0x2c, 0x92, 0x9f, 0xdb, 0xb6, 0x7d, 0xe2, 0xee, 0x68, + 0x56, 0xc1, 0x3c, 0x70, 0x6c, 0x63, 0xad, 0xc7, 0x51, 0xe1, 0x24, 0x6e, 0xb4, 0x47, 0xf9, 0x94, + 0x68, 0x8e, 0x44, 0xb2, 0x56, 0x3c, 0x26, 0x30, 0x4e, 0xa3, 0xc3, 0x59, 0x34, 0xd4, 0xbf, 0xad, + 0x80, 0xb8, 0x0f, 0xa6, 0x6c, 0x4b, 0x32, 0xb4, 0xd5, 0x12, 0x46, 0xb6, 0x0b, 0xc2, 0xe7, 0xb5, + 0x12, 0xd5, 0x4a, 0xfe, 0xae, 0xef, 0x93, 0x1e, 0x0a, 0x4d, 0x45, 0x3c, 0x9e, 0x63, 0x96, 0xa2, + 0x61, 0xfe, 0x7f, 0x30, 0xd9, 0x77, 0xcd, 0x9e, 0xe6, 0xee, 0x89, 0xe3, 0x76, 0x86, 0x47, 0x3d, + 0xd1, 0xdd, 0xbd, 0x3e, 0x3d, 0x67, 0x83, 0x5a, 0xf5, 0x47, 0x0a, 0x88, 0xaf, 0x59, 0x08, 0xd6, + 0x91, 0xe2, 0x77, 0x1e, 0x7a, 0x2b, 0x24, 0x45, 0x10, 0x1d, 0xcb, 0x8b, 0x20, 0xfa, 0xb0, 0xc2, + 0x71, 0x7e, 0x5f, 0x81, 0x64, 0x6e, 0x67, 0xf4, 0x38, 0x4c, 0x8a, 0x97, 0xd5, 0xe2, 0x6d, 0x26, + 0x77, 0x59, 0xe7, 0x45, 0x38, 0xa8, 0x8b, 0x6b, 0x9e, 0x65, 0x44, 0xe0, 0xec, 0xd7, 0x63, 0x87, + 0x08, 0xa3, 0xfb, 0xb3, 0x30, 0xc1, 0x9f, 0x02, 0xa3, 0x5f, 0xce, 0xf4, 0xa3, 0xbc, 0x55, 0xe2, + 0xb5, 0x71, 0x01, 0x77, 0xc9, 0x58, 0xa4, 0xb8, 0xca, 0xd0, 0x48, 0x71, 0x1d, 0x1e, 0x21, 0xb8, + 0x8c, 0xe1, 0xb1, 0x89, 0xdb, 0x22, 0x45, 0x8d, 0x88, 0x0e, 0x8c, 0x06, 0x31, 0x7b, 0xdc, 0x78, + 0x89, 0xe8, 0xc7, 0x7c, 0x08, 0x24, 0xab, 0xdc, 0xec, 0x10, 0x8b, 0x5c, 0xf4, 0xf4, 0xb2, 0x5a, + 0xe2, 0xaa, 0x56, 0x8c, 0xfa, 0x08, 0x4f, 0x2f, 0xc3, 0xdd, 0x34, 0x91, 0xbb, 0x9b, 0xba, 0x30, + 0x29, 0xf6, 0x83, 0xe0, 0x8e, 0xcf, 0x94, 0x89, 0xff, 0x2b, 0x85, 0xec, 0xe0, 0x05, 0x38, 0xc0, + 0x4e, 0xcf, 0xdc, 0x9e, 0xb6, 0x6b, 0xf6, 0x06, 0x3d, 0xc6, 0x13, 0xab, 0x32, 0x28, 0x2b, 0xc6, + 0x41, 0x3d, 0x03, 0xe5, 0x77, 0xdc, 0x4c, 0xcc, 0x93, 0x41, 0x45, 0x96, 0xb5, 0xa0, 0x1e, 0xbd, + 0x02, 0xb5, 0x9e, 0xb6, 0xdb, 0x19, 0xb8, 0x5d, 0x22, 0x0c, 0x71, 0xf9, 0x66, 0x88, 0x81, 0x6f, + 0x5a, 0x4b, 0x54, 0x41, 0xf1, 0xdd, 0xa5, 0xb6, 0xed, 0xdf, 0x71, 0x3b, 0xbe, 0x1b, 0x06, 0x25, + 0x5d, 0x15, 0x58, 0x70, 0x88, 0x0f, 0x59, 0x30, 0xdb, 0xd3, 0x76, 0xd7, 0x6d, 0x2d, 0x4c, 0x06, + 0x55, 0x2f, 0x48, 0x81, 0xdd, 0x4a, 0xac, 0xc6, 0x70, 0xe1, 0x04, 0xee, 0x8c, 0x0b, 0x90, 0xe9, + 0x87, 0x75, 0x01, 0xb2, 0x1c, 0x7a, 0x3e, 0xcd, 0xb0, 0x65, 0xf8, 0x68, 0xd6, 0x65, 0xf8, 0x70, + 0xa7, 0xa6, 0x57, 0x43, 0xa7, 0xa6, 0xd9, 0x12, 0xb7, 0x16, 0x43, 0x1c, 0x9a, 0x76, 0xa0, 0x6e, + 0x68, 0xbe, 0xc6, 0x4b, 0xbd, 0x85, 0x53, 0x25, 0x6c, 0x25, 0xad, 0x10, 0x8f, 0x94, 0xa2, 0x21, + 0xc2, 0x8d, 0x65, 0x42, 0xe8, 0x0e, 0x4f, 0x16, 0x64, 0x11, 0x3f, 0x02, 0x61, 0xf6, 0xb2, 0x39, + 0x6e, 0x11, 0x0d, 0x52, 0xfb, 0xa4, 0x00, 0x70, 0xf6, 0x77, 0x54, 0x4c, 0xe5, 0x6f, 0x95, 0xe6, + 0xa3, 0x60, 0x41, 0xb1, 0xf7, 0xd8, 0x7f, 0x4d, 0x81, 0x39, 0x9e, 0xd4, 0xb2, 0xe9, 0xf4, 0xfa, + 0x8e, 0x4d, 0xe8, 0xc4, 0xa0, 0x12, 0xde, 0x9d, 0x9c, 0x3f, 0x74, 0x12, 0x28, 0x85, 0x23, 0x43, + 0xa2, 0x14, 0xa7, 0x48, 0xa3, 0x7f, 0xaa, 0xc0, 0x42, 0x2f, 0x27, 0x03, 0xc2, 0xc2, 0xe9, 0x12, + 0x3e, 0xb1, 0x87, 0xa5, 0x55, 0xe0, 0x09, 0x77, 0x0f, 0x83, 0xc2, 0xb9, 0x8d, 0x2b, 0xeb, 0x83, + 0x5f, 0xe6, 0xa1, 0xfa, 0x6f, 0x29, 0x30, 0x97, 0x3c, 0x0a, 0xe4, 0xf4, 0x46, 0xca, 0x43, 0x4e, + 0x6f, 0x24, 0xdd, 0x69, 0x56, 0x86, 0xdc, 0x69, 0x3e, 0x0b, 0xe7, 0xb2, 0x57, 0x07, 0x15, 0xce, + 0x58, 0x52, 0x31, 0xa1, 0x10, 0x45, 0x31, 0x78, 0x69, 0x21, 0xe6, 0x75, 0x8d, 0xa5, 0x1f, 0xfc, + 0xf4, 0xd2, 0xbb, 0xfe, 0xe8, 0xa7, 0x97, 0xde, 0xf5, 0xe3, 0x9f, 0x5e, 0x7a, 0xd7, 0x17, 0x0e, + 0x2e, 0x29, 0x3f, 0x38, 0xb8, 0xa4, 0xfc, 0xd1, 0xc1, 0x25, 0xe5, 0xc7, 0x07, 0x97, 0x94, 0xff, + 0x70, 0x70, 0x49, 0xf9, 0x1b, 0xff, 0xf1, 0xd2, 0xbb, 0x5e, 0xa9, 0x05, 0x2d, 0xff, 0x7f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x79, 0xdd, 0xe0, 0x4c, 0x5e, 0xc2, 0x00, 0x00, } func (m *Addon) Marshal() (dAtA []byte, err error) { @@ -8142,6 +8300,18 @@ func (m *KubeletConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SerializeImagePulls != nil { + i-- + if *m.SerializeImagePulls { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x90 + } if m.ImageGCLowThresholdPercent != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.ImageGCLowThresholdPercent)) i-- @@ -10782,6 +10952,18 @@ func (m *SecretBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Provider != nil { + { + size, err := m.Provider.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } if len(m.Quotas) > 0 { for iNdEx := len(m.Quotas) - 1; iNdEx >= 0; iNdEx-- { { @@ -10866,6 +11048,34 @@ func (m *SecretBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SecretBindingProvider) 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 *SecretBindingProvider) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SecretBindingProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *Seed) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11266,6 +11476,115 @@ func (m *SeedSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SeedSettingDependencyWatchdog) 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 *SeedSettingDependencyWatchdog) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdog) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Probe != nil { + { + size, err := m.Probe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Endpoint != nil { + { + size, err := m.Endpoint.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SeedSettingDependencyWatchdogEndpoint) 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 *SeedSettingDependencyWatchdogEndpoint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdogEndpoint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + +func (m *SeedSettingDependencyWatchdogProbe) 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 *SeedSettingDependencyWatchdogProbe) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdogProbe) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *SeedSettingExcessCapacityReservation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11344,6 +11663,37 @@ func (m *SeedSettingLoadBalancerServices) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *SeedSettingOwnerChecks) 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 *SeedSettingOwnerChecks) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingOwnerChecks) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *SeedSettingScheduling) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11457,6 +11807,30 @@ func (m *SeedSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.DependencyWatchdog != nil { + { + size, err := m.DependencyWatchdog.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.OwnerChecks != nil { + { + size, err := m.OwnerChecks.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.VerticalPodAutoscaler != nil { { size, err := m.VerticalPodAutoscaler.MarshalToSizedBuffer(dAtA[:i]) @@ -13291,6 +13665,13 @@ func (m *WorkerKubernetes) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Version != nil { + i -= len(*m.Version) + copy(dAtA[i:], *m.Version) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Version))) + i-- + dAtA[i] = 0x12 + } if m.Kubelet != nil { { size, err := m.Kubelet.MarshalToSizedBuffer(dAtA[:i]) @@ -14594,6 +14975,9 @@ func (m *KubeletConfig) Size() (n int) { if m.ImageGCLowThresholdPercent != nil { n += 2 + sovGenerated(uint64(*m.ImageGCLowThresholdPercent)) } + if m.SerializeImagePulls != nil { + n += 3 + } return n } @@ -15532,6 +15916,10 @@ func (m *SecretBinding) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.Provider != nil { + l = m.Provider.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -15552,6 +15940,17 @@ func (m *SecretBindingList) Size() (n int) { return n } +func (m *SecretBindingProvider) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *Seed) Size() (n int) { if m == nil { return 0 @@ -15698,6 +16097,43 @@ func (m *SeedSelector) Size() (n int) { return n } +func (m *SeedSettingDependencyWatchdog) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Endpoint != nil { + l = m.Endpoint.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Probe != nil { + l = m.Probe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *SeedSettingDependencyWatchdogEndpoint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + +func (m *SeedSettingDependencyWatchdogProbe) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + func (m *SeedSettingExcessCapacityReservation) Size() (n int) { if m == nil { return 0 @@ -15725,6 +16161,16 @@ func (m *SeedSettingLoadBalancerServices) Size() (n int) { return n } +func (m *SeedSettingOwnerChecks) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + func (m *SeedSettingScheduling) Size() (n int) { if m == nil { return 0 @@ -15781,6 +16227,14 @@ func (m *SeedSettings) Size() (n int) { l = m.VerticalPodAutoscaler.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.OwnerChecks != nil { + l = m.OwnerChecks.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.DependencyWatchdog != nil { + l = m.DependencyWatchdog.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -16450,6 +16904,10 @@ func (m *WorkerKubernetes) Size() (n int) { l = m.Kubelet.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Version != nil { + l = len(*m.Version) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -17337,6 +17795,7 @@ func (this *KubeletConfig) String() string { `SystemReserved:` + strings.Replace(this.SystemReserved.String(), "KubeletConfigReserved", "KubeletConfigReserved", 1) + `,`, `ImageGCHighThresholdPercent:` + valueToStringGenerated(this.ImageGCHighThresholdPercent) + `,`, `ImageGCLowThresholdPercent:` + valueToStringGenerated(this.ImageGCLowThresholdPercent) + `,`, + `SerializeImagePulls:` + valueToStringGenerated(this.SerializeImagePulls) + `,`, `}`, }, "") return s @@ -18011,6 +18470,7 @@ func (this *SecretBinding) String() string { `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, `SecretRef:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.SecretRef), "SecretReference", "v1.SecretReference", 1), `&`, ``, 1) + `,`, `Quotas:` + repeatedStringForQuotas + `,`, + `Provider:` + strings.Replace(this.Provider.String(), "SecretBindingProvider", "SecretBindingProvider", 1) + `,`, `}`, }, "") return s @@ -18031,6 +18491,16 @@ func (this *SecretBindingList) String() string { }, "") return s } +func (this *SecretBindingProvider) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretBindingProvider{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} func (this *Seed) String() string { if this == nil { return "nil" @@ -18132,6 +18602,37 @@ func (this *SeedSelector) String() string { }, "") return s } +func (this *SeedSettingDependencyWatchdog) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdog{`, + `Endpoint:` + strings.Replace(this.Endpoint.String(), "SeedSettingDependencyWatchdogEndpoint", "SeedSettingDependencyWatchdogEndpoint", 1) + `,`, + `Probe:` + strings.Replace(this.Probe.String(), "SeedSettingDependencyWatchdogProbe", "SeedSettingDependencyWatchdogProbe", 1) + `,`, + `}`, + }, "") + return s +} +func (this *SeedSettingDependencyWatchdogEndpoint) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdogEndpoint{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} +func (this *SeedSettingDependencyWatchdogProbe) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdogProbe{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} func (this *SeedSettingExcessCapacityReservation) String() string { if this == nil { return "nil" @@ -18162,6 +18663,16 @@ func (this *SeedSettingLoadBalancerServices) String() string { }, "") return s } +func (this *SeedSettingOwnerChecks) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingOwnerChecks{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} func (this *SeedSettingScheduling) String() string { if this == nil { return "nil" @@ -18202,6 +18713,8 @@ func (this *SeedSettings) String() string { `ShootDNS:` + strings.Replace(this.ShootDNS.String(), "SeedSettingShootDNS", "SeedSettingShootDNS", 1) + `,`, `LoadBalancerServices:` + strings.Replace(this.LoadBalancerServices.String(), "SeedSettingLoadBalancerServices", "SeedSettingLoadBalancerServices", 1) + `,`, `VerticalPodAutoscaler:` + strings.Replace(this.VerticalPodAutoscaler.String(), "SeedSettingVerticalPodAutoscaler", "SeedSettingVerticalPodAutoscaler", 1) + `,`, + `OwnerChecks:` + strings.Replace(this.OwnerChecks.String(), "SeedSettingOwnerChecks", "SeedSettingOwnerChecks", 1) + `,`, + `DependencyWatchdog:` + strings.Replace(this.DependencyWatchdog.String(), "SeedSettingDependencyWatchdog", "SeedSettingDependencyWatchdog", 1) + `,`, `}`, }, "") return s @@ -18668,6 +19181,7 @@ func (this *WorkerKubernetes) String() string { } s := strings.Join([]string{`&WorkerKubernetes{`, `Kubelet:` + strings.Replace(this.Kubelet.String(), "KubeletConfig", "KubeletConfig", 1) + `,`, + `Version:` + valueToStringGenerated(this.Version) + `,`, `}`, }, "") return s @@ -28393,6 +28907,27 @@ func (m *KubeletConfig) Unmarshal(dAtA []byte) error { } } m.ImageGCLowThresholdPercent = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SerializeImagePulls", 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 + } + } + b := bool(v != 0) + m.SerializeImagePulls = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -35766,48 +36301,452 @@ func (m *ResourceWatchCacheSize) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResourceWatchCacheSize: wiretype end group for non-group") + return fmt.Errorf("proto: ResourceWatchCacheSize: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceWatchCacheSize: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", 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 + } + s := string(dAtA[iNdEx:postIndex]) + m.APIGroup = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", 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.Resource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheSize", wireType) + } + m.CacheSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CacheSize |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *SecretBinding) 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: SecretBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", 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.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Quotas", 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.Quotas = append(m.Quotas, v1.ObjectReference{}) + if err := m.Quotas[len(m.Quotas)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", 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.Provider == nil { + m.Provider = &SecretBindingProvider{} + } + if err := m.Provider.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 *SecretBindingList) 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: SecretBindingList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretBindingList: 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 + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, SecretBinding{}) + if err := m.Items[len(m.Items)-1].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 *SecretBindingProvider) 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: SecretBindingProvider: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceWatchCacheSize: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretBindingProvider: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", 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 - } - s := string(dAtA[iNdEx:postIndex]) - m.APIGroup = &s - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -35835,27 +36774,8 @@ func (m *ResourceWatchCacheSize) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Resource = string(dAtA[iNdEx:postIndex]) + m.Type = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CacheSize", wireType) - } - m.CacheSize = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CacheSize |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -35877,7 +36797,7 @@ func (m *ResourceWatchCacheSize) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretBinding) Unmarshal(dAtA []byte) error { +func (m *Seed) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -35900,10 +36820,10 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretBinding: wiretype end group for non-group") + return fmt.Errorf("proto: Seed: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretBinding: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Seed: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -35941,7 +36861,7 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -35968,13 +36888,13 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Quotas", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36001,8 +36921,7 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Quotas = append(m.Quotas, v1.ObjectReference{}) - if err := m.Quotas[len(m.Quotas)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36027,7 +36946,7 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretBindingList) Unmarshal(dAtA []byte) error { +func (m *SeedBackup) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36050,15 +36969,47 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretBindingList: wiretype end group for non-group") + return fmt.Errorf("proto: SeedBackup: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretBindingList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedBackup: 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 Provider", 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.Provider = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProviderConfig", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36085,13 +37036,49 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ProviderConfig == nil { + m.ProviderConfig = &runtime.RawExtension{} + } + if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + 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 + } + s := string(dAtA[iNdEx:postIndex]) + m.Region = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36118,8 +37105,7 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, SecretBinding{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36144,7 +37130,7 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { } return nil } -func (m *Seed) Unmarshal(dAtA []byte) error { +func (m *SeedDNS) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36167,17 +37153,17 @@ func (m *Seed) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Seed: wiretype end group for non-group") + return fmt.Errorf("proto: SeedDNS: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Seed: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedDNS: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IngressDomain", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36187,28 +37173,28 @@ func (m *Seed) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.IngressDomain = &s iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36235,40 +37221,10 @@ func (m *Seed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - 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 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.Provider == nil { + m.Provider = &SeedDNSProvider{} } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Provider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36293,7 +37249,7 @@ func (m *Seed) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedBackup) Unmarshal(dAtA []byte) error { +func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36316,15 +37272,15 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedBackup: wiretype end group for non-group") + return fmt.Errorf("proto: SeedDNSProvider: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedBackup: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedDNSProvider: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36352,11 +37308,11 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Provider = string(dAtA[iNdEx:postIndex]) + m.Type = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProviderConfig", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36383,18 +37339,15 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ProviderConfig == nil { - m.ProviderConfig = &runtime.RawExtension{} - } - if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Domains", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36404,28 +37357,31 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + 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 } - s := string(dAtA[iNdEx:postIndex]) - m.Region = &s + if m.Domains == nil { + m.Domains = &DNSIncludeExclude{} + } + if err := m.Domains.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Zones", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36452,7 +37408,10 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Zones == nil { + m.Zones = &DNSIncludeExclude{} + } + if err := m.Zones.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36477,7 +37436,7 @@ func (m *SeedBackup) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedDNS) Unmarshal(dAtA []byte) error { +func (m *SeedList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36500,17 +37459,17 @@ func (m *SeedDNS) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedDNS: wiretype end group for non-group") + return fmt.Errorf("proto: SeedList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedDNS: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IngressDomain", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36520,28 +37479,28 @@ func (m *SeedDNS) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + 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 } - s := string(dAtA[iNdEx:postIndex]) - m.IngressDomain = &s + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36568,10 +37527,8 @@ func (m *SeedDNS) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Provider == nil { - m.Provider = &SeedDNSProvider{} - } - if err := m.Provider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, Seed{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36596,7 +37553,7 @@ func (m *SeedDNS) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { +func (m *SeedNetworks) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36619,15 +37576,15 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedDNSProvider: wiretype end group for non-group") + return fmt.Errorf("proto: SeedNetworks: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedDNSProvider: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedNetworks: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36655,13 +37612,14 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = string(dAtA[iNdEx:postIndex]) + s := string(dAtA[iNdEx:postIndex]) + m.Nodes = &s iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pods", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36671,30 +37629,29 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Pods = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Domains", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Services", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36704,31 +37661,27 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Domains == nil { - m.Domains = &DNSIncludeExclude{} - } - if err := m.Domains.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Services = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Zones", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ShootDefaults", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36755,10 +37708,10 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Zones == nil { - m.Zones = &DNSIncludeExclude{} + if m.ShootDefaults == nil { + m.ShootDefaults = &ShootNetworks{} } - if err := m.Zones.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ShootDefaults.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -36783,7 +37736,7 @@ func (m *SeedDNSProvider) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedList) Unmarshal(dAtA []byte) error { +func (m *SeedProvider) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36806,17 +37759,17 @@ func (m *SeedList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedList: wiretype end group for non-group") + return fmt.Errorf("proto: SeedProvider: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedProvider: 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 Type", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36826,28 +37779,27 @@ func (m *SeedList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Type = string(dAtA[iNdEx:postIndex]) 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 ProviderConfig", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -36874,11 +37826,45 @@ func (m *SeedList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, Seed{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ProviderConfig == nil { + m.ProviderConfig = &runtime.RawExtension{} + } + if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + 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 default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -36900,7 +37886,7 @@ func (m *SeedList) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedNetworks) Unmarshal(dAtA []byte) error { +func (m *SeedSelector) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36923,17 +37909,17 @@ func (m *SeedNetworks) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedNetworks: wiretype end group for non-group") + return fmt.Errorf("proto: SeedSelector: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedNetworks: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedSelector: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LabelSelector", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36943,60 +37929,28 @@ func (m *SeedNetworks) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + 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 } - s := string(dAtA[iNdEx:postIndex]) - m.Nodes = &s - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pods", 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 + if err := m.LabelSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Pods = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Services", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProviderTypes", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -37024,43 +37978,7 @@ func (m *SeedNetworks) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Services = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShootDefaults", 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.ShootDefaults == nil { - m.ShootDefaults = &ShootNetworks{} - } - if err := m.ShootDefaults.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ProviderTypes = append(m.ProviderTypes, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -37083,7 +38001,7 @@ func (m *SeedNetworks) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedProvider) Unmarshal(dAtA []byte) error { +func (m *SeedSettingDependencyWatchdog) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -37106,47 +38024,15 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedProvider: wiretype end group for non-group") + return fmt.Errorf("proto: SeedSettingDependencyWatchdog: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedProvider: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedSettingDependencyWatchdog: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", 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.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProviderConfig", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -37173,18 +38059,18 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ProviderConfig == nil { - m.ProviderConfig = &runtime.RawExtension{} + if m.Endpoint == nil { + m.Endpoint = &SeedSettingDependencyWatchdogEndpoint{} } - if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Endpoint.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 Region", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Probe", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -37194,23 +38080,27 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + 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.Region = string(dAtA[iNdEx:postIndex]) + if m.Probe == nil { + m.Probe = &SeedSettingDependencyWatchdogProbe{} + } + if err := m.Probe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -37233,7 +38123,7 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedSelector) Unmarshal(dAtA []byte) error { +func (m *SeedSettingDependencyWatchdogEndpoint) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -37256,17 +38146,17 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedSelector: wiretype end group for non-group") + return fmt.Errorf("proto: SeedSettingDependencyWatchdogEndpoint: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedSelector: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedSettingDependencyWatchdogEndpoint: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LabelSelector", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -37276,30 +38166,67 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated + m.Enabled = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if err := m.LabelSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SeedSettingDependencyWatchdogProbe) 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 } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProviderTypes", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - var stringLen uint64 + 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: SeedSettingDependencyWatchdogProbe: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSettingDependencyWatchdogProbe: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -37309,24 +38236,12 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(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.ProviderTypes = append(m.ProviderTypes, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex + m.Enabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -37595,6 +38510,76 @@ func (m *SeedSettingLoadBalancerServices) Unmarshal(dAtA []byte) error { } return nil } +func (m *SeedSettingOwnerChecks) 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: SeedSettingOwnerChecks: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSettingOwnerChecks: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", 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.Enabled = bool(v != 0) + 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 *SeedSettingScheduling) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -38014,6 +38999,78 @@ func (m *SeedSettings) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerChecks", 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.OwnerChecks == nil { + m.OwnerChecks = &SeedSettingOwnerChecks{} + } + if err := m.OwnerChecks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DependencyWatchdog", 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.DependencyWatchdog == nil { + m.DependencyWatchdog = &SeedSettingDependencyWatchdog{} + } + if err := m.DependencyWatchdog.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43339,6 +44396,39 @@ func (m *WorkerKubernetes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", 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 + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto index e6a2b6379..e66d2f127 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto @@ -1047,6 +1047,11 @@ message KubeletConfig { // +optional // Default: 40 optional int32 imageGCLowThresholdPercent = 17; + + // SerializeImagePulls describes whether the images are pulled one at a time. + // +optional + // Default: true + optional bool serializeImagePulls = 18; } // KubeletConfigEviction contains kubelet eviction thresholds supporting either a resource.Quantity or a percentage based value. @@ -1771,6 +1776,10 @@ message SecretBinding { // Quotas is a list of references to Quota objects in the same or another namespace. // +optional repeated k8s.io.api.core.v1.ObjectReference quotas = 3; + + // Provider defines the provider type of the SecretBinding. + // +optional + optional SecretBindingProvider provider = 4; } // SecretBindingList is a collection of SecretBindings. @@ -1783,6 +1792,15 @@ message SecretBindingList { repeated SecretBinding items = 2; } +// SecretBindingProvider defines the provider type of the SecretBinding. +message SecretBindingProvider { + // Type is the type of the provider. + // + // For backwards compatibility, the field can contain multiple providers separated by a comma. + // However the usage of single SecretBinding (hence Secret) for different cloud providers is strongly discouraged. + optional string type = 1; +} + // Seed represents an installation request for an external controller. message Seed { // Standard object metadata. @@ -1895,6 +1913,33 @@ message SeedSelector { repeated string providerTypes = 2; } +// SeedSettingDependencyWatchdog controls the dependency-watchdog settings for the seed. +message SeedSettingDependencyWatchdog { + // Endpoint controls the endpoint settings for the dependency-watchdog for the seed. + // +optional + optional SeedSettingDependencyWatchdogEndpoint endpoint = 1; + + // Probe controls the probe settings for the dependency-watchdog for the seed. + // +optional + optional SeedSettingDependencyWatchdogProbe probe = 2; +} + +// SeedSettingDependencyWatchdogEndpoint controls the endpoint settings for the dependency-watchdog for the seed. +message SeedSettingDependencyWatchdogEndpoint { + // Enabled controls whether the endpoint controller of the dependency-watchdog should be enabled. This controller + // helps to alleviate the delay where control plane components remain unavailable by finding the respective pods in + // CrashLoopBackoff status and restarting them once their dependants become ready and available again. + optional bool enabled = 1; +} + +// SeedSettingDependencyWatchdogProbe controls the probe settings for the dependency-watchdog for the seed. +message SeedSettingDependencyWatchdogProbe { + // Enabled controls whether the probe controller of the dependency-watchdog should be enabled. This controller + // scales down the kube-controller-manager of shoot clusters in case their respective kube-apiserver is not + // reachable via its external ingress in order to avoid melt-down situations. + optional bool enabled = 1; +} + // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. message SeedSettingExcessCapacityReservation { // Enabled controls whether the excess capacity reservation should be enabled. @@ -1909,6 +1954,13 @@ message SeedSettingLoadBalancerServices { map annotations = 1; } +// SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. +message SeedSettingOwnerChecks { + // Enabled controls whether owner checks are enabled for shoots scheduled on this seed. It + // is enabled by default because it is a prerequisite for control plane migration. + optional bool enabled = 1; +} + // SeedSettingScheduling controls settings for scheduling decisions for the seed. message SeedSettingScheduling { // Visible controls whether the gardener-scheduler shall consider this seed when scheduling shoots. Invisible seeds @@ -1954,6 +2006,14 @@ message SeedSettings { // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. // +optional optional SeedSettingVerticalPodAutoscaler verticalPodAutoscaler = 5; + + // SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. + // +optional + optional SeedSettingOwnerChecks ownerChecks = 6; + + // DependencyWatchdog controls certain settings for the dependency-watchdog components deployed in the seed. + // +optional + optional SeedSettingDependencyWatchdog dependencyWatchdog = 7; } // SeedSpec is the specification of a Seed. @@ -1979,8 +2039,8 @@ message SeedSpec { // Provider defines the provider type and region for this Seed cluster. optional SeedProvider provider = 5; - // SecretRef is a reference to a Secret object containing the Kubeconfig and the cloud provider credentials for - // the account the Seed cluster has been deployed to. + // SecretRef is a reference to a Secret object containing the Kubeconfig of the Kubernetes + // cluster to be registered as Seed. // +optional optional k8s.io.api.core.v1.SecretReference secretRef = 6; @@ -2533,6 +2593,13 @@ message WorkerKubernetes { // If set, all `spec.kubernetes.kubelet` settings will be overwritten for this worker pool (no merge of settings). // +optional optional KubeletConfig kubelet = 1; + + // Version is the semantic Kubernetes version to use for the Kubelet in this Worker Group. + // If not specified the kubelet version is derived from the global shoot cluster kubernetes version. + // version must be equal or lower than the version of the shoot kubernetes version. + // Only one minor version difference to other worker groups and global kubernetes version is allowed. + // +optional + optional string version = 2; } // WorkerSystemComponents contains configuration for system components related to this worker pool diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/helper/helper.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/helper/helper.go index 298e8a12e..014fe3444 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/helper/helper.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/helper/helper.go @@ -22,7 +22,6 @@ import ( gardencorev1alpha1 "github.com/gardener/gardener/pkg/apis/core/v1alpha1" v1alpha1constants "github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants" - "github.com/gardener/gardener/pkg/logger" versionutils "github.com/gardener/gardener/pkg/utils/version" "github.com/Masterminds/semver" @@ -659,18 +658,6 @@ func GetShootMachineImageFromLatestMachineImageVersion(image gardencorev1alpha1. return latestSemVerVersion, gardencorev1alpha1.ShootMachineImage{Name: image.Name, Version: &latestImage.Version}, nil } -// UpdateMachineImages updates the machine images in place. -func UpdateMachineImages(workers []gardencorev1alpha1.Worker, machineImages []*gardencorev1alpha1.ShootMachineImage) { - for _, machineImage := range machineImages { - for idx, worker := range workers { - if worker.Machine.Image != nil && machineImage.Name == worker.Machine.Image.Name { - logger.Logger.Infof("Updating worker images of worker '%s' from version %s to version %s", worker.Name, *worker.Machine.Image.Version, *machineImage.Version) - workers[idx].Machine.Image = machineImage - } - } - } -} - // KubernetesVersionExistsInCloudProfile checks if the given Kubernetes version exists in the CloudProfile func KubernetesVersionExistsInCloudProfile(cloudProfile *gardencorev1alpha1.CloudProfile, currentVersion string) (bool, gardencorev1alpha1.ExpirableVersion, error) { for _, version := range cloudProfile.Spec.Kubernetes.Versions { diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_secretbinding.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_secretbinding.go index 8528c6c83..06ab4e16e 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_secretbinding.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_secretbinding.go @@ -33,6 +33,18 @@ type SecretBinding struct { // Quotas is a list of references to Quota objects in the same or another namespace. // +optional Quotas []corev1.ObjectReference `json:"quotas,omitempty" protobuf:"bytes,3,rep,name=quotas"` + // Provider defines the provider type of the SecretBinding. + // +optional + Provider *SecretBindingProvider `json:"provider,omitempty" protobuf:"bytes,4,opt,name=provider"` +} + +// SecretBindingProvider defines the provider type of the SecretBinding. +type SecretBindingProvider struct { + // Type is the type of the provider. + // + // For backwards compatibility, the field can contain multiple providers separated by a comma. + // However the usage of single SecretBinding (hence Secret) for different cloud providers is strongly discouraged. + Type string `json:"type" protobuf:"bytes,1,opt,name=type"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go index f2b8ccb3d..eb453977a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go @@ -66,8 +66,8 @@ type SeedSpec struct { Networks SeedNetworks `json:"networks" protobuf:"bytes,4,opt,name=networks"` // Provider defines the provider type and region for this Seed cluster. Provider SeedProvider `json:"provider" protobuf:"bytes,5,opt,name=provider"` - // SecretRef is a reference to a Secret object containing the Kubeconfig and the cloud provider credentials for - // the account the Seed cluster has been deployed to. + // SecretRef is a reference to a Secret object containing the Kubeconfig of the Kubernetes + // cluster to be registered as Seed. // +optional SecretRef *corev1.SecretReference `json:"secretRef,omitempty" protobuf:"bytes,6,opt,name=secretRef"` // Taints describes taints on the seed. @@ -221,6 +221,12 @@ type SeedSettings struct { // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. // +optional VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler `json:"verticalPodAutoscaler,omitempty" protobuf:"bytes,5,opt,name=verticalPodAutoscaler"` + // SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. + // +optional + OwnerChecks *SeedSettingOwnerChecks `json:"ownerChecks,omitempty" protobuf:"bytes,6,opt,name=ownerChecks"` + // DependencyWatchdog controls certain settings for the dependency-watchdog components deployed in the seed. + // +optional + DependencyWatchdog *SeedSettingDependencyWatchdog `json:"dependencyWatchdog,omitempty" protobuf:"bytes,7,opt,name=dependencyWatchdog"` } // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. @@ -261,6 +267,39 @@ type SeedSettingVerticalPodAutoscaler struct { Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` } +// SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. +type SeedSettingOwnerChecks struct { + // Enabled controls whether owner checks are enabled for shoots scheduled on this seed. It + // is enabled by default because it is a prerequisite for control plane migration. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + +// SeedSettingDependencyWatchdog controls the dependency-watchdog settings for the seed. +type SeedSettingDependencyWatchdog struct { + // Endpoint controls the endpoint settings for the dependency-watchdog for the seed. + // +optional + Endpoint *SeedSettingDependencyWatchdogEndpoint `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` + // Probe controls the probe settings for the dependency-watchdog for the seed. + // +optional + Probe *SeedSettingDependencyWatchdogProbe `json:"probe,omitempty" protobuf:"bytes,2,opt,name=probe"` +} + +// SeedSettingDependencyWatchdogEndpoint controls the endpoint settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogEndpoint struct { + // Enabled controls whether the endpoint controller of the dependency-watchdog should be enabled. This controller + // helps to alleviate the delay where control plane components remain unavailable by finding the respective pods in + // CrashLoopBackoff status and restarting them once their dependants become ready and available again. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + +// SeedSettingDependencyWatchdogProbe controls the probe settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogProbe struct { + // Enabled controls whether the probe controller of the dependency-watchdog should be enabled. This controller + // scales down the kube-controller-manager of shoot clusters in case their respective kube-apiserver is not + // reachable via its external ingress in order to avoid melt-down situations. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + // SeedTaint describes a taint on a seed. type SeedTaint struct { // Key is the taint key to be applied to a seed. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go index 4a79b2732..111e46e64 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go @@ -836,6 +836,10 @@ type KubeletConfig struct { // +optional // Default: 40 ImageGCLowThresholdPercent *int32 `json:"imageGCLowThresholdPercent,omitempty" protobuf:"bytes,17,opt,name=imageGCLowThresholdPercent"` + // SerializeImagePulls describes whether the images are pulled one at a time. + // +optional + // Default: true + SerializeImagePulls *bool `json:"serializeImagePulls,omitempty" protobuf:"varint,18,opt,name=serializeImagePulls"` } // KubeletConfigEviction contains kubelet eviction thresholds supporting either a resource.Quantity or a percentage based value. @@ -1116,6 +1120,12 @@ type WorkerKubernetes struct { // If set, all `spec.kubernetes.kubelet` settings will be overwritten for this worker pool (no merge of settings). // +optional Kubelet *KubeletConfig `json:"kubelet,omitempty" protobuf:"bytes,1,opt,name=kubelet"` + // Version is the semantic Kubernetes version to use for the Kubelet in this Worker Group. + // If not specified the kubelet version is derived from the global shoot cluster kubernetes version. + // version must be equal or lower than the version of the shoot kubernetes version. + // Only one minor version difference to other worker groups and global kubernetes version is allowed. + // +optional + Version *string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"` } // Machine contains information about the machine type and image. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go index ad63b1e4f..6c719ebf4 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go @@ -1053,6 +1053,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SecretBindingProvider)(nil), (*core.SecretBindingProvider)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_SecretBindingProvider_To_core_SecretBindingProvider(a.(*SecretBindingProvider), b.(*core.SecretBindingProvider), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretBindingProvider)(nil), (*SecretBindingProvider)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretBindingProvider_To_v1alpha1_SecretBindingProvider(a.(*core.SecretBindingProvider), b.(*SecretBindingProvider), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SeedBackup)(nil), (*core.SeedBackup)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_SeedBackup_To_core_SeedBackup(a.(*SeedBackup), b.(*core.SeedBackup), scope) }); err != nil { @@ -1113,6 +1123,36 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdog)(nil), (*core.SeedSettingDependencyWatchdog)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(a.(*SeedSettingDependencyWatchdog), b.(*core.SeedSettingDependencyWatchdog), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdog)(nil), (*SeedSettingDependencyWatchdog)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdog_To_v1alpha1_SeedSettingDependencyWatchdog(a.(*core.SeedSettingDependencyWatchdog), b.(*SeedSettingDependencyWatchdog), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdogEndpoint)(nil), (*core.SeedSettingDependencyWatchdogEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(a.(*SeedSettingDependencyWatchdogEndpoint), b.(*core.SeedSettingDependencyWatchdogEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdogEndpoint)(nil), (*SeedSettingDependencyWatchdogEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1alpha1_SeedSettingDependencyWatchdogEndpoint(a.(*core.SeedSettingDependencyWatchdogEndpoint), b.(*SeedSettingDependencyWatchdogEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdogProbe)(nil), (*core.SeedSettingDependencyWatchdogProbe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(a.(*SeedSettingDependencyWatchdogProbe), b.(*core.SeedSettingDependencyWatchdogProbe), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdogProbe)(nil), (*SeedSettingDependencyWatchdogProbe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdogProbe_To_v1alpha1_SeedSettingDependencyWatchdogProbe(a.(*core.SeedSettingDependencyWatchdogProbe), b.(*SeedSettingDependencyWatchdogProbe), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SeedSettingExcessCapacityReservation)(nil), (*core.SeedSettingExcessCapacityReservation)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_SeedSettingExcessCapacityReservation_To_core_SeedSettingExcessCapacityReservation(a.(*SeedSettingExcessCapacityReservation), b.(*core.SeedSettingExcessCapacityReservation), scope) }); err != nil { @@ -1133,6 +1173,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SeedSettingOwnerChecks)(nil), (*core.SeedSettingOwnerChecks)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(a.(*SeedSettingOwnerChecks), b.(*core.SeedSettingOwnerChecks), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingOwnerChecks)(nil), (*SeedSettingOwnerChecks)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingOwnerChecks_To_v1alpha1_SeedSettingOwnerChecks(a.(*core.SeedSettingOwnerChecks), b.(*SeedSettingOwnerChecks), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SeedSettingScheduling)(nil), (*core.SeedSettingScheduling)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_SeedSettingScheduling_To_core_SeedSettingScheduling(a.(*SeedSettingScheduling), b.(*core.SeedSettingScheduling), scope) }); err != nil { @@ -3104,6 +3154,7 @@ func autoConvert_v1alpha1_KubeletConfig_To_core_KubeletConfig(in *KubeletConfig, out.SystemReserved = (*core.KubeletConfigReserved)(unsafe.Pointer(in.SystemReserved)) out.ImageGCHighThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCHighThresholdPercent)) out.ImageGCLowThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCLowThresholdPercent)) + out.SerializeImagePulls = (*bool)(unsafe.Pointer(in.SerializeImagePulls)) return nil } @@ -3132,6 +3183,7 @@ func autoConvert_core_KubeletConfig_To_v1alpha1_KubeletConfig(in *core.KubeletCo out.SystemReserved = (*KubeletConfigReserved)(unsafe.Pointer(in.SystemReserved)) out.ImageGCHighThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCHighThresholdPercent)) out.ImageGCLowThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCLowThresholdPercent)) + out.SerializeImagePulls = (*bool)(unsafe.Pointer(in.SerializeImagePulls)) return nil } @@ -4295,6 +4347,7 @@ func autoConvert_v1alpha1_SecretBinding_To_core_SecretBinding(in *SecretBinding, out.ObjectMeta = in.ObjectMeta out.SecretRef = in.SecretRef out.Quotas = *(*[]v1.ObjectReference)(unsafe.Pointer(&in.Quotas)) + out.Provider = (*core.SecretBindingProvider)(unsafe.Pointer(in.Provider)) return nil } @@ -4307,6 +4360,7 @@ func autoConvert_core_SecretBinding_To_v1alpha1_SecretBinding(in *core.SecretBin out.ObjectMeta = in.ObjectMeta out.SecretRef = in.SecretRef out.Quotas = *(*[]v1.ObjectReference)(unsafe.Pointer(&in.Quotas)) + out.Provider = (*SecretBindingProvider)(unsafe.Pointer(in.Provider)) return nil } @@ -4337,6 +4391,26 @@ func Convert_core_SecretBindingList_To_v1alpha1_SecretBindingList(in *core.Secre return autoConvert_core_SecretBindingList_To_v1alpha1_SecretBindingList(in, out, s) } +func autoConvert_v1alpha1_SecretBindingProvider_To_core_SecretBindingProvider(in *SecretBindingProvider, out *core.SecretBindingProvider, s conversion.Scope) error { + out.Type = in.Type + return nil +} + +// Convert_v1alpha1_SecretBindingProvider_To_core_SecretBindingProvider is an autogenerated conversion function. +func Convert_v1alpha1_SecretBindingProvider_To_core_SecretBindingProvider(in *SecretBindingProvider, out *core.SecretBindingProvider, s conversion.Scope) error { + return autoConvert_v1alpha1_SecretBindingProvider_To_core_SecretBindingProvider(in, out, s) +} + +func autoConvert_core_SecretBindingProvider_To_v1alpha1_SecretBindingProvider(in *core.SecretBindingProvider, out *SecretBindingProvider, s conversion.Scope) error { + out.Type = in.Type + return nil +} + +// Convert_core_SecretBindingProvider_To_v1alpha1_SecretBindingProvider is an autogenerated conversion function. +func Convert_core_SecretBindingProvider_To_v1alpha1_SecretBindingProvider(in *core.SecretBindingProvider, out *SecretBindingProvider, s conversion.Scope) error { + return autoConvert_core_SecretBindingProvider_To_v1alpha1_SecretBindingProvider(in, out, s) +} + func autoConvert_v1alpha1_Seed_To_core_Seed(in *Seed, out *core.Seed, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1alpha1_SeedSpec_To_core_SeedSpec(&in.Spec, &out.Spec, s); err != nil { @@ -4538,6 +4612,68 @@ func Convert_core_SeedSelector_To_v1alpha1_SeedSelector(in *core.SeedSelector, o return autoConvert_core_SeedSelector_To_v1alpha1_SeedSelector(in, out, s) } +func autoConvert_v1alpha1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in *SeedSettingDependencyWatchdog, out *core.SeedSettingDependencyWatchdog, s conversion.Scope) error { + out.Endpoint = (*core.SeedSettingDependencyWatchdogEndpoint)(unsafe.Pointer(in.Endpoint)) + out.Probe = (*core.SeedSettingDependencyWatchdogProbe)(unsafe.Pointer(in.Probe)) + return nil +} + +// Convert_v1alpha1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog is an autogenerated conversion function. +func Convert_v1alpha1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in *SeedSettingDependencyWatchdog, out *core.SeedSettingDependencyWatchdog, s conversion.Scope) error { + return autoConvert_v1alpha1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdog_To_v1alpha1_SeedSettingDependencyWatchdog(in *core.SeedSettingDependencyWatchdog, out *SeedSettingDependencyWatchdog, s conversion.Scope) error { + out.Endpoint = (*SeedSettingDependencyWatchdogEndpoint)(unsafe.Pointer(in.Endpoint)) + out.Probe = (*SeedSettingDependencyWatchdogProbe)(unsafe.Pointer(in.Probe)) + return nil +} + +// Convert_core_SeedSettingDependencyWatchdog_To_v1alpha1_SeedSettingDependencyWatchdog is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdog_To_v1alpha1_SeedSettingDependencyWatchdog(in *core.SeedSettingDependencyWatchdog, out *SeedSettingDependencyWatchdog, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdog_To_v1alpha1_SeedSettingDependencyWatchdog(in, out, s) +} + +func autoConvert_v1alpha1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in *SeedSettingDependencyWatchdogEndpoint, out *core.SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1alpha1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint is an autogenerated conversion function. +func Convert_v1alpha1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in *SeedSettingDependencyWatchdogEndpoint, out *core.SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + return autoConvert_v1alpha1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdogEndpoint_To_v1alpha1_SeedSettingDependencyWatchdogEndpoint(in *core.SeedSettingDependencyWatchdogEndpoint, out *SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1alpha1_SeedSettingDependencyWatchdogEndpoint is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1alpha1_SeedSettingDependencyWatchdogEndpoint(in *core.SeedSettingDependencyWatchdogEndpoint, out *SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdogEndpoint_To_v1alpha1_SeedSettingDependencyWatchdogEndpoint(in, out, s) +} + +func autoConvert_v1alpha1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in *SeedSettingDependencyWatchdogProbe, out *core.SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1alpha1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe is an autogenerated conversion function. +func Convert_v1alpha1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in *SeedSettingDependencyWatchdogProbe, out *core.SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + return autoConvert_v1alpha1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdogProbe_To_v1alpha1_SeedSettingDependencyWatchdogProbe(in *core.SeedSettingDependencyWatchdogProbe, out *SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingDependencyWatchdogProbe_To_v1alpha1_SeedSettingDependencyWatchdogProbe is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdogProbe_To_v1alpha1_SeedSettingDependencyWatchdogProbe(in *core.SeedSettingDependencyWatchdogProbe, out *SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdogProbe_To_v1alpha1_SeedSettingDependencyWatchdogProbe(in, out, s) +} + func autoConvert_v1alpha1_SeedSettingExcessCapacityReservation_To_core_SeedSettingExcessCapacityReservation(in *SeedSettingExcessCapacityReservation, out *core.SeedSettingExcessCapacityReservation, s conversion.Scope) error { out.Enabled = in.Enabled return nil @@ -4578,6 +4714,26 @@ func Convert_core_SeedSettingLoadBalancerServices_To_v1alpha1_SeedSettingLoadBal return autoConvert_core_SeedSettingLoadBalancerServices_To_v1alpha1_SeedSettingLoadBalancerServices(in, out, s) } +func autoConvert_v1alpha1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in *SeedSettingOwnerChecks, out *core.SeedSettingOwnerChecks, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1alpha1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks is an autogenerated conversion function. +func Convert_v1alpha1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in *SeedSettingOwnerChecks, out *core.SeedSettingOwnerChecks, s conversion.Scope) error { + return autoConvert_v1alpha1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in, out, s) +} + +func autoConvert_core_SeedSettingOwnerChecks_To_v1alpha1_SeedSettingOwnerChecks(in *core.SeedSettingOwnerChecks, out *SeedSettingOwnerChecks, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingOwnerChecks_To_v1alpha1_SeedSettingOwnerChecks is an autogenerated conversion function. +func Convert_core_SeedSettingOwnerChecks_To_v1alpha1_SeedSettingOwnerChecks(in *core.SeedSettingOwnerChecks, out *SeedSettingOwnerChecks, s conversion.Scope) error { + return autoConvert_core_SeedSettingOwnerChecks_To_v1alpha1_SeedSettingOwnerChecks(in, out, s) +} + func autoConvert_v1alpha1_SeedSettingScheduling_To_core_SeedSettingScheduling(in *SeedSettingScheduling, out *core.SeedSettingScheduling, s conversion.Scope) error { out.Visible = in.Visible return nil @@ -4644,6 +4800,8 @@ func autoConvert_v1alpha1_SeedSettings_To_core_SeedSettings(in *SeedSettings, ou out.ShootDNS = (*core.SeedSettingShootDNS)(unsafe.Pointer(in.ShootDNS)) out.LoadBalancerServices = (*core.SeedSettingLoadBalancerServices)(unsafe.Pointer(in.LoadBalancerServices)) out.VerticalPodAutoscaler = (*core.SeedSettingVerticalPodAutoscaler)(unsafe.Pointer(in.VerticalPodAutoscaler)) + out.OwnerChecks = (*core.SeedSettingOwnerChecks)(unsafe.Pointer(in.OwnerChecks)) + out.DependencyWatchdog = (*core.SeedSettingDependencyWatchdog)(unsafe.Pointer(in.DependencyWatchdog)) return nil } @@ -4658,6 +4816,8 @@ func autoConvert_core_SeedSettings_To_v1alpha1_SeedSettings(in *core.SeedSetting out.ShootDNS = (*SeedSettingShootDNS)(unsafe.Pointer(in.ShootDNS)) out.LoadBalancerServices = (*SeedSettingLoadBalancerServices)(unsafe.Pointer(in.LoadBalancerServices)) out.VerticalPodAutoscaler = (*SeedSettingVerticalPodAutoscaler)(unsafe.Pointer(in.VerticalPodAutoscaler)) + out.OwnerChecks = (*SeedSettingOwnerChecks)(unsafe.Pointer(in.OwnerChecks)) + out.DependencyWatchdog = (*SeedSettingDependencyWatchdog)(unsafe.Pointer(in.DependencyWatchdog)) return nil } @@ -5423,6 +5583,7 @@ func Convert_core_Worker_To_v1alpha1_Worker(in *core.Worker, out *Worker, s conv func autoConvert_v1alpha1_WorkerKubernetes_To_core_WorkerKubernetes(in *WorkerKubernetes, out *core.WorkerKubernetes, s conversion.Scope) error { out.Kubelet = (*core.KubeletConfig)(unsafe.Pointer(in.Kubelet)) + out.Version = (*string)(unsafe.Pointer(in.Version)) return nil } @@ -5433,6 +5594,7 @@ func Convert_v1alpha1_WorkerKubernetes_To_core_WorkerKubernetes(in *WorkerKubern func autoConvert_core_WorkerKubernetes_To_v1alpha1_WorkerKubernetes(in *core.WorkerKubernetes, out *WorkerKubernetes, s conversion.Scope) error { out.Kubelet = (*KubeletConfig)(unsafe.Pointer(in.Kubelet)) + out.Version = (*string)(unsafe.Pointer(in.Version)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go index 8abe27c7a..ce11df540 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go @@ -1837,6 +1837,11 @@ func (in *KubeletConfig) DeepCopyInto(out *KubeletConfig) { *out = new(int32) **out = **in } + if in.SerializeImagePulls != nil { + in, out := &in.SerializeImagePulls, &out.SerializeImagePulls + *out = new(bool) + **out = **in + } return } @@ -3139,6 +3144,11 @@ func (in *SecretBinding) DeepCopyInto(out *SecretBinding) { *out = make([]v1.ObjectReference, len(*in)) copy(*out, *in) } + if in.Provider != nil { + in, out := &in.Provider, &out.Provider + *out = new(SecretBindingProvider) + **out = **in + } return } @@ -3193,6 +3203,22 @@ func (in *SecretBindingList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretBindingProvider) DeepCopyInto(out *SecretBindingProvider) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretBindingProvider. +func (in *SecretBindingProvider) DeepCopy() *SecretBindingProvider { + if in == nil { + return nil + } + out := new(SecretBindingProvider) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Seed) DeepCopyInto(out *Seed) { *out = *in @@ -3403,6 +3429,64 @@ func (in *SeedSelector) DeepCopy() *SeedSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdog) DeepCopyInto(out *SeedSettingDependencyWatchdog) { + *out = *in + if in.Endpoint != nil { + in, out := &in.Endpoint, &out.Endpoint + *out = new(SeedSettingDependencyWatchdogEndpoint) + **out = **in + } + if in.Probe != nil { + in, out := &in.Probe, &out.Probe + *out = new(SeedSettingDependencyWatchdogProbe) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdog. +func (in *SeedSettingDependencyWatchdog) DeepCopy() *SeedSettingDependencyWatchdog { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdog) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopyInto(out *SeedSettingDependencyWatchdogEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogEndpoint. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopy() *SeedSettingDependencyWatchdogEndpoint { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopyInto(out *SeedSettingDependencyWatchdogProbe) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogProbe. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopy() *SeedSettingDependencyWatchdogProbe { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogProbe) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingExcessCapacityReservation) DeepCopyInto(out *SeedSettingExcessCapacityReservation) { *out = *in @@ -3442,6 +3526,22 @@ func (in *SeedSettingLoadBalancerServices) DeepCopy() *SeedSettingLoadBalancerSe return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingOwnerChecks) DeepCopyInto(out *SeedSettingOwnerChecks) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingOwnerChecks. +func (in *SeedSettingOwnerChecks) DeepCopy() *SeedSettingOwnerChecks { + if in == nil { + return nil + } + out := new(SeedSettingOwnerChecks) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingScheduling) DeepCopyInto(out *SeedSettingScheduling) { *out = *in @@ -3518,6 +3618,16 @@ func (in *SeedSettings) DeepCopyInto(out *SeedSettings) { *out = new(SeedSettingVerticalPodAutoscaler) **out = **in } + if in.OwnerChecks != nil { + in, out := &in.OwnerChecks, &out.OwnerChecks + *out = new(SeedSettingOwnerChecks) + **out = **in + } + if in.DependencyWatchdog != nil { + in, out := &in.DependencyWatchdog, &out.DependencyWatchdog + *out = new(SeedSettingDependencyWatchdog) + (*in).DeepCopyInto(*out) + } return } @@ -4435,6 +4545,11 @@ func (in *WorkerKubernetes) DeepCopyInto(out *WorkerKubernetes) { *out = new(KubeletConfig) (*in).DeepCopyInto(*out) } + if in.Version != nil { + in, out := &in.Version, &out.Version + *out = new(string) + **out = **in + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go index be170d2d8..18dd7f11b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go @@ -103,6 +103,11 @@ func SetObjectDefaults_SecretBindingList(in *SecretBindingList) { func SetObjectDefaults_Seed(in *Seed) { SetDefaults_Seed(in) + if in.Spec.Settings != nil { + if in.Spec.Settings.DependencyWatchdog != nil { + SetDefaults_SeedSettingDependencyWatchdog(in.Spec.Settings.DependencyWatchdog) + } + } } func SetObjectDefaults_SeedList(in *SeedList) { diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go index d3741ff0d..d7565155f 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go @@ -273,6 +273,9 @@ const ( LabelSeedProvider = "seed.gardener.cloud/provider" // LabelShootProvider is used to identify the shoot provider. LabelShootProvider = "shoot.gardener.cloud/provider" + // LabelShootProviderPrefix is used to prefix label that indicates the provider type. + // The label key is in the form provider.shoot.gardener.cloud/. + LabelShootProviderPrefix = "provider.shoot.gardener.cloud/" // LabelNetworkingProvider is used to identify the networking provider for the cni plugin. LabelNetworkingProvider = "networking.shoot.gardener.cloud/provider" // LabelExtensionPrefix is used to prefix extension specific labels. @@ -388,6 +391,11 @@ const ( // namespaces' step. Concretely, after the specified seconds, all the finalizers of the affected resources are // forcefully removed. AnnotationShootCleanupNamespaceResourcesFinalizeGracePeriodSeconds = "shoot.gardener.cloud/cleanup-namespaces-finalize-grace-period-seconds" + // AnnotationShootInfrastructureCleanupWaitPeriodSeconds is a key for an annotation on a Shoot + // resource that declares the wait period in seconds for infrastructure resources cleanup. Concretely, + // Gardener will wait for the specified time after the Infrastructure extension object has been deleted to allow + // controllers to gracefully cleanup everything (default behaviour is 300s). + AnnotationShootInfrastructureCleanupWaitPeriodSeconds = "shoot.gardener.cloud/infrastructure-cleanup-wait-period-seconds" // AnnotationReversedVPN moves the vpn-server to the seed. AnnotationReversedVPN = "alpha.featuregates.shoot.gardener.cloud/reversed-vpn" // AnnotationNodeLocalDNS enables a per node dns cache on the shoot cluster. @@ -476,8 +484,6 @@ const ( SeedsGroup = "gardener.cloud:system:seeds" // SeedUserNamePrefix is the identity user name prefix for gardenlets when authenticating to the API server. SeedUserNamePrefix = "gardener.cloud:system:seed:" - // SeedUserNameSuffixAmbiguous is the default seed name in case the gardenlet config.SeedConfig is not set - SeedUserNameSuffixAmbiguous = "" // ProjectName is the key of a label on namespaces whose value holds the project name. ProjectName = "project.gardener.cloud/name" @@ -499,6 +505,8 @@ const ( BackupSecretName string = "etcd-backup" // DataKeyBackupBucketName is the name of a data key whose value contains the backup bucket name. DataKeyBackupBucketName string = "bucketName" + // BackupSourcePrefix is the prefix for names of resources related to source backupentries when copying backups. + BackupSourcePrefix = "source" // GardenerAudience is the identifier for Gardener controllers when interacting with the API Server GardenerAudience = "gardener" diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go index 494b648f0..3a7d66719 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go @@ -119,14 +119,31 @@ func SetDefaults_Seed(obj *Seed) { if obj.Spec.Settings.VerticalPodAutoscaler == nil { obj.Spec.Settings.VerticalPodAutoscaler = &SeedSettingVerticalPodAutoscaler{Enabled: true} } + + if obj.Spec.Settings.OwnerChecks == nil { + obj.Spec.Settings.OwnerChecks = &SeedSettingOwnerChecks{Enabled: true} + } + + if obj.Spec.Settings.DependencyWatchdog == nil { + obj.Spec.Settings.DependencyWatchdog = &SeedSettingDependencyWatchdog{} + } +} + +// SetDefaults_SeedSettingDependencyWatchdog sets defaults for SeedSettingDependencyWatchdog objects. +func SetDefaults_SeedSettingDependencyWatchdog(obj *SeedSettingDependencyWatchdog) { + if obj.Endpoint == nil { + obj.Endpoint = &SeedSettingDependencyWatchdogEndpoint{Enabled: true} + } + if obj.Probe == nil { + obj.Probe = &SeedSettingDependencyWatchdogProbe{Enabled: true} + } } // SetDefaults_Shoot sets default values for Shoot objects. func SetDefaults_Shoot(obj *Shoot) { k8sVersionLessThan116, _ := versionutils.CompareVersions(obj.Spec.Kubernetes.Version, "<", "1.16") - k8sVersionGreaterOrEqualThan122, _ := versionutils.CompareVersions(obj.Spec.Kubernetes.Version, ">=", "1.22") // Error is ignored here because we cannot do anything meaningful with it. - // k8sVersionLessThan116 and k8sVersionGreaterOrEqualThan122 will default to `false`. + // k8sVersionLessThan116 will default to `false`. if obj.Spec.Kubernetes.AllowPrivilegedContainers == nil { obj.Spec.Kubernetes.AllowPrivilegedContainers = pointer.Bool(true) @@ -219,6 +236,9 @@ func SetDefaults_Shoot(obj *Shoot) { if obj.Spec.Kubernetes.Kubelet.ImageGCLowThresholdPercent == nil { obj.Spec.Kubernetes.Kubelet.ImageGCLowThresholdPercent = pointer.Int32(40) } + if obj.Spec.Kubernetes.Kubelet.SerializeImagePulls == nil { + obj.Spec.Kubernetes.Kubelet.SerializeImagePulls = pointer.Bool(true) + } var ( kubeReservedMemory = resource.MustParse("1Gi") @@ -249,13 +269,23 @@ func SetDefaults_Shoot(obj *Shoot) { obj.Spec.Kubernetes.KubeAPIServer.EnableAnonymousAuthentication = pointer.Bool(false) } - if k8sVersionGreaterOrEqualThan122 { - for i := range obj.Spec.Provider.Workers { - if obj.Spec.Provider.Workers[i].CRI != nil { - continue - } - obj.Spec.Provider.Workers[i].CRI = &CRI{Name: CRINameContainerD} + for i, worker := range obj.Spec.Provider.Workers { + kubernetesVersion := obj.Spec.Kubernetes.Version + if worker.Kubernetes != nil && worker.Kubernetes.Version != nil { + kubernetesVersion = *worker.Kubernetes.Version + } + + if k8sVersionGreaterOrEqualThan122, _ := versionutils.CompareVersions(kubernetesVersion, ">=", "1.22"); !k8sVersionGreaterOrEqualThan122 { + // Error is ignored here because we cannot do anything meaningful with it. + // k8sVersionLessThan116 and k8sVersionGreaterOrEqualThan122 will default to `false`. + continue + } + + if worker.CRI != nil { + continue } + + obj.Spec.Provider.Workers[i].CRI = &CRI{Name: CRINameContainerD} } } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go index 27091cbc4..d39ee3fe6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go @@ -2853,10 +2853,38 @@ func (m *SecretBindingList) XXX_DiscardUnknown() { var xxx_messageInfo_SecretBindingList proto.InternalMessageInfo +func (m *SecretBindingProvider) Reset() { *m = SecretBindingProvider{} } +func (*SecretBindingProvider) ProtoMessage() {} +func (*SecretBindingProvider) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{100} +} +func (m *SecretBindingProvider) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SecretBindingProvider) 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 *SecretBindingProvider) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecretBindingProvider.Merge(m, src) +} +func (m *SecretBindingProvider) XXX_Size() int { + return m.Size() +} +func (m *SecretBindingProvider) XXX_DiscardUnknown() { + xxx_messageInfo_SecretBindingProvider.DiscardUnknown(m) +} + +var xxx_messageInfo_SecretBindingProvider proto.InternalMessageInfo + func (m *Seed) Reset() { *m = Seed{} } func (*Seed) ProtoMessage() {} func (*Seed) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{100} + return fileDescriptor_ca37af0df9a5bbd2, []int{101} } func (m *Seed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2884,7 +2912,7 @@ var xxx_messageInfo_Seed proto.InternalMessageInfo func (m *SeedBackup) Reset() { *m = SeedBackup{} } func (*SeedBackup) ProtoMessage() {} func (*SeedBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{101} + return fileDescriptor_ca37af0df9a5bbd2, []int{102} } func (m *SeedBackup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2912,7 +2940,7 @@ var xxx_messageInfo_SeedBackup proto.InternalMessageInfo func (m *SeedDNS) Reset() { *m = SeedDNS{} } func (*SeedDNS) ProtoMessage() {} func (*SeedDNS) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{102} + return fileDescriptor_ca37af0df9a5bbd2, []int{103} } func (m *SeedDNS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2940,7 +2968,7 @@ var xxx_messageInfo_SeedDNS proto.InternalMessageInfo func (m *SeedDNSProvider) Reset() { *m = SeedDNSProvider{} } func (*SeedDNSProvider) ProtoMessage() {} func (*SeedDNSProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{103} + return fileDescriptor_ca37af0df9a5bbd2, []int{104} } func (m *SeedDNSProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2968,7 +2996,7 @@ var xxx_messageInfo_SeedDNSProvider proto.InternalMessageInfo func (m *SeedList) Reset() { *m = SeedList{} } func (*SeedList) ProtoMessage() {} func (*SeedList) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{104} + return fileDescriptor_ca37af0df9a5bbd2, []int{105} } func (m *SeedList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2996,7 +3024,7 @@ var xxx_messageInfo_SeedList proto.InternalMessageInfo func (m *SeedNetworks) Reset() { *m = SeedNetworks{} } func (*SeedNetworks) ProtoMessage() {} func (*SeedNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{105} + return fileDescriptor_ca37af0df9a5bbd2, []int{106} } func (m *SeedNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3024,7 +3052,7 @@ var xxx_messageInfo_SeedNetworks proto.InternalMessageInfo func (m *SeedProvider) Reset() { *m = SeedProvider{} } func (*SeedProvider) ProtoMessage() {} func (*SeedProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{106} + return fileDescriptor_ca37af0df9a5bbd2, []int{107} } func (m *SeedProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3052,7 +3080,7 @@ var xxx_messageInfo_SeedProvider proto.InternalMessageInfo func (m *SeedSelector) Reset() { *m = SeedSelector{} } func (*SeedSelector) ProtoMessage() {} func (*SeedSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{107} + return fileDescriptor_ca37af0df9a5bbd2, []int{108} } func (m *SeedSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3077,10 +3105,94 @@ func (m *SeedSelector) XXX_DiscardUnknown() { var xxx_messageInfo_SeedSelector proto.InternalMessageInfo +func (m *SeedSettingDependencyWatchdog) Reset() { *m = SeedSettingDependencyWatchdog{} } +func (*SeedSettingDependencyWatchdog) ProtoMessage() {} +func (*SeedSettingDependencyWatchdog) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{109} +} +func (m *SeedSettingDependencyWatchdog) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdog) 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 *SeedSettingDependencyWatchdog) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdog.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdog) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdog) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdog.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdog proto.InternalMessageInfo + +func (m *SeedSettingDependencyWatchdogEndpoint) Reset() { *m = SeedSettingDependencyWatchdogEndpoint{} } +func (*SeedSettingDependencyWatchdogEndpoint) ProtoMessage() {} +func (*SeedSettingDependencyWatchdogEndpoint) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{110} +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdogEndpoint) 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 *SeedSettingDependencyWatchdogEndpoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdogEndpoint) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdogEndpoint proto.InternalMessageInfo + +func (m *SeedSettingDependencyWatchdogProbe) Reset() { *m = SeedSettingDependencyWatchdogProbe{} } +func (*SeedSettingDependencyWatchdogProbe) ProtoMessage() {} +func (*SeedSettingDependencyWatchdogProbe) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{111} +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingDependencyWatchdogProbe) 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 *SeedSettingDependencyWatchdogProbe) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingDependencyWatchdogProbe.Merge(m, src) +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingDependencyWatchdogProbe) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingDependencyWatchdogProbe.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingDependencyWatchdogProbe proto.InternalMessageInfo + func (m *SeedSettingExcessCapacityReservation) Reset() { *m = SeedSettingExcessCapacityReservation{} } func (*SeedSettingExcessCapacityReservation) ProtoMessage() {} func (*SeedSettingExcessCapacityReservation) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{108} + return fileDescriptor_ca37af0df9a5bbd2, []int{112} } func (m *SeedSettingExcessCapacityReservation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3108,7 +3220,7 @@ var xxx_messageInfo_SeedSettingExcessCapacityReservation proto.InternalMessageIn func (m *SeedSettingLoadBalancerServices) Reset() { *m = SeedSettingLoadBalancerServices{} } func (*SeedSettingLoadBalancerServices) ProtoMessage() {} func (*SeedSettingLoadBalancerServices) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{109} + return fileDescriptor_ca37af0df9a5bbd2, []int{113} } func (m *SeedSettingLoadBalancerServices) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3133,10 +3245,38 @@ func (m *SeedSettingLoadBalancerServices) XXX_DiscardUnknown() { var xxx_messageInfo_SeedSettingLoadBalancerServices proto.InternalMessageInfo +func (m *SeedSettingOwnerChecks) Reset() { *m = SeedSettingOwnerChecks{} } +func (*SeedSettingOwnerChecks) ProtoMessage() {} +func (*SeedSettingOwnerChecks) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{114} +} +func (m *SeedSettingOwnerChecks) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeedSettingOwnerChecks) 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 *SeedSettingOwnerChecks) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeedSettingOwnerChecks.Merge(m, src) +} +func (m *SeedSettingOwnerChecks) XXX_Size() int { + return m.Size() +} +func (m *SeedSettingOwnerChecks) XXX_DiscardUnknown() { + xxx_messageInfo_SeedSettingOwnerChecks.DiscardUnknown(m) +} + +var xxx_messageInfo_SeedSettingOwnerChecks proto.InternalMessageInfo + func (m *SeedSettingScheduling) Reset() { *m = SeedSettingScheduling{} } func (*SeedSettingScheduling) ProtoMessage() {} func (*SeedSettingScheduling) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{110} + return fileDescriptor_ca37af0df9a5bbd2, []int{115} } func (m *SeedSettingScheduling) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3164,7 +3304,7 @@ var xxx_messageInfo_SeedSettingScheduling proto.InternalMessageInfo func (m *SeedSettingShootDNS) Reset() { *m = SeedSettingShootDNS{} } func (*SeedSettingShootDNS) ProtoMessage() {} func (*SeedSettingShootDNS) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{111} + return fileDescriptor_ca37af0df9a5bbd2, []int{116} } func (m *SeedSettingShootDNS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3192,7 +3332,7 @@ var xxx_messageInfo_SeedSettingShootDNS proto.InternalMessageInfo func (m *SeedSettingVerticalPodAutoscaler) Reset() { *m = SeedSettingVerticalPodAutoscaler{} } func (*SeedSettingVerticalPodAutoscaler) ProtoMessage() {} func (*SeedSettingVerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{112} + return fileDescriptor_ca37af0df9a5bbd2, []int{117} } func (m *SeedSettingVerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3220,7 +3360,7 @@ var xxx_messageInfo_SeedSettingVerticalPodAutoscaler proto.InternalMessageInfo func (m *SeedSettings) Reset() { *m = SeedSettings{} } func (*SeedSettings) ProtoMessage() {} func (*SeedSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{113} + return fileDescriptor_ca37af0df9a5bbd2, []int{118} } func (m *SeedSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3248,7 +3388,7 @@ var xxx_messageInfo_SeedSettings proto.InternalMessageInfo func (m *SeedSpec) Reset() { *m = SeedSpec{} } func (*SeedSpec) ProtoMessage() {} func (*SeedSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{114} + return fileDescriptor_ca37af0df9a5bbd2, []int{119} } func (m *SeedSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3276,7 +3416,7 @@ var xxx_messageInfo_SeedSpec proto.InternalMessageInfo func (m *SeedStatus) Reset() { *m = SeedStatus{} } func (*SeedStatus) ProtoMessage() {} func (*SeedStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{115} + return fileDescriptor_ca37af0df9a5bbd2, []int{120} } func (m *SeedStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3304,7 +3444,7 @@ var xxx_messageInfo_SeedStatus proto.InternalMessageInfo func (m *SeedTaint) Reset() { *m = SeedTaint{} } func (*SeedTaint) ProtoMessage() {} func (*SeedTaint) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{116} + return fileDescriptor_ca37af0df9a5bbd2, []int{121} } func (m *SeedTaint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3332,7 +3472,7 @@ var xxx_messageInfo_SeedTaint proto.InternalMessageInfo func (m *SeedTemplate) Reset() { *m = SeedTemplate{} } func (*SeedTemplate) ProtoMessage() {} func (*SeedTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{117} + return fileDescriptor_ca37af0df9a5bbd2, []int{122} } func (m *SeedTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3360,7 +3500,7 @@ var xxx_messageInfo_SeedTemplate proto.InternalMessageInfo func (m *SeedVolume) Reset() { *m = SeedVolume{} } func (*SeedVolume) ProtoMessage() {} func (*SeedVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{118} + return fileDescriptor_ca37af0df9a5bbd2, []int{123} } func (m *SeedVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3388,7 +3528,7 @@ var xxx_messageInfo_SeedVolume proto.InternalMessageInfo func (m *SeedVolumeProvider) Reset() { *m = SeedVolumeProvider{} } func (*SeedVolumeProvider) ProtoMessage() {} func (*SeedVolumeProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{119} + return fileDescriptor_ca37af0df9a5bbd2, []int{124} } func (m *SeedVolumeProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3416,7 +3556,7 @@ var xxx_messageInfo_SeedVolumeProvider proto.InternalMessageInfo func (m *ServiceAccountConfig) Reset() { *m = ServiceAccountConfig{} } func (*ServiceAccountConfig) ProtoMessage() {} func (*ServiceAccountConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{120} + return fileDescriptor_ca37af0df9a5bbd2, []int{125} } func (m *ServiceAccountConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3444,7 +3584,7 @@ var xxx_messageInfo_ServiceAccountConfig proto.InternalMessageInfo func (m *Shoot) Reset() { *m = Shoot{} } func (*Shoot) ProtoMessage() {} func (*Shoot) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{121} + return fileDescriptor_ca37af0df9a5bbd2, []int{126} } func (m *Shoot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3472,7 +3612,7 @@ var xxx_messageInfo_Shoot proto.InternalMessageInfo func (m *ShootAdvertisedAddress) Reset() { *m = ShootAdvertisedAddress{} } func (*ShootAdvertisedAddress) ProtoMessage() {} func (*ShootAdvertisedAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{122} + return fileDescriptor_ca37af0df9a5bbd2, []int{127} } func (m *ShootAdvertisedAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3500,7 +3640,7 @@ var xxx_messageInfo_ShootAdvertisedAddress proto.InternalMessageInfo func (m *ShootList) Reset() { *m = ShootList{} } func (*ShootList) ProtoMessage() {} func (*ShootList) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{123} + return fileDescriptor_ca37af0df9a5bbd2, []int{128} } func (m *ShootList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3528,7 +3668,7 @@ var xxx_messageInfo_ShootList proto.InternalMessageInfo func (m *ShootMachineImage) Reset() { *m = ShootMachineImage{} } func (*ShootMachineImage) ProtoMessage() {} func (*ShootMachineImage) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{124} + return fileDescriptor_ca37af0df9a5bbd2, []int{129} } func (m *ShootMachineImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3556,7 +3696,7 @@ var xxx_messageInfo_ShootMachineImage proto.InternalMessageInfo func (m *ShootNetworks) Reset() { *m = ShootNetworks{} } func (*ShootNetworks) ProtoMessage() {} func (*ShootNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{125} + return fileDescriptor_ca37af0df9a5bbd2, []int{130} } func (m *ShootNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3584,7 +3724,7 @@ var xxx_messageInfo_ShootNetworks proto.InternalMessageInfo func (m *ShootSpec) Reset() { *m = ShootSpec{} } func (*ShootSpec) ProtoMessage() {} func (*ShootSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{126} + return fileDescriptor_ca37af0df9a5bbd2, []int{131} } func (m *ShootSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3612,7 +3752,7 @@ var xxx_messageInfo_ShootSpec proto.InternalMessageInfo func (m *ShootStatus) Reset() { *m = ShootStatus{} } func (*ShootStatus) ProtoMessage() {} func (*ShootStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{127} + return fileDescriptor_ca37af0df9a5bbd2, []int{132} } func (m *ShootStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3640,7 +3780,7 @@ var xxx_messageInfo_ShootStatus proto.InternalMessageInfo func (m *ShootTemplate) Reset() { *m = ShootTemplate{} } func (*ShootTemplate) ProtoMessage() {} func (*ShootTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{128} + return fileDescriptor_ca37af0df9a5bbd2, []int{133} } func (m *ShootTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3668,7 +3808,7 @@ var xxx_messageInfo_ShootTemplate proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{129} + return fileDescriptor_ca37af0df9a5bbd2, []int{134} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3696,7 +3836,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *VerticalPodAutoscaler) Reset() { *m = VerticalPodAutoscaler{} } func (*VerticalPodAutoscaler) ProtoMessage() {} func (*VerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{130} + return fileDescriptor_ca37af0df9a5bbd2, []int{135} } func (m *VerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3724,7 +3864,7 @@ var xxx_messageInfo_VerticalPodAutoscaler proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{131} + return fileDescriptor_ca37af0df9a5bbd2, []int{136} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3752,7 +3892,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeType) Reset() { *m = VolumeType{} } func (*VolumeType) ProtoMessage() {} func (*VolumeType) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{132} + return fileDescriptor_ca37af0df9a5bbd2, []int{137} } func (m *VolumeType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3780,7 +3920,7 @@ var xxx_messageInfo_VolumeType proto.InternalMessageInfo func (m *WatchCacheSizes) Reset() { *m = WatchCacheSizes{} } func (*WatchCacheSizes) ProtoMessage() {} func (*WatchCacheSizes) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{133} + return fileDescriptor_ca37af0df9a5bbd2, []int{138} } func (m *WatchCacheSizes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3808,7 +3948,7 @@ var xxx_messageInfo_WatchCacheSizes proto.InternalMessageInfo func (m *Worker) Reset() { *m = Worker{} } func (*Worker) ProtoMessage() {} func (*Worker) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{134} + return fileDescriptor_ca37af0df9a5bbd2, []int{139} } func (m *Worker) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3836,7 +3976,7 @@ var xxx_messageInfo_Worker proto.InternalMessageInfo func (m *WorkerKubernetes) Reset() { *m = WorkerKubernetes{} } func (*WorkerKubernetes) ProtoMessage() {} func (*WorkerKubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{135} + return fileDescriptor_ca37af0df9a5bbd2, []int{140} } func (m *WorkerKubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3864,7 +4004,7 @@ var xxx_messageInfo_WorkerKubernetes proto.InternalMessageInfo func (m *WorkerSystemComponents) Reset() { *m = WorkerSystemComponents{} } func (*WorkerSystemComponents) ProtoMessage() {} func (*WorkerSystemComponents) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{136} + return fileDescriptor_ca37af0df9a5bbd2, []int{141} } func (m *WorkerSystemComponents) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3997,6 +4137,7 @@ func init() { proto.RegisterType((*ResourceWatchCacheSize)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ResourceWatchCacheSize") proto.RegisterType((*SecretBinding)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SecretBinding") proto.RegisterType((*SecretBindingList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SecretBindingList") + proto.RegisterType((*SecretBindingProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SecretBindingProvider") proto.RegisterType((*Seed)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.Seed") proto.RegisterType((*SeedBackup)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedBackup") proto.RegisterType((*SeedDNS)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedDNS") @@ -4005,9 +4146,13 @@ func init() { proto.RegisterType((*SeedNetworks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedNetworks") proto.RegisterType((*SeedProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedProvider") proto.RegisterType((*SeedSelector)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSelector") + proto.RegisterType((*SeedSettingDependencyWatchdog)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingDependencyWatchdog") + proto.RegisterType((*SeedSettingDependencyWatchdogEndpoint)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingDependencyWatchdogEndpoint") + proto.RegisterType((*SeedSettingDependencyWatchdogProbe)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingDependencyWatchdogProbe") proto.RegisterType((*SeedSettingExcessCapacityReservation)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingExcessCapacityReservation") proto.RegisterType((*SeedSettingLoadBalancerServices)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingLoadBalancerServices") proto.RegisterMapType((map[string]string)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingLoadBalancerServices.AnnotationsEntry") + proto.RegisterType((*SeedSettingOwnerChecks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingOwnerChecks") proto.RegisterType((*SeedSettingScheduling)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingScheduling") proto.RegisterType((*SeedSettingShootDNS)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingShootDNS") proto.RegisterType((*SeedSettingVerticalPodAutoscaler)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedSettingVerticalPodAutoscaler") @@ -4046,594 +4191,608 @@ func init() { } var fileDescriptor_ca37af0df9a5bbd2 = []byte{ - // 9377 bytes of a gzipped FileDescriptorProto + // 9607 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0xd8, 0xf5, 0x90, 0x43, 0x0e, 0xdf, 0x90, 0x5c, 0xb2, 0xf6, 0xe3, 0x78, 0xbc, 0xbb, 0x9d, - 0x55, 0xeb, 0x24, 0xec, 0x45, 0x12, 0xd7, 0x77, 0x92, 0x7c, 0xba, 0x3b, 0x9d, 0xee, 0x38, 0x43, - 0xee, 0xee, 0x68, 0x97, 0xbb, 0xbc, 0x9a, 0xe5, 0xdd, 0xe9, 0xec, 0x5c, 0xd4, 0xec, 0x2e, 0x0e, - 0xfb, 0xd8, 0xd3, 0x3d, 0xd7, 0xdd, 0xc3, 0x25, 0x57, 0x0e, 0x24, 0x0b, 0x96, 0x1d, 0xc7, 0x49, - 0x60, 0x38, 0x71, 0x04, 0x4b, 0x0e, 0x2c, 0x23, 0x08, 0xe4, 0xc0, 0x81, 0xed, 0x24, 0xb0, 0x11, - 0xe7, 0x03, 0x30, 0x6c, 0x04, 0x56, 0x84, 0x24, 0x50, 0x1c, 0x08, 0x56, 0x3e, 0x4c, 0x45, 0x0c, - 0xa0, 0x24, 0x48, 0x7e, 0x24, 0x30, 0x82, 0x00, 0x0b, 0x03, 0x31, 0xea, 0xa3, 0xab, 0xab, 0xbf, - 0xb8, 0xc3, 0x9e, 0x25, 0xef, 0xee, 0x17, 0x39, 0xf5, 0xaa, 0xde, 0xab, 0xae, 0x7a, 0xf5, 0xea, - 0xbd, 0x57, 0xaf, 0x5e, 0x41, 0xb3, 0x6b, 0x87, 0xdb, 0x83, 0xcd, 0x25, 0xd3, 0xeb, 0x5d, 0xe9, - 0x1a, 0xbe, 0x45, 0x5c, 0xe2, 0xc7, 0xff, 0xf4, 0x77, 0xba, 0x57, 0x8c, 0xbe, 0x1d, 0x5c, 0x31, - 0x3d, 0x9f, 0x5c, 0xd9, 0x7d, 0x66, 0x93, 0x84, 0xc6, 0x33, 0x57, 0xba, 0x14, 0x66, 0x84, 0xc4, - 0x5a, 0xea, 0xfb, 0x5e, 0xe8, 0xa1, 0x67, 0x63, 0x1c, 0x4b, 0x51, 0xd3, 0xf8, 0x9f, 0xfe, 0x4e, - 0x77, 0x89, 0xe2, 0x58, 0xa2, 0x38, 0x96, 0x04, 0x8e, 0xc5, 0x8f, 0xa9, 0x74, 0xbd, 0xae, 0x77, - 0x85, 0xa1, 0xda, 0x1c, 0x6c, 0xb1, 0x5f, 0xec, 0x07, 0xfb, 0x8f, 0x93, 0x58, 0x7c, 0x7a, 0xe7, - 0x53, 0xc1, 0x92, 0xed, 0xd1, 0xce, 0x5c, 0x31, 0x06, 0xa1, 0x17, 0x98, 0x86, 0x63, 0xbb, 0xdd, - 0x2b, 0xbb, 0x99, 0xde, 0x2c, 0xea, 0x4a, 0x55, 0xd1, 0xed, 0x23, 0xeb, 0xf8, 0x9b, 0x86, 0x99, - 0x57, 0xe7, 0x13, 0x71, 0x9d, 0x9e, 0x61, 0x6e, 0xdb, 0x2e, 0xf1, 0xf7, 0xa3, 0x01, 0xb9, 0xe2, - 0x93, 0xc0, 0x1b, 0xf8, 0x26, 0x39, 0x56, 0xab, 0xe0, 0x4a, 0x8f, 0x84, 0x46, 0x1e, 0xad, 0x2b, - 0x45, 0xad, 0xfc, 0x81, 0x1b, 0xda, 0xbd, 0x2c, 0x99, 0x1f, 0x7d, 0x50, 0x83, 0xc0, 0xdc, 0x26, - 0x3d, 0x23, 0xd3, 0xee, 0xe3, 0x45, 0xed, 0x06, 0xa1, 0xed, 0x5c, 0xb1, 0xdd, 0x30, 0x08, 0xfd, - 0x74, 0x23, 0xfd, 0x59, 0xa8, 0x2e, 0x5b, 0x96, 0xe7, 0xa2, 0xa7, 0x61, 0x92, 0xb8, 0xc6, 0xa6, - 0x43, 0xac, 0x05, 0xed, 0x92, 0x76, 0xb9, 0xd6, 0x3c, 0xf3, 0xad, 0x83, 0xc6, 0x23, 0x87, 0x07, - 0x8d, 0xc9, 0x55, 0x5e, 0x8c, 0x23, 0xb8, 0xfe, 0x8b, 0x15, 0x98, 0x60, 0x8d, 0x02, 0xf4, 0x0b, - 0x1a, 0x9c, 0xdd, 0x19, 0x6c, 0x12, 0xdf, 0x25, 0x21, 0x09, 0x56, 0x8c, 0x60, 0x7b, 0xd3, 0x33, - 0x7c, 0x8e, 0xa2, 0xfe, 0xec, 0xb5, 0xa5, 0xe3, 0x73, 0xcf, 0xd2, 0x8d, 0x2c, 0xba, 0xe6, 0xa3, - 0x87, 0x07, 0x8d, 0xb3, 0x39, 0x00, 0x9c, 0x47, 0x1c, 0xed, 0xc2, 0xb4, 0xdb, 0xb5, 0xdd, 0xbd, - 0xb6, 0xdb, 0xf5, 0x49, 0x10, 0x2c, 0x54, 0x58, 0x67, 0x5e, 0x29, 0xd3, 0x99, 0x5b, 0x0a, 0x9e, - 0xe6, 0xdc, 0xe1, 0x41, 0x63, 0x5a, 0x2d, 0xc1, 0x09, 0x3a, 0xfa, 0x4f, 0x6b, 0x70, 0x66, 0xd9, - 0xea, 0xd9, 0x41, 0x60, 0x7b, 0xee, 0xba, 0x33, 0xe8, 0xda, 0x2e, 0xba, 0x04, 0xe3, 0xae, 0xd1, - 0x23, 0x6c, 0x40, 0xa6, 0x9a, 0xd3, 0x62, 0x4c, 0xc7, 0x6f, 0x19, 0x3d, 0x82, 0x19, 0x04, 0xbd, - 0x0a, 0x13, 0xa6, 0xe7, 0x6e, 0xd9, 0x5d, 0xd1, 0xcf, 0x8f, 0x2d, 0xf1, 0x79, 0x5c, 0x52, 0xe7, - 0x91, 0x75, 0x4f, 0xcc, 0xff, 0x12, 0x36, 0xee, 0xae, 0xee, 0x85, 0xc4, 0xa5, 0x64, 0x9a, 0x70, - 0x78, 0xd0, 0x98, 0x68, 0x31, 0x04, 0x58, 0x20, 0xd2, 0xaf, 0x42, 0x6d, 0xd9, 0x21, 0x7e, 0x68, - 0xbb, 0x5d, 0xf4, 0x02, 0xcc, 0x92, 0x9e, 0x61, 0x3b, 0x98, 0x98, 0xc4, 0xde, 0x25, 0x7e, 0xb0, - 0xa0, 0x5d, 0x1a, 0xbb, 0x3c, 0xd5, 0x44, 0x87, 0x07, 0x8d, 0xd9, 0xd5, 0x04, 0x04, 0xa7, 0x6a, - 0xea, 0x3f, 0xa9, 0x41, 0x7d, 0x79, 0x60, 0xd9, 0x21, 0xc7, 0x8f, 0x7c, 0xa8, 0x1b, 0xf4, 0xe7, - 0xba, 0xe7, 0xd8, 0xe6, 0xbe, 0x98, 0xe4, 0x97, 0xcb, 0x8c, 0xeb, 0x72, 0x8c, 0xa6, 0x79, 0xe6, - 0xf0, 0xa0, 0x51, 0x57, 0x0a, 0xb0, 0x4a, 0x44, 0xdf, 0x06, 0x15, 0x86, 0x3e, 0x07, 0xd3, 0xfc, - 0x23, 0xd7, 0x8c, 0x3e, 0x26, 0x5b, 0xa2, 0x0f, 0x1f, 0x54, 0xc6, 0x2c, 0x22, 0xb4, 0x74, 0x7b, - 0xf3, 0x6d, 0x62, 0x86, 0x98, 0x6c, 0x11, 0x9f, 0xb8, 0x26, 0xe1, 0xd3, 0xd7, 0x52, 0x1a, 0xe3, - 0x04, 0x2a, 0xfd, 0xfb, 0x1a, 0xcc, 0x2d, 0xef, 0x1a, 0xb6, 0x63, 0x6c, 0xda, 0x8e, 0x1d, 0xee, - 0xbf, 0xe9, 0xb9, 0x64, 0x88, 0xf9, 0xdb, 0x80, 0x47, 0x07, 0xae, 0xc1, 0xdb, 0x39, 0x64, 0x8d, - 0xcf, 0xd8, 0x9d, 0xfd, 0x3e, 0xa1, 0x8c, 0x47, 0x47, 0xfa, 0xf1, 0xc3, 0x83, 0xc6, 0xa3, 0x1b, - 0xf9, 0x55, 0x70, 0x51, 0x5b, 0x84, 0xe1, 0x82, 0x02, 0x7a, 0xcd, 0x73, 0x06, 0x3d, 0x81, 0x75, - 0x8c, 0x61, 0x5d, 0x3c, 0x3c, 0x68, 0x5c, 0xd8, 0xc8, 0xad, 0x81, 0x0b, 0x5a, 0xea, 0xdf, 0xaa, - 0xc0, 0x74, 0xd3, 0x30, 0x77, 0x06, 0xfd, 0xe6, 0xc0, 0xdc, 0x21, 0x21, 0xfa, 0x3c, 0xd4, 0xa8, - 0xd8, 0xb2, 0x8c, 0xd0, 0x10, 0x23, 0xf9, 0x23, 0x85, 0xdc, 0xc7, 0x26, 0x91, 0xd6, 0x8e, 0xc7, - 0x76, 0x8d, 0x84, 0x46, 0x13, 0x89, 0x31, 0x81, 0xb8, 0x0c, 0x4b, 0xac, 0x68, 0x0b, 0xc6, 0x83, - 0x3e, 0x31, 0x05, 0x6f, 0xaf, 0x94, 0xe1, 0x15, 0xb5, 0xc7, 0x9d, 0x3e, 0x31, 0xe3, 0x59, 0xa0, - 0xbf, 0x30, 0xc3, 0x8f, 0x5c, 0x98, 0x08, 0x42, 0x23, 0x1c, 0xd0, 0xe1, 0xa1, 0x94, 0xae, 0x8e, - 0x4c, 0x89, 0x61, 0x6b, 0xce, 0x0a, 0x5a, 0x13, 0xfc, 0x37, 0x16, 0x54, 0xf4, 0x3f, 0xd6, 0x60, - 0x4e, 0xad, 0x7e, 0xd3, 0x0e, 0x42, 0xf4, 0xe3, 0x99, 0xe1, 0x5c, 0x1a, 0x6e, 0x38, 0x69, 0x6b, - 0x36, 0x98, 0x73, 0x82, 0x5c, 0x2d, 0x2a, 0x51, 0x86, 0x92, 0x40, 0xd5, 0x0e, 0x49, 0x8f, 0xb3, - 0x55, 0x49, 0x79, 0xa6, 0x76, 0xb9, 0x39, 0x23, 0x88, 0x55, 0xdb, 0x14, 0x2d, 0xe6, 0xd8, 0xf5, - 0xcf, 0xc3, 0x39, 0xb5, 0xd6, 0xba, 0xef, 0xed, 0xda, 0x16, 0xf1, 0xe9, 0x4a, 0x08, 0xf7, 0xfb, - 0x99, 0x95, 0x40, 0x39, 0x0b, 0x33, 0x08, 0xfa, 0x30, 0x4c, 0xf8, 0xa4, 0x6b, 0x7b, 0x2e, 0x9b, - 0xed, 0xa9, 0x78, 0xec, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0xff, 0xdf, 0x4a, 0x72, 0xec, 0xe8, 0x34, - 0xa2, 0x5d, 0xa8, 0xf5, 0x05, 0x29, 0x31, 0x76, 0xd7, 0x47, 0xfd, 0xc0, 0xa8, 0xeb, 0xf1, 0xa8, - 0x46, 0x25, 0x58, 0xd2, 0x42, 0x36, 0xcc, 0x46, 0xff, 0xb7, 0x46, 0x10, 0xc3, 0x4c, 0x9c, 0xae, - 0x27, 0x10, 0xe1, 0x14, 0x62, 0x74, 0x07, 0xa6, 0x02, 0x62, 0xfa, 0x84, 0xca, 0x24, 0xc1, 0xa6, - 0xb9, 0x82, 0xab, 0x13, 0x55, 0x12, 0x82, 0x6b, 0x5e, 0x74, 0x7f, 0x4a, 0x02, 0x70, 0x8c, 0x08, - 0x5d, 0x86, 0x5a, 0x40, 0x88, 0x45, 0x25, 0xd2, 0xc2, 0x38, 0x9f, 0x1b, 0xfa, 0xa9, 0x1d, 0x51, - 0x86, 0x25, 0x54, 0xff, 0xc6, 0x38, 0xa0, 0x2c, 0x8b, 0xab, 0x23, 0xc0, 0x4b, 0xc4, 0xf8, 0x8f, - 0x32, 0x02, 0x62, 0xb5, 0xa4, 0x10, 0xa3, 0x7b, 0x30, 0xe3, 0x18, 0x41, 0x78, 0xbb, 0x4f, 0x75, - 0x90, 0x88, 0x51, 0xea, 0xcf, 0x2e, 0x97, 0x99, 0xe9, 0x9b, 0x2a, 0xa2, 0xe6, 0xfc, 0xe1, 0x41, - 0x63, 0x26, 0x51, 0x84, 0x93, 0xa4, 0xd0, 0xdb, 0x30, 0x45, 0x0b, 0x56, 0x7d, 0xdf, 0xf3, 0xc5, - 0xe8, 0xbf, 0x54, 0x96, 0x2e, 0x43, 0xd2, 0x9c, 0xa1, 0x73, 0x22, 0x7f, 0xe2, 0x18, 0x3d, 0xfa, - 0x2c, 0x20, 0x6f, 0x33, 0x20, 0xfe, 0x2e, 0xb1, 0xae, 0x71, 0x85, 0x8b, 0x7e, 0x2c, 0x9d, 0x9d, - 0xb1, 0xe6, 0xa2, 0x98, 0x4d, 0x74, 0x3b, 0x53, 0x03, 0xe7, 0xb4, 0x42, 0x3b, 0x80, 0xa4, 0xd2, - 0x26, 0x19, 0x60, 0xa1, 0x3a, 0x3c, 0xfb, 0x5c, 0xa0, 0xc4, 0xae, 0x65, 0x50, 0xe0, 0x1c, 0xb4, - 0xfa, 0xbf, 0xac, 0x40, 0x9d, 0xb3, 0xc8, 0xaa, 0x1b, 0xfa, 0xfb, 0xa7, 0xb0, 0x41, 0x90, 0xc4, - 0x06, 0xd1, 0x2a, 0xbf, 0xe6, 0x59, 0x87, 0x0b, 0xf7, 0x87, 0x5e, 0x6a, 0x7f, 0x58, 0x1d, 0x95, - 0xd0, 0xd1, 0xdb, 0xc3, 0x77, 0x35, 0x38, 0xa3, 0xd4, 0x3e, 0x85, 0xdd, 0xc1, 0x4a, 0xee, 0x0e, - 0x2f, 0x8f, 0xf8, 0x7d, 0x05, 0x9b, 0x83, 0x97, 0xf8, 0x2c, 0x26, 0xb8, 0x9f, 0x05, 0xd8, 0x64, - 0xe2, 0xe4, 0x56, 0xac, 0x27, 0xc9, 0x29, 0x6f, 0x4a, 0x08, 0x56, 0x6a, 0x25, 0x64, 0x56, 0xe5, - 0x48, 0x99, 0xf5, 0x7f, 0x2a, 0x30, 0x9f, 0x19, 0xf6, 0xac, 0x1c, 0xd1, 0xde, 0x25, 0x39, 0x52, - 0x79, 0x37, 0xe4, 0xc8, 0x58, 0x29, 0x39, 0x32, 0xfc, 0x3e, 0xf1, 0xfb, 0x1a, 0x8c, 0xb5, 0x70, - 0x1b, 0x7d, 0x24, 0xa1, 0xfb, 0x3e, 0xaa, 0xea, 0xbe, 0xf7, 0x0f, 0x1a, 0x93, 0x2d, 0xdc, 0x56, - 0xd4, 0xe0, 0xbf, 0xae, 0xc1, 0xbc, 0xe9, 0xb9, 0xa1, 0x41, 0x99, 0x18, 0xf3, 0x0d, 0x22, 0x62, - 0xc6, 0x52, 0x6a, 0x5f, 0x2b, 0x85, 0xac, 0xf9, 0x98, 0xe8, 0xc0, 0x7c, 0x1a, 0x12, 0xe0, 0x2c, - 0x65, 0x7d, 0x03, 0xa6, 0x5a, 0x8e, 0x37, 0xb0, 0xda, 0xee, 0x96, 0xf7, 0x10, 0x75, 0x97, 0xef, - 0x69, 0x30, 0xcd, 0xf0, 0xae, 0xfb, 0xde, 0x96, 0xed, 0x90, 0xf7, 0x87, 0x0a, 0xad, 0xf6, 0xb8, - 0x48, 0x44, 0x32, 0x95, 0x56, 0xad, 0xf8, 0x3e, 0x51, 0x69, 0xd5, 0x2e, 0x17, 0x48, 0xad, 0x5f, - 0x9c, 0x4c, 0x7e, 0x19, 0x93, 0x5b, 0x97, 0xa1, 0x66, 0x1a, 0xcd, 0x81, 0x6b, 0x39, 0x92, 0x2f, - 0x68, 0x2f, 0x5b, 0xcb, 0xbc, 0x0c, 0x4b, 0x28, 0xba, 0x07, 0x10, 0xbb, 0x19, 0xc4, 0x34, 0x5c, - 0x1d, 0xcd, 0xb5, 0xd1, 0x21, 0x21, 0xb5, 0xce, 0x83, 0x78, 0xea, 0x63, 0x18, 0x56, 0xa8, 0xa1, - 0xbf, 0x0c, 0x33, 0x62, 0x90, 0xdb, 0x3d, 0xa3, 0x2b, 0xac, 0xbf, 0x92, 0x23, 0xb5, 0xa6, 0x20, - 0x6a, 0x9e, 0x17, 0x84, 0x67, 0xd4, 0xd2, 0x00, 0x27, 0xa9, 0xa1, 0x7d, 0x98, 0xee, 0xa9, 0x16, - 0xed, 0x78, 0xf9, 0xcd, 0x45, 0xb1, 0x6e, 0x9b, 0xe7, 0x04, 0xf1, 0xe9, 0x84, 0x2d, 0x9c, 0x20, - 0x95, 0xa3, 0x98, 0x57, 0x4f, 0x4a, 0x31, 0x27, 0x30, 0xc9, 0x97, 0x77, 0xb0, 0x30, 0xc1, 0x3e, - 0xf0, 0x85, 0x32, 0x1f, 0xc8, 0x25, 0x45, 0xec, 0x37, 0xe3, 0xbf, 0x03, 0x1c, 0xe1, 0x46, 0xbb, - 0x30, 0x4d, 0x65, 0x6c, 0x87, 0x38, 0xc4, 0x0c, 0x3d, 0x7f, 0x61, 0xb2, 0xbc, 0x5f, 0xaa, 0xa3, - 0xe0, 0xe1, 0x8e, 0x0d, 0xb5, 0x04, 0x27, 0xe8, 0x48, 0xe9, 0x57, 0x2b, 0x94, 0x7e, 0x03, 0xa8, - 0xef, 0x2a, 0x1e, 0x86, 0x29, 0x36, 0x08, 0x9f, 0x29, 0xd3, 0xb1, 0xd8, 0xdd, 0xd0, 0x3c, 0x2b, - 0x08, 0xd5, 0x55, 0xd7, 0x84, 0x4a, 0x47, 0xff, 0xb5, 0x1a, 0xcc, 0xb7, 0x9c, 0x41, 0x10, 0x12, - 0x7f, 0x59, 0x38, 0x7e, 0x89, 0x8f, 0xbe, 0xac, 0xc1, 0x05, 0xf6, 0xef, 0x8a, 0x77, 0xd7, 0x5d, - 0x21, 0x8e, 0xb1, 0xbf, 0xbc, 0x45, 0x6b, 0x58, 0xd6, 0xf1, 0x24, 0xd0, 0xca, 0x40, 0xec, 0xe9, - 0xcc, 0x55, 0xd2, 0xc9, 0xc5, 0x88, 0x0b, 0x28, 0xa1, 0x9f, 0xd3, 0xe0, 0xb1, 0x1c, 0xd0, 0x0a, - 0x71, 0x48, 0x48, 0x84, 0x0c, 0x38, 0x6e, 0x3f, 0x9e, 0x3c, 0x3c, 0x68, 0x3c, 0xd6, 0x29, 0x42, - 0x8a, 0x8b, 0xe9, 0xa1, 0xbf, 0xa1, 0xc1, 0x62, 0x0e, 0xf4, 0xaa, 0x61, 0x3b, 0x03, 0x9f, 0x08, - 0x95, 0xf6, 0xb8, 0xdd, 0xb9, 0x78, 0x78, 0xd0, 0x58, 0xec, 0x14, 0x62, 0xc5, 0x47, 0x50, 0x44, - 0x5f, 0x84, 0xf3, 0x12, 0xba, 0xe1, 0xba, 0x84, 0x58, 0xc4, 0xba, 0x63, 0x0b, 0xcd, 0xe2, 0xf8, - 0x5d, 0x79, 0xec, 0xf0, 0xa0, 0x71, 0xbe, 0x93, 0x87, 0x10, 0xe7, 0xd3, 0x41, 0x5d, 0x78, 0x32, - 0x06, 0x84, 0xb6, 0x63, 0xdf, 0x63, 0x98, 0xee, 0x6c, 0xfb, 0x24, 0xd8, 0xf6, 0x1c, 0x8b, 0x09, - 0x0b, 0xad, 0xf9, 0x81, 0xc3, 0x83, 0xc6, 0x93, 0x9d, 0xa3, 0x2a, 0xe2, 0xa3, 0xf1, 0x20, 0x0b, - 0xa6, 0x03, 0xd3, 0x70, 0xdb, 0x6e, 0x48, 0xfc, 0x5d, 0xc3, 0x59, 0x98, 0x28, 0xf5, 0x81, 0x7c, - 0x89, 0x2a, 0x78, 0x70, 0x02, 0x2b, 0xfa, 0x14, 0xd4, 0xc8, 0x5e, 0xdf, 0x70, 0x2d, 0xc2, 0xc5, - 0xc2, 0x54, 0xf3, 0x09, 0xba, 0x19, 0xad, 0x8a, 0xb2, 0xfb, 0x07, 0x8d, 0xe9, 0xe8, 0xff, 0x35, - 0xcf, 0x22, 0x58, 0xd6, 0x46, 0x3f, 0x01, 0xe7, 0x7a, 0xc6, 0xde, 0x2d, 0xcf, 0x22, 0x4c, 0xc8, - 0x51, 0x99, 0xc7, 0x26, 0xa2, 0x56, 0xaa, 0x9f, 0x0b, 0x87, 0x07, 0x8d, 0x73, 0x6b, 0x39, 0xf8, - 0x70, 0x2e, 0x15, 0x3a, 0x0d, 0x3d, 0x63, 0xef, 0x9a, 0x6f, 0x98, 0x64, 0x6b, 0xe0, 0xdc, 0x21, - 0x7e, 0xcf, 0x76, 0x19, 0xa6, 0x0e, 0x31, 0x3d, 0xd7, 0xa2, 0xa2, 0x44, 0xbb, 0x5c, 0xe5, 0xd3, - 0xb0, 0x76, 0x54, 0x45, 0x7c, 0x34, 0x1e, 0xfd, 0x7f, 0x68, 0x50, 0x17, 0xa2, 0x82, 0x69, 0x74, - 0x9b, 0x50, 0x35, 0xe9, 0x8e, 0x2e, 0x44, 0xc2, 0x4b, 0xa5, 0x35, 0x07, 0x8a, 0x2d, 0x56, 0x1b, - 0x58, 0x11, 0xe6, 0xa8, 0xd1, 0x6e, 0xce, 0xbe, 0xdf, 0x1c, 0x6d, 0xdf, 0x67, 0xd4, 0x1e, 0xb0, - 0xe7, 0xeb, 0x07, 0x63, 0x30, 0xd5, 0xf2, 0x5c, 0xcb, 0x66, 0x7a, 0xfb, 0x33, 0x09, 0xdd, 0xf5, - 0x49, 0x55, 0x7a, 0xdf, 0x3f, 0x68, 0xcc, 0xc8, 0x8a, 0x8a, 0x38, 0x7f, 0x5e, 0x1a, 0xbb, 0x5c, - 0x99, 0xfd, 0x40, 0xd2, 0x4a, 0xbd, 0x7f, 0xd0, 0x38, 0x23, 0x9b, 0x25, 0x0d, 0x57, 0xb4, 0x0b, - 0x88, 0x9a, 0x1f, 0x77, 0x7c, 0xc3, 0x0d, 0x38, 0x5a, 0xca, 0x4c, 0x5c, 0xc0, 0xfc, 0x85, 0xe1, - 0x98, 0x89, 0xb6, 0x88, 0xad, 0x93, 0x9b, 0x19, 0x6c, 0x38, 0x87, 0x02, 0x7a, 0x1b, 0x66, 0x69, - 0xe9, 0x46, 0xdf, 0x32, 0x42, 0xa2, 0x48, 0x92, 0xe3, 0xd0, 0xbc, 0x20, 0x68, 0xce, 0xde, 0x4c, - 0x60, 0xc2, 0x29, 0xcc, 0x5c, 0xd7, 0x37, 0x02, 0xcf, 0x65, 0x42, 0x22, 0xa1, 0xeb, 0xd3, 0x52, - 0x2c, 0xa0, 0xe8, 0x69, 0x98, 0xec, 0x91, 0x20, 0x30, 0xba, 0x84, 0xad, 0xfa, 0xa9, 0x78, 0x6b, - 0x5f, 0xe3, 0xc5, 0x38, 0x82, 0xa3, 0x8f, 0x42, 0xd5, 0xf4, 0x2c, 0x12, 0x2c, 0x4c, 0x32, 0xe7, - 0xfc, 0x05, 0xc6, 0x4b, 0xb4, 0xe0, 0xfe, 0x41, 0x63, 0x8a, 0xd9, 0x72, 0xf4, 0x17, 0xe6, 0x95, - 0xf4, 0x5f, 0xa1, 0x9a, 0x76, 0xca, 0x62, 0x19, 0xc2, 0x46, 0x39, 0x3d, 0x57, 0xa5, 0xfe, 0xb3, - 0x15, 0x38, 0x47, 0x7b, 0xe8, 0x7b, 0x8e, 0x43, 0x77, 0xa1, 0xbe, 0xe3, 0xed, 0xf7, 0x88, 0x7b, - 0x1a, 0x27, 0x06, 0xd1, 0x38, 0x54, 0x0a, 0xc7, 0xa1, 0x97, 0x19, 0x87, 0xb1, 0x32, 0xe3, 0x20, - 0xd9, 0xe5, 0x01, 0x63, 0xf1, 0xdf, 0x34, 0x58, 0xc8, 0x1b, 0x8b, 0x53, 0xb0, 0x8f, 0x7a, 0x49, - 0xfb, 0xe8, 0x7a, 0x59, 0x3b, 0x3a, 0xdd, 0xf5, 0x02, 0x3b, 0xe9, 0x87, 0x15, 0xb8, 0x10, 0x57, - 0x6f, 0xbb, 0x41, 0x68, 0x38, 0x0e, 0xf7, 0x1e, 0x9c, 0xfc, 0xbc, 0xf7, 0x13, 0x66, 0xee, 0xad, - 0xd1, 0x3e, 0x55, 0xed, 0x7b, 0xa1, 0x4f, 0x70, 0x2f, 0xe5, 0x13, 0x5c, 0x7f, 0x88, 0x34, 0x8f, - 0x76, 0x0f, 0xfe, 0x4f, 0x0d, 0x16, 0xf3, 0x1b, 0x9e, 0x02, 0x53, 0x79, 0x49, 0xa6, 0xfa, 0xec, - 0xc3, 0xfb, 0xea, 0x02, 0xb6, 0xfa, 0x47, 0x95, 0xa2, 0xaf, 0x65, 0x86, 0xf8, 0x16, 0x9c, 0xa1, - 0x16, 0x52, 0x10, 0x0a, 0xe7, 0xd5, 0xf1, 0x4e, 0x75, 0x23, 0xb7, 0xd4, 0x19, 0x9c, 0xc4, 0x81, - 0xd3, 0x48, 0xd1, 0x2d, 0x98, 0xa4, 0x66, 0x11, 0xc5, 0x5f, 0x19, 0x1e, 0xbf, 0x94, 0xf9, 0x1d, - 0xde, 0x16, 0x47, 0x48, 0xd0, 0x8f, 0xc3, 0x8c, 0x25, 0x57, 0xd4, 0x03, 0x8e, 0x74, 0xd2, 0x58, - 0x99, 0x9b, 0x71, 0x45, 0x6d, 0x8d, 0x93, 0xc8, 0xf4, 0x3f, 0xd3, 0xe0, 0x89, 0xa3, 0x78, 0x0b, - 0xbd, 0x03, 0x60, 0x46, 0x9b, 0x38, 0x3f, 0xd4, 0x2f, 0xab, 0x06, 0x45, 0x58, 0xe2, 0x05, 0x2a, - 0x8b, 0x02, 0xac, 0x10, 0xc9, 0x39, 0x29, 0xaa, 0x9c, 0xd0, 0x49, 0x91, 0xfe, 0xbf, 0x34, 0x55, - 0x14, 0xa9, 0x73, 0xfb, 0x7e, 0x13, 0x45, 0x6a, 0xdf, 0x0b, 0x7d, 0x6f, 0xff, 0xbe, 0x02, 0x97, - 0xf2, 0x9b, 0x28, 0x7b, 0xef, 0x2b, 0x30, 0xd1, 0xe7, 0x91, 0x17, 0x63, 0x6c, 0x6f, 0xbc, 0x4c, - 0x25, 0x0b, 0x8f, 0x8b, 0xb8, 0x7f, 0xd0, 0x58, 0xcc, 0x13, 0xf4, 0x22, 0xa2, 0x42, 0xb4, 0x43, - 0x76, 0xca, 0x03, 0xc1, 0x75, 0xac, 0x8f, 0x0f, 0x29, 0x5c, 0x8c, 0x4d, 0xe2, 0x0c, 0xed, 0x74, - 0xf8, 0x49, 0x0d, 0x66, 0x13, 0x1c, 0x1d, 0x2c, 0x54, 0x19, 0x8f, 0x96, 0x72, 0xd2, 0x27, 0x96, - 0x4a, 0xbc, 0x73, 0x27, 0x8a, 0x03, 0x9c, 0x22, 0x98, 0x12, 0xb3, 0xea, 0xa8, 0xbe, 0xef, 0xc4, - 0xac, 0xda, 0xf9, 0x02, 0x31, 0xfb, 0xcb, 0x95, 0xa2, 0xaf, 0x65, 0x62, 0xf6, 0x2e, 0x4c, 0x45, - 0x91, 0x6d, 0x91, 0xb8, 0xb8, 0x3a, 0x6a, 0x9f, 0x38, 0xba, 0xf8, 0x80, 0x3a, 0x2a, 0x09, 0x70, - 0x4c, 0x0b, 0xfd, 0x94, 0x06, 0x10, 0x4f, 0x8c, 0x58, 0x54, 0x77, 0x1e, 0xde, 0x70, 0x28, 0x6a, - 0xcd, 0x2c, 0x5d, 0xd2, 0x0a, 0x53, 0x28, 0x74, 0xf5, 0xdf, 0xaa, 0x00, 0xca, 0xf6, 0x9d, 0xaa, - 0x9b, 0x3b, 0xb6, 0x6b, 0xa5, 0xd5, 0xee, 0x1b, 0xb6, 0x6b, 0x61, 0x06, 0x19, 0x42, 0x21, 0x7d, - 0x09, 0xce, 0x74, 0x1d, 0x6f, 0xd3, 0x70, 0x9c, 0x7d, 0x11, 0x2c, 0xc7, 0x56, 0x68, 0xad, 0x79, - 0x96, 0x6e, 0x4c, 0xd7, 0x92, 0x20, 0x9c, 0xae, 0x8b, 0xfa, 0x30, 0xe7, 0x53, 0x33, 0xd7, 0xb4, - 0x1d, 0x66, 0xa0, 0x78, 0x83, 0xb0, 0xa4, 0x1f, 0xe5, 0xdc, 0xe1, 0x41, 0x63, 0x0e, 0xa7, 0x70, - 0xe1, 0x0c, 0x76, 0xf4, 0x21, 0x98, 0xec, 0xfb, 0x76, 0xcf, 0xf0, 0xf7, 0x99, 0x09, 0x54, 0x6b, - 0xd6, 0xe9, 0x0e, 0xb7, 0xce, 0x8b, 0x70, 0x04, 0xd3, 0xbf, 0xae, 0xc1, 0xd8, 0xca, 0xad, 0x0e, - 0xd2, 0x61, 0xc2, 0xf2, 0x7a, 0x86, 0xed, 0x8a, 0x51, 0x62, 0x31, 0x67, 0x2b, 0xac, 0x04, 0x0b, - 0x08, 0xea, 0xc3, 0x54, 0x24, 0xc2, 0x47, 0x3a, 0x83, 0x5c, 0xb9, 0xd5, 0x91, 0x71, 0x1b, 0x92, - 0xaf, 0xa2, 0x92, 0x00, 0xc7, 0x44, 0x74, 0x03, 0xe6, 0x57, 0x6e, 0x75, 0xda, 0xae, 0xe9, 0x0c, - 0x2c, 0xb2, 0xba, 0xc7, 0xfe, 0xd0, 0x2f, 0xb3, 0x79, 0x89, 0x88, 0x73, 0x63, 0x5f, 0x26, 0x2a, - 0xe1, 0x08, 0x46, 0xab, 0x11, 0xde, 0x42, 0x04, 0x69, 0xb1, 0x6a, 0x02, 0x09, 0x8e, 0x60, 0xfa, - 0xf7, 0x2a, 0x50, 0x57, 0x3a, 0x84, 0x1c, 0x98, 0xe4, 0x9f, 0x1b, 0xc5, 0x48, 0xac, 0x96, 0xfc, - 0xc4, 0x64, 0xaf, 0x39, 0x75, 0x3e, 0xa0, 0x01, 0x8e, 0x48, 0xa8, 0xb3, 0x54, 0x29, 0x9e, 0x25, - 0xb4, 0x04, 0xc0, 0xa3, 0x41, 0xd8, 0xd1, 0x1e, 0xdf, 0x1a, 0xd8, 0x42, 0xe8, 0xc8, 0x52, 0xac, - 0xd4, 0x40, 0x4f, 0x08, 0x7e, 0xe6, 0x87, 0x80, 0xb5, 0x14, 0x2f, 0x6f, 0x41, 0xf5, 0x9e, 0xe7, - 0x92, 0x40, 0x78, 0xdb, 0x1f, 0xd2, 0x07, 0x4e, 0x51, 0x69, 0xf5, 0x26, 0xc5, 0x8b, 0x39, 0x7a, - 0xfd, 0x57, 0x35, 0x80, 0x15, 0x23, 0x34, 0xb8, 0x73, 0x78, 0x88, 0x38, 0xbb, 0x27, 0x12, 0xcb, - 0xb0, 0x96, 0x39, 0xbf, 0x1b, 0x0f, 0xec, 0x7b, 0xd1, 0xe7, 0xcb, 0xed, 0x9d, 0x63, 0xef, 0xd8, - 0xf7, 0x08, 0x66, 0x70, 0xf4, 0x11, 0x98, 0x22, 0xae, 0xe9, 0xef, 0xf7, 0x43, 0x62, 0xb1, 0x11, - 0xa8, 0xf1, 0xe3, 0xd7, 0xd5, 0xa8, 0x10, 0xc7, 0x70, 0xfd, 0x19, 0x48, 0xea, 0x68, 0x0f, 0xee, - 0xa5, 0xbe, 0x0b, 0xb5, 0x55, 0xd7, 0xea, 0x7b, 0xb6, 0x1b, 0x0e, 0xf1, 0x4d, 0x4f, 0xc2, 0xd8, - 0xc0, 0x77, 0xc4, 0x27, 0xd5, 0x45, 0x85, 0xb1, 0x0d, 0x7c, 0x13, 0xd3, 0x72, 0xf4, 0x34, 0x4c, - 0xf6, 0x07, 0x7e, 0xdf, 0x0b, 0xa2, 0xef, 0x92, 0xca, 0xe8, 0x3a, 0x2f, 0xc6, 0x11, 0x5c, 0xbf, - 0xaf, 0xc1, 0xdc, 0xea, 0x5e, 0xdf, 0xf6, 0x59, 0xcc, 0x1f, 0xf1, 0xa9, 0xa2, 0x45, 0xdb, 0xef, - 0xf2, 0x7f, 0x45, 0x1f, 0x64, 0x7b, 0x51, 0x03, 0x47, 0x70, 0xb4, 0x05, 0xb3, 0x84, 0x35, 0x67, - 0x12, 0xd5, 0x90, 0x3e, 0xee, 0xe3, 0xf8, 0x5f, 0x78, 0x48, 0x69, 0x02, 0x0b, 0x4e, 0x61, 0x45, - 0x1d, 0x98, 0x35, 0x1d, 0x23, 0x08, 0xec, 0x2d, 0xdb, 0x8c, 0x4f, 0xb3, 0xa7, 0x9a, 0x1f, 0xa1, - 0x6d, 0x5b, 0x09, 0xc8, 0xfd, 0x83, 0xc6, 0x79, 0xd1, 0xcf, 0x24, 0x00, 0xa7, 0x50, 0xe8, 0xbf, - 0xaf, 0xc1, 0x94, 0x54, 0x2f, 0xdf, 0x53, 0x8e, 0x14, 0x74, 0x19, 0x6a, 0x96, 0x1d, 0xa8, 0x7b, - 0x02, 0x3b, 0x65, 0x5c, 0x11, 0x65, 0x58, 0x42, 0xf5, 0x00, 0x6a, 0xd7, 0xc4, 0xb2, 0x42, 0x8b, - 0x50, 0xb1, 0xa3, 0x2d, 0x09, 0xc4, 0x07, 0x54, 0xda, 0x2b, 0xb8, 0x62, 0x5b, 0x92, 0xab, 0x2a, - 0x85, 0x5c, 0xa5, 0x4c, 0xfb, 0xd8, 0xd1, 0xd3, 0xae, 0xff, 0x86, 0x06, 0xf5, 0xeb, 0xf6, 0x26, - 0xf1, 0xb9, 0xb7, 0x95, 0xc9, 0xc5, 0x44, 0x14, 0x78, 0x3d, 0x2f, 0x02, 0x1c, 0xed, 0xc1, 0x54, - 0x60, 0x6e, 0x13, 0x6b, 0xe0, 0xc8, 0x33, 0xfe, 0x52, 0xb1, 0xde, 0x0a, 0xe9, 0x8e, 0xc0, 0xa7, - 0x44, 0xbb, 0x45, 0x14, 0x70, 0x4c, 0x4c, 0xff, 0x02, 0x9c, 0xcd, 0x69, 0x84, 0x1a, 0x50, 0x0d, - 0x42, 0xc3, 0x0f, 0xc5, 0x98, 0x31, 0x71, 0xd3, 0xa1, 0x05, 0x98, 0x97, 0xa3, 0xc7, 0x60, 0x8c, - 0xb8, 0x96, 0x18, 0xb4, 0x49, 0xba, 0xca, 0x56, 0x5d, 0x0b, 0xd3, 0x32, 0x3a, 0x45, 0x8e, 0x97, - 0x60, 0x46, 0x36, 0x45, 0x37, 0x45, 0x19, 0x96, 0x50, 0xfd, 0x9f, 0x8e, 0xc3, 0x93, 0xd7, 0x3d, - 0xdf, 0xbe, 0xe7, 0xb9, 0xa1, 0xe1, 0xac, 0x7b, 0x56, 0x7c, 0x6a, 0x25, 0xa6, 0xfb, 0x2b, 0x1a, - 0x3c, 0x6a, 0xf6, 0x07, 0x6d, 0xd7, 0x0e, 0x6d, 0x23, 0x3a, 0x4c, 0x58, 0x27, 0xbe, 0xed, 0x95, - 0x3d, 0xbc, 0x62, 0xd1, 0xc3, 0xad, 0xf5, 0x8d, 0x3c, 0x94, 0xb8, 0x88, 0x16, 0x3b, 0x43, 0xb3, - 0xbc, 0xbb, 0x2e, 0xeb, 0x5c, 0x27, 0x64, 0x11, 0xcd, 0xf7, 0xe2, 0x4f, 0x2c, 0x79, 0x86, 0xb6, - 0x92, 0x8b, 0x11, 0x17, 0x50, 0x42, 0x5f, 0x84, 0xf3, 0x36, 0xef, 0x1c, 0x26, 0x86, 0x65, 0xbb, - 0x24, 0x08, 0xd8, 0x49, 0xd2, 0x28, 0x87, 0x44, 0xed, 0x3c, 0x84, 0x38, 0x9f, 0x0e, 0x7a, 0x0b, - 0x20, 0xd8, 0x77, 0x4d, 0x31, 0xfe, 0xd5, 0x52, 0x54, 0xf9, 0x4e, 0x2a, 0xb1, 0x60, 0x05, 0x23, - 0xdd, 0x4c, 0x42, 0xcf, 0x21, 0xbe, 0xe1, 0x9a, 0xdc, 0x45, 0xac, 0xf1, 0xcd, 0xe4, 0x4e, 0x54, - 0x88, 0x63, 0xb8, 0xfe, 0x0f, 0x34, 0x98, 0x14, 0x37, 0x05, 0xd0, 0x87, 0x53, 0x0a, 0x95, 0xf4, - 0x13, 0xa5, 0x94, 0xaa, 0x7d, 0x66, 0xe3, 0x0b, 0x95, 0x55, 0x08, 0xa9, 0x52, 0x3b, 0xb2, 0x20, - 0x1c, 0xeb, 0xbf, 0x09, 0x5b, 0x3f, 0xd2, 0x89, 0x15, 0x62, 0xfa, 0x37, 0x34, 0x98, 0xcf, 0xb4, - 0x1a, 0x42, 0x5b, 0x3e, 0x45, 0x27, 0xf5, 0x1f, 0xd7, 0x81, 0x5d, 0x0a, 0x59, 0x5e, 0x6f, 0x77, - 0x88, 0xbf, 0x2b, 0x17, 0xe1, 0x5f, 0xd5, 0x60, 0x2e, 0x3e, 0x4e, 0x11, 0xbd, 0xd0, 0xca, 0x47, - 0xcf, 0xdc, 0x48, 0xe1, 0x6a, 0x2e, 0x88, 0xef, 0x9e, 0x4b, 0x43, 0x70, 0x86, 0x2e, 0xfa, 0x59, - 0x0d, 0xe6, 0x8c, 0xe4, 0xa5, 0x90, 0x48, 0x64, 0x96, 0x0a, 0x76, 0x4c, 0x5d, 0x30, 0x89, 0xfb, - 0x92, 0x02, 0x04, 0x38, 0x43, 0x16, 0x7d, 0x02, 0xa6, 0x8d, 0xbe, 0xbd, 0x3c, 0xb0, 0x6c, 0xe2, - 0x9a, 0xf2, 0x26, 0x01, 0xb3, 0xe4, 0x97, 0xd7, 0xdb, 0xb2, 0x1c, 0x27, 0x6a, 0xc9, 0x5b, 0x1f, - 0x62, 0x20, 0xc7, 0x47, 0xbc, 0xf5, 0x21, 0xc6, 0x30, 0xbe, 0xf5, 0x21, 0x86, 0x4e, 0x25, 0x82, - 0x7e, 0x0c, 0x1e, 0xe3, 0x7b, 0x4d, 0xd3, 0x08, 0x6c, 0x73, 0x79, 0x10, 0x6e, 0x13, 0x37, 0x8c, - 0x34, 0x06, 0x6e, 0xb2, 0xb0, 0xd3, 0xf4, 0xd5, 0xa2, 0x4a, 0xb8, 0xb8, 0x3d, 0x72, 0x01, 0x3c, - 0xdb, 0x32, 0xc5, 0xf7, 0xf0, 0x03, 0xdd, 0x52, 0xc1, 0x0e, 0xb7, 0xdb, 0x2b, 0x2d, 0xf1, 0x39, - 0x4c, 0x4c, 0xc4, 0xbf, 0xb1, 0x42, 0x01, 0x7d, 0x55, 0x83, 0x19, 0xc1, 0xe4, 0x82, 0xe6, 0x24, - 0x9b, 0xff, 0x37, 0xcb, 0x32, 0x63, 0x8a, 0xe1, 0x97, 0xb0, 0x8a, 0x9c, 0x87, 0x6f, 0xca, 0xf0, - 0x9e, 0x04, 0x0c, 0x27, 0xfb, 0x81, 0xfe, 0xb6, 0x06, 0xe7, 0x02, 0xe2, 0xef, 0xda, 0x26, 0x59, - 0x36, 0x4d, 0x6f, 0xe0, 0x46, 0x93, 0x5c, 0x2b, 0x1f, 0x81, 0xdf, 0xc9, 0xc1, 0xc7, 0xcf, 0x95, - 0xf3, 0x20, 0x38, 0x97, 0x3e, 0xdd, 0xbf, 0xce, 0xdc, 0x35, 0x42, 0x73, 0xbb, 0x65, 0x98, 0xdb, - 0x4c, 0x7f, 0xe7, 0x47, 0xc9, 0x25, 0x17, 0xcd, 0xeb, 0x49, 0x54, 0xdc, 0x2e, 0x4f, 0x15, 0xe2, - 0x34, 0x41, 0x14, 0x40, 0xcd, 0x27, 0xef, 0x0c, 0x48, 0x10, 0x06, 0x0b, 0xc0, 0x88, 0xb7, 0x47, - 0x9e, 0x31, 0x2c, 0x10, 0x72, 0x1d, 0x23, 0xfa, 0x85, 0x25, 0x21, 0xd4, 0x85, 0x27, 0x39, 0xe7, - 0x2e, 0xbb, 0x9e, 0xbb, 0xdf, 0xf3, 0x06, 0x41, 0x8a, 0xfb, 0xeb, 0x8c, 0xfb, 0xd9, 0x89, 0xfa, - 0xea, 0x51, 0x15, 0xf1, 0xd1, 0x78, 0xd0, 0x1b, 0x50, 0x23, 0xbb, 0xc4, 0x0d, 0xef, 0xdc, 0xb9, - 0xb9, 0x30, 0x5d, 0x6a, 0x6b, 0x64, 0x9f, 0xb0, 0x2a, 0x70, 0x60, 0x89, 0x6d, 0xf1, 0x15, 0x40, - 0x59, 0x8e, 0x44, 0x73, 0x30, 0xb6, 0x43, 0xf8, 0xa5, 0xb1, 0x29, 0x4c, 0xff, 0x45, 0xe7, 0xa0, - 0xba, 0x6b, 0x38, 0x03, 0xae, 0xca, 0xd6, 0x30, 0xff, 0xf1, 0x42, 0xe5, 0x53, 0x9a, 0xfe, 0x3b, - 0x1a, 0x9c, 0xcf, 0x1d, 0x36, 0x84, 0xe1, 0x02, 0x0b, 0x44, 0x70, 0xd7, 0x06, 0xa1, 0x11, 0xda, - 0x6e, 0xb7, 0xed, 0x6e, 0x39, 0x76, 0x77, 0x9b, 0x6b, 0x7e, 0x55, 0xae, 0xa7, 0xac, 0xe5, 0xd6, - 0xc0, 0x05, 0x2d, 0x51, 0x1b, 0xce, 0xf6, 0x8c, 0xbd, 0x0c, 0xc2, 0x0a, 0x43, 0xc8, 0xae, 0x1e, - 0xae, 0x65, 0xc1, 0x38, 0xaf, 0x8d, 0xfe, 0xb5, 0x2a, 0x3c, 0x4e, 0x3b, 0x1e, 0x6f, 0x99, 0x6b, - 0x86, 0x6b, 0x74, 0xdf, 0x9b, 0x5b, 0xd3, 0x6f, 0x68, 0xf0, 0xe8, 0x76, 0xbe, 0x3a, 0x2b, 0x36, - 0xed, 0x57, 0x4b, 0x29, 0xf5, 0x47, 0x69, 0xc8, 0x9c, 0x71, 0x8f, 0xac, 0x82, 0x8b, 0x3a, 0x85, - 0x5e, 0x81, 0x39, 0xd7, 0xb3, 0x48, 0xab, 0xbd, 0x82, 0xd7, 0x8c, 0x60, 0xa7, 0x13, 0x19, 0xfc, - 0x55, 0xee, 0xf8, 0xba, 0x95, 0x82, 0xe1, 0x4c, 0x6d, 0xb4, 0x0b, 0xa8, 0xef, 0x59, 0xab, 0xbb, - 0xb6, 0x19, 0x45, 0x1e, 0x94, 0x77, 0xb6, 0xb1, 0x7b, 0x15, 0xeb, 0x19, 0x6c, 0x38, 0x87, 0x02, - 0xd3, 0xc7, 0x69, 0x67, 0xd6, 0x3c, 0xd7, 0x0e, 0x3d, 0x9f, 0x05, 0xba, 0x8c, 0xa4, 0x96, 0x32, - 0x3e, 0xbf, 0x95, 0x8b, 0x11, 0x17, 0x50, 0xd2, 0xff, 0xb7, 0x06, 0x67, 0x28, 0x5b, 0xac, 0xfb, - 0xde, 0xde, 0xfe, 0x7b, 0x91, 0x21, 0x9f, 0x86, 0xf1, 0x9e, 0x67, 0x45, 0xa6, 0xed, 0x79, 0xaa, - 0x59, 0xae, 0x79, 0x16, 0xb9, 0xcf, 0x3d, 0x80, 0x7b, 0xfb, 0x2c, 0xf4, 0x89, 0x55, 0x51, 0x0d, - 0xd5, 0xb1, 0x62, 0x43, 0x55, 0xff, 0x4f, 0x1a, 0x57, 0x11, 0x23, 0x43, 0xf1, 0x3d, 0xb9, 0x0e, - 0x9f, 0x83, 0x19, 0x5a, 0xb6, 0x66, 0xec, 0xad, 0xaf, 0xbc, 0xe6, 0x39, 0x51, 0xd4, 0x0e, 0x3b, - 0x23, 0xbc, 0xa1, 0x02, 0x70, 0xb2, 0x9e, 0xfe, 0x1f, 0x67, 0x81, 0x55, 0x70, 0x48, 0xf8, 0x5e, - 0xfc, 0xae, 0x67, 0xa0, 0x6e, 0xf6, 0x07, 0xad, 0xab, 0x9d, 0x57, 0x07, 0x5e, 0x68, 0x08, 0x1f, - 0x26, 0xd3, 0xfb, 0x5a, 0xeb, 0x1b, 0x51, 0x31, 0x56, 0xeb, 0xd0, 0x15, 0x6e, 0xf6, 0x07, 0x42, - 0x66, 0xae, 0xab, 0x87, 0x5d, 0x6c, 0x85, 0xb7, 0xd6, 0x37, 0x12, 0x30, 0x9c, 0xa9, 0x8d, 0xbe, - 0x08, 0xd3, 0x44, 0x2c, 0xbe, 0xeb, 0x86, 0x6f, 0x89, 0xb5, 0x5d, 0x7a, 0xe3, 0x96, 0x43, 0x1b, - 0xad, 0x68, 0xae, 0x2e, 0xaf, 0x2a, 0x24, 0x70, 0x82, 0x20, 0x53, 0x5d, 0xc5, 0x6f, 0x3a, 0x53, - 0x9e, 0x95, 0x5e, 0xec, 0x55, 0xa1, 0xba, 0x16, 0x55, 0xc2, 0xc5, 0xed, 0xd1, 0xaf, 0x6b, 0x70, - 0x41, 0x42, 0x6d, 0xd7, 0xee, 0x0d, 0x7a, 0x98, 0x98, 0x8e, 0x61, 0xf7, 0x84, 0x1e, 0xfb, 0xfa, - 0x43, 0xfb, 0xd0, 0x24, 0x7a, 0x2e, 0x70, 0xf2, 0x61, 0xb8, 0xa0, 0x4b, 0xe8, 0x1b, 0x1a, 0x5c, - 0x8a, 0x40, 0xeb, 0xd4, 0x92, 0x1c, 0xf8, 0x24, 0x8e, 0xfb, 0x12, 0x43, 0x32, 0x59, 0x4a, 0xfe, - 0x3d, 0x75, 0x78, 0xd0, 0xb8, 0xb4, 0xfa, 0x00, 0xdc, 0xf8, 0x81, 0xd4, 0x55, 0x76, 0xe9, 0x78, - 0x5b, 0xa1, 0x50, 0x7c, 0x4f, 0x8a, 0x5d, 0x28, 0x09, 0x9c, 0x20, 0x88, 0x7e, 0x53, 0x83, 0x47, - 0xd5, 0x02, 0x95, 0x5b, 0xb8, 0xc6, 0xfb, 0xc6, 0x43, 0xeb, 0x4c, 0x0a, 0x3f, 0xf7, 0x2d, 0x15, - 0x00, 0x71, 0x51, 0xaf, 0xa8, 0xe8, 0xed, 0x31, 0xc6, 0xe4, 0x5a, 0x71, 0x95, 0x8b, 0x5e, 0xce, - 0xab, 0x01, 0x8e, 0x60, 0xd4, 0xd8, 0xec, 0x7b, 0xd6, 0xba, 0x6d, 0x05, 0x37, 0xed, 0x9e, 0x1d, - 0x32, 0xbd, 0x75, 0x8c, 0x0f, 0xc7, 0xba, 0x67, 0xad, 0xb7, 0x57, 0x78, 0x39, 0x4e, 0xd4, 0x62, - 0x71, 0xd7, 0x76, 0xcf, 0xe8, 0x92, 0xf5, 0x81, 0xe3, 0xac, 0xfb, 0x1e, 0x73, 0x40, 0xac, 0x10, - 0xc3, 0x72, 0x6c, 0x97, 0x94, 0xd4, 0x53, 0xd9, 0x72, 0x6b, 0x17, 0x21, 0xc5, 0xc5, 0xf4, 0xd0, - 0x12, 0xc0, 0x96, 0x61, 0x3b, 0x9d, 0xbb, 0x46, 0xff, 0xb6, 0xbb, 0x30, 0xc3, 0x04, 0x18, 0xb3, - 0xf4, 0xae, 0xca, 0x52, 0xac, 0xd4, 0xa0, 0xdc, 0x44, 0xa5, 0x20, 0x26, 0xfc, 0xf6, 0xd5, 0xc2, - 0xec, 0x43, 0xe2, 0xa6, 0x08, 0x21, 0x1f, 0xbe, 0x1b, 0x0a, 0x09, 0x9c, 0x20, 0x88, 0xbe, 0xa2, - 0xc1, 0x6c, 0xb0, 0x1f, 0x84, 0xa4, 0x27, 0xfb, 0x70, 0xe6, 0x61, 0xf7, 0x81, 0xb9, 0x66, 0x3a, - 0x09, 0x22, 0x38, 0x45, 0x14, 0x19, 0xf0, 0x38, 0x1b, 0xd5, 0x6b, 0xad, 0xeb, 0x76, 0x77, 0x5b, - 0x46, 0x53, 0xaf, 0x13, 0xdf, 0x24, 0x6e, 0xb8, 0x30, 0xc7, 0xf8, 0xa6, 0x71, 0x78, 0xd0, 0x78, - 0xbc, 0x5d, 0x5c, 0x0d, 0x1f, 0x85, 0x03, 0xbd, 0x05, 0x8b, 0x02, 0x7c, 0xd3, 0xbb, 0x9b, 0xa1, - 0x30, 0xcf, 0x28, 0xb0, 0x10, 0xf7, 0x76, 0x61, 0x2d, 0x7c, 0x04, 0x06, 0xfd, 0xa0, 0xc2, 0x6d, - 0x90, 0xcc, 0x2a, 0x42, 0x2f, 0xc1, 0x99, 0x1e, 0xe9, 0x79, 0xfe, 0xfe, 0x72, 0x94, 0x64, 0x41, - 0xf8, 0xc3, 0x98, 0x59, 0xb9, 0x96, 0x04, 0xe1, 0x74, 0x5d, 0xba, 0xc7, 0x31, 0xb2, 0x57, 0x3b, - 0x71, 0xfb, 0x4a, 0xbc, 0xc7, 0xb5, 0x53, 0x30, 0x9c, 0xa9, 0x8d, 0x5a, 0x30, 0x2f, 0xca, 0xda, - 0x54, 0xd5, 0x0b, 0xae, 0xfa, 0x24, 0x3a, 0x21, 0xa2, 0x4a, 0xd3, 0x7c, 0x3b, 0x0d, 0xc4, 0xd9, - 0xfa, 0xf4, 0x2b, 0xe8, 0x0f, 0xb5, 0x17, 0xe3, 0xf1, 0x57, 0xdc, 0x4a, 0x82, 0x70, 0xba, 0x6e, - 0xa4, 0x8b, 0x27, 0xba, 0x50, 0x8d, 0xbf, 0xe2, 0x56, 0x0a, 0x86, 0x33, 0xb5, 0xf5, 0xff, 0x3c, - 0x0e, 0x1f, 0x1c, 0x62, 0xe7, 0x41, 0xbd, 0xfc, 0xe1, 0x7e, 0x80, 0x1c, 0x58, 0x8a, 0x02, 0x10, - 0x96, 0x5e, 0x1d, 0x18, 0x6e, 0x68, 0x87, 0xfb, 0x43, 0x4e, 0x4f, 0xbf, 0x60, 0x7a, 0x8e, 0x4f, - 0x6f, 0xd8, 0xe9, 0x0c, 0x8a, 0xa6, 0xf3, 0xf8, 0x24, 0x87, 0x9f, 0xfe, 0x5e, 0xfe, 0xf4, 0x97, - 0x1c, 0xd5, 0x07, 0xb2, 0x4b, 0xbf, 0x80, 0x5d, 0x4a, 0x8e, 0xea, 0x10, 0xec, 0xf5, 0x27, 0xe3, - 0xf0, 0xd4, 0x30, 0xbb, 0x60, 0x49, 0xfe, 0xca, 0xd9, 0x67, 0x4e, 0x94, 0xbf, 0x8a, 0xa2, 0x3d, - 0x4e, 0x90, 0xbf, 0x72, 0x48, 0x9e, 0x34, 0x7f, 0x15, 0x8d, 0xea, 0x49, 0xf1, 0x57, 0xd1, 0xa8, - 0x0e, 0xc1, 0x5f, 0x7f, 0x9a, 0xde, 0x1f, 0xe4, 0xe6, 0xd7, 0x86, 0x31, 0xb3, 0x3f, 0x28, 0x29, - 0xa4, 0xd8, 0xd9, 0x64, 0x6b, 0x7d, 0x03, 0x53, 0x1c, 0x08, 0xc3, 0x04, 0xe7, 0x9f, 0x92, 0x22, - 0x88, 0x45, 0xea, 0x70, 0x96, 0xc4, 0x02, 0x13, 0x1d, 0x2a, 0xd2, 0xdf, 0x26, 0x3d, 0xe2, 0x1b, - 0x4e, 0x27, 0xf4, 0x7c, 0xa3, 0x5b, 0x56, 0xda, 0xb0, 0xa1, 0x5a, 0x4d, 0xe1, 0xc2, 0x19, 0xec, - 0x74, 0x40, 0xfa, 0xb6, 0x55, 0x52, 0xbe, 0xb0, 0x01, 0x59, 0x6f, 0xaf, 0x60, 0x8a, 0x43, 0xff, - 0x83, 0x1a, 0x28, 0xd7, 0x66, 0xa8, 0xb1, 0x65, 0x38, 0x8e, 0x77, 0x77, 0xdd, 0xb7, 0x77, 0x6d, - 0x87, 0x74, 0x89, 0x25, 0xef, 0x55, 0x04, 0xe2, 0x04, 0x9b, 0x69, 0x7f, 0xcb, 0x45, 0x95, 0x70, - 0x71, 0x7b, 0x6a, 0x4c, 0xcf, 0x9b, 0xe9, 0xeb, 0x89, 0xa3, 0x9c, 0xc2, 0x65, 0xee, 0x3a, 0xf2, - 0xf5, 0x94, 0x29, 0xc6, 0x59, 0xb2, 0xe8, 0x4b, 0x1a, 0xf7, 0x12, 0x48, 0x97, 0xa8, 0x98, 0xb3, - 0x6b, 0x0f, 0xe9, 0x10, 0x21, 0x76, 0x37, 0xc4, 0x4e, 0xd7, 0x24, 0x41, 0x6a, 0xce, 0x9d, 0xdf, - 0xc9, 0x73, 0x6e, 0x8a, 0x99, 0xbd, 0x5d, 0xb6, 0x2b, 0x05, 0xde, 0x52, 0x7e, 0xe2, 0x9b, 0x5b, - 0x01, 0xe7, 0x77, 0x44, 0x8e, 0x92, 0xf4, 0xf7, 0x08, 0x21, 0x50, 0x7a, 0x94, 0x52, 0x8e, 0xa3, - 0x78, 0x94, 0x24, 0x00, 0x27, 0x09, 0xa2, 0x3e, 0x4c, 0xed, 0x44, 0x4e, 0x36, 0x61, 0x94, 0xb7, - 0xca, 0x52, 0x57, 0x3c, 0x75, 0xfc, 0x64, 0x59, 0x16, 0xe2, 0x98, 0x08, 0xda, 0x86, 0xc9, 0x1d, - 0x2e, 0x88, 0x84, 0x31, 0xbd, 0x3c, 0xb2, 0xb2, 0xcf, 0x6d, 0x3a, 0x51, 0x84, 0x23, 0xf4, 0x6a, - 0x64, 0x49, 0xed, 0x01, 0x01, 0x45, 0x5f, 0xd3, 0xe0, 0xfc, 0x2e, 0xf1, 0x43, 0xdb, 0x4c, 0xbb, - 0x96, 0xa7, 0xca, 0x1b, 0x24, 0xaf, 0xe5, 0x21, 0xe4, 0x6c, 0x92, 0x0b, 0xc2, 0xf9, 0x5d, 0xd0, - 0x7f, 0xa8, 0x41, 0xc6, 0x81, 0x85, 0x7e, 0x5e, 0x83, 0xe9, 0x2d, 0x62, 0x84, 0x03, 0x9f, 0x5c, - 0x33, 0x42, 0x19, 0x24, 0xfb, 0xda, 0xc3, 0xf0, 0x9b, 0x2d, 0x5d, 0x55, 0x10, 0xf3, 0x13, 0x3a, - 0x79, 0x07, 0x5e, 0x05, 0xe1, 0x44, 0x0f, 0x16, 0x5f, 0x86, 0xf9, 0x4c, 0xc3, 0x63, 0x1d, 0xa4, - 0xfc, 0x0b, 0xe1, 0xff, 0x4c, 0xa7, 0x48, 0x7c, 0x0b, 0xaa, 0x86, 0x65, 0xc9, 0x04, 0x4c, 0xcf, - 0x97, 0x3b, 0x89, 0xb6, 0xd4, 0x58, 0x64, 0xf6, 0x13, 0x73, 0xb4, 0xe8, 0x2a, 0x20, 0x23, 0x71, - 0xdc, 0xb4, 0xe6, 0x59, 0x91, 0x95, 0xc4, 0xfc, 0xe6, 0xcb, 0x19, 0x28, 0xce, 0x69, 0xa1, 0xbf, - 0x08, 0xb3, 0xc9, 0xcb, 0x93, 0xc7, 0x88, 0x69, 0xd3, 0xff, 0x8a, 0x06, 0x28, 0x9b, 0x72, 0x01, - 0xf9, 0x50, 0x13, 0x35, 0xa2, 0x29, 0x2e, 0xe5, 0x1a, 0x4d, 0x47, 0xdb, 0xc5, 0xc1, 0xe0, 0xa2, - 0x20, 0xc0, 0x92, 0x8e, 0xfe, 0x67, 0x1a, 0xc4, 0x19, 0x5e, 0xd0, 0x27, 0xa1, 0x6e, 0x91, 0xc0, - 0xf4, 0xed, 0x7e, 0x18, 0x7f, 0x87, 0xbc, 0x2e, 0xbf, 0x12, 0x83, 0xb0, 0x5a, 0x0f, 0xe9, 0x30, - 0x11, 0x1a, 0xc1, 0x4e, 0x7b, 0x45, 0x98, 0x8b, 0x6c, 0x73, 0xbf, 0xc3, 0x4a, 0xb0, 0x80, 0xc4, - 0x17, 0x11, 0xc7, 0x86, 0xb8, 0x88, 0x88, 0xb6, 0x1e, 0xc2, 0xad, 0x4b, 0xf4, 0xe0, 0x1b, 0x97, - 0xfa, 0x1f, 0x55, 0x20, 0x99, 0x54, 0xa7, 0xec, 0x10, 0x64, 0xaf, 0x89, 0x56, 0x4e, 0xec, 0x9a, - 0xe8, 0x47, 0x59, 0x46, 0x3a, 0x9e, 0x42, 0x94, 0x9f, 0x32, 0xa9, 0x79, 0xe4, 0x78, 0x02, 0x50, - 0x59, 0x03, 0x3d, 0xcf, 0x22, 0xd0, 0xc2, 0xc8, 0x88, 0xfe, 0x60, 0xb4, 0x2c, 0x3a, 0xb4, 0xf0, - 0xbe, 0xb8, 0x08, 0x2b, 0xbf, 0x9f, 0x95, 0x62, 0xde, 0x02, 0x7d, 0x52, 0x04, 0x2c, 0x56, 0x13, - 0x97, 0x75, 0xa3, 0x1b, 0xbe, 0xf3, 0x89, 0x86, 0x71, 0x14, 0xa3, 0xfe, 0x37, 0x35, 0x98, 0x14, - 0xf9, 0x33, 0x86, 0x88, 0x79, 0xdc, 0x82, 0x2a, 0x53, 0xd2, 0x47, 0xd1, 0x5f, 0x3a, 0xdb, 0x9e, - 0x17, 0x26, 0xb2, 0x88, 0xb0, 0x40, 0x3b, 0xf6, 0x2f, 0xe6, 0xe8, 0xf5, 0xaf, 0x8f, 0xc3, 0x25, - 0x51, 0x25, 0xb3, 0x3d, 0xcb, 0x25, 0xb8, 0x0f, 0x67, 0xc5, 0x2c, 0xad, 0xf8, 0x86, 0x2d, 0xcf, - 0xe1, 0xca, 0x99, 0x5d, 0xe2, 0x84, 0x36, 0x83, 0x0e, 0xe7, 0xd1, 0xe0, 0xf7, 0xe5, 0x59, 0xf1, - 0x75, 0x62, 0x38, 0xe1, 0x76, 0x44, 0xbb, 0x32, 0xca, 0x7d, 0xf9, 0x2c, 0x3e, 0x9c, 0x4b, 0x85, - 0x9d, 0x03, 0x0a, 0x40, 0xcb, 0x27, 0x86, 0x7a, 0x08, 0x39, 0x42, 0x5c, 0xde, 0x5a, 0x2e, 0x46, - 0x5c, 0x40, 0x89, 0xf9, 0xaf, 0x8c, 0x3d, 0x66, 0x0e, 0x63, 0x12, 0xfa, 0x36, 0xcb, 0xeb, 0x42, - 0xf9, 0x9b, 0x1b, 0xb0, 0x49, 0x10, 0x4e, 0xd7, 0x45, 0x2f, 0xc0, 0x2c, 0x3b, 0x57, 0x8d, 0x2f, - 0x9f, 0x55, 0xe3, 0x8c, 0xb2, 0xb7, 0x12, 0x10, 0x9c, 0xaa, 0xa9, 0x7f, 0x53, 0x83, 0x69, 0x95, - 0x81, 0x86, 0x88, 0x91, 0x1e, 0x28, 0xe2, 0x7a, 0x84, 0x50, 0x53, 0x95, 0xea, 0x30, 0x12, 0xfb, - 0xbe, 0x06, 0x67, 0x73, 0xda, 0xb0, 0x13, 0x36, 0x92, 0x12, 0xfd, 0xa3, 0x9c, 0xb0, 0x65, 0xb6, - 0x11, 0x79, 0xc2, 0x96, 0x86, 0xe0, 0x0c, 0x5d, 0xf4, 0x1a, 0x8c, 0x99, 0xbe, 0x2d, 0x86, 0xe5, - 0xb9, 0x52, 0x26, 0x09, 0x6e, 0xc7, 0x81, 0xe7, 0x2d, 0xdc, 0xc6, 0x14, 0xa1, 0xfe, 0x4f, 0xc6, - 0xa0, 0xae, 0xa4, 0xe6, 0x41, 0x6b, 0xa3, 0x58, 0xb4, 0x31, 0xfa, 0xc8, 0xaa, 0x5d, 0x83, 0xb1, - 0x6e, 0x7f, 0x50, 0xd2, 0xa4, 0x95, 0xe8, 0xae, 0x51, 0x74, 0xdd, 0xfe, 0x00, 0xbd, 0x26, 0x8d, - 0xe4, 0x72, 0x66, 0xac, 0x8c, 0xbe, 0x4c, 0x19, 0xca, 0x11, 0x6f, 0x8e, 0x17, 0xf2, 0x66, 0x0f, - 0x26, 0x03, 0x61, 0x41, 0x57, 0xcb, 0xa7, 0x85, 0x52, 0x46, 0x5a, 0x58, 0xcc, 0x5c, 0xfd, 0x8e, - 0x0c, 0xea, 0x88, 0x06, 0x55, 0x00, 0x06, 0x2c, 0x5a, 0x9c, 0xd9, 0x15, 0x35, 0xae, 0x00, 0x6c, - 0xb0, 0x12, 0x2c, 0x20, 0xfa, 0xcf, 0x54, 0x00, 0x65, 0x11, 0xa2, 0x0f, 0x42, 0x95, 0x05, 0xcd, - 0x8b, 0x85, 0xa6, 0x24, 0xbc, 0x30, 0x82, 0x00, 0x73, 0x18, 0xea, 0x88, 0x4b, 0x14, 0xe5, 0x26, - 0x86, 0x9d, 0xec, 0x0a, 0x7a, 0xca, 0x8d, 0x8b, 0x68, 0x6b, 0x1a, 0x2b, 0xdc, 0x9a, 0x36, 0x60, - 0xb2, 0x67, 0xbb, 0x2c, 0x9a, 0xa3, 0x9c, 0x8b, 0x80, 0x1f, 0x40, 0x71, 0x14, 0x38, 0xc2, 0xa5, - 0xff, 0x49, 0x85, 0x32, 0xb1, 0xed, 0x86, 0xc4, 0x35, 0x5c, 0x93, 0xa0, 0x7d, 0x00, 0x63, 0x10, - 0x7a, 0x7c, 0x87, 0x17, 0xbc, 0xdc, 0x2e, 0x37, 0x5f, 0x12, 0xe9, 0xb2, 0x44, 0xc8, 0xcf, 0x85, - 0xe2, 0xdf, 0x58, 0x21, 0x46, 0x49, 0x87, 0x76, 0x8f, 0xbc, 0x6e, 0xbb, 0x96, 0x77, 0x57, 0x0c, - 0xef, 0xa8, 0xa4, 0xef, 0x48, 0x84, 0x9c, 0x74, 0xfc, 0x1b, 0x2b, 0xc4, 0xd0, 0x1b, 0xb0, 0xc0, - 0xb2, 0x5c, 0xbb, 0x2c, 0xeb, 0x99, 0xe8, 0x9b, 0xe7, 0x38, 0xd1, 0x96, 0x53, 0x63, 0x99, 0x66, - 0x16, 0x5a, 0x05, 0x75, 0x70, 0x61, 0x6b, 0xfd, 0x37, 0x35, 0x38, 0x9f, 0x3b, 0x14, 0xe8, 0x1a, - 0xcc, 0xc7, 0xc1, 0x00, 0xaa, 0x8c, 0xac, 0xc5, 0x49, 0xfc, 0x6e, 0xa4, 0x2b, 0xe0, 0x6c, 0x1b, - 0xb4, 0x26, 0xf5, 0x04, 0x55, 0x06, 0x8b, 0x48, 0x82, 0xc7, 0x05, 0xaa, 0x3c, 0x31, 0x8d, 0xf3, - 0xda, 0xe9, 0x3f, 0x96, 0xe8, 0x70, 0x3c, 0x60, 0x74, 0x75, 0x6c, 0x92, 0xae, 0x0c, 0xc7, 0x96, - 0xab, 0xa3, 0x49, 0x0b, 0x31, 0x87, 0xa1, 0x27, 0xd5, 0x2b, 0x04, 0x52, 0x0a, 0x45, 0xd7, 0x08, - 0xf4, 0x10, 0x40, 0xc4, 0xdc, 0xd8, 0x6e, 0x17, 0x6d, 0x41, 0xcd, 0x10, 0x29, 0xd8, 0x05, 0xab, - 0x7d, 0xba, 0x94, 0x8d, 0x25, 0x70, 0xf0, 0x58, 0xbb, 0xe8, 0x17, 0x96, 0xb8, 0xf5, 0xbf, 0xaf, - 0xc1, 0x05, 0x2a, 0x90, 0xac, 0xe8, 0x42, 0xa3, 0xbc, 0x63, 0x3e, 0xc4, 0xd6, 0xda, 0x83, 0xba, - 0x1f, 0x37, 0x13, 0x7c, 0xf9, 0xa3, 0xea, 0xfd, 0x75, 0xe5, 0x3d, 0x06, 0xaa, 0x76, 0xb4, 0x7c, - 0x2f, 0x88, 0x26, 0x27, 0x7d, 0xa5, 0x5d, 0x2a, 0xef, 0x4a, 0x4f, 0xb0, 0x8a, 0x5f, 0xff, 0x72, - 0x05, 0xe0, 0x16, 0x09, 0xef, 0x7a, 0xfe, 0x0e, 0x1d, 0xa2, 0xf7, 0xd4, 0x3d, 0x9d, 0x27, 0x60, - 0xbc, 0xef, 0x59, 0x81, 0x90, 0x52, 0xec, 0x76, 0x19, 0x3b, 0xce, 0x66, 0xa5, 0xa8, 0x01, 0x55, - 0xe6, 0xf8, 0x15, 0x5b, 0x01, 0xd3, 0x7a, 0xa9, 0xa6, 0x13, 0x60, 0x5e, 0xce, 0x93, 0x6b, 0xb2, - 0x38, 0xd6, 0x40, 0xa8, 0xf1, 0x22, 0xb9, 0x26, 0x2f, 0xc3, 0x12, 0xaa, 0x7f, 0x79, 0x1c, 0x12, - 0x6f, 0x08, 0xc4, 0xa6, 0xb8, 0x76, 0x32, 0xa6, 0xf8, 0x1b, 0xb0, 0xe0, 0x78, 0x86, 0xd5, 0x34, - 0x1c, 0xca, 0xf4, 0x7e, 0x87, 0x4f, 0x87, 0xe1, 0x76, 0x65, 0x82, 0x7a, 0x26, 0x00, 0x6e, 0x16, - 0xd4, 0xc1, 0x85, 0xad, 0x51, 0x28, 0x5f, 0x2e, 0xe0, 0x49, 0x09, 0x6f, 0x8e, 0xfa, 0xc2, 0xc2, - 0x92, 0x1a, 0xc1, 0x2c, 0x77, 0xe5, 0xe4, 0xe3, 0x06, 0xe8, 0xa7, 0x35, 0x38, 0x4f, 0xf6, 0x42, - 0xe2, 0xbb, 0x86, 0x73, 0xc7, 0x37, 0xb6, 0xb6, 0x6c, 0x53, 0x04, 0x0a, 0xf1, 0xc9, 0x59, 0x3f, - 0x3c, 0x68, 0x9c, 0x5f, 0xcd, 0xab, 0x70, 0xff, 0xa0, 0xf1, 0xf1, 0xec, 0x03, 0x22, 0x51, 0xc0, - 0x72, 0x6e, 0x13, 0xc6, 0x8c, 0xf9, 0xe4, 0x16, 0x9f, 0x87, 0xfa, 0x31, 0xe2, 0x5b, 0xa7, 0x54, - 0xb7, 0xcc, 0x2f, 0x4f, 0x80, 0x12, 0x2c, 0x7e, 0x8c, 0x54, 0x94, 0x7f, 0x57, 0x83, 0x73, 0xa6, - 0x63, 0x13, 0x37, 0x4c, 0x45, 0x05, 0xf3, 0x85, 0xb1, 0x51, 0x2a, 0x8a, 0xbd, 0x4f, 0xdc, 0xf6, - 0x4a, 0xcb, 0x73, 0x5d, 0x62, 0x86, 0xad, 0x1c, 0xe4, 0xdc, 0xca, 0xc9, 0x83, 0xe0, 0xdc, 0xce, - 0xb0, 0xef, 0x61, 0xe5, 0xed, 0x15, 0xf5, 0x46, 0x55, 0x4b, 0x94, 0x61, 0x09, 0x45, 0xcf, 0x40, - 0xbd, 0xeb, 0x7b, 0x83, 0x7e, 0xd0, 0x62, 0x31, 0x4c, 0x7c, 0x06, 0x99, 0x22, 0x71, 0x2d, 0x2e, - 0xc6, 0x6a, 0x1d, 0xf4, 0x09, 0x98, 0xe6, 0x3f, 0xd7, 0x7d, 0xb2, 0x65, 0xef, 0x89, 0xe5, 0xc6, - 0x02, 0x23, 0xae, 0x29, 0xe5, 0x38, 0x51, 0x0b, 0x7d, 0x04, 0xa6, 0xec, 0x20, 0x18, 0x10, 0x7f, - 0x03, 0xdf, 0x14, 0xd9, 0x9c, 0x98, 0x43, 0xb5, 0x1d, 0x15, 0xe2, 0x18, 0x8e, 0x7e, 0x41, 0x83, - 0x59, 0x9f, 0xbc, 0x33, 0xb0, 0x7d, 0x62, 0x31, 0xa2, 0x81, 0x88, 0xd8, 0xc7, 0xa3, 0xdd, 0x12, - 0x58, 0xc2, 0x09, 0xa4, 0x9c, 0xcf, 0xa5, 0x3b, 0x22, 0x09, 0xc4, 0xa9, 0x1e, 0xd0, 0xa1, 0x0a, - 0xec, 0xae, 0x6b, 0xbb, 0xdd, 0x65, 0xa7, 0x1b, 0x2c, 0xd4, 0xd8, 0xd2, 0xe5, 0x3a, 0x57, 0x5c, - 0x8c, 0xd5, 0x3a, 0xe8, 0x39, 0x98, 0x19, 0x04, 0x94, 0x73, 0x7b, 0x84, 0x8f, 0xef, 0x54, 0x1c, - 0x58, 0xb8, 0xa1, 0x02, 0x70, 0xb2, 0x1e, 0x35, 0xf1, 0xa2, 0x02, 0x31, 0xca, 0xc0, 0xef, 0xd5, - 0xd2, 0x7e, 0x6e, 0x24, 0x20, 0x38, 0x55, 0x73, 0x71, 0x19, 0xce, 0xe6, 0x7c, 0xe6, 0xb1, 0x96, - 0xc7, 0x37, 0x2b, 0xf0, 0x81, 0x07, 0x72, 0x25, 0xfa, 0x3b, 0x1a, 0xd4, 0xc9, 0x5e, 0xe8, 0x1b, - 0x32, 0xcc, 0x91, 0x4e, 0xd1, 0xd6, 0x89, 0x2c, 0x81, 0xa5, 0xd5, 0x98, 0x10, 0x9f, 0x36, 0xb9, - 0xdd, 0x29, 0x10, 0xac, 0xf6, 0x87, 0x6a, 0xeb, 0xfc, 0xd6, 0xb5, 0xea, 0xae, 0x13, 0xa9, 0xd6, - 0x05, 0x64, 0xf1, 0x33, 0x30, 0x97, 0xc6, 0x7c, 0xac, 0x91, 0xfa, 0xc7, 0x15, 0xa8, 0xae, 0x3b, - 0xc6, 0xa9, 0x24, 0xe6, 0xfa, 0x4b, 0x89, 0xac, 0x28, 0xa5, 0x52, 0xcd, 0xb0, 0xae, 0x16, 0xe6, - 0x63, 0xea, 0xa6, 0xf2, 0x31, 0xbd, 0x5c, 0x9e, 0xc4, 0xd1, 0xe9, 0x97, 0xfe, 0x95, 0x06, 0x53, - 0xac, 0xde, 0x29, 0xa4, 0x01, 0x79, 0x2b, 0x99, 0x06, 0xe4, 0xf9, 0xd2, 0xdf, 0x54, 0x90, 0xf5, - 0xe3, 0xbb, 0xd1, 0xb7, 0xb0, 0x24, 0x1f, 0x9f, 0x53, 0x9f, 0x98, 0xe0, 0x1f, 0x73, 0x39, 0x2f, - 0x1f, 0xd1, 0x4d, 0xcf, 0x34, 0x9c, 0x4c, 0x52, 0xa2, 0x23, 0xdf, 0x99, 0xe8, 0xc1, 0x14, 0x11, - 0x37, 0xdb, 0xa3, 0x8f, 0x29, 0xa5, 0xd2, 0x46, 0xd7, 0xe3, 0x63, 0x72, 0x51, 0x49, 0x80, 0x63, - 0x0a, 0xfa, 0x3f, 0xaf, 0x40, 0x5d, 0x99, 0xcb, 0x77, 0x23, 0xdd, 0xd1, 0xd5, 0xdc, 0xec, 0xeb, - 0x15, 0x16, 0xc7, 0x78, 0xe1, 0x18, 0x99, 0xd7, 0x7d, 0xa8, 0x9b, 0x71, 0xea, 0xca, 0x51, 0x98, - 0x5b, 0xc9, 0x80, 0x29, 0x02, 0xa9, 0xe3, 0x02, 0xac, 0x12, 0xd1, 0x7f, 0xb7, 0x02, 0x93, 0xeb, - 0xbe, 0x47, 0x27, 0xf8, 0x14, 0x44, 0x83, 0x91, 0x10, 0x0d, 0xe5, 0xd6, 0x2d, 0xef, 0x6c, 0xa1, - 0x70, 0xb0, 0x53, 0xc2, 0x61, 0x79, 0x14, 0x22, 0x47, 0x8b, 0x87, 0x7f, 0xa3, 0x41, 0x5d, 0xd4, - 0x3c, 0x05, 0x01, 0xf1, 0xf9, 0xa4, 0x80, 0x78, 0x71, 0x84, 0xef, 0x2a, 0x10, 0x11, 0x5f, 0xd3, - 0x60, 0x46, 0xd4, 0x58, 0x23, 0xbd, 0x4d, 0xe2, 0xa3, 0xab, 0x30, 0x19, 0x0c, 0xd8, 0x44, 0x8a, - 0x0f, 0x7a, 0x5c, 0x15, 0x12, 0xfe, 0xa6, 0x61, 0xb2, 0x87, 0x44, 0x78, 0x15, 0x25, 0x05, 0x1a, - 0x2f, 0xc0, 0x51, 0x63, 0x6a, 0xc2, 0xf9, 0x9e, 0x93, 0xc9, 0x45, 0x80, 0x3d, 0x87, 0x60, 0x06, - 0xa1, 0x96, 0x13, 0xfd, 0x1b, 0x9d, 0x47, 0x31, 0xcb, 0x89, 0x82, 0x03, 0xcc, 0xcb, 0xf5, 0xaf, - 0x8c, 0xcb, 0xc1, 0x66, 0x12, 0xec, 0x3a, 0x4c, 0x99, 0x3e, 0x31, 0x42, 0x62, 0x35, 0xf7, 0x87, - 0xe9, 0x1c, 0xd3, 0xe2, 0x5a, 0x51, 0x0b, 0x1c, 0x37, 0xa6, 0x0a, 0x93, 0x7a, 0xc4, 0x54, 0x89, - 0x75, 0xcb, 0xc2, 0xe3, 0xa5, 0x4f, 0x43, 0xd5, 0xbb, 0xeb, 0xca, 0xd8, 0x8a, 0x23, 0x09, 0xb3, - 0x4f, 0xb9, 0x4d, 0x6b, 0x63, 0xde, 0x88, 0xe5, 0x6b, 0x11, 0xe9, 0x3a, 0xb8, 0x22, 0x5b, 0xcf, - 0x4b, 0xd5, 0x81, 0x1c, 0x98, 0xec, 0xb1, 0x69, 0x18, 0x29, 0x23, 0x56, 0x62, 0x42, 0xd5, 0xcc, - 0xa4, 0x0c, 0x33, 0x8e, 0x48, 0x50, 0xc5, 0x97, 0x2a, 0x67, 0x41, 0xdf, 0x30, 0x89, 0xaa, 0xf8, - 0xde, 0x8a, 0x0a, 0x71, 0x0c, 0x47, 0xfb, 0x50, 0xe7, 0x17, 0xd6, 0xb9, 0x94, 0x9d, 0x2c, 0xef, - 0xd3, 0x14, 0xdd, 0xbb, 0x13, 0x63, 0xe3, 0x43, 0xaf, 0x14, 0x60, 0x95, 0x96, 0xfe, 0x73, 0xe3, - 0x92, 0x49, 0x85, 0xc4, 0xcf, 0x7f, 0xfc, 0x42, 0x2b, 0xf5, 0xf8, 0xc5, 0xc7, 0xa1, 0xda, 0xdf, - 0x36, 0x82, 0x88, 0x53, 0xa3, 0x2c, 0xba, 0xd5, 0x75, 0x5a, 0x78, 0xff, 0xa0, 0x31, 0x2d, 0x48, - 0xb3, 0xdf, 0x98, 0xd7, 0x45, 0x03, 0x38, 0x1b, 0x84, 0x86, 0x43, 0x3a, 0xb6, 0xf0, 0x16, 0x05, - 0xa1, 0xd1, 0xeb, 0x97, 0x48, 0x86, 0xcb, 0x4e, 0xa8, 0x3a, 0x59, 0x54, 0x38, 0x0f, 0x3f, 0xfa, - 0x29, 0x0d, 0x16, 0x58, 0xf9, 0xf2, 0x20, 0xf4, 0x78, 0x02, 0xf0, 0x98, 0xf8, 0xf1, 0xcf, 0x67, - 0x99, 0x75, 0xdf, 0x29, 0xc0, 0x87, 0x0b, 0x29, 0xa1, 0x2f, 0xc0, 0x79, 0xc7, 0x08, 0xc2, 0x65, - 0x33, 0xb4, 0x77, 0xed, 0x70, 0x3f, 0xee, 0x42, 0xf5, 0xd8, 0x5d, 0x60, 0x01, 0x1a, 0x37, 0xf3, - 0x90, 0xe1, 0x7c, 0x1a, 0xfa, 0x9f, 0x6a, 0x80, 0xb2, 0x2c, 0x84, 0x1c, 0xa8, 0x59, 0x64, 0xcb, - 0x18, 0x38, 0x61, 0xa4, 0x02, 0x94, 0xba, 0xb7, 0x1d, 0xa3, 0x8c, 0x25, 0xf3, 0x8a, 0xc0, 0x8b, - 0x25, 0x05, 0xe4, 0xc1, 0xd4, 0xdd, 0x6d, 0x3b, 0x24, 0x8e, 0x1d, 0x84, 0x42, 0x3a, 0x8f, 0x4a, - 0x4e, 0xea, 0x3c, 0xaf, 0x47, 0x88, 0x71, 0x4c, 0x43, 0xff, 0x99, 0x31, 0xa8, 0x1d, 0xe3, 0xbd, - 0xb5, 0x01, 0x20, 0x91, 0xb0, 0x81, 0x2a, 0x4a, 0x64, 0x14, 0x17, 0x19, 0x53, 0x67, 0x5a, 0x19, - 0x64, 0x38, 0x87, 0x00, 0xfa, 0x02, 0x9c, 0xb3, 0xdd, 0x2d, 0xdf, 0x08, 0x42, 0x7f, 0x60, 0x86, - 0x03, 0x9f, 0x8c, 0x92, 0x84, 0x97, 0xb9, 0x16, 0xda, 0x39, 0xe8, 0x70, 0x2e, 0x11, 0x44, 0x60, - 0xf2, 0xae, 0xe7, 0xef, 0x50, 0xe1, 0x39, 0x5e, 0xfe, 0xa9, 0x86, 0xd7, 0x19, 0x8a, 0x58, 0x6a, - 0xf2, 0xdf, 0x01, 0x8e, 0x70, 0xeb, 0xdf, 0xd6, 0xa0, 0xca, 0x6f, 0xa4, 0xbd, 0x2f, 0xec, 0x2a, - 0xd6, 0xd5, 0xc2, 0xe4, 0x92, 0xd4, 0xdc, 0x61, 0x35, 0xde, 0x27, 0xe6, 0x0e, 0xeb, 0x6b, 0x81, - 0x2e, 0xf3, 0xed, 0x31, 0xf1, 0x2d, 0x4c, 0x59, 0x68, 0xc3, 0x59, 0xa1, 0xf4, 0xde, 0xb4, 0xb7, - 0x08, 0xe5, 0xae, 0x15, 0x63, 0x3f, 0x10, 0x57, 0xc1, 0x99, 0xd4, 0x6d, 0x65, 0xc1, 0x38, 0xaf, - 0x0d, 0xfa, 0x67, 0x1a, 0xdd, 0x96, 0x43, 0xdf, 0x36, 0x47, 0xca, 0xd8, 0x28, 0xfb, 0xb6, 0xb4, - 0xc6, 0x91, 0x71, 0x6f, 0xc1, 0x46, 0xbc, 0x3f, 0xb3, 0xd2, 0xfb, 0x07, 0x8d, 0x46, 0x8e, 0x2b, - 0x32, 0x72, 0x9d, 0xd3, 0x81, 0xfd, 0xf2, 0xf7, 0x8f, 0xac, 0xc2, 0xdc, 0xf8, 0x51, 0x8f, 0xd1, - 0x75, 0xa8, 0x06, 0xa6, 0xd7, 0x27, 0xc7, 0xc9, 0x41, 0x2b, 0x07, 0xb8, 0x43, 0x5b, 0x62, 0x8e, - 0x60, 0xf1, 0x6d, 0x98, 0x56, 0x7b, 0x9e, 0xe3, 0x8d, 0x58, 0x51, 0xbd, 0x11, 0xc7, 0x3e, 0xac, - 0x53, 0xbd, 0x17, 0xbf, 0x57, 0x01, 0xf1, 0xbe, 0xd2, 0x10, 0x87, 0x15, 0x76, 0x94, 0x98, 0x6e, - 0x84, 0x37, 0xa5, 0xd2, 0xcf, 0xbb, 0xc6, 0x63, 0xa0, 0xe6, 0xa6, 0x43, 0x2e, 0x4c, 0x38, 0xc6, - 0x26, 0x71, 0xa2, 0xd7, 0x76, 0xae, 0x96, 0x7f, 0x0e, 0x86, 0x67, 0x4d, 0x0d, 0x52, 0x2e, 0x6d, - 0x5e, 0x88, 0x05, 0x95, 0xc5, 0xe7, 0xa1, 0xae, 0x54, 0x3b, 0x96, 0x03, 0xe8, 0xab, 0x1a, 0x5c, - 0x88, 0x58, 0x22, 0x99, 0xd0, 0x02, 0x5d, 0x86, 0x9a, 0xd1, 0xb7, 0x99, 0x4f, 0x54, 0xf5, 0x2a, - 0x2f, 0xaf, 0xb7, 0x59, 0x19, 0x96, 0x50, 0xf4, 0x51, 0xa8, 0x45, 0xf3, 0x24, 0x14, 0x24, 0xb9, - 0xc4, 0xe5, 0x61, 0x8e, 0xac, 0x81, 0x3e, 0xa4, 0xa4, 0xda, 0xab, 0xc6, 0x3b, 0x9a, 0x24, 0xcc, - 0xcf, 0x7d, 0xf5, 0xbf, 0x55, 0x81, 0x19, 0xee, 0x48, 0x68, 0xda, 0xae, 0x65, 0xbb, 0xdd, 0x53, - 0x10, 0xa5, 0x89, 0x17, 0x36, 0x2b, 0x0f, 0xeb, 0x85, 0xcd, 0x1b, 0x30, 0xf1, 0x0e, 0x5d, 0xd6, - 0x11, 0x3b, 0x0c, 0xb5, 0xba, 0xe4, 0x5c, 0x33, 0x89, 0x10, 0x60, 0x81, 0x42, 0xff, 0x0f, 0x1a, - 0xcc, 0x27, 0x86, 0xe5, 0x14, 0x84, 0xf2, 0x56, 0x52, 0x28, 0x2f, 0x97, 0x4b, 0xeb, 0xa2, 0xf4, - 0xb9, 0x40, 0x38, 0xff, 0x56, 0x05, 0xc6, 0x3b, 0x84, 0x58, 0xa7, 0x30, 0xd3, 0x6f, 0x25, 0x36, - 0xcd, 0x4f, 0x97, 0x7e, 0x43, 0xa9, 0xc8, 0xdd, 0xb0, 0x95, 0x72, 0x37, 0x7c, 0xa6, 0x34, 0x85, - 0xa3, 0x7d, 0x0d, 0xbf, 0x52, 0x01, 0xa0, 0xd5, 0xf8, 0x1b, 0x87, 0x22, 0xe6, 0x30, 0x7e, 0x05, - 0x77, 0xea, 0xbd, 0xf2, 0x76, 0xad, 0x2e, 0xdf, 0xc7, 0x1b, 0x8b, 0x9d, 0xd9, 0xc9, 0xb7, 0xf1, - 0x92, 0xab, 0x6f, 0xfc, 0x21, 0xad, 0x3e, 0xfd, 0x1f, 0x6a, 0xc0, 0x72, 0xaf, 0xaf, 0xdc, 0xea, - 0xa0, 0xe7, 0x60, 0xc6, 0xe6, 0x47, 0x85, 0x2b, 0x6a, 0xfa, 0x34, 0x76, 0xa0, 0xd1, 0x56, 0x01, - 0x38, 0x59, 0x0f, 0xf5, 0x94, 0x71, 0x1d, 0xe1, 0xa5, 0x51, 0xd1, 0x0f, 0x99, 0xa0, 0x76, 0x3a, - 0x7f, 0x62, 0xf4, 0xef, 0x57, 0xe0, 0x4c, 0xaa, 0xee, 0x10, 0xfa, 0xfc, 0xc9, 0x48, 0x2f, 0x25, - 0x67, 0xed, 0xd8, 0xc9, 0xe7, 0xac, 0x95, 0xe9, 0x63, 0xc7, 0x4f, 0x36, 0x7d, 0xec, 0x1f, 0x6a, - 0xc0, 0x9e, 0xae, 0x3c, 0x05, 0xe9, 0xf9, 0x17, 0x93, 0xd2, 0xf3, 0x53, 0x65, 0x19, 0xa7, 0x40, - 0x68, 0xfe, 0x7a, 0x05, 0x58, 0x1e, 0x75, 0x11, 0x19, 0xa1, 0x04, 0x1b, 0x68, 0x05, 0xc1, 0x06, - 0x97, 0x44, 0xac, 0x42, 0xca, 0xeb, 0xa6, 0xc4, 0x2b, 0x7c, 0x54, 0x09, 0x47, 0x18, 0x4b, 0x8a, - 0x91, 0x6c, 0x48, 0x02, 0xba, 0x07, 0x33, 0xc1, 0xb6, 0xe7, 0x85, 0x91, 0x09, 0x2c, 0xe6, 0x6e, - 0xb9, 0x74, 0x88, 0x70, 0xf4, 0x29, 0x7c, 0x61, 0x76, 0x54, 0xdc, 0x38, 0x49, 0x0a, 0x2d, 0x01, - 0x6c, 0x3a, 0x9e, 0xb9, 0xd3, 0x6a, 0xaf, 0xe0, 0x28, 0x90, 0x94, 0x85, 0x33, 0x35, 0x65, 0x29, - 0x56, 0x6a, 0xe8, 0x7f, 0xa0, 0xf1, 0xd1, 0x3a, 0xc6, 0xb2, 0x3a, 0x45, 0x29, 0xf9, 0xe1, 0x94, - 0x94, 0x2c, 0x7a, 0x45, 0xf4, 0x77, 0xc5, 0x57, 0xc8, 0x6c, 0xf9, 0x7d, 0x98, 0x71, 0xd4, 0xf4, - 0xfa, 0x82, 0x8d, 0x4b, 0x65, 0xe6, 0x97, 0xa9, 0xdf, 0x12, 0xc5, 0x38, 0x49, 0x80, 0x8a, 0xd2, - 0xa8, 0xf3, 0xfc, 0xd1, 0x3f, 0x1e, 0x0b, 0xc2, 0x66, 0x6c, 0x5d, 0x05, 0xe0, 0x64, 0x3d, 0xfd, - 0x55, 0x78, 0x8a, 0x77, 0x9d, 0xc5, 0x72, 0xaf, 0xee, 0x99, 0x24, 0x08, 0x5a, 0x46, 0xdf, 0x30, - 0xa9, 0x72, 0xcf, 0xae, 0x40, 0x72, 0x97, 0xdb, 0xd3, 0xe9, 0x54, 0xb2, 0xd2, 0xda, 0xce, 0x64, - 0xe9, 0xf9, 0xff, 0x1a, 0x34, 0x14, 0x9c, 0x89, 0x50, 0x94, 0x88, 0x49, 0xbf, 0xae, 0x41, 0xdd, - 0x70, 0x5d, 0x2f, 0x34, 0xd4, 0x13, 0x20, 0xab, 0xfc, 0xe3, 0x89, 0x85, 0xa4, 0x96, 0x96, 0x63, - 0x32, 0xa9, 0xb3, 0x5e, 0x05, 0x82, 0xd5, 0xde, 0x2c, 0x7e, 0x06, 0xe6, 0xd2, 0xad, 0x8e, 0xa5, - 0xc6, 0x37, 0xe1, 0xbc, 0xd2, 0x2b, 0x71, 0x99, 0x8c, 0xea, 0xcc, 0x4f, 0xc3, 0xe4, 0xae, 0x1d, - 0xd8, 0xd1, 0xa5, 0x64, 0x65, 0x14, 0x5f, 0xe3, 0xc5, 0x38, 0x82, 0xeb, 0xaf, 0xc0, 0x59, 0x15, - 0x07, 0x5b, 0x66, 0xb7, 0x3a, 0xc7, 0x99, 0x87, 0x35, 0xb8, 0xa4, 0x60, 0xc8, 0xbd, 0x51, 0x75, - 0x1c, 0x74, 0x5f, 0x9a, 0x88, 0xb8, 0x5c, 0x84, 0xfd, 0xff, 0xb6, 0x06, 0x8f, 0x91, 0x22, 0x86, - 0x11, 0x2c, 0xff, 0xc6, 0x88, 0x33, 0x5a, 0xc8, 0x90, 0x22, 0xeb, 0x4e, 0x11, 0x18, 0x17, 0xf7, - 0x0c, 0xed, 0x03, 0x04, 0x72, 0x4a, 0x46, 0x09, 0xdf, 0xcc, 0x9d, 0x63, 0x91, 0x62, 0x56, 0xfe, - 0xc6, 0x0a, 0x31, 0xf4, 0x0e, 0xd4, 0x02, 0x31, 0x93, 0xa3, 0x5c, 0xf8, 0xcc, 0x61, 0x0c, 0x11, - 0xa1, 0x26, 0x7e, 0x61, 0x49, 0x06, 0xfd, 0xaa, 0x06, 0xe7, 0x9c, 0x9c, 0x75, 0x21, 0xb6, 0x85, - 0xce, 0x09, 0x2c, 0x39, 0xee, 0x06, 0xcc, 0x83, 0xe0, 0xdc, 0xae, 0xa0, 0xbf, 0x57, 0x78, 0xbb, - 0xb0, 0x5a, 0xfe, 0x79, 0x89, 0x07, 0xf1, 0x7e, 0x89, 0x8b, 0x86, 0x5f, 0x9d, 0xe4, 0x6a, 0x0a, - 0xf3, 0x56, 0x6d, 0xc2, 0xc4, 0x26, 0x53, 0xf3, 0x05, 0xab, 0x97, 0xb6, 0x29, 0xb8, 0xb1, 0xc0, - 0x75, 0x70, 0xfe, 0x3f, 0x16, 0x98, 0xd1, 0x9b, 0x30, 0x66, 0xb9, 0xd1, 0xbb, 0x3c, 0x2f, 0x8e, - 0xa0, 0xe3, 0xc6, 0x11, 0xae, 0x94, 0x3b, 0x28, 0x52, 0xe4, 0x42, 0xcd, 0x15, 0x3b, 0xbb, 0xe0, - 0xc5, 0xd2, 0x6f, 0xd7, 0x4a, 0x0d, 0x41, 0xea, 0x25, 0x51, 0x09, 0x96, 0x34, 0x28, 0x3d, 0xa9, - 0xb4, 0x8f, 0x8f, 0x46, 0x4f, 0x6a, 0xec, 0x47, 0x99, 0x53, 0xeb, 0xaa, 0xfe, 0x5d, 0x1d, 0x5e, - 0xff, 0x9e, 0x29, 0xd4, 0xbd, 0x09, 0x4c, 0x84, 0x06, 0x0b, 0x98, 0x98, 0x28, 0x1f, 0xb0, 0x40, - 0xfb, 0x7f, 0x87, 0x62, 0x89, 0xd5, 0x09, 0xf6, 0x33, 0xc0, 0x02, 0x39, 0x65, 0x2c, 0xfe, 0xac, - 0xae, 0x38, 0xb1, 0x2b, 0xcd, 0x58, 0xfc, 0xb9, 0x04, 0xce, 0x58, 0xfc, 0x7f, 0x2c, 0x30, 0xa3, - 0xb7, 0xa9, 0x4a, 0xc9, 0xe5, 0xb8, 0x48, 0x92, 0xf5, 0xca, 0x88, 0x6b, 0x2c, 0x88, 0x62, 0x64, - 0xf9, 0x2f, 0x2c, 0xf1, 0xa3, 0x4d, 0x98, 0x14, 0xe6, 0x9b, 0xb8, 0x2c, 0xfc, 0xe2, 0x08, 0x39, - 0xaf, 0xa3, 0x17, 0x40, 0xf8, 0x85, 0xbd, 0x08, 0xb1, 0xfe, 0xef, 0xa6, 0xb8, 0xe1, 0x2d, 0x0e, - 0x1b, 0xb7, 0xa0, 0x16, 0xa1, 0x1b, 0x25, 0x5e, 0x3b, 0xca, 0xe0, 0xcf, 0x3f, 0x2d, 0xfa, 0x85, - 0x25, 0x6e, 0xd4, 0xca, 0x0b, 0x8d, 0x8f, 0xf3, 0x1d, 0x0e, 0x17, 0x16, 0x9f, 0x8c, 0x85, 0x19, - 0x3b, 0x8d, 0x58, 0x98, 0xfc, 0xc3, 0xd8, 0xf1, 0x52, 0x87, 0xb1, 0x2f, 0xc1, 0x99, 0x28, 0x54, - 0xc5, 0x22, 0xcc, 0x29, 0x2c, 0x82, 0x38, 0xd9, 0xfd, 0xb3, 0x56, 0x12, 0x84, 0xd3, 0x75, 0xd1, - 0xef, 0x69, 0x50, 0x33, 0xc5, 0x2e, 0x2d, 0xd6, 0xd5, 0xcd, 0xd1, 0xbc, 0x33, 0x4b, 0xd1, 0xa6, - 0xcf, 0xd5, 0xbd, 0xd7, 0x22, 0x19, 0x11, 0x15, 0x3f, 0x24, 0x6f, 0xbd, 0xec, 0x35, 0xfa, 0xd7, - 0x54, 0x99, 0x75, 0xd8, 0xbb, 0x02, 0xec, 0x3a, 0x0f, 0x8f, 0x2e, 0xbd, 0x3d, 0xe2, 0x57, 0x2c, - 0xc7, 0x18, 0xf9, 0x87, 0x7c, 0x4e, 0xea, 0xad, 0x31, 0xe4, 0x21, 0x7d, 0x8b, 0xda, 0x7d, 0xf4, - 0x6b, 0x1a, 0x3c, 0xc5, 0x43, 0x7a, 0x5b, 0x74, 0x17, 0x64, 0xef, 0x72, 0x90, 0xf8, 0x21, 0x90, - 0xf8, 0xe8, 0xb8, 0x76, 0xec, 0xa3, 0xe3, 0xcb, 0x87, 0x07, 0x8d, 0xa7, 0x5a, 0x43, 0xe0, 0xc6, - 0x43, 0xf5, 0x60, 0x71, 0x07, 0x66, 0x12, 0x93, 0x7d, 0x92, 0xe7, 0x1b, 0x8b, 0x2e, 0xcc, 0xa5, - 0xe7, 0xe4, 0x44, 0xcf, 0x53, 0x6e, 0xc0, 0x94, 0xdc, 0x2c, 0xd0, 0x93, 0x0a, 0xa1, 0x78, 0x33, - 0xbf, 0x41, 0xf6, 0x39, 0xd5, 0x46, 0xc2, 0x16, 0xe1, 0x5e, 0x86, 0xd7, 0x68, 0x81, 0x40, 0xa8, - 0x7f, 0x47, 0xd8, 0xa8, 0x77, 0x48, 0xaf, 0xef, 0x18, 0x21, 0x79, 0xff, 0x3b, 0x75, 0xf5, 0xff, - 0xae, 0x71, 0x99, 0x2f, 0xde, 0x1c, 0x32, 0xa0, 0xde, 0xe3, 0xa9, 0xc6, 0xd8, 0xdd, 0x33, 0xad, - 0xfc, 0xad, 0xb7, 0xb5, 0x18, 0x0d, 0x56, 0x71, 0xa2, 0xbb, 0xd9, 0x57, 0xb1, 0xae, 0x8e, 0xb6, - 0x39, 0x0f, 0xfd, 0x38, 0x16, 0xca, 0xb6, 0x51, 0x1f, 0x14, 0xd2, 0x8e, 0x7e, 0x50, 0xe8, 0xc1, - 0xcf, 0xcc, 0xe8, 0xff, 0xaf, 0x02, 0xb9, 0x29, 0xdd, 0x91, 0x0e, 0x13, 0x3c, 0x96, 0x5e, 0x7d, - 0x2e, 0x8c, 0x07, 0xda, 0x63, 0x01, 0x41, 0x3e, 0x9c, 0x13, 0x91, 0xea, 0x37, 0xc8, 0x7e, 0xfc, - 0x50, 0x95, 0x98, 0xfa, 0xe1, 0x63, 0x56, 0x59, 0x0a, 0xa2, 0x4e, 0x0a, 0x13, 0xce, 0xc5, 0x8d, - 0x6e, 0xf3, 0x8b, 0x23, 0xae, 0x75, 0xc7, 0xdb, 0x21, 0x6e, 0x2c, 0x1d, 0xc4, 0x3d, 0xb8, 0xc7, - 0xa2, 0x8b, 0x23, 0x99, 0x0a, 0x38, 0xbf, 0x1d, 0xda, 0x05, 0xd4, 0x33, 0xf6, 0xd2, 0xd8, 0x46, - 0xc8, 0x26, 0xbd, 0x96, 0xc1, 0x86, 0x73, 0x28, 0xb0, 0xa8, 0x6f, 0x66, 0xb8, 0xbd, 0x3f, 0xa2, - 0x13, 0x58, 0x57, 0x4f, 0x36, 0xea, 0x9b, 0x93, 0x38, 0xfa, 0xa8, 0xe5, 0x73, 0x70, 0x81, 0x55, - 0x5b, 0xb6, 0x98, 0xad, 0x16, 0x10, 0x6b, 0xd9, 0xb2, 0xd8, 0x15, 0xac, 0x51, 0x1f, 0xea, 0x62, - 0x11, 0x16, 0x0c, 0xf7, 0xfb, 0x24, 0xc2, 0x82, 0xf5, 0xb5, 0xc0, 0x1f, 0xfd, 0x87, 0x1a, 0xcc, - 0x67, 0x12, 0x3d, 0x0c, 0x75, 0x3e, 0x7f, 0x6a, 0x6e, 0xd6, 0x0f, 0xa5, 0x1f, 0xb8, 0xaa, 0xe7, - 0xe6, 0x7f, 0x79, 0x1d, 0x66, 0x12, 0xee, 0x68, 0x79, 0xc9, 0x4f, 0xcb, 0xbd, 0xe4, 0xa7, 0xde, - 0xe1, 0xab, 0x1c, 0x79, 0x87, 0xef, 0x9b, 0x33, 0x62, 0xba, 0x99, 0x59, 0xff, 0x16, 0x4c, 0xb0, - 0x9b, 0x76, 0xd1, 0x9b, 0x80, 0x2f, 0x94, 0xbe, 0xc1, 0x17, 0x70, 0x51, 0xc9, 0xff, 0xc7, 0x02, - 0x2b, 0x5a, 0x81, 0x39, 0xd3, 0xf1, 0x06, 0xd4, 0x86, 0xdd, 0xb2, 0x1d, 0x72, 0x2b, 0x96, 0xca, - 0x32, 0x55, 0x40, 0x2b, 0x05, 0xc7, 0x99, 0x16, 0x08, 0x73, 0xc7, 0x00, 0x5f, 0x63, 0xcf, 0x95, - 0x3c, 0x96, 0xe1, 0xc9, 0xd8, 0xa4, 0x43, 0xe0, 0x1d, 0x00, 0x12, 0x4d, 0x5c, 0x14, 0x8f, 0xf5, - 0x52, 0xb9, 0x24, 0x08, 0x72, 0xfa, 0x23, 0x61, 0x24, 0x8b, 0x02, 0xac, 0x10, 0x41, 0x3e, 0xd4, - 0xb7, 0xe3, 0xf7, 0xbf, 0x84, 0x95, 0xfe, 0xf2, 0x88, 0x6f, 0x8f, 0xf1, 0x4d, 0x5c, 0x29, 0xc0, - 0x2a, 0x11, 0xe4, 0x03, 0xc4, 0x36, 0xd8, 0x28, 0xef, 0xc5, 0xc4, 0xc6, 0x5d, 0xfc, 0x9d, 0x71, - 0x19, 0x56, 0xa8, 0x50, 0x9a, 0xae, 0xbc, 0x2a, 0x3b, 0x8a, 0x59, 0x1f, 0x5f, 0xb8, 0x8d, 0x69, - 0xc6, 0x65, 0x58, 0xa1, 0x42, 0xc7, 0xb6, 0x17, 0x5f, 0x8f, 0x16, 0xca, 0xfa, 0xcb, 0x23, 0x5e, - 0x53, 0x17, 0x0a, 0x52, 0x5c, 0x80, 0x55, 0x22, 0xc8, 0x05, 0xe8, 0xc9, 0x5b, 0xd3, 0xc2, 0xda, - 0x2f, 0xf5, 0x9d, 0xf1, 0xdd, 0x6b, 0xee, 0x4f, 0x8d, 0x7f, 0x63, 0x85, 0x02, 0x7a, 0x5b, 0xf1, - 0x29, 0x41, 0x79, 0x35, 0x73, 0x28, 0x7f, 0xd2, 0x27, 0x63, 0x6d, 0xab, 0xce, 0xd6, 0xeb, 0xe3, - 0x8a, 0xa6, 0x75, 0xff, 0xa0, 0x31, 0xcd, 0x64, 0x48, 0x46, 0xf3, 0x8a, 0x0f, 0x91, 0xa6, 0x8f, - 0x3a, 0x44, 0x42, 0xd7, 0x60, 0x3e, 0x50, 0x83, 0x32, 0x98, 0x60, 0x98, 0x61, 0x4d, 0xe4, 0x2d, - 0xfb, 0x4e, 0xba, 0x02, 0xce, 0xb6, 0xe1, 0x82, 0x8f, 0x58, 0xac, 0xfd, 0xac, 0x2a, 0xf8, 0x78, - 0x19, 0x96, 0x50, 0xb4, 0x9b, 0x7a, 0x3f, 0xfa, 0xcc, 0xa8, 0x8e, 0xa0, 0x21, 0x1f, 0x93, 0xfe, - 0x82, 0xfa, 0x76, 0xf1, 0x5c, 0xf9, 0xe8, 0xbc, 0xfc, 0x9b, 0xf2, 0x0f, 0x78, 0xbf, 0x78, 0x90, - 0x0c, 0x8a, 0x9f, 0x7f, 0x28, 0x81, 0xc0, 0xf2, 0x48, 0xa9, 0x28, 0x20, 0x1e, 0xb5, 0x60, 0x9e, - 0xec, 0xf5, 0xbd, 0x60, 0xe0, 0x13, 0x96, 0xa4, 0x83, 0x4d, 0x0f, 0x8a, 0x3d, 0x45, 0xab, 0x69, - 0x20, 0xce, 0xd6, 0xd7, 0xbf, 0x3d, 0x05, 0x75, 0x45, 0x37, 0x7a, 0x37, 0x6e, 0x51, 0x85, 0x50, - 0x37, 0x3d, 0x37, 0x08, 0x7d, 0x43, 0xb9, 0x39, 0x36, 0x22, 0x4d, 0x39, 0x7a, 0xad, 0x18, 0x33, - 0x56, 0xc9, 0xd0, 0x75, 0x2e, 0xfd, 0x79, 0x63, 0x0f, 0xc1, 0x9f, 0x27, 0xd7, 0x79, 0x8e, 0x4f, - 0xef, 0x13, 0x00, 0xd1, 0x76, 0x21, 0x1f, 0x95, 0x95, 0xd9, 0xfd, 0xda, 0xc1, 0x75, 0x09, 0xc3, - 0x4a, 0x3d, 0x74, 0x0f, 0x66, 0x1c, 0x35, 0xb3, 0x97, 0xd8, 0xcb, 0x4a, 0x9d, 0xba, 0x27, 0x52, - 0x84, 0xf1, 0x33, 0xdc, 0x44, 0x11, 0x4e, 0x92, 0xa2, 0x6c, 0xe0, 0x44, 0xd9, 0xe8, 0x46, 0xf2, - 0x4d, 0xcb, 0x9c, 0x76, 0x31, 0x1b, 0xc8, 0xa2, 0x00, 0x2b, 0x44, 0x0a, 0x1c, 0x88, 0x93, 0xa5, - 0x1c, 0x88, 0x03, 0x38, 0xeb, 0x93, 0xd0, 0xdf, 0x6f, 0xed, 0x9b, 0xec, 0xcd, 0x49, 0x3f, 0x64, - 0xa9, 0xe0, 0x6a, 0xe5, 0x2e, 0x66, 0xe0, 0x2c, 0x2a, 0x9c, 0x87, 0x3f, 0x21, 0x27, 0xa7, 0x8e, - 0x94, 0x93, 0x9f, 0x84, 0x7a, 0x48, 0xcc, 0x6d, 0xd7, 0x36, 0x0d, 0xa7, 0xbd, 0x22, 0x2e, 0x4f, - 0xc7, 0x4b, 0x3e, 0x06, 0x61, 0xb5, 0x1e, 0x6a, 0xc2, 0xd8, 0xc0, 0xb6, 0xc4, 0x66, 0xf1, 0x23, - 0xd2, 0xca, 0x68, 0xaf, 0xdc, 0x3f, 0x68, 0x7c, 0x20, 0xf6, 0xc8, 0xc9, 0xaf, 0xba, 0xd2, 0xdf, - 0xe9, 0x5e, 0x09, 0xf7, 0xfb, 0x24, 0x58, 0xda, 0x68, 0xaf, 0x60, 0xda, 0x38, 0xcf, 0xb9, 0x3a, - 0x7d, 0x0c, 0xe7, 0xea, 0x2f, 0x69, 0x70, 0xd6, 0x48, 0x1b, 0x48, 0x24, 0x58, 0x98, 0x29, 0x2f, - 0x74, 0xf3, 0x8d, 0xae, 0x38, 0x7d, 0xcb, 0x72, 0x96, 0x1c, 0xce, 0xeb, 0x83, 0xfe, 0x47, 0x9a, - 0x50, 0xe8, 0x4f, 0xd1, 0x25, 0x75, 0xd2, 0xe6, 0xaf, 0x7e, 0x13, 0x20, 0xde, 0x02, 0x46, 0x76, - 0xda, 0xfd, 0xb0, 0x0a, 0xe7, 0x47, 0x3d, 0xb7, 0x67, 0x49, 0xea, 0xd8, 0xe3, 0x1f, 0xcb, 0x5b, - 0x21, 0xf1, 0x6f, 0xdf, 0x5e, 0x93, 0x6f, 0x23, 0x94, 0xcc, 0x92, 0x17, 0xbf, 0x1d, 0x93, 0xc1, - 0x88, 0x0b, 0x28, 0xb1, 0xed, 0x4f, 0x24, 0x6c, 0xc7, 0x46, 0x48, 0x9a, 0x03, 0x3f, 0x08, 0x45, - 0xc8, 0x31, 0xdf, 0xfe, 0xd2, 0x40, 0x9c, 0xad, 0x9f, 0x46, 0xc2, 0x1f, 0x22, 0x19, 0x67, 0x0f, - 0xb5, 0x66, 0x90, 0xf0, 0xd7, 0x48, 0xb2, 0xf5, 0x55, 0x24, 0xf2, 0x61, 0x57, 0x26, 0xac, 0x53, - 0x48, 0xe2, 0x57, 0x5f, 0xb3, 0xf5, 0x91, 0x05, 0x4f, 0xf8, 0xc4, 0xf4, 0x7a, 0x3d, 0xe2, 0x5a, - 0x3c, 0xbd, 0xa9, 0xe1, 0x77, 0x6d, 0xf7, 0xaa, 0x6f, 0xb0, 0x8a, 0xe2, 0xf5, 0xd8, 0x4b, 0x87, - 0x07, 0x8d, 0x27, 0xf0, 0x11, 0xf5, 0xf0, 0x91, 0x58, 0x50, 0x0f, 0xce, 0x0c, 0x58, 0x0a, 0x26, - 0xbf, 0xed, 0x86, 0xc4, 0xdf, 0x35, 0x9c, 0x92, 0xcf, 0xeb, 0x30, 0x61, 0xb1, 0x91, 0x44, 0x85, - 0xd3, 0xb8, 0xd1, 0x3e, 0x95, 0xc3, 0xa2, 0x3b, 0x0a, 0xc9, 0x5a, 0xf9, 0x34, 0x8e, 0x38, 0x8b, - 0x0e, 0xe7, 0xd1, 0xd0, 0x7f, 0x49, 0x03, 0x71, 0x42, 0x49, 0xad, 0x7a, 0xc5, 0x35, 0x51, 0x7b, - 0xf7, 0x9f, 0x8d, 0xff, 0xb7, 0x1a, 0x08, 0x0c, 0x2c, 0x79, 0xde, 0x50, 0xa9, 0xd7, 0x1e, 0xfc, - 0xaa, 0x77, 0x9c, 0xfc, 0x6d, 0xac, 0x28, 0xf9, 0xdb, 0x49, 0x65, 0x52, 0xfb, 0x6d, 0x0d, 0xd2, - 0xaf, 0x65, 0xa2, 0x0f, 0xc1, 0xa4, 0xb8, 0x28, 0x27, 0xae, 0xdb, 0xf0, 0x78, 0x50, 0x5e, 0x84, - 0x23, 0x58, 0x52, 0x73, 0x1f, 0xe1, 0x5e, 0x4d, 0xfe, 0x1d, 0x87, 0xa3, 0x35, 0x77, 0xfd, 0xbb, - 0xb3, 0x30, 0xc1, 0xaf, 0x76, 0x51, 0x99, 0x96, 0x13, 0x3e, 0x76, 0xa3, 0xfc, 0xe5, 0xb1, 0x12, - 0x51, 0x62, 0x89, 0x3c, 0x3f, 0x95, 0x23, 0xf3, 0xfc, 0x60, 0x9e, 0xd8, 0x71, 0x04, 0x6f, 0x4d, - 0x0b, 0xb7, 0xc5, 0x5b, 0x02, 0x22, 0xa9, 0x23, 0x0a, 0x13, 0x6e, 0x8c, 0xf1, 0xf2, 0x29, 0x2b, - 0xf9, 0x00, 0x28, 0xce, 0x8c, 0xd9, 0x23, 0x1c, 0x19, 0xf1, 0x5d, 0x9a, 0x6a, 0xf9, 0xe3, 0x0f, - 0x31, 0xe4, 0x43, 0xdc, 0xa5, 0x91, 0x0b, 0x69, 0xa2, 0x70, 0x21, 0x6d, 0xc1, 0xa4, 0x58, 0x0a, - 0x42, 0x38, 0xbe, 0x38, 0x42, 0xd2, 0x46, 0xe5, 0xe6, 0x35, 0x2f, 0xc0, 0x11, 0x72, 0xba, 0xe3, - 0xf6, 0x8c, 0x3d, 0xbb, 0x37, 0xe8, 0x31, 0x89, 0x58, 0x55, 0xab, 0xb2, 0x62, 0x1c, 0xc1, 0x59, - 0x55, 0x7e, 0x6a, 0xc4, 0x14, 0x4b, 0xb5, 0xaa, 0x78, 0x0b, 0x27, 0x82, 0xa3, 0x37, 0xa1, 0xd6, - 0x33, 0xf6, 0x3a, 0x03, 0xbf, 0x4b, 0x84, 0x03, 0xa3, 0x58, 0xe5, 0x19, 0x84, 0xb6, 0xb3, 0x44, - 0xcd, 0xa1, 0xd0, 0x5f, 0x6a, 0xbb, 0xe1, 0x6d, 0xbf, 0x13, 0xfa, 0x32, 0x99, 0xdc, 0x9a, 0xc0, - 0x82, 0x25, 0x3e, 0xe4, 0xc0, 0x6c, 0xcf, 0xd8, 0xdb, 0x70, 0x0d, 0xf9, 0x64, 0x47, 0xbd, 0x24, - 0x05, 0xe6, 0xc5, 0x5d, 0x4b, 0xe0, 0xc2, 0x29, 0xdc, 0x39, 0x0e, 0xe3, 0xe9, 0x93, 0x72, 0x18, - 0x2f, 0xcb, 0x38, 0x1c, 0xae, 0xc7, 0x3e, 0x96, 0x77, 0xbe, 0x74, 0x74, 0x8c, 0xcd, 0x5b, 0x32, - 0xc6, 0x66, 0xb6, 0xbc, 0x97, 0xf7, 0x88, 0xf8, 0x9a, 0x01, 0xd4, 0xa9, 0xc2, 0xc9, 0x4b, 0x83, - 0x85, 0x33, 0xe5, 0xbd, 0x0c, 0x2b, 0x12, 0x8d, 0x92, 0x50, 0x3b, 0x46, 0x8d, 0x55, 0x3a, 0xe8, - 0x36, 0x7f, 0xd2, 0xc1, 0x21, 0x61, 0x5c, 0x85, 0x19, 0x38, 0x73, 0xdc, 0x91, 0x14, 0xbd, 0xc0, - 0x90, 0xa9, 0x80, 0xf3, 0xdb, 0x51, 0x15, 0x95, 0x5f, 0x00, 0x98, 0x8f, 0x13, 0x3e, 0x24, 0x2e, - 0xd7, 0xfd, 0x35, 0x0d, 0xe6, 0xf8, 0x6b, 0x61, 0x2d, 0xaf, 0xd7, 0xf7, 0x5c, 0x42, 0xa7, 0x05, - 0xb1, 0x31, 0xfd, 0x6c, 0x79, 0xd9, 0xd0, 0x49, 0x61, 0x14, 0x07, 0x83, 0xa9, 0x52, 0x9c, 0xa1, - 0x8c, 0x7e, 0x47, 0x83, 0x85, 0x5e, 0x41, 0xbe, 0xea, 0x85, 0xb3, 0xe5, 0x83, 0x09, 0x1f, 0x94, - 0x03, 0x9b, 0xbf, 0x60, 0xf8, 0xa0, 0x5a, 0xb8, 0xb0, 0x6f, 0xa3, 0x86, 0x1c, 0x8f, 0x72, 0xe9, - 0xf0, 0x27, 0x60, 0x2e, 0xbd, 0x07, 0xa8, 0x8f, 0x50, 0x68, 0x27, 0xfa, 0x08, 0x85, 0xfe, 0x12, - 0x5c, 0xc8, 0x9f, 0x73, 0xaa, 0x69, 0xb1, 0xd7, 0x5c, 0x84, 0x85, 0x13, 0xe7, 0x43, 0xa4, 0x85, - 0x98, 0xc3, 0x9a, 0x1f, 0xfb, 0xd6, 0x0f, 0x2e, 0x3e, 0xf2, 0x9d, 0x1f, 0x5c, 0x7c, 0xe4, 0x7b, - 0x3f, 0xb8, 0xf8, 0xc8, 0x97, 0x0e, 0x2f, 0x6a, 0xdf, 0x3a, 0xbc, 0xa8, 0x7d, 0xe7, 0xf0, 0xa2, - 0xf6, 0xbd, 0xc3, 0x8b, 0xda, 0x7f, 0x39, 0xbc, 0xa8, 0xfd, 0xfc, 0x7f, 0xbd, 0xf8, 0xc8, 0x9b, - 0x93, 0xa2, 0x47, 0x7f, 0x1e, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x49, 0xc8, 0xd4, 0x45, 0xb5, 0x00, - 0x00, + 0x75, 0x98, 0x7a, 0xc8, 0x21, 0x87, 0x6f, 0x48, 0x2e, 0x59, 0xfb, 0x71, 0x3c, 0xde, 0xed, 0xce, + 0xaa, 0xf5, 0x81, 0xbd, 0x9c, 0xc4, 0xf5, 0x9d, 0x24, 0x9f, 0xee, 0x4e, 0xa7, 0x3b, 0xce, 0x0c, + 0x77, 0x77, 0xb4, 0x4b, 0xee, 0x5c, 0xcd, 0x72, 0xef, 0xc3, 0xce, 0x45, 0xcd, 0xee, 0xe2, 0xb0, + 0x8f, 0x3d, 0xdd, 0x73, 0xdd, 0x3d, 0x5c, 0x72, 0x15, 0x43, 0xb6, 0x62, 0xd9, 0x51, 0x9c, 0x04, + 0x86, 0x03, 0x47, 0x90, 0xe4, 0xc4, 0x32, 0x0c, 0x43, 0x0e, 0x1c, 0xd8, 0x4e, 0x02, 0x1b, 0x71, + 0x3e, 0x00, 0xc3, 0x46, 0x60, 0x45, 0x48, 0x02, 0xc5, 0x81, 0x60, 0x05, 0x89, 0xa9, 0x88, 0x01, + 0x94, 0x04, 0xc9, 0x8f, 0x04, 0x46, 0x10, 0x60, 0x61, 0x20, 0x46, 0x7d, 0x74, 0x77, 0xf5, 0x17, + 0x39, 0xec, 0x21, 0xa9, 0xbb, 0x5f, 0xe4, 0xd4, 0xab, 0x7a, 0xaf, 0xba, 0x3e, 0x5e, 0xbd, 0xf7, + 0xea, 0xbd, 0x57, 0x50, 0xef, 0x9a, 0xfe, 0xd6, 0x60, 0x63, 0x49, 0x77, 0x7a, 0xd7, 0xbb, 0x9a, + 0x6b, 0x10, 0x9b, 0xb8, 0xd1, 0x3f, 0xfd, 0xed, 0xee, 0x75, 0xad, 0x6f, 0x7a, 0xd7, 0x75, 0xc7, + 0x25, 0xd7, 0x77, 0x9e, 0xd9, 0x20, 0xbe, 0xf6, 0xcc, 0xf5, 0x2e, 0x85, 0x69, 0x3e, 0x31, 0x96, + 0xfa, 0xae, 0xe3, 0x3b, 0xe8, 0xd9, 0x08, 0xc7, 0x52, 0xd0, 0x34, 0xfa, 0xa7, 0xbf, 0xdd, 0x5d, + 0xa2, 0x38, 0x96, 0x28, 0x8e, 0x25, 0x81, 0x63, 0xf1, 0xa3, 0x32, 0x5d, 0xa7, 0xeb, 0x5c, 0x67, + 0xa8, 0x36, 0x06, 0x9b, 0xec, 0x17, 0xfb, 0xc1, 0xfe, 0xe3, 0x24, 0x16, 0x9f, 0xda, 0xfe, 0xa4, + 0xb7, 0x64, 0x3a, 0xb4, 0x33, 0xd7, 0xb5, 0x81, 0xef, 0x78, 0xba, 0x66, 0x99, 0x76, 0xf7, 0xfa, + 0x4e, 0xaa, 0x37, 0x8b, 0xaa, 0x54, 0x55, 0x74, 0xfb, 0xd0, 0x3a, 0xee, 0x86, 0xa6, 0x67, 0xd5, + 0xf9, 0x78, 0x54, 0xa7, 0xa7, 0xe9, 0x5b, 0xa6, 0x4d, 0xdc, 0xbd, 0x60, 0x40, 0xae, 0xbb, 0xc4, + 0x73, 0x06, 0xae, 0x4e, 0x8e, 0xd5, 0xca, 0xbb, 0xde, 0x23, 0xbe, 0x96, 0x45, 0xeb, 0x7a, 0x5e, + 0x2b, 0x77, 0x60, 0xfb, 0x66, 0x2f, 0x4d, 0xe6, 0x47, 0x8f, 0x6a, 0xe0, 0xe9, 0x5b, 0xa4, 0xa7, + 0xa5, 0xda, 0x7d, 0x2c, 0xaf, 0xdd, 0xc0, 0x37, 0xad, 0xeb, 0xa6, 0xed, 0x7b, 0xbe, 0x9b, 0x6c, + 0xa4, 0x3e, 0x0b, 0xe5, 0x65, 0xc3, 0x70, 0x6c, 0xf4, 0x14, 0x4c, 0x12, 0x5b, 0xdb, 0xb0, 0x88, + 0xb1, 0xa0, 0x5c, 0x55, 0xae, 0x55, 0xea, 0xe7, 0xbe, 0xb9, 0x5f, 0x7b, 0xdf, 0xc1, 0x7e, 0x6d, + 0x72, 0x85, 0x17, 0xe3, 0x00, 0xae, 0xfe, 0x62, 0x09, 0x26, 0x58, 0x23, 0x0f, 0xfd, 0x82, 0x02, + 0xe7, 0xb7, 0x07, 0x1b, 0xc4, 0xb5, 0x89, 0x4f, 0xbc, 0xa6, 0xe6, 0x6d, 0x6d, 0x38, 0x9a, 0xcb, + 0x51, 0x54, 0x9f, 0xbd, 0xb9, 0x74, 0xfc, 0xd5, 0xb3, 0x74, 0x3b, 0x8d, 0xae, 0xfe, 0xd8, 0xc1, + 0x7e, 0xed, 0x7c, 0x06, 0x00, 0x67, 0x11, 0x47, 0x3b, 0x30, 0x6d, 0x77, 0x4d, 0x7b, 0xb7, 0x65, + 0x77, 0x5d, 0xe2, 0x79, 0x0b, 0x25, 0xd6, 0x99, 0x57, 0x8a, 0x74, 0x66, 0x4d, 0xc2, 0x53, 0x9f, + 0x3b, 0xd8, 0xaf, 0x4d, 0xcb, 0x25, 0x38, 0x46, 0x47, 0xfd, 0x19, 0x05, 0xce, 0x2d, 0x1b, 0x3d, + 0xd3, 0xf3, 0x4c, 0xc7, 0x6e, 0x5b, 0x83, 0xae, 0x69, 0xa3, 0xab, 0x30, 0x6e, 0x6b, 0x3d, 0xc2, + 0x06, 0x64, 0xaa, 0x3e, 0x2d, 0xc6, 0x74, 0x7c, 0x4d, 0xeb, 0x11, 0xcc, 0x20, 0xe8, 0x55, 0x98, + 0xd0, 0x1d, 0x7b, 0xd3, 0xec, 0x8a, 0x7e, 0x7e, 0x74, 0x89, 0xcf, 0xe3, 0x92, 0x3c, 0x8f, 0xac, + 0x7b, 0x62, 0xfe, 0x97, 0xb0, 0xf6, 0x60, 0x65, 0xd7, 0x27, 0x36, 0x25, 0x53, 0x87, 0x83, 0xfd, + 0xda, 0x44, 0x83, 0x21, 0xc0, 0x02, 0x91, 0x7a, 0x03, 0x2a, 0xcb, 0x16, 0x71, 0x7d, 0xd3, 0xee, + 0xa2, 0x17, 0x60, 0x96, 0xf4, 0x34, 0xd3, 0xc2, 0x44, 0x27, 0xe6, 0x0e, 0x71, 0xbd, 0x05, 0xe5, + 0xea, 0xd8, 0xb5, 0xa9, 0x3a, 0x3a, 0xd8, 0xaf, 0xcd, 0xae, 0xc4, 0x20, 0x38, 0x51, 0x53, 0xfd, + 0x29, 0x05, 0xaa, 0xcb, 0x03, 0xc3, 0xf4, 0x39, 0x7e, 0xe4, 0x42, 0x55, 0xa3, 0x3f, 0xdb, 0x8e, + 0x65, 0xea, 0x7b, 0x62, 0x92, 0x5f, 0x2e, 0x32, 0xae, 0xcb, 0x11, 0x9a, 0xfa, 0xb9, 0x83, 0xfd, + 0x5a, 0x55, 0x2a, 0xc0, 0x32, 0x11, 0x75, 0x0b, 0x64, 0x18, 0x7a, 0x03, 0xa6, 0xf9, 0x47, 0xae, + 0x6a, 0x7d, 0x4c, 0x36, 0x45, 0x1f, 0x3e, 0x20, 0x8d, 0x59, 0x40, 0x68, 0xe9, 0xee, 0xc6, 0xdb, + 0x44, 0xf7, 0x31, 0xd9, 0x24, 0x2e, 0xb1, 0x75, 0xc2, 0xa7, 0xaf, 0x21, 0x35, 0xc6, 0x31, 0x54, + 0xea, 0xf7, 0x14, 0x98, 0x5b, 0xde, 0xd1, 0x4c, 0x4b, 0xdb, 0x30, 0x2d, 0xd3, 0xdf, 0x7b, 0xd3, + 0xb1, 0xc9, 0x10, 0xf3, 0xb7, 0x0e, 0x8f, 0x0d, 0x6c, 0x8d, 0xb7, 0xb3, 0xc8, 0x2a, 0x9f, 0xb1, + 0x7b, 0x7b, 0x7d, 0x42, 0x17, 0x1e, 0x1d, 0xe9, 0x27, 0x0e, 0xf6, 0x6b, 0x8f, 0xad, 0x67, 0x57, + 0xc1, 0x79, 0x6d, 0x11, 0x86, 0x4b, 0x12, 0xe8, 0xbe, 0x63, 0x0d, 0x7a, 0x02, 0xeb, 0x18, 0xc3, + 0xba, 0x78, 0xb0, 0x5f, 0xbb, 0xb4, 0x9e, 0x59, 0x03, 0xe7, 0xb4, 0x54, 0xbf, 0x59, 0x82, 0xe9, + 0xba, 0xa6, 0x6f, 0x0f, 0xfa, 0xf5, 0x81, 0xbe, 0x4d, 0x7c, 0xf4, 0x59, 0xa8, 0x50, 0xb6, 0x65, + 0x68, 0xbe, 0x26, 0x46, 0xf2, 0x47, 0x72, 0x57, 0x1f, 0x9b, 0x44, 0x5a, 0x3b, 0x1a, 0xdb, 0x55, + 0xe2, 0x6b, 0x75, 0x24, 0xc6, 0x04, 0xa2, 0x32, 0x1c, 0x62, 0x45, 0x9b, 0x30, 0xee, 0xf5, 0x89, + 0x2e, 0xd6, 0x76, 0xb3, 0xc8, 0x5a, 0x91, 0x7b, 0xdc, 0xe9, 0x13, 0x3d, 0x9a, 0x05, 0xfa, 0x0b, + 0x33, 0xfc, 0xc8, 0x86, 0x09, 0xcf, 0xd7, 0xfc, 0x01, 0x1d, 0x1e, 0x4a, 0xe9, 0xc6, 0xc8, 0x94, + 0x18, 0xb6, 0xfa, 0xac, 0xa0, 0x35, 0xc1, 0x7f, 0x63, 0x41, 0x45, 0xfd, 0x13, 0x05, 0xe6, 0xe4, + 0xea, 0x77, 0x4c, 0xcf, 0x47, 0x3f, 0x9e, 0x1a, 0xce, 0xa5, 0xe1, 0x86, 0x93, 0xb6, 0x66, 0x83, + 0x39, 0x27, 0xc8, 0x55, 0x82, 0x12, 0x69, 0x28, 0x09, 0x94, 0x4d, 0x9f, 0xf4, 0xf8, 0xb2, 0x2a, + 0xc8, 0xcf, 0xe4, 0x2e, 0xd7, 0x67, 0x04, 0xb1, 0x72, 0x8b, 0xa2, 0xc5, 0x1c, 0xbb, 0xfa, 0x59, + 0xb8, 0x20, 0xd7, 0x6a, 0xbb, 0xce, 0x8e, 0x69, 0x10, 0x97, 0xee, 0x04, 0x7f, 0xaf, 0x9f, 0xda, + 0x09, 0x74, 0x65, 0x61, 0x06, 0x41, 0x1f, 0x86, 0x09, 0x97, 0x74, 0x4d, 0xc7, 0x66, 0xb3, 0x3d, + 0x15, 0x8d, 0x1d, 0x66, 0xa5, 0x58, 0x40, 0xd5, 0xff, 0x5b, 0x8a, 0x8f, 0x1d, 0x9d, 0x46, 0xb4, + 0x03, 0x95, 0xbe, 0x20, 0x25, 0xc6, 0xee, 0xd6, 0xa8, 0x1f, 0x18, 0x74, 0x3d, 0x1a, 0xd5, 0xa0, + 0x04, 0x87, 0xb4, 0x90, 0x09, 0xb3, 0xc1, 0xff, 0x8d, 0x11, 0xd8, 0x30, 0x63, 0xa7, 0xed, 0x18, + 0x22, 0x9c, 0x40, 0x8c, 0xee, 0xc1, 0x94, 0x47, 0x74, 0x97, 0x50, 0x9e, 0x24, 0x96, 0x69, 0x26, + 0xe3, 0xea, 0x04, 0x95, 0x04, 0xe3, 0x9a, 0x17, 0xdd, 0x9f, 0x0a, 0x01, 0x38, 0x42, 0x84, 0xae, + 0x41, 0xc5, 0x23, 0xc4, 0xa0, 0x1c, 0x69, 0x61, 0x9c, 0xcf, 0x0d, 0xfd, 0xd4, 0x8e, 0x28, 0xc3, + 0x21, 0x54, 0xfd, 0xfa, 0x38, 0xa0, 0xf4, 0x12, 0x97, 0x47, 0x80, 0x97, 0x88, 0xf1, 0x1f, 0x65, + 0x04, 0xc4, 0x6e, 0x49, 0x20, 0x46, 0x0f, 0x61, 0xc6, 0xd2, 0x3c, 0xff, 0x6e, 0x9f, 0xca, 0x20, + 0xc1, 0x42, 0xa9, 0x3e, 0xbb, 0x5c, 0x64, 0xa6, 0xef, 0xc8, 0x88, 0xea, 0xf3, 0x07, 0xfb, 0xb5, + 0x99, 0x58, 0x11, 0x8e, 0x93, 0x42, 0x6f, 0xc3, 0x14, 0x2d, 0x58, 0x71, 0x5d, 0xc7, 0x15, 0xa3, + 0xff, 0x52, 0x51, 0xba, 0x0c, 0x49, 0x7d, 0x86, 0xce, 0x49, 0xf8, 0x13, 0x47, 0xe8, 0xd1, 0x67, + 0x00, 0x39, 0x1b, 0x1e, 0x71, 0x77, 0x88, 0x71, 0x93, 0x0b, 0x5c, 0xf4, 0x63, 0xe9, 0xec, 0x8c, + 0xd5, 0x17, 0xc5, 0x6c, 0xa2, 0xbb, 0xa9, 0x1a, 0x38, 0xa3, 0x15, 0xda, 0x06, 0x14, 0x0a, 0x6d, + 0xe1, 0x02, 0x58, 0x28, 0x0f, 0xbf, 0x7c, 0x2e, 0x51, 0x62, 0x37, 0x53, 0x28, 0x70, 0x06, 0x5a, + 0xf5, 0x5f, 0x95, 0xa0, 0xca, 0x97, 0xc8, 0x8a, 0xed, 0xbb, 0x7b, 0x67, 0x70, 0x40, 0x90, 0xd8, + 0x01, 0xd1, 0x28, 0xbe, 0xe7, 0x59, 0x87, 0x73, 0xcf, 0x87, 0x5e, 0xe2, 0x7c, 0x58, 0x19, 0x95, + 0xd0, 0xe1, 0xc7, 0xc3, 0x77, 0x14, 0x38, 0x27, 0xd5, 0x3e, 0x83, 0xd3, 0xc1, 0x88, 0x9f, 0x0e, + 0x2f, 0x8f, 0xf8, 0x7d, 0x39, 0x87, 0x83, 0x13, 0xfb, 0x2c, 0xc6, 0xb8, 0x9f, 0x05, 0xd8, 0x60, + 0xec, 0x64, 0x2d, 0x92, 0x93, 0xc2, 0x29, 0xaf, 0x87, 0x10, 0x2c, 0xd5, 0x8a, 0xf1, 0xac, 0xd2, + 0xa1, 0x3c, 0xeb, 0xff, 0x94, 0x60, 0x3e, 0x35, 0xec, 0x69, 0x3e, 0xa2, 0xfc, 0x90, 0xf8, 0x48, + 0xe9, 0x87, 0xc1, 0x47, 0xc6, 0x0a, 0xf1, 0x91, 0xe1, 0xcf, 0x89, 0x3f, 0x50, 0x60, 0xac, 0x81, + 0x5b, 0xe8, 0xe9, 0x98, 0xec, 0xfb, 0x98, 0x2c, 0xfb, 0x3e, 0xda, 0xaf, 0x4d, 0x36, 0x70, 0x4b, + 0x12, 0x83, 0xff, 0x96, 0x02, 0xf3, 0xba, 0x63, 0xfb, 0x1a, 0x5d, 0xc4, 0x98, 0x1f, 0x10, 0xc1, + 0x62, 0x2c, 0x24, 0xf6, 0x35, 0x12, 0xc8, 0xea, 0x8f, 0x8b, 0x0e, 0xcc, 0x27, 0x21, 0x1e, 0x4e, + 0x53, 0x56, 0xd7, 0x61, 0xaa, 0x61, 0x39, 0x03, 0xa3, 0x65, 0x6f, 0x3a, 0x27, 0x28, 0xbb, 0x7c, + 0x57, 0x81, 0x69, 0x86, 0xb7, 0xed, 0x3a, 0x9b, 0xa6, 0x45, 0xde, 0x1b, 0x22, 0xb4, 0xdc, 0xe3, + 0x3c, 0x16, 0xc9, 0x44, 0x5a, 0xb9, 0xe2, 0x7b, 0x44, 0xa4, 0x95, 0xbb, 0x9c, 0xc3, 0xb5, 0x7e, + 0x71, 0x32, 0xfe, 0x65, 0x8c, 0x6f, 0x5d, 0x83, 0x8a, 0xae, 0xd5, 0x07, 0xb6, 0x61, 0x85, 0xeb, + 0x82, 0xf6, 0xb2, 0xb1, 0xcc, 0xcb, 0x70, 0x08, 0x45, 0x0f, 0x01, 0x22, 0x33, 0x83, 0x98, 0x86, + 0x1b, 0xa3, 0x99, 0x36, 0x3a, 0xc4, 0xa7, 0xda, 0xb9, 0x17, 0x4d, 0x7d, 0x04, 0xc3, 0x12, 0x35, + 0xf4, 0x13, 0x30, 0x23, 0x06, 0xb9, 0xd5, 0xd3, 0xba, 0x42, 0xfb, 0x2b, 0x38, 0x52, 0xab, 0x12, + 0xa2, 0xfa, 0x45, 0x41, 0x78, 0x46, 0x2e, 0xf5, 0x70, 0x9c, 0x1a, 0xda, 0x83, 0xe9, 0x9e, 0xac, + 0xd1, 0x8e, 0x17, 0x3f, 0x5c, 0x24, 0xed, 0xb6, 0x7e, 0x41, 0x10, 0x9f, 0x8e, 0xe9, 0xc2, 0x31, + 0x52, 0x19, 0x82, 0x79, 0xf9, 0xb4, 0x04, 0x73, 0x02, 0x93, 0x7c, 0x7b, 0x7b, 0x0b, 0x13, 0xec, + 0x03, 0x5f, 0x28, 0xf2, 0x81, 0x9c, 0x53, 0x44, 0x76, 0x33, 0xfe, 0xdb, 0xc3, 0x01, 0x6e, 0xb4, + 0x03, 0xd3, 0x94, 0xc7, 0x76, 0x88, 0x45, 0x74, 0xdf, 0x71, 0x17, 0x26, 0x8b, 0xdb, 0xa5, 0x3a, + 0x12, 0x1e, 0x6e, 0xd8, 0x90, 0x4b, 0x70, 0x8c, 0x4e, 0xc8, 0xfd, 0x2a, 0xb9, 0xdc, 0x6f, 0x00, + 0xd5, 0x1d, 0xc9, 0xc2, 0x30, 0xc5, 0x06, 0xe1, 0xd3, 0x45, 0x3a, 0x16, 0x99, 0x1b, 0xea, 0xe7, + 0x05, 0xa1, 0xaa, 0x6c, 0x9a, 0x90, 0xe9, 0xa8, 0xbf, 0x5e, 0x81, 0xf9, 0x86, 0x35, 0xf0, 0x7c, + 0xe2, 0x2e, 0x0b, 0xc3, 0x2f, 0x71, 0xd1, 0x17, 0x14, 0xb8, 0xc4, 0xfe, 0x6d, 0x3a, 0x0f, 0xec, + 0x26, 0xb1, 0xb4, 0xbd, 0xe5, 0x4d, 0x5a, 0xc3, 0x30, 0x8e, 0xc7, 0x81, 0x9a, 0x03, 0x71, 0xa6, + 0x33, 0x53, 0x49, 0x27, 0x13, 0x23, 0xce, 0xa1, 0x84, 0x7e, 0x4e, 0x81, 0xc7, 0x33, 0x40, 0x4d, + 0x62, 0x11, 0x9f, 0x08, 0x1e, 0x70, 0xdc, 0x7e, 0x5c, 0x3e, 0xd8, 0xaf, 0x3d, 0xde, 0xc9, 0x43, + 0x8a, 0xf3, 0xe9, 0xa1, 0xbf, 0xad, 0xc0, 0x62, 0x06, 0xf4, 0x86, 0x66, 0x5a, 0x03, 0x97, 0x08, + 0x91, 0xf6, 0xb8, 0xdd, 0xb9, 0x72, 0xb0, 0x5f, 0x5b, 0xec, 0xe4, 0x62, 0xc5, 0x87, 0x50, 0x44, + 0x9f, 0x87, 0x8b, 0x21, 0x74, 0xdd, 0xb6, 0x09, 0x31, 0x88, 0x71, 0xcf, 0x14, 0x92, 0xc5, 0xf1, + 0xbb, 0xf2, 0xf8, 0xc1, 0x7e, 0xed, 0x62, 0x27, 0x0b, 0x21, 0xce, 0xa6, 0x83, 0xba, 0x70, 0x39, + 0x02, 0xf8, 0xa6, 0x65, 0x3e, 0x64, 0x98, 0xee, 0x6d, 0xb9, 0xc4, 0xdb, 0x72, 0x2c, 0x83, 0x31, + 0x0b, 0xa5, 0xfe, 0xfe, 0x83, 0xfd, 0xda, 0xe5, 0xce, 0x61, 0x15, 0xf1, 0xe1, 0x78, 0x90, 0x01, + 0xd3, 0x9e, 0xae, 0xd9, 0x2d, 0xdb, 0x27, 0xee, 0x8e, 0x66, 0x2d, 0x4c, 0x14, 0xfa, 0x40, 0xbe, + 0x45, 0x25, 0x3c, 0x38, 0x86, 0x15, 0x7d, 0x12, 0x2a, 0x64, 0xb7, 0xaf, 0xd9, 0x06, 0xe1, 0x6c, + 0x61, 0xaa, 0xfe, 0x24, 0x3d, 0x8c, 0x56, 0x44, 0xd9, 0xa3, 0xfd, 0xda, 0x74, 0xf0, 0xff, 0xaa, + 0x63, 0x10, 0x1c, 0xd6, 0x46, 0x7f, 0x15, 0x2e, 0xf4, 0xb4, 0xdd, 0x35, 0xc7, 0x20, 0x8c, 0xc9, + 0x51, 0x9e, 0xc7, 0x26, 0xa2, 0x52, 0xa8, 0x9f, 0x0b, 0x07, 0xfb, 0xb5, 0x0b, 0xab, 0x19, 0xf8, + 0x70, 0x26, 0x15, 0x3a, 0x0d, 0x3d, 0x6d, 0xf7, 0xa6, 0xab, 0xe9, 0x64, 0x73, 0x60, 0xdd, 0x23, + 0x6e, 0xcf, 0xb4, 0x19, 0xa6, 0x0e, 0xd1, 0x1d, 0xdb, 0xa0, 0xac, 0x44, 0xb9, 0x56, 0xe6, 0xd3, + 0xb0, 0x7a, 0x58, 0x45, 0x7c, 0x38, 0x1e, 0xf5, 0x7f, 0x28, 0x50, 0x15, 0xac, 0x82, 0x49, 0x74, + 0x1b, 0x50, 0xd6, 0xe9, 0x89, 0x2e, 0x58, 0xc2, 0x4b, 0x85, 0x25, 0x07, 0x8a, 0x2d, 0x12, 0x1b, + 0x58, 0x11, 0xe6, 0xa8, 0xd1, 0x4e, 0xc6, 0xb9, 0x5f, 0x1f, 0xed, 0xdc, 0x67, 0xd4, 0x8e, 0x38, + 0xf3, 0xd5, 0xfd, 0x31, 0x98, 0x6a, 0x38, 0xb6, 0x61, 0x32, 0xb9, 0xfd, 0x99, 0x98, 0xec, 0x7a, + 0x59, 0xe6, 0xde, 0x8f, 0xf6, 0x6b, 0x33, 0x61, 0x45, 0x89, 0x9d, 0x3f, 0x1f, 0x2a, 0xbb, 0x5c, + 0x98, 0x7d, 0x7f, 0x5c, 0x4b, 0x7d, 0xb4, 0x5f, 0x3b, 0x17, 0x36, 0x8b, 0x2b, 0xae, 0x68, 0x07, + 0x10, 0x55, 0x3f, 0xee, 0xb9, 0x9a, 0xed, 0x71, 0xb4, 0x74, 0x31, 0x71, 0x06, 0xf3, 0x97, 0x86, + 0x5b, 0x4c, 0xb4, 0x45, 0xa4, 0x9d, 0xdc, 0x49, 0x61, 0xc3, 0x19, 0x14, 0xd0, 0xdb, 0x30, 0x4b, + 0x4b, 0xd7, 0xfb, 0x86, 0xe6, 0x13, 0x89, 0x93, 0x1c, 0x87, 0xe6, 0x25, 0x41, 0x73, 0xf6, 0x4e, + 0x0c, 0x13, 0x4e, 0x60, 0xe6, 0xb2, 0xbe, 0xe6, 0x39, 0x36, 0x63, 0x12, 0x31, 0x59, 0x9f, 0x96, + 0x62, 0x01, 0x45, 0x4f, 0xc1, 0x64, 0x8f, 0x78, 0x9e, 0xd6, 0x25, 0x6c, 0xd7, 0x4f, 0x45, 0x47, + 0xfb, 0x2a, 0x2f, 0xc6, 0x01, 0x1c, 0x7d, 0x04, 0xca, 0xba, 0x63, 0x10, 0x6f, 0x61, 0x92, 0x19, + 0xe7, 0x2f, 0xb1, 0xb5, 0x44, 0x0b, 0x1e, 0xed, 0xd7, 0xa6, 0x98, 0x2e, 0x47, 0x7f, 0x61, 0x5e, + 0x49, 0xfd, 0x65, 0x2a, 0x69, 0x27, 0x34, 0x96, 0x21, 0x74, 0x94, 0xb3, 0x33, 0x55, 0xaa, 0x5f, + 0x2a, 0xc1, 0x05, 0xda, 0x43, 0xd7, 0xb1, 0x2c, 0x7a, 0x0a, 0xf5, 0x2d, 0x67, 0xaf, 0x47, 0xec, + 0xb3, 0xb8, 0x31, 0x08, 0xc6, 0xa1, 0x94, 0x3b, 0x0e, 0xbd, 0xd4, 0x38, 0x8c, 0x15, 0x19, 0x87, + 0x70, 0xb9, 0x1c, 0x31, 0x16, 0xff, 0x4d, 0x81, 0x85, 0xac, 0xb1, 0x38, 0x03, 0xfd, 0xa8, 0x17, + 0xd7, 0x8f, 0x6e, 0x15, 0xd5, 0xa3, 0x93, 0x5d, 0xcf, 0xd1, 0x93, 0x7e, 0x50, 0x82, 0x4b, 0x51, + 0xf5, 0x96, 0xed, 0xf9, 0x9a, 0x65, 0x71, 0xeb, 0xc1, 0xe9, 0xcf, 0x7b, 0x3f, 0xa6, 0xe6, 0xae, + 0x8d, 0xf6, 0xa9, 0x72, 0xdf, 0x73, 0x6d, 0x82, 0xbb, 0x09, 0x9b, 0x60, 0xfb, 0x04, 0x69, 0x1e, + 0x6e, 0x1e, 0xfc, 0x9f, 0x0a, 0x2c, 0x66, 0x37, 0x3c, 0x83, 0x45, 0xe5, 0xc4, 0x17, 0xd5, 0x67, + 0x4e, 0xee, 0xab, 0x73, 0x96, 0xd5, 0x3f, 0x2e, 0xe5, 0x7d, 0x2d, 0x53, 0xc4, 0x37, 0xe1, 0x1c, + 0xd5, 0x90, 0x3c, 0x5f, 0x18, 0xaf, 0x8e, 0x77, 0xab, 0x1b, 0x98, 0xa5, 0xce, 0xe1, 0x38, 0x0e, + 0x9c, 0x44, 0x8a, 0xd6, 0x60, 0x92, 0xaa, 0x45, 0x14, 0x7f, 0x69, 0x78, 0xfc, 0x21, 0xcf, 0xef, + 0xf0, 0xb6, 0x38, 0x40, 0x82, 0x7e, 0x1c, 0x66, 0x8c, 0x70, 0x47, 0x1d, 0x71, 0xa5, 0x93, 0xc4, + 0xca, 0xcc, 0x8c, 0x4d, 0xb9, 0x35, 0x8e, 0x23, 0x53, 0xff, 0x5c, 0x81, 0x27, 0x0f, 0x5b, 0x5b, + 0xe8, 0x1d, 0x00, 0x3d, 0x38, 0xc4, 0xf9, 0xa5, 0x7e, 0x51, 0x31, 0x28, 0xc0, 0x12, 0x6d, 0xd0, + 0xb0, 0xc8, 0xc3, 0x12, 0x91, 0x8c, 0x9b, 0xa2, 0xd2, 0x29, 0xdd, 0x14, 0xa9, 0xff, 0x4b, 0x91, + 0x59, 0x91, 0x3c, 0xb7, 0xef, 0x35, 0x56, 0x24, 0xf7, 0x3d, 0xd7, 0xf6, 0xf6, 0x1f, 0x4a, 0x70, + 0x35, 0xbb, 0x89, 0x74, 0xf6, 0xbe, 0x02, 0x13, 0x7d, 0xee, 0x79, 0x31, 0xc6, 0xce, 0xc6, 0x6b, + 0x94, 0xb3, 0x70, 0xbf, 0x88, 0x47, 0xfb, 0xb5, 0xc5, 0x2c, 0x46, 0x2f, 0x3c, 0x2a, 0x44, 0x3b, + 0x64, 0x26, 0x2c, 0x10, 0x5c, 0xc6, 0xfa, 0xd8, 0x90, 0xcc, 0x45, 0xdb, 0x20, 0xd6, 0xd0, 0x46, + 0x87, 0x9f, 0x52, 0x60, 0x36, 0xb6, 0xa2, 0xbd, 0x85, 0x32, 0x5b, 0xa3, 0x85, 0x8c, 0xf4, 0xb1, + 0xad, 0x12, 0x9d, 0xdc, 0xb1, 0x62, 0x0f, 0x27, 0x08, 0x26, 0xd8, 0xac, 0x3c, 0xaa, 0xef, 0x39, + 0x36, 0x2b, 0x77, 0x3e, 0x87, 0xcd, 0xfe, 0x52, 0x29, 0xef, 0x6b, 0x19, 0x9b, 0x7d, 0x00, 0x53, + 0x81, 0x67, 0x5b, 0xc0, 0x2e, 0x6e, 0x8c, 0xda, 0x27, 0x8e, 0x2e, 0xba, 0xa0, 0x0e, 0x4a, 0x3c, + 0x1c, 0xd1, 0x42, 0x3f, 0xad, 0x00, 0x44, 0x13, 0x23, 0x36, 0xd5, 0xbd, 0x93, 0x1b, 0x0e, 0x49, + 0xac, 0x99, 0xa5, 0x5b, 0x5a, 0x5a, 0x14, 0x12, 0x5d, 0xf5, 0xb7, 0x4b, 0x80, 0xd2, 0x7d, 0xa7, + 0xe2, 0xe6, 0xb6, 0x69, 0x1b, 0x49, 0xb1, 0xfb, 0xb6, 0x69, 0x1b, 0x98, 0x41, 0x86, 0x10, 0x48, + 0x5f, 0x82, 0x73, 0x5d, 0xcb, 0xd9, 0xd0, 0x2c, 0x6b, 0x4f, 0x38, 0xcb, 0xb1, 0x1d, 0x5a, 0xa9, + 0x9f, 0xa7, 0x07, 0xd3, 0xcd, 0x38, 0x08, 0x27, 0xeb, 0xa2, 0x3e, 0xcc, 0xb9, 0x54, 0xcd, 0xd5, + 0x4d, 0x8b, 0x29, 0x28, 0xce, 0xc0, 0x2f, 0x68, 0x47, 0xb9, 0x70, 0xb0, 0x5f, 0x9b, 0xc3, 0x09, + 0x5c, 0x38, 0x85, 0x1d, 0x7d, 0x08, 0x26, 0xfb, 0xae, 0xd9, 0xd3, 0xdc, 0x3d, 0xa6, 0x02, 0x55, + 0xea, 0x55, 0x7a, 0xc2, 0xb5, 0x79, 0x11, 0x0e, 0x60, 0xea, 0xd7, 0x14, 0x18, 0x6b, 0xae, 0x75, + 0x90, 0x0a, 0x13, 0x86, 0xd3, 0xd3, 0x4c, 0x5b, 0x8c, 0x12, 0xf3, 0x39, 0x6b, 0xb2, 0x12, 0x2c, + 0x20, 0xa8, 0x0f, 0x53, 0x01, 0x0b, 0x1f, 0xe9, 0x0e, 0xb2, 0xb9, 0xd6, 0x09, 0xfd, 0x36, 0xc2, + 0x75, 0x15, 0x94, 0x78, 0x38, 0x22, 0xa2, 0x6a, 0x30, 0xdf, 0x5c, 0xeb, 0xb4, 0x6c, 0xdd, 0x1a, + 0x18, 0x64, 0x65, 0x97, 0xfd, 0xa1, 0x5f, 0x66, 0xf2, 0x12, 0xe1, 0xe7, 0xc6, 0xbe, 0x4c, 0x54, + 0xc2, 0x01, 0x8c, 0x56, 0x23, 0xbc, 0x85, 0x70, 0xd2, 0x62, 0xd5, 0x04, 0x12, 0x1c, 0xc0, 0xd4, + 0xef, 0x96, 0xa0, 0x2a, 0x75, 0x08, 0x59, 0x30, 0xc9, 0x3f, 0x37, 0xf0, 0x91, 0x58, 0x29, 0xf8, + 0x89, 0xf1, 0x5e, 0x73, 0xea, 0x7c, 0x40, 0x3d, 0x1c, 0x90, 0x90, 0x67, 0xa9, 0x94, 0x3f, 0x4b, + 0x68, 0x09, 0x80, 0x7b, 0x83, 0xb0, 0xab, 0x3d, 0x7e, 0x34, 0xb0, 0x8d, 0xd0, 0x09, 0x4b, 0xb1, + 0x54, 0x03, 0x3d, 0x29, 0xd6, 0x33, 0xbf, 0x04, 0xac, 0x24, 0xd6, 0xf2, 0x26, 0x94, 0x1f, 0x3a, + 0x36, 0xf1, 0x84, 0xb5, 0xfd, 0x84, 0x3e, 0x70, 0x8a, 0x72, 0xab, 0x37, 0x29, 0x5e, 0xcc, 0xd1, + 0xab, 0xbf, 0xa2, 0x00, 0x34, 0x35, 0x5f, 0xe3, 0xc6, 0xe1, 0x21, 0xfc, 0xec, 0x9e, 0x8c, 0x6d, + 0xc3, 0x4a, 0xea, 0xfe, 0x6e, 0xdc, 0x33, 0x1f, 0x06, 0x9f, 0x1f, 0x1e, 0xef, 0x1c, 0x7b, 0xc7, + 0x7c, 0x48, 0x30, 0x83, 0xa3, 0xa7, 0x61, 0x8a, 0xd8, 0xba, 0xbb, 0xd7, 0xf7, 0x89, 0xc1, 0x46, + 0xa0, 0xc2, 0xaf, 0x5f, 0x57, 0x82, 0x42, 0x1c, 0xc1, 0xd5, 0x67, 0x20, 0x2e, 0xa3, 0x1d, 0xdd, + 0x4b, 0x75, 0x07, 0x2a, 0x2b, 0xb6, 0xd1, 0x77, 0x4c, 0xdb, 0x1f, 0xe2, 0x9b, 0x2e, 0xc3, 0xd8, + 0xc0, 0xb5, 0xc4, 0x27, 0x55, 0x45, 0x85, 0xb1, 0x75, 0x7c, 0x07, 0xd3, 0x72, 0xf4, 0x14, 0x4c, + 0xf6, 0x07, 0x6e, 0xdf, 0xf1, 0x82, 0xef, 0x0a, 0x85, 0xd1, 0x36, 0x2f, 0xc6, 0x01, 0x5c, 0x7d, + 0xa4, 0xc0, 0xdc, 0xca, 0x6e, 0xdf, 0x74, 0x99, 0xcf, 0x1f, 0x71, 0xa9, 0xa0, 0x45, 0xdb, 0xef, + 0xf0, 0x7f, 0x45, 0x1f, 0xc2, 0xf6, 0xa2, 0x06, 0x0e, 0xe0, 0x68, 0x13, 0x66, 0x09, 0x6b, 0xce, + 0x38, 0xaa, 0x16, 0xda, 0xb8, 0x8f, 0x63, 0x7f, 0xe1, 0x2e, 0xa5, 0x31, 0x2c, 0x38, 0x81, 0x15, + 0x75, 0x60, 0x56, 0xb7, 0x34, 0xcf, 0x33, 0x37, 0x4d, 0x3d, 0xba, 0xcd, 0x9e, 0xaa, 0x3f, 0x4d, + 0xdb, 0x36, 0x62, 0x90, 0x47, 0xfb, 0xb5, 0x8b, 0xa2, 0x9f, 0x71, 0x00, 0x4e, 0xa0, 0x50, 0xff, + 0x40, 0x81, 0xa9, 0x50, 0xbc, 0x7c, 0x57, 0x19, 0x52, 0xd0, 0x35, 0xa8, 0x18, 0xa6, 0x27, 0x9f, + 0x09, 0xec, 0x96, 0xb1, 0x29, 0xca, 0x70, 0x08, 0x55, 0x3d, 0xa8, 0xdc, 0x14, 0xdb, 0x0a, 0x2d, + 0x42, 0xc9, 0x0c, 0x8e, 0x24, 0x10, 0x1f, 0x50, 0x6a, 0x35, 0x71, 0xc9, 0x34, 0xc2, 0x55, 0x55, + 0xca, 0x5d, 0x55, 0xd2, 0xb4, 0x8f, 0x1d, 0x3e, 0xed, 0xea, 0x6f, 0x2a, 0x50, 0xbd, 0x65, 0x6e, + 0x10, 0x97, 0x5b, 0x5b, 0x19, 0x5f, 0x8c, 0x79, 0x81, 0x57, 0xb3, 0x3c, 0xc0, 0xd1, 0x2e, 0x4c, + 0x79, 0xfa, 0x16, 0x31, 0x06, 0x56, 0x78, 0xc7, 0x5f, 0xc8, 0xd7, 0x5b, 0x22, 0xdd, 0x11, 0xf8, + 0x24, 0x6f, 0xb7, 0x80, 0x02, 0x8e, 0x88, 0xa9, 0x9f, 0x83, 0xf3, 0x19, 0x8d, 0x50, 0x0d, 0xca, + 0x9e, 0xaf, 0xb9, 0xbe, 0x18, 0x33, 0xc6, 0x6e, 0x3a, 0xb4, 0x00, 0xf3, 0x72, 0xf4, 0x38, 0x8c, + 0x11, 0xdb, 0x10, 0x83, 0x36, 0x49, 0x77, 0xd9, 0x8a, 0x6d, 0x60, 0x5a, 0x46, 0xa7, 0xc8, 0x72, + 0x62, 0x8b, 0x91, 0x4d, 0xd1, 0x1d, 0x51, 0x86, 0x43, 0xa8, 0xfa, 0xcf, 0xc6, 0xe1, 0xf2, 0x2d, + 0xc7, 0x35, 0x1f, 0x3a, 0xb6, 0xaf, 0x59, 0x6d, 0xc7, 0x88, 0x6e, 0xad, 0xc4, 0x74, 0x7f, 0x51, + 0x81, 0xc7, 0xf4, 0xfe, 0xa0, 0x65, 0x9b, 0xbe, 0xa9, 0x05, 0x97, 0x09, 0x6d, 0xe2, 0x9a, 0x4e, + 0xd1, 0xcb, 0x2b, 0xe6, 0x3d, 0xdc, 0x68, 0xaf, 0x67, 0xa1, 0xc4, 0x79, 0xb4, 0xd8, 0x1d, 0x9a, + 0xe1, 0x3c, 0xb0, 0x59, 0xe7, 0x3a, 0x3e, 0xf3, 0x68, 0x7e, 0x18, 0x7d, 0x62, 0xc1, 0x3b, 0xb4, + 0x66, 0x26, 0x46, 0x9c, 0x43, 0x09, 0x7d, 0x1e, 0x2e, 0x9a, 0xbc, 0x73, 0x98, 0x68, 0x86, 0x69, + 0x13, 0xcf, 0x63, 0x37, 0x49, 0xa3, 0x5c, 0x12, 0xb5, 0xb2, 0x10, 0xe2, 0x6c, 0x3a, 0xe8, 0x2d, + 0x00, 0x6f, 0xcf, 0xd6, 0xc5, 0xf8, 0x97, 0x0b, 0x51, 0xe5, 0x27, 0x69, 0x88, 0x05, 0x4b, 0x18, + 0xe9, 0x61, 0xe2, 0x3b, 0x16, 0x71, 0x35, 0x5b, 0xe7, 0x26, 0x62, 0x85, 0x1f, 0x26, 0xf7, 0x82, + 0x42, 0x1c, 0xc1, 0xd5, 0x7f, 0xa8, 0xc0, 0xa4, 0x88, 0x14, 0x40, 0x1f, 0x4e, 0x08, 0x54, 0xa1, + 0x9d, 0x28, 0x21, 0x54, 0xed, 0x31, 0x1d, 0x5f, 0x88, 0xac, 0x82, 0x49, 0x15, 0x3a, 0x91, 0x05, + 0xe1, 0x48, 0xfe, 0x8d, 0xe9, 0xfa, 0x81, 0x4c, 0x2c, 0x11, 0x53, 0xbf, 0xae, 0xc0, 0x7c, 0xaa, + 0xd5, 0x10, 0xd2, 0xf2, 0x19, 0x1a, 0xa9, 0xff, 0xa4, 0x0a, 0x2c, 0x28, 0x64, 0xb9, 0xdd, 0xea, + 0x10, 0x77, 0x27, 0xdc, 0x84, 0x7f, 0x43, 0x81, 0xb9, 0xe8, 0x3a, 0x45, 0xf4, 0x42, 0x29, 0xee, + 0x3d, 0x73, 0x3b, 0x81, 0xab, 0xbe, 0x20, 0xbe, 0x7b, 0x2e, 0x09, 0xc1, 0x29, 0xba, 0xe8, 0x4b, + 0x0a, 0xcc, 0x69, 0xf1, 0xa0, 0x90, 0x80, 0x65, 0x16, 0x72, 0x76, 0x4c, 0x04, 0x98, 0x44, 0x7d, + 0x49, 0x00, 0x3c, 0x9c, 0x22, 0x8b, 0x3e, 0x0e, 0xd3, 0x5a, 0xdf, 0x5c, 0x1e, 0x18, 0x26, 0xb1, + 0xf5, 0x30, 0x92, 0x80, 0x69, 0xf2, 0xcb, 0xed, 0x56, 0x58, 0x8e, 0x63, 0xb5, 0xc2, 0xa8, 0x0f, + 0x31, 0x90, 0xe3, 0x23, 0x46, 0x7d, 0x88, 0x31, 0x8c, 0xa2, 0x3e, 0xc4, 0xd0, 0xc9, 0x44, 0xd0, + 0x8f, 0xc1, 0xe3, 0xfc, 0xac, 0xa9, 0x6b, 0x9e, 0xa9, 0x2f, 0x0f, 0xfc, 0x2d, 0x62, 0xfb, 0x81, + 0xc4, 0xc0, 0x55, 0x16, 0x76, 0x9b, 0xbe, 0x92, 0x57, 0x09, 0xe7, 0xb7, 0x47, 0x36, 0x80, 0x63, + 0x1a, 0xba, 0xf8, 0x1e, 0x7e, 0xa1, 0x5b, 0xc8, 0xd9, 0xe1, 0x6e, 0xab, 0xd9, 0x10, 0x9f, 0xc3, + 0xd8, 0x44, 0xf4, 0x1b, 0x4b, 0x14, 0xd0, 0x97, 0x15, 0x98, 0x11, 0x8b, 0x5c, 0xd0, 0x9c, 0x64, + 0xf3, 0xff, 0x66, 0xd1, 0xc5, 0x98, 0x58, 0xf0, 0x4b, 0x58, 0x46, 0xce, 0xdd, 0x37, 0x43, 0xf7, + 0x9e, 0x18, 0x0c, 0xc7, 0xfb, 0x81, 0xfe, 0xae, 0x02, 0x17, 0x3c, 0xe2, 0xee, 0x98, 0x3a, 0x59, + 0xd6, 0x75, 0x67, 0x60, 0x07, 0x93, 0x5c, 0x29, 0xee, 0x81, 0xdf, 0xc9, 0xc0, 0xc7, 0xef, 0x95, + 0xb3, 0x20, 0x38, 0x93, 0x3e, 0x3d, 0xbf, 0xce, 0x3d, 0xd0, 0x7c, 0x7d, 0xab, 0xa1, 0xe9, 0x5b, + 0x4c, 0x7e, 0xe7, 0x57, 0xc9, 0x05, 0x37, 0xcd, 0x6b, 0x71, 0x54, 0x5c, 0x2f, 0x4f, 0x14, 0xe2, + 0x24, 0x41, 0xe4, 0x41, 0xc5, 0x25, 0xef, 0x0c, 0x88, 0xe7, 0x7b, 0x0b, 0xc0, 0x88, 0xb7, 0x46, + 0x9e, 0x31, 0x2c, 0x10, 0x72, 0x19, 0x23, 0xf8, 0x85, 0x43, 0x42, 0xa8, 0x0b, 0x97, 0xf9, 0xca, + 0x5d, 0xb6, 0x1d, 0x7b, 0xaf, 0xe7, 0x0c, 0xbc, 0xc4, 0xea, 0xaf, 0xb2, 0xd5, 0xcf, 0x6e, 0xd4, + 0x57, 0x0e, 0xab, 0x88, 0x0f, 0xc7, 0x83, 0x5e, 0x87, 0x0a, 0xd9, 0x21, 0xb6, 0x7f, 0xef, 0xde, + 0x9d, 0x85, 0xe9, 0x42, 0x47, 0x23, 0xfb, 0x84, 0x15, 0x81, 0x03, 0x87, 0xd8, 0x16, 0x5f, 0x01, + 0x94, 0x5e, 0x91, 0x68, 0x0e, 0xc6, 0xb6, 0x09, 0x0f, 0x1a, 0x9b, 0xc2, 0xf4, 0x5f, 0x74, 0x01, + 0xca, 0x3b, 0x9a, 0x35, 0xe0, 0xa2, 0x6c, 0x05, 0xf3, 0x1f, 0x2f, 0x94, 0x3e, 0xa9, 0xa8, 0xbf, + 0xab, 0xc0, 0xc5, 0xcc, 0x61, 0x43, 0x18, 0x2e, 0x31, 0x47, 0x04, 0x7b, 0x75, 0xe0, 0x6b, 0xbe, + 0x69, 0x77, 0x5b, 0xf6, 0xa6, 0x65, 0x76, 0xb7, 0xb8, 0xe4, 0x57, 0xe6, 0x72, 0xca, 0x6a, 0x66, + 0x0d, 0x9c, 0xd3, 0x12, 0xb5, 0xe0, 0x7c, 0x4f, 0xdb, 0x4d, 0x21, 0x2c, 0x31, 0x84, 0x2c, 0xf4, + 0x70, 0x35, 0x0d, 0xc6, 0x59, 0x6d, 0xd4, 0xaf, 0x96, 0xe1, 0x09, 0xda, 0xf1, 0xe8, 0xc8, 0x5c, + 0xd5, 0x6c, 0xad, 0xfb, 0xee, 0x3c, 0x9a, 0x7e, 0x53, 0x81, 0xc7, 0xb6, 0xb2, 0xc5, 0x59, 0x71, + 0x68, 0xbf, 0x5a, 0x48, 0xa8, 0x3f, 0x4c, 0x42, 0xe6, 0x0b, 0xf7, 0xd0, 0x2a, 0x38, 0xaf, 0x53, + 0xe8, 0x15, 0x98, 0xb3, 0x1d, 0x83, 0x34, 0x5a, 0x4d, 0xbc, 0xaa, 0x79, 0xdb, 0x9d, 0x40, 0xe1, + 0x2f, 0x73, 0xc3, 0xd7, 0x5a, 0x02, 0x86, 0x53, 0xb5, 0xd1, 0x0e, 0xa0, 0xbe, 0x63, 0xac, 0xec, + 0x98, 0x7a, 0xe0, 0x79, 0x50, 0xdc, 0xd8, 0xc6, 0xe2, 0x2a, 0xda, 0x29, 0x6c, 0x38, 0x83, 0x02, + 0x93, 0xc7, 0x69, 0x67, 0x56, 0x1d, 0xdb, 0xf4, 0x1d, 0x97, 0x39, 0xba, 0x8c, 0x24, 0x96, 0xb2, + 0x75, 0xbe, 0x96, 0x89, 0x11, 0xe7, 0x50, 0x52, 0xff, 0xb7, 0x02, 0xe7, 0xe8, 0xb2, 0x68, 0xbb, + 0xce, 0xee, 0xde, 0xbb, 0x71, 0x41, 0x3e, 0x05, 0xe3, 0x3d, 0xc7, 0x08, 0x54, 0xdb, 0x8b, 0x54, + 0xb2, 0x5c, 0x75, 0x0c, 0xf2, 0x88, 0x5b, 0x00, 0x77, 0xf7, 0x98, 0xeb, 0x13, 0xab, 0x22, 0x2b, + 0xaa, 0x63, 0xf9, 0x8a, 0xaa, 0xfa, 0x9f, 0x14, 0x2e, 0x22, 0x06, 0x8a, 0xe2, 0xbb, 0x72, 0x1f, + 0x3e, 0x07, 0x33, 0xb4, 0x6c, 0x55, 0xdb, 0x6d, 0x37, 0xef, 0x3b, 0x56, 0xe0, 0xb5, 0xc3, 0xee, + 0x08, 0x6f, 0xcb, 0x00, 0x1c, 0xaf, 0xa7, 0xfe, 0xda, 0x39, 0x60, 0x15, 0x2c, 0xe2, 0xbf, 0x1b, + 0xbf, 0xeb, 0x19, 0xa8, 0xea, 0xfd, 0x41, 0xe3, 0x46, 0xe7, 0xd5, 0x81, 0xe3, 0x6b, 0xc2, 0x86, + 0xc9, 0xe4, 0xbe, 0x46, 0x7b, 0x3d, 0x28, 0xc6, 0x72, 0x1d, 0xba, 0xc3, 0xf5, 0xfe, 0x40, 0xf0, + 0xcc, 0xb6, 0x7c, 0xd9, 0xc5, 0x76, 0x78, 0xa3, 0xbd, 0x1e, 0x83, 0xe1, 0x54, 0x6d, 0xf4, 0x79, + 0x98, 0x26, 0x62, 0xf3, 0xdd, 0xd2, 0x5c, 0x43, 0xec, 0xed, 0xc2, 0x07, 0x77, 0x38, 0xb4, 0xc1, + 0x8e, 0xe6, 0xe2, 0xf2, 0x8a, 0x44, 0x02, 0xc7, 0x08, 0x32, 0xd1, 0x55, 0xfc, 0xa6, 0x33, 0xe5, + 0x18, 0xc9, 0xcd, 0x5e, 0x16, 0xa2, 0x6b, 0x5e, 0x25, 0x9c, 0xdf, 0x1e, 0xfd, 0x86, 0x02, 0x97, + 0x42, 0xa8, 0x69, 0x9b, 0xbd, 0x41, 0x0f, 0x13, 0xdd, 0xd2, 0xcc, 0x9e, 0x90, 0x63, 0x5f, 0x3b, + 0xb1, 0x0f, 0x8d, 0xa3, 0xe7, 0x0c, 0x27, 0x1b, 0x86, 0x73, 0xba, 0x84, 0xbe, 0xae, 0xc0, 0xd5, + 0x00, 0xd4, 0xa6, 0x9a, 0xe4, 0xc0, 0x25, 0x91, 0xdf, 0x97, 0x18, 0x92, 0xc9, 0x42, 0xfc, 0xef, + 0x83, 0x07, 0xfb, 0xb5, 0xab, 0x2b, 0x47, 0xe0, 0xc6, 0x47, 0x52, 0x97, 0x97, 0x4b, 0xc7, 0xd9, + 0xf4, 0x85, 0xe0, 0x7b, 0x5a, 0xcb, 0x85, 0x92, 0xc0, 0x31, 0x82, 0xe8, 0xb7, 0x14, 0x78, 0x4c, + 0x2e, 0x90, 0x57, 0x0b, 0x97, 0x78, 0x5f, 0x3f, 0xb1, 0xce, 0x24, 0xf0, 0x73, 0xdb, 0x52, 0x0e, + 0x10, 0xe7, 0xf5, 0x8a, 0xb2, 0xde, 0x1e, 0x5b, 0x98, 0x5c, 0x2a, 0x2e, 0x73, 0xd6, 0xcb, 0xd7, + 0xaa, 0x87, 0x03, 0x18, 0x55, 0x36, 0xfb, 0x8e, 0xd1, 0x36, 0x0d, 0xef, 0x8e, 0xd9, 0x33, 0x7d, + 0x26, 0xb7, 0x8e, 0xf1, 0xe1, 0x68, 0x3b, 0x46, 0xbb, 0xd5, 0xe4, 0xe5, 0x38, 0x56, 0x8b, 0xf9, + 0x5d, 0x9b, 0x3d, 0xad, 0x4b, 0xda, 0x03, 0xcb, 0x6a, 0xbb, 0x0e, 0x33, 0x40, 0x34, 0x89, 0x66, + 0x58, 0xa6, 0x4d, 0x0a, 0xca, 0xa9, 0x6c, 0xbb, 0xb5, 0xf2, 0x90, 0xe2, 0x7c, 0x7a, 0x68, 0x09, + 0x60, 0x53, 0x33, 0xad, 0xce, 0x03, 0xad, 0x7f, 0xd7, 0x5e, 0x98, 0x61, 0x0c, 0x8c, 0x69, 0x7a, + 0x37, 0xc2, 0x52, 0x2c, 0xd5, 0xa0, 0xab, 0x89, 0x72, 0x41, 0x4c, 0x78, 0xf4, 0xd5, 0xc2, 0xec, + 0x09, 0xad, 0xa6, 0x00, 0x21, 0x1f, 0xbe, 0xdb, 0x12, 0x09, 0x1c, 0x23, 0x88, 0xbe, 0xa8, 0xc0, + 0xac, 0xb7, 0xe7, 0xf9, 0xa4, 0x17, 0xf6, 0xe1, 0xdc, 0x49, 0xf7, 0x81, 0x99, 0x66, 0x3a, 0x31, + 0x22, 0x38, 0x41, 0x14, 0x69, 0xf0, 0x04, 0x1b, 0xd5, 0x9b, 0x8d, 0x5b, 0x66, 0x77, 0x2b, 0xf4, + 0xa6, 0x6e, 0x13, 0x57, 0x27, 0xb6, 0xbf, 0x30, 0xc7, 0xd6, 0x4d, 0xed, 0x60, 0xbf, 0xf6, 0x44, + 0x2b, 0xbf, 0x1a, 0x3e, 0x0c, 0x07, 0x7a, 0x0b, 0x16, 0x05, 0xf8, 0x8e, 0xf3, 0x20, 0x45, 0x61, + 0x9e, 0x51, 0x60, 0x2e, 0xee, 0xad, 0xdc, 0x5a, 0xf8, 0x10, 0x0c, 0x54, 0x2b, 0xf0, 0x88, 0xcb, + 0x2c, 0xab, 0x24, 0x5c, 0x3c, 0xde, 0x02, 0x62, 0x8b, 0x80, 0x69, 0x05, 0x9d, 0x34, 0x18, 0x67, + 0xb5, 0x51, 0xf7, 0x4b, 0x5c, 0x9d, 0x49, 0x6d, 0x48, 0xf4, 0x12, 0x9c, 0xeb, 0x91, 0x9e, 0xe3, + 0xee, 0x2d, 0x07, 0xf9, 0x1a, 0x84, 0x69, 0x8d, 0x69, 0xa8, 0xab, 0x71, 0x10, 0x4e, 0xd6, 0xa5, + 0xc7, 0x25, 0xfb, 0x82, 0x1b, 0x9d, 0xa8, 0x7d, 0x29, 0x3a, 0x2e, 0x5b, 0x09, 0x18, 0x4e, 0xd5, + 0x46, 0x0d, 0x98, 0x17, 0x65, 0x2d, 0x2a, 0x35, 0x7a, 0x37, 0x5c, 0x12, 0x5c, 0x36, 0x51, 0xf9, + 0x6b, 0xbe, 0x95, 0x04, 0xe2, 0x74, 0x7d, 0xfa, 0x15, 0xf4, 0x87, 0xdc, 0x8b, 0xf1, 0xe8, 0x2b, + 0xd6, 0xe2, 0x20, 0x9c, 0xac, 0x1b, 0x88, 0xf5, 0xb1, 0x2e, 0x94, 0xa3, 0xaf, 0x58, 0x4b, 0xc0, + 0x70, 0xaa, 0xb6, 0xfa, 0x9f, 0xc7, 0xe1, 0x03, 0x43, 0x1c, 0x62, 0xa8, 0x97, 0x3d, 0xdc, 0x47, + 0xb0, 0x94, 0xa5, 0xc0, 0x97, 0x61, 0xe9, 0xd5, 0x81, 0x66, 0xfb, 0xa6, 0xbf, 0x37, 0xe4, 0xf4, + 0xf4, 0x73, 0xa6, 0xe7, 0xf8, 0xf4, 0x86, 0x9d, 0x4e, 0x2f, 0x6f, 0x3a, 0x8f, 0x4f, 0x72, 0xf8, + 0xe9, 0xef, 0x65, 0x4f, 0x7f, 0xc1, 0x51, 0x3d, 0x72, 0xb9, 0xf4, 0x73, 0x96, 0x4b, 0xc1, 0x51, + 0x1d, 0x62, 0x79, 0xfd, 0xe9, 0x38, 0x7c, 0x70, 0x98, 0x03, 0xb5, 0xe0, 0xfa, 0xca, 0x38, 0xb2, + 0x4e, 0x75, 0x7d, 0xe5, 0x39, 0x8e, 0x9c, 0xe2, 0xfa, 0xca, 0x20, 0x79, 0xda, 0xeb, 0x2b, 0x6f, + 0x54, 0x4f, 0x6b, 0x7d, 0xe5, 0x8d, 0xea, 0x10, 0xeb, 0xeb, 0xcf, 0x92, 0xe7, 0x43, 0x78, 0x8e, + 0xb6, 0x60, 0x4c, 0xef, 0x0f, 0x0a, 0x32, 0x29, 0x76, 0xcd, 0xd9, 0x68, 0xaf, 0x63, 0x8a, 0x03, + 0x61, 0x98, 0xe0, 0xeb, 0xa7, 0x20, 0x0b, 0x62, 0x4e, 0x3f, 0x7c, 0x49, 0x62, 0x81, 0x89, 0x0e, + 0x15, 0xe9, 0x6f, 0x91, 0x1e, 0x71, 0x35, 0xab, 0xe3, 0x3b, 0xae, 0xd6, 0x2d, 0xca, 0x6d, 0xd8, + 0x50, 0xad, 0x24, 0x70, 0xe1, 0x14, 0x76, 0x3a, 0x20, 0x7d, 0xd3, 0x28, 0xc8, 0x5f, 0xd8, 0x80, + 0xb4, 0x5b, 0x4d, 0x4c, 0x71, 0xa8, 0x7f, 0x58, 0x01, 0x29, 0x02, 0x87, 0xea, 0x6d, 0x9a, 0x65, + 0x39, 0x0f, 0xda, 0xae, 0xb9, 0x63, 0x5a, 0xa4, 0x4b, 0x8c, 0x30, 0x44, 0xc3, 0x13, 0x97, 0xe1, + 0x4c, 0x90, 0x5c, 0xce, 0xab, 0x84, 0xf3, 0xdb, 0x53, 0xbd, 0x7c, 0x5e, 0x4f, 0x46, 0x3a, 0x8e, + 0x72, 0xa1, 0x97, 0x0a, 0x9b, 0xe4, 0xfb, 0x29, 0x55, 0x8c, 0xd3, 0x64, 0xd1, 0x4f, 0x2a, 0xdc, + 0xe0, 0x10, 0x5a, 0x57, 0xc5, 0x9c, 0xdd, 0x3c, 0xa1, 0xfb, 0x88, 0xc8, 0x72, 0x11, 0xd9, 0x6f, + 0xe3, 0x04, 0xa9, 0x66, 0x78, 0x71, 0x3b, 0xcb, 0x4e, 0x2a, 0x66, 0xf6, 0x6e, 0xd1, 0xae, 0xe4, + 0x18, 0x5e, 0xf9, 0xe5, 0x71, 0x66, 0x05, 0x9c, 0xdd, 0x91, 0x70, 0x94, 0x42, 0xd3, 0x91, 0x60, + 0x02, 0x85, 0x47, 0x29, 0x61, 0x83, 0x8a, 0x46, 0x29, 0x04, 0xe0, 0x38, 0x41, 0xd4, 0x87, 0xa9, + 0xed, 0xc0, 0x5e, 0x27, 0xf4, 0xfb, 0x46, 0x51, 0xea, 0x92, 0xd1, 0x8f, 0x5f, 0x52, 0x87, 0x85, + 0x38, 0x22, 0x82, 0xb6, 0x60, 0x72, 0x9b, 0x33, 0x22, 0xa1, 0x97, 0x2f, 0x8f, 0xac, 0x37, 0x70, + 0xf5, 0x50, 0x14, 0xe1, 0x00, 0xbd, 0xec, 0xa4, 0x52, 0x39, 0xc2, 0x37, 0xe9, 0xab, 0x0a, 0x5c, + 0xdc, 0x21, 0xae, 0x6f, 0xea, 0x49, 0x2b, 0xf5, 0x54, 0x71, 0xdd, 0xe6, 0x7e, 0x16, 0x42, 0xbe, + 0x4c, 0x32, 0x41, 0x38, 0xbb, 0x0b, 0xea, 0x0f, 0x14, 0x48, 0xd9, 0xc2, 0xd0, 0xcf, 0x2b, 0x30, + 0xbd, 0x49, 0x34, 0x7f, 0xe0, 0x92, 0x9b, 0x9a, 0x1f, 0xfa, 0xdb, 0xde, 0x3f, 0x09, 0x13, 0xdc, + 0xd2, 0x0d, 0x09, 0x31, 0xbf, 0xec, 0x0b, 0xc3, 0xe9, 0x65, 0x10, 0x8e, 0xf5, 0x60, 0xf1, 0x65, + 0x98, 0x4f, 0x35, 0x3c, 0xd6, 0x9d, 0xcc, 0xbf, 0x14, 0xa6, 0xd4, 0x64, 0xb6, 0xc5, 0xb7, 0xa0, + 0xac, 0x19, 0x46, 0x98, 0xcb, 0xe9, 0xf9, 0x62, 0x97, 0xda, 0x86, 0xec, 0xd6, 0xcc, 0x7e, 0x62, + 0x8e, 0x16, 0xdd, 0x00, 0xa4, 0xc5, 0x6e, 0xae, 0x56, 0x1d, 0x23, 0xd0, 0x92, 0x98, 0x09, 0x7e, + 0x39, 0x05, 0xc5, 0x19, 0x2d, 0xd4, 0x17, 0x61, 0x36, 0x1e, 0x87, 0x79, 0x0c, 0xf7, 0x38, 0xf5, + 0xaf, 0x2b, 0x80, 0xd2, 0xd9, 0x1b, 0x90, 0x0b, 0x15, 0x51, 0x23, 0x98, 0xe2, 0x42, 0x56, 0xd6, + 0xa4, 0xe3, 0x5e, 0xe4, 0x57, 0x2e, 0x0a, 0x3c, 0x1c, 0xd2, 0x51, 0xff, 0x5c, 0x81, 0x28, 0x59, + 0x0c, 0xfa, 0x04, 0x54, 0x0d, 0xe2, 0xe9, 0xae, 0xd9, 0xf7, 0xa3, 0xef, 0x08, 0x23, 0xef, 0x9b, + 0x11, 0x08, 0xcb, 0xf5, 0x90, 0x0a, 0x13, 0xbe, 0xe6, 0x6d, 0xb7, 0x9a, 0x42, 0x5d, 0x64, 0x87, + 0xfb, 0x3d, 0x56, 0x82, 0x05, 0x24, 0x8a, 0x69, 0x1c, 0x1b, 0x22, 0xa6, 0x11, 0x6d, 0x9e, 0x40, + 0x00, 0x27, 0x3a, 0x3a, 0x78, 0x53, 0xfd, 0xe3, 0x12, 0xc4, 0xf3, 0xf3, 0x14, 0x1d, 0x82, 0x74, + 0xc4, 0x69, 0xe9, 0xd4, 0x22, 0x4e, 0x3f, 0xc2, 0x92, 0xdb, 0xf1, 0x6c, 0xa4, 0xfc, 0xc2, 0x4a, + 0x4e, 0x49, 0xc7, 0x73, 0x89, 0x86, 0x35, 0xd0, 0xf3, 0xcc, 0x99, 0xcd, 0x0f, 0x94, 0xe8, 0x0f, + 0x04, 0xdb, 0xa2, 0x43, 0x0b, 0x1f, 0x89, 0x98, 0xda, 0xf0, 0xfb, 0x59, 0x29, 0xe6, 0x2d, 0xd0, + 0x27, 0x84, 0xef, 0x63, 0x39, 0x16, 0xf7, 0x1b, 0x04, 0x0b, 0xcf, 0xc7, 0x1a, 0x46, 0x0e, 0x91, + 0xea, 0xdf, 0x51, 0x60, 0x52, 0xa4, 0xe2, 0x18, 0xc2, 0x7d, 0x72, 0x13, 0xca, 0x4c, 0x48, 0x1f, + 0x45, 0x7e, 0xe9, 0x6c, 0x39, 0x8e, 0x1f, 0x4b, 0x48, 0xc2, 0x7c, 0xf6, 0xd8, 0xbf, 0x98, 0xa3, + 0x57, 0xbf, 0x36, 0x0e, 0x57, 0x45, 0x95, 0xd4, 0xf1, 0x1c, 0x6e, 0xc1, 0x3d, 0x38, 0x2f, 0x66, + 0xa9, 0xe9, 0x6a, 0x66, 0x78, 0xa5, 0x57, 0x4c, 0xed, 0x12, 0x97, 0xbd, 0x29, 0x74, 0x38, 0x8b, + 0x06, 0x0f, 0xbd, 0x67, 0xc5, 0xb7, 0x88, 0x66, 0xf9, 0x5b, 0x01, 0xed, 0xd2, 0x28, 0xa1, 0xf7, + 0x69, 0x7c, 0x38, 0x93, 0x0a, 0xbb, 0x52, 0x14, 0x80, 0x86, 0x4b, 0x34, 0xf9, 0x3e, 0x73, 0x04, + 0x17, 0xbf, 0xd5, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xb3, 0x5f, 0x69, 0xbb, 0x4c, 0x1d, 0xc6, 0xc4, + 0x77, 0x4d, 0x96, 0x22, 0x86, 0xae, 0x6f, 0xae, 0xc0, 0xc6, 0x41, 0x38, 0x59, 0x17, 0xbd, 0x00, + 0xb3, 0xec, 0x8a, 0x36, 0x8a, 0x63, 0x2b, 0x47, 0xc9, 0x69, 0xd7, 0x62, 0x10, 0x9c, 0xa8, 0xa9, + 0x7e, 0x43, 0x81, 0x69, 0x79, 0x01, 0x0d, 0xe1, 0x6e, 0x3d, 0x90, 0xd8, 0xf5, 0x08, 0x5e, 0xab, + 0x32, 0xd5, 0x61, 0x38, 0xf6, 0x23, 0x05, 0xce, 0x67, 0xb4, 0x61, 0x97, 0x75, 0x24, 0xc1, 0xfa, + 0x47, 0xb9, 0xac, 0x4b, 0x1d, 0x23, 0xe1, 0x65, 0x5d, 0x12, 0x82, 0x53, 0x74, 0xd1, 0x7d, 0x18, + 0xd3, 0x5d, 0x53, 0x0c, 0xcb, 0x73, 0x85, 0x54, 0x12, 0xdc, 0x8a, 0x7c, 0xd8, 0x1b, 0xb8, 0x85, + 0x29, 0x42, 0xf5, 0x9f, 0x8e, 0x41, 0x55, 0xca, 0xf2, 0x83, 0x56, 0x47, 0xd1, 0x68, 0x23, 0xf4, + 0x81, 0x56, 0xbb, 0x0a, 0x63, 0xdd, 0xfe, 0xa0, 0xa0, 0x4a, 0x1b, 0xa2, 0xbb, 0x49, 0xd1, 0x75, + 0xfb, 0x03, 0x74, 0x3f, 0x54, 0x92, 0x8b, 0xa9, 0xb1, 0xa1, 0x23, 0x67, 0x42, 0x51, 0x0e, 0xd6, + 0xe6, 0x78, 0xee, 0xda, 0xec, 0xc1, 0xa4, 0x27, 0x34, 0xe8, 0x72, 0xf1, 0x0c, 0x53, 0xd2, 0x48, + 0x0b, 0x8d, 0x99, 0x8b, 0xdf, 0x81, 0x42, 0x1d, 0xd0, 0xa0, 0x02, 0xc0, 0x80, 0x39, 0x9e, 0x33, + 0xbd, 0xa2, 0xc2, 0x05, 0x80, 0x75, 0x56, 0x82, 0x05, 0x44, 0xfd, 0xd9, 0x12, 0xa0, 0x34, 0x42, + 0xf4, 0x01, 0x28, 0x33, 0xff, 0x7b, 0xb1, 0xd1, 0xa4, 0xdc, 0x19, 0x9a, 0xe7, 0x61, 0x0e, 0x43, + 0x1d, 0x11, 0x8f, 0x51, 0x6c, 0x62, 0xd8, 0x25, 0xb1, 0xa0, 0x27, 0x05, 0x6f, 0x04, 0x47, 0xd3, + 0x58, 0xee, 0xd1, 0xb4, 0x0e, 0x93, 0x3d, 0xd3, 0x66, 0x8e, 0x21, 0xc5, 0x4c, 0x04, 0xfc, 0x2e, + 0x8b, 0xa3, 0xc0, 0x01, 0x2e, 0xf5, 0x4f, 0x4b, 0x74, 0x11, 0x9b, 0xb6, 0x4f, 0x6c, 0xcd, 0xd6, + 0x09, 0xda, 0x03, 0xd0, 0x06, 0xbe, 0xc3, 0x4f, 0x78, 0xb1, 0x96, 0x5b, 0xc5, 0xe6, 0x2b, 0x44, + 0xba, 0x1c, 0x22, 0xe4, 0x57, 0x4c, 0xd1, 0x6f, 0x2c, 0x11, 0xa3, 0xa4, 0x7d, 0xb3, 0x47, 0x5e, + 0x33, 0x6d, 0xc3, 0x79, 0x20, 0x86, 0x77, 0x54, 0xd2, 0xf7, 0x42, 0x84, 0x9c, 0x74, 0xf4, 0x1b, + 0x4b, 0xc4, 0xd0, 0xeb, 0xb0, 0xc0, 0x12, 0x66, 0xdb, 0x2c, 0x81, 0x9a, 0xe8, 0x9b, 0x63, 0x59, + 0xc1, 0x91, 0x53, 0x61, 0x49, 0x6b, 0x16, 0x1a, 0x39, 0x75, 0x70, 0x6e, 0x6b, 0xf5, 0xb7, 0x14, + 0xb8, 0x98, 0x39, 0x14, 0xe8, 0x26, 0xcc, 0x47, 0x7e, 0x05, 0x32, 0x8f, 0xac, 0x44, 0xf9, 0x00, + 0x6f, 0x27, 0x2b, 0xe0, 0x74, 0x1b, 0xb4, 0x1a, 0xca, 0x09, 0x32, 0x0f, 0x16, 0x4e, 0x09, 0x4f, + 0x08, 0x54, 0x59, 0x6c, 0x1a, 0x67, 0xb5, 0x53, 0x7f, 0x2c, 0xd6, 0xe1, 0x68, 0xc0, 0xe8, 0xee, + 0xd8, 0x20, 0xdd, 0xd0, 0xb3, 0x3b, 0xdc, 0x1d, 0x75, 0x5a, 0x88, 0x39, 0x0c, 0x5d, 0x96, 0xa3, + 0x11, 0x42, 0x2e, 0x14, 0x44, 0x24, 0xa8, 0x3e, 0x80, 0x70, 0xdf, 0x31, 0xed, 0x2e, 0xda, 0x84, + 0x8a, 0x26, 0xb2, 0xb9, 0x8b, 0xa5, 0xf6, 0xa9, 0x42, 0x3a, 0x96, 0xc0, 0xc1, 0xdd, 0xf6, 0x82, + 0x5f, 0x38, 0xc4, 0xad, 0xfe, 0x03, 0x05, 0x2e, 0x51, 0x86, 0x64, 0x04, 0xb1, 0x91, 0x61, 0xb8, + 0xfa, 0x10, 0x47, 0x6b, 0x0f, 0xaa, 0x6e, 0xd4, 0x4c, 0xac, 0xcb, 0x1f, 0x95, 0x43, 0xe1, 0xa5, + 0xa7, 0x1d, 0xa8, 0xd8, 0xd1, 0x70, 0x1d, 0x2f, 0x98, 0x9c, 0x64, 0x74, 0x7c, 0x28, 0xbc, 0x4b, + 0x3d, 0xc1, 0x32, 0x7e, 0xf5, 0x0b, 0x25, 0x80, 0x35, 0xe2, 0x3f, 0x70, 0xdc, 0x6d, 0x3a, 0x44, + 0xef, 0xaa, 0x90, 0x9f, 0x27, 0x61, 0xbc, 0xef, 0x18, 0x9e, 0xe0, 0x52, 0x2c, 0x50, 0x8d, 0xdd, + 0x8c, 0xb3, 0x52, 0x54, 0x83, 0x32, 0x33, 0xfc, 0x8a, 0xa3, 0x80, 0x49, 0xbd, 0x54, 0xd2, 0xf1, + 0x30, 0x2f, 0xe7, 0x79, 0x3a, 0x99, 0x4b, 0xac, 0x27, 0xc4, 0x78, 0x91, 0xa7, 0x93, 0x97, 0xe1, + 0x10, 0xaa, 0x7e, 0x61, 0x1c, 0x62, 0xcf, 0x11, 0x44, 0xaa, 0xb8, 0x72, 0x3a, 0xaa, 0xf8, 0xeb, + 0xb0, 0x60, 0x39, 0x9a, 0x51, 0xd7, 0x2c, 0xba, 0xe8, 0xdd, 0x0e, 0x9f, 0x0e, 0xcd, 0xee, 0x86, + 0xb9, 0xee, 0x19, 0x03, 0xb8, 0x93, 0x53, 0x07, 0xe7, 0xb6, 0x46, 0x7e, 0xf8, 0x08, 0x02, 0xcf, + 0x6f, 0x78, 0x67, 0xd4, 0xc7, 0x1a, 0x96, 0x64, 0x67, 0xe8, 0xf0, 0x54, 0x8e, 0xbf, 0x93, 0x80, + 0x7e, 0x46, 0x81, 0x8b, 0x64, 0xd7, 0x27, 0xae, 0xad, 0x59, 0xf7, 0x5c, 0x6d, 0x73, 0xd3, 0xd4, + 0x85, 0xcf, 0x11, 0x9f, 0x9c, 0xf6, 0xc1, 0x7e, 0xed, 0xe2, 0x4a, 0x56, 0x85, 0x47, 0xfb, 0xb5, + 0x8f, 0xa5, 0xdf, 0x22, 0x09, 0x7c, 0x9f, 0x33, 0x9b, 0xb0, 0xc5, 0x98, 0x4d, 0x6e, 0xf1, 0x79, + 0xa8, 0x1e, 0xc3, 0x55, 0x76, 0x4a, 0x36, 0xcb, 0xfc, 0xd2, 0x04, 0x48, 0x7e, 0xe7, 0xc7, 0xc8, + 0x6a, 0xf9, 0xab, 0x0a, 0x5c, 0xd0, 0x2d, 0x93, 0xd8, 0x7e, 0xc2, 0xc1, 0x98, 0x6f, 0x8c, 0xf5, + 0x42, 0x0e, 0xf1, 0x7d, 0x62, 0xb7, 0x9a, 0x0d, 0xc7, 0xb6, 0x89, 0xee, 0x37, 0x32, 0x90, 0x73, + 0x2d, 0x27, 0x0b, 0x82, 0x33, 0x3b, 0xc3, 0xbe, 0x87, 0x95, 0xb7, 0x9a, 0x72, 0x70, 0x56, 0x43, + 0x94, 0xe1, 0x10, 0x8a, 0x9e, 0x81, 0x6a, 0xd7, 0x75, 0x06, 0x7d, 0xaf, 0xc1, 0xdc, 0xa1, 0xf8, + 0x0c, 0x32, 0x41, 0xe2, 0x66, 0x54, 0x8c, 0xe5, 0x3a, 0xe8, 0xe3, 0x30, 0xcd, 0x7f, 0xb6, 0x5d, + 0xb2, 0x69, 0xee, 0x8a, 0xed, 0xc6, 0x7c, 0x2c, 0x6e, 0x4a, 0xe5, 0x38, 0x56, 0x0b, 0x3d, 0x0d, + 0x53, 0xa6, 0xe7, 0x0d, 0x88, 0xbb, 0x8e, 0xef, 0x88, 0xc4, 0x50, 0xcc, 0xa0, 0xda, 0x0a, 0x0a, + 0x71, 0x04, 0x47, 0xbf, 0xa0, 0xc0, 0xac, 0x4b, 0xde, 0x19, 0x98, 0x2e, 0x31, 0x18, 0x51, 0x4f, + 0x38, 0xff, 0xe3, 0xd1, 0x02, 0x0e, 0x96, 0x70, 0x0c, 0x29, 0x5f, 0xe7, 0xa1, 0x39, 0x22, 0x0e, + 0xc4, 0x89, 0x1e, 0xd0, 0xa1, 0xf2, 0xcc, 0xae, 0x6d, 0xda, 0xdd, 0x65, 0xab, 0xeb, 0x2d, 0x54, + 0xd8, 0xd6, 0xe5, 0x32, 0x57, 0x54, 0x8c, 0xe5, 0x3a, 0xe8, 0x39, 0x98, 0x19, 0x78, 0x74, 0xe5, + 0xf6, 0x08, 0x1f, 0xdf, 0xa9, 0xc8, 0x47, 0x71, 0x5d, 0x06, 0xe0, 0x78, 0x3d, 0xaa, 0xe2, 0x05, + 0x05, 0x62, 0x94, 0x81, 0x87, 0xe8, 0xd2, 0x7e, 0xae, 0xc7, 0x20, 0x38, 0x51, 0x73, 0x71, 0x19, + 0xce, 0x67, 0x7c, 0xe6, 0xb1, 0xb6, 0xc7, 0x37, 0x4a, 0xf0, 0xfe, 0x23, 0x57, 0x25, 0xfa, 0x7b, + 0x0a, 0x54, 0xc9, 0xae, 0xef, 0x6a, 0xa1, 0xc7, 0x24, 0x9d, 0xa2, 0xcd, 0x53, 0xd9, 0x02, 0x4b, + 0x2b, 0x11, 0x21, 0x3e, 0x6d, 0xe1, 0x71, 0x27, 0x41, 0xb0, 0xdc, 0x1f, 0x2a, 0xad, 0xf3, 0x00, + 0x6e, 0xd9, 0x5c, 0x27, 0xb2, 0xb6, 0x0b, 0xc8, 0xe2, 0xa7, 0x61, 0x2e, 0x89, 0xf9, 0x58, 0x23, + 0xf5, 0x4f, 0x4a, 0x50, 0x6e, 0x5b, 0xda, 0x99, 0xe4, 0xf8, 0xfa, 0x2b, 0xb1, 0x04, 0x2b, 0x85, + 0xb2, 0xd6, 0xb0, 0xae, 0xe6, 0xa6, 0x76, 0xea, 0x26, 0x52, 0x3b, 0xbd, 0x5c, 0x9c, 0xc4, 0xe1, + 0x99, 0x9c, 0xfe, 0xb5, 0x02, 0x53, 0xac, 0xde, 0x19, 0x64, 0x14, 0x79, 0x2b, 0x9e, 0x51, 0xe4, + 0xf9, 0xc2, 0xdf, 0x94, 0x93, 0x40, 0xe4, 0x3b, 0xc1, 0xb7, 0xb0, 0x7c, 0x21, 0x6f, 0xc8, 0xaf, + 0x55, 0xf0, 0x8f, 0xb9, 0x96, 0x95, 0xda, 0xe8, 0x8e, 0xa3, 0x6b, 0x56, 0x2a, 0xbf, 0xd1, 0xa1, + 0x4f, 0x56, 0xf4, 0x60, 0x8a, 0x88, 0x20, 0xf9, 0xe0, 0x63, 0x0a, 0x89, 0xb4, 0x41, 0xa4, 0x7d, + 0x44, 0x2e, 0x28, 0xf1, 0x70, 0x44, 0x41, 0xfd, 0x17, 0x25, 0xa8, 0x4a, 0x73, 0xf9, 0xc3, 0xc8, + 0x9c, 0x74, 0x23, 0x33, 0x91, 0x7b, 0x89, 0xb9, 0x44, 0x5e, 0x3a, 0x46, 0x12, 0x77, 0x17, 0xaa, + 0x7a, 0x94, 0x05, 0x73, 0x94, 0xc5, 0x2d, 0x25, 0xd3, 0x14, 0x3e, 0xd9, 0x51, 0x01, 0x96, 0x89, + 0xa8, 0xbf, 0x57, 0x82, 0xc9, 0xb6, 0xeb, 0xd0, 0x09, 0x3e, 0x03, 0xd6, 0xa0, 0xc5, 0x58, 0x43, + 0xb1, 0x7d, 0xcb, 0x3b, 0x9b, 0xcb, 0x1c, 0xcc, 0x04, 0x73, 0x58, 0x1e, 0x85, 0xc8, 0xe1, 0xec, + 0xe1, 0xdf, 0x2a, 0x50, 0x15, 0x35, 0xcf, 0x80, 0x41, 0x7c, 0x36, 0xce, 0x20, 0x5e, 0x1c, 0xe1, + 0xbb, 0x72, 0x58, 0xc4, 0x57, 0x15, 0x98, 0x11, 0x35, 0x56, 0x49, 0x6f, 0x83, 0xb8, 0xe8, 0x06, + 0x4c, 0x7a, 0x03, 0x36, 0x91, 0xe2, 0x83, 0x9e, 0x90, 0x99, 0x84, 0xbb, 0xa1, 0xe9, 0xec, 0x4d, + 0x12, 0x5e, 0x45, 0xca, 0xa6, 0xc6, 0x0b, 0x70, 0xd0, 0x98, 0xaa, 0x70, 0xae, 0x63, 0xa5, 0xd2, + 0x1a, 0x60, 0xc7, 0x22, 0x98, 0x41, 0xa8, 0xe6, 0x44, 0xff, 0x06, 0xf7, 0x51, 0x4c, 0x73, 0xa2, + 0x60, 0x0f, 0xf3, 0x72, 0xf5, 0x8b, 0xe3, 0xe1, 0x60, 0x33, 0x0e, 0x76, 0x0b, 0xa6, 0x74, 0x97, + 0x68, 0x3e, 0x31, 0xea, 0x7b, 0xc3, 0x74, 0x8e, 0x49, 0x71, 0x8d, 0xa0, 0x05, 0x8e, 0x1a, 0x53, + 0x81, 0x49, 0xbe, 0x62, 0x2a, 0x45, 0xb2, 0x65, 0xee, 0xf5, 0xd2, 0xa7, 0xa0, 0xec, 0x3c, 0xb0, + 0x43, 0xdf, 0x8a, 0x43, 0x09, 0xb3, 0x4f, 0xb9, 0x4b, 0x6b, 0x63, 0xde, 0x88, 0xa5, 0x7e, 0x11, + 0x99, 0x3f, 0xb8, 0x20, 0x5b, 0xcd, 0xca, 0xfa, 0x81, 0x2c, 0x98, 0xec, 0xb1, 0x69, 0x18, 0x29, + 0xb9, 0x56, 0x6c, 0x42, 0xe5, 0x24, 0xa7, 0x0c, 0x33, 0x0e, 0x48, 0x50, 0xc1, 0x97, 0x0a, 0x67, + 0x5e, 0x5f, 0xd3, 0x89, 0x2c, 0xf8, 0xae, 0x05, 0x85, 0x38, 0x82, 0xa3, 0x3d, 0xa8, 0xf2, 0xd8, + 0x77, 0xce, 0x65, 0x27, 0x8b, 0xdb, 0x34, 0x45, 0xf7, 0xee, 0x45, 0xd8, 0xf8, 0xd0, 0x4b, 0x05, + 0x58, 0xa6, 0xa5, 0xfe, 0xdc, 0x78, 0xb8, 0x48, 0x05, 0xc7, 0xcf, 0x7e, 0x47, 0x43, 0x29, 0xf4, + 0x8e, 0xc6, 0xc7, 0xa0, 0xdc, 0xdf, 0xd2, 0xbc, 0x60, 0xa5, 0x06, 0x09, 0x79, 0xcb, 0x6d, 0x5a, + 0xf8, 0x68, 0xbf, 0x36, 0x2d, 0x48, 0xb3, 0xdf, 0x98, 0xd7, 0x45, 0x03, 0x38, 0xef, 0xf9, 0x9a, + 0x45, 0x3a, 0xa6, 0xb0, 0x16, 0x79, 0xbe, 0xd6, 0xeb, 0x17, 0xc8, 0xab, 0xcb, 0x1d, 0x8f, 0xd3, + 0xa8, 0x70, 0x16, 0x7e, 0xf4, 0xd3, 0x0a, 0x2c, 0xb0, 0xf2, 0xe5, 0x81, 0xef, 0xf0, 0x5c, 0xe2, + 0x11, 0xf1, 0xe3, 0xdf, 0xcf, 0x32, 0xed, 0xbe, 0x93, 0x83, 0x0f, 0xe7, 0x52, 0x42, 0x9f, 0x83, + 0x8b, 0x96, 0xe6, 0xf9, 0xcb, 0xba, 0x6f, 0xee, 0x98, 0xfe, 0x5e, 0xd4, 0x85, 0xf2, 0xb1, 0xbb, + 0xc0, 0x1c, 0x34, 0xee, 0x64, 0x21, 0xc3, 0xd9, 0x34, 0xd4, 0x3f, 0x53, 0x00, 0xa5, 0x97, 0x10, + 0xb2, 0xa0, 0x62, 0x90, 0x4d, 0x6d, 0x60, 0xf9, 0x81, 0x08, 0x50, 0x28, 0x04, 0x3c, 0x42, 0x19, + 0x71, 0xe6, 0xa6, 0xc0, 0x8b, 0x43, 0x0a, 0xc8, 0x81, 0xa9, 0x07, 0x5b, 0xa6, 0x4f, 0x2c, 0xd3, + 0xf3, 0x05, 0x77, 0x1e, 0x95, 0x5c, 0x28, 0xf3, 0xbc, 0x16, 0x20, 0xc6, 0x11, 0x0d, 0xf5, 0x67, + 0xc7, 0xa0, 0x72, 0x8c, 0xa7, 0xdb, 0x06, 0x80, 0x44, 0xee, 0x07, 0x2a, 0x28, 0x91, 0x51, 0x4c, + 0x64, 0x4c, 0x9c, 0x69, 0xa4, 0x90, 0xe1, 0x0c, 0x02, 0xe8, 0x73, 0x70, 0xc1, 0xb4, 0x37, 0x5d, + 0xcd, 0xf3, 0xdd, 0x81, 0xee, 0x0f, 0x5c, 0x32, 0x4a, 0x3e, 0x5f, 0x66, 0x5a, 0x68, 0x65, 0xa0, + 0xc3, 0x99, 0x44, 0x10, 0x81, 0xc9, 0x07, 0x8e, 0xbb, 0x4d, 0x99, 0xe7, 0x78, 0xf1, 0x57, 0x1f, + 0x5e, 0x63, 0x28, 0x22, 0xae, 0xc9, 0x7f, 0x7b, 0x38, 0xc0, 0xad, 0x7e, 0x4b, 0x81, 0x32, 0x0f, + 0x6e, 0x7b, 0x4f, 0xe8, 0x55, 0xac, 0xab, 0xb9, 0x79, 0x2a, 0xa9, 0xba, 0xc3, 0x6a, 0xbc, 0x47, + 0xd4, 0x1d, 0xd6, 0xd7, 0x1c, 0x59, 0xe6, 0x5b, 0x63, 0xe2, 0x5b, 0x98, 0xb0, 0xd0, 0x82, 0xf3, + 0x42, 0xe8, 0xbd, 0x63, 0x6e, 0x12, 0xba, 0xba, 0x9a, 0xda, 0x9e, 0x27, 0xa2, 0xca, 0x19, 0xd7, + 0x6d, 0xa4, 0xc1, 0x38, 0xab, 0x0d, 0xfa, 0xe7, 0x0a, 0x3d, 0x96, 0x7d, 0xd7, 0xd4, 0x47, 0x4a, + 0xfe, 0x18, 0xf6, 0x6d, 0x69, 0x95, 0x23, 0xe3, 0xd6, 0x82, 0xf5, 0xe8, 0x7c, 0x66, 0xa5, 0x8f, + 0xf6, 0x6b, 0xb5, 0x0c, 0x53, 0x64, 0x60, 0x3a, 0xa7, 0x03, 0xfb, 0x85, 0xef, 0x1d, 0x5a, 0x85, + 0x99, 0xf1, 0x83, 0x1e, 0xa3, 0x5b, 0x50, 0xf6, 0x74, 0xa7, 0x4f, 0x8e, 0x93, 0xce, 0x36, 0x1c, + 0xe0, 0x0e, 0x6d, 0x89, 0x39, 0x82, 0xc5, 0xb7, 0x61, 0x5a, 0xee, 0x79, 0x86, 0x35, 0xa2, 0x29, + 0x5b, 0x23, 0x8e, 0x7d, 0x59, 0x27, 0x5b, 0x2f, 0x7e, 0xbf, 0x04, 0xe2, 0xa9, 0xa6, 0x21, 0x2e, + 0x2b, 0xcc, 0x20, 0xc7, 0xdd, 0x08, 0xcf, 0x53, 0x25, 0x5f, 0x8a, 0x8d, 0xc6, 0x40, 0x4e, 0x73, + 0x87, 0x6c, 0x98, 0xb0, 0xb4, 0x0d, 0x62, 0x05, 0x0f, 0xf7, 0xdc, 0x28, 0xfe, 0xb2, 0x0c, 0x4f, + 0xc0, 0xea, 0x25, 0x4c, 0xda, 0xbc, 0x10, 0x0b, 0x2a, 0x8b, 0xcf, 0x43, 0x55, 0xaa, 0x76, 0x2c, + 0x03, 0xd0, 0x97, 0x15, 0xb8, 0x14, 0x2c, 0x89, 0x78, 0x6e, 0x0c, 0x74, 0x0d, 0x2a, 0x5a, 0xdf, + 0x64, 0x36, 0x51, 0xd9, 0xaa, 0xbc, 0xdc, 0x6e, 0xb1, 0x32, 0x1c, 0x42, 0xd1, 0x47, 0xa0, 0x12, + 0xcc, 0x93, 0x10, 0x90, 0xc2, 0x2d, 0x1e, 0x5e, 0xe6, 0x84, 0x35, 0xd0, 0x87, 0xa4, 0xac, 0x7d, + 0xe5, 0xe8, 0x44, 0x0b, 0x09, 0xf3, 0x7b, 0x5f, 0xf5, 0x4b, 0x63, 0x30, 0xc3, 0x0d, 0x09, 0x75, + 0xd3, 0x36, 0x4c, 0xbb, 0x7b, 0x06, 0xac, 0x34, 0xf6, 0x58, 0x67, 0xe9, 0xa4, 0x1e, 0xeb, 0xbc, + 0x0d, 0x13, 0xef, 0xd0, 0x6d, 0x1d, 0x2c, 0x87, 0xa1, 0x76, 0x57, 0x38, 0xd7, 0x8c, 0x23, 0x78, + 0x58, 0xa0, 0x40, 0x9e, 0xf4, 0x64, 0xea, 0x08, 0x61, 0xce, 0xb1, 0x91, 0x0d, 0x73, 0x6f, 0x4e, + 0x67, 0xbf, 0x97, 0xaa, 0xfe, 0x47, 0x05, 0xe6, 0x63, 0x2d, 0xce, 0xe0, 0x24, 0xd8, 0x8c, 0x9f, + 0x04, 0xcb, 0x23, 0x7f, 0x65, 0xce, 0x89, 0xf0, 0x3c, 0x5c, 0xcc, 0x1c, 0x8c, 0xa3, 0x05, 0x28, + 0xf5, 0xb7, 0x4b, 0x30, 0xde, 0x21, 0xc4, 0x38, 0x83, 0x95, 0xf9, 0x56, 0xec, 0x90, 0xff, 0x54, + 0xe1, 0xe7, 0xa3, 0xf2, 0xcc, 0x23, 0x9b, 0x09, 0xf3, 0xc8, 0xa7, 0x0b, 0x53, 0x38, 0xdc, 0x36, + 0xf2, 0xcb, 0x25, 0x00, 0x5a, 0x8d, 0x3f, 0xef, 0x28, 0x7c, 0x24, 0xa3, 0x07, 0x80, 0xa7, 0xde, + 0x2d, 0xcf, 0xf6, 0xaa, 0xe1, 0xd3, 0x80, 0x63, 0x91, 0xf1, 0x3d, 0xfe, 0x2c, 0x60, 0x9c, 0x5b, + 0x8c, 0x9f, 0x10, 0xb7, 0x50, 0xff, 0x91, 0x02, 0x2c, 0xed, 0x7c, 0x73, 0xad, 0x83, 0x9e, 0x83, + 0x19, 0x93, 0x5f, 0x6d, 0x36, 0xe5, 0xcc, 0x71, 0xec, 0x02, 0xa6, 0x25, 0x03, 0x70, 0xbc, 0x1e, + 0xea, 0x49, 0xe3, 0x3a, 0xc2, 0x23, 0xab, 0xa2, 0x1f, 0x47, 0xf2, 0x87, 0xef, 0x95, 0xe0, 0x5c, + 0xa2, 0xee, 0x10, 0xfa, 0xc7, 0xe9, 0x70, 0x5b, 0x29, 0x5d, 0xef, 0xd8, 0xe9, 0xa7, 0xeb, 0x0d, + 0x33, 0xe7, 0x8e, 0x9f, 0x6e, 0xe6, 0xdc, 0x3f, 0x52, 0x80, 0xbd, 0xda, 0x79, 0x06, 0x8c, 0xf7, + 0x2f, 0xc7, 0x19, 0xef, 0x27, 0x8b, 0x2e, 0x9c, 0x1c, 0x7e, 0xfb, 0x1b, 0x25, 0x60, 0x29, 0xe4, + 0x85, 0x27, 0x87, 0xe4, 0x1c, 0xa1, 0xe4, 0x38, 0x47, 0x5c, 0x15, 0xbe, 0x15, 0x09, 0x2b, 0xa1, + 0xe4, 0x5f, 0xf1, 0x11, 0xc9, 0x7d, 0x62, 0x2c, 0xce, 0x46, 0xd2, 0x2e, 0x14, 0xe8, 0x21, 0xcc, + 0x78, 0x5b, 0x8e, 0xe3, 0x07, 0x2a, 0xbb, 0x98, 0xbb, 0xe5, 0xc2, 0x2e, 0xcd, 0xc1, 0xa7, 0xf0, + 0x8d, 0xd9, 0x91, 0x71, 0xe3, 0x38, 0x29, 0xb4, 0x04, 0xb0, 0x61, 0x39, 0xfa, 0x76, 0xa3, 0xd5, + 0xc4, 0x81, 0xe3, 0x2b, 0x73, 0xbf, 0xaa, 0x87, 0xa5, 0x58, 0xaa, 0xa1, 0xfe, 0xa1, 0xc2, 0x47, + 0xeb, 0x18, 0xdb, 0xea, 0x0c, 0xb9, 0xe4, 0x87, 0x13, 0x5c, 0x32, 0xef, 0x01, 0xd5, 0xdf, 0x13, + 0x5f, 0x11, 0x3e, 0x14, 0xd0, 0x87, 0x19, 0x4b, 0x7e, 0x59, 0x40, 0x2c, 0xe3, 0x42, 0x8f, 0x12, + 0x84, 0x59, 0xef, 0x62, 0xc5, 0x38, 0x4e, 0x80, 0xb2, 0xd2, 0xa0, 0xf3, 0xfc, 0xbd, 0x43, 0xee, + 0xbb, 0xc2, 0x66, 0xac, 0x2d, 0x03, 0x70, 0xbc, 0x9e, 0xfa, 0xf7, 0x4b, 0x70, 0x99, 0xf7, 0x9d, + 0x39, 0x9f, 0x37, 0x49, 0x9f, 0xd8, 0x06, 0xb1, 0xf5, 0x3d, 0x26, 0x2e, 0x1b, 0x4e, 0x17, 0xfd, + 0x35, 0x05, 0x2a, 0xc1, 0xc5, 0x93, 0xf8, 0x90, 0x37, 0x8a, 0xbf, 0xef, 0x98, 0x43, 0x25, 0xbc, + 0xf6, 0xe2, 0x09, 0xd8, 0xc4, 0x2f, 0x1c, 0x12, 0x46, 0x0f, 0xa0, 0xdc, 0x77, 0x9d, 0x8d, 0x40, + 0xad, 0xba, 0x7f, 0xe2, 0x3d, 0x68, 0x53, 0xec, 0x7c, 0x7b, 0xb2, 0x7f, 0x31, 0xa7, 0xa7, 0x62, + 0xf8, 0xd0, 0x50, 0x3d, 0x47, 0x4f, 0x25, 0xf3, 0x0c, 0x87, 0xf6, 0x93, 0x54, 0x0a, 0xa7, 0xbb, + 0xa0, 0x1e, 0xdd, 0x97, 0xe3, 0x20, 0x7c, 0x15, 0x3e, 0x28, 0x21, 0x5c, 0xd9, 0xd5, 0x89, 0xe7, + 0x35, 0xb4, 0xbe, 0xa6, 0x53, 0x95, 0x92, 0x05, 0xde, 0x72, 0x43, 0xef, 0x31, 0x50, 0xfe, 0x7f, + 0x05, 0x6a, 0x12, 0xce, 0x98, 0x03, 0x54, 0xc0, 0x6a, 0xbe, 0xa6, 0x40, 0x55, 0xb3, 0x6d, 0xc7, + 0xd7, 0xe4, 0x7b, 0x47, 0x63, 0xc4, 0xb9, 0xc9, 0x22, 0xb5, 0xb4, 0x1c, 0x91, 0x49, 0x78, 0x18, + 0x48, 0x10, 0x2c, 0xf7, 0x66, 0xf1, 0xd3, 0x30, 0x97, 0x6c, 0x75, 0x2c, 0xe5, 0xb1, 0x01, 0x97, + 0xa4, 0x5e, 0xb1, 0xbb, 0x8c, 0xc6, 0x16, 0xd1, 0xb7, 0xbd, 0xe3, 0x0c, 0x63, 0x9d, 0xca, 0xdf, + 0x21, 0x12, 0x11, 0x07, 0x49, 0xd5, 0xbd, 0xa7, 0x60, 0x72, 0xc7, 0xf4, 0xcc, 0x20, 0x9e, 0x5e, + 0xc2, 0x71, 0x9f, 0x17, 0xe3, 0x00, 0xae, 0xbe, 0x02, 0xe7, 0x65, 0x1c, 0x8c, 0xe3, 0xae, 0x75, + 0x8e, 0xd3, 0x8b, 0x55, 0xb8, 0x2a, 0x61, 0xc8, 0x0c, 0x06, 0x3c, 0x0e, 0xba, 0xaf, 0x55, 0x02, + 0x86, 0x27, 0x22, 0x56, 0x7e, 0x47, 0x81, 0xc7, 0x49, 0xde, 0xaa, 0x13, 0x4c, 0xe3, 0xf5, 0x11, + 0x97, 0x45, 0xee, 0xaa, 0x16, 0xb9, 0xa7, 0xf2, 0xc0, 0x38, 0xbf, 0x67, 0x68, 0x0f, 0xc0, 0x0b, + 0xa7, 0x64, 0x14, 0xcf, 0xe3, 0xcc, 0x39, 0x16, 0x89, 0x96, 0xc3, 0xdf, 0x58, 0x22, 0x86, 0xde, + 0x81, 0x8a, 0x27, 0x66, 0x72, 0x94, 0x58, 0xe5, 0x8c, 0x85, 0x21, 0x9c, 0x2b, 0xc5, 0x2f, 0x1c, + 0x92, 0x41, 0xbf, 0xa2, 0xc0, 0x05, 0x2b, 0x63, 0x73, 0x09, 0x09, 0xa1, 0x73, 0x0a, 0xfb, 0x96, + 0x5b, 0xb0, 0xb3, 0x20, 0x38, 0xb3, 0x2b, 0xe8, 0xd7, 0x72, 0x03, 0x63, 0xcb, 0xc5, 0x1f, 0x59, + 0x39, 0x6a, 0xed, 0x1f, 0x3f, 0x46, 0x16, 0xfd, 0x04, 0x54, 0x9d, 0x88, 0x23, 0x88, 0x48, 0xe6, + 0xcf, 0x8c, 0xd8, 0x39, 0x89, 0xc7, 0xf0, 0xfb, 0x40, 0xa9, 0x00, 0xcb, 0xf4, 0xd0, 0x57, 0x14, + 0x40, 0x46, 0xea, 0xdc, 0x10, 0x57, 0x92, 0xaf, 0x9e, 0xf8, 0xe1, 0xc8, 0x6f, 0x40, 0xd2, 0xe5, + 0x38, 0xa3, 0x13, 0xea, 0x97, 0x27, 0xb9, 0x30, 0xcf, 0x6c, 0xd0, 0x1b, 0x30, 0xb1, 0xc1, 0x94, + 0x61, 0xc1, 0x05, 0x0a, 0x6b, 0xde, 0x5c, 0xa5, 0xe6, 0x9a, 0x2a, 0xff, 0x1f, 0x0b, 0xcc, 0xe8, + 0x4d, 0x18, 0x33, 0xec, 0xe0, 0xe1, 0xae, 0x17, 0x47, 0xd0, 0x04, 0x23, 0xbf, 0x75, 0xba, 0x71, + 0x28, 0x52, 0x64, 0x43, 0xc5, 0x16, 0xf2, 0xaf, 0xd8, 0xa6, 0x85, 0x1f, 0xb7, 0x0e, 0xe5, 0xe8, + 0x50, 0x7a, 0x0f, 0x4a, 0x70, 0x48, 0x83, 0xd2, 0x4b, 0x18, 0xc0, 0x0a, 0xd3, 0x0b, 0xf5, 0xda, + 0xc3, 0x8c, 0x0e, 0x6d, 0x59, 0x4b, 0x2d, 0x0f, 0xaf, 0xa5, 0xce, 0xe4, 0x6a, 0xa8, 0x04, 0x26, + 0x7c, 0x8d, 0xb9, 0x41, 0x4d, 0x14, 0x77, 0x43, 0xa2, 0xfd, 0xbf, 0x47, 0xb1, 0x44, 0x42, 0x37, + 0xfb, 0xe9, 0x61, 0x81, 0x9c, 0x2e, 0x2c, 0xfe, 0xee, 0xb6, 0x58, 0xf4, 0x85, 0x17, 0x16, 0x7f, + 0x4f, 0x85, 0x2f, 0x2c, 0xfe, 0x3f, 0x16, 0x98, 0xd1, 0xdb, 0x54, 0xf1, 0xe2, 0x47, 0x9c, 0xc8, + 0xa2, 0xf7, 0xca, 0x88, 0x5b, 0xcb, 0x0b, 0x3c, 0xdf, 0xf9, 0x2f, 0x1c, 0xe2, 0x47, 0x1b, 0x30, + 0x29, 0x8c, 0x1c, 0x22, 0x05, 0xc0, 0x8b, 0x23, 0x24, 0xc5, 0x0f, 0x9e, 0x08, 0xe2, 0x61, 0xb8, + 0x01, 0x62, 0xf5, 0xdf, 0x4f, 0x71, 0xf3, 0x94, 0x70, 0x21, 0xd8, 0x84, 0x4a, 0x80, 0x6e, 0x94, + 0x28, 0x8c, 0xe0, 0x89, 0x0f, 0xfe, 0x69, 0xc1, 0x2f, 0x1c, 0xe2, 0x46, 0x8d, 0xac, 0x80, 0x97, + 0x28, 0x21, 0xea, 0x70, 0xc1, 0x2e, 0x71, 0x0f, 0xb7, 0xb1, 0xb3, 0xf0, 0x70, 0xcb, 0x76, 0xb1, + 0x18, 0x2f, 0xe4, 0x62, 0xf1, 0x12, 0x9c, 0x0b, 0x1c, 0xd0, 0x0c, 0xc2, 0xae, 0x7a, 0x84, 0x6b, + 0x36, 0x8b, 0x2a, 0x6d, 0xc4, 0x41, 0x38, 0x59, 0x17, 0xfd, 0xbe, 0x02, 0x15, 0x5d, 0x08, 0x30, + 0x62, 0x5f, 0xdd, 0x19, 0xcd, 0x86, 0xb9, 0x14, 0xc8, 0x43, 0x5c, 0x9c, 0xbe, 0x1f, 0xf0, 0x88, + 0xa0, 0xf8, 0x84, 0xee, 0xe0, 0xc2, 0x5e, 0xa3, 0x7f, 0x43, 0x95, 0x05, 0x8b, 0x3d, 0x3c, 0xc2, + 0x82, 0xf4, 0xb8, 0xcf, 0xf8, 0xdd, 0x11, 0xbf, 0x62, 0x39, 0xc2, 0xc8, 0x3f, 0xe4, 0x8d, 0x50, + 0x2f, 0x88, 0x20, 0x27, 0xf4, 0x2d, 0x72, 0xf7, 0xd1, 0xaf, 0x2b, 0xf0, 0x41, 0xee, 0xa8, 0xdf, + 0xa0, 0x02, 0x02, 0x7b, 0xb8, 0x87, 0x44, 0x2f, 0x05, 0x45, 0x0e, 0x21, 0x95, 0x63, 0x3b, 0x84, + 0x5c, 0x3b, 0xd8, 0xaf, 0x7d, 0xb0, 0x31, 0x04, 0x6e, 0x3c, 0x54, 0x0f, 0x16, 0xb7, 0x61, 0x26, + 0x36, 0xd9, 0xa7, 0x79, 0x6b, 0xb9, 0x68, 0xc3, 0x5c, 0x72, 0x4e, 0x4e, 0xf5, 0x96, 0xf4, 0x36, + 0x4c, 0x85, 0x87, 0x05, 0xba, 0x2c, 0x11, 0x8a, 0x0e, 0xf3, 0xdb, 0x64, 0x8f, 0x53, 0xad, 0xc5, + 0x74, 0x3d, 0xae, 0xec, 0xdf, 0xa7, 0x05, 0x02, 0xa1, 0xfa, 0x6d, 0x61, 0xc9, 0xb9, 0x47, 0x7a, + 0x7d, 0x4b, 0xf3, 0xc9, 0x7b, 0xff, 0xea, 0x43, 0xfd, 0xef, 0x0a, 0xe7, 0xf9, 0xe2, 0x51, 0x32, + 0x0d, 0xaa, 0x3d, 0x9e, 0x40, 0x90, 0x45, 0x94, 0x2a, 0xc5, 0x63, 0x59, 0x57, 0x23, 0x34, 0x58, + 0xc6, 0x89, 0x1e, 0xa4, 0x9f, 0xcd, 0xbb, 0x31, 0xda, 0xe1, 0x3c, 0xf4, 0xeb, 0x79, 0x28, 0xdd, + 0x46, 0x7e, 0x71, 0x4c, 0x39, 0xfc, 0xc5, 0xb1, 0xa3, 0xdf, 0xa1, 0x52, 0xff, 0x5f, 0x09, 0x32, + 0xdf, 0x7c, 0x40, 0x2a, 0x4c, 0xf0, 0x08, 0x19, 0xf9, 0x3d, 0x41, 0x1e, 0x3e, 0x83, 0x05, 0x04, + 0xb9, 0x70, 0x41, 0xc4, 0x9f, 0xdc, 0x26, 0x7b, 0xd1, 0x4b, 0x76, 0x62, 0xea, 0x87, 0xf7, 0x44, + 0x67, 0x89, 0xc5, 0x3a, 0x09, 0x4c, 0x38, 0x13, 0x37, 0xba, 0xcb, 0xc3, 0xc1, 0x6c, 0xe3, 0x9e, + 0xb3, 0x4d, 0xec, 0x88, 0x3b, 0x88, 0xe8, 0xd6, 0xc7, 0x83, 0x70, 0xb0, 0x54, 0x05, 0x9c, 0xdd, + 0x0e, 0xed, 0x00, 0xea, 0x69, 0xbb, 0x49, 0x6c, 0x23, 0xa4, 0x9b, 0x5f, 0x4d, 0x61, 0xc3, 0x19, + 0x14, 0x58, 0x2c, 0x07, 0xd3, 0x69, 0xdf, 0x1b, 0x3e, 0x47, 0xac, 0xab, 0xa7, 0x1b, 0xcb, 0xc1, + 0x49, 0x1c, 0x7e, 0x21, 0xf9, 0x06, 0x5c, 0x62, 0xd5, 0x96, 0x0d, 0xa6, 0xc6, 0x7a, 0xc4, 0x58, + 0x36, 0x0c, 0x16, 0x58, 0x39, 0xea, 0x4b, 0x7e, 0xcc, 0x6f, 0x8a, 0xe1, 0x7e, 0x8f, 0xf8, 0x4d, + 0xb1, 0xbe, 0xe6, 0xdc, 0xda, 0xfc, 0x91, 0x02, 0xf3, 0xa9, 0xf4, 0x2d, 0x43, 0x79, 0xdd, 0x9c, + 0xd9, 0x65, 0xc4, 0x87, 0x92, 0x2f, 0xe0, 0x55, 0x33, 0xb3, 0x3a, 0xbd, 0x06, 0x33, 0xb1, 0x4b, + 0x9b, 0x30, 0x74, 0x57, 0xc9, 0x0c, 0xdd, 0x95, 0x23, 0x73, 0x4b, 0x87, 0x46, 0xe6, 0x7e, 0x63, + 0x46, 0x4c, 0x37, 0x53, 0xeb, 0xdf, 0x82, 0x09, 0x16, 0x3f, 0x1b, 0x3c, 0x1a, 0xfa, 0x42, 0xe1, + 0xb8, 0x5c, 0x8f, 0xb3, 0x4a, 0xfe, 0x3f, 0x16, 0x58, 0x51, 0x13, 0xe6, 0x74, 0xcb, 0x19, 0x50, + 0x1d, 0x76, 0xd3, 0xb4, 0xc8, 0x5a, 0xc4, 0x95, 0xc3, 0x04, 0x20, 0x8d, 0x04, 0x1c, 0xa7, 0x5a, + 0x20, 0xcc, 0x0d, 0x03, 0x7c, 0x8f, 0x3d, 0x57, 0xf0, 0xf2, 0x92, 0xa7, 0x58, 0x0c, 0x0d, 0x02, + 0xef, 0x00, 0x90, 0x60, 0xe2, 0x02, 0x2f, 0xcb, 0x97, 0x8a, 0xa5, 0x36, 0x09, 0xa7, 0x3f, 0x60, + 0x46, 0x61, 0x91, 0x87, 0x25, 0x22, 0xc8, 0x85, 0xea, 0x56, 0xf4, 0x40, 0xa0, 0xd0, 0xd2, 0x5f, + 0x1e, 0xf1, 0x71, 0x42, 0x7e, 0x88, 0x4b, 0x05, 0x58, 0x26, 0x82, 0x5c, 0x80, 0x48, 0x07, 0x1b, + 0xe5, 0x41, 0xa9, 0x48, 0xb9, 0x8b, 0xbe, 0x33, 0x2a, 0xc3, 0x12, 0x15, 0x4a, 0xd3, 0x0e, 0x03, + 0xe0, 0x47, 0x51, 0xeb, 0xa3, 0x30, 0xfa, 0x88, 0x66, 0x54, 0x86, 0x25, 0x2a, 0x74, 0x6c, 0x7b, + 0x51, 0xd2, 0x03, 0x21, 0xac, 0xbf, 0x3c, 0x62, 0xf2, 0x09, 0x21, 0x20, 0x45, 0x05, 0x58, 0x26, + 0x82, 0x6c, 0x80, 0x5e, 0x98, 0x0b, 0x41, 0x68, 0xfb, 0x85, 0xbe, 0x33, 0xca, 0xa8, 0xc0, 0x4d, + 0xcd, 0xd1, 0x6f, 0x2c, 0x51, 0x40, 0x6f, 0x4b, 0x36, 0x25, 0x28, 0x2e, 0x66, 0x0e, 0x65, 0x4f, + 0xfa, 0x44, 0x24, 0x6d, 0x55, 0xd9, 0x7e, 0x7d, 0x42, 0x92, 0xb4, 0x1e, 0xed, 0xd7, 0xa6, 0x19, + 0x0f, 0x49, 0x49, 0x5e, 0xd1, 0x55, 0xeb, 0xf4, 0x61, 0x57, 0xad, 0xe8, 0x26, 0xcc, 0x7b, 0xb2, + 0x3b, 0x13, 0x63, 0x0c, 0x33, 0xac, 0x49, 0x98, 0x3b, 0xa3, 0x93, 0xac, 0x80, 0xd3, 0x6d, 0x38, + 0xe3, 0x23, 0x06, 0x6b, 0x3f, 0x2b, 0x33, 0x3e, 0x5e, 0x86, 0x43, 0x28, 0xda, 0x49, 0x3c, 0x30, + 0x7f, 0x6e, 0x54, 0x43, 0xd0, 0x90, 0xaf, 0xcd, 0x7f, 0x4e, 0x7e, 0xdc, 0x7c, 0xae, 0xb8, 0xcf, + 0x6d, 0x76, 0xfe, 0x8b, 0x23, 0x1e, 0x38, 0x1f, 0xc4, 0x43, 0x5d, 0xe6, 0x4f, 0xc4, 0xbd, 0x3f, + 0xbc, 0xb2, 0xcb, 0x0b, 0x73, 0x41, 0x0d, 0x98, 0x27, 0xbb, 0x7d, 0xc7, 0x1b, 0xb8, 0x84, 0xa5, + 0xde, 0x61, 0xd3, 0x83, 0x22, 0x4b, 0xd1, 0x4a, 0x12, 0x88, 0xd3, 0xf5, 0xd5, 0x6f, 0x4d, 0x41, + 0x55, 0x92, 0x8d, 0x7e, 0x18, 0xb1, 0x91, 0x3e, 0x54, 0x75, 0xc7, 0xf6, 0x7c, 0x57, 0x93, 0xe2, + 0x41, 0x47, 0xa4, 0x19, 0x8e, 0x5e, 0x23, 0xc2, 0x8c, 0x65, 0x32, 0x74, 0x9f, 0x87, 0xf6, 0xbc, + 0xb1, 0x13, 0xb0, 0xe7, 0x85, 0xfb, 0x3c, 0xc3, 0xa6, 0xf7, 0x71, 0x80, 0xe0, 0xb8, 0x08, 0x5f, + 0x9d, 0x0e, 0x73, 0x76, 0xb6, 0xbc, 0x5b, 0x21, 0x0c, 0x4b, 0xf5, 0xd0, 0x43, 0x98, 0xb1, 0xe4, + 0x7c, 0x7d, 0xe2, 0x2c, 0x2b, 0xe4, 0x9b, 0x12, 0x4b, 0xfc, 0xc7, 0x3d, 0x1d, 0x62, 0x45, 0x38, + 0x4e, 0x8a, 0x2e, 0x03, 0x2b, 0xc8, 0x31, 0x39, 0x92, 0x6d, 0x3a, 0xcc, 0x54, 0x19, 0x2d, 0x83, + 0xb0, 0xc8, 0xc3, 0x12, 0x91, 0x1c, 0x03, 0xe2, 0x64, 0x21, 0x03, 0xe2, 0x00, 0xce, 0xbb, 0xc4, + 0x77, 0xf7, 0x1a, 0x7b, 0x3a, 0x7b, 0x94, 0xd6, 0xf5, 0x59, 0x82, 0xc7, 0x4a, 0xb1, 0x70, 0x2b, + 0x9c, 0x46, 0x85, 0xb3, 0xf0, 0xc7, 0xf8, 0xe4, 0xd4, 0xa1, 0x7c, 0xf2, 0x13, 0x50, 0xf5, 0x89, + 0xbe, 0x65, 0x9b, 0xba, 0x66, 0xb5, 0x9a, 0x22, 0x25, 0x42, 0xb4, 0xe5, 0x23, 0x10, 0x96, 0xeb, + 0xa1, 0x3a, 0x8c, 0x0d, 0x4c, 0x43, 0x1c, 0x16, 0x3f, 0x12, 0x6a, 0x19, 0xad, 0xe6, 0xa3, 0xfd, + 0xda, 0xfb, 0x23, 0x8b, 0x5c, 0xf8, 0x55, 0xd7, 0xfb, 0xdb, 0xdd, 0xeb, 0xfe, 0x5e, 0x9f, 0x78, + 0x4b, 0xeb, 0xad, 0x26, 0xa6, 0x8d, 0xb3, 0x8c, 0xab, 0xd3, 0xc7, 0x30, 0xae, 0x7e, 0x45, 0x81, + 0xf3, 0x5a, 0x52, 0x41, 0x22, 0xde, 0xc2, 0x4c, 0x71, 0xa6, 0x9b, 0xad, 0x74, 0x45, 0x49, 0x99, + 0x96, 0xd3, 0xe4, 0x70, 0x56, 0x1f, 0xd4, 0x3f, 0x56, 0x84, 0x40, 0x7f, 0x86, 0x26, 0xa9, 0xd3, + 0x56, 0x7f, 0xd5, 0x3b, 0x00, 0xd1, 0x11, 0x30, 0xb2, 0xd1, 0xee, 0x07, 0x65, 0xb8, 0x38, 0xaa, + 0x4b, 0x03, 0x4b, 0x3d, 0xc9, 0x5e, 0x07, 0x5a, 0xde, 0xf4, 0x89, 0x7b, 0xf7, 0xee, 0x6a, 0xf8, + 0x78, 0x4a, 0xc1, 0xdc, 0x97, 0xd1, 0xe3, 0x52, 0x29, 0x8c, 0x38, 0x87, 0x12, 0x3b, 0xfe, 0xc4, + 0x33, 0x0c, 0x58, 0xf3, 0x49, 0x7d, 0xe0, 0x7a, 0xbe, 0x08, 0x24, 0xe0, 0xc7, 0x5f, 0x12, 0x88, + 0xd3, 0xf5, 0x93, 0x48, 0xf8, 0x4b, 0x45, 0xe3, 0xec, 0x25, 0xe7, 0x14, 0x12, 0xfe, 0x5c, 0x51, + 0xba, 0xbe, 0x8c, 0x24, 0x7c, 0xf9, 0x99, 0x31, 0xeb, 0x04, 0x92, 0xe8, 0x59, 0xe8, 0x74, 0x7d, + 0x64, 0xc0, 0x93, 0x2e, 0xd1, 0x9d, 0x5e, 0x8f, 0xd8, 0x06, 0x4f, 0x5a, 0xac, 0xb9, 0x5d, 0xd3, + 0xbe, 0xe1, 0x6a, 0xac, 0xa2, 0x78, 0x5e, 0xfa, 0xea, 0xc1, 0x7e, 0xed, 0x49, 0x7c, 0x48, 0x3d, + 0x7c, 0x28, 0x16, 0xd4, 0x83, 0x73, 0x03, 0x96, 0x58, 0xcd, 0x6d, 0xd9, 0x3e, 0x71, 0x77, 0x34, + 0xab, 0xe0, 0xfb, 0x5b, 0x8c, 0x59, 0xac, 0xc7, 0x51, 0xe1, 0x24, 0x6e, 0xb4, 0x47, 0xf9, 0xb0, + 0xe8, 0x8e, 0x44, 0xb2, 0x52, 0x3c, 0x39, 0x2b, 0x4e, 0xa3, 0xc3, 0x59, 0x34, 0xd4, 0xaf, 0x28, + 0x20, 0x6e, 0x28, 0xa9, 0x56, 0x2f, 0x99, 0x26, 0x2a, 0x09, 0xb3, 0xc4, 0x93, 0xc2, 0x8b, 0xb2, + 0x14, 0x41, 0x25, 0x0f, 0xca, 0x0f, 0x4b, 0x11, 0x2a, 0x53, 0x11, 0x2b, 0xe0, 0x98, 0xa5, 0xd4, + 0x84, 0x4f, 0xc3, 0x14, 0xb1, 0x75, 0x77, 0xaf, 0x1f, 0x9d, 0xf0, 0x33, 0x3c, 0x21, 0x85, 0x28, + 0xc4, 0x11, 0x5c, 0xfd, 0x77, 0x0a, 0x08, 0x0c, 0x2c, 0x25, 0xe6, 0x50, 0x09, 0x15, 0x8f, 0x7e, + 0xf6, 0x3f, 0x4a, 0xe9, 0x38, 0x96, 0x97, 0xd2, 0xf1, 0xb4, 0xf2, 0x23, 0xfe, 0x8e, 0x02, 0xc9, + 0xe7, 0x74, 0xd1, 0x87, 0x60, 0x52, 0x84, 0xbf, 0x8a, 0x20, 0x3a, 0xee, 0x35, 0xcd, 0x8b, 0x70, + 0x00, 0x8b, 0x4b, 0xee, 0x23, 0x44, 0xcb, 0x65, 0x47, 0x2e, 0x1d, 0x2e, 0xb9, 0xab, 0xdf, 0x99, + 0x85, 0x09, 0x1e, 0xb0, 0x49, 0x79, 0x5a, 0x86, 0x7b, 0xde, 0xed, 0xe2, 0x21, 0xa1, 0x05, 0xbc, + 0xf0, 0x62, 0xd9, 0xbb, 0x4a, 0x87, 0x66, 0xef, 0xc2, 0x3c, 0x5d, 0xeb, 0x08, 0xd6, 0x9a, 0x06, + 0x6e, 0x89, 0x17, 0x42, 0x44, 0xaa, 0x56, 0xe4, 0xc7, 0xcc, 0x18, 0xe3, 0xc5, 0x13, 0xd1, 0xf2, + 0x01, 0x90, 0x8c, 0x19, 0xb3, 0x87, 0x18, 0x32, 0xa2, 0x08, 0xb9, 0x72, 0xf1, 0xeb, 0x0f, 0x31, + 0xe4, 0x43, 0x44, 0xc8, 0x85, 0x1b, 0x69, 0x22, 0x77, 0x23, 0x6d, 0xc2, 0xa4, 0xd8, 0x0a, 0x82, + 0x39, 0xbe, 0x38, 0x42, 0x2a, 0x56, 0x29, 0x9f, 0x02, 0x2f, 0xc0, 0x01, 0x72, 0x7a, 0xe2, 0xf6, + 0xb4, 0x5d, 0xb3, 0x37, 0xe8, 0x31, 0x8e, 0x58, 0x96, 0xab, 0xb2, 0x62, 0x1c, 0xc0, 0x59, 0x55, + 0x7e, 0x6b, 0xc4, 0x04, 0x4b, 0xb9, 0xaa, 0x78, 0xe1, 0x2a, 0x80, 0xa3, 0x37, 0xa1, 0xd2, 0xd3, + 0x76, 0x3b, 0x03, 0xb7, 0x4b, 0x84, 0x01, 0x23, 0x5f, 0xe4, 0x19, 0xf8, 0xa6, 0xb5, 0x44, 0xd5, + 0x21, 0xdf, 0x5d, 0x6a, 0xd9, 0xfe, 0x5d, 0xb7, 0xe3, 0xbb, 0x61, 0x8a, 0xc8, 0x55, 0x81, 0x05, + 0x87, 0xf8, 0x90, 0x05, 0xb3, 0x3d, 0x6d, 0x77, 0xdd, 0xd6, 0xc2, 0x87, 0x78, 0xaa, 0x05, 0x29, + 0x30, 0x2b, 0xee, 0x6a, 0x0c, 0x17, 0x4e, 0xe0, 0xce, 0x30, 0x18, 0x4f, 0x9f, 0x96, 0xc1, 0x78, + 0x39, 0xf4, 0xc3, 0xe1, 0x72, 0xec, 0xe3, 0x59, 0xf7, 0x4b, 0x87, 0xfb, 0xd8, 0xbc, 0x15, 0xfa, + 0xd8, 0xcc, 0x16, 0xb7, 0xf2, 0x1e, 0xe2, 0x5f, 0x33, 0x80, 0x2a, 0x15, 0x38, 0x79, 0xa9, 0xb7, + 0x70, 0xae, 0xb8, 0x95, 0xa1, 0x19, 0xa2, 0x91, 0xd2, 0xe4, 0x47, 0xa8, 0xb1, 0x4c, 0x07, 0xdd, + 0xe5, 0x0f, 0xb5, 0x58, 0xc4, 0x8f, 0xaa, 0x30, 0x05, 0x67, 0x8e, 0x1b, 0x92, 0x82, 0x77, 0x55, + 0x52, 0x15, 0x70, 0x76, 0x3b, 0x2a, 0xa2, 0xf2, 0x30, 0x99, 0xf9, 0x28, 0x8d, 0x4b, 0x2c, 0x64, + 0xf6, 0x6f, 0x2a, 0x30, 0xc7, 0x9f, 0x13, 0x6c, 0x38, 0xbd, 0xbe, 0x63, 0x13, 0x3a, 0x2d, 0xa8, + 0xb8, 0xcf, 0x20, 0xe7, 0x0d, 0x9d, 0x04, 0x46, 0x71, 0x31, 0x98, 0x28, 0xc5, 0x29, 0xca, 0xe8, + 0x77, 0x15, 0x58, 0xe8, 0xe5, 0x64, 0xa1, 0x5f, 0x38, 0x5f, 0xdc, 0xcf, 0xf2, 0xa8, 0xcc, 0xf6, + 0xfc, 0x89, 0xd3, 0xa3, 0x6a, 0xe1, 0xdc, 0xbe, 0x8d, 0xea, 0xd2, 0x3d, 0x4a, 0x28, 0xf1, 0xaf, + 0x2a, 0x30, 0x97, 0x3c, 0x04, 0xe4, 0xb7, 0x65, 0x94, 0xd3, 0x7d, 0x5b, 0x46, 0xba, 0xfe, 0x29, + 0x1d, 0x72, 0xfd, 0xf3, 0x12, 0x5c, 0xca, 0x5e, 0x1b, 0x54, 0x22, 0x63, 0x6f, 0x39, 0x09, 0x4d, + 0x28, 0xca, 0x86, 0x4a, 0x0b, 0x31, 0x87, 0xd5, 0x3f, 0xfa, 0xcd, 0xef, 0x5f, 0x79, 0xdf, 0xb7, + 0xbf, 0x7f, 0xe5, 0x7d, 0xdf, 0xfd, 0xfe, 0x95, 0xf7, 0xfd, 0xe4, 0xc1, 0x15, 0xe5, 0x9b, 0x07, + 0x57, 0x94, 0x6f, 0x1f, 0x5c, 0x51, 0xbe, 0x7b, 0x70, 0x45, 0xf9, 0x2f, 0x07, 0x57, 0x94, 0x9f, + 0xff, 0xaf, 0x57, 0xde, 0xf7, 0xe6, 0xa4, 0xe8, 0xf8, 0x5f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x1c, + 0x58, 0xe8, 0x68, 0x8e, 0xb9, 0x00, 0x00, } func (m *Addon) Marshal() (dAtA []byte, err error) { @@ -7525,6 +7684,18 @@ func (m *KubeletConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SerializeImagePulls != nil { + i-- + if *m.SerializeImagePulls { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x90 + } if m.ImageGCLowThresholdPercent != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.ImageGCLowThresholdPercent)) i-- @@ -10122,6 +10293,18 @@ func (m *SecretBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Provider != nil { + { + size, err := m.Provider.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } if len(m.Quotas) > 0 { for iNdEx := len(m.Quotas) - 1; iNdEx >= 0; iNdEx-- { { @@ -10206,6 +10389,34 @@ func (m *SecretBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SecretBindingProvider) 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 *SecretBindingProvider) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SecretBindingProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *Seed) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10615,6 +10826,115 @@ func (m *SeedSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SeedSettingDependencyWatchdog) 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 *SeedSettingDependencyWatchdog) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdog) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Probe != nil { + { + size, err := m.Probe.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Endpoint != nil { + { + size, err := m.Endpoint.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SeedSettingDependencyWatchdogEndpoint) 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 *SeedSettingDependencyWatchdogEndpoint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdogEndpoint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + +func (m *SeedSettingDependencyWatchdogProbe) 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 *SeedSettingDependencyWatchdogProbe) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingDependencyWatchdogProbe) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *SeedSettingExcessCapacityReservation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10693,6 +11013,37 @@ func (m *SeedSettingLoadBalancerServices) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *SeedSettingOwnerChecks) 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 *SeedSettingOwnerChecks) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeedSettingOwnerChecks) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *SeedSettingScheduling) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10806,6 +11157,30 @@ func (m *SeedSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.DependencyWatchdog != nil { + { + size, err := m.DependencyWatchdog.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.OwnerChecks != nil { + { + size, err := m.OwnerChecks.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.VerticalPodAutoscaler != nil { { size, err := m.VerticalPodAutoscaler.MarshalToSizedBuffer(dAtA[:i]) @@ -12514,6 +12889,13 @@ func (m *WorkerKubernetes) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Version != nil { + i -= len(*m.Version) + copy(dAtA[i:], *m.Version) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Version))) + i-- + dAtA[i] = 0x12 + } if m.Kubelet != nil { { size, err := m.Kubelet.MarshalToSizedBuffer(dAtA[:i]) @@ -13701,6 +14083,9 @@ func (m *KubeletConfig) Size() (n int) { if m.ImageGCLowThresholdPercent != nil { n += 2 + sovGenerated(uint64(*m.ImageGCLowThresholdPercent)) } + if m.SerializeImagePulls != nil { + n += 3 + } return n } @@ -14626,6 +15011,10 @@ func (m *SecretBinding) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.Provider != nil { + l = m.Provider.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -14646,6 +15035,17 @@ func (m *SecretBindingList) Size() (n int) { return n } +func (m *SecretBindingProvider) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *Seed) Size() (n int) { if m == nil { return 0 @@ -14798,6 +15198,43 @@ func (m *SeedSelector) Size() (n int) { return n } +func (m *SeedSettingDependencyWatchdog) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Endpoint != nil { + l = m.Endpoint.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Probe != nil { + l = m.Probe.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *SeedSettingDependencyWatchdogEndpoint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + +func (m *SeedSettingDependencyWatchdogProbe) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + func (m *SeedSettingExcessCapacityReservation) Size() (n int) { if m == nil { return 0 @@ -14825,6 +15262,16 @@ func (m *SeedSettingLoadBalancerServices) Size() (n int) { return n } +func (m *SeedSettingOwnerChecks) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} + func (m *SeedSettingScheduling) Size() (n int) { if m == nil { return 0 @@ -14881,6 +15328,14 @@ func (m *SeedSettings) Size() (n int) { l = m.VerticalPodAutoscaler.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.OwnerChecks != nil { + l = m.OwnerChecks.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.DependencyWatchdog != nil { + l = m.DependencyWatchdog.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -15493,6 +15948,10 @@ func (m *WorkerKubernetes) Size() (n int) { l = m.Kubelet.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Version != nil { + l = len(*m.Version) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -16292,6 +16751,7 @@ func (this *KubeletConfig) String() string { `SystemReserved:` + strings.Replace(this.SystemReserved.String(), "KubeletConfigReserved", "KubeletConfigReserved", 1) + `,`, `ImageGCHighThresholdPercent:` + valueToStringGenerated(this.ImageGCHighThresholdPercent) + `,`, `ImageGCLowThresholdPercent:` + valueToStringGenerated(this.ImageGCLowThresholdPercent) + `,`, + `SerializeImagePulls:` + valueToStringGenerated(this.SerializeImagePulls) + `,`, `}`, }, "") return s @@ -16955,6 +17415,7 @@ func (this *SecretBinding) String() string { `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, `SecretRef:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.SecretRef), "SecretReference", "v1.SecretReference", 1), `&`, ``, 1) + `,`, `Quotas:` + repeatedStringForQuotas + `,`, + `Provider:` + strings.Replace(this.Provider.String(), "SecretBindingProvider", "SecretBindingProvider", 1) + `,`, `}`, }, "") return s @@ -16975,6 +17436,16 @@ func (this *SecretBindingList) String() string { }, "") return s } +func (this *SecretBindingProvider) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretBindingProvider{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} func (this *Seed) String() string { if this == nil { return "nil" @@ -17077,6 +17548,37 @@ func (this *SeedSelector) String() string { }, "") return s } +func (this *SeedSettingDependencyWatchdog) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdog{`, + `Endpoint:` + strings.Replace(this.Endpoint.String(), "SeedSettingDependencyWatchdogEndpoint", "SeedSettingDependencyWatchdogEndpoint", 1) + `,`, + `Probe:` + strings.Replace(this.Probe.String(), "SeedSettingDependencyWatchdogProbe", "SeedSettingDependencyWatchdogProbe", 1) + `,`, + `}`, + }, "") + return s +} +func (this *SeedSettingDependencyWatchdogEndpoint) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdogEndpoint{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} +func (this *SeedSettingDependencyWatchdogProbe) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingDependencyWatchdogProbe{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} func (this *SeedSettingExcessCapacityReservation) String() string { if this == nil { return "nil" @@ -17107,6 +17609,16 @@ func (this *SeedSettingLoadBalancerServices) String() string { }, "") return s } +func (this *SeedSettingOwnerChecks) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeedSettingOwnerChecks{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `}`, + }, "") + return s +} func (this *SeedSettingScheduling) String() string { if this == nil { return "nil" @@ -17147,6 +17659,8 @@ func (this *SeedSettings) String() string { `ShootDNS:` + strings.Replace(this.ShootDNS.String(), "SeedSettingShootDNS", "SeedSettingShootDNS", 1) + `,`, `LoadBalancerServices:` + strings.Replace(this.LoadBalancerServices.String(), "SeedSettingLoadBalancerServices", "SeedSettingLoadBalancerServices", 1) + `,`, `VerticalPodAutoscaler:` + strings.Replace(this.VerticalPodAutoscaler.String(), "SeedSettingVerticalPodAutoscaler", "SeedSettingVerticalPodAutoscaler", 1) + `,`, + `OwnerChecks:` + strings.Replace(this.OwnerChecks.String(), "SeedSettingOwnerChecks", "SeedSettingOwnerChecks", 1) + `,`, + `DependencyWatchdog:` + strings.Replace(this.DependencyWatchdog.String(), "SeedSettingDependencyWatchdog", "SeedSettingDependencyWatchdog", 1) + `,`, `}`, }, "") return s @@ -17569,6 +18083,7 @@ func (this *WorkerKubernetes) String() string { } s := strings.Join([]string{`&WorkerKubernetes{`, `Kubelet:` + strings.Replace(this.Kubelet.String(), "KubeletConfig", "KubeletConfig", 1) + `,`, + `Version:` + valueToStringGenerated(this.Version) + `,`, `}`, }, "") return s @@ -26361,6 +26876,27 @@ func (m *KubeletConfig) Unmarshal(dAtA []byte) error { } } m.ImageGCLowThresholdPercent = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SerializeImagePulls", 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 + } + } + b := bool(v != 0) + m.SerializeImagePulls = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -33858,6 +34394,42 @@ func (m *SecretBinding) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", 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.Provider == nil { + m.Provider = &SecretBindingProvider{} + } + if err := m.Provider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -33902,50 +34474,134 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretBindingList: wiretype end group for non-group") + return fmt.Errorf("proto: SecretBindingList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretBindingList: 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 + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, SecretBinding{}) + if err := m.Items[len(m.Items)-1].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 *SecretBindingProvider) 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: SecretBindingProvider: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretBindingList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretBindingProvider: 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 - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - 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 Type", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -33955,25 +34611,23 @@ func (m *SecretBindingList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, SecretBinding{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Type = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -35057,18 +35711,251 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ProviderConfig == nil { - m.ProviderConfig = &runtime.RawExtension{} + if m.ProviderConfig == nil { + m.ProviderConfig = &runtime.RawExtension{} + } + if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + 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 + 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 *SeedSelector) 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: SeedSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LabelSelector", 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.LabelSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProviderTypes", 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.ProviderTypes = append(m.ProviderTypes, 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 *SeedSettingDependencyWatchdog) 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: SeedSettingDependencyWatchdog: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSettingDependencyWatchdog: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", 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.Endpoint == nil { + m.Endpoint = &SeedSettingDependencyWatchdogEndpoint{} } - if err := m.ProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Endpoint.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 Region", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Probe", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -35078,23 +35965,27 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + 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.Region = string(dAtA[iNdEx:postIndex]) + if m.Probe == nil { + m.Probe = &SeedSettingDependencyWatchdogProbe{} + } + if err := m.Probe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -35117,7 +36008,7 @@ func (m *SeedProvider) Unmarshal(dAtA []byte) error { } return nil } -func (m *SeedSelector) Unmarshal(dAtA []byte) error { +func (m *SeedSettingDependencyWatchdogEndpoint) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -35140,17 +36031,17 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SeedSelector: wiretype end group for non-group") + return fmt.Errorf("proto: SeedSettingDependencyWatchdogEndpoint: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SeedSelector: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SeedSettingDependencyWatchdogEndpoint: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LabelSelector", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -35160,30 +36051,67 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated + m.Enabled = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if err := m.LabelSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SeedSettingDependencyWatchdogProbe) 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 } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProviderTypes", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - var stringLen uint64 + 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: SeedSettingDependencyWatchdogProbe: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSettingDependencyWatchdogProbe: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -35193,24 +36121,12 @@ func (m *SeedSelector) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(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.ProviderTypes = append(m.ProviderTypes, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex + m.Enabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -35479,6 +36395,76 @@ func (m *SeedSettingLoadBalancerServices) Unmarshal(dAtA []byte) error { } return nil } +func (m *SeedSettingOwnerChecks) 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: SeedSettingOwnerChecks: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeedSettingOwnerChecks: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", 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.Enabled = bool(v != 0) + 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 *SeedSettingScheduling) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -35898,6 +36884,78 @@ func (m *SeedSettings) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerChecks", 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.OwnerChecks == nil { + m.OwnerChecks = &SeedSettingOwnerChecks{} + } + if err := m.OwnerChecks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DependencyWatchdog", 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.DependencyWatchdog == nil { + m.DependencyWatchdog = &SeedSettingDependencyWatchdog{} + } + if err := m.DependencyWatchdog.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -41026,6 +42084,39 @@ func (m *WorkerKubernetes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", 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 + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto index bdf664a7a..0d2282382 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto @@ -957,6 +957,11 @@ message KubeletConfig { // +optional // Default: 40 optional int32 imageGCLowThresholdPercent = 17; + + // SerializeImagePulls describes whether the images are pulled one at a time. + // +optional + // Default: true + optional bool serializeImagePulls = 18; } // KubeletConfigEviction contains kubelet eviction thresholds supporting either a resource.Quantity or a percentage based value. @@ -1673,6 +1678,10 @@ message SecretBinding { // Quotas is a list of references to Quota objects in the same or another namespace. // +optional repeated k8s.io.api.core.v1.ObjectReference quotas = 3; + + // Provider defines the provider type of the SecretBinding. + // +optional + optional SecretBindingProvider provider = 4; } // SecretBindingList is a collection of SecretBindings. @@ -1685,6 +1694,15 @@ message SecretBindingList { repeated SecretBinding items = 2; } +// SecretBindingProvider defines the provider type of the SecretBinding. +message SecretBindingProvider { + // Type is the type of the provider. + // + // For backwards compatibility, the field can contain multiple providers separated by a comma. + // However the usage of single SecretBinding (hence Secret) for different cloud providers is strongly discouraged. + optional string type = 1; +} + // Seed represents an installation request for an external controller. message Seed { // Standard object metadata. @@ -1802,6 +1820,33 @@ message SeedSelector { repeated string providerTypes = 2; } +// SeedSettingDependencyWatchdog controls the dependency-watchdog settings for the seed. +message SeedSettingDependencyWatchdog { + // Endpoint controls the endpoint settings for the dependency-watchdog for the seed. + // +optional + optional SeedSettingDependencyWatchdogEndpoint endpoint = 1; + + // Probe controls the probe settings for the dependency-watchdog for the seed. + // +optional + optional SeedSettingDependencyWatchdogProbe probe = 2; +} + +// SeedSettingDependencyWatchdogEndpoint controls the endpoint settings for the dependency-watchdog for the seed. +message SeedSettingDependencyWatchdogEndpoint { + // Enabled controls whether the endpoint controller of the dependency-watchdog should be enabled. This controller + // helps to alleviate the delay where control plane components remain unavailable by finding the respective pods in + // CrashLoopBackoff status and restarting them once their dependants become ready and available again. + optional bool enabled = 1; +} + +// SeedSettingDependencyWatchdogProbe controls the probe settings for the dependency-watchdog for the seed. +message SeedSettingDependencyWatchdogProbe { + // Enabled controls whether the probe controller of the dependency-watchdog should be enabled. This controller + // scales down the kube-controller-manager of shoot clusters in case their respective kube-apiserver is not + // reachable via its external ingress in order to avoid melt-down situations. + optional bool enabled = 1; +} + // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. message SeedSettingExcessCapacityReservation { // Enabled controls whether the excess capacity reservation should be enabled. @@ -1816,6 +1861,13 @@ message SeedSettingLoadBalancerServices { map annotations = 1; } +// SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. +message SeedSettingOwnerChecks { + // Enabled controls whether owner checks are enabled for shoots scheduled on this seed. It + // is enabled by default because it is a prerequisite for control plane migration. + optional bool enabled = 1; +} + // SeedSettingScheduling controls settings for scheduling decisions for the seed. message SeedSettingScheduling { // Visible controls whether the gardener-scheduler shall consider this seed when scheduling shoots. Invisible seeds @@ -1861,6 +1913,14 @@ message SeedSettings { // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. // +optional optional SeedSettingVerticalPodAutoscaler verticalPodAutoscaler = 5; + + // SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. + // +optional + optional SeedSettingOwnerChecks ownerChecks = 6; + + // DependencyWatchdog controls certain settings for the dependency-watchdog components deployed in the seed. + // +optional + optional SeedSettingDependencyWatchdog dependencyWatchdog = 7; } // SeedSpec is the specification of a Seed. @@ -1881,8 +1941,8 @@ message SeedSpec { // Provider defines the provider type and region for this Seed cluster. optional SeedProvider provider = 4; - // SecretRef is a reference to a Secret object containing the Kubeconfig and the cloud provider credentials for - // the account the Seed cluster has been deployed to. + // SecretRef is a reference to a Secret object containing the Kubeconfig of the Kubernetes + // cluster to be registered as Seed. // +optional optional k8s.io.api.core.v1.SecretReference secretRef = 5; @@ -2401,6 +2461,13 @@ message WorkerKubernetes { // If set, all `spec.kubernetes.kubelet` settings will be overwritten for this worker pool (no merge of settings). // +optional optional KubeletConfig kubelet = 1; + + // Version is the semantic Kubernetes version to use for the Kubelet in this Worker Group. + // If not specified the kubelet version is derived from the global shoot cluster kubernetes version. + // version must be equal or lower than the version of the shoot kubernetes version. + // Only one minor version difference to other worker groups and global kubernetes version is allowed. + // +optional + optional string version = 2; } // WorkerSystemComponents contains configuration for system components related to this worker pool diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/condition_builder.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/condition_builder.go index 0d19e7a47..3034dae34 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/condition_builder.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/condition_builder.go @@ -39,8 +39,8 @@ type defaultConditionBuilder struct { old gardencorev1beta1.Condition status gardencorev1beta1.ConditionStatus conditionType gardencorev1beta1.ConditionType - reason string - message string + reason *string + message *string codes []gardencorev1beta1.ErrorCode nowFunc func() metav1.Time } @@ -74,13 +74,13 @@ func (b *defaultConditionBuilder) WithStatus(status gardencorev1beta1.ConditionS // WithReason sets the reason of the condition. func (b *defaultConditionBuilder) WithReason(reason string) ConditionBuilder { - b.reason = reason + b.reason = &reason return b } // WithMessage sets the message of the condition. func (b *defaultConditionBuilder) WithMessage(message string) ConditionBuilder { - b.message = message + b.message = &message return b } @@ -122,21 +122,13 @@ func (b *defaultConditionBuilder) Build() (new gardencorev1beta1.Condition, upda if b.status != "" { new.Status = b.status - } else if b.status == "" && b.old.Status == "" { + } else if b.old.Status == "" { new.Status = gardencorev1beta1.ConditionUnknown } - if b.reason != "" { - new.Reason = b.reason - } else if b.reason == "" && b.old.Reason == "" { - new.Reason = "ConditionInitialized" - } + new.Reason = b.buildReason() - if b.message != "" { - new.Message = b.message - } else if b.message == "" && b.old.Message == "" { - new.Message = "The condition has been initialized but its semantic check has not been performed yet." - } + new.Message = b.buildMessage() new.Codes = b.codes @@ -152,3 +144,33 @@ func (b *defaultConditionBuilder) Build() (new gardencorev1beta1.Condition, upda return new, !apiequality.Semantic.DeepEqual(new, b.old) } + +func (b *defaultConditionBuilder) buildMessage() string { + if message := b.message; message != nil { + if *message != "" { + return *message + } + // We need to set a condition message in this case because when the condition is updated the next time + // without specifying a message we want to retain this message instead of toggling to `b.old.Message == ""`. + return "No message given." + } + if b.old.Message == "" { + return "The condition has been initialized but its semantic check has not been performed yet." + } + return b.old.Message +} + +func (b *defaultConditionBuilder) buildReason() string { + if reason := b.reason; reason != nil { + if *reason != "" { + return *reason + } + // We need to set a condition reason in this case because when the condition is updated the next time + // without specifying a reason we want to retain this reason instead of toggling to `b.old.Reason == ""`. + return "Unspecified" + } + if b.old.Reason == "" { + return "ConditionInitialized" + } + return b.old.Reason +} diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go index 6b00e42be..3c57a1cb9 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go @@ -146,6 +146,62 @@ func ExtractErrorCodes(err error) []gardencorev1beta1.ErrorCode { return codes } +var _ error = (*MultiErrorWithCodes)(nil) + +// MultiErrorWithCodes is a struct that contains multiple errors and ErrorCodes. +type MultiErrorWithCodes struct { + errors []error + errorFormat func(errs []error) string + + errorCodeStr sets.String + codes []gardencorev1beta1.ErrorCode +} + +// NewMultiErrorWithCodes returns a new instance of `MultiErrorWithCodes`. +func NewMultiErrorWithCodes(errorFormat func(errs []error) string) *MultiErrorWithCodes { + return &MultiErrorWithCodes{ + errorFormat: errorFormat, + errorCodeStr: sets.NewString(), + } +} + +// Append appends the given error to the `MultiErrorWithCodes`. +func (m *MultiErrorWithCodes) Append(err error) { + for _, code := range ExtractErrorCodes(err) { + if m.errorCodeStr.Has(string(code)) { + continue + } + m.errorCodeStr.Insert(string(code)) + m.codes = append(m.codes, code) + } + + m.errors = append(m.errors, err) +} + +// Codes returns all underlying `gardencorev1beta1.ErrorCode` codes. +func (m *MultiErrorWithCodes) Codes() []gardencorev1beta1.ErrorCode { + if m.codes == nil { + return nil + } + + cp := make([]gardencorev1beta1.ErrorCode, len(m.codes)) + copy(cp, m.codes) + return cp +} + +// ErrorOrNil returns nil if no underlying errors are given. +func (m *MultiErrorWithCodes) ErrorOrNil() error { + if len(m.errors) == 0 { + return nil + } + return m +} + +// Error implements the error interface. +func (m *MultiErrorWithCodes) Error() string { + return m.errorFormat(m.errors) +} + // FormatLastErrDescription formats the error message string for the last occurred error. func FormatLastErrDescription(err error) string { errString := err.Error() diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/helper.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/helper.go index 69fda1d1d..01baa354b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/helper.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/helper.go @@ -22,6 +22,7 @@ import ( gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/utils" versionutils "github.com/gardener/gardener/pkg/utils/version" "github.com/Masterminds/semver" @@ -124,6 +125,23 @@ func MergeConditions(oldConditions []gardencorev1beta1.Condition, newConditions return out } +// RemoveConditions removes the conditions with the given types from the given conditions slice. +func RemoveConditions(conditions []gardencorev1beta1.Condition, conditionTypes ...gardencorev1beta1.ConditionType) []gardencorev1beta1.Condition { + conditionTypesMap := make(map[gardencorev1beta1.ConditionType]struct{}, len(conditionTypes)) + for _, conditionType := range conditionTypes { + conditionTypesMap[conditionType] = struct{}{} + } + + var newConditions []gardencorev1beta1.Condition + for _, condition := range conditions { + if _, ok := conditionTypesMap[condition.Type]; !ok { + newConditions = append(newConditions, condition) + } + } + + return newConditions +} + // ConditionsNeedUpdate returns true if the must be updated based on . func ConditionsNeedUpdate(existingConditions, newConditions []gardencorev1beta1.Condition) bool { return existingConditions == nil || !apiequality.Semantic.DeepEqual(newConditions, existingConditions) @@ -864,6 +882,21 @@ func SeedSettingVerticalPodAutoscalerEnabled(settings *gardencorev1beta1.SeedSet return settings == nil || settings.VerticalPodAutoscaler == nil || settings.VerticalPodAutoscaler.Enabled } +// SeedSettingOwnerChecksEnabled returns true if the 'ownerChecks' setting is enabled. +func SeedSettingOwnerChecksEnabled(settings *gardencorev1beta1.SeedSettings) bool { + return settings == nil || settings.OwnerChecks == nil || settings.OwnerChecks.Enabled +} + +// SeedSettingDependencyWatchdogEndpointEnabled returns true if the depedency-watchdog-endpoint is enabled. +func SeedSettingDependencyWatchdogEndpointEnabled(settings *gardencorev1beta1.SeedSettings) bool { + return settings == nil || settings.DependencyWatchdog == nil || settings.DependencyWatchdog.Endpoint == nil || settings.DependencyWatchdog.Endpoint.Enabled +} + +// SeedSettingDependencyWatchdogProbeEnabled returns true if the depedency-watchdog-probe is enabled. +func SeedSettingDependencyWatchdogProbeEnabled(settings *gardencorev1beta1.SeedSettings) bool { + return settings == nil || settings.DependencyWatchdog == nil || settings.DependencyWatchdog.Probe == nil || settings.DependencyWatchdog.Probe.Enabled +} + // DetermineMachineImageForName finds the cloud specific machine images in the for the given and // region. In case it does not find the machine image with the , it returns false. Otherwise, true and the // cloud-specific machine image will be returned. @@ -925,22 +958,21 @@ func GetLatestQualifyingShootMachineImage(image gardencorev1beta1.MachineImage, return true, &gardencorev1beta1.ShootMachineImage{Name: image.Name, Version: &latestImageVersion.Version}, nil } +// FindMachineTypeByName tries to find the machine type details with the given name. If it cannot be found it returns nil. +func FindMachineTypeByName(machines []gardencorev1beta1.MachineType, name string) *gardencorev1beta1.MachineType { + for _, m := range machines { + if m.Name == name { + return &m + } + } + return nil +} + // SystemComponentsAllowed checks if the given worker allows system components to be scheduled onto it func SystemComponentsAllowed(worker *gardencorev1beta1.Worker) bool { return worker.SystemComponents == nil || worker.SystemComponents.Allow } -// UpdateMachineImages updates the machine images in place. -func UpdateMachineImages(workers []gardencorev1beta1.Worker, machineImages []*gardencorev1beta1.ShootMachineImage) { - for _, machineImage := range machineImages { - for idx, worker := range workers { - if worker.Machine.Image != nil && machineImage.Name == worker.Machine.Image.Name { - workers[idx].Machine.Image = machineImage - } - } - } -} - // KubernetesVersionExistsInCloudProfile checks if the given Kubernetes version exists in the CloudProfile func KubernetesVersionExistsInCloudProfile(cloudProfile *gardencorev1beta1.CloudProfile, currentVersion string) (bool, gardencorev1beta1.ExpirableVersion, error) { for _, version := range cloudProfile.Spec.Kubernetes.Versions { @@ -1397,3 +1429,47 @@ func CalculateSeedUsage(shootList []gardencorev1beta1.Shoot) map[string]int { return m } + +// CalculateEffectiveKubernetesVersion if a shoot has kubernetes version specified by worker group, return this, +// otherwise the shoot kubernetes version +func CalculateEffectiveKubernetesVersion(controlPlaneVersion *semver.Version, workerKubernetes *gardencorev1beta1.WorkerKubernetes) (*semver.Version, error) { + if workerKubernetes != nil && workerKubernetes.Version != nil { + return semver.NewVersion(*workerKubernetes.Version) + } + return controlPlaneVersion, nil +} + +// GetSecretBindingTypes returns the SecretBinding provider types. +func GetSecretBindingTypes(secretBinding *gardencorev1beta1.SecretBinding) []string { + return strings.Split(secretBinding.Provider.Type, ",") +} + +// SecretBindingHasType checks if the given SecretBinding has the given provider type. +func SecretBindingHasType(secretBinding *gardencorev1beta1.SecretBinding, providerType string) bool { + if secretBinding.Provider == nil { + return false + } + + types := GetSecretBindingTypes(secretBinding) + if len(types) == 0 { + return false + } + + return utils.ValueExists(providerType, types) +} + +// AddTypeToSecretBinding adds the given provider type to the SecretBinding. +func AddTypeToSecretBinding(secretBinding *gardencorev1beta1.SecretBinding, providerType string) { + if secretBinding.Provider == nil { + secretBinding.Provider = &gardencorev1beta1.SecretBindingProvider{ + Type: providerType, + } + return + } + + types := GetSecretBindingTypes(secretBinding) + if !utils.ValueExists(providerType, types) { + types = append(types, providerType) + } + secretBinding.Provider.Type = strings.Join(types, ",") +} diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_secretbinding.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_secretbinding.go index bba134e5b..4dff55624 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_secretbinding.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_secretbinding.go @@ -33,6 +33,18 @@ type SecretBinding struct { // Quotas is a list of references to Quota objects in the same or another namespace. // +optional Quotas []corev1.ObjectReference `json:"quotas,omitempty" protobuf:"bytes,3,rep,name=quotas"` + // Provider defines the provider type of the SecretBinding. + // +optional + Provider *SecretBindingProvider `json:"provider,omitempty" protobuf:"bytes,4,opt,name=provider"` +} + +// SecretBindingProvider defines the provider type of the SecretBinding. +type SecretBindingProvider struct { + // Type is the type of the provider. + // + // For backwards compatibility, the field can contain multiple providers separated by a comma. + // However the usage of single SecretBinding (hence Secret) for different cloud providers is strongly discouraged. + Type string `json:"type" protobuf:"bytes,1,opt,name=type"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go index 1f5653a39..abb5cd346 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go @@ -72,8 +72,8 @@ type SeedSpec struct { Networks SeedNetworks `json:"networks" protobuf:"bytes,3,opt,name=networks"` // Provider defines the provider type and region for this Seed cluster. Provider SeedProvider `json:"provider" protobuf:"bytes,4,opt,name=provider"` - // SecretRef is a reference to a Secret object containing the Kubeconfig and the cloud provider credentials for - // the account the Seed cluster has been deployed to. + // SecretRef is a reference to a Secret object containing the Kubeconfig of the Kubernetes + // cluster to be registered as Seed. // +optional SecretRef *corev1.SecretReference `json:"secretRef,omitempty" protobuf:"bytes,5,opt,name=secretRef"` // Taints describes taints on the seed. @@ -238,6 +238,12 @@ type SeedSettings struct { // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. // +optional VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler `json:"verticalPodAutoscaler,omitempty" protobuf:"bytes,5,opt,name=verticalPodAutoscaler"` + // SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. + // +optional + OwnerChecks *SeedSettingOwnerChecks `json:"ownerChecks,omitempty" protobuf:"bytes,6,opt,name=ownerChecks"` + // DependencyWatchdog controls certain settings for the dependency-watchdog components deployed in the seed. + // +optional + DependencyWatchdog *SeedSettingDependencyWatchdog `json:"dependencyWatchdog,omitempty" protobuf:"bytes,7,opt,name=dependencyWatchdog"` } // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. @@ -278,6 +284,39 @@ type SeedSettingVerticalPodAutoscaler struct { Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` } +// SeedSettingOwnerChecks controls certain owner checks settings for shoots scheduled on this seed. +type SeedSettingOwnerChecks struct { + // Enabled controls whether owner checks are enabled for shoots scheduled on this seed. It + // is enabled by default because it is a prerequisite for control plane migration. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + +// SeedSettingDependencyWatchdog controls the dependency-watchdog settings for the seed. +type SeedSettingDependencyWatchdog struct { + // Endpoint controls the endpoint settings for the dependency-watchdog for the seed. + // +optional + Endpoint *SeedSettingDependencyWatchdogEndpoint `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` + // Probe controls the probe settings for the dependency-watchdog for the seed. + // +optional + Probe *SeedSettingDependencyWatchdogProbe `json:"probe,omitempty" protobuf:"bytes,2,opt,name=probe"` +} + +// SeedSettingDependencyWatchdogEndpoint controls the endpoint settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogEndpoint struct { + // Enabled controls whether the endpoint controller of the dependency-watchdog should be enabled. This controller + // helps to alleviate the delay where control plane components remain unavailable by finding the respective pods in + // CrashLoopBackoff status and restarting them once their dependants become ready and available again. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + +// SeedSettingDependencyWatchdogProbe controls the probe settings for the dependency-watchdog for the seed. +type SeedSettingDependencyWatchdogProbe struct { + // Enabled controls whether the probe controller of the dependency-watchdog should be enabled. This controller + // scales down the kube-controller-manager of shoot clusters in case their respective kube-apiserver is not + // reachable via its external ingress in order to avoid melt-down situations. + Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` +} + // SeedTaint describes a taint on a seed. type SeedTaint struct { // Key is the taint key to be applied to a seed. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go index 4295de2e7..48e531688 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go @@ -848,6 +848,10 @@ type KubeletConfig struct { // +optional // Default: 40 ImageGCLowThresholdPercent *int32 `json:"imageGCLowThresholdPercent,omitempty" protobuf:"bytes,17,opt,name=imageGCLowThresholdPercent"` + // SerializeImagePulls describes whether the images are pulled one at a time. + // +optional + // Default: true + SerializeImagePulls *bool `json:"serializeImagePulls,omitempty" protobuf:"varint,18,opt,name=serializeImagePulls"` } // KubeletConfigEviction contains kubelet eviction thresholds supporting either a resource.Quantity or a percentage based value. @@ -1128,6 +1132,12 @@ type WorkerKubernetes struct { // If set, all `spec.kubernetes.kubelet` settings will be overwritten for this worker pool (no merge of settings). // +optional Kubelet *KubeletConfig `json:"kubelet,omitempty" protobuf:"bytes,1,opt,name=kubelet"` + // Version is the semantic Kubernetes version to use for the Kubelet in this Worker Group. + // If not specified the kubelet version is derived from the global shoot cluster kubernetes version. + // version must be equal or lower than the version of the shoot kubernetes version. + // Only one minor version difference to other worker groups and global kubernetes version is allowed. + // +optional + Version *string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"` } // Machine contains information about the machine type and image. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go index 5c3776847..deee67e10 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go @@ -1022,6 +1022,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SecretBindingProvider)(nil), (*core.SecretBindingProvider)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SecretBindingProvider_To_core_SecretBindingProvider(a.(*SecretBindingProvider), b.(*core.SecretBindingProvider), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretBindingProvider)(nil), (*SecretBindingProvider)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretBindingProvider_To_v1beta1_SecretBindingProvider(a.(*core.SecretBindingProvider), b.(*SecretBindingProvider), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*Seed)(nil), (*core.Seed)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_Seed_To_core_Seed(a.(*Seed), b.(*core.Seed), scope) }); err != nil { @@ -1102,6 +1112,36 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdog)(nil), (*core.SeedSettingDependencyWatchdog)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(a.(*SeedSettingDependencyWatchdog), b.(*core.SeedSettingDependencyWatchdog), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdog)(nil), (*SeedSettingDependencyWatchdog)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdog_To_v1beta1_SeedSettingDependencyWatchdog(a.(*core.SeedSettingDependencyWatchdog), b.(*SeedSettingDependencyWatchdog), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdogEndpoint)(nil), (*core.SeedSettingDependencyWatchdogEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(a.(*SeedSettingDependencyWatchdogEndpoint), b.(*core.SeedSettingDependencyWatchdogEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdogEndpoint)(nil), (*SeedSettingDependencyWatchdogEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1beta1_SeedSettingDependencyWatchdogEndpoint(a.(*core.SeedSettingDependencyWatchdogEndpoint), b.(*SeedSettingDependencyWatchdogEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*SeedSettingDependencyWatchdogProbe)(nil), (*core.SeedSettingDependencyWatchdogProbe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(a.(*SeedSettingDependencyWatchdogProbe), b.(*core.SeedSettingDependencyWatchdogProbe), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingDependencyWatchdogProbe)(nil), (*SeedSettingDependencyWatchdogProbe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingDependencyWatchdogProbe_To_v1beta1_SeedSettingDependencyWatchdogProbe(a.(*core.SeedSettingDependencyWatchdogProbe), b.(*SeedSettingDependencyWatchdogProbe), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SeedSettingExcessCapacityReservation)(nil), (*core.SeedSettingExcessCapacityReservation)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_SeedSettingExcessCapacityReservation_To_core_SeedSettingExcessCapacityReservation(a.(*SeedSettingExcessCapacityReservation), b.(*core.SeedSettingExcessCapacityReservation), scope) }); err != nil { @@ -1122,6 +1162,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*SeedSettingOwnerChecks)(nil), (*core.SeedSettingOwnerChecks)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(a.(*SeedSettingOwnerChecks), b.(*core.SeedSettingOwnerChecks), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeedSettingOwnerChecks)(nil), (*SeedSettingOwnerChecks)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeedSettingOwnerChecks_To_v1beta1_SeedSettingOwnerChecks(a.(*core.SeedSettingOwnerChecks), b.(*SeedSettingOwnerChecks), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SeedSettingScheduling)(nil), (*core.SeedSettingScheduling)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_SeedSettingScheduling_To_core_SeedSettingScheduling(a.(*SeedSettingScheduling), b.(*core.SeedSettingScheduling), scope) }); err != nil { @@ -2853,6 +2903,7 @@ func autoConvert_v1beta1_KubeletConfig_To_core_KubeletConfig(in *KubeletConfig, out.SystemReserved = (*core.KubeletConfigReserved)(unsafe.Pointer(in.SystemReserved)) out.ImageGCHighThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCHighThresholdPercent)) out.ImageGCLowThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCLowThresholdPercent)) + out.SerializeImagePulls = (*bool)(unsafe.Pointer(in.SerializeImagePulls)) return nil } @@ -2881,6 +2932,7 @@ func autoConvert_core_KubeletConfig_To_v1beta1_KubeletConfig(in *core.KubeletCon out.SystemReserved = (*KubeletConfigReserved)(unsafe.Pointer(in.SystemReserved)) out.ImageGCHighThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCHighThresholdPercent)) out.ImageGCLowThresholdPercent = (*int32)(unsafe.Pointer(in.ImageGCLowThresholdPercent)) + out.SerializeImagePulls = (*bool)(unsafe.Pointer(in.SerializeImagePulls)) return nil } @@ -4022,6 +4074,7 @@ func autoConvert_v1beta1_SecretBinding_To_core_SecretBinding(in *SecretBinding, out.ObjectMeta = in.ObjectMeta out.SecretRef = in.SecretRef out.Quotas = *(*[]v1.ObjectReference)(unsafe.Pointer(&in.Quotas)) + out.Provider = (*core.SecretBindingProvider)(unsafe.Pointer(in.Provider)) return nil } @@ -4034,6 +4087,7 @@ func autoConvert_core_SecretBinding_To_v1beta1_SecretBinding(in *core.SecretBind out.ObjectMeta = in.ObjectMeta out.SecretRef = in.SecretRef out.Quotas = *(*[]v1.ObjectReference)(unsafe.Pointer(&in.Quotas)) + out.Provider = (*SecretBindingProvider)(unsafe.Pointer(in.Provider)) return nil } @@ -4064,6 +4118,26 @@ func Convert_core_SecretBindingList_To_v1beta1_SecretBindingList(in *core.Secret return autoConvert_core_SecretBindingList_To_v1beta1_SecretBindingList(in, out, s) } +func autoConvert_v1beta1_SecretBindingProvider_To_core_SecretBindingProvider(in *SecretBindingProvider, out *core.SecretBindingProvider, s conversion.Scope) error { + out.Type = in.Type + return nil +} + +// Convert_v1beta1_SecretBindingProvider_To_core_SecretBindingProvider is an autogenerated conversion function. +func Convert_v1beta1_SecretBindingProvider_To_core_SecretBindingProvider(in *SecretBindingProvider, out *core.SecretBindingProvider, s conversion.Scope) error { + return autoConvert_v1beta1_SecretBindingProvider_To_core_SecretBindingProvider(in, out, s) +} + +func autoConvert_core_SecretBindingProvider_To_v1beta1_SecretBindingProvider(in *core.SecretBindingProvider, out *SecretBindingProvider, s conversion.Scope) error { + out.Type = in.Type + return nil +} + +// Convert_core_SecretBindingProvider_To_v1beta1_SecretBindingProvider is an autogenerated conversion function. +func Convert_core_SecretBindingProvider_To_v1beta1_SecretBindingProvider(in *core.SecretBindingProvider, out *SecretBindingProvider, s conversion.Scope) error { + return autoConvert_core_SecretBindingProvider_To_v1beta1_SecretBindingProvider(in, out, s) +} + func autoConvert_v1beta1_Seed_To_core_Seed(in *Seed, out *core.Seed, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1beta1_SeedSpec_To_core_SeedSpec(&in.Spec, &out.Spec, s); err != nil { @@ -4286,6 +4360,68 @@ func Convert_core_SeedSelector_To_v1beta1_SeedSelector(in *core.SeedSelector, ou return autoConvert_core_SeedSelector_To_v1beta1_SeedSelector(in, out, s) } +func autoConvert_v1beta1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in *SeedSettingDependencyWatchdog, out *core.SeedSettingDependencyWatchdog, s conversion.Scope) error { + out.Endpoint = (*core.SeedSettingDependencyWatchdogEndpoint)(unsafe.Pointer(in.Endpoint)) + out.Probe = (*core.SeedSettingDependencyWatchdogProbe)(unsafe.Pointer(in.Probe)) + return nil +} + +// Convert_v1beta1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog is an autogenerated conversion function. +func Convert_v1beta1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in *SeedSettingDependencyWatchdog, out *core.SeedSettingDependencyWatchdog, s conversion.Scope) error { + return autoConvert_v1beta1_SeedSettingDependencyWatchdog_To_core_SeedSettingDependencyWatchdog(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdog_To_v1beta1_SeedSettingDependencyWatchdog(in *core.SeedSettingDependencyWatchdog, out *SeedSettingDependencyWatchdog, s conversion.Scope) error { + out.Endpoint = (*SeedSettingDependencyWatchdogEndpoint)(unsafe.Pointer(in.Endpoint)) + out.Probe = (*SeedSettingDependencyWatchdogProbe)(unsafe.Pointer(in.Probe)) + return nil +} + +// Convert_core_SeedSettingDependencyWatchdog_To_v1beta1_SeedSettingDependencyWatchdog is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdog_To_v1beta1_SeedSettingDependencyWatchdog(in *core.SeedSettingDependencyWatchdog, out *SeedSettingDependencyWatchdog, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdog_To_v1beta1_SeedSettingDependencyWatchdog(in, out, s) +} + +func autoConvert_v1beta1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in *SeedSettingDependencyWatchdogEndpoint, out *core.SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1beta1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint is an autogenerated conversion function. +func Convert_v1beta1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in *SeedSettingDependencyWatchdogEndpoint, out *core.SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + return autoConvert_v1beta1_SeedSettingDependencyWatchdogEndpoint_To_core_SeedSettingDependencyWatchdogEndpoint(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdogEndpoint_To_v1beta1_SeedSettingDependencyWatchdogEndpoint(in *core.SeedSettingDependencyWatchdogEndpoint, out *SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1beta1_SeedSettingDependencyWatchdogEndpoint is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdogEndpoint_To_v1beta1_SeedSettingDependencyWatchdogEndpoint(in *core.SeedSettingDependencyWatchdogEndpoint, out *SeedSettingDependencyWatchdogEndpoint, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdogEndpoint_To_v1beta1_SeedSettingDependencyWatchdogEndpoint(in, out, s) +} + +func autoConvert_v1beta1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in *SeedSettingDependencyWatchdogProbe, out *core.SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1beta1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe is an autogenerated conversion function. +func Convert_v1beta1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in *SeedSettingDependencyWatchdogProbe, out *core.SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + return autoConvert_v1beta1_SeedSettingDependencyWatchdogProbe_To_core_SeedSettingDependencyWatchdogProbe(in, out, s) +} + +func autoConvert_core_SeedSettingDependencyWatchdogProbe_To_v1beta1_SeedSettingDependencyWatchdogProbe(in *core.SeedSettingDependencyWatchdogProbe, out *SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingDependencyWatchdogProbe_To_v1beta1_SeedSettingDependencyWatchdogProbe is an autogenerated conversion function. +func Convert_core_SeedSettingDependencyWatchdogProbe_To_v1beta1_SeedSettingDependencyWatchdogProbe(in *core.SeedSettingDependencyWatchdogProbe, out *SeedSettingDependencyWatchdogProbe, s conversion.Scope) error { + return autoConvert_core_SeedSettingDependencyWatchdogProbe_To_v1beta1_SeedSettingDependencyWatchdogProbe(in, out, s) +} + func autoConvert_v1beta1_SeedSettingExcessCapacityReservation_To_core_SeedSettingExcessCapacityReservation(in *SeedSettingExcessCapacityReservation, out *core.SeedSettingExcessCapacityReservation, s conversion.Scope) error { out.Enabled = in.Enabled return nil @@ -4326,6 +4462,26 @@ func Convert_core_SeedSettingLoadBalancerServices_To_v1beta1_SeedSettingLoadBala return autoConvert_core_SeedSettingLoadBalancerServices_To_v1beta1_SeedSettingLoadBalancerServices(in, out, s) } +func autoConvert_v1beta1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in *SeedSettingOwnerChecks, out *core.SeedSettingOwnerChecks, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_v1beta1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks is an autogenerated conversion function. +func Convert_v1beta1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in *SeedSettingOwnerChecks, out *core.SeedSettingOwnerChecks, s conversion.Scope) error { + return autoConvert_v1beta1_SeedSettingOwnerChecks_To_core_SeedSettingOwnerChecks(in, out, s) +} + +func autoConvert_core_SeedSettingOwnerChecks_To_v1beta1_SeedSettingOwnerChecks(in *core.SeedSettingOwnerChecks, out *SeedSettingOwnerChecks, s conversion.Scope) error { + out.Enabled = in.Enabled + return nil +} + +// Convert_core_SeedSettingOwnerChecks_To_v1beta1_SeedSettingOwnerChecks is an autogenerated conversion function. +func Convert_core_SeedSettingOwnerChecks_To_v1beta1_SeedSettingOwnerChecks(in *core.SeedSettingOwnerChecks, out *SeedSettingOwnerChecks, s conversion.Scope) error { + return autoConvert_core_SeedSettingOwnerChecks_To_v1beta1_SeedSettingOwnerChecks(in, out, s) +} + func autoConvert_v1beta1_SeedSettingScheduling_To_core_SeedSettingScheduling(in *SeedSettingScheduling, out *core.SeedSettingScheduling, s conversion.Scope) error { out.Visible = in.Visible return nil @@ -4392,6 +4548,8 @@ func autoConvert_v1beta1_SeedSettings_To_core_SeedSettings(in *SeedSettings, out out.ShootDNS = (*core.SeedSettingShootDNS)(unsafe.Pointer(in.ShootDNS)) out.LoadBalancerServices = (*core.SeedSettingLoadBalancerServices)(unsafe.Pointer(in.LoadBalancerServices)) out.VerticalPodAutoscaler = (*core.SeedSettingVerticalPodAutoscaler)(unsafe.Pointer(in.VerticalPodAutoscaler)) + out.OwnerChecks = (*core.SeedSettingOwnerChecks)(unsafe.Pointer(in.OwnerChecks)) + out.DependencyWatchdog = (*core.SeedSettingDependencyWatchdog)(unsafe.Pointer(in.DependencyWatchdog)) return nil } @@ -4406,6 +4564,8 @@ func autoConvert_core_SeedSettings_To_v1beta1_SeedSettings(in *core.SeedSettings out.ShootDNS = (*SeedSettingShootDNS)(unsafe.Pointer(in.ShootDNS)) out.LoadBalancerServices = (*SeedSettingLoadBalancerServices)(unsafe.Pointer(in.LoadBalancerServices)) out.VerticalPodAutoscaler = (*SeedSettingVerticalPodAutoscaler)(unsafe.Pointer(in.VerticalPodAutoscaler)) + out.OwnerChecks = (*SeedSettingOwnerChecks)(unsafe.Pointer(in.OwnerChecks)) + out.DependencyWatchdog = (*SeedSettingDependencyWatchdog)(unsafe.Pointer(in.DependencyWatchdog)) return nil } @@ -5092,6 +5252,7 @@ func Convert_core_Worker_To_v1beta1_Worker(in *core.Worker, out *Worker, s conve func autoConvert_v1beta1_WorkerKubernetes_To_core_WorkerKubernetes(in *WorkerKubernetes, out *core.WorkerKubernetes, s conversion.Scope) error { out.Kubelet = (*core.KubeletConfig)(unsafe.Pointer(in.Kubelet)) + out.Version = (*string)(unsafe.Pointer(in.Version)) return nil } @@ -5102,6 +5263,7 @@ func Convert_v1beta1_WorkerKubernetes_To_core_WorkerKubernetes(in *WorkerKuberne func autoConvert_core_WorkerKubernetes_To_v1beta1_WorkerKubernetes(in *core.WorkerKubernetes, out *WorkerKubernetes, s conversion.Scope) error { out.Kubelet = (*KubeletConfig)(unsafe.Pointer(in.Kubelet)) + out.Version = (*string)(unsafe.Pointer(in.Version)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go index 45afacf23..56b414f5c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go @@ -1669,6 +1669,11 @@ func (in *KubeletConfig) DeepCopyInto(out *KubeletConfig) { *out = new(int32) **out = **in } + if in.SerializeImagePulls != nil { + in, out := &in.SerializeImagePulls, &out.SerializeImagePulls + *out = new(bool) + **out = **in + } return } @@ -2953,6 +2958,11 @@ func (in *SecretBinding) DeepCopyInto(out *SecretBinding) { *out = make([]v1.ObjectReference, len(*in)) copy(*out, *in) } + if in.Provider != nil { + in, out := &in.Provider, &out.Provider + *out = new(SecretBindingProvider) + **out = **in + } return } @@ -3007,6 +3017,22 @@ func (in *SecretBindingList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretBindingProvider) DeepCopyInto(out *SecretBindingProvider) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretBindingProvider. +func (in *SecretBindingProvider) DeepCopy() *SecretBindingProvider { + if in == nil { + return nil + } + out := new(SecretBindingProvider) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Seed) DeepCopyInto(out *Seed) { *out = *in @@ -3222,6 +3248,64 @@ func (in *SeedSelector) DeepCopy() *SeedSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdog) DeepCopyInto(out *SeedSettingDependencyWatchdog) { + *out = *in + if in.Endpoint != nil { + in, out := &in.Endpoint, &out.Endpoint + *out = new(SeedSettingDependencyWatchdogEndpoint) + **out = **in + } + if in.Probe != nil { + in, out := &in.Probe, &out.Probe + *out = new(SeedSettingDependencyWatchdogProbe) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdog. +func (in *SeedSettingDependencyWatchdog) DeepCopy() *SeedSettingDependencyWatchdog { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdog) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopyInto(out *SeedSettingDependencyWatchdogEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogEndpoint. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopy() *SeedSettingDependencyWatchdogEndpoint { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopyInto(out *SeedSettingDependencyWatchdogProbe) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogProbe. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopy() *SeedSettingDependencyWatchdogProbe { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogProbe) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingExcessCapacityReservation) DeepCopyInto(out *SeedSettingExcessCapacityReservation) { *out = *in @@ -3261,6 +3345,22 @@ func (in *SeedSettingLoadBalancerServices) DeepCopy() *SeedSettingLoadBalancerSe return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingOwnerChecks) DeepCopyInto(out *SeedSettingOwnerChecks) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingOwnerChecks. +func (in *SeedSettingOwnerChecks) DeepCopy() *SeedSettingOwnerChecks { + if in == nil { + return nil + } + out := new(SeedSettingOwnerChecks) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingScheduling) DeepCopyInto(out *SeedSettingScheduling) { *out = *in @@ -3337,6 +3437,16 @@ func (in *SeedSettings) DeepCopyInto(out *SeedSettings) { *out = new(SeedSettingVerticalPodAutoscaler) **out = **in } + if in.OwnerChecks != nil { + in, out := &in.OwnerChecks, &out.OwnerChecks + *out = new(SeedSettingOwnerChecks) + **out = **in + } + if in.DependencyWatchdog != nil { + in, out := &in.DependencyWatchdog, &out.DependencyWatchdog + *out = new(SeedSettingDependencyWatchdog) + (*in).DeepCopyInto(*out) + } return } @@ -4131,6 +4241,11 @@ func (in *WorkerKubernetes) DeepCopyInto(out *WorkerKubernetes) { *out = new(KubeletConfig) (*in).DeepCopyInto(*out) } + if in.Version != nil { + in, out := &in.Version, &out.Version + *out = new(string) + **out = **in + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go index 3702efe8f..d39428bb7 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go @@ -103,6 +103,11 @@ func SetObjectDefaults_SecretBindingList(in *SecretBindingList) { func SetObjectDefaults_Seed(in *Seed) { SetDefaults_Seed(in) + if in.Spec.Settings != nil { + if in.Spec.Settings.DependencyWatchdog != nil { + SetDefaults_SeedSettingDependencyWatchdog(in.Spec.Settings.DependencyWatchdog) + } + } } func SetObjectDefaults_SeedList(in *SeedList) { diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/backupentry.go b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/backupentry.go index f7d4369e4..1295829ae 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/backupentry.go @@ -56,8 +56,6 @@ func ValidateBackupEntrySpec(spec *core.BackupEntrySpec, fldPath *field.Path) fi func ValidateBackupEntrySpecUpdate(newSpec, oldSpec *core.BackupEntrySpec, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateImmutableField(newSpec.BucketName, oldSpec.BucketName, fldPath.Child("bucketName"))...) - return allErrs } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/secretbinding.go b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/secretbinding.go index ad4bb968f..2a864e08c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/secretbinding.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/secretbinding.go @@ -16,10 +16,12 @@ package validation import ( "github.com/gardener/gardener/pkg/apis/core" + "github.com/gardener/gardener/pkg/features" corev1 "k8s.io/api/core/v1" apivalidation "k8s.io/apimachinery/pkg/api/validation" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" ) // ValidateSecretBinding validates a SecretBinding object. @@ -31,6 +33,7 @@ func ValidateSecretBinding(binding *core.SecretBinding) field.ErrorList { for i, quota := range binding.Quotas { allErrs = append(allErrs, validateObjectReferenceOptionalNamespace(quota, field.NewPath("quotas").Index(i))...) } + allErrs = append(allErrs, validateSecretBindingProvider(binding.Provider, field.NewPath("provider"))...) return allErrs } @@ -42,6 +45,9 @@ func ValidateSecretBindingUpdate(newBinding, oldBinding *core.SecretBinding) fie allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&newBinding.ObjectMeta, &oldBinding.ObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(newBinding.SecretRef, oldBinding.SecretRef, field.NewPath("secretRef"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(newBinding.Quotas, oldBinding.Quotas, field.NewPath("quotas"))...) + if utilfeature.DefaultFeatureGate.Enabled(features.SecretBindingProviderValidation) && oldBinding.Provider != nil { + allErrs = append(allErrs, apivalidation.ValidateImmutableField(newBinding.Provider, oldBinding.Provider, field.NewPath("provider"))...) + } allErrs = append(allErrs, ValidateSecretBinding(newBinding)...) return allErrs @@ -76,3 +82,21 @@ func validateSecretReferenceOptionalNamespace(ref corev1.SecretReference, fldPat return allErrs } + +func validateSecretBindingProvider(provider *core.SecretBindingProvider, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if provider == nil { + if utilfeature.DefaultFeatureGate.Enabled(features.SecretBindingProviderValidation) { + allErrs = append(allErrs, field.Required(fldPath, "must specify a provider")) + } + + return allErrs + } + + if len(provider.Type) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("type"), "must specify a provider type")) + } + + return allErrs +} diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go index dae3d64a1..5e880dd2e 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go @@ -247,6 +247,29 @@ func ValidateShootSpecUpdate(newSpec, oldSpec *core.ShootSpec, newObjectMeta met allErrs = append(allErrs, validateKubeControllerManagerUpdate(newSpec.Kubernetes.KubeControllerManager, oldSpec.Kubernetes.KubeControllerManager, fldPath.Child("kubernetes", "kubeControllerManager"))...) allErrs = append(allErrs, ValidateProviderUpdate(&newSpec.Provider, &oldSpec.Provider, fldPath.Child("provider"))...) + for i, newWorker := range newSpec.Provider.Workers { + oldWorker := newWorker + for _, ow := range oldSpec.Provider.Workers { + if ow.Name == newWorker.Name { + oldWorker = ow + break + } + } + idxPath := fldPath.Child("provider", "workers").Index(i) + + oldKubernetesVersion := oldSpec.Kubernetes.Version + newKubernetesVersion := newSpec.Kubernetes.Version + if oldWorker.Kubernetes != nil && oldWorker.Kubernetes.Version != nil { + oldKubernetesVersion = *oldWorker.Kubernetes.Version + } + if newWorker.Kubernetes != nil && newWorker.Kubernetes.Version != nil { + newKubernetesVersion = *newWorker.Kubernetes.Version + } + + // worker kubernetes versions must not be downgraded and must not skip a minor + allErrs = append(allErrs, validateKubernetesVersionUpdate(newKubernetesVersion, oldKubernetesVersion, idxPath.Child("kubernetes", "version"))...) + } + allErrs = append(allErrs, apivalidation.ValidateImmutableField(newSpec.Networking.Type, oldSpec.Networking.Type, fldPath.Child("networking", "type"))...) if oldSpec.Networking.Pods != nil { allErrs = append(allErrs, apivalidation.ValidateImmutableField(newSpec.Networking.Pods, oldSpec.Networking.Pods, fldPath.Child("networking", "pods"))...) @@ -470,6 +493,7 @@ func validateDNSUpdate(new, old *core.DNS, seedGotAssigned bool, fldPath *field. return allErrs } +// validateKubernetesVersionUpdate ensures that new version is newer than old version and does not skip one minor func validateKubernetesVersionUpdate(new, old string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -505,6 +529,37 @@ func validateKubernetesVersionUpdate(new, old string, fldPath *field.Path) field return allErrs } +// validateWorkerGroupAndControlPlaneKubernetesVersion ensures that new version is newer than old version and does not skip two minor +func validateWorkerGroupAndControlPlaneKubernetesVersion(controlPlaneVersion, workerGroupVersion string, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + // worker group kubernetes version must not be higher than controlplane version + uplift, err := versionutils.CompareVersions(workerGroupVersion, ">", controlPlaneVersion) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, controlPlaneVersion, err.Error())) + } + if uplift { + allErrs = append(allErrs, field.Forbidden(fldPath, "worker group kubernetes version must not be higher than control plane version")) + } + + // Forbid Kubernetes version upgrade which skips a minor version + workerVersion, err := semver.NewVersion(workerGroupVersion) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, workerGroupVersion, err.Error())) + } + threeMinorSkewVersion := workerVersion.IncMinor().IncMinor().IncMinor() + + versionSkewViolation, err := versionutils.CompareVersions(controlPlaneVersion, ">=", threeMinorSkewVersion.String()) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, controlPlaneVersion, err.Error())) + } + if versionSkewViolation { + allErrs = append(allErrs, field.Forbidden(fldPath, "worker group kubernetes version must be at most two minor versions behind control plane version")) + } + + return allErrs +} + func validateDNS(dns *core.DNS, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -1044,8 +1099,20 @@ func ValidateWorker(worker core.Worker, kubernetesVersion string, fldPath *field if len(worker.Taints) > 0 { allErrs = append(allErrs, validateTaints(worker.Taints, fldPath.Child("taints"))...) } - if worker.Kubernetes != nil && worker.Kubernetes.Kubelet != nil { - allErrs = append(allErrs, ValidateKubeletConfig(*worker.Kubernetes.Kubelet, kubernetesVersion, isDockerConfigured([]core.Worker{worker}), fldPath.Child("kubernetes", "kubelet"))...) + if worker.Kubernetes != nil { + if worker.Kubernetes.Version != nil { + if !utilfeature.DefaultFeatureGate.Enabled(features.WorkerPoolKubernetesVersion) { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("kubernetes", "version"), "worker pool kubernetes version may only be set if WorkerPoolKubernetesVersion feature gate is enabled")) + } else { + workerGroupKubernetesVersion := *worker.Kubernetes.Version + allErrs = append(allErrs, validateWorkerGroupAndControlPlaneKubernetesVersion(kubernetesVersion, workerGroupKubernetesVersion, fldPath.Child("kubernetes", "version"))...) + kubernetesVersion = workerGroupKubernetesVersion + } + } + + if worker.Kubernetes.Kubelet != nil { + allErrs = append(allErrs, ValidateKubeletConfig(*worker.Kubernetes.Kubelet, kubernetesVersion, isDockerConfigured([]core.Worker{worker}), fldPath.Child("kubernetes", "kubelet"))...) + } } if worker.CABundle != nil { diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go index 9d7194be9..31aa562d5 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go @@ -1840,6 +1840,11 @@ func (in *KubeletConfig) DeepCopyInto(out *KubeletConfig) { *out = new(int32) **out = **in } + if in.SerializeImagePulls != nil { + in, out := &in.SerializeImagePulls, &out.SerializeImagePulls + *out = new(bool) + **out = **in + } return } @@ -3142,6 +3147,11 @@ func (in *SecretBinding) DeepCopyInto(out *SecretBinding) { *out = make([]v1.ObjectReference, len(*in)) copy(*out, *in) } + if in.Provider != nil { + in, out := &in.Provider, &out.Provider + *out = new(SecretBindingProvider) + **out = **in + } return } @@ -3196,6 +3206,22 @@ func (in *SecretBindingList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretBindingProvider) DeepCopyInto(out *SecretBindingProvider) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretBindingProvider. +func (in *SecretBindingProvider) DeepCopy() *SecretBindingProvider { + if in == nil { + return nil + } + out := new(SecretBindingProvider) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Seed) DeepCopyInto(out *Seed) { *out = *in @@ -3411,6 +3437,64 @@ func (in *SeedSelector) DeepCopy() *SeedSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdog) DeepCopyInto(out *SeedSettingDependencyWatchdog) { + *out = *in + if in.Endpoint != nil { + in, out := &in.Endpoint, &out.Endpoint + *out = new(SeedSettingDependencyWatchdogEndpoint) + **out = **in + } + if in.Probe != nil { + in, out := &in.Probe, &out.Probe + *out = new(SeedSettingDependencyWatchdogProbe) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdog. +func (in *SeedSettingDependencyWatchdog) DeepCopy() *SeedSettingDependencyWatchdog { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdog) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopyInto(out *SeedSettingDependencyWatchdogEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogEndpoint. +func (in *SeedSettingDependencyWatchdogEndpoint) DeepCopy() *SeedSettingDependencyWatchdogEndpoint { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopyInto(out *SeedSettingDependencyWatchdogProbe) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingDependencyWatchdogProbe. +func (in *SeedSettingDependencyWatchdogProbe) DeepCopy() *SeedSettingDependencyWatchdogProbe { + if in == nil { + return nil + } + out := new(SeedSettingDependencyWatchdogProbe) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingExcessCapacityReservation) DeepCopyInto(out *SeedSettingExcessCapacityReservation) { *out = *in @@ -3450,6 +3534,22 @@ func (in *SeedSettingLoadBalancerServices) DeepCopy() *SeedSettingLoadBalancerSe return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeedSettingOwnerChecks) DeepCopyInto(out *SeedSettingOwnerChecks) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeedSettingOwnerChecks. +func (in *SeedSettingOwnerChecks) DeepCopy() *SeedSettingOwnerChecks { + if in == nil { + return nil + } + out := new(SeedSettingOwnerChecks) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SeedSettingScheduling) DeepCopyInto(out *SeedSettingScheduling) { *out = *in @@ -3526,6 +3626,16 @@ func (in *SeedSettings) DeepCopyInto(out *SeedSettings) { *out = new(SeedSettingVerticalPodAutoscaler) **out = **in } + if in.OwnerChecks != nil { + in, out := &in.OwnerChecks, &out.OwnerChecks + *out = new(SeedSettingOwnerChecks) + **out = **in + } + if in.DependencyWatchdog != nil { + in, out := &in.DependencyWatchdog, &out.DependencyWatchdog + *out = new(SeedSettingDependencyWatchdog) + (*in).DeepCopyInto(*out) + } return } @@ -4478,6 +4588,11 @@ func (in *WorkerKubernetes) DeepCopyInto(out *WorkerKubernetes) { *out = new(KubeletConfig) (*in).DeepCopyInto(*out) } + if in.Version != nil { + in, out := &in.Version, &out.Version + *out = new(string) + **out = **in + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_worker.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_worker.go index 95a299ecd..f1a0c5283 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_worker.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_worker.go @@ -144,6 +144,18 @@ type WorkerPool struct { // MachineControllerManagerSettings contains configurations for different worker-pools. Eg. MachineDrainTimeout, MachineHealthTimeout. // +optional MachineControllerManagerSettings *gardencorev1beta1.MachineControllerManagerSettings `json:"machineControllerManager,omitempty"` + // KubernetesVersion is the kubernetes version in this worker pool + // +optional + KubernetesVersion *string `json:"kubernetesVersion,omitempty"` + // NodeTemplate contains resource information of the machine which is used by Cluster Autoscaler to generate nodeTemplate during scaling a nodeGroup from zero + // +optional + NodeTemplate *NodeTemplate `json:"nodeTemplate,omitempty"` +} + +// NodeTemplate contains information about the expected node properties. +type NodeTemplate struct { + // Capacity represents the expected Node capacity. + Capacity corev1.ResourceList `json:"capacity"` } // MachineImage contains logical information about the name and the version of the machie image that diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go index a5877962d..df523f78b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go @@ -1330,6 +1330,29 @@ func (in *NetworkStatus) DeepCopy() *NetworkStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeTemplate) DeepCopyInto(out *NodeTemplate) { + *out = *in + if in.Capacity != nil { + in, out := &in.Capacity, &out.Capacity + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeTemplate. +func (in *NodeTemplate) DeepCopy() *NodeTemplate { + if in == nil { + return nil + } + out := new(NodeTemplate) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *OperatingSystemConfig) DeepCopyInto(out *OperatingSystemConfig) { *out = *in @@ -1656,6 +1679,16 @@ func (in *WorkerPool) DeepCopyInto(out *WorkerPool) { *out = new(v1beta1.MachineControllerManagerSettings) (*in).DeepCopyInto(*out) } + if in.KubernetesVersion != nil { + in, out := &in.KubernetesVersion, &out.KubernetesVersion + *out = new(string) + **out = **in + } + if in.NodeTemplate != nil { + in, out := &in.NodeTemplate, &out.NodeTemplate + *out = new(NodeTemplate) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/backupentry.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/backupentry.go index be5e14897..4bcb6579b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/backupentry.go @@ -76,7 +76,6 @@ func ValidateBackupEntrySpecUpdate(new, old *extensionsv1alpha1.BackupEntrySpec, allErrs = append(allErrs, apivalidation.ValidateImmutableField(new.Type, old.Type, fldPath.Child("type"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(new.Region, old.Region, fldPath.Child("region"))...) - allErrs = append(allErrs, apivalidation.ValidateImmutableField(new.BucketName, old.BucketName, fldPath.Child("bucketName"))...) return allErrs } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/worker.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/worker.go index 80323f119..9243ce675 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/worker.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/validation/worker.go @@ -15,6 +15,7 @@ package validation import ( + corevalidation "github.com/gardener/gardener/pkg/apis/core/validation" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -88,6 +89,13 @@ func ValidateWorkerPools(pools []extensionsv1alpha1.WorkerPool, fldPath *field.P if pool.UserData == nil { allErrs = append(allErrs, field.Required(idxPath.Child("userData"), "field is required")) } + + if pool.NodeTemplate != nil { + for resourceName, value := range pool.NodeTemplate.Capacity { + allErrs = append(allErrs, corevalidation.ValidateResourceQuantityValue(string(resourceName), value, idxPath.Child("nodeTemplate", "capacity", string(resourceName)))...) + } + } + } return allErrs diff --git a/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/types.go b/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/types.go index 800472c2d..92bf7b168 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/types.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/types.go @@ -44,7 +44,7 @@ const ( PreserveReplicas = "resources.gardener.cloud/preserve-replicas" // PreserveResources is a constant for an annotation on a resource managed by a ManagedResource. If set to // true then the controller will keep the resource requests and limits in Pod templates (e.g. in a - // DeploymentSpec) during updates to the resource. + // DeploymentSpec) during updates to the resource. This applies for all containers. PreserveResources = "resources.gardener.cloud/preserve-resources" // StaticTokenSkip is a constant for a label on a ServiceAccount which indicates that this ServiceAccount should not @@ -54,18 +54,35 @@ const ( // for the invalidation of the static ServiceAccount token. StaticTokenConsider = "token-invalidator.resources.gardener.cloud/consider" - // ResourceManagerPurpose is a constant for the key in a label describing the purpose of the respective object reconciled by the resource manager. + // TokenRequestorTargetSecretName is a constant for an annotation on a Secret which indicates that the token requestor + // shall sync the token to a secret in the target cluster with the given name. + TokenRequestorTargetSecretName = "token-requestor.resources.gardener.cloud/target-secret-name" + // TokenRequestorTargetSecretNamespace is a constant for an annotation on a Secret which indicates that the token + // requestor shall sync the token to a secret in the target cluster with the given namespace. + TokenRequestorTargetSecretNamespace = "token-requestor.resources.gardener.cloud/target-secret-namespace" + + // ResourceManagerPurpose is a constant for the key in a label describing the purpose of the respective object + // reconciled by the resource manager. ResourceManagerPurpose = "resources.gardener.cloud/purpose" - // LabelPurposeTokenRequest is a constant for a label value indicating that this secret should be reconciled by the token-requestor. + // LabelPurposeTokenRequest is a constant for a label value indicating that this secret should be reconciled by the + // token-requestor. LabelPurposeTokenRequest = "token-requestor" - // ServiceAccountName is the key of an annotation of a secret whose value contains the service account name + // LabelPurposeTokenInvalidation is a constant for a label value indicating that this secret should be considered by + // the token-invalidator. + LabelPurposeTokenInvalidation = "token-invalidator" + + // ServiceAccountName is the key of an annotation of a secret whose value contains the service account name. ServiceAccountName = "serviceaccount.resources.gardener.cloud/name" - // ServiceAccountNamespace is the key of an annotation of a secret whose value contains the service account namespace + // ServiceAccountNamespace is the key of an annotation of a secret whose value contains the service account + // namespace. ServiceAccountNamespace = "serviceaccount.resources.gardener.cloud/namespace" - // ServiceAccountTokenExpirationDuration is the key of an annotation of a secret whose value contains the expiration duration of the token created + // ServiceAccountTokenExpirationDuration is the key of an annotation of a secret whose value contains the expiration + // duration of the token created. ServiceAccountTokenExpirationDuration = "serviceaccount.resources.gardener.cloud/token-expiration-duration" - // ServiceAccountTokenRenewTimestamp is the key of an annotation of a secret whose value contains the timestamp when the token needs to be renewed + // ServiceAccountTokenRenewTimestamp is the key of an annotation of a secret whose value contains the timestamp when + // the token needs to be renewed. ServiceAccountTokenRenewTimestamp = "serviceaccount.resources.gardener.cloud/token-renew-timestamp" + // DataKeyToken is the data key whose value contains a service account token. DataKeyToken = "token" // DataKeyKubeconfig is the data key whose value contains a kubeconfig with a service account token. @@ -79,6 +96,12 @@ const ( ProjectedTokenExpirationSeconds = "projected-token-mount.resources.gardener.cloud/expiration-seconds" ) +// +kubebuilder:resource:shortName="mr" +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Class",type=date,JSONPath=`.spec.class`,description="The class identifies which resource manager is responsible for this ManagedResource." +// +kubebuilder:printcolumn:name="Applied",type=string,JSONPath=`.status.conditions[?(@.type=="ResourcesApplied")].status`,description=" Indicates whether all resources have been applied." +// +kubebuilder:printcolumn:name="Healthy",type=string,JSONPath=`.status.conditions[?(@.type=="ResourcesHealthy")].status`,description="Indicates whether all resources are healthy." +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`,description="creation timestamp" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // ManagedResource describes a list of managed resources. diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go index c2c78be42..813ef7bb3 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go @@ -18,13 +18,12 @@ import ( "context" "strings" - "github.com/gardener/gardener/pkg/logger" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "sigs.k8s.io/controller-runtime/pkg/cache" runtimecache "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + logf "sigs.k8s.io/controller-runtime/pkg/log" ) var _ cache.Cache = &aggregator{} @@ -102,13 +101,13 @@ func (c *aggregator) Start(ctx context.Context) error { go func(gvk schema.GroupVersionKind, cache runtimecache.Cache) { err := cache.Start(ctx) if err != nil { - logger.Logger.Errorf("cache failed to start for %q: %v", gvk.String(), err) + logf.Log.Error(err, "cache failed to start", "gvk", gvk.String()) } }(gvk, cache) } go func() { if err := c.fallbackCache.Start(ctx); err != nil { - logger.Logger.Error(err) + logf.Log.Error(err, "fallback cache failed to start") } }() <-ctx.Done() diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go index ad4d8be92..994085af2 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" + "github.com/gardener/gardener/pkg/utils" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -30,12 +31,12 @@ import ( "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + logf "sigs.k8s.io/controller-runtime/pkg/log" gardenercoreinstall "github.com/gardener/gardener/pkg/apis/core/install" seedmanagementinstall "github.com/gardener/gardener/pkg/apis/seedmanagement/install" settingsinstall "github.com/gardener/gardener/pkg/apis/settings/install" kcache "github.com/gardener/gardener/pkg/client/kubernetes/cache" - "github.com/gardener/gardener/pkg/logger" versionutils "github.com/gardener/gardener/pkg/utils/version" ) @@ -47,8 +48,22 @@ var ( UseCachedRuntimeClients = false ) -// KubeConfig is the key to the kubeconfig -const KubeConfig = "kubeconfig" +const ( + // KubeConfig is the key to the kubeconfig + KubeConfig = "kubeconfig" + // AuthClientCertificate references the AuthInfo.ClientCertificate field of a kubeconfig + AuthClientCertificate = "client-certificate" + // AuthClientKey references the AuthInfo.ClientKey field of a kubeconfig + AuthClientKey = "client-key" + // AuthTokenFile references the AuthInfo.Tokenfile field of a kubeconfig + AuthTokenFile = "tokenFile" + // AuthImpersonate references the AuthInfo.Impersonate field of a kubeconfig + AuthImpersonate = "act-as" + // AuthProvider references the AuthInfo.AuthProvider field of a kubeconfig + AuthProvider = "auth-provider" + // AuthExec references the AuthInfo.Exec field of a kubeconfig + AuthExec = "exec" +) func init() { // enable protobuf for Gardener API for controller-runtime clients @@ -80,16 +95,13 @@ func NewClientFromFile(masterURL, kubeconfigPath string, fns ...ConfigFunc) (Int &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterURL}}, ) - if err := validateClientConfig(clientConfig); err != nil { - return nil, err - } - config, err := clientConfig.ClientConfig() if err != nil { return nil, err } - opts := append([]ConfigFunc{WithRESTConfig(config)}, fns...) + opts := append([]ConfigFunc{WithRESTConfig(config), WithClientConfig(clientConfig)}, fns...) + return NewWithConfig(opts...) } @@ -142,7 +154,7 @@ func RESTConfigFromClientConnectionConfiguration(cfg *componentbaseconfig.Client &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: ""}}, ) - if err := validateClientConfig(clientConfig); err != nil { + if err := validateClientConfig(clientConfig, nil); err != nil { return nil, err } @@ -174,7 +186,7 @@ func RESTConfigFromKubeconfig(kubeconfig []byte) (*rest.Config, error) { return nil, err } - if err := validateClientConfig(clientConfig); err != nil { + if err := validateClientConfig(clientConfig, nil); err != nil { return nil, err } @@ -185,35 +197,44 @@ func RESTConfigFromKubeconfig(kubeconfig []byte) (*rest.Config, error) { return restConfig, nil } -func validateClientConfig(clientConfig clientcmd.ClientConfig) error { +func validateClientConfig(clientConfig clientcmd.ClientConfig, allowedFields []string) error { + if clientConfig == nil { + return nil + } + rawConfig, err := clientConfig.RawConfig() if err != nil { return err } - return ValidateConfig(rawConfig) + return ValidateConfigWithAllowList(rawConfig, allowedFields) } // ValidateConfig validates that the auth info of a given kubeconfig doesn't have unsupported fields. func ValidateConfig(config clientcmdapi.Config) error { + return ValidateConfigWithAllowList(config, nil) +} + +// ValidateConfigWithAllowList validates that the auth info of a given kubeconfig doesn't have unsupported fields. It takes an additional list of allowed fields. +func ValidateConfigWithAllowList(config clientcmdapi.Config, allowedFields []string) error { validFields := []string{"client-certificate-data", "client-key-data", "token", "username", "password"} + validFields = append(validFields, allowedFields...) for user, authInfo := range config.AuthInfos { switch { - case authInfo.ClientCertificate != "": + case authInfo.ClientCertificate != "" && !utils.ValueExists(AuthClientCertificate, validFields): return fmt.Errorf("client certificate files are not supported (user %q), these are the valid fields: %+v", user, validFields) - case authInfo.ClientKey != "": + case authInfo.ClientKey != "" && !utils.ValueExists(AuthClientKey, validFields): return fmt.Errorf("client key files are not supported (user %q), these are the valid fields: %+v", user, validFields) - case authInfo.TokenFile != "": + case authInfo.TokenFile != "" && !utils.ValueExists(AuthTokenFile, validFields): return fmt.Errorf("token files are not supported (user %q), these are the valid fields: %+v", user, validFields) - case authInfo.Impersonate != "" || len(authInfo.ImpersonateGroups) > 0: + case (authInfo.Impersonate != "" || len(authInfo.ImpersonateGroups) > 0) && !utils.ValueExists(AuthImpersonate, validFields): return fmt.Errorf("impersonation is not supported, these are the valid fields: %+v", validFields) - case authInfo.AuthProvider != nil && len(authInfo.AuthProvider.Config) > 0: + case (authInfo.AuthProvider != nil && len(authInfo.AuthProvider.Config) > 0) && !utils.ValueExists(AuthProvider, validFields): return fmt.Errorf("auth provider configurations are not supported (user %q), these are the valid fields: %+v", user, validFields) - case authInfo.Exec != nil: + case authInfo.Exec != nil && !utils.ValueExists(AuthExec, validFields): return fmt.Errorf("exec configurations are not supported (user %q), these are the valid fields: %+v", user, validFields) } } - return nil } @@ -256,6 +277,10 @@ func NewWithConfig(fns ...ConfigFunc) (Interface, error) { } func newClientSet(conf *Config) (Interface, error) { + if err := validateClientConfig(conf.clientConfig, conf.allowedUserFields); err != nil { + return nil, err + } + if err := setConfigDefaults(conf); err != nil { return nil, err } @@ -359,7 +384,7 @@ var cacheError = &kcache.CacheError{} func (d *fallbackClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { err := d.Client.Get(ctx, key, obj) if err != nil && errors.As(err, &cacheError) { - logger.Logger.Debug("Falling back to API reader because a cache error occurred: %w", err) + logf.Log.V(1).Info("Falling back to API reader because a cache error occurred", "error", err) return d.reader.Get(ctx, key, obj) } return err @@ -370,7 +395,7 @@ func (d *fallbackClient) Get(ctx context.Context, key client.ObjectKey, obj clie func (d *fallbackClient) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { err := d.Client.List(ctx, list, opts...) if err != nil && errors.As(err, &cacheError) { - logger.Logger.Debug("Falling back to API reader because a cache error occurred: %w", err) + logf.Log.V(1).Info("Falling back to API reader because a cache error occurred", "error", err) return d.reader.List(ctx, list, opts...) } return err diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/garden_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/garden_clientmap.go index 5f9a04aa3..a8a0a240e 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/garden_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/garden_clientmap.go @@ -18,7 +18,6 @@ import ( "context" "fmt" - "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/cache" @@ -36,10 +35,10 @@ type gardenClientMap struct { clientmap.ClientMap } -// NewGardenClientMap creates a new gardenClientMap with the given factory and logger. -func NewGardenClientMap(factory *GardenClientSetFactory, logger logrus.FieldLogger) clientmap.ClientMap { +// NewGardenClientMap creates a new gardenClientMap with the given factory. +func NewGardenClientMap(factory *GardenClientSetFactory) clientmap.ClientMap { return &gardenClientMap{ - ClientMap: NewGenericClientMap(factory, logger), + ClientMap: NewGenericClientMap(factory, log.WithValues("clientmap", "GardenClientMap")), } } diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/generic_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/generic_clientmap.go index 7f7e654bf..a2b914cf9 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/generic_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/generic_clientmap.go @@ -20,7 +20,7 @@ import ( "sync" "time" - "github.com/sirupsen/logrus" + "github.com/go-logr/logr" "golang.org/x/time/rate" "github.com/gardener/gardener/pkg/client/kubernetes" @@ -51,7 +51,7 @@ type GenericClientMap struct { // lock guards concurrent access to clientSets lock sync.RWMutex - log logrus.FieldLogger + log logr.Logger // stopCh is saved on the first call to Start and is used to start the caches of newly created ClientSets. stopCh <-chan struct{} @@ -70,7 +70,7 @@ type clientMapEntry struct { } // NewGenericClientMap creates a new GenericClientMap with the given factory and logger. -func NewGenericClientMap(factory clientmap.ClientSetFactory, logger logrus.FieldLogger) *GenericClientMap { +func NewGenericClientMap(factory clientmap.ClientSetFactory, logger logr.Logger) *GenericClientMap { return &GenericClientMap{ clientSets: make(map[clientmap.ClientSetKey]*clientMapEntry), factory: factory, @@ -102,7 +102,7 @@ func (cm *GenericClientMap) GetClient(ctx context.Context, key clientmap.ClientS return false, fmt.Errorf("failed to refresh ClientSet's server version: %w", err) } if serverVersion.GitVersion != oldVersion { - cm.log.Infof("New server version discovered for ClientSet with key %q: %s", key.Key(), serverVersion.GitVersion) + cm.log.Info("New server version discovered for ClientSet", "key", key.Key(), "serverVersion", serverVersion.GitVersion) } // invalidate client if the config of the client has changed (e.g. kubeconfig secret) @@ -112,7 +112,7 @@ func (cm *GenericClientMap) GetClient(ctx context.Context, key clientmap.ClientS } if hash != entry.hash { - cm.log.Infof("Refreshing ClientSet with key %q due to changed ClientSetHash: %s/%s", key.Key(), entry.hash, hash) + cm.log.Info("Refreshing ClientSet due to changed ClientSetHash", "key", key.Key(), "oldHash", entry.hash, "newHash", hash) return true, nil } @@ -151,7 +151,7 @@ func (cm *GenericClientMap) addClientSet(ctx context.Context, key clientmap.Clie return entry, nil } - cm.log.Infof("Creating new ClientSet for key %q", key.Key()) + cm.log.Info("Creating new ClientSet", "key", key.Key()) cs, err := cm.factory.NewClientSet(ctx, key) if err != nil { return nil, fmt.Errorf("error creating new ClientSet for key %q: %w", key.Key(), err) @@ -195,7 +195,7 @@ func (cm *GenericClientMap) InvalidateClient(key clientmap.ClientSetKey) error { return nil } - cm.log.Infof("Invalidating ClientSet for key %q", key.Key()) + cm.log.Info("Invalidating ClientSet", "key", key.Key()) if entry.cancel != nil { entry.cancel() } diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/log.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/log.go new file mode 100644 index 000000000..1ed7da4fb --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/log.go @@ -0,0 +1,21 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package internal + +import ( + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +var log = logf.Log.WithName("clientmap") diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/plant_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/plant_clientmap.go index 79ae43920..29d013286 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/plant_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/plant_clientmap.go @@ -18,7 +18,6 @@ import ( "context" "fmt" - "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -33,10 +32,10 @@ type plantClientMap struct { clientmap.ClientMap } -// NewPlantClientMap creates a new plantClientMap with the given factory and logger. -func NewPlantClientMap(factory *PlantClientSetFactory, logger logrus.FieldLogger) clientmap.ClientMap { +// NewPlantClientMap creates a new plantClientMap with the given factory. +func NewPlantClientMap(factory *PlantClientSetFactory) clientmap.ClientMap { return &plantClientMap{ - ClientMap: NewGenericClientMap(factory, logger), + ClientMap: NewGenericClientMap(factory, log.WithValues("clientmap", "PlantClientMap")), } } diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/seed_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/seed_clientmap.go index ceacb20c1..43257c6ca 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/seed_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/seed_clientmap.go @@ -18,7 +18,6 @@ import ( "context" "fmt" - "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" eventsv1 "k8s.io/api/events/v1" baseconfig "k8s.io/component-base/config" @@ -33,10 +32,10 @@ type seedClientMap struct { clientmap.ClientMap } -// NewSeedClientMap creates a new seedClientMap with the given factory and logger. -func NewSeedClientMap(factory *SeedClientSetFactory, logger logrus.FieldLogger) clientmap.ClientMap { +// NewSeedClientMap creates a new seedClientMap with the given factory. +func NewSeedClientMap(factory *SeedClientSetFactory) clientmap.ClientMap { return &seedClientMap{ - ClientMap: NewGenericClientMap(factory, logger), + ClientMap: NewGenericClientMap(factory, log.WithValues("clientmap", "SeedClientMap")), } } diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go index 74846fee2..e171c4172 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go @@ -18,18 +18,17 @@ import ( "context" "fmt" + "github.com/go-logr/logr" + corev1 "k8s.io/api/core/v1" + baseconfig "k8s.io/component-base/config" + "sigs.k8s.io/controller-runtime/pkg/client" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/client/kubernetes/clientmap" shootpkg "github.com/gardener/gardener/pkg/operation/shoot" "github.com/gardener/gardener/pkg/utils" - - "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - baseconfig "k8s.io/component-base/config" - "sigs.k8s.io/controller-runtime/pkg/client" ) // shootClientMap is a ClientMap for requesting and storing clients for Shoot clusters. @@ -37,9 +36,11 @@ type shootClientMap struct { clientmap.ClientMap } -// NewShootClientMap creates a new shootClientMap with the given factory and logger. -func NewShootClientMap(factory *ShootClientSetFactory, logger logrus.FieldLogger) clientmap.ClientMap { +// NewShootClientMap creates a new shootClientMap with the given factory. +func NewShootClientMap(factory *ShootClientSetFactory) clientmap.ClientMap { + logger := log.WithValues("clientmap", "ShootClientMap") factory.clientKeyToSeedInfo = make(map[ShootClientSetKey]seedInfo) + factory.log = logger return &shootClientMap{ ClientMap: NewGenericClientMap(factory, logger), } @@ -56,8 +57,8 @@ type ShootClientSetFactory struct { // ClientConnectionConfiguration is the configuration that will be used by created ClientSets. ClientConnectionConfig baseconfig.ClientConnectionConfiguration - // Log is a logger for logging entries related to creating Shoot ClientSets. - Log logrus.FieldLogger + // log is a logger for logging entries related to creating Shoot ClientSets. + log logr.Logger clientKeyToSeedInfo map[ShootClientSetKey]seedInfo } @@ -80,7 +81,7 @@ func (f *ShootClientSetFactory) CalculateClientSetHash(ctx context.Context, k cl } kubeconfigSecret := &corev1.Secret{} - if err := seedClient.Client().Get(ctx, client.ObjectKey{Namespace: seedNamespace, Name: v1beta1constants.SecretNameGardener}, kubeconfigSecret); err != nil { + if err := seedClient.Client().Get(ctx, client.ObjectKey{Namespace: seedNamespace, Name: f.secretName(seedNamespace)}, kubeconfigSecret); err != nil { return "", err } @@ -99,36 +100,27 @@ func (f *ShootClientSetFactory) NewClientSet(ctx context.Context, k clientmap.Cl return nil, err } + return NewClientFromSecret(ctx, seedClient.Client(), seedNamespace, f.secretName(seedNamespace), + kubernetes.WithClientConnectionOptions(f.ClientConnectionConfig), + kubernetes.WithClientOptions(client.Options{Scheme: kubernetes.ShootScheme}), + kubernetes.WithDisabledCachedClient(), + ) +} + +func (f *ShootClientSetFactory) secretName(seedNamespace string) string { secretName := v1beta1constants.SecretNameGardener + // If the gardenlet runs in the same cluster like the API server of the shoot then use the internal kubeconfig // and communicate internally. Otherwise, fall back to the "external" kubeconfig and communicate via the // load balancer of the shoot API server. addr, err := LookupHost(fmt.Sprintf("%s.%s.svc", v1beta1constants.DeploymentNameKubeAPIServer, seedNamespace)) if err != nil { - f.Log.Warnf("service DNS name lookup of kube-apiserver failed (%+v), falling back to external kubeconfig", err) + f.log.Info("service DNS name lookup of kube-apiserver failed, falling back to external kubeconfig", "error", err) } else if len(addr) > 0 { secretName = v1beta1constants.SecretNameGardenerInternal } - clientOptions := client.Options{ - Scheme: kubernetes.ShootScheme, - } - - clientSet, err := NewClientFromSecret(ctx, seedClient.Client(), seedNamespace, secretName, - kubernetes.WithClientConnectionOptions(f.ClientConnectionConfig), - kubernetes.WithClientOptions(clientOptions), - kubernetes.WithDisabledCachedClient(), - ) - - if secretName == v1beta1constants.SecretNameGardenerInternal && err != nil && apierrors.IsNotFound(err) { - clientSet, err = NewClientFromSecret(ctx, seedClient.Client(), seedNamespace, v1beta1constants.SecretNameGardener, - kubernetes.WithClientConnectionOptions(f.ClientConnectionConfig), - kubernetes.WithClientOptions(clientOptions), - kubernetes.WithDisabledCachedClient(), - ) - } - - return clientSet, err + return secretName } var _ clientmap.Invalidate = &ShootClientSetFactory{} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientset.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientset.go index 369d95498..5832f2abf 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientset.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientset.go @@ -18,14 +18,14 @@ import ( "context" "sync" - "github.com/gardener/gardener/pkg/chartrenderer" - "github.com/gardener/gardener/pkg/logger" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + logf "sigs.k8s.io/controller-runtime/pkg/log" + + "github.com/gardener/gardener/pkg/chartrenderer" ) // clientSet is a struct containing the configuration for the respective Kubernetes @@ -135,7 +135,7 @@ func (c *clientSet) Start(ctx context.Context) { c.startOnce.Do(func() { go func() { if err := c.cache.Start(ctx); err != nil { - logger.Logger.Errorf("cache.Start returned error, which should never happen, ignoring.") + logf.Log.Error(err, "cache.Start returned error, which should never happen, ignoring") } }() }) diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go index c4f162a80..4e8c1e47a 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go @@ -19,6 +19,7 @@ import ( "time" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" baseconfig "k8s.io/component-base/config" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" @@ -26,12 +27,14 @@ import ( // Config carries options for new ClientSets. type Config struct { - newRuntimeCache cache.NewCacheFunc - clientOptions client.Options - restConfig *rest.Config - cacheResync *time.Duration - disableCache bool - uncachedObjects []client.Object + newRuntimeCache cache.NewCacheFunc + clientOptions client.Options + restConfig *rest.Config + cacheResync *time.Duration + disableCache bool + uncachedObjects []client.Object + allowedUserFields []string + clientConfig clientcmd.ClientConfig } // NewConfig returns a new Config with an empty REST config to allow testing ConfigFuncs without exporting @@ -109,3 +112,19 @@ func WithNewCacheFunc(fn cache.NewCacheFunc) ConfigFunc { return nil } } + +// WithAllowedUserFields allows to specify additional kubeconfig.user fields allowed during validation. +func WithAllowedUserFields(allowedUserFields []string) ConfigFunc { + return func(config *Config) error { + config.allowedUserFields = allowedUserFields + return nil + } +} + +// WithClientConfig adds a ClientConfig for validation at a later stage. +func WithClientConfig(clientConfig clientcmd.ClientConfig) ConfigFunc { + return func(config *Config) error { + config.clientConfig = clientConfig + return nil + } +} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go index f331b7e1b..eed9b630c 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go @@ -18,14 +18,13 @@ import ( "context" "fmt" - gardencorev1alpha1 "github.com/gardener/gardener/pkg/apis/core/v1alpha1" - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - gardenoperationsv1alpha1 "github.com/gardener/gardener/pkg/apis/operations/v1alpha1" - "github.com/gardener/gardener/pkg/logger" - "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" + + gardencorev1alpha1 "github.com/gardener/gardener/pkg/apis/core/v1alpha1" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + gardenoperationsv1alpha1 "github.com/gardener/gardener/pkg/apis/operations/v1alpha1" ) // DetermineShootsAssociatedTo gets a to determine the Shoots resources which are associated @@ -33,7 +32,6 @@ import ( func DetermineShootsAssociatedTo(ctx context.Context, gardenClient client.Reader, obj interface{}) ([]string, error) { shootList := &gardencorev1beta1.ShootList{} if err := gardenClient.List(ctx, shootList); err != nil { - logger.Logger.Info(err.Error()) return nil, err } diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go index 030f5b419..c2e604ad8 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go @@ -20,38 +20,48 @@ import ( "sync" "time" + "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" + logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/runtime/inject" "github.com/gardener/gardener/pkg/logger" ) -// CreateWorker creates and runs a worker thread that just processes items in the -// specified queue. The worker will run until stopCh is closed. The worker will be +// WorkerOptions are options for a controller's worker. +type WorkerOptions struct { + logger logr.Logger +} + +// WorkerOption is a func that mutates WorkerOptions. +type WorkerOption func(*WorkerOptions) + +// WithLogger configures the logr.Logger to use for a controller worker. +// If set, a logger preconfigured with the name and namespace field will be injected into the context.Context on +// each Reconcile call. It can be retrieved via log.FromContext. +func WithLogger(logger logr.Logger) WorkerOption { + return func(options *WorkerOptions) { + options.logger = logger + } +} + +// CreateWorker creates and runs a worker goroutine that just processes items in the +// specified queue. The worker will run until ctx is cancelled. The worker will be // added to the wait group when started and marked done when finished. -// The given context is injected into the `reconciler` if it implements `inject.Stoppable`. -// Optionally passed inject functions are called with the `reconciler` but potentially returned errors are disregarded. -func CreateWorker(ctx context.Context, queue workqueue.RateLimitingInterface, resourceType string, reconciler reconcile.Reconciler, waitGroup *sync.WaitGroup, workerCh chan<- int, injectFn ...inject.Func) { - fns := append(injectFn, func(i interface{}) error { - _, err := inject.StopChannelInto(ctx.Done(), i) - return err - }) - - for _, f := range fns { - if err := f(reconciler); err != nil { - logger.Logger.Errorf("An error occurred while reconciler injection: %v", err) - } +func CreateWorker(ctx context.Context, queue workqueue.RateLimitingInterface, resourceType string, reconciler reconcile.Reconciler, waitGroup *sync.WaitGroup, workerCh chan<- int, opts ...WorkerOption) { + options := WorkerOptions{} + for _, o := range opts { + o(&options) } waitGroup.Add(1) workerCh <- 1 go func() { wait.UntilWithContext(ctx, func(ctx context.Context) { - worker(ctx, queue, resourceType, reconciler) + worker(ctx, queue, resourceType, reconciler, options) }, time.Second) workerCh <- -1 waitGroup.Done() @@ -76,7 +86,10 @@ func requestFromKey(key interface{}) (reconcile.Request, error) { // worker runs a worker thread that just dequeues items, processes them, and marks them done. // It enforces that the reconciler is never invoked concurrently with the same key. -func worker(ctx context.Context, queue workqueue.RateLimitingInterface, resourceType string, reconciler reconcile.Reconciler) { +func worker(ctx context.Context, queue workqueue.RateLimitingInterface, resourceType string, reconciler reconcile.Reconciler, opts WorkerOptions) { + // TODO(timebertt): remove this var and all usages of logger.Logger, once all controllers have migrated to logr. + controllerLogger := opts.logger + exit := false for !exit { exit = func() bool { @@ -88,14 +101,33 @@ func worker(ctx context.Context, queue workqueue.RateLimitingInterface, resource req, err := requestFromKey(key) if err != nil { - logger.Logger.WithError(err).Error("Cannot obtain request from key") + if controllerLogger != nil { + controllerLogger.Error(err, "cannot obtain request from key") + } else { + logger.Logger.WithError(err).Error("cannot obtain request from key") + } queue.Forget(key) return false } - res, err := reconciler.Reconcile(ctx, req) + var ( + reconcileCtx = ctx + reconcileLogger logr.Logger + ) + if controllerLogger != nil { + reconcileLogger = controllerLogger.WithValues("name", req.Name, "namespace", req.Namespace) + reconcileCtx = logf.IntoContext(ctx, reconcileLogger) + } + + res, err := reconciler.Reconcile(reconcileCtx, req) if err != nil { - logger.Logger.Infof("Error syncing %s %v: %v", resourceType, key, err) + if reconcileLogger != nil { + // resource type is not added to logger here. Ideally, each controller sets WithName and it is clear from + // which controller the error log comes. + reconcileLogger.Error(err, "error reconciling request") + } else { + logger.Logger.Infof("Error syncing %s %v: %v", resourceType, key, err) + } queue.AddRateLimited(key) return false } diff --git a/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go b/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go index 412f4fd20..29c750210 100644 --- a/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go +++ b/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go @@ -114,6 +114,7 @@ func WaitUntilObjectReadyWithHealthFunction( if postReadyFunc != nil { if err := postReadyFunc(); err != nil { + lastObservedError = err return retry.SevereError(err) } } diff --git a/vendor/github.com/gardener/gardener/pkg/features/features.go b/vendor/github.com/gardener/gardener/pkg/features/features.go index 89bddcc13..b2ae5c439 100644 --- a/vendor/github.com/gardener/gardener/pkg/features/features.go +++ b/vendor/github.com/gardener/gardener/pkg/features/features.go @@ -27,17 +27,17 @@ const ( // MyFeature featuregate.Feature = "MyFeature" // Logging enables logging stack for clusters. - // owner @mvladev + // owner @vlvasilev // alpha: v0.13.0 Logging featuregate.Feature = "Logging" // HVPA enables simultaneous horizontal and vertical scaling in Seed Clusters. - // owner @amshuman-kr + // owner @shreyas-s-rao @voelzmo // alpha: v0.31.0 HVPA featuregate.Feature = "HVPA" // HVPAForShootedSeed enables simultaneous horizontal and vertical scaling in shooted seed Clusters. - // owner @amshuman-kr + // owner @shreyas-s-rao @voelzmo // alpha: v0.32.0 HVPAForShootedSeed featuregate.Feature = "HVPAForShootedSeed" @@ -45,7 +45,7 @@ const ( // Disable this feature if Istio is already installed in the cluster. // Istio is not automatically removed if this feature is set to false. // See https://github.com/gardener/gardener/blob/master/docs/usage/istio.md - // owner @mvladev + // owner @ScheererJ @DockToFuture // alpha: v1.5.0 // beta: v1.19.0 ManagedIstio featuregate.Feature = "ManagedIstio" @@ -54,7 +54,7 @@ const ( // for all Shoot clusters. Requires Istio to be installed in the cluster or // ManagedIstio feature gate to be enabled. // See https://github.com/gardener/gardener/blob/masster/docs/proposals/08-shoot-apiserver-via-sni.md - // owner @mvladev + // owner @ScheererJ @DockToFuture // alpha: v1.7.0 // beta: v1.19.0 APIServerSNI featuregate.Feature = "APIServerSNI" @@ -73,17 +73,17 @@ const ( SeedChange featuregate.Feature = "SeedChange" // SeedKubeScheduler adds an additional kube-scheduler in seed clusters where the feature is enabled. - // owner: @mvladev + // owner: @ialidzhikov // alpha: v1.15.0 SeedKubeScheduler featuregate.Feature = "SeedKubeScheduler" // ReversedVPN moves the openvpn server to the seed. - // owner: @scheererj @docktofuture + // owner: @ScheererJ @DockToFuture // alpha: v1.22.0 ReversedVPN featuregate.Feature = "ReversedVPN" // AdminKubeconfigRequest enables the AdminKubeconfigRequest endpoint on shoot resources. - // owner: @mvladev + // owner: @petersutter // alpha: v1.24.0 AdminKubeconfigRequest featuregate.Feature = "AdminKubeconfigRequest" @@ -92,21 +92,32 @@ const ( // alpha: v1.27.0 UseDNSRecords featuregate.Feature = "UseDNSRecords" - // DisallowKubeconfigRotationForShootInDeletion when enabled disallows kubeconfig rotations to be requested - // for shoots that are already in the deletion phase, i.e. `metadata.deletionTimestamp` is set - // owner: @vpnachev - // alpha: v1.28.0 - // beta: v1.32.0 - // GA: v1.36.0 - DisallowKubeconfigRotationForShootInDeletion featuregate.Feature = "DisallowKubeconfigRotationForShootInDeletion" - // RotateSSHKeypairOnMaintenance enables SSH keypair rotation in the maintenance controller of the gardener-controller-manager. - // owner: @petersutter @xrstf + // owner: @petersutter // alpha: v1.28.0 RotateSSHKeypairOnMaintenance featuregate.Feature = "RotateSSHKeypairOnMaintenance" // DenyInvalidExtensionResources causes the seed-admission-controller to deny invalid extension resources (instead of just logging validation errors). - // owner: @vanjiii + // owner: @stoyanr // alpha: v1.31.0 DenyInvalidExtensionResources featuregate.Feature = "DenyInvalidExtensionResources" + + // WorkerPoolKubernetesVersion allows to overwrite the Kubernetes version used for shoot clusters per worker pool. + // owner: @rfranzke @majst01 @mwennrich + // alpha: v1.35.0 + WorkerPoolKubernetesVersion featuregate.Feature = "WorkerPoolKubernetesVersion" + + // CopyEtcdBackupsDuringControlPlaneMigration enables the copy of etcd backups from the object store of the source seed + // to the object store of the destination seed during control plane migration. + // owner: @plkokanov + // alpha: v1.37.0 + CopyEtcdBackupsDuringControlPlaneMigration featuregate.Feature = "CopyEtcdBackupsDuringControlPlaneMigration" + + // SecretBindingProviderValidation enables validations on Gardener API server that: + // - requires the provider type of a SecretBinding to be set (on SecretBinding creation) + // - requires the SecretBinding provider type to match the Shoot provider type (on Shoot creation) + // - enforces immutability on the provider type of a SecretBinding + // owner: @ialidzhikov + // alpha: v1.38.0 + SecretBindingProviderValidation featuregate.Feature = "SecretBindingProviderValidation" ) diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go index 2ca3fa1db..f776966df 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go @@ -67,6 +67,9 @@ type GardenletConfiguration struct { // SNI contains an optional configuration for the APIServerSNI feature used // by the Gardenlet in the seed clusters. SNI *SNI + // ETCDConfig contains an optional configuration for the + // backup compaction feature of ETCD backup-restore functionality. + ETCDConfig *ETCDConfig // ExposureClassHandlers is a list of optional of exposure class handlers. ExposureClassHandlers []ExposureClassHandler // MonitoringConfig is optional and adds additional settings for the monitoring stack. @@ -194,6 +197,13 @@ type SeedControllerConfiguration struct { ConcurrentSyncs *int // SyncPeriod is the duration how often the existing resources are reconciled. SyncPeriod *metav1.Duration + // LeaseResyncSeconds defines how often (in seconds) the seed lease is renewed. + // Default: 2s + LeaseResyncSeconds *int32 + // LeaseResyncMissThreshold is the amount of missed lease resyncs before the health status + // is changed to false. + // Default: 10 + LeaseResyncMissThreshold *int32 } // ShootControllerConfiguration defines the configuration of the Shoot @@ -403,6 +413,46 @@ type SNIIngress struct { Labels map[string]string } +// ETCDConfig contains ETCD related configs +type ETCDConfig struct { + // ETCDController contains config specific to ETCD controller + ETCDController *ETCDController + // CustodianController contains config specific to custodian controller + CustodianController *CustodianController + // BackupCompactionController contains config specific to backup compaction controller + BackupCompactionController *BackupCompactionController +} + +// ETCDController contains config specific to ETCD controller +type ETCDController struct { + // Workers specify number of worker threads in ETCD controller + // Defaults to 50 + Workers *int64 +} + +// CustodianController contains config specific to custodian controller +type CustodianController struct { + // Workers specify number of worker threads in custodian controller + // Defaults to 10 + Workers *int64 +} + +// BackupCompactionController contains config specific to backup compaction controller +type BackupCompactionController struct { + // Workers specify number of worker threads in backup compaction controller + // Defaults to 3 + Workers *int64 + // EnableBackupCompaction enables automatic compaction of etcd backups + // Defaults to false + EnableBackupCompaction *bool + // EventsThreshold defines total number of etcd events that can be allowed before a backup compaction job is triggered + // Defaults to 1 Million events + EventsThreshold *int64 + // ActiveDeadlineDuration defines duration after which a running backup compaction job will be killed + // Defaults to 3 hours + ActiveDeadlineDuration *metav1.Duration +} + // ExposureClassHandler contains configuration for an exposure class handler. type ExposureClassHandler struct { // Name is the name of the exposure class handler. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go index f0618080b..01c8b7f68 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go @@ -244,6 +244,14 @@ func SetDefaults_SeedControllerConfiguration(obj *SeedControllerConfiguration) { v := DefaultControllerSyncPeriod obj.SyncPeriod = &v } + + if obj.LeaseResyncSeconds == nil { + obj.LeaseResyncSeconds = pointer.Int32(2) + } + + if obj.LeaseResyncMissThreshold == nil { + obj.LeaseResyncMissThreshold = pointer.Int32(10) + } } // SetDefaults_ShootControllerConfiguration sets defaults for the shoot controller. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go index 93010d202..7b163cc29 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go @@ -83,6 +83,10 @@ type GardenletConfiguration struct { // by the Gardenlet in the seed clusters. // +optional SNI *SNI `json:"sni,omitempty"` + // ETCDConfig contains an optional configuration for the + // backup compaction feature in etcdbr + // +optional + ETCDConfig *ETCDConfig `json:"etcdConfig,omitempty"` // ExposureClassHandlers is a list of optional of exposure class handlers. // +optional ExposureClassHandlers []ExposureClassHandler `json:"exposureClassHandlers,omitempty"` @@ -239,6 +243,15 @@ type SeedControllerConfiguration struct { // SyncPeriod is the duration how often the existing resources are reconciled. // +optional SyncPeriod *metav1.Duration `json:"syncPeriod,omitempty"` + // LeaseResyncSeconds defines how often (in seconds) the seed lease is renewed. + // Defaults to 2 + // +optional + LeaseResyncSeconds *int32 `json:"leaseResyncSeconds,omitempty"` + // LeaseResyncMissThreshold is the amount of missed lease resyncs before the health status + // is changed to false. + // Defaults to 10 + // +optional + LeaseResyncMissThreshold *int32 `json:"leaseResyncMissThreshold,omitempty"` } // ShootControllerConfiguration defines the configuration of the Shoot @@ -484,6 +497,55 @@ type SNIIngress struct { Labels map[string]string `json:"labels,omitempty"` } +// ETCDConfig contains ETCD related configs +type ETCDConfig struct { + // ETCDController contains config specific to ETCD controller + // +optional + ETCDController *ETCDController `json:"etcdController,omitempty"` + // CustodianController contains config specific to custodian controller + // +optional + CustodianController *CustodianController `json:"custodianController,omitempty"` + // BackupCompactionController contains config specific to backup compaction controller + // +optional + BackupCompactionController *BackupCompactionController `json:"backupCompactionController,omitempty"` +} + +// ETCDController contains config specific to ETCD controller +type ETCDController struct { + // Workers specify number of worker threads in ETCD controller + // Defaults to 50 + // +optional + Workers *int64 `json:"workers,omitempty"` +} + +// CustodianController contains config specific to custodian controller +type CustodianController struct { + // Workers specify number of worker threads in custodian controller + // Defaults to 10 + // +optional + Workers *int64 `json:"workers,omitempty"` +} + +// BackupCompactionController contains config specific to backup compaction controller +type BackupCompactionController struct { + // Workers specify number of worker threads in backup compaction controller + // Defaults to 3 + // +optional + Workers *int64 `json:"workers,omitempty"` + // EnableBackupCompaction enables automatic compaction of etcd backups + // Defaults to false + // +optional + EnableBackupCompaction *bool `json:"enableBackupCompaction,omitempty"` + // EventsThreshold defines total number of etcd events that can be allowed before a backup compaction job is triggered + // Defaults to 1 Million events + // +optional + EventsThreshold *int64 `json:"eventsThreshold,omitempty"` + // ActiveDeadlineDuration defines duration after which a running backup compaction job will be killed + // Defaults to 3 hours + // +optional + ActiveDeadlineDuration *metav1.Duration `json:"activeDeadlineDuration,omitempty"` +} + // ExposureClassHandler contains configuration for an exposure class handler. type ExposureClassHandler struct { // Name is the name of the exposure class handler. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go index 564b0675d..94688b462 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go @@ -53,6 +53,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*BackupCompactionController)(nil), (*config.BackupCompactionController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_BackupCompactionController_To_config_BackupCompactionController(a.(*BackupCompactionController), b.(*config.BackupCompactionController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.BackupCompactionController)(nil), (*BackupCompactionController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_BackupCompactionController_To_v1alpha1_BackupCompactionController(a.(*config.BackupCompactionController), b.(*BackupCompactionController), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*BackupEntryControllerConfiguration)(nil), (*config.BackupEntryControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_BackupEntryControllerConfiguration_To_config_BackupEntryControllerConfiguration(a.(*BackupEntryControllerConfiguration), b.(*config.BackupEntryControllerConfiguration), scope) }); err != nil { @@ -113,6 +123,36 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*CustodianController)(nil), (*config.CustodianController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_CustodianController_To_config_CustodianController(a.(*CustodianController), b.(*config.CustodianController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.CustodianController)(nil), (*CustodianController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_CustodianController_To_v1alpha1_CustodianController(a.(*config.CustodianController), b.(*CustodianController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ETCDConfig)(nil), (*config.ETCDConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ETCDConfig_To_config_ETCDConfig(a.(*ETCDConfig), b.(*config.ETCDConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.ETCDConfig)(nil), (*ETCDConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_ETCDConfig_To_v1alpha1_ETCDConfig(a.(*config.ETCDConfig), b.(*ETCDConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ETCDController)(nil), (*config.ETCDController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ETCDController_To_config_ETCDController(a.(*ETCDController), b.(*config.ETCDController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.ETCDController)(nil), (*ETCDController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_ETCDController_To_v1alpha1_ETCDController(a.(*config.ETCDController), b.(*ETCDController), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ExposureClassHandler)(nil), (*config.ExposureClassHandler)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ExposureClassHandler_To_config_ExposureClassHandler(a.(*ExposureClassHandler), b.(*config.ExposureClassHandler), scope) }); err != nil { @@ -446,6 +486,32 @@ func Convert_config_BackupBucketControllerConfiguration_To_v1alpha1_BackupBucket return autoConvert_config_BackupBucketControllerConfiguration_To_v1alpha1_BackupBucketControllerConfiguration(in, out, s) } +func autoConvert_v1alpha1_BackupCompactionController_To_config_BackupCompactionController(in *BackupCompactionController, out *config.BackupCompactionController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + out.EnableBackupCompaction = (*bool)(unsafe.Pointer(in.EnableBackupCompaction)) + out.EventsThreshold = (*int64)(unsafe.Pointer(in.EventsThreshold)) + out.ActiveDeadlineDuration = (*v1.Duration)(unsafe.Pointer(in.ActiveDeadlineDuration)) + return nil +} + +// Convert_v1alpha1_BackupCompactionController_To_config_BackupCompactionController is an autogenerated conversion function. +func Convert_v1alpha1_BackupCompactionController_To_config_BackupCompactionController(in *BackupCompactionController, out *config.BackupCompactionController, s conversion.Scope) error { + return autoConvert_v1alpha1_BackupCompactionController_To_config_BackupCompactionController(in, out, s) +} + +func autoConvert_config_BackupCompactionController_To_v1alpha1_BackupCompactionController(in *config.BackupCompactionController, out *BackupCompactionController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + out.EnableBackupCompaction = (*bool)(unsafe.Pointer(in.EnableBackupCompaction)) + out.EventsThreshold = (*int64)(unsafe.Pointer(in.EventsThreshold)) + out.ActiveDeadlineDuration = (*v1.Duration)(unsafe.Pointer(in.ActiveDeadlineDuration)) + return nil +} + +// Convert_config_BackupCompactionController_To_v1alpha1_BackupCompactionController is an autogenerated conversion function. +func Convert_config_BackupCompactionController_To_v1alpha1_BackupCompactionController(in *config.BackupCompactionController, out *BackupCompactionController, s conversion.Scope) error { + return autoConvert_config_BackupCompactionController_To_v1alpha1_BackupCompactionController(in, out, s) +} + func autoConvert_v1alpha1_BackupEntryControllerConfiguration_To_config_BackupEntryControllerConfiguration(in *BackupEntryControllerConfiguration, out *config.BackupEntryControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) out.DeletionGracePeriodHours = (*int)(unsafe.Pointer(in.DeletionGracePeriodHours)) @@ -574,6 +640,70 @@ func Convert_config_ControllerInstallationRequiredControllerConfiguration_To_v1a return autoConvert_config_ControllerInstallationRequiredControllerConfiguration_To_v1alpha1_ControllerInstallationRequiredControllerConfiguration(in, out, s) } +func autoConvert_v1alpha1_CustodianController_To_config_CustodianController(in *CustodianController, out *config.CustodianController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + return nil +} + +// Convert_v1alpha1_CustodianController_To_config_CustodianController is an autogenerated conversion function. +func Convert_v1alpha1_CustodianController_To_config_CustodianController(in *CustodianController, out *config.CustodianController, s conversion.Scope) error { + return autoConvert_v1alpha1_CustodianController_To_config_CustodianController(in, out, s) +} + +func autoConvert_config_CustodianController_To_v1alpha1_CustodianController(in *config.CustodianController, out *CustodianController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + return nil +} + +// Convert_config_CustodianController_To_v1alpha1_CustodianController is an autogenerated conversion function. +func Convert_config_CustodianController_To_v1alpha1_CustodianController(in *config.CustodianController, out *CustodianController, s conversion.Scope) error { + return autoConvert_config_CustodianController_To_v1alpha1_CustodianController(in, out, s) +} + +func autoConvert_v1alpha1_ETCDConfig_To_config_ETCDConfig(in *ETCDConfig, out *config.ETCDConfig, s conversion.Scope) error { + out.ETCDController = (*config.ETCDController)(unsafe.Pointer(in.ETCDController)) + out.CustodianController = (*config.CustodianController)(unsafe.Pointer(in.CustodianController)) + out.BackupCompactionController = (*config.BackupCompactionController)(unsafe.Pointer(in.BackupCompactionController)) + return nil +} + +// Convert_v1alpha1_ETCDConfig_To_config_ETCDConfig is an autogenerated conversion function. +func Convert_v1alpha1_ETCDConfig_To_config_ETCDConfig(in *ETCDConfig, out *config.ETCDConfig, s conversion.Scope) error { + return autoConvert_v1alpha1_ETCDConfig_To_config_ETCDConfig(in, out, s) +} + +func autoConvert_config_ETCDConfig_To_v1alpha1_ETCDConfig(in *config.ETCDConfig, out *ETCDConfig, s conversion.Scope) error { + out.ETCDController = (*ETCDController)(unsafe.Pointer(in.ETCDController)) + out.CustodianController = (*CustodianController)(unsafe.Pointer(in.CustodianController)) + out.BackupCompactionController = (*BackupCompactionController)(unsafe.Pointer(in.BackupCompactionController)) + return nil +} + +// Convert_config_ETCDConfig_To_v1alpha1_ETCDConfig is an autogenerated conversion function. +func Convert_config_ETCDConfig_To_v1alpha1_ETCDConfig(in *config.ETCDConfig, out *ETCDConfig, s conversion.Scope) error { + return autoConvert_config_ETCDConfig_To_v1alpha1_ETCDConfig(in, out, s) +} + +func autoConvert_v1alpha1_ETCDController_To_config_ETCDController(in *ETCDController, out *config.ETCDController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + return nil +} + +// Convert_v1alpha1_ETCDController_To_config_ETCDController is an autogenerated conversion function. +func Convert_v1alpha1_ETCDController_To_config_ETCDController(in *ETCDController, out *config.ETCDController, s conversion.Scope) error { + return autoConvert_v1alpha1_ETCDController_To_config_ETCDController(in, out, s) +} + +func autoConvert_config_ETCDController_To_v1alpha1_ETCDController(in *config.ETCDController, out *ETCDController, s conversion.Scope) error { + out.Workers = (*int64)(unsafe.Pointer(in.Workers)) + return nil +} + +// Convert_config_ETCDController_To_v1alpha1_ETCDController is an autogenerated conversion function. +func Convert_config_ETCDController_To_v1alpha1_ETCDController(in *config.ETCDController, out *ETCDController, s conversion.Scope) error { + return autoConvert_config_ETCDController_To_v1alpha1_ETCDController(in, out, s) +} + func autoConvert_v1alpha1_ExposureClassHandler_To_config_ExposureClassHandler(in *ExposureClassHandler, out *config.ExposureClassHandler, s conversion.Scope) error { out.Name = in.Name if err := Convert_v1alpha1_LoadBalancerServiceConfig_To_config_LoadBalancerServiceConfig(&in.LoadBalancerService, &out.LoadBalancerService, s); err != nil { @@ -762,6 +892,7 @@ func autoConvert_v1alpha1_GardenletConfiguration_To_config_GardenletConfiguratio out.Logging = nil } out.SNI = (*config.SNI)(unsafe.Pointer(in.SNI)) + out.ETCDConfig = (*config.ETCDConfig)(unsafe.Pointer(in.ETCDConfig)) out.ExposureClassHandlers = *(*[]config.ExposureClassHandler)(unsafe.Pointer(&in.ExposureClassHandlers)) out.Monitoring = (*config.MonitoringConfig)(unsafe.Pointer(in.Monitoring)) return nil @@ -844,6 +975,7 @@ func autoConvert_config_GardenletConfiguration_To_v1alpha1_GardenletConfiguratio out.Logging = nil } out.SNI = (*SNI)(unsafe.Pointer(in.SNI)) + out.ETCDConfig = (*ETCDConfig)(unsafe.Pointer(in.ETCDConfig)) out.ExposureClassHandlers = *(*[]ExposureClassHandler)(unsafe.Pointer(&in.ExposureClassHandlers)) out.Monitoring = (*MonitoringConfig)(unsafe.Pointer(in.Monitoring)) return nil @@ -1229,6 +1361,8 @@ func Convert_config_SeedConfig_To_v1alpha1_SeedConfig(in *config.SeedConfig, out func autoConvert_v1alpha1_SeedControllerConfiguration_To_config_SeedControllerConfiguration(in *SeedControllerConfiguration, out *config.SeedControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.LeaseResyncSeconds = (*int32)(unsafe.Pointer(in.LeaseResyncSeconds)) + out.LeaseResyncMissThreshold = (*int32)(unsafe.Pointer(in.LeaseResyncMissThreshold)) return nil } @@ -1240,6 +1374,8 @@ func Convert_v1alpha1_SeedControllerConfiguration_To_config_SeedControllerConfig func autoConvert_config_SeedControllerConfiguration_To_v1alpha1_SeedControllerConfiguration(in *config.SeedControllerConfiguration, out *SeedControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.LeaseResyncSeconds = (*int32)(unsafe.Pointer(in.LeaseResyncSeconds)) + out.LeaseResyncMissThreshold = (*int32)(unsafe.Pointer(in.LeaseResyncMissThreshold)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go index cb9bd3c6a..ae672af80 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -51,6 +51,42 @@ func (in *BackupBucketControllerConfiguration) DeepCopy() *BackupBucketControlle return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupCompactionController) DeepCopyInto(out *BackupCompactionController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + if in.EnableBackupCompaction != nil { + in, out := &in.EnableBackupCompaction, &out.EnableBackupCompaction + *out = new(bool) + **out = **in + } + if in.EventsThreshold != nil { + in, out := &in.EventsThreshold, &out.EventsThreshold + *out = new(int64) + **out = **in + } + if in.ActiveDeadlineDuration != nil { + in, out := &in.ActiveDeadlineDuration, &out.ActiveDeadlineDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupCompactionController. +func (in *BackupCompactionController) DeepCopy() *BackupCompactionController { + if in == nil { + return nil + } + out := new(BackupCompactionController) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackupEntryControllerConfiguration) DeepCopyInto(out *BackupEntryControllerConfiguration) { *out = *in @@ -188,6 +224,79 @@ func (in *ControllerInstallationRequiredControllerConfiguration) DeepCopy() *Con return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustodianController) DeepCopyInto(out *CustodianController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustodianController. +func (in *CustodianController) DeepCopy() *CustodianController { + if in == nil { + return nil + } + out := new(CustodianController) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ETCDConfig) DeepCopyInto(out *ETCDConfig) { + *out = *in + if in.ETCDController != nil { + in, out := &in.ETCDController, &out.ETCDController + *out = new(ETCDController) + (*in).DeepCopyInto(*out) + } + if in.CustodianController != nil { + in, out := &in.CustodianController, &out.CustodianController + *out = new(CustodianController) + (*in).DeepCopyInto(*out) + } + if in.BackupCompactionController != nil { + in, out := &in.BackupCompactionController, &out.BackupCompactionController + *out = new(BackupCompactionController) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ETCDConfig. +func (in *ETCDConfig) DeepCopy() *ETCDConfig { + if in == nil { + return nil + } + out := new(ETCDConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ETCDController) DeepCopyInto(out *ETCDController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ETCDController. +func (in *ETCDController) DeepCopy() *ETCDController { + if in == nil { + return nil + } + out := new(ETCDController) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExposureClassHandler) DeepCopyInto(out *ExposureClassHandler) { *out = *in @@ -380,6 +489,11 @@ func (in *GardenletConfiguration) DeepCopyInto(out *GardenletConfiguration) { *out = new(SNI) (*in).DeepCopyInto(*out) } + if in.ETCDConfig != nil { + in, out := &in.ETCDConfig, &out.ETCDConfig + *out = new(ETCDConfig) + (*in).DeepCopyInto(*out) + } if in.ExposureClassHandlers != nil { in, out := &in.ExposureClassHandlers, &out.ExposureClassHandlers *out = make([]ExposureClassHandler, len(*in)) @@ -831,6 +945,16 @@ func (in *SeedControllerConfiguration) DeepCopyInto(out *SeedControllerConfigura *out = new(v1.Duration) **out = **in } + if in.LeaseResyncSeconds != nil { + in, out := &in.LeaseResyncSeconds, &out.LeaseResyncSeconds + *out = new(int32) + **out = **in + } + if in.LeaseResyncMissThreshold != nil { + in, out := &in.LeaseResyncMissThreshold, &out.LeaseResyncMissThreshold + *out = new(int32) + **out = **in + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go index afdb3b6de..4e43debd6 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go @@ -51,6 +51,42 @@ func (in *BackupBucketControllerConfiguration) DeepCopy() *BackupBucketControlle return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupCompactionController) DeepCopyInto(out *BackupCompactionController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + if in.EnableBackupCompaction != nil { + in, out := &in.EnableBackupCompaction, &out.EnableBackupCompaction + *out = new(bool) + **out = **in + } + if in.EventsThreshold != nil { + in, out := &in.EventsThreshold, &out.EventsThreshold + *out = new(int64) + **out = **in + } + if in.ActiveDeadlineDuration != nil { + in, out := &in.ActiveDeadlineDuration, &out.ActiveDeadlineDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupCompactionController. +func (in *BackupCompactionController) DeepCopy() *BackupCompactionController { + if in == nil { + return nil + } + out := new(BackupCompactionController) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackupEntryControllerConfiguration) DeepCopyInto(out *BackupEntryControllerConfiguration) { *out = *in @@ -188,6 +224,79 @@ func (in *ControllerInstallationRequiredControllerConfiguration) DeepCopy() *Con return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustodianController) DeepCopyInto(out *CustodianController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustodianController. +func (in *CustodianController) DeepCopy() *CustodianController { + if in == nil { + return nil + } + out := new(CustodianController) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ETCDConfig) DeepCopyInto(out *ETCDConfig) { + *out = *in + if in.ETCDController != nil { + in, out := &in.ETCDController, &out.ETCDController + *out = new(ETCDController) + (*in).DeepCopyInto(*out) + } + if in.CustodianController != nil { + in, out := &in.CustodianController, &out.CustodianController + *out = new(CustodianController) + (*in).DeepCopyInto(*out) + } + if in.BackupCompactionController != nil { + in, out := &in.BackupCompactionController, &out.BackupCompactionController + *out = new(BackupCompactionController) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ETCDConfig. +func (in *ETCDConfig) DeepCopy() *ETCDConfig { + if in == nil { + return nil + } + out := new(ETCDConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ETCDController) DeepCopyInto(out *ETCDController) { + *out = *in + if in.Workers != nil { + in, out := &in.Workers, &out.Workers + *out = new(int64) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ETCDController. +func (in *ETCDController) DeepCopy() *ETCDController { + if in == nil { + return nil + } + out := new(ETCDController) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExposureClassHandler) DeepCopyInto(out *ExposureClassHandler) { *out = *in @@ -380,6 +489,11 @@ func (in *GardenletConfiguration) DeepCopyInto(out *GardenletConfiguration) { *out = new(SNI) (*in).DeepCopyInto(*out) } + if in.ETCDConfig != nil { + in, out := &in.ETCDConfig, &out.ETCDConfig + *out = new(ETCDConfig) + (*in).DeepCopyInto(*out) + } if in.ExposureClassHandlers != nil { in, out := &in.ExposureClassHandlers, &out.ExposureClassHandlers *out = make([]ExposureClassHandler, len(*in)) @@ -831,6 +945,16 @@ func (in *SeedControllerConfiguration) DeepCopyInto(out *SeedControllerConfigura *out = new(v1.Duration) **out = **in } + if in.LeaseResyncSeconds != nil { + in, out := &in.LeaseResyncSeconds, &out.LeaseResyncSeconds + *out = new(int32) + **out = **in + } + if in.LeaseResyncMissThreshold != nil { + in, out := &in.LeaseResyncMissThreshold, &out.LeaseResyncMissThreshold + *out = new(int32) + **out = **in + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go index 04619f250..cdae3bf88 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go @@ -25,16 +25,17 @@ var ( // FeatureGate is a shared global FeatureGate for Gardenlet flags. FeatureGate = featuregate.NewFeatureGate() featureGates = map[featuregate.Feature]featuregate.FeatureSpec{ - features.Logging: {Default: false, PreRelease: featuregate.Alpha}, - features.HVPA: {Default: false, PreRelease: featuregate.Alpha}, - features.HVPAForShootedSeed: {Default: false, PreRelease: featuregate.Alpha}, - features.ManagedIstio: {Default: true, PreRelease: featuregate.Beta}, - features.APIServerSNI: {Default: true, PreRelease: featuregate.Beta}, - features.CachedRuntimeClients: {Default: true, PreRelease: featuregate.Beta}, - features.SeedKubeScheduler: {Default: false, PreRelease: featuregate.Alpha}, - features.ReversedVPN: {Default: false, PreRelease: featuregate.Alpha}, - features.UseDNSRecords: {Default: false, PreRelease: featuregate.Alpha}, - features.DenyInvalidExtensionResources: {Default: false, PreRelease: featuregate.Alpha}, + features.Logging: {Default: false, PreRelease: featuregate.Alpha}, + features.HVPA: {Default: false, PreRelease: featuregate.Alpha}, + features.HVPAForShootedSeed: {Default: false, PreRelease: featuregate.Alpha}, + features.ManagedIstio: {Default: true, PreRelease: featuregate.Beta}, + features.APIServerSNI: {Default: true, PreRelease: featuregate.Beta}, + features.CachedRuntimeClients: {Default: true, PreRelease: featuregate.Beta}, + features.SeedKubeScheduler: {Default: false, PreRelease: featuregate.Alpha}, + features.ReversedVPN: {Default: false, PreRelease: featuregate.Alpha}, + features.UseDNSRecords: {Default: false, PreRelease: featuregate.Alpha}, + features.DenyInvalidExtensionResources: {Default: false, PreRelease: featuregate.Alpha}, + features.CopyEtcdBackupsDuringControlPlaneMigration: {Default: false, PreRelease: featuregate.Alpha}, } ) diff --git a/vendor/github.com/gardener/gardener/pkg/logger/logger.go b/vendor/github.com/gardener/gardener/pkg/logger/logger.go new file mode 100644 index 000000000..d90cc6891 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/logger/logger.go @@ -0,0 +1,32 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logger + +import ( + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/util/runtime" + + "github.com/gardener/gardener/pkg/utils" +) + +// IDFieldName is the name of the id field for a logger. +const IDFieldName = "process_id" + +// NewIDLogger extends an existing logger with a randomly generated id field (key `process_id`). +func NewIDLogger(logger logr.Logger) logr.Logger { + id, err := utils.GenerateRandomString(8) + runtime.Must(err) + return logger.WithValues(IDFieldName, id) +} diff --git a/vendor/github.com/gardener/gardener/pkg/logger/logrus.go b/vendor/github.com/gardener/gardener/pkg/logger/logrus.go index 906b7edaa..6dbf6b5b6 100644 --- a/vendor/github.com/gardener/gardener/pkg/logger/logrus.go +++ b/vendor/github.com/gardener/gardener/pkg/logger/logrus.go @@ -19,20 +19,19 @@ import ( "io" "os" - "github.com/gardener/gardener/pkg/utils" - "github.com/sirupsen/logrus" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) // Logger is the standard logger for the Gardener which is used for all messages which are not Shoot // cluster specific. +// Deprecated: use logr for new code! var Logger *logrus.Logger // NewLogger creates a new logrus logger. // It uses STDERR as output channel and evaluates the value of the --log-level command line argument in order // to set the log level. // Example output: time="2017-06-08T13:00:28+02:00" level=info msg="gardener started successfully". +// Deprecated: use logr for new code! func NewLogger(logLevel string, format string) *logrus.Logger { var level logrus.Level @@ -47,12 +46,22 @@ func NewLogger(logLevel string, format string) *logrus.Logger { panic("The specified log level is not supported.") } - var formatter logrus.Formatter + var ( + // for symmetry with zap + fieldMap = logrus.FieldMap{ + logrus.FieldKeyTime: "ts", + logrus.FieldKeyLevel: "level", + logrus.FieldKeyMsg: "msg", + } + timestampFormat = "2006-01-02T15:04:05.000Z0700" // ISO8601 + + formatter logrus.Formatter + ) switch format { case FormatText: - formatter = &logrus.TextFormatter{DisableColors: true} + formatter = &logrus.TextFormatter{DisableColors: true, FieldMap: fieldMap, TimestampFormat: timestampFormat} case "", FormatJSON: - formatter = &logrus.JSONFormatter{DisableHTMLEscape: true} + formatter = &logrus.JSONFormatter{DisableHTMLEscape: true, FieldMap: fieldMap, TimestampFormat: timestampFormat} default: panic("The specified log format is not supported.") } @@ -92,14 +101,3 @@ func NewShootLogger(logger logrus.FieldLogger, shoot, project string) *logrus.En func NewFieldLogger(logger logrus.FieldLogger, fieldKey, fieldValue string) *logrus.Entry { return logger.WithField(fieldKey, fieldValue) } - -// IDFieldName is the name of the id field for a logger. -const IDFieldName = "process_id" - -// NewIDLogger extends an existing logrus logger with a randomly generated id field. -// Example output: time="2017-06-08T13:00:49+02:00" level=info msg="something" id=123abcde. -func NewIDLogger(logger logrus.FieldLogger) logrus.FieldLogger { - id, err := utils.GenerateRandomString(8) - utilruntime.Must(err) - return NewFieldLogger(logger, IDFieldName, id) -} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go index c14697e48..06b161a4e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go @@ -31,16 +31,19 @@ import ( "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns" extensionsdnsrecord "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord" - "github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver" - "github.com/gardener/gardener/pkg/operation/botanist/component/vpnseedserver" "github.com/gardener/gardener/pkg/operation/common" "github.com/gardener/gardener/pkg/utils/imagevector" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" "github.com/gardener/gardener/pkg/utils/secrets" + secretutils "github.com/gardener/gardener/pkg/utils/secrets" versionutils "github.com/gardener/gardener/pkg/utils/version" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + clientcmdlatest "k8s.io/client-go/tools/clientcmd/api/latest" + clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -141,7 +144,7 @@ func (b *Botanist) NeedsIngressDNS() bool { func (b *Botanist) DefaultIngressDNSRecord() extensionsdnsrecord.Interface { values := &extensionsdnsrecord.Values{ Name: b.Shoot.GetInfo().Name + "-" + common.ShootDNSIngressName, - SecretName: b.Shoot.GetInfo().Name + "-" + DNSExternalName, + SecretName: DNSRecordSecretPrefix + "-" + b.Shoot.GetInfo().Name + "-" + DNSExternalName, Namespace: b.Shoot.SeedNamespace, TTL: b.Config.Controllers.Shoot.DNSEntryTTLSeconds, } @@ -269,16 +272,26 @@ func (b *Botanist) DeployManagedResourceForAddons(ctx context.Context) error { } } - return nil + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObject(ctx, b.K8sSeedClient.Client(), &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "kube-proxy", Namespace: b.Shoot.SeedNamespace}}) } // generateCoreAddonsChart renders the gardener-resource-manager configuration for the core addons. After that it // creates a ManagedResource CRD that references the rendered manifests and creates it. func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.RenderedChart, error) { + kubeProxyKubeconfig, err := runtime.Encode(clientcmdlatest.Codec, kutil.NewKubeconfig( + b.Shoot.SeedNamespace, + b.Shoot.ComputeOutOfClusterAPIServerAddress(b.APIServerAddress, true), + b.LoadSecret(v1beta1constants.SecretNameCACluster).Data[secretutils.DataKeyCertificateCA], + clientcmdv1.AuthInfo{TokenFile: "/var/run/secrets/kubernetes.io/serviceaccount/token"}, + )) + if err != nil { + return nil, err + } + var ( - kasFQDN = b.outOfClusterAPIServerFQDN() - kubeProxySecret = b.LoadSecret("kube-proxy") - global = map[string]interface{}{ + kasFQDN = b.outOfClusterAPIServerFQDN() + global = map[string]interface{}{ "kubernetesVersion": b.Shoot.GetInfo().Spec.Kubernetes.Version, "podNetwork": b.Shoot.Networks.Pods.String(), "vpaEnabled": b.Shoot.WantsVerticalPodAutoscaler, @@ -291,7 +304,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "allowPrivilegedContainers": *b.Shoot.GetInfo().Spec.Kubernetes.AllowPrivilegedContainers, } kubeProxyConfig = map[string]interface{}{ - "kubeconfig": kubeProxySecret.Data["kubeconfig"], + "kubeconfig": kubeProxyKubeconfig, "podAnnotations": map[string]interface{}{ "checksum/secret-kube-proxy": b.LoadCheckSum("kube-proxy"), }, @@ -303,12 +316,12 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "application": map[string]interface{}{ "clusterType": "shoot", "admissionController": map[string]interface{}{ - "enableServiceAccount": false, + "createServiceAccount": false, "controlNamespace": b.Shoot.SeedNamespace, }, - "exporter": map[string]interface{}{"enableServiceAccount": false}, - "recommender": map[string]interface{}{"enableServiceAccount": false}, - "updater": map[string]interface{}{"enableServiceAccount": false}, + "exporter": map[string]interface{}{"createServiceAccount": false}, + "recommender": map[string]interface{}{"createServiceAccount": false}, + "updater": map[string]interface{}{"createServiceAccount": false}, }, } @@ -363,19 +376,21 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. } } - var ( - workerPoolKubeProxyImages = make(map[string]workerPoolKubeProxyImage) - kubernetesVersion = b.Shoot.GetInfo().Spec.Kubernetes.Version - ) + workerPoolKubeProxyImages := make(map[string]workerPoolKubeProxyImage) for _, worker := range b.Shoot.GetInfo().Spec.Provider.Workers { - image, err := b.ImageVector.FindImage(charts.ImageNameKubeProxy, imagevector.RuntimeVersion(kubernetesVersion), imagevector.TargetVersion(kubernetesVersion)) + kubernetesVersion, err := gardencorev1beta1helper.CalculateEffectiveKubernetesVersion(b.Shoot.KubernetesVersion, worker.Kubernetes) + if err != nil { + return nil, err + } + + image, err := b.ImageVector.FindImage(charts.ImageNameKubeProxy, imagevector.RuntimeVersion(kubernetesVersion.String()), imagevector.TargetVersion(kubernetesVersion.String())) if err != nil { return nil, err } - key := workerPoolKubeProxyImagesKey(worker.Name, kubernetesVersion) - workerPoolKubeProxyImages[key] = workerPoolKubeProxyImage{worker.Name, kubernetesVersion, image.String()} + key := workerPoolKubeProxyImagesKey(worker.Name, kubernetesVersion.String()) + workerPoolKubeProxyImages[key] = workerPoolKubeProxyImage{worker.Name, kubernetesVersion.String(), image.String()} } nodeList := &corev1.NodeList{} @@ -500,6 +515,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. values := map[string]interface{}{ "global": global, "coredns": common.GenerateAddonConfig(nil, true), + "vpn-shoot": common.GenerateAddonConfig(nil, true), "node-local-dns": common.GenerateAddonConfig(nodelocalDNS, b.Shoot.NodeLocalDNSEnabled), "kube-apiserver-kubelet": common.GenerateAddonConfig(nil, true), "apiserver-proxy": common.GenerateAddonConfig(apiserverProxy, b.APIServerSNIEnabled()), @@ -516,80 +532,6 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "cluster-identity": map[string]interface{}{"clusterIdentity": b.Shoot.GetInfo().Status.ClusterIdentity}, } - if b.Shoot.ReversedVPNEnabled { - var ( - vpnTLSAuthSecret = b.LoadSecret(vpnseedserver.VpnSeedServerTLSAuth) - vpnShootSecret = b.LoadSecret(vpnseedserver.VpnShootSecretName) - vpnShootConfig = map[string]interface{}{ - "endpoint": b.outOfClusterAPIServerFQDN(), - "port": "8132", - "podNetwork": b.Shoot.Networks.Pods.String(), - "serviceNetwork": b.Shoot.Networks.Services.String(), - "tlsAuth": vpnTLSAuthSecret.Data["vpn.tlsauth"], - "vpnShootSecretData": map[string]interface{}{ - "ca": vpnShootSecret.Data["ca.crt"], - "tlsCrt": vpnShootSecret.Data["tls.crt"], - "tlsKey": vpnShootSecret.Data["tls.key"], - }, - "reversedVPN": map[string]interface{}{ - "enabled": true, - "header": "outbound|1194||" + vpnseedserver.ServiceName + "." + b.Shoot.SeedNamespace + ".svc.cluster.local", - }, - "podAnnotations": map[string]interface{}{ - "checksum/secret-vpn-shoot-client": b.LoadCheckSum(vpnseedserver.VpnShootSecretName), - }, - } - ) - - if nodeNetwork != nil { - vpnShootConfig["nodeNetwork"] = *nodeNetwork - } - - vpnShoot, err := b.InjectShootShootImages(vpnShootConfig, charts.ImageNameVpnShootClient) - if err != nil { - return nil, err - } - - values["vpn-shoot"] = common.GenerateAddonConfig(vpnShoot, true) - } else { - var ( - vpnTLSAuthSecret = b.LoadSecret(kubeapiserver.SecretNameVPNSeedTLSAuth) - vpnShootSecret = b.LoadSecret("vpn-shoot") - vpnShootConfig = map[string]interface{}{ - "podNetwork": b.Shoot.Networks.Pods.String(), - "serviceNetwork": b.Shoot.Networks.Services.String(), - "tlsAuth": vpnTLSAuthSecret.Data["vpn.tlsauth"], - "vpnShootSecretData": map[string]interface{}{ - "ca": vpnShootSecret.Data["ca.crt"], - "tlsCrt": vpnShootSecret.Data["tls.crt"], - "tlsKey": vpnShootSecret.Data["tls.key"], - }, - "reversedVPN": map[string]interface{}{ - "enabled": false, - }, - "podAnnotations": map[string]interface{}{ - "checksum/secret-vpn-shoot": b.LoadCheckSum("vpn-shoot"), - }, - } - ) - - // OpenVPN related values - if openvpnDiffieHellmanSecret := b.LoadSecret(v1beta1constants.GardenRoleOpenVPNDiffieHellman); openvpnDiffieHellmanSecret != nil { - vpnShootConfig["diffieHellmanKey"] = openvpnDiffieHellmanSecret.Data["dh2048.pem"] - } - - if nodeNetwork != nil { - vpnShootConfig["nodeNetwork"] = *nodeNetwork - } - - vpnShoot, err := b.InjectShootShootImages(vpnShootConfig, charts.ImageNameVpnShoot) - if err != nil { - return nil, err - } - - values["vpn-shoot"] = common.GenerateAddonConfig(vpnShoot, true) - } - return b.K8sShootClient.ChartRenderer().Render(filepath.Join(charts.Path, "shoot-core", "components"), "shoot-core", metav1.NamespaceSystem, values) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/backupentry.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/backupentry.go index 8a42de1d1..7d488f648 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/backupentry.go @@ -16,16 +16,21 @@ package botanist import ( "context" + "fmt" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - "github.com/gardener/gardener/pkg/operation/botanist/component" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/features" + gardenletfeatures "github.com/gardener/gardener/pkg/gardenlet/features" corebackupentry "github.com/gardener/gardener/pkg/operation/botanist/component/backupentry" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/client" ) // DefaultCoreBackupEntry creates the default deployer for the core.gardener.cloud/v1beta1.BackupEntry resource. -func (b *Botanist) DefaultCoreBackupEntry() component.DeployMigrateWaiter { +func (b *Botanist) DefaultCoreBackupEntry() corebackupentry.Interface { ownerRef := metav1.NewControllerRef(b.Shoot.GetInfo(), gardencorev1beta1.SchemeGroupVersion.WithKind("Shoot")) ownerRef.BlockOwnerDeletion = pointer.Bool(false) @@ -53,3 +58,49 @@ func (b *Botanist) DeployBackupEntry(ctx context.Context) error { } return b.Shoot.Components.BackupEntry.Deploy(ctx) } + +// SourceBackupEntry creates a deployer for a core.gardener.cloud/v1beta1.BackupEntry resource which will be used +// as source when copying etcd backups. +func (b *Botanist) SourceBackupEntry() corebackupentry.Interface { + ownerRef := metav1.NewControllerRef(b.Shoot.GetInfo(), gardencorev1beta1.SchemeGroupVersion.WithKind("Shoot")) + ownerRef.BlockOwnerDeletion = pointer.Bool(false) + + return corebackupentry.New( + b.Logger, + b.K8sGardenClient.Client(), + &corebackupentry.Values{ + Namespace: b.Shoot.GetInfo().Namespace, + Name: fmt.Sprintf("%s-%s", v1beta1constants.BackupSourcePrefix, b.Shoot.BackupEntryName), + ShootPurpose: b.Shoot.GetInfo().Spec.Purpose, + OwnerReference: ownerRef, + SeedName: b.Shoot.GetInfo().Spec.SeedName, + }, + corebackupentry.DefaultInterval, + corebackupentry.DefaultTimeout, + ) +} + +// DeploySourceBackupEntry deploys the source BackupEntry and sets its bucketName to be equal to the bucketName of the shoot's original +// BackupEntry if the source BackupEntry doesn't already exist. +func (b *Botanist) DeploySourceBackupEntry(ctx context.Context) error { + bucketName := b.Shoot.Components.BackupEntry.GetActualBucketName() + if _, err := b.Shoot.Components.SourceBackupEntry.Get(ctx); err == nil { + bucketName = b.Shoot.Components.SourceBackupEntry.GetActualBucketName() + } else if client.IgnoreNotFound(err) != nil { + return err + } + + b.Shoot.Components.SourceBackupEntry.SetBucketName(bucketName) + return b.Shoot.Components.SourceBackupEntry.Deploy(ctx) +} + +// DestroySourceBackupEntry destroys the source BackupEntry. It returns nil if the CopyEtcdBackupsDuringControlPlaneMigration feature gate +// is disabled or the Seed backup is not enabled or the Shoot is in restore phase. +func (b *Botanist) DestroySourceBackupEntry(ctx context.Context) error { + if !gardenletfeatures.FeatureGate.Enabled(features.CopyEtcdBackupsDuringControlPlaneMigration) || + b.Seed.GetInfo().Spec.Backup == nil || !b.isRestorePhase() { + return nil + } + + return b.Shoot.Components.SourceBackupEntry.Destroy(ctx) +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go index 507cc5c67..656662626 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go @@ -107,6 +107,7 @@ func New(ctx context.Context, o *operation.Operation) (*Botanist, error) { } // control plane components + o.Shoot.Components.ControlPlane.EtcdCopyBackupsTask = b.DefaultEtcdCopyBackupsTask() o.Shoot.Components.ControlPlane.EtcdMain, err = b.DefaultEtcd(v1beta1constants.ETCDRoleMain, etcd.ClassImportant) if err != nil { return nil, err @@ -154,19 +155,25 @@ func New(ctx context.Context, o *operation.Operation) (*Botanist, error) { if err != nil { return nil, err } + o.Shoot.Components.SystemComponents.VPNShoot, err = b.DefaultVPNShoot() + if err != nil { + return nil, err + } // other components + o.Shoot.Components.SourceBackupEntry = b.SourceBackupEntry() o.Shoot.Components.BackupEntry = b.DefaultCoreBackupEntry() + o.Shoot.Components.DependencyWatchdogAccess = b.DefaultDependencyWatchdogAccess() + o.Shoot.Components.GardenerAccess = b.DefaultGardenerAccess() o.Shoot.Components.NetworkPolicies, err = b.DefaultNetworkPolicies(sniPhase) if err != nil { return nil, err } // Logging - o.Shoot.Components.Logging.ShootRBACProxy, err = logging.NewKubeRBACProxy(&logging.KubeRBACProxyOptions{ - Client: b.K8sSeedClient.Client(), - Namespace: b.Shoot.SeedNamespace, - IsShootNodeLoggingEnabled: b.isShootNodeLoggingEnabled(), + o.Shoot.Components.Logging.ShootRBACProxy, err = logging.NewKubeRBACProxy(&logging.Values{ + Client: b.K8sSeedClient.Client(), + Namespace: b.Shoot.SeedNamespace, }) if err != nil { return nil, err diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/clusterautoscaler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/clusterautoscaler.go index b1ff2ed49..3dc98f42a 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/clusterautoscaler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/clusterautoscaler.go @@ -18,7 +18,6 @@ import ( "context" "github.com/gardener/gardener/charts" - "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler" "github.com/gardener/gardener/pkg/utils/imagevector" ) @@ -42,9 +41,6 @@ func (b *Botanist) DefaultClusterAutoscaler() (clusterautoscaler.Interface, erro // DeployClusterAutoscaler deploys the Kubernetes cluster-autoscaler. func (b *Botanist) DeployClusterAutoscaler(ctx context.Context) error { if b.Shoot.WantsClusterAutoscaler { - b.Shoot.Components.ControlPlane.ClusterAutoscaler.SetSecrets(clusterautoscaler.Secrets{ - Kubeconfig: component.Secret{Name: clusterautoscaler.SecretName, Checksum: b.LoadCheckSum(clusterautoscaler.SecretName)}, - }) b.Shoot.Components.ControlPlane.ClusterAutoscaler.SetNamespaceUID(b.SeedNamespaceObject.UID) b.Shoot.Components.ControlPlane.ClusterAutoscaler.SetMachineDeployments(b.Shoot.Components.Extensions.Worker.MachineDeployments()) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/backupentry/backupentry.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/backupentry/backupentry.go index 4c3b293ec..cd3635740 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/backupentry/backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/backupentry/backupentry.go @@ -23,6 +23,8 @@ import ( v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/extensions" + "github.com/gardener/gardener/pkg/features" + gardenletfeatures "github.com/gardener/gardener/pkg/gardenlet/features" "github.com/gardener/gardener/pkg/operation/botanist/component" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/kubernetes/health" @@ -68,7 +70,7 @@ func New( values *Values, waitInterval time.Duration, waitTimeout time.Duration, -) component.DeployMigrateWaiter { +) Interface { return &backupEntry{ client: client, logger: logger, @@ -85,6 +87,17 @@ func New( } } +// Interface contains functions for a BackupEntry deployer. +type Interface interface { + component.DeployMigrateWaiter + // Get retrieves and returns the BackupEntry resource based on the configured values. + Get(context.Context) (*gardencorev1beta1.BackupEntry, error) + // GetActualBucketName returns the name of the BackupBucket that this BackupEntry was created with. + GetActualBucketName() string + // SetBucketName sets the name of the BackupBucket for this BackupEntry. + SetBucketName(string) +} + type backupEntry struct { values *Values logger logrus.FieldLogger @@ -150,11 +163,12 @@ func (b *backupEntry) WaitMigrate(ctx context.Context) error { // If the BackupEntry was deleted it will be recreated. func (b *backupEntry) Restore(ctx context.Context, _ *gardencorev1alpha1.ShootState) error { bucketName := b.values.BucketName - - if err := b.client.Get(ctx, kutil.Key(b.values.Namespace, b.values.Name), b.backupEntry); err == nil { - bucketName = b.backupEntry.Spec.BucketName - } else if client.IgnoreNotFound(err) != nil { - return err + if !gardenletfeatures.FeatureGate.Enabled(features.CopyEtcdBackupsDuringControlPlaneMigration) { + if err := b.client.Get(ctx, kutil.Key(b.values.Namespace, b.values.Name), b.backupEntry); err == nil { + bucketName = b.backupEntry.Spec.BucketName + } else if client.IgnoreNotFound(err) != nil { + return err + } } return b.reconcile(ctx, b.backupEntry, b.values.SeedName, bucketName, v1beta1constants.GardenerOperationRestore) } @@ -181,8 +195,32 @@ func (b *backupEntry) reconcile(ctx context.Context, backupEntry *gardencorev1be return err } -// Destroy is not implemented yet. -func (b *backupEntry) Destroy(_ context.Context) error { return nil } +// Destroy deletes the BackupEntry resource +func (b *backupEntry) Destroy(ctx context.Context) error { + return kutil.DeleteObject( + ctx, + b.client, + b.backupEntry, + ) +} // WaitCleanup is not implemented yet. func (b *backupEntry) WaitCleanup(_ context.Context) error { return nil } + +// Get retrieves and returns the BackupEntry resource based on the configured values. +func (b *backupEntry) Get(ctx context.Context) (*gardencorev1beta1.BackupEntry, error) { + if err := b.client.Get(ctx, client.ObjectKeyFromObject(b.backupEntry), b.backupEntry); err != nil { + return nil, err + } + return b.backupEntry, nil +} + +// GetActualBucketName returns the name of the BackupBucket that this BackupEntry was created with. +func (b *backupEntry) GetActualBucketName() string { + return b.backupEntry.Spec.BucketName +} + +// SetBackupBucket sets the name of the BackupBucket for this BackupEntry. +func (b *backupEntry) SetBucketName(name string) { + b.values.BucketName = name +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go index 8698017b1..cf9696af6 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go @@ -21,15 +21,15 @@ import ( gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/utils" + gutil "github.com/gardener/gardener/pkg/utils/gardener" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" - "github.com/gardener/gardener/pkg/utils/secrets" - resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" autoscalingv1beta2 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1beta2" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" @@ -45,26 +46,18 @@ import ( const ( // ServiceName is the name of the service of the cluster-autoscaler. ServiceName = "cluster-autoscaler" - // SecretName is a constant for the secret name for the cluster-autoscaler's kubeconfig secret. - SecretName = "cluster-autoscaler" - // UserName is the name that should be used for the secret that the cluster-autoscaler uses to - // authenticate itself with the kube-apiserver (e.g., the common name in its client certificate). - UserName = "system:cluster-autoscaler" managedResourceTargetName = "shoot-core-cluster-autoscaler" containerName = v1beta1constants.DeploymentNameClusterAutoscaler - portNameMetrics = "metrics" - portMetrics int32 = 8085 - volumeMountPathKubeconfig = "/var/lib/cluster-autoscaler" + portNameMetrics = "metrics" + portMetrics int32 = 8085 ) // Interface contains functions for a cluster-autoscaler deployer. type Interface interface { component.DeployWaiter component.MonitoringComponent - // SetSecrets sets the secrets. - SetSecrets(Secrets) // SetNamespaceUID sets the UID of the namespace into which the cluster-autoscaler shall be deployed. SetNamespaceUID(types.UID) // SetMachineDeployments sets the machine deployments. @@ -95,17 +88,13 @@ type clusterAutoscaler struct { replicas int32 config *gardencorev1beta1.ClusterAutoscaler - secrets Secrets namespaceUID types.UID machineDeployments []extensionsv1alpha1.MachineDeployment } func (c *clusterAutoscaler) Deploy(ctx context.Context) error { - if c.secrets.Kubeconfig.Name == "" || c.secrets.Kubeconfig.Checksum == "" { - return fmt.Errorf("missing kubeconfig secret information") - } - var ( + shootAccessSecret = c.newShootAccessSecret() serviceAccount = c.emptyServiceAccount() clusterRoleBinding = c.emptyClusterRoleBinding() vpa = c.emptyVPA() @@ -116,7 +105,10 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { command = c.computeCommand() ) - if err := c.client.Create(ctx, serviceAccount); kutil.IgnoreAlreadyExists(err) != nil { + if _, err := controllerutils.GetAndCreateOrStrategicMergePatch(ctx, c.client, serviceAccount, func() error { + serviceAccount.AutomountServiceAccountToken = pointer.Bool(false) + return nil + }); err != nil { return err } @@ -162,6 +154,10 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { return err } + if err := shootAccessSecret.Reconcile(ctx, c.client); err != nil { + return err + } + if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, c.client, deployment, func() error { deployment.Labels = utils.MergeStringMaps(getLabels(), map[string]string{ v1beta1constants.GardenRole: v1beta1constants.GardenRoleControlPlane, @@ -172,7 +168,8 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { deployment.Spec.Template = corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "checksum/secret-" + c.secrets.Kubeconfig.Name: c.secrets.Kubeconfig.Checksum, + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", }, Labels: utils.MergeStringMaps(getLabels(), map[string]string{ v1beta1constants.GardenRole: v1beta1constants.GardenRoleControlPlane, @@ -205,7 +202,7 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { }, { Name: "TARGET_KUBECONFIG", - Value: volumeMountPathKubeconfig + "/" + secrets.DataKeyKubeconfig, + Value: gutil.PathGenericKubeconfig, }, }, Resources: corev1.ResourceRequirements{ @@ -218,27 +215,12 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { corev1.ResourceMemory: resource.MustParse("3000Mi"), }, }, - VolumeMounts: []corev1.VolumeMount{ - { - Name: c.secrets.Kubeconfig.Name, - MountPath: volumeMountPathKubeconfig, - ReadOnly: true, - }, - }, - }, - }, - Volumes: []corev1.Volume{ - { - Name: c.secrets.Kubeconfig.Name, - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: c.secrets.Kubeconfig.Name, - }, - }, }, }, }, } + + utilruntime.Must(gutil.InjectGenericKubeconfig(deployment, shootAccessSecret.Secret.Name)) return nil }); err != nil { return err @@ -269,12 +251,18 @@ func (c *clusterAutoscaler) Deploy(ctx context.Context) error { return err } - data, err := c.computeShootResourcesData() + data, err := c.computeShootResourcesData(shootAccessSecret.ServiceAccountName) if err != nil { return err } - return managedresources.CreateForShoot(ctx, c.client, c.namespace, managedResourceTargetName, false, data) + if err := managedresources.CreateForShoot(ctx, c.client, c.namespace, managedResourceTargetName, false, data); err != nil { + return err + } + + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObject(ctx, c.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "cluster-autoscaler", Namespace: c.namespace}}) + } func getLabels() map[string]string { @@ -293,6 +281,7 @@ func (c *clusterAutoscaler) Destroy(ctx context.Context) error { c.emptyVPA(), c.emptyDeployment(), c.emptyClusterRoleBinding(), + c.newShootAccessSecret().Secret, c.emptyService(), c.emptyServiceAccount(), ) @@ -300,7 +289,6 @@ func (c *clusterAutoscaler) Destroy(ctx context.Context) error { func (c *clusterAutoscaler) Wait(_ context.Context) error { return nil } func (c *clusterAutoscaler) WaitCleanup(_ context.Context) error { return nil } -func (c *clusterAutoscaler) SetSecrets(secrets Secrets) { c.secrets = secrets } func (c *clusterAutoscaler) SetNamespaceUID(uid types.UID) { c.namespaceUID = uid } func (c *clusterAutoscaler) SetMachineDeployments(machineDeployments []extensionsv1alpha1.MachineDeployment) { c.machineDeployments = machineDeployments @@ -322,6 +310,10 @@ func (c *clusterAutoscaler) emptyService() *corev1.Service { return &corev1.Service{ObjectMeta: metav1.ObjectMeta{Name: ServiceName, Namespace: c.namespace}} } +func (c *clusterAutoscaler) newShootAccessSecret() *gutil.ShootAccessSecret { + return gutil.NewShootAccessSecret(v1beta1constants.DeploymentNameClusterAutoscaler, c.namespace) +} + func (c *clusterAutoscaler) emptyDeployment() *appsv1.Deployment { return &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: v1beta1constants.DeploymentNameClusterAutoscaler, Namespace: c.namespace}} } @@ -339,7 +331,7 @@ func (c *clusterAutoscaler) computeCommand() []string { command = []string{ "./cluster-autoscaler", fmt.Sprintf("--address=:%d", portMetrics), - fmt.Sprintf("--kubeconfig=%s", volumeMountPathKubeconfig+"/"+secrets.DataKeyKubeconfig), + "--kubeconfig=" + gutil.PathGenericKubeconfig, "--cloud-provider=mcm", "--stderrthreshold=info", "--skip-nodes-with-system-pods=false", @@ -374,13 +366,13 @@ func (c *clusterAutoscaler) computeCommand() []string { return command } -func (c *clusterAutoscaler) computeShootResourcesData() (map[string][]byte, error) { +func (c *clusterAutoscaler) computeShootResourcesData(serviceAccountName string) (map[string][]byte, error) { var ( registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) clusterRole = &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{ - Name: "system:cluster-autoscaler-shoot", + Name: "gardener.cloud:target:cluster-autoscaler", }, Rules: []rbacv1.PolicyRule{ { @@ -461,7 +453,7 @@ func (c *clusterAutoscaler) computeShootResourcesData() (map[string][]byte, erro clusterRoleBinding = &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: "system:cluster-autoscaler-shoot", + Name: "gardener.cloud:target:cluster-autoscaler", }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -469,8 +461,9 @@ func (c *clusterAutoscaler) computeShootResourcesData() (map[string][]byte, erro Name: clusterRole.Name, }, Subjects: []rbacv1.Subject{{ - Kind: rbacv1.UserKind, - Name: UserName, + Kind: rbacv1.ServiceAccountKind, + Name: serviceAccountName, + Namespace: metav1.NamespaceSystem, }}, } ) @@ -480,9 +473,3 @@ func (c *clusterAutoscaler) computeShootResourcesData() (map[string][]byte, erro clusterRoleBinding, ) } - -// Secrets is collection of secrets for the cluster-autoscaler. -type Secrets struct { - // Kubeconfig is a secret which can be used by the cluster-autoscaler to communicate to the kube-apiserver. - Kubeconfig component.Secret -} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go index 10a5680ee..5d8ca42d9 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go @@ -20,13 +20,12 @@ import ( "time" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver" - "github.com/gardener/gardener/pkg/utils" "github.com/gardener/gardener/pkg/utils/managedresources" - resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" appsv1 "k8s.io/api/apps/v1" autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" corev1 "k8s.io/api/core/v1" @@ -161,6 +160,7 @@ func (c *coreDNS) computeResourcesData() (map[string][]byte, error) { Name: "coredns", Namespace: metav1.NamespaceSystem, }, + AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ @@ -344,10 +344,8 @@ import custom/*.server }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Annotations: utils.MergeStringMaps(c.values.PodAnnotations, map[string]string{ - "scheduler.alpha.kubernetes.io/critical-pod": "", - }), - Labels: getLabels(), + Annotations: c.values.PodAnnotations, + Labels: getLabels(), }, Spec: corev1.PodSpec{ Affinity: &corev1.Affinity{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/monitoring.go index 46d62d824..a94a30b57 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/monitoring.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/monitoring.go @@ -79,17 +79,19 @@ var ( monitoringScrapeConfig = `job_name: ` + monitoringPrometheusJobName + ` scheme: https tls_config: - insecure_skip_verify: true - cert_file: /etc/prometheus/seed/prometheus.crt - key_file: /etc/prometheus/seed/prometheus.key + ca_file: /etc/prometheus/seed/ca.crt +authorization: + type: Bearer + credentials_file: /var/run/secrets/gardener.cloud/shoot/token/token honor_labels: false kubernetes_sd_configs: - role: endpoints api_server: https://` + v1beta1constants.DeploymentNameKubeAPIServer + `:` + strconv.Itoa(kubeapiserver.Port) + ` tls_config: ca_file: /etc/prometheus/seed/ca.crt - cert_file: /etc/prometheus/seed/prometheus.crt - key_file: /etc/prometheus/seed/prometheus.key + authorization: + type: Bearer + credentials_file: /var/run/secrets/gardener.cloud/shoot/token/token relabel_configs: - source_labels: - __meta_kubernetes_service_name diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go new file mode 100644 index 000000000..e02969f71 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go @@ -0,0 +1,96 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dependencywatchdog + +import ( + "context" + + "github.com/gardener/gardener/pkg/operation/botanist/component" + gutil "github.com/gardener/gardener/pkg/utils/gardener" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + // ExternalProbeSecretName is the name of the kubecfg secret with internal DNS for external access. + ExternalProbeSecretName = gutil.SecretNamePrefixShootAccess + "dependency-watchdog-external-probe" + // InternalProbeSecretName is the name of the kubecfg secret with cluster IP access. + InternalProbeSecretName = gutil.SecretNamePrefixShootAccess + "dependency-watchdog-internal-probe" +) + +// NewAccess creates a new instance of the deployer for shoot cluster access for the dependency-watchdog. +func NewAccess( + client client.Client, + namespace string, + values AccessValues, +) AccessInterface { + return &dependencyWatchdogAccess{ + client: client, + namespace: namespace, + values: values, + } +} + +// AccessInterface contains functions for deploying access credentials for shoot clusters. +type AccessInterface interface { + component.Deployer + SetCACertificate([]byte) +} + +type dependencyWatchdogAccess struct { + client client.Client + namespace string + values AccessValues +} + +// AccessValues contains configurations for the component. +type AccessValues struct { + // ServerOutOfCluster is the out-of-cluster address of a kube-apiserver. + ServerOutOfCluster string + // ServerInCluster is the in-cluster address of a kube-apiserver. + ServerInCluster string + + caCertificate []byte +} + +func (d *dependencyWatchdogAccess) Deploy(ctx context.Context) error { + for name, server := range map[string]string{ + InternalProbeSecretName: d.values.ServerInCluster, + ExternalProbeSecretName: d.values.ServerOutOfCluster, + } { + var ( + shootAccessSecret = gutil.NewShootAccessSecret(name, d.namespace).WithNameOverride(name) + kubeconfig = kutil.NewKubeconfig(d.namespace, server, d.values.caCertificate, clientcmdv1.AuthInfo{Token: ""}) + ) + + if err := shootAccessSecret.WithKubeconfig(kubeconfig).Reconcile(ctx, d.client); err != nil { + return err + } + } + + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObjects(ctx, d.client, + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "dependency-watchdog-internal-probe", Namespace: d.namespace}}, + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "dependency-watchdog-external-probe", Namespace: d.namespace}}, + ) +} + +func (d *dependencyWatchdogAccess) Destroy(_ context.Context) error { return nil } + +func (d *dependencyWatchdogAccess) SetCACertificate(caCert []byte) { d.values.caCertificate = caCert } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go similarity index 78% rename from vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go rename to vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go index 669a1778e..a35102435 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go @@ -50,17 +50,14 @@ const ( // RoleProbe is a constant for the 'probe' role of the dependency-watchdog. RoleProbe Role = "probe" - // UserName is the user name for client certificates of the dependency-watchdog. - UserName = "gardener.cloud:system:dependency-watchdog" - name = "dependency-watchdog" volumeName = "config" volumeMountPath = "/etc/dependency-watchdog/config" configFileName = "dep-config.yaml" ) -// Values contains dependency-watchdog values. -type Values struct { +// BootstrapperValues contains dependency-watchdog values. +type BootstrapperValues struct { Role Role ValuesEndpoint ValuesProbe @@ -77,42 +74,42 @@ type ValuesProbe struct { ProbeDependantsList scalerapi.ProbeDependantsList } -// New creates a new instance of DeployWaiter for the dependency-watchdog. -func New( +// NewBootstrapper creates a new instance of DeployWaiter for the dependency-watchdog. +func NewBootstrapper( client client.Client, namespace string, - values Values, + values BootstrapperValues, ) component.DeployWaiter { - return &dependencyWatchdog{ + return &bootstrapper{ client: client, namespace: namespace, values: values, } } -type dependencyWatchdog struct { +type bootstrapper struct { client client.Client namespace string - values Values + values BootstrapperValues } -func (d *dependencyWatchdog) Deploy(ctx context.Context) error { +func (b *bootstrapper) Deploy(ctx context.Context) error { var ( config string vpaMinAllowedMemory string err error ) - switch d.values.Role { + switch b.values.Role { case RoleEndpoint: - config, err = restarterapi.Encode(&d.values.ValuesEndpoint.ServiceDependants) + config, err = restarterapi.Encode(&b.values.ValuesEndpoint.ServiceDependants) if err != nil { return err } vpaMinAllowedMemory = "25Mi" case RoleProbe: - config, err = scalerapi.Encode(&d.values.ValuesProbe.ProbeDependantsList) + config, err = scalerapi.Encode(&b.values.ValuesProbe.ProbeDependantsList) if err != nil { return err } @@ -121,9 +118,9 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { configMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: d.name() + "-config", - Namespace: d.namespace, - Labels: map[string]string{v1beta1constants.LabelApp: d.name()}, + Name: b.name() + "-config", + Namespace: b.namespace, + Labels: map[string]string{v1beta1constants.LabelApp: b.name()}, }, Data: map[string]string{configFileName: config}, } @@ -134,21 +131,22 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { serviceAccount = &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: d.name(), - Namespace: d.namespace, + Name: b.name(), + Namespace: b.namespace, }, + AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:cluster-role", d.name()), + Name: fmt.Sprintf("gardener.cloud:%s:cluster-role", b.name()), }, - Rules: d.clusterRoleRules(), + Rules: b.clusterRoleRules(), } clusterRoleBinding = &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:cluster-role-binding", d.name()), + Name: fmt.Sprintf("gardener.cloud:%s:cluster-role-binding", b.name()), }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -164,8 +162,8 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { role = &rbacv1.Role{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:role", d.name()), - Namespace: d.namespace, + Name: fmt.Sprintf("gardener.cloud:%s:role", b.name()), + Namespace: b.namespace, }, Rules: []rbacv1.PolicyRule{ { @@ -178,8 +176,8 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { roleBinding = &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:role-binding", d.name()), - Namespace: d.namespace, + Name: fmt.Sprintf("gardener.cloud:%s:role-binding", b.name()), + Namespace: b.namespace, }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -195,26 +193,30 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { deployment = &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ - Name: d.name(), - Namespace: d.namespace, - Labels: d.getLabels(), + Name: b.name(), + Namespace: b.namespace, + Labels: b.getLabels(), }, Spec: appsv1.DeploymentSpec{ Replicas: pointer.Int32(1), RevisionHistoryLimit: pointer.Int32(2), - Selector: &metav1.LabelSelector{MatchLabels: d.getLabels()}, + Selector: &metav1.LabelSelector{MatchLabels: b.getLabels()}, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: d.podLabels(), + Annotations: map[string]string{ + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, + Labels: b.podLabels(), }, Spec: corev1.PodSpec{ ServiceAccountName: serviceAccount.Name, TerminationGracePeriodSeconds: pointer.Int64(5), Containers: []corev1.Container{{ Name: name, - Image: d.values.Image, + Image: b.values.Image, ImagePullPolicy: corev1.PullIfNotPresent, - Command: d.containerCommand(), + Command: b.containerCommand(), Ports: []corev1.ContainerPort{{ Name: "metrics", ContainerPort: 9643, @@ -254,8 +256,8 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { updateMode = autoscalingv1beta2.UpdateModeAuto vpa = &autoscalingv1beta2.VerticalPodAutoscaler{ ObjectMeta: metav1.ObjectMeta{ - Name: d.name() + "-vpa", - Namespace: d.namespace, + Name: b.name() + "-vpa", + Namespace: b.namespace, }, Spec: autoscalingv1beta2.VerticalPodAutoscalerSpec{ TargetRef: &autoscalingv1.CrossVersionObjectReference{ @@ -295,41 +297,41 @@ func (d *dependencyWatchdog) Deploy(ctx context.Context) error { return err } - return managedresources.CreateForSeed(ctx, d.client, d.namespace, d.name(), false, resources) + return managedresources.CreateForSeed(ctx, b.client, b.namespace, b.name(), false, resources) } -func (d *dependencyWatchdog) Destroy(ctx context.Context) error { - return managedresources.DeleteForSeed(ctx, d.client, d.namespace, d.name()) +func (b *bootstrapper) Destroy(ctx context.Context) error { + return managedresources.DeleteForSeed(ctx, b.client, b.namespace, b.name()) } // TimeoutWaitForManagedResource is the timeout used while waiting for the ManagedResources to become healthy // or deleted. var TimeoutWaitForManagedResource = 2 * time.Minute -func (d *dependencyWatchdog) Wait(ctx context.Context) error { +func (b *bootstrapper) Wait(ctx context.Context) error { timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) defer cancel() - return managedresources.WaitUntilHealthy(timeoutCtx, d.client, d.namespace, d.name()) + return managedresources.WaitUntilHealthy(timeoutCtx, b.client, b.namespace, b.name()) } -func (d *dependencyWatchdog) WaitCleanup(ctx context.Context) error { +func (b *bootstrapper) WaitCleanup(ctx context.Context) error { timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) defer cancel() - return managedresources.WaitUntilDeleted(timeoutCtx, d.client, d.namespace, d.name()) + return managedresources.WaitUntilDeleted(timeoutCtx, b.client, b.namespace, b.name()) } -func (d *dependencyWatchdog) name() string { - return fmt.Sprintf("%s-%s", name, d.values.Role) +func (b *bootstrapper) name() string { + return fmt.Sprintf("%s-%s", name, b.values.Role) } -func (d *dependencyWatchdog) getLabels() map[string]string { - return map[string]string{v1beta1constants.LabelRole: d.name()} +func (b *bootstrapper) getLabels() map[string]string { + return map[string]string{v1beta1constants.LabelRole: b.name()} } -func (d *dependencyWatchdog) clusterRoleRules() []rbacv1.PolicyRule { - switch d.values.Role { +func (b *bootstrapper) clusterRoleRules() []rbacv1.PolicyRule { + switch b.values.Role { case RoleEndpoint: return []rbacv1.PolicyRule{ { @@ -367,16 +369,16 @@ func (d *dependencyWatchdog) clusterRoleRules() []rbacv1.PolicyRule { return nil } -func (d *dependencyWatchdog) podLabels() map[string]string { - switch d.values.Role { +func (b *bootstrapper) podLabels() map[string]string { + switch b.values.Role { case RoleEndpoint: - return utils.MergeStringMaps(d.getLabels(), map[string]string{ + return utils.MergeStringMaps(b.getLabels(), map[string]string{ v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, }) case RoleProbe: - return utils.MergeStringMaps(d.getLabels(), map[string]string{ + return utils.MergeStringMaps(b.getLabels(), map[string]string{ v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToAllShootAPIServers: v1beta1constants.LabelNetworkPolicyAllowed, @@ -388,13 +390,13 @@ func (d *dependencyWatchdog) podLabels() map[string]string { return nil } -func (d *dependencyWatchdog) containerCommand() []string { - switch d.values.Role { +func (b *bootstrapper) containerCommand() []string { + switch b.values.Role { case RoleEndpoint: return []string{ "/usr/local/bin/dependency-watchdog", fmt.Sprintf("--config-file=%s/%s", volumeMountPath, configFileName), - "--deployed-namespace=" + d.namespace, + "--deployed-namespace=" + b.namespace, "--watch-duration=5m", } @@ -403,7 +405,7 @@ func (d *dependencyWatchdog) containerCommand() []string { "/usr/local/bin/dependency-watchdog", "probe", fmt.Sprintf("--config-file=%s/%s", volumeMountPath, configFileName), - "--deployed-namespace=" + d.namespace, + "--deployed-namespace=" + b.namespace, "--qps=20.0", "--burst=100", "--v=4", diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/bootstrap.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/bootstrap.go index 84af084c6..3cf6ec08f 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/bootstrap.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/bootstrap.go @@ -17,10 +17,12 @@ package etcd import ( "context" "fmt" + "strconv" "time" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" "github.com/gardener/gardener/pkg/client/kubernetes" + "github.com/gardener/gardener/pkg/gardenlet/apis/config" "github.com/gardener/gardener/pkg/operation/botanist/component" gutil "github.com/gardener/gardener/pkg/utils/gardener" "github.com/gardener/gardener/pkg/utils/imagevector" @@ -31,6 +33,8 @@ import ( "github.com/gardener/gardener/pkg/resourcemanager/controller/garbagecollector/references" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" + batchv1 "k8s.io/api/batch/v1" + batchv1beta1 "k8s.io/api/batch/v1beta1" coordinationv1 "k8s.io/api/coordination/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" @@ -62,10 +66,11 @@ const ( ) // NewBootstrapper creates a new instance of DeployWaiter for the etcd bootstrapper. -func NewBootstrapper(c client.Client, namespace string, image string, imageVectorOverwrite *string) component.DeployWaiter { +func NewBootstrapper(c client.Client, namespace string, config *config.GardenletConfiguration, image string, imageVectorOverwrite *string) component.DeployWaiter { return &bootstrapper{ client: c, namespace: namespace, + config: config, image: image, imageVectorOverwrite: imageVectorOverwrite, } @@ -74,6 +79,7 @@ func NewBootstrapper(c client.Client, namespace string, image string, imageVecto type bootstrapper struct { client client.Client namespace string + config *config.GardenletConfiguration image string imageVectorOverwrite *string } @@ -89,6 +95,7 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { Namespace: b.namespace, Labels: labels(), }, + AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ @@ -112,31 +119,45 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { Resources: []string{"events"}, Verbs: []string{"create", "get", "list", "watch", "patch", "update"}, }, + { + APIGroups: []string{corev1.GroupName}, + Resources: []string{"serviceaccounts"}, + Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}, + }, + { + APIGroups: []string{rbacv1.GroupName}, + Resources: []string{"roles", "rolebindings"}, + Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}, + }, { APIGroups: []string{corev1.GroupName, appsv1.GroupName}, Resources: []string{"services", "configmaps", "statefulsets"}, Verbs: []string{"get", "list", "patch", "update", "watch", "create", "delete"}, }, + { + APIGroups: []string{batchv1.GroupName}, + Resources: []string{"jobs"}, + Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}, + }, + { + APIGroups: []string{batchv1beta1.GroupName}, + Resources: []string{"cronjobs"}, + Verbs: []string{"get", "list", "watch", "delete"}, + }, { APIGroups: []string{druidv1alpha1.GroupVersion.Group}, - Resources: []string{"etcds"}, - Verbs: []string{"get", "list", "watch", "update", "patch"}, + Resources: []string{"etcds", "etcdcopybackupstasks"}, + Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}, }, { APIGroups: []string{druidv1alpha1.GroupVersion.Group}, - Resources: []string{"etcds/status", "etcds/finalizers"}, + Resources: []string{"etcds/status", "etcds/finalizers", "etcdcopybackupstasks/status", "etcdcopybackupstasks/finalizers"}, Verbs: []string{"get", "update", "patch", "create"}, }, { APIGroups: []string{coordinationv1.GroupName}, Resources: []string{"leases"}, - Verbs: []string{"create"}, - }, - { - APIGroups: []string{coordinationv1.GroupName}, - Resources: []string{"leases"}, - ResourceNames: []string{"druid-leader-election"}, - Verbs: []string{"get", "update", "patch"}, + Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}, }, { APIGroups: []string{corev1.GroupName}, @@ -215,6 +236,10 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, Labels: labels(), }, Spec: corev1.PodSpec{ @@ -224,12 +249,7 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { Name: Druid, Image: b.image, ImagePullPolicy: corev1.PullIfNotPresent, - Command: []string{ - "/bin/etcd-druid", - "--enable-leader-election=true", - "--ignore-operation-annotation=false", - "--workers=50", - }, + Command: getDruidDeployCommands(b.config), Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ corev1.ResourceCPU: resource.MustParse("50m"), @@ -291,10 +311,47 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { return err } resources["crd.yaml"] = []byte(CrdYAML) + resources["crdEtcdCopyBackupsTask.yaml"] = []byte(etcdCopyBackupsTaskCRDYaml) return managedresources.CreateForSeed(ctx, b.client, b.namespace, managedResourceControlName, false, resources) } +func getDruidDeployCommands(gardenletConf *config.GardenletConfiguration) []string { + command := []string{"" + "/bin/etcd-druid"} + command = append(command, "--enable-leader-election=true") + command = append(command, "--ignore-operation-annotation=false") + if gardenletConf == nil { + // TODO(abdasgupta): Following line to add 50 workers is only for backward compatibility. Please, remove. + command = append(command, "--workers=50") + return command + } + + config := gardenletConf.ETCDConfig + if config == nil { + // TODO(abdasgupta): Following line to add 50 workers is only for backward compatibility. Please, remove. + command = append(command, "--workers=50") + return command + } + if config.ETCDController != nil { + command = append(command, "--workers="+strconv.FormatInt(pointer.Int64Deref(config.ETCDController.Workers, 50), 10)) + } + + if config.CustodianController != nil { + command = append(command, "--custodian-workers="+strconv.FormatInt(pointer.Int64Deref(config.CustodianController.Workers, 10), 10)) + } + + if config.BackupCompactionController != nil { + command = append(command, "--compaction-workers="+strconv.FormatInt(pointer.Int64Deref(config.BackupCompactionController.Workers, 3), 10)) + command = append(command, "--enable-backup-compaction="+strconv.FormatBool(pointer.BoolDeref(config.BackupCompactionController.EnableBackupCompaction, false))) + command = append(command, "--etcd-events-threshold="+strconv.FormatInt(pointer.Int64Deref(config.BackupCompactionController.EventsThreshold, 1000000), 10)) + if config.BackupCompactionController.ActiveDeadlineDuration != nil { + command = append(command, "--active-deadline-duration="+config.BackupCompactionController.ActiveDeadlineDuration.Duration.String()) + } + } + + return command +} + func (b *bootstrapper) Destroy(ctx context.Context) error { etcdList := &druidv1alpha1.EtcdList{} // Need to check for both error types. The DynamicRestMapper can hold a stale cache returning a path to a non-existing api-resource leading to a NotFound error. @@ -310,6 +367,19 @@ func (b *bootstrapper) Destroy(ctx context.Context) error { return err } + etcdCopyBackupsTaskList := &druidv1alpha1.EtcdCopyBackupsTaskList{} + if err := b.client.List(ctx, etcdCopyBackupsTaskList); err != nil && !meta.IsNoMatchError(err) && !apierrors.IsNotFound(err) { + return err + } + + if len(etcdCopyBackupsTaskList.Items) > 0 { + return fmt.Errorf("cannot debootstrap etcd-druid because there are still druidv1alpha1.EtcdCopyBackupsTask resources left in the cluster") + } + + if err := gutil.ConfirmDeletion(ctx, b.client, &apiextensionsv1.CustomResourceDefinition{ObjectMeta: metav1.ObjectMeta{Name: etcdCopyBackupsTaskCRDName}}); client.IgnoreNotFound(err) != nil { + return err + } + return managedresources.DeleteForSeed(ctx, b.client, b.namespace, managedResourceControlName) } @@ -365,10 +435,14 @@ spec: description: Etcd is the Schema for the etcds API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object @@ -380,15 +454,40 @@ spec: type: string type: object backup: - description: BackupSpec defines parametes associated with the full and delta snapshots of etcd + description: BackupSpec defines parametes associated with the full + and delta snapshots of etcd properties: + compactionResources: + description: 'CompactionResources defines the compute Resources required by compaction job. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + type: object compression: - description: SnapshotCompression defines the specification for compression of Snapshots. + description: SnapshotCompression defines the specification for + compression of Snapshots. properties: enabled: type: boolean policy: - description: CompressionPolicy defines the type of policy for compression of snapshots. + description: CompressionPolicy defines the type of policy + for compression of snapshots. enum: - gzip - lzw @@ -399,20 +498,39 @@ spec: anyOf: - type: integer - type: string - description: DeltaSnapshotMemoryLimit defines the memory limit after which delta snapshots will be taken + description: DeltaSnapshotMemoryLimit defines the memory limit + after which delta snapshots will be taken pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true deltaSnapshotPeriod: - description: DeltaSnapshotPeriod defines the period after which delta snapshots will be taken + description: DeltaSnapshotPeriod defines the period after which + delta snapshots will be taken + type: string + enableProfiling: + description: EnableProfiling defines if profiling should be enabled + for the etcd-backup-restore-sidecar + type: boolean + etcdSnapshotTimeout: + description: EtcdSnapshotTimeout defines the timeout duration + for etcd FullSnapshot operation type: string fullSnapshotSchedule: - description: FullSnapshotSchedule defines the cron standard schedule for full snapshots. + description: FullSnapshotSchedule defines the cron standard schedule + for full snapshots. + type: string + enableProfiling: + description: EnableProfiling defines if profiling should be enabled for the etcd-backup-restore-sidecar + type: boolean + etcdSnapshotTimeout: + description: EtcdSnapshotTimeout defines the timeout duration for etcd FullSnapshot operation type: string garbageCollectionPeriod: - description: GarbageCollectionPeriod defines the period for garbage collecting old backups + description: GarbageCollectionPeriod defines the period for garbage + collecting old backups type: string garbageCollectionPolicy: - description: GarbageCollectionPolicy defines the policy for garbage collecting old backups + description: GarbageCollectionPolicy defines the policy for garbage + collecting old backups enum: - Exponential - LimitBased @@ -420,12 +538,36 @@ spec: image: description: Image defines the etcd container image and tag type: string + ownerCheck: + description: OwnerCheck defines parameters related to checking if the cluster owner, as specified in the owner DNS record, is the expected one. + properties: + dnsCacheTTL: + description: DNSCacheTTL is the DNS cache TTL for owner checks. + type: string + id: + description: ID is the owner id value that is expected to be found in the owner DNS record. + type: string + interval: + description: Interval is the time interval between owner checks. + type: string + name: + description: Name is the domain name of the owner DNS record. + type: string + timeout: + description: Timeout is the timeout for owner checks. + type: string + required: + - id + - name + type: object port: - description: Port define the port on which etcd-backup-restore server will exposed. + description: Port define the port on which etcd-backup-restore + server will exposed. format: int32 type: integer resources: - description: 'Resources defines the compute Resources required by backup-restore container. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Resources defines the compute Resources required + by backup-restore container. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' properties: limits: additionalProperties: @@ -434,7 +576,8 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object requests: additionalProperties: @@ -443,27 +586,35 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object store: - description: Store defines the specification of object store provider for storing backups. + description: Store defines the specification of object store provider + for storing backups. properties: container: + description: Container is the name of the container the backup is stored at. type: string prefix: + description: Prefix is the prefix used for the store. type: string provider: - description: StorageProvider defines the type of object store provider for storing backups. + description: Provider is the name of the backup provider. type: string secretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretRef is the reference to the secret which used to connect to the backup store. properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object required: @@ -473,33 +624,42 @@ spec: description: TLSConfig hold the TLS configuration details. properties: clientTLSSecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object serverTLSSecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object tlsCASecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object required: @@ -512,26 +672,30 @@ spec: description: EtcdConfig defines parameters associated etcd deployed properties: authSecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. It + has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which the + secret name must be unique. type: string type: object clientPort: format: int32 type: integer - defragmentationSchedule: - description: DefragmentationSchedule defines the cron standard schedule for defragmentation of etcd. + etcdDefragTimeout: + description: EtcdDefragTimeout defines the timeout duration for etcd defrag call type: string image: description: Image defines the etcd container image and tag type: string metrics: - description: Metrics defines the level of detail for exported metrics of etcd, specify 'extensive' to include histogram metrics. + description: Metrics defines the level of detail for exported + metrics of etcd, specify 'extensive' to include histogram metrics. enum: - basic - extensive @@ -544,7 +708,8 @@ spec: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true resources: - description: 'Resources defines the compute Resources required by etcd container. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Resources defines the compute Resources required + by etcd container. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' properties: limits: additionalProperties: @@ -553,7 +718,8 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object requests: additionalProperties: @@ -562,7 +728,10 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object serverPort: @@ -572,33 +741,42 @@ spec: description: TLSConfig hold the TLS configuration details. properties: clientTLSSecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object serverTLSSecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object tlsCASecretRef: - description: SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace + description: SecretReference represents a Secret Reference. + It has enough information to retrieve secret in any namespace properties: name: - description: Name is unique within a namespace to reference a secret resource. + description: Name is unique within a namespace to reference + a secret resource. type: string namespace: - description: Namespace defines the space within which the secret name must be unique. + description: Namespace defines the space within which + the secret name must be unique. type: string type: object required: @@ -612,26 +790,39 @@ spec: type: string type: object priorityClassName: - description: PriorityClassName is the name of a priority class that shall be used for the etcd pods. + description: PriorityClassName is the name of a priority class that + shall be used for the etcd pods. type: string replicas: type: integer selector: - description: 'selector is a label query over pods that should match the replica count. It must match the pod template''s labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + description: 'selector is a label query over pods that should match + the replica count. It must match the pod template''s labels. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' properties: matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + description: A label selector requirement is a selector that + contains values, a key, and an operator that relates the key + and values. properties: key: - description: key is the label key that the selector applies to. + description: key is the label key that the selector applies + to. type: string operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + description: operator represents a key's relationship to + a set of values. Valid operators are In, NotIn, Exists + and DoesNotExist. type: string values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + description: values is an array of string values. If the + operator is In or NotIn, the values array must be non-empty. + If the operator is Exists or DoesNotExist, the values + array must be empty. This array is replaced during a strategic + merge patch. items: type: string type: array @@ -643,20 +834,29 @@ spec: matchLabels: additionalProperties: type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + description: matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels map is equivalent to an element + of matchExpressions, whose key field is "key", the operator + is "In", and the values array contains only "value". The requirements + are ANDed. type: object type: object sharedConfig: - description: SharedConfig defines parameters shared and used by Etcd as well as backup-restore sidecar. + description: SharedConfig defines parameters shared and used by Etcd + as well as backup-restore sidecar. properties: autoCompactionMode: - description: AutoCompactionMode defines the auto-compaction-mode:'periodic' mode or 'revision' mode for etcd and embedded-Etcd of backup-restore sidecar. + description: AutoCompactionMode defines the auto-compaction-mode:'periodic' + mode or 'revision' mode for etcd and embedded-Etcd of backup-restore + sidecar. enum: - periodic - revision type: string autoCompactionRetention: - description: AutoCompactionRetention defines the auto-compaction-retention length for etcd as well as for embedded-Etcd of backup-restore sidecar. + description: AutoCompactionRetention defines the auto-compaction-retention + length for etcd as well as for embedded-Etcd of backup-restore + sidecar. type: string type: object storageCapacity: @@ -667,10 +867,12 @@ spec: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true storageClass: - description: 'StorageClass defines the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + description: 'StorageClass defines the name of the StorageClass required + by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' type: string volumeClaimTemplate: - description: VolumeClaimTemplate defines the volume claim template to be created + description: VolumeClaimTemplate defines the volume claim template + to be created type: string required: - backup @@ -680,14 +882,21 @@ spec: - selector type: object status: - description: EtcdStatus defines the observed state of Etcd + description: EtcdStatus defines the observed state of Etcd. properties: + clusterSize: + description: Cluster size is the size of the etcd cluster. + format: int32 + type: integer conditions: + description: Conditions represents the latest available observations of an etcd's current state. items: - description: Condition holds the information about the state of a resource. + description: Condition holds the information about the state of + a resource. properties: lastTransitionTime: - description: Last time the condition transitioned from one status to another. + description: Last time the condition transitioned from one status + to another. format: date-time type: string lastUpdateTime: @@ -695,7 +904,8 @@ spec: format: date-time type: string message: - description: A human readable message indicating details about the transition. + description: A human readable message indicating details about + the transition. type: string reason: description: The reason for the condition's last transition. @@ -706,13 +916,22 @@ spec: type: description: Type of the Etcd condition. type: string + required: + - lastTransitionTime + - lastUpdateTime + - message + - reason + - status + - type type: object type: array currentReplicas: + description: CurrentReplicas is the current replica count for the etcd cluster. format: int32 type: integer etcd: - description: CrossVersionObjectReference contains enough information to let you identify the referred resource. + description: CrossVersionObjectReference contains enough information + to let you identify the referred resource. properties: apiVersion: description: API version of the referent @@ -725,21 +944,31 @@ spec: type: string type: object labelSelector: - description: selector is a label query over pods that should match the replica count. It must match the pod template's labels. + description: LabelSelector is a label query over pods that should match the replica count. It must match the pod template's labels. properties: matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + description: A label selector requirement is a selector that + contains values, a key, and an operator that relates the key + and values. properties: key: - description: key is the label key that the selector applies to. + description: key is the label key that the selector applies + to. type: string operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + description: operator represents a key's relationship to + a set of values. Valid operators are In, NotIn, Exists + and DoesNotExist. type: string values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + description: values is an array of string values. If the + operator is In or NotIn, the values array must be non-empty. + If the operator is Exists or DoesNotExist, the values + array must be empty. This array is replaced during a strategic + merge patch. items: type: string type: array @@ -751,26 +980,68 @@ spec: matchLabels: additionalProperties: type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + description: matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels map is equivalent to an element + of matchExpressions, whose key field is "key", the operator + is "In", and the values array contains only "value". The requirements + are ANDed. type: object type: object lastError: + description: LastError represents the last occurred error. type: string + members: + description: Members represents the members of the etcd cluster + items: + description: EtcdMemberStatus holds information about a etcd cluster membership. + properties: + id: + description: ID is the ID of the etcd member. + type: string + lastTransitionTime: + description: LastTransitionTime is the last time the condition's status changed. + format: date-time + type: string + name: + description: Name is the name of the etcd member. It is the name of the backing Pod. + type: string + reason: + description: The reason for the condition's last transition. + type: string + role: + description: Role is the role in the etcd cluster, either Leader or Member. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + required: + - lastTransitionTime + - name + - reason + - status + type: object + type: array observedGeneration: - description: ObservedGeneration is the most recent generation observed for this resource. + description: ObservedGeneration is the most recent generation observed + for this resource. format: int64 type: integer ready: + description: Ready represents the readiness of the etcd resource. type: boolean readyReplicas: + description: ReadyReplicas is the count of replicas being ready in the etcd cluster. format: int32 type: integer replicas: + description: Replicas is the replica count of the etcd resource. format: int32 type: integer serviceName: + description: ServiceName is the name of the etcd service. type: string updatedReplicas: + description: UpdatedReplicas is the count of updated replicas in the etcd cluster. format: int32 type: integer type: object @@ -783,5 +1054,198 @@ spec: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas status: {} +` + etcdCopyBackupsTaskCRDName = "etcdcopybackupstasks.druid.gardener.cloud" + etcdCopyBackupsTaskCRDYaml = `apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + name: ` + etcdCopyBackupsTaskCRDName + ` + labels: + ` + gutil.DeletionProtected + `: "true" +spec: + group: druid.gardener.cloud + names: + kind: EtcdCopyBackupsTask + listKind: EtcdCopyBackupsTaskList + plural: etcdcopybackupstasks + singular: etcdcopybackupstask + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: EtcdCopyBackupsTask is a task for copying etcd backups from a + source to a target store. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: EtcdCopyBackupsTaskSpec defines the parameters for the copy + backups task. + properties: + maxBackupAge: + description: MaxBackupAge is the maximum age in days that a backup + must have in order to be copied. By default all backups will be + copied. + format: int32 + type: integer + maxBackups: + description: MaxBackups is the maximum number of backups that will + be copied starting with the most recent ones. + format: int32 + type: integer + sourceStore: + description: SourceStore defines the specification of the source object + store provider for storing backups. + properties: + container: + description: Container is the name of the container the backup + is stored at. + type: string + prefix: + description: Prefix is the prefix used for the store. + type: string + provider: + description: Provider is the name of the backup provider. + type: string + secretRef: + description: SecretRef is the reference to the secret which used + to connect to the backup store. + properties: + name: + description: Name is unique within a namespace to reference + a secret resource. + type: string + namespace: + description: Namespace defines the space within which the + secret name must be unique. + type: string + type: object + required: + - prefix + type: object + targetStore: + description: TargetStore defines the specification of the target object + store provider for storing backups. + properties: + container: + description: Container is the name of the container the backup + is stored at. + type: string + prefix: + description: Prefix is the prefix used for the store. + type: string + provider: + description: Provider is the name of the backup provider. + type: string + secretRef: + description: SecretRef is the reference to the secret which used + to connect to the backup store. + properties: + name: + description: Name is unique within a namespace to reference + a secret resource. + type: string + namespace: + description: Namespace defines the space within which the + secret name must be unique. + type: string + type: object + required: + - prefix + type: object + waitForFinalSnapshot: + description: WaitForFinalSnapshot defines the parameters for waiting + for a final full snapshot before copying backups. + properties: + enabled: + description: Enabled specifies whether to wait for a final full + snapshot before copying backups. + type: boolean + timeout: + description: Timeout is the timeout for waiting for a final full + snapshot. When this timeout expires, the copying of backups + will be performed anyway. No timeout or 0 means wait forever. + type: string + required: + - enabled + type: object + required: + - sourceStore + - targetStore + type: object + status: + description: EtcdCopyBackupsTaskStatus defines the observed state of the + copy backups task. + properties: + conditions: + description: Conditions represents the latest available observations + of an object's current state. + items: + description: Condition holds the information about the state of + a resource. + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + lastUpdateTime: + description: Last time the condition was updated. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of the Etcd condition. + type: string + required: + - lastTransitionTime + - lastUpdateTime + - message + - reason + - status + - type + type: object + type: array + lastError: + description: LastError represents the last occurred error. + type: string + observedGeneration: + description: ObservedGeneration is the most recent generation observed + for this resource. + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} ` ) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go index b1d3c9296..f7556296f 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go @@ -109,6 +109,10 @@ type Interface interface { SetBackupConfig(config *BackupConfig) // SetHVPAConfig sets the HVPA configuration. SetHVPAConfig(config *HVPAConfig) + // Get retrieves the Etcd resource + Get(context.Context) (*druidv1alpha1.Etcd, error) + // SetOwnerCheckConfig sets the owner check configuration. + SetOwnerCheckConfig(config *OwnerCheckConfig) } // New creates a new instance of DeployWaiter for the Etcd. @@ -160,9 +164,10 @@ type etcd struct { etcd *druidv1alpha1.Etcd - secrets Secrets - backupConfig *BackupConfig - hvpaConfig *HVPAConfig + secrets Secrets + backupConfig *BackupConfig + hvpaConfig *HVPAConfig + ownerCheckConfig *OwnerCheckConfig } func (e *etcd) Deploy(ctx context.Context) error { @@ -180,9 +185,8 @@ func (e *etcd) Deploy(ctx context.Context) error { networkPolicy = e.emptyNetworkPolicy() hvpa = e.emptyHVPA() - existingEtcd *druidv1alpha1.Etcd - existingSts = &appsv1.StatefulSet{} - foundEtcd, foundSts bool + existingEtcd *druidv1alpha1.Etcd + existingSts *appsv1.StatefulSet ) if err := e.client.Get(ctx, client.ObjectKeyFromObject(e.etcd), e.etcd); err != nil { @@ -190,31 +194,31 @@ func (e *etcd) Deploy(ctx context.Context) error { return err } } else { - foundEtcd = true existingEtcd = e.etcd.DeepCopy() } stsName := e.etcd.Name - if foundEtcd && existingEtcd.Status.Etcd != nil && existingEtcd.Status.Etcd.Name != "" { + if existingEtcd != nil && existingEtcd.Status.Etcd != nil && existingEtcd.Status.Etcd.Name != "" { stsName = existingEtcd.Status.Etcd.Name } - if err := e.client.Get(ctx, client.ObjectKey{Namespace: e.namespace, Name: stsName}, existingSts); err != nil { + var sts appsv1.StatefulSet + if err := e.client.Get(ctx, client.ObjectKey{Namespace: e.namespace, Name: stsName}, &sts); err != nil { if !apierrors.IsNotFound(err) { return err } } else { - foundSts = true + existingSts = &sts } var ( - replicas = e.computeReplicas(foundEtcd, existingEtcd) + replicas = e.computeReplicas(existingEtcd) protocolTCP = corev1.ProtocolTCP intStrPortEtcdClient = intstr.FromInt(int(PortEtcdClient)) intStrPortBackupRestore = intstr.FromInt(int(PortBackupRestore)) - resourcesEtcd, resourcesBackupRestore = e.computeContainerResources(foundSts, existingSts) + resourcesEtcd, resourcesBackupRestore = e.computeContainerResources(existingSts) quota = resource.MustParse("8Gi") storageCapacity = resource.MustParse(e.storageCapacity) garbageCollectionPolicy = druidv1alpha1.GarbageCollectionPolicy(druidv1alpha1.GarbageCollectionPolicyExponential) @@ -316,6 +320,7 @@ func (e *etcd) Deploy(ctx context.Context) error { v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToPublicNetworks: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToPrivateNetworks: v1beta1constants.LabelNetworkPolicyAllowed, + v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, }) e.etcd.Spec.Selector = &metav1.LabelSelector{ MatchLabels: utils.MergeStringMaps(e.getLabels(), map[string]string{ @@ -341,7 +346,7 @@ func (e *etcd) Deploy(ctx context.Context) error { ServerPort: &PortEtcdServer, ClientPort: &PortEtcdClient, Metrics: &metrics, - DefragmentationSchedule: e.computeDefragmentationSchedule(foundEtcd, existingEtcd), + DefragmentationSchedule: e.computeDefragmentationSchedule(existingEtcd), Quota: "a, } e.etcd.Spec.Backup = druidv1alpha1.BackupSpec{ @@ -365,11 +370,21 @@ func (e *etcd) Deploy(ctx context.Context) error { Provider: &provider, Prefix: fmt.Sprintf("%s/etcd-%s", e.backupConfig.Prefix, e.role), } - e.etcd.Spec.Backup.FullSnapshotSchedule = e.computeFullSnapshotSchedule(foundEtcd, existingEtcd) + e.etcd.Spec.Backup.FullSnapshotSchedule = e.computeFullSnapshotSchedule(existingEtcd) e.etcd.Spec.Backup.DeltaSnapshotPeriod = &deltaSnapshotPeriod e.etcd.Spec.Backup.DeltaSnapshotMemoryLimit = &deltaSnapshotMemoryLimit } + if e.ownerCheckConfig != nil { + e.etcd.Spec.Backup.OwnerCheck = &druidv1alpha1.OwnerCheckSpec{ + Name: e.ownerCheckConfig.Name, + ID: e.ownerCheckConfig.ID, + Interval: &metav1.Duration{Duration: 30 * time.Second}, + Timeout: &metav1.Duration{Duration: 2 * time.Minute}, + DNSCacheTTL: &metav1.Duration{Duration: 1 * time.Minute}, + } + } + e.etcd.Spec.StorageCapacity = &storageCapacity e.etcd.Spec.VolumeClaimTemplate = &volumeClaimTemplate return nil @@ -574,7 +589,7 @@ func (e *etcd) Snapshot(ctx context.Context, podExecutor kubernetes.PodExecutor) podsList.Items[0].GetName(), containerNameBackupRestore, "/bin/sh", - fmt.Sprintf("curl -k https://etcd-%s-local:%d/snapshot/full", e.role, PortBackupRestore), + fmt.Sprintf("curl -k https://etcd-%s-local:%d/snapshot/full?final=true", e.role, PortBackupRestore), ) return err } @@ -586,9 +601,20 @@ func (e *etcd) ServiceDNSNames() []string { ) } +// Get retrieves the Etcd resource +func (e *etcd) Get(ctx context.Context) (*druidv1alpha1.Etcd, error) { + if err := e.client.Get(ctx, client.ObjectKeyFromObject(e.etcd), e.etcd); err != nil { + return nil, err + } + return e.etcd, nil +} + func (e *etcd) SetSecrets(secrets Secrets) { e.secrets = secrets } func (e *etcd) SetBackupConfig(backupConfig *BackupConfig) { e.backupConfig = backupConfig } func (e *etcd) SetHVPAConfig(hvpaConfig *HVPAConfig) { e.hvpaConfig = hvpaConfig } +func (e *etcd) SetOwnerCheckConfig(ownerCheckConfig *OwnerCheckConfig) { + e.ownerCheckConfig = ownerCheckConfig +} func (e *etcd) podLabelSelector() labels.Selector { app, _ := labels.NewRequirement(v1beta1constants.LabelApp, selection.Equals, []string{LabelAppValue}) @@ -596,7 +622,7 @@ func (e *etcd) podLabelSelector() labels.Selector { return labels.NewSelector().Add(*role, *app) } -func (e *etcd) computeContainerResources(foundSts bool, existingSts *appsv1.StatefulSet) (*corev1.ResourceRequirements, *corev1.ResourceRequirements) { +func (e *etcd) computeContainerResources(existingSts *appsv1.StatefulSet) (*corev1.ResourceRequirements, *corev1.ResourceRequirements) { var ( resourcesEtcd = &corev1.ResourceRequirements{ Requests: corev1.ResourceList{ @@ -620,7 +646,7 @@ func (e *etcd) computeContainerResources(foundSts bool, existingSts *appsv1.Stat } ) - if foundSts && e.hvpaConfig != nil && e.hvpaConfig.Enabled { + if existingSts != nil && e.hvpaConfig != nil && e.hvpaConfig.Enabled { for k := range existingSts.Spec.Template.Spec.Containers { v := existingSts.Spec.Template.Spec.Containers[k] switch v.Name { @@ -635,29 +661,28 @@ func (e *etcd) computeContainerResources(foundSts bool, existingSts *appsv1.Stat return resourcesEtcd, resourcesBackupRestore } -func (e *etcd) computeReplicas(foundEtcd bool, existingEtcd *druidv1alpha1.Etcd) int { +func (e *etcd) computeReplicas(existingEtcd *druidv1alpha1.Etcd) int { if !e.retainReplicas { return 1 } - if foundEtcd { + if existingEtcd != nil { return existingEtcd.Spec.Replicas } - return 0 } -func (e *etcd) computeDefragmentationSchedule(foundEtcd bool, existingEtcd *druidv1alpha1.Etcd) *string { +func (e *etcd) computeDefragmentationSchedule(existingEtcd *druidv1alpha1.Etcd) *string { defragmentationSchedule := e.defragmentationSchedule - if foundEtcd && existingEtcd.Spec.Etcd.DefragmentationSchedule != nil { + if existingEtcd != nil && existingEtcd.Spec.Etcd.DefragmentationSchedule != nil { defragmentationSchedule = existingEtcd.Spec.Etcd.DefragmentationSchedule } return defragmentationSchedule } -func (e *etcd) computeFullSnapshotSchedule(foundEtcd bool, existingEtcd *druidv1alpha1.Etcd) *string { +func (e *etcd) computeFullSnapshotSchedule(existingEtcd *druidv1alpha1.Etcd) *string { fullSnapshotSchedule := &e.backupConfig.FullSnapshotSchedule - if foundEtcd && existingEtcd.Spec.Backup.FullSnapshotSchedule != nil { + if existingEtcd != nil && existingEtcd.Spec.Backup.FullSnapshotSchedule != nil { fullSnapshotSchedule = existingEtcd.Spec.Backup.FullSnapshotSchedule } return fullSnapshotSchedule @@ -698,3 +723,12 @@ type HVPAConfig struct { // The update mode to use for scale down. ScaleDownUpdateMode *string } + +// OwnerCheckConfig contains parameters related to checking if the seed is an owner +// of the shoot. The ownership can change during control plane migration. +type OwnerCheckConfig struct { + // Name is the domain name of the owner DNS record. + Name string + // ID is the seed ID value that is expected to be found in the owner DNS record. + ID string +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcdcopybackupstask/etcdcopybackupstask.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcdcopybackupstask/etcdcopybackupstask.go new file mode 100644 index 000000000..e1c5f6494 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcdcopybackupstask/etcdcopybackupstask.go @@ -0,0 +1,202 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package etcdcopybackupstask + +import ( + "context" + "fmt" + "time" + + "github.com/gardener/gardener/pkg/extensions" + "github.com/gardener/gardener/pkg/operation/botanist/component" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/utils/retry" + + druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" + "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + // DefaultInterval is the default interval for retry operations. + DefaultInterval = 5 * time.Second + // DefaultSevereThreshold is the default threshold until an error reported by another component is treated as 'severe'. + DefaultSevereThreshold = 3 * time.Minute + // DefaultTimeout is the default timeout and defines how long Gardener should wait + // for a successful reconciliation of an EtcdCopyBackupsTasks resource. + DefaultTimeout = 5 * time.Minute + + // DefaultWaitForFinalSnapshotTimeout is the default timeout for waiting for a final full snapshot. + DefaultWaitForFinalSnapshotTimeout = 30 * time.Minute +) + +// Interface contains functions to manage EtcdCopyBackupsTasks. +type Interface interface { + component.DeployWaiter + // SetSourceStore sets the specifications for the object store provider from which backups will be copied. + SetSourceStore(druidv1alpha1.StoreSpec) + // SetTargetStore sets the specifications for the object store provider to which backups will be copied. + SetTargetStore(druidv1alpha1.StoreSpec) +} + +// Values contains the values used to create an EtcdCopyBackupsTask resources. +type Values struct { + // Name is the name of the EtcdCopyBackupsTask. + Name string + // Namespace is the namespace of the EtcdCopyBackupsTask. + Namespace string + // SourceStore is the specification of the objct store from which etcd backups will be copied. + SourceStore druidv1alpha1.StoreSpec + // TargetStore is the specification of the objcet store to which etcd backups will be copied. + TargetStore druidv1alpha1.StoreSpec + // MaxBackups is the maximum number of backups that will be copied starting with the most recent ones. + MaxBackups *uint32 + // MaxBackupAge is the maximum age in days that a backup must have in order to be copied. + MaxBackupAge *uint32 + // WaitForFinalSnapshot defines the parameters for waiting for a final full snapshot before copying backups. + WaitForFinalSnapshot *druidv1alpha1.WaitForFinalSnapshotSpec +} + +type etcdCopyBackupsTask struct { + values *Values + logger logrus.FieldLogger + client client.Client + waitInterval time.Duration + waitSevereThreshold time.Duration + waitTimeout time.Duration + + task *druidv1alpha1.EtcdCopyBackupsTask +} + +// New creates a new instance of Interface +func New( + logger logrus.FieldLogger, + client client.Client, + values *Values, + waitInterval time.Duration, + waitSevereThreshold time.Duration, + waitTimeout time.Duration, +) Interface { + + return &etcdCopyBackupsTask{ + values, + logger, + client, + waitInterval, + waitSevereThreshold, + waitTimeout, + &druidv1alpha1.EtcdCopyBackupsTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: values.Name, + Namespace: values.Namespace, + }, + }, + } +} + +// Deploy creates the EtcdCopyBackupsTask resource. +func (e *etcdCopyBackupsTask) Deploy(ctx context.Context) error { + e.task.Spec.MaxBackupAge = e.values.MaxBackupAge + e.task.Spec.MaxBackups = e.values.MaxBackups + e.task.Spec.SourceStore = e.values.SourceStore + e.task.Spec.TargetStore = e.values.TargetStore + e.task.Spec.WaitForFinalSnapshot = e.values.WaitForFinalSnapshot + return e.client.Create(ctx, e.task) +} + +// Wait waits until the EtcdCopyBackupsTask is ready. +func (e *etcdCopyBackupsTask) Wait(ctx context.Context) error { + if err := extensions.WaitUntilObjectReadyWithHealthFunction( + ctx, + e.client, + e.logger, + waitForConditions, + e.task, + "EtcdCopyBackupsTask", + e.waitInterval, + e.waitSevereThreshold, + e.waitTimeout, + e.checkConditions, + ); err != nil { + e.logger.Error(err) + return err + } + return nil +} + +// Destroy deletes the EtcdCopyBackupsTask resource. +func (e *etcdCopyBackupsTask) Destroy(ctx context.Context) error { + return kutil.DeleteObject(ctx, e.client, e.task) +} + +// WaitCleanup waits until the EtcdCopyBackupsTask is deleted. +func (e *etcdCopyBackupsTask) WaitCleanup(ctx context.Context) error { + timeoutCtx, cancel := context.WithTimeout(ctx, e.waitTimeout) + defer cancel() + return kutil.WaitUntilResourceDeleted(timeoutCtx, e.client, e.task, e.waitInterval) +} + +// SetSourceStore sets the specifications for the object store provider from which backups will be copied. +func (e *etcdCopyBackupsTask) SetSourceStore(store druidv1alpha1.StoreSpec) { + e.values.SourceStore = store +} + +// SetTargetStore sets the specifications for the object store provider to which backups will be copied. +func (e *etcdCopyBackupsTask) SetTargetStore(store druidv1alpha1.StoreSpec) { + e.values.TargetStore = store +} + +// waitForConditions waits until the EtcdCopyBackupsTask conditions have been populated by the etcd-druid. +func waitForConditions(obj client.Object) error { + task, ok := obj.(*druidv1alpha1.EtcdCopyBackupsTask) + if !ok { + return fmt.Errorf("expected *druidv1alpha1.EtcdCopyBackupsTask but got %T", obj) + } + if task.DeletionTimestamp != nil { + return fmt.Errorf("task %s has a deletion timestamp", kutil.ObjectName(task)) + } + + generation := task.Generation + observedGeneration := task.Status.ObservedGeneration + if observedGeneration == nil { + return fmt.Errorf("observed generation not recorded") + } + if generation != *observedGeneration { + return fmt.Errorf("observed generation outdated (%d/%d)", *observedGeneration, generation) + } + + if task.Status.LastError != nil { + return retry.RetriableError(fmt.Errorf("error during reconciliation: %s", *task.Status.LastError)) + } + + for _, condition := range task.Status.Conditions { + if (condition.Type == druidv1alpha1.EtcdCopyBackupsTaskSucceeded || condition.Type == druidv1alpha1.EtcdCopyBackupsTaskFailed) && + condition.Status == druidv1alpha1.ConditionTrue { + return nil + } + } + return fmt.Errorf("expected condition %s or %s, has not been reported yet", druidv1alpha1.EtcdCopyBackupsTaskSucceeded, druidv1alpha1.EtcdCopyBackupsTaskFailed) +} + +// checkConditions checks the EtcdCopyBackupsTask conditions to determine if the copy operation has completed successfully or not. +func (e *etcdCopyBackupsTask) checkConditions() error { + for _, condition := range e.task.Status.Conditions { + if condition.Type == druidv1alpha1.EtcdCopyBackupsTaskFailed && condition.Status == druidv1alpha1.ConditionTrue { + return fmt.Errorf("condition %s has status %s: %s", condition.Type, condition.Status, condition.Message) + } + } + return nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsowner.tpl.yaml b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsowner.tpl.yaml index 1d90d32f5..b30213bbf 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsowner.tpl.yaml +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsowner.tpl.yaml @@ -19,7 +19,7 @@ spec: - jsonPath: .spec.ownerId name: OwnerId type: string - - jsonPath: .spec.active + - jsonPath: .status.active name: Active type: boolean - jsonPath: .status.entries.amount diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsprovider.tpl.yaml b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsprovider.tpl.yaml index 4b4d65470..f21ab8a18 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsprovider.tpl.yaml +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-dnsprovider.tpl.yaml @@ -76,6 +76,19 @@ spec: description: optional additional provider specific configuration values type: object x-kubernetes-preserve-unknown-fields: true + rateLimit: + description: rate limit for create/update operations on DNSEntries assigned to this provider + properties: + burst: + description: Burst allows bursts of up to 'burst' to exceed the rate defined by 'RequestsPerDay', while still maintaining a smoothed rate of 'RequestsPerDay' + type: integer + requestsPerDay: + description: RequestsPerDay is create/update request rate per DNS entry given by requests per day + type: integer + required: + - burst + - requestsPerDay + type: object secretRef: description: access credential for the external DNS system of the given type properties: @@ -134,6 +147,19 @@ spec: observedGeneration: format: int64 type: integer + rateLimit: + description: actually used rate limit for create/update operations on DNSEntries assigned to this provider + properties: + burst: + description: Burst allows bursts of up to 'burst' to exceed the rate defined by 'RequestsPerDay', while still maintaining a smoothed rate of 'RequestsPerDay' + type: integer + requestsPerDay: + description: RequestsPerDay is create/update request rate per DNS entry given by requests per day + type: integer + required: + - burst + - requestsPerDay + type: object state: description: state of the provider type: string diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-worker.tpl.yaml b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-worker.tpl.yaml index 67e28ea5c..ffacfb07b 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-worker.tpl.yaml +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/crds/templates/crd-worker.tpl.yaml @@ -96,6 +96,10 @@ spec: description: KubeletDataVolumeName contains the name of a dataVolume that should be used for storing kubelet state. type: string + kubernetesVersion: + description: KubernetesVersion is the kubernetes version in + this worker pool + type: string labels: additionalProperties: type: string @@ -177,6 +181,23 @@ spec: name: description: Name is the name of this worker pool. type: string + nodeTemplate: + description: NodeTemplate contains resource information of the + machine which is used by Cluster Autoscaler to generate nodeTemplate + during scaling a nodeGroup from zero + properties: + capacity: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Capacity represents the expected Node capacity. + type: object + required: + - capacity + type: object providerConfig: description: ProviderConfig is a provider specific configuration for the worker pool. diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsentry.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsentry.go index 8dc806bb4..d8b746a23 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsentry.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsentry.go @@ -114,5 +114,7 @@ func (e *entry) Wait(ctx context.Context) error { } func (e *entry) WaitCleanup(ctx context.Context) error { - return kutil.WaitUntilResourceDeleted(ctx, e.client, e.dnsEntry, 5*time.Second) + timeoutCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + return kutil.WaitUntilResourceDeleted(timeoutCtx, e.client, e.dnsEntry, 5*time.Second) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsowner.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsowner.go index 61c64f44f..2a6a276d6 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsowner.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsowner.go @@ -81,5 +81,7 @@ func (o *owner) Destroy(ctx context.Context) error { func (o *owner) Wait(_ context.Context) error { return nil } func (o *owner) WaitCleanup(ctx context.Context) error { - return kutil.WaitUntilResourceDeleted(ctx, o.client, o.dnsOwner, 5*time.Second) + timeoutCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + return kutil.WaitUntilResourceDeleted(timeoutCtx, o.client, o.dnsOwner, 5*time.Second) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsprovider.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsprovider.go index 9d726931a..2e30ca9cb 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsprovider.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns/dnsprovider.go @@ -146,5 +146,7 @@ func (p *provider) Wait(ctx context.Context) error { } func (p *provider) WaitCleanup(ctx context.Context) error { - return kutil.WaitUntilResourceDeleted(ctx, p.client, p.dnsProvider, 5*time.Second) + timeoutCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + return kutil.WaitUntilResourceDeleted(timeoutCtx, p.client, p.dnsProvider, 5*time.Second) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord/dnsrecord.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord/dnsrecord.go index a22326446..0607ecf2e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord/dnsrecord.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord/dnsrecord.go @@ -16,16 +16,18 @@ package dnsrecord import ( "context" + "reflect" "time" - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" gardencorev1alpha1 "github.com/gardener/gardener/pkg/apis/core/v1alpha1" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils" @@ -62,10 +64,9 @@ type Values struct { Name string // SecretName is the name of the secret referenced by the DNSRecord resource. SecretName string - // ReconcileOnce specifies that the DNSRecord resource should only be created and never reconciled after that again. - // However, on Deploy it is still updated with the timestamp annotation. - // This mode is used for owner DNS records. - ReconcileOnce bool + // ReconcileOnChange specifies that the DNSRecord resource should only be reconciled when first created or if its desired state has changed compared to the current one. + // This mode is used for owner DNS records to avoid competing reconciliations during the control plane migration "bad case" scenario. + ReconcileOnChange bool // Type is the type of the DNSRecord provider. Type string // SecretData is the secret data of the DNSRecord (containing provider credentials, etc.) @@ -163,7 +164,7 @@ func (c *dnsRecord) deploy(ctx context.Context, operation string) (extensionsv1a return nil } - if c.values.ReconcileOnce { + if c.values.ReconcileOnChange { if err := c.client.Get(ctx, client.ObjectKeyFromObject(c.dnsRecord), c.dnsRecord); err != nil { if !apierrors.IsNotFound(err) { return nil, err @@ -179,6 +180,8 @@ func (c *dnsRecord) deploy(ctx context.Context, operation string) (extensionsv1a if c.dnsRecord.Status.LastOperation != nil && c.dnsRecord.Status.LastOperation.State != gardencorev1beta1.LastOperationStateSucceeded { // If the DNSRecord is not yet Succeeded, reconcile it again. _ = mutateFn() + } else if c.valuesDontMatchDNSRecord() { + _ = mutateFn() } else { // Otherwise, just update the timestamp annotation. // If the object is still annotated with the operation annotation (e.g. not reconciled yet) this will send a watch @@ -275,3 +278,10 @@ func (c *dnsRecord) SetRecordType(recordType extensionsv1alpha1.DNSRecordType) { func (c *dnsRecord) SetValues(values []string) { c.values.Values = values } + +func (c *dnsRecord) valuesDontMatchDNSRecord() bool { + return c.values.SecretName != c.dnsRecord.Spec.SecretRef.Name || + !pointer.StringEqual(c.values.Zone, c.dnsRecord.Spec.Zone) || + !reflect.DeepEqual(c.values.Values, c.dnsRecord.Spec.Values) || + !pointer.Int64Equal(c.values.TTL, c.dnsRecord.Spec.TTL) +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/infrastructure/infrastructure.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/infrastructure/infrastructure.go index b85823382..e424e480f 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/infrastructure/infrastructure.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/infrastructure/infrastructure.go @@ -34,9 +34,9 @@ import ( const ( // DefaultInterval is the default interval for retry operations. - DefaultInterval = 5 * time.Second + DefaultInterval = 10 * time.Second // DefaultSevereThreshold is the default threshold until an error reported by another component is treated as 'severe'. - DefaultSevereThreshold = 30 * time.Second + DefaultSevereThreshold = 3 * time.Minute // DefaultTimeout is the default timeout and defines how long Gardener should wait // for a successful reconciliation of an infrastructure resource. DefaultTimeout = 10 * time.Minute diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh index 8a1468593..98989fea1 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh @@ -1,5 +1,10 @@ -#!/bin/bash -eu +#!/bin/bash +set -o errexit +set -o nounset +set -o pipefail + +{ SECRET_NAME="{{ .secretName }}" PATH_CLOUDCONFIG_DOWNLOADER_SERVER="{{ .pathCredentialsServer }}" @@ -25,3 +30,6 @@ echo "$CHECKSUM" > "$PATH_CLOUDCONFIG_CHECKSUM" SCRIPT="$(echo "$SECRET" | sed -rn 's/ {{ .dataKeyScript }}: (.*)/\1/p')" echo "$SCRIPT" | base64 -d | bash + +exit $? +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/executor/templates/scripts/execute-cloud-config.tpl.sh b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/executor/templates/scripts/execute-cloud-config.tpl.sh index 78694b9a3..50b503ef5 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/executor/templates/scripts/execute-cloud-config.tpl.sh +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/executor/templates/scripts/execute-cloud-config.tpl.sh @@ -79,27 +79,49 @@ fi echo "Checking whether we need to preload a new hyperkube image..." if [[ "$LAST_DOWNLOADED_HYPERKUBE_IMAGE" != "{{ .hyperkubeImage }}" ]]; then + if ! {{ .pathDockerBinary }} info &> /dev/null ; then + echo "docker daemon is not available, cannot preload hyperkube image" + exit 1 + fi + echo "Preloading hyperkube image ({{ .hyperkubeImage }}) because last downloaded image ($LAST_DOWNLOADED_HYPERKUBE_IMAGE) is outdated" - {{ .pathDockerBinary }} pull "{{ .hyperkubeImage }}" + if ! {{ .pathDockerBinary }} pull "{{ .hyperkubeImage }}" ; then + echo "hyperkube image preload failed" + exit 1 + fi + + # append image reference checksum to copied filenames in order to easily check if copying the binaries succeeded + hyperkubeImageSHA="{{ .hyperkubeImage | sha256sum }}" echo "Starting temporary hyperkube container to copy binaries to host" {{- if semverCompare "< 1.17" .kubernetesVersion }} - {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}" /bin/sh -c "cp /usr/local/bin/kubelet $PATH_HYPERKUBE_DOWNLOADS" - {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}" /bin/sh -c "cp /usr/local/bin/kubectl $PATH_HYPERKUBE_DOWNLOADS" + {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}" /bin/sh -c "cp /usr/local/bin/kubelet $PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" + {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}" /bin/sh -c "cp /usr/local/bin/kubectl $PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" {{- else if semverCompare "< 1.19" .kubernetesVersion }} - {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw --entrypoint /bin/sh "{{ .hyperkubeImage }}" -c "cp /usr/local/bin/kubelet $PATH_HYPERKUBE_DOWNLOADS" - {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw --entrypoint /bin/sh "{{ .hyperkubeImage }}" -c "cp /usr/local/bin/kubectl $PATH_HYPERKUBE_DOWNLOADS" + {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw --entrypoint /bin/sh "{{ .hyperkubeImage }}" -c "cp /usr/local/bin/kubelet $PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" + {{ .pathDockerBinary }} run --rm -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw --entrypoint /bin/sh "{{ .hyperkubeImage }}" -c "cp /usr/local/bin/kubectl $PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" {{- else }} - HYPERKUBE_CONTAINER_ID="$({{ .pathDockerBinary }} run --rm -d -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}")" - {{ .pathDockerBinary }} cp "$HYPERKUBE_CONTAINER_ID":/kubelet "$PATH_HYPERKUBE_DOWNLOADS" - {{ .pathDockerBinary }} cp "$HYPERKUBE_CONTAINER_ID":/kubectl "$PATH_HYPERKUBE_DOWNLOADS" + HYPERKUBE_CONTAINER_ID="$({{ .pathDockerBinary }} run -d -v "$PATH_HYPERKUBE_DOWNLOADS":"$PATH_HYPERKUBE_DOWNLOADS":rw "{{ .hyperkubeImage }}")" + {{ .pathDockerBinary }} cp "$HYPERKUBE_CONTAINER_ID":/kubelet "$PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" + {{ .pathDockerBinary }} cp "$HYPERKUBE_CONTAINER_ID":/kubectl "$PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" {{ .pathDockerBinary }} stop "$HYPERKUBE_CONTAINER_ID" + {{ .pathDockerBinary }} rm "$HYPERKUBE_CONTAINER_ID" {{- end }} - chmod +x "$PATH_HYPERKUBE_DOWNLOADS/kubelet" - chmod +x "$PATH_HYPERKUBE_DOWNLOADS/kubectl" + chmod +x "$PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" + chmod +x "$PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" + + if ! [ -f "$PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" -a -f "$PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" ]; then + echo "extracting kubernetes binaries from hyperkube image failed" + exit 1 + fi + + # only write to $PATH_LAST_DOWNLOADED_HYPERKUBE_IMAGE if copy operation succeeded + # this is done to retry failed operations on the execution + mv "$PATH_HYPERKUBE_DOWNLOADS/kubelet-$hyperkubeImageSHA" "$PATH_HYPERKUBE_DOWNLOADS/kubelet" && \ + mv "$PATH_HYPERKUBE_DOWNLOADS/kubectl-$hyperkubeImageSHA" "$PATH_HYPERKUBE_DOWNLOADS/kubectl" && \ + echo "{{ .hyperkubeImage }}" > "$PATH_LAST_DOWNLOADED_HYPERKUBE_IMAGE" - echo "{{ .hyperkubeImage }}" > "$PATH_LAST_DOWNLOADED_HYPERKUBE_IMAGE" LAST_DOWNLOADED_HYPERKUBE_IMAGE="$(cat "$PATH_LAST_DOWNLOADED_HYPERKUBE_IMAGE")" else echo "No need to preload new hyperkube image because binaries for $LAST_DOWNLOADED_HYPERKUBE_IMAGE were found in $PATH_HYPERKUBE_DOWNLOADS" diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go index 1e73ab632..42c49b686 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go @@ -23,6 +23,7 @@ import ( "github.com/gardener/gardener/pkg/apis/core/v1alpha1" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + v1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/extensions" @@ -195,8 +196,11 @@ type Data struct { // Deploy uses the client to create or update the OperatingSystemConfig custom resources. func (o *operatingSystemConfig) Deploy(ctx context.Context) error { fns := o.forEachWorkerPoolAndPurposeTaskFn(func(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) error { - d := o.newDeployer(osc, worker, purpose) - _, err := d.deploy(ctx, v1beta1constants.GardenerOperationReconcile) + d, err := o.newDeployer(osc, worker, purpose) + if err != nil { + return err + } + _, err = d.deploy(ctx, v1beta1constants.GardenerOperationReconcile) return err }) @@ -207,7 +211,10 @@ func (o *operatingSystemConfig) Deploy(ctx context.Context) error { // namespace in the Seed and restore its state. func (o *operatingSystemConfig) Restore(ctx context.Context, shootState *v1alpha1.ShootState) error { fns := o.forEachWorkerPoolAndPurposeTaskFn(func(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) error { - d := o.newDeployer(osc, worker, purpose) + d, err := o.newDeployer(osc, worker, purpose) + if err != nil { + return err + } return extensions.RestoreExtensionWithDeployFunction(ctx, o.client, shootState, extensionsv1alpha1.OperatingSystemConfigResource, d.deploy) }) @@ -309,12 +316,20 @@ func (o *operatingSystemConfig) WaitCleanup(ctx context.Context) error { // DeleteStaleResources deletes unused OperatingSystemConfig resources from the shoot namespace in the seed. func (o *operatingSystemConfig) DeleteStaleResources(ctx context.Context) error { - return o.deleteOperatingSystemConfigResources(ctx, o.getWantedOSCNames()) + wantedOSCs, err := o.getWantedOSCNames() + if err != nil { + return err + } + return o.deleteOperatingSystemConfigResources(ctx, wantedOSCs) } // WaitCleanupStaleResources waits until all unused OperatingSystemConfig resources are cleaned up. func (o *operatingSystemConfig) WaitCleanupStaleResources(ctx context.Context) error { - return o.waitCleanup(ctx, o.getWantedOSCNames()) + wantedOSCs, err := o.getWantedOSCNames() + if err != nil { + return err + } + return o.waitCleanup(ctx, wantedOSCs) } func (o *operatingSystemConfig) waitCleanup(ctx context.Context, wantedOSCNames sets.String) error { @@ -335,7 +350,7 @@ func (o *operatingSystemConfig) waitCleanup(ctx context.Context, wantedOSCNames // getWantedOSCNames returns the names of all OSC resources, that are currently needed based // on the configured worker pools. -func (o *operatingSystemConfig) getWantedOSCNames() sets.String { +func (o *operatingSystemConfig) getWantedOSCNames() (sets.String, error) { wantedOSCNames := sets.NewString() for _, worker := range o.values.Workers { @@ -347,11 +362,15 @@ func (o *operatingSystemConfig) getWantedOSCNames() sets.String { extensionsv1alpha1.OperatingSystemConfigPurposeProvision, extensionsv1alpha1.OperatingSystemConfigPurposeReconcile, } { - wantedOSCNames.Insert(Key(worker.Name, o.values.KubernetesVersion) + keySuffix(worker.Machine.Image.Name, purpose)) + kubernetesVersion, err := v1beta1helper.CalculateEffectiveKubernetesVersion(o.values.KubernetesVersion, worker.Kubernetes) + if err != nil { + return nil, err + } + wantedOSCNames.Insert(Key(worker.Name, kubernetesVersion) + keySuffix(worker.Machine.Image.Name, purpose)) } } - return wantedOSCNames + return wantedOSCNames, nil } func (o *operatingSystemConfig) forEachWorkerPoolAndPurpose(fn func(*extensionsv1alpha1.OperatingSystemConfig, gardencorev1beta1.Worker, extensionsv1alpha1.OperatingSystemConfigPurpose) error) error { @@ -364,7 +383,11 @@ func (o *operatingSystemConfig) forEachWorkerPoolAndPurpose(fn func(*extensionsv extensionsv1alpha1.OperatingSystemConfigPurposeProvision, extensionsv1alpha1.OperatingSystemConfigPurposeReconcile, } { - oscName := Key(worker.Name, o.values.KubernetesVersion) + keySuffix(worker.Machine.Image.Name, purpose) + kubernetesVersion, err := v1beta1helper.CalculateEffectiveKubernetesVersion(o.values.KubernetesVersion, worker.Kubernetes) + if err != nil { + return err + } + oscName := Key(worker.Name, kubernetesVersion) + keySuffix(worker.Machine.Image.Name, purpose) osc, ok := o.oscs[oscName] if !ok { @@ -436,7 +459,7 @@ func (o *operatingSystemConfig) WorkerNameToOperatingSystemConfigsMap() map[stri return o.workerNameToOSCs } -func (o *operatingSystemConfig) newDeployer(osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) deployer { +func (o *operatingSystemConfig) newDeployer(osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) (deployer, error) { criName := extensionsv1alpha1.CRINameDocker if worker.CRI != nil { criName = extensionsv1alpha1.CRIName(worker.CRI.Name) @@ -459,12 +482,17 @@ func (o *operatingSystemConfig) newDeployer(osc *extensionsv1alpha1.OperatingSys } setDefaultEvictionMemoryAvailable(kubeletConfigParameters.EvictionHard, kubeletConfigParameters.EvictionSoft, o.values.MachineTypes, worker.Machine.Type) + kubernetesVersion, err := v1beta1helper.CalculateEffectiveKubernetesVersion(o.values.KubernetesVersion, worker.Kubernetes) + if err != nil { + return deployer{}, err + } + return deployer{ client: o.client, osc: osc, worker: worker, purpose: purpose, - key: Key(worker.Name, o.values.KubernetesVersion), + key: Key(worker.Name, kubernetesVersion), apiServerURL: o.values.APIServerURL, caBundle: caBundle, clusterDNSAddress: o.values.ClusterDNSAddress, @@ -475,11 +503,11 @@ func (o *operatingSystemConfig) newDeployer(osc *extensionsv1alpha1.OperatingSys kubeletConfigParameters: kubeletConfigParameters, kubeletCLIFlags: kubeletCLIFlags, kubeletDataVolumeName: worker.KubeletDataVolumeName, - kubernetesVersion: o.values.KubernetesVersion, + kubernetesVersion: kubernetesVersion, sshPublicKeys: o.values.SSHPublicKeys, lokiIngressHostName: o.values.LokiIngressHostName, promtailRBACAuthToken: o.values.PromtailRBACAuthToken, - } + }, nil } func setDefaultEvictionMemoryAvailable(evictionHard, evictionSoft map[string]string, machineTypes []gardencorev1beta1.MachineType, machineType string) { diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet.go index d9de0a943..06cd0eb69 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet.go @@ -51,6 +51,7 @@ type ConfigurableKubeletConfigParameters struct { FeatureGates map[string]bool ImageGCHighThresholdPercent *int32 ImageGCLowThresholdPercent *int32 + SerializeImagePulls *bool KubeReserved map[string]string MaxPods *int32 PodPidsLimit *int64 @@ -83,6 +84,7 @@ func KubeletConfigParametersFromCoreV1beta1KubeletConfig(kubeletConfig *gardenco out.FailSwapOn = kubeletConfig.FailSwapOn out.ImageGCHighThresholdPercent = kubeletConfig.ImageGCHighThresholdPercent out.ImageGCLowThresholdPercent = kubeletConfig.ImageGCLowThresholdPercent + out.SerializeImagePulls = kubeletConfig.SerializeImagePulls out.FeatureGates = kubeletConfig.FeatureGates out.KubeReserved = reservedFromKubeletConfig(kubeletConfig.KubeReserved) out.MaxPods = kubeletConfig.MaxPods diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go index 0ce3f4c71..342593071 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go @@ -93,7 +93,7 @@ func Config(kubernetesVersion *semver.Version, clusterDNSAddress, clusterDomain ResolverConfig: "/etc/resolv.conf", RotateCertificates: true, RuntimeRequestTimeout: metav1.Duration{Duration: 2 * time.Minute}, - SerializeImagePulls: pointer.Bool(true), + SerializeImagePulls: params.SerializeImagePulls, SyncFrequency: metav1.Duration{Duration: time.Minute}, SystemReserved: params.SystemReserved, VolumeStatsAggPeriod: metav1.Duration{Duration: time.Minute}, @@ -206,6 +206,10 @@ func setConfigDefaults(c *components.ConfigurableKubeletConfigParameters) { c.ImageGCLowThresholdPercent = pointer.Int32(40) } + if c.SerializeImagePulls == nil { + c.SerializeImagePulls = pointer.Bool(true) + } + if c.KubeReserved == nil { c.KubeReserved = make(map[string]string, 2) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/worker/worker.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/worker/worker.go index 00bf79c85..2a3e9eefb 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/worker/worker.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/worker/worker.go @@ -33,6 +33,7 @@ import ( "github.com/Masterminds/semver" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -75,6 +76,8 @@ type Values struct { Workers []gardencorev1beta1.Worker // KubernetesVersion is the Kubernetes version of the cluster for which the worker nodes shall be created. KubernetesVersion *semver.Version + // MachineTypes is the list of machine types present in the CloudProfile referenced by the shoot + MachineTypes []gardencorev1beta1.MachineType // SSHPublicKey is the public SSH key that shall be installed on the worker nodes. SSHPublicKey []byte // InfrastructureProviderStatus is the provider status of the Infrastructure resource which might be relevant for @@ -131,6 +134,13 @@ func (w *worker) Deploy(ctx context.Context) error { func (w *worker) deploy(ctx context.Context, operation string) (extensionsv1alpha1.Object, error) { var pools []extensionsv1alpha1.WorkerPool + obj := &extensionsv1alpha1.Worker{} + if err := w.client.Get(ctx, client.ObjectKey{Name: w.worker.Name, Namespace: w.worker.Namespace}, obj); err != nil { + if !apierrors.IsNotFound(err) { + return nil, err + } + } + for _, workerPool := range w.values.Workers { var volume *extensionsv1alpha1.Volume if workerPool.Volume != nil { @@ -192,6 +202,26 @@ func (w *worker) deploy(ctx context.Context, operation string) (extensionsv1alph userData = []byte(val.Downloader.Content) } + workerPoolKubernetesVersion := w.values.KubernetesVersion.String() + if workerPool.Kubernetes != nil && workerPool.Kubernetes.Version != nil { + workerPoolKubernetesVersion = *workerPool.Kubernetes.Version + } + + nodeTemplate := w.findExistingNodeTemplateByName(ctx, obj, workerPool.Name) + + if nodeTemplate == nil { + // initializing nodeTemplate by fetching details from cloudprofile, if present there + if machineDetails := gardencorev1beta1helper.FindMachineTypeByName(w.values.MachineTypes, workerPool.Machine.Type); machineDetails != nil { + nodeTemplate = &extensionsv1alpha1.NodeTemplate{ + Capacity: corev1.ResourceList{ + corev1.ResourceCPU: machineDetails.CPU, + "gpu": machineDetails.GPU, + corev1.ResourceMemory: machineDetails.Memory, + }, + } + } + } + pools = append(pools, extensionsv1alpha1.WorkerPool{ Name: workerPool.Name, Minimum: workerPool.Minimum, @@ -206,11 +236,13 @@ func (w *worker) deploy(ctx context.Context, operation string) (extensionsv1alph Name: workerPool.Machine.Image.Name, Version: *workerPool.Machine.Image.Version, }, + NodeTemplate: nodeTemplate, ProviderConfig: pConfig, UserData: userData, Volume: volume, DataVolumes: dataVolumes, KubeletDataVolumeName: workerPool.KubeletDataVolumeName, + KubernetesVersion: &workerPoolKubernetesVersion, Zones: workerPool.Zones, MachineControllerManagerSettings: workerPool.MachineControllerManagerSettings, }) @@ -334,3 +366,12 @@ func (w *worker) SetWorkerNameToOperatingSystemConfigsMap(maps map[string]*opera func (w *worker) MachineDeployments() []extensionsv1alpha1.MachineDeployment { return w.machineDeployments } + +func (w *worker) findExistingNodeTemplateByName(ctx context.Context, obj *extensionsv1alpha1.Worker, poolName string) *extensionsv1alpha1.NodeTemplate { + for _, pool := range obj.Spec.Pools { + if pool.Name == poolName { + return pool.NodeTemplate + } + } + return nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardeneraccess/access.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardeneraccess/access.go new file mode 100644 index 000000000..5ed956aba --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardeneraccess/access.go @@ -0,0 +1,148 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gardeneraccess + +import ( + "context" + + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/client/kubernetes" + "github.com/gardener/gardener/pkg/controllerutils" + "github.com/gardener/gardener/pkg/operation/botanist/component" + gutil "github.com/gardener/gardener/pkg/utils/gardener" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/utils/managedresources" + + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// ManagedResourceName is the name of the ManagedResource containing the resource specifications. +const ManagedResourceName = "shoot-core-gardeneraccess" + +// New creates a new instance of the deployer for GardenerAccess. +func New( + client client.Client, + namespace string, + values Values, +) Interface { + return &gardener{ + client: client, + namespace: namespace, + values: values, + } +} + +// Interface contains functions for deploying access credentials for shoot clusters. +type Interface interface { + component.Deployer + SetCACertificate([]byte) +} + +type gardener struct { + client client.Client + namespace string + values Values +} + +// Values contains configurations for the component. +type Values struct { + // ServerOutOfCluster is the out-of-cluster address of a kube-apiserver. + ServerOutOfCluster string + // ServerInCluster is the in-cluster address of a kube-apiserver. + ServerInCluster string + + caCertificate []byte +} + +type accessNameToServer struct { + name string + server string +} + +func (g *gardener) Deploy(ctx context.Context) error { + var ( + accessNamesToServers = []accessNameToServer{ + {v1beta1constants.SecretNameGardener, g.values.ServerOutOfCluster}, + {v1beta1constants.SecretNameGardenerInternal, g.values.ServerInCluster}, + } + serviceAccountNames = make([]string, 0, len(accessNamesToServers)) + ) + + for _, v := range accessNamesToServers { + var ( + shootAccessSecret = gutil.NewShootAccessSecret(v.name, g.namespace).WithNameOverride(v.name) + kubeconfig = kutil.NewKubeconfig(g.namespace, v.server, g.values.caCertificate, clientcmdv1.AuthInfo{Token: ""}) + ) + + serviceAccountNames = append(serviceAccountNames, shootAccessSecret.ServiceAccountName) + + // TODO(rfranzke): Remove in a future release. + if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, g.client, shootAccessSecret.Secret, func() error { + if shootAccessSecret.Secret.Data["gardener.crt"] != nil || shootAccessSecret.Secret.Data["gardener-internal.crt"] != nil { + shootAccessSecret.Secret.Data = nil + } + return nil + }); err != nil { + return err + } + + if err := shootAccessSecret.WithKubeconfig(kubeconfig).Reconcile(ctx, g.client); err != nil { + return err + } + } + + data, err := g.computeResourcesData(serviceAccountNames...) + if err != nil { + return err + } + + return managedresources.CreateForShoot(ctx, g.client, g.namespace, ManagedResourceName, true, data) +} + +func (g *gardener) Destroy(ctx context.Context) error { + return managedresources.DeleteForShoot(ctx, g.client, g.namespace, ManagedResourceName) +} + +func (g *gardener) SetCACertificate(caCert []byte) { g.values.caCertificate = caCert } + +func (g *gardener) computeResourcesData(serviceAccountNames ...string) (map[string][]byte, error) { + var ( + registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) + + clusterRoleBinding = &rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gardener.cloud:system:gardener", + }, + RoleRef: rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: "ClusterRole", + Name: "cluster-admin", + }, + } + ) + + for _, name := range serviceAccountNames { + clusterRoleBinding.Subjects = append(clusterRoleBinding.Subjects, rbacv1.Subject{ + Kind: rbacv1.ServiceAccountKind, + Name: name, + Namespace: metav1.NamespaceSystem, + }) + } + + return registry.AddAllAndSerialize(clusterRoleBinding) +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go index d2fd721b9..8c7c89149 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go @@ -192,6 +192,10 @@ func (k *kubeScheduler) Deploy(ctx context.Context) error { Selector: &metav1.LabelSelector{MatchLabels: getLabels()}, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, Labels: getLabels(), }, Spec: corev1.PodSpec{ @@ -268,11 +272,14 @@ func (k *kubeScheduler) Deploy(ctx context.Context) error { }, }, } - serviceAccount = &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{ - Name: Name, - Namespace: k.namespace, - Labels: getLabels(), - }} + serviceAccount = &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: Name, + Namespace: k.namespace, + Labels: getLabels(), + }, + AutomountServiceAccountToken: pointer.Bool(false), + } roleBinding = &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: roleBindingName, diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/istio/ingress_gateway.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/istio/ingress_gateway.go index a74a2d942..bed2ab40f 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/istio/ingress_gateway.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/istio/ingress_gateway.go @@ -73,7 +73,7 @@ func NewIngressGateway( func (i *ingress) Deploy(ctx context.Context) error { // TODO(mvladev): Rotate this on on every istio version upgrade. - for _, filterName := range []string{"tcp-metadata-exchange-1.8", "tcp-stats-filter-1.8"} { + for _, filterName := range []string{"tcp-metadata-exchange-1.9", "tcp-metadata-exchange-1.10", "metadata-exchange-1.9", "metadata-exchange-1.10", "tcp-stats-filter-1.9", "stats-filter-1.9"} { if err := crclient.IgnoreNotFound(i.client.Delete(ctx, &networkingv1alpha3.EnvoyFilter{ ObjectMeta: metav1.ObjectMeta{Name: filterName, Namespace: i.namespace}, })); err != nil { diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go index 8fe03b1f3..b101282dd 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go @@ -16,6 +16,7 @@ package kubeapiserver import ( v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog" restarterapi "github.com/gardener/dependency-watchdog/pkg/restarter/api" scalerapi "github.com/gardener/dependency-watchdog/pkg/scaler/api" @@ -25,13 +26,6 @@ import ( "k8s.io/utils/pointer" ) -const ( - // DependencyWatchdogExternalProbeSecretName is the name of the kubecfg secret with internal DNS for external access. - DependencyWatchdogExternalProbeSecretName = "dependency-watchdog-external-probe" - // DependencyWatchdogInternalProbeSecretName is the name of the kubecfg secret with cluster IP access. - DependencyWatchdogInternalProbeSecretName = "dependency-watchdog-internal-probe" -) - // DependencyWatchdogEndpointConfiguration returns the configuration for the dependency watchdog (endpoint role) // ensuring that its dependant pods are restarted as soon as it recovers from a crash loop. func DependencyWatchdogEndpointConfiguration() (map[string]restarterapi.Service, error) { @@ -66,8 +60,8 @@ func DependencyWatchdogProbeConfiguration() ([]scalerapi.ProbeDependants, error) return []scalerapi.ProbeDependants{{ Name: "shoot-" + v1beta1constants.DeploymentNameKubeAPIServer, Probe: &scalerapi.ProbeConfig{ - External: &scalerapi.ProbeDetails{KubeconfigSecretName: DependencyWatchdogExternalProbeSecretName}, - Internal: &scalerapi.ProbeDetails{KubeconfigSecretName: DependencyWatchdogInternalProbeSecretName}, + External: &scalerapi.ProbeDetails{KubeconfigSecretName: dependencywatchdog.ExternalProbeSecretName}, + Internal: &scalerapi.ProbeDetails{KubeconfigSecretName: dependencywatchdog.InternalProbeSecretName}, PeriodSeconds: pointer.Int32(30), }, DependantScales: []*scalerapi.DependantScaleDetails{{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/kube_apiserver.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/kube_apiserver.go index 894a6baba..f97bf50f8 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/kube_apiserver.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/kube_apiserver.go @@ -45,6 +45,8 @@ const ( ServicePortName = "kube-apiserver" // UserName is the name of the kube-apiserver user when communicating with the kubelet. UserName = "system:kube-apiserver:kubelet" + // UserNameVPNSeed is the user name for the vpn-seed components (used as common name in its client certificate) + UserNameVPNSeed = "vpn-seed" ) // Interface contains functions for a kube-apiserver deployer. diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go index 3bc5ebdaa..c3ac4a8c5 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go @@ -225,8 +225,9 @@ kubernetes_sd_configs: names: [{{ .namespace }}] tls_config: insecure_skip_verify: true - cert_file: /etc/prometheus/seed/prometheus.crt - key_file: /etc/prometheus/seed/prometheus.key +authorization: + type: Bearer + credentials_file: /var/run/secrets/gardener.cloud/shoot/token/token relabel_configs: - source_labels: - __meta_kubernetes_service_name diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/kube_controller_manager.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/kube_controller_manager.go index 0b0d9ea90..1612d3a39 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/kube_controller_manager.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/kube_controller_manager.go @@ -23,16 +23,18 @@ import ( gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/utils" + gutil "github.com/gardener/gardener/pkg/utils/gardener" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" "github.com/gardener/gardener/pkg/utils/secrets" "github.com/gardener/gardener/pkg/utils/version" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "github.com/Masterminds/semver" - resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" @@ -53,8 +55,6 @@ const ( ServiceName = "kube-controller-manager" containerName = v1beta1constants.DeploymentNameKubeControllerManager - // SecretName is a constant for the secret name for the kube-controller-manager's kubeconfig secret. - SecretName = "kube-controller-manager" // SecretNameServer is the name of the kube-controller-manager server certificate secret. SecretNameServer = "kube-controller-manager-server" @@ -67,8 +67,6 @@ const ( volumeMountPathCA = "/srv/kubernetes/ca" // volumeMountPathServiceAccountKey is the volume mount path for the service account key that is a PEM-encoded private RSA or ECDSA key used to sign service account tokens. volumeMountPathServiceAccountKey = "/srv/kubernetes/service-account-key" - // volumeMountPathKubeconfig is the volume mount path for the kubeconfig which can be used by the kube-controller-manager to communicate with the kube-apiserver. - volumeMountPathKubeconfig = "/var/lib/kube-controller-manager" // volumeMountPathServer is the volume mount path for the x509 TLS server certificate and key for the HTTPS server inside the kube-controller-manager (which is used for metrics and health checks). volumeMountPathServer = "/var/lib/kube-controller-manager-server" @@ -140,9 +138,6 @@ type kubeControllerManager struct { } func (k *kubeControllerManager) Deploy(ctx context.Context) error { - if k.secrets.Kubeconfig.Name == "" || k.secrets.Kubeconfig.Checksum == "" { - return fmt.Errorf("missing kubeconfig secret information") - } if k.secrets.Server.Name == "" || k.secrets.Server.Checksum == "" { return fmt.Errorf("missing server secret information") } @@ -154,10 +149,11 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { } var ( - vpa = k.emptyVPA() - hvpa = k.emptyHVPA() - service = k.emptyService() - deployment = k.emptyDeployment() + vpa = k.emptyVPA() + hvpa = k.emptyHVPA() + service = k.emptyService() + shootAccessSecret = k.newShootAccessSecret() + deployment = k.emptyDeployment() port int32 = 10257 probeURIScheme = corev1.URISchemeHTTPS @@ -196,6 +192,10 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { return err } + if err := shootAccessSecret.Reconcile(ctx, k.seedClient); err != nil { + return err + } + if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, k.seedClient, deployment, func() error { deployment.Labels = utils.MergeStringMaps(getLabels(), map[string]string{ v1beta1constants.GardenRole: v1beta1constants.GardenRoleControlPlane, @@ -208,7 +208,6 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { Annotations: map[string]string{ "checksum/secret-" + k.secrets.CA.Name: k.secrets.CA.Checksum, "checksum/secret-" + k.secrets.ServiceAccountKey.Name: k.secrets.ServiceAccountKey.Checksum, - "checksum/secret-" + k.secrets.Kubeconfig.Name: k.secrets.Kubeconfig.Checksum, "checksum/secret-" + k.secrets.Server.Name: k.secrets.Server.Checksum, }, Labels: utils.MergeStringMaps(getLabels(), map[string]string{ @@ -220,6 +219,7 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { }), }, Spec: corev1.PodSpec{ + AutomountServiceAccountToken: pointer.Bool(false), Containers: []corev1.Container{ { Name: containerName, @@ -257,10 +257,6 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { Name: k.secrets.ServiceAccountKey.Name, MountPath: volumeMountPathServiceAccountKey, }, - { - Name: k.secrets.Kubeconfig.Name, - MountPath: volumeMountPathKubeconfig, - }, { Name: k.secrets.Server.Name, MountPath: volumeMountPathServer, @@ -285,14 +281,6 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { }, }, }, - { - Name: k.secrets.Kubeconfig.Name, - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: k.secrets.Kubeconfig.Name, - }, - }, - }, { Name: k.secrets.Server.Name, VolumeSource: corev1.VolumeSource{ @@ -304,6 +292,8 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { }, }, } + + utilruntime.Must(gutil.InjectGenericKubeconfig(deployment, shootAccessSecret.Secret.Name)) return nil }); err != nil { return err @@ -401,14 +391,16 @@ func (k *kubeControllerManager) Deploy(ctx context.Context) error { } } - // create managed resource that deploys resources to the Shoot API Server - return k.deployShootManagedResource(ctx) -} + if err := k.reconcileShootResources(ctx, shootAccessSecret.ServiceAccountName); err != nil { + return err + } -func (k *kubeControllerManager) SetSecrets(secrets Secrets) { k.secrets = secrets } -func (k *kubeControllerManager) SetShootClient(c client.Client) { - k.shootClient = c + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObject(ctx, k.seedClient, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "kube-controller-manager", Namespace: k.namespace}}) } + +func (k *kubeControllerManager) SetSecrets(secrets Secrets) { k.secrets = secrets } +func (k *kubeControllerManager) SetShootClient(c client.Client) { k.shootClient = c } func (k *kubeControllerManager) SetReplicaCount(replicas int32) { k.replicas = replicas } func (k *kubeControllerManager) Destroy(_ context.Context) error { return nil } @@ -428,6 +420,10 @@ func (k *kubeControllerManager) emptyDeployment() *appsv1.Deployment { return &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: v1beta1constants.DeploymentNameKubeControllerManager, Namespace: k.namespace}} } +func (k *kubeControllerManager) newShootAccessSecret() *gutil.ShootAccessSecret { + return gutil.NewShootAccessSecret(v1beta1constants.DeploymentNameKubeControllerManager, k.namespace) +} + func (k *kubeControllerManager) emptyManagedResource() *resourcesv1alpha1.ManagedResource { return &resourcesv1alpha1.ManagedResource{ObjectMeta: metav1.ObjectMeta{Name: managedResourceName, Namespace: k.namespace}} } @@ -459,6 +455,9 @@ func (k *kubeControllerManager) computeCommand(port int32) []string { "--allocate-node-cidrs=true", "--attach-detach-reconcile-sync-period=1m0s", "--controllers=*,bootstrapsigner,tokencleaner", + "--authentication-kubeconfig="+gutil.PathGenericKubeconfig, + "--authorization-kubeconfig="+gutil.PathGenericKubeconfig, + "--kubeconfig="+gutil.PathGenericKubeconfig, ) if k.config.NodeCIDRMaskSize != nil { @@ -470,6 +469,15 @@ func (k *kubeControllerManager) computeCommand(port int32) []string { fmt.Sprintf("--cluster-name=%s", k.namespace), fmt.Sprintf("--cluster-signing-cert-file=%s/%s", volumeMountPathCA, secrets.DataKeyCertificateCA), fmt.Sprintf("--cluster-signing-key-file=%s/%s", volumeMountPathCA, secrets.DataKeyPrivateKeyCA), + ) + + if version.ConstraintK8sGreaterEqual119.Check(k.version) { + command = append(command, "--cluster-signing-duration=720h") + } else { + command = append(command, "--experimental-cluster-signing-duration=720h") + } + + command = append(command, "--concurrent-deployment-syncs=50", "--concurrent-endpoint-syncs=15", "--concurrent-gc-syncs=30", @@ -504,7 +512,6 @@ func (k *kubeControllerManager) computeCommand(port int32) []string { command = append(command, fmt.Sprintf("--horizontal-pod-autoscaler-sync-period=%s", defaultHorizontalPodAutoscalerConfig.SyncPeriod.Duration.String()), fmt.Sprintf("--horizontal-pod-autoscaler-tolerance=%v", *defaultHorizontalPodAutoscalerConfig.Tolerance), - fmt.Sprintf("--kubeconfig=%s/%s", volumeMountPathKubeconfig, secrets.DataKeyKubeconfig), "--leader-elect=true", fmt.Sprintf("--node-monitor-grace-period=%s", nodeMonitorGracePeriod.Duration), fmt.Sprintf("--pod-eviction-timeout=%s", podEvictionTimeout.Duration), @@ -516,8 +523,6 @@ func (k *kubeControllerManager) computeCommand(port int32) []string { fmt.Sprintf("--horizontal-pod-autoscaler-downscale-stabilization=%s", defaultHorizontalPodAutoscalerConfig.DownscaleStabilization.Duration.String()), fmt.Sprintf("--horizontal-pod-autoscaler-initial-readiness-delay=%s", defaultHorizontalPodAutoscalerConfig.InitialReadinessDelay.Duration.String()), fmt.Sprintf("--horizontal-pod-autoscaler-cpu-initialization-period=%s", defaultHorizontalPodAutoscalerConfig.CPUInitializationPeriod.Duration.String()), - fmt.Sprintf("--authentication-kubeconfig=%s/%s", volumeMountPathKubeconfig, secrets.DataKeyKubeconfig), - fmt.Sprintf("--authorization-kubeconfig=%s/%s", volumeMountPathKubeconfig, secrets.DataKeyKubeconfig), fmt.Sprintf("--tls-cert-file=%s/%s", volumeMountPathServer, secrets.ControlPlaneSecretDataKeyCertificatePEM(SecretNameServer)), fmt.Sprintf("--tls-private-key-file=%s/%s", volumeMountPathServer, secrets.ControlPlaneSecretDataKeyPrivateKey(SecretNameServer)), fmt.Sprintf("--tls-cipher-suites=%s", strings.Join(kutil.TLSCipherSuites(k.version), ",")), @@ -590,8 +595,6 @@ func (k *kubeControllerManager) computeResourceRequirements(ctx context.Context) // Secrets is collection of secrets for the kube-controller-manager. type Secrets struct { - // Kubeconfig is a secret that contains a kubeconfig which can be used by the kube-controller-manager to communicate with the kube-apiserver. - Kubeconfig component.Secret // Server is a secret containing a x509 TLS server certificate and key for the HTTPS server inside the kube-controller-manager (which is used for metrics and health checks). Server component.Secret // CA is a secret containing a root CA x509 certificate and key that is used for the flags. diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/monitoring.go index a5f4c3c33..83118d70e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/monitoring.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/monitoring.go @@ -58,8 +58,9 @@ var ( scheme: https tls_config: insecure_skip_verify: true - cert_file: /etc/prometheus/seed/prometheus.crt - key_file: /etc/prometheus/seed/prometheus.key +authorization: + type: Bearer + credentials_file: /var/run/secrets/gardener.cloud/shoot/token/token honor_labels: false scrape_timeout: 15s kubernetes_sd_configs: diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/shoot_resources.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/shoot_resources.go index 5fff5bff6..d50986fc6 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/shoot_resources.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubecontrollermanager/shoot_resources.go @@ -17,14 +17,38 @@ package kubecontrollermanager import ( "context" - kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/client/kubernetes" + "github.com/gardener/gardener/pkg/utils/managedresources" + + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func (k *kubeControllerManager) deployShootManagedResource(ctx context.Context) error { - return kutil.DeleteObjects( - ctx, - k.seedClient, - k.emptyManagedResource(), - k.emptyManagedResourceSecret(), +func (k *kubeControllerManager) reconcileShootResources(ctx context.Context, serviceAccountName string) error { + var ( + registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) + + clusterRoleBinding = &rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gardener.cloud:target:kube-controller-manager", + }, + RoleRef: rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: "ClusterRole", + Name: "system:kube-controller-manager", + }, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.ServiceAccountKind, + Name: serviceAccountName, + Namespace: metav1.NamespaceSystem, + }}, + } ) + + data, err := registry.AddAllAndSerialize(clusterRoleBinding) + if err != nil { + return err + } + + return managedresources.CreateForShoot(ctx, k.seedClient, k.namespace, managedResourceName, true, data) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/monitoring.go index fe196a9b3..fbc68113a 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/monitoring.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/monitoring.go @@ -104,8 +104,9 @@ var ( scheme: https tls_config: insecure_skip_verify: true - cert_file: /etc/prometheus/seed/prometheus.crt - key_file: /etc/prometheus/seed/prometheus.key +authorization: + type: Bearer + credentials_file: /var/run/secrets/gardener.cloud/shoot/token/token honor_labels: false kubernetes_sd_configs: - role: endpoints diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/logging/kube_rbac_proxy.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/logging/kube_rbac_proxy.go index 1963d1236..1a31d8fa0 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/logging/kube_rbac_proxy.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/logging/kube_rbac_proxy.go @@ -20,40 +20,38 @@ import ( "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/operation/botanist/component" + gutil "github.com/gardener/gardener/pkg/utils/gardener" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" + corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) const ( - // ShootNodeLoggingManagedResourceName is the name of managed resources associated with Loki's kube-rbac-proxy and Promtail's RBAC. - ShootNodeLoggingManagedResourceName = "shoot-node-logging" - // LokiKubeRBACProxyName is the name of the kube-rbac-proxy image. - LokiKubeRBACProxyName = "kube-rbac-proxy" - // SecretNameLokiKubeRBACProxyKubeconfig is the name of the Loki's kube-rbac-proxy kubeconfig secret. - SecretNameLokiKubeRBACProxyKubeconfig = LokiKubeRBACProxyName + "-kubeconfig" - // KubeRBACProxyUserName is the name of the user used by Kube-RBAC-Proxy to make delegating authorization decisions. - KubeRBACProxyUserName = "gardener.cloud:logging:kube-rbac-proxy" - // PromtailRBACName is the name of the user used by promtail to auth gains Kube-RBAC-Proxy - PromtailRBACName = "gardener.cloud:logging:promtail" // PromtailName is the name used for labeling the Kubernetes resources associated with Promtail installed on the shoot nodes. PromtailName = "gardener-promtail" + // PromtailRBACName is the name of the user used by promtail to auth gains Kube-RBAC-Proxy + PromtailRBACName = "gardener.cloud:logging:promtail" + + managedResourceName = "shoot-node-logging" + + kubeRBACProxyName = "kube-rbac-proxy" + kubeRBACProxyClusterRoleName = "gardener.cloud:logging:kube-rbac-proxy" ) -// KubeRBACProxyOptions are the options for the kube-rbac-proxy. -type KubeRBACProxyOptions struct { +// Values are the values for the kube-rbac-proxy. +type Values struct { // Client to create resources with. Client client.Client // Namespace in the seed cluster. Namespace string - // IsShootNodeLoggingEnabled flag enables or disables the shoot node logging - IsShootNodeLoggingEnabled bool } // NewKubeRBACProxy creates a new instance of kubeRBACProxy for the kube-rbac-proxy. -func NewKubeRBACProxy(so *KubeRBACProxyOptions) (component.Deployer, error) { +func NewKubeRBACProxy(so *Values) (component.Deployer, error) { if so == nil { return nil, errors.New("options cannot be nil") } @@ -66,19 +64,24 @@ func NewKubeRBACProxy(so *KubeRBACProxyOptions) (component.Deployer, error) { return nil, errors.New("namespace cannot be empty") } - return &kubeRBACProxy{KubeRBACProxyOptions: so}, nil + return &kubeRBACProxy{Values: so}, nil } type kubeRBACProxy struct { - *KubeRBACProxyOptions + *Values } func (k *kubeRBACProxy) Deploy(ctx context.Context) error { + kubeRBACProxyShootAccessSecret := k.newKubeRBACProxyShootAccessSecret() + if err := kubeRBACProxyShootAccessSecret.Reconcile(ctx, k.Client); err != nil { + return err + } + var ( kubeRBACProxyClusterRolebinding = &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: KubeRBACProxyUserName, - Labels: getLabels(), + Name: kubeRBACProxyClusterRoleName, + Labels: getKubeRBACProxyLabels(), }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -86,24 +89,9 @@ func (k *kubeRBACProxy) Deploy(ctx context.Context) error { Name: "system:auth-delegator", }, Subjects: []rbacv1.Subject{{ - Kind: rbacv1.UserKind, - Name: KubeRBACProxyUserName, - }}, - } - - promtailClusterRoleBinding = &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: PromtailRBACName, - Labels: getPromtailLabels(), - }, - RoleRef: rbacv1.RoleRef{ - APIGroup: rbacv1.GroupName, - Kind: "ClusterRole", - Name: PromtailRBACName, - }, - Subjects: []rbacv1.Subject{{ - Kind: rbacv1.UserKind, - Name: PromtailRBACName, + Kind: rbacv1.ServiceAccountKind, + Name: kubeRBACProxyShootAccessSecret.ServiceAccountName, + Namespace: metav1.NamespaceSystem, }}, } @@ -141,29 +129,57 @@ func (k *kubeRBACProxy) Deploy(ctx context.Context) error { }, } + promtailClusterRoleBinding = &rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: PromtailRBACName, + Labels: getPromtailLabels(), + }, + RoleRef: rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: "ClusterRole", + Name: promtailClusterRole.Name, + }, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.UserKind, + Name: PromtailRBACName, + }}, + } + registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) ) - if !k.IsShootNodeLoggingEnabled { - return managedresources.DeleteForShoot(ctx, k.Client, k.Namespace, ShootNodeLoggingManagedResourceName) - - } - resources, err := registry.AddAllAndSerialize(kubeRBACProxyClusterRolebinding, promtailClusterRole, promtailClusterRoleBinding) if err != nil { return err } - return managedresources.CreateForShoot(ctx, k.Client, k.Namespace, ShootNodeLoggingManagedResourceName, false, resources) + if err := managedresources.CreateForShoot(ctx, k.Client, k.Namespace, managedResourceName, false, resources); err != nil { + return err + } + + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObject(ctx, k.Client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "kube-rbac-proxy-kubeconfig", Namespace: k.Namespace}}) } func (k *kubeRBACProxy) Destroy(ctx context.Context) error { - return managedresources.DeleteForShoot(ctx, k.Client, k.Namespace, ShootNodeLoggingManagedResourceName) + if err := managedresources.DeleteForShoot(ctx, k.Client, k.Namespace, managedResourceName); err != nil { + return err + } + + return kutil.DeleteObjects(ctx, k.Client, + k.newKubeRBACProxyShootAccessSecret().Secret, + // TODO(rfranzke): Remove in a future release. + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "kube-rbac-proxy-kubeconfig", Namespace: k.Namespace}}, + ) +} + +func (k *kubeRBACProxy) newKubeRBACProxyShootAccessSecret() *gutil.ShootAccessSecret { + return gutil.NewShootAccessSecret(kubeRBACProxyName, k.Values.Namespace) } -func getLabels() map[string]string { +func getKubeRBACProxyLabels() map[string]string { return map[string]string{ - "app": LokiKubeRBACProxyName, + "app": kubeRBACProxyName, } } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/metricsserver/metrics_server.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/metricsserver/metrics_server.go index ea29eb639..984332fdd 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/metricsserver/metrics_server.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/metricsserver/metrics_server.go @@ -148,6 +148,7 @@ func (m *metricsServer) computeResourcesData() (map[string][]byte, error) { Name: serviceAccountName, Namespace: metav1.NamespaceSystem, }, + AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ @@ -276,6 +277,10 @@ func (m *metricsServer) computeResourcesData() (map[string][]byte, error) { }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, Labels: utils.MergeStringMaps(getLabels(), map[string]string{ managedresources.LabelKeyOrigin: managedresources.LabelValueGardener, v1beta1constants.GardenRole: v1beta1constants.GardenRoleSystemComponent, diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/resourcemanager/resource_manager.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/resourcemanager/resource_manager.go index a344da310..d7d812aee 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/resourcemanager/resource_manager.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/resourcemanager/resource_manager.go @@ -22,19 +22,28 @@ import ( v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" + "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/operation/botanist/component" + "github.com/gardener/gardener/pkg/resourcemanager/webhook/projectedtokenmount" + "github.com/gardener/gardener/pkg/resourcemanager/webhook/tokeninvalidator" "github.com/gardener/gardener/pkg/utils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/kubernetes/health" + "github.com/gardener/gardener/pkg/utils/managedresources" "github.com/gardener/gardener/pkg/utils/retry" "github.com/gardener/gardener/pkg/utils/secrets" + admissionv1 "k8s.io/api/admission/v1" + admissionv1beta1 "k8s.io/api/admission/v1beta1" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" @@ -46,11 +55,14 @@ import ( const ( // ServiceName is the name of the service of the gardener-resource-manager. ServiceName = "gardener-resource-manager" - + // ManagedResourceName is the name for the ManagedResource containing resources deployed to the shoot cluster. + ManagedResourceName = "shoot-core-gardener-resource-manager" // SecretName is a constant for the secret name for the gardener resource manager's kubeconfig secret. SecretName = "gardener-resource-manager" // SecretNameServer is the name of the gardener-resource-manager server certificate secret. SecretNameServer = "gardener-resource-manager-server" + // LabelValue is a constant for the value of the 'app' label on Kubernetes resources. + LabelValue = "gardener-resource-manager" // UserName is the name that should be used for the secret that the gardener resource manager uses to // authenticate itself with the kube-apiserver (e.g., the common name in its client certificate). @@ -60,6 +72,8 @@ const ( containerName = v1beta1constants.DeploymentNameGardenerResourceManager healthPort = 8081 metricsPort = 8080 + serverPort = 10250 + serverServicePort = 443 roleName = "gardener-resource-manager" serviceAccountName = "gardener-resource-manager" @@ -164,6 +178,8 @@ type Values struct { LeaseDuration *time.Duration // MaxConcurrentHealthWorkers configures the number of worker threads for concurrent health reconciliation of resources MaxConcurrentHealthWorkers *int32 + // MaxConcurrentTokenInvalidatorWorkers configures the number of worker threads for concurrent token invalidator reconciliations + MaxConcurrentTokenInvalidatorWorkers *int32 // MaxConcurrentTokenRequestorWorkers configures the number of worker threads for concurrent token requestor reconciliations MaxConcurrentTokenRequestorWorkers *int32 // MaxConcurrentRootCAPublisherWorkers configures the number of worker threads for concurrent root ca publishing reconciliations @@ -176,11 +192,22 @@ type Values struct { RetryPeriod *time.Duration // SyncPeriod configures the duration of how often existing resources should be synced SyncPeriod *time.Duration + // TargetDiffersFromSourceCluster states whether the target cluster is a different one than the source cluster + TargetDiffersFromSourceCluster bool // TargetDisableCache disables the cache for target cluster and always talk directly to the API server (defaults to false) TargetDisableCache *bool // WatchedNamespace restricts the gardener-resource-manager to only watch ManagedResources in the defined namespace. // If not set the gardener-resource-manager controller watches for ManagedResources in all namespaces WatchedNamespace *string + // VPA contains information for configuring VerticalPodAutoscaler settings for the gardener-resource-manager deployment. + VPA *VPAConfig +} + +// VPAConfig contains information for configuring VerticalPodAutoscaler settings for the gardener-resource-manager deployment. +type VPAConfig struct { + // MinAllowed specifies the minimal amount of resources that will be recommended + // for the container. + MinAllowed corev1.ResourceList } func (r *resourceManager) Deploy(ctx context.Context) error { @@ -188,14 +215,23 @@ func (r *resourceManager) Deploy(ctx context.Context) error { return fmt.Errorf("missing server secret information") } - for _, fn := range []func(context.Context) error{ + fns := []func(context.Context) error{ r.ensureServiceAccount, r.ensureRBAC, r.ensureService, r.ensureDeployment, r.ensurePodDisruptionBudget, r.ensureVPA, - } { + } + + if r.values.TargetDiffersFromSourceCluster { + fns = append(fns, r.ensureShootResources) + fns = append(fns, r.ensureNetworkPolicy) + } else { + fns = append(fns, r.ensureMutatingWebhookConfiguration) + } + + for _, fn := range fns { if err := fn(ctx); err != nil { return err } @@ -214,6 +250,22 @@ func (r *resourceManager) Destroy(ctx context.Context) error { r.emptyClusterRole(), r.emptyClusterRoleBinding(), } + + if r.values.TargetDiffersFromSourceCluster { + if err := managedresources.DeleteForShoot(ctx, r.client, r.namespace, ManagedResourceName); err != nil { + return err + } + + timeoutCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + + if err := managedresources.WaitUntilDeleted(timeoutCtx, r.client, r.namespace, ManagedResourceName); err != nil { + return err + } + } else { + objectsToDelete = append(objectsToDelete, r.emptyMutatingWebhookConfiguration()) + } + role, err := r.emptyRoleInWatchedNamespace() if err == nil { objectsToDelete = append(objectsToDelete, role) @@ -231,7 +283,7 @@ func (r *resourceManager) Destroy(ctx context.Context) error { } func (r *resourceManager) ensureRBAC(ctx context.Context) error { - if targetDiffersFromSourceCluster := r.secrets.Kubeconfig.Name != ""; targetDiffersFromSourceCluster { + if r.values.TargetDiffersFromSourceCluster { if r.values.WatchedNamespace == nil { if err := r.ensureClusterRole(ctx, allowManagedResources); err != nil { return err @@ -348,14 +400,26 @@ func (r *resourceManager) ensureService(ctx context.Context) error { const ( healthPortName = "health" metricsPortName = "metrics" + serverPortName = "server" ) + // TODO(rfranzke): This can be removed in a future version. service := r.emptyService() + if err := r.client.Get(ctx, client.ObjectKeyFromObject(service), service); err != nil { + if !apierrors.IsNotFound(err) { + return err + } + } else if service.Spec.ClusterIP == corev1.ClusterIPNone { + if err2 := r.client.Delete(ctx, service); client.IgnoreNotFound(err2) != nil { + return err2 + } + } + + service = r.emptyService() _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, service, func() error { service.Labels = r.getLabels() service.Spec.Selector = appLabel() service.Spec.Type = corev1.ServiceTypeClusterIP - service.Spec.ClusterIP = corev1.ClusterIPNone desiredPorts := []corev1.ServicePort{ { Name: metricsPortName, @@ -367,6 +431,12 @@ func (r *resourceManager) ensureService(ctx context.Context) error { Protocol: corev1.ProtocolTCP, Port: healthPort, }, + { + Name: serverPortName, + Protocol: corev1.ProtocolTCP, + Port: serverServicePort, + TargetPort: intstr.FromInt(serverPort), + }, } service.Spec.Ports = kutil.ReconcileServicePorts(service.Spec.Ports, desiredPorts, corev1.ServiceTypeClusterIP) return nil @@ -600,6 +670,9 @@ func (r *resourceManager) computeCommand() []string { if r.values.MaxConcurrentTokenRequestorWorkers != nil { cmd = append(cmd, fmt.Sprintf("--token-requestor-max-concurrent-workers=%d", *r.values.MaxConcurrentTokenRequestorWorkers)) } + if r.values.MaxConcurrentTokenInvalidatorWorkers != nil { + cmd = append(cmd, fmt.Sprintf("--token-invalidator-max-concurrent-workers=%d", *r.values.MaxConcurrentTokenInvalidatorWorkers)) + } if r.values.MaxConcurrentRootCAPublisherWorkers != nil { cmd = append(cmd, fmt.Sprintf("--root-ca-publisher-max-concurrent-workers=%d", *r.values.MaxConcurrentRootCAPublisherWorkers)) } @@ -642,6 +715,7 @@ func (r *resourceManager) computeCommand() []string { if r.values.TargetDisableCache != nil { cmd = append(cmd, "--target-disable-cache") } + cmd = append(cmd, fmt.Sprintf("--port=%d", serverPort)) if r.secrets.Server.Name != "" { cmd = append(cmd, fmt.Sprintf("--tls-cert-dir=%s", volumeMountPathCerts)) } @@ -679,6 +753,14 @@ func (r *resourceManager) ensureVPA(ctx context.Context) error { vpa.Spec.UpdatePolicy = &autoscalingv1beta2.PodUpdatePolicy{ UpdateMode: &vpaUpdateMode, } + vpa.Spec.ResourcePolicy = &autoscalingv1beta2.PodResourcePolicy{ + ContainerPolicies: []autoscalingv1beta2.ContainerResourcePolicy{ + { + ContainerName: autoscalingv1beta2.DefaultContainerResourcePolicy, + MinAllowed: r.values.VPA.MinAllowed, + }, + }, + } return nil }) return err @@ -709,8 +791,186 @@ func (r *resourceManager) emptyPodDisruptionBudget() *policyv1beta1.PodDisruptio return &policyv1beta1.PodDisruptionBudget{ObjectMeta: metav1.ObjectMeta{Name: "gardener-resource-manager", Namespace: r.namespace}} } +func (r *resourceManager) ensureMutatingWebhookConfiguration(ctx context.Context) error { + mutatingWebhookConfiguration := r.emptyMutatingWebhookConfiguration() + + _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, mutatingWebhookConfiguration, func() error { + mutatingWebhookConfiguration.Labels = appLabel() + mutatingWebhookConfiguration.Webhooks = GetMutatingWebhookConfigurationWebhooks(r.buildWebhookNamespaceSelector(), r.buildWebhookClientConfig) + return nil + }) + return err +} + +func (r *resourceManager) emptyMutatingWebhookConfiguration() *admissionregistrationv1.MutatingWebhookConfiguration { + suffix := "" + if r.values.TargetDiffersFromSourceCluster { + suffix = "-shoot" + } + return &admissionregistrationv1.MutatingWebhookConfiguration{ObjectMeta: metav1.ObjectMeta{Name: "gardener-resource-manager" + suffix, Namespace: r.namespace}} +} + +func (r *resourceManager) ensureShootResources(ctx context.Context) error { + var ( + registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) + + mutatingWebhookConfiguration = r.emptyMutatingWebhookConfiguration() + ) + + mutatingWebhookConfiguration.Labels = appLabel() + mutatingWebhookConfiguration.Webhooks = GetMutatingWebhookConfigurationWebhooks(r.buildWebhookNamespaceSelector(), r.buildWebhookClientConfig) + + data, err := registry.AddAllAndSerialize(mutatingWebhookConfiguration) + if err != nil { + return err + } + + return managedresources.CreateForShoot(ctx, r.client, r.namespace, ManagedResourceName, false, data) +} + +func (r *resourceManager) ensureNetworkPolicy(ctx context.Context) error { + networkPolicy := r.emptyNetworkPolicy() + protocol := corev1.ProtocolTCP + port := intstr.FromInt(serverPort) + + _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, networkPolicy, func() error { + networkPolicy.Labels = r.getLabels() + networkPolicy.Annotations = map[string]string{ + v1beta1constants.GardenerDescription: "Allows Egress from shoot's kube-apiserver pods to gardener-resource-manager pods.", + } + networkPolicy.Spec = networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + v1beta1constants.LabelApp: v1beta1constants.LabelKubernetes, + v1beta1constants.LabelRole: v1beta1constants.LabelAPIServer, + v1beta1constants.GardenRole: v1beta1constants.GardenRoleControlPlane, + }, + }, + Egress: []networkingv1.NetworkPolicyEgressRule{{ + To: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: appLabel(), + }, + }}, + Ports: []networkingv1.NetworkPolicyPort{{ + Protocol: &protocol, + Port: &port, + }}, + }}, + PolicyTypes: []networkingv1.PolicyType{ + networkingv1.PolicyTypeEgress, + }, + } + return nil + }) + return err +} + +func (r *resourceManager) emptyNetworkPolicy() *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ObjectMeta: metav1.ObjectMeta{Name: "allow-kube-apiserver-to-gardener-resource-manager", Namespace: r.namespace}} +} + +// GetMutatingWebhookConfigurationWebhooks returns the MutatingWebhooks for the resourcemanager component for reuse +// between the component and integration tests. +func GetMutatingWebhookConfigurationWebhooks(namespaceSelector *metav1.LabelSelector, buildClientConfigFn func(string) admissionregistrationv1.WebhookClientConfig) []admissionregistrationv1.MutatingWebhook { + var ( + failurePolicy = admissionregistrationv1.Fail + matchPolicy = admissionregistrationv1.Exact + sideEffect = admissionregistrationv1.SideEffectClassNone + ) + + return []admissionregistrationv1.MutatingWebhook{ + { + Name: "token-invalidator.resources.gardener.cloud", + Rules: []admissionregistrationv1.RuleWithOperations{{ + Rule: admissionregistrationv1.Rule{ + APIGroups: []string{corev1.GroupName}, + APIVersions: []string{corev1.SchemeGroupVersion.Version}, + Resources: []string{"secrets"}, + }, + Operations: []admissionregistrationv1.OperationType{ + admissionregistrationv1.Create, + admissionregistrationv1.Update, + }, + }}, + NamespaceSelector: namespaceSelector, + ObjectSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{resourcesv1alpha1.ResourceManagerPurpose: resourcesv1alpha1.LabelPurposeTokenInvalidation}, + }, + ClientConfig: buildClientConfigFn(tokeninvalidator.WebhookPath), + AdmissionReviewVersions: []string{admissionv1beta1.SchemeGroupVersion.Version, admissionv1.SchemeGroupVersion.Version}, + FailurePolicy: &failurePolicy, + MatchPolicy: &matchPolicy, + SideEffects: &sideEffect, + TimeoutSeconds: pointer.Int32(10), + }, + { + Name: "projected-token-mount.resources.gardener.cloud", + Rules: []admissionregistrationv1.RuleWithOperations{{ + Rule: admissionregistrationv1.Rule{ + APIGroups: []string{corev1.GroupName}, + APIVersions: []string{corev1.SchemeGroupVersion.Version}, + Resources: []string{"pods"}, + }, + Operations: []admissionregistrationv1.OperationType{admissionregistrationv1.Create}, + }}, + NamespaceSelector: namespaceSelector, + ObjectSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: resourcesv1alpha1.ProjectedTokenSkip, + Operator: metav1.LabelSelectorOpDoesNotExist, + }, + { + Key: v1beta1constants.LabelApp, + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{"gardener-resource-manager"}, + }, + }, + }, + ClientConfig: buildClientConfigFn(projectedtokenmount.WebhookPath), + AdmissionReviewVersions: []string{admissionv1beta1.SchemeGroupVersion.Version, admissionv1.SchemeGroupVersion.Version}, + FailurePolicy: &failurePolicy, + MatchPolicy: &matchPolicy, + SideEffects: &sideEffect, + TimeoutSeconds: pointer.Int32(10), + }, + } +} + +func (r *resourceManager) buildWebhookNamespaceSelector() *metav1.LabelSelector { + namespaceSelectorOperator := metav1.LabelSelectorOpIn + if !r.values.TargetDiffersFromSourceCluster { + namespaceSelectorOperator = metav1.LabelSelectorOpNotIn + } + + return &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: v1beta1constants.GardenerPurpose, + Operator: namespaceSelectorOperator, + Values: []string{metav1.NamespaceSystem, "kubernetes-dashboard"}, + }}, + } +} + +func (r *resourceManager) buildWebhookClientConfig(path string) admissionregistrationv1.WebhookClientConfig { + clientConfig := admissionregistrationv1.WebhookClientConfig{CABundle: r.secrets.ServerCA.Data[secrets.DataKeyCertificateCA]} + + if r.values.TargetDiffersFromSourceCluster { + clientConfig.URL = pointer.String(fmt.Sprintf("https://%s.%s:%d%s", ServiceName, r.namespace, serverServicePort, path)) + } else { + clientConfig.Service = &admissionregistrationv1.ServiceReference{ + Name: ServiceName, + Namespace: r.namespace, + Path: &path, + } + } + + return clientConfig +} + func (r *resourceManager) getLabels() map[string]string { - if partOfShootControlPlane := r.secrets.Kubeconfig.Name != ""; partOfShootControlPlane { + if r.values.TargetDiffersFromSourceCluster { return utils.MergeStringMaps(appLabel(), map[string]string{ v1beta1constants.GardenRole: v1beta1constants.GardenRoleControlPlane, }) @@ -721,7 +981,7 @@ func (r *resourceManager) getLabels() map[string]string { func (r *resourceManager) getDeploymentTemplateLabels() map[string]string { role := v1beta1constants.GardenRoleSeed - if partOfShootControlPlane := r.secrets.Kubeconfig.Name != ""; partOfShootControlPlane { + if r.values.TargetDiffersFromSourceCluster { role = v1beta1constants.GardenRoleControlPlane } @@ -731,11 +991,12 @@ func (r *resourceManager) getDeploymentTemplateLabels() map[string]string { } func (r *resourceManager) getNetworkPolicyLabels() map[string]string { - if partOfShootControlPlane := r.secrets.Kubeconfig.Name != ""; partOfShootControlPlane { + if r.values.TargetDiffersFromSourceCluster { return map[string]string{ - v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, - v1beta1constants.LabelNetworkPolicyToShootAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, - v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, + v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, + v1beta1constants.LabelNetworkPolicyToShootAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, + v1beta1constants.LabelNetworkPolicyFromShootAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, + v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, } } @@ -744,7 +1005,7 @@ func (r *resourceManager) getNetworkPolicyLabels() map[string]string { func appLabel() map[string]string { return map[string]string{ - v1beta1constants.LabelApp: "gardener-resource-manager", + v1beta1constants.LabelApp: LabelValue, } } @@ -787,6 +1048,9 @@ type Secrets struct { // Kubeconfig enables the gardener-resource-manager to deploy resources into a different cluster than the one it is // running in. Kubeconfig component.Secret + // ServerCA is a secret containing a CA certificate which was used to sign the server certificate provided in the + // 'Server' secret. + ServerCA component.Secret // Server is a secret containing a x509 TLS server certificate and key for the HTTPS server inside the // gardener-resource-manager (which is used for webhooks). Server component.Secret diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/seedadmissioncontroller/seedadmissioncontroller.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/seedadmissioncontroller/seedadmissioncontroller.go index 50343cd49..16377a117 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/seedadmissioncontroller/seedadmissioncontroller.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/seedadmissioncontroller/seedadmissioncontroller.go @@ -112,6 +112,7 @@ func (g *gardenerSeedAdmissionController) Deploy(ctx context.Context) error { Namespace: g.namespace, Labels: getLabels(), }, + AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ @@ -206,7 +207,13 @@ func (g *gardenerSeedAdmissionController) Deploy(ctx context.Context) error { }, Selector: &metav1.LabelSelector{MatchLabels: getLabels()}, Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{Labels: getLabels()}, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, + Labels: getLabels(), + }, Spec: corev1.PodSpec{ Affinity: &corev1.Affinity{ PodAntiAffinity: &corev1.PodAntiAffinity{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnseedserver/vpn_seed_server.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnseedserver/vpn_seed_server.go index 71ce6cf29..31359c6ab 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnseedserver/vpn_seed_server.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnseedserver/vpn_seed_server.go @@ -53,8 +53,6 @@ const ( VpnSeedServerTLSAuth = "vpn-seed-server-tlsauth" // vpnSeedServerDH is the name of seed server DH Secret. vpnSeedServerDH = "vpn-seed-server-dh" - // VpnShootSecretName is the name of the shoot secret. - VpnShootSecretName = "vpn-shoot-client" // DeploymentName is the name of vpn seed server deployment. DeploymentName = v1beta1constants.DeploymentNameVPNSeedServer // ServiceName is the name of the vpn seed server service running internally on the control plane in seed. @@ -71,6 +69,7 @@ const ( mountPathTLSAuth = "/srv/secrets/tlsauth" mountPathDH = "/srv/secrets/dh" volumeNameEnvoyConfig = "envoy-config" + envoyMetricsPort = 15000 ) // Interface contains functions for a vpn-seed-server deployer. @@ -254,6 +253,19 @@ func (v *vpnSeedServer) Deploy(ctx context.Context) error { }, }, }, + { + From: []networkingv1.NetworkPolicyPeer{ + { + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + v1beta1constants.GardenRole: v1beta1constants.GardenRoleMonitoring, + v1beta1constants.LabelApp: v1beta1constants.StatefulSetNamePrometheus, + v1beta1constants.LabelRole: v1beta1constants.GardenRoleMonitoring, + }, + }, + }, + }, + }, { From: []networkingv1.NetworkPolicyPeer{ { @@ -356,6 +368,14 @@ func (v *vpnSeedServer) Deploy(ctx context.Context) error { Name: "POD_NETWORK", Value: v.podNetwork, }, + { + Name: "LOCAL_NODE_IP", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "status.hostIP", + }, + }, + }, }, ReadinessProbe: &corev1.Probe{ Handler: corev1.Handler{ @@ -551,6 +571,11 @@ func (v *vpnSeedServer) Deploy(ctx context.Context) error { Port: EnvoyPort, TargetPort: intstr.FromInt(EnvoyPort), }, + { + Name: "metrics", + Port: envoyMetricsPort, + TargetPort: intstr.FromInt(envoyMetricsPort), + }, } service.Spec.Selector = map[string]string{ v1beta1constants.LabelApp: DeploymentName, @@ -716,6 +741,28 @@ var envoyConfig = `static_resources: typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http + access_log: + - name: envoy.access_loggers.stdout + filter: + or_filter: + filters: + - status_code_filter: + comparison: + op: GE + value: + default_value: 500 + runtime_key: "null" + - duration_filter: + comparison: + op: GE + value: + default_value: 1000 + runtime_key: "null" + typed_config: + "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog + log_format: + text_format_source: + inline_string: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% rx %BYTES_SENT% tx %DURATION%ms \"%DOWNSTREAM_REMOTE_ADDRESS%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\"\n" route_config: name: local_route virtual_hosts: @@ -742,6 +789,33 @@ var envoyConfig = `static_resources: accept_http_10: true upgrade_configs: - upgrade_type: CONNECT + - name: metrics_listener + address: + socket_address: + address: 0.0.0.0 + port_value: ` + fmt.Sprintf("%d", envoyMetricsPort) + ` + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: stats_server + route_config: + virtual_hosts: + - name: admin_interface + domains: + - "*" + routes: + - match: + prefix: "/metrics" + headers: + - name: ":method" + exact_match: GET + route: + cluster: prometheus_stats + prefix_rewrite: "/stats/prometheus" + http_filters: + - name: envoy.filters.http.router clusters: - name: dynamic_forward_proxy_cluster connect_timeout: 20s @@ -752,4 +826,19 @@ var envoyConfig = `static_resources: "@type": type.googleapis.com/envoy.extensions.clusters.dynamic_forward_proxy.v3.ClusterConfig dns_cache_config: name: dynamic_forward_proxy_cache_config - dns_lookup_family: V4_ONLY` + dns_lookup_family: V4_ONLY + - name: prometheus_stats + connect_timeout: 0.25s + type: static + load_assignment: + cluster_name: prometheus_stats + endpoints: + - lb_endpoints: + - endpoint: + address: + pipe: + path: /var/run/envoy.admin +admin: + address: + pipe: + path: /var/run/envoy.admin` diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/logging.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/logging.go new file mode 100644 index 000000000..4852e15c2 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/vpnshoot/logging.go @@ -0,0 +1,42 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpnshoot + +import ( + "github.com/gardener/gardener/pkg/operation/botanist/component" +) + +const ( + loggingParserName = "vpnShootParser" + loggingParser = `[PARSER] + Name ` + loggingParserName + ` + Format regex + Regex ^(?