diff --git a/docs/api-reference/core.md b/docs/api-reference/core.md
index c8836d94518..ad740d04661 100644
--- a/docs/api-reference/core.md
+++ b/docs/api-reference/core.md
@@ -522,6 +522,19 @@ During maintenance upgrades, the image that matches most capabilities will be se
+
+
+status
+
+
+CloudProfileStatus
+
+
+ |
+
+ Status contains the current status of the cloud profile.
+ |
+
ControllerDeployment
@@ -3887,6 +3900,51 @@ During maintenance upgrades, the image that matches most capabilities will be se
+CloudProfileStatus
+
+
+(Appears on:
+CloudProfile)
+
+
+
CloudProfileStatus contains the status of the cloud profile.
+
+
+
+
+| Field |
+Description |
+
+
+
+
+
+kubernetesVersions
+
+
+[]ExpirableVersionStatus
+
+
+ |
+
+ KubernetesVersions contains the statuses of the kubernetes versions.
+ |
+
+
+
+machineImageVersions
+
+
+[]MachineImageVersionStatus
+
+
+ |
+
+ MachineImageVersions contains the statuses of the machine image versions.
+ |
+
+
+
ClusterAutoscaler
@@ -5652,7 +5710,7 @@ Kubernetes meta/v1.Time
(Optional)
- ExpirationDate defines the time at which this version expires.
+Deprecated: Is replaced by Lifecycle.
|
@@ -5666,7 +5724,66 @@ VersionClassification
|
(Optional)
- Classification defines the state of a version (preview, supported, deprecated)
+Classification defines the state of a version (preview, supported, deprecated).
+Deprecated: Is replaced by Lifecycle.
+ |
+
+
+
+lifecycle
+
+
+[]LifecycleStage
+
+
+ |
+
+(Optional)
+ Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with Classification and ExpirationDate.
+ |
+
+
+
+ExpirableVersionStatus
+
+
+(Appears on:
+CloudProfileStatus,
+MachineImageVersionStatus)
+
+
+
ExpirableVersionStatus defines the current status of an expirable version.
+
+
+
+
+| Field |
+Description |
+
+
+
+
+
+version
+
+string
+
+ |
+
+ Version is the version identifier.
+ |
+
+
+
+classification
+
+
+VersionClassification
+
+
+ |
+
+ Classification reflects the current state in the classification lifecycle.
|
@@ -8262,6 +8379,51 @@ LastOperationType
LastOperationType is a string alias.
+LifecycleStage
+
+
+(Appears on:
+ExpirableVersion)
+
+
+
+
+
+
+| Field |
+Description |
+
+
+
+
+
+classification
+
+
+VersionClassification
+
+
+ |
+
+ Classification is the category of this lifecycle stage (unavailable, preview, supported, deprecated, expired).
+ |
+
+
+
+startTime
+
+
+Kubernetes meta/v1.Time
+
+
+ |
+
+(Optional)
+ StartTime defines when this lifecycle stage becomes active.
+ |
+
+
+
Limits
@@ -8674,6 +8836,48 @@ the machine image version.
+MachineImageVersionStatus
+
+
+(Appears on:
+CloudProfileStatus)
+
+
+
+
+
+
+| Field |
+Description |
+
+
+
+
+
+name
+
+string
+
+ |
+
+ Name matches the name of the MachineImage the status is represented of.
+ |
+
+
+
+versions
+
+
+[]ExpirableVersionStatus
+
+
+ |
+
+ Versions contains the statuses of the machine image versions.
+ |
+
+
+
MachineType
@@ -14103,7 +14307,9 @@ string
(string alias)
(Appears on:
-ExpirableVersion)
+ExpirableVersion,
+ExpirableVersionStatus,
+LifecycleStage)
VersionClassification is the logical state of a version.
diff --git a/docs/usage/shoot-operations/shoot_versions.md b/docs/usage/shoot-operations/shoot_versions.md
index f232ad51ad9..4181ef0e7fd 100644
--- a/docs/usage/shoot-operations/shoot_versions.md
+++ b/docs/usage/shoot-operations/shoot_versions.md
@@ -35,16 +35,44 @@ Moreover, this allows Gardener to "understand" the current state of a version an
- I can determine the time when my Shoot clusters Machine image and Kubernetes version will be forcefully updated to the next patch or minor version (in case the cluster is running a deprecated version with an expiration date).
- I can get this information via API from the `CloudProfile`.
-## Version Classifications
+## Version Classification Lifecycles
+
+Kubernetes and machine image versions in the `CloudProfile` are classified into individual stages: `unavailable`, `preview`, `supported`, `deprecated`, and `expired`.
+
+Administrators may define a classification lifecycle, promoting versions through these lifecycle stages depending on time. The current classification stage is evaluated by the cloud profile reconciler and patched into the `status` subresource of the `CloudProfile`. If an administrator does not specify a classification lifecycle, the version defaults to `supported`.
-Administrators can classify versions into four distinct "logical states": `preview`, `supported`, `deprecated`, and `expired`.
The version classification serves as a "point-of-reference" for end-users and also has implications during shoot creation and the maintenance time.
-If a version is unclassified, Gardener cannot make those decision based on the "logical state".
-Nevertheless, Gardener can operate without version classifications and can be added at any time to the Kubernetes and machine image versions in the `CloudProfile`.
+As a best practice, versions usually start with the classification `preview`, then are promoted to `supported`, eventually `deprecated` and finally `expired`. Here is an example:
-As a best practice, versions usually start with the classification `preview`, then are promoted to `supported`, eventually `deprecated` and finally `expired`.
-This information is programmatically available in the `CloudProfiles` of the Garden cluster.
+```yaml
+# assume that the current date is 2024-12-03
+apiVersion: core.gardener.cloud/v1beta1
+kind: CloudProfile
+metadata:
+ name: local
+spec:
+ kubernetes:
+ versions:
+ - version: 1.30.6
+ lifecycle:
+ - classification: preview # starts in preview because no start time is defined
+ - classification: supported
+ startTime: "2024-12-01T00:00:00Z"
+ - classification: deprecated
+ startTime: "2025-03-01T00:00:00Z"
+ - classification: expired
+ startTime: "2025-04-01T00:00:00Z"
+status:
+ kubernetes:
+ versions:
+ - version: 1.30.6
+ classification: supported
+```
+
+The classification stages must occur in a specific order and the start time must reflect this order. Here is a list of the available classification stages in the order they can appear:
+
+- **unavailable:** An `unavailable` version is planned to become available in the future. It is not possible to reference this version in this stage and can be used by administrators to schedule a new version release. Usually there is no need to explicitly declare this stage in the classification lifecycle because it can be automatically derived when the current time is before the first specified lifecycle stage.
- **preview:** A `preview` version is a new version that has not yet undergone thorough testing, possibly a new release, and needs time to be validated.
Due to its short early age, there is a higher probability of undiscovered issues and is therefore not yet recommended for production usage.
@@ -60,39 +88,59 @@ Typically for Kubernetes versions, the latest Kubernetes patch versions of the a
New Shoots should not use this version anymore.
Existing Shoots will be updated to a newer version if `auto-update` is enabled (`.spec.maintenance.autoUpdate.kubernetesVersion` for Kubernetes version `auto-update`, or `.spec.maintenance.autoUpdate.machineImageVersion` for machine image version `auto-update`).
Using automatic upgrades, however, does not guarantee that a Shoot runs a non-deprecated version, as the latest version (overall or of the minor version) can be deprecated as well.
-Deprecated versions **should** have an expiration date set for eventual expiration.
-- **expired:** An `expired` versions has an expiration date (based on the [Golang time package](https://golang.org/src/time/time.go)) in the past.
-New clusters with that version cannot be created and existing clusters are forcefully migrated to a higher version during the maintenance time.
+- **expired:** An `expired` version cannot be used to create a new cluster and existing clusters are forcefully migrated to a higher version during the maintenance time.
-Below is an example how the relevant section of the `CloudProfile` might look like:
+Below is a more complex example illustrating different scenarios for lifecycle classifications:
-``` yaml
+```yaml
apiVersion: core.gardener.cloud/v1beta1
kind: CloudProfile
metadata:
- name: alicloud
+ name: local
spec:
kubernetes:
versions:
- - classification: preview
- version: 1.27.0
- - classification: preview
- version: 1.26.3
- - classification: supported
- version: 1.26.2
- - classification: preview
- version: 1.25.5
- - classification: supported
- version: 1.25.4
- - classification: supported
- version: 1.24.6
- - classification: deprecated
- expirationDate: "2022-11-30T23:59:59Z"
- version: 1.24.5
+ # if an administrator deploys just the version without any lifecycle,
+ # the reconciler will evaluate the classification status to supported
+ - version: 1.27.0
+
+ # when introducing a new version it may not contain any deprecation or expiration date yet
+ - version: 1.28.0
+ lifecycle:
+ - classification: preview
+ - classification: supported
+ startTime: 2024-12-01T00:00:00Z"
+
+ # it is not strictly required that every lifecycle stage must occur,
+ # they can also be dropped as long as their general order is maintained
+ - version: 1.18.0
+ lifecycle:
+ - classification: supported
+ - classification: expired
+ startTime: 2022-06-01T00:00:00Z"
+
+ # to schedule a new version release, the administrator can define the start times
+ # of all lifecycle events in the future, such that the classification status will
+ # be evaluated to unavailable
+ - version: 2.0.0
+ lifecycle:
+ - classification: preview
+ startTime: 2036-02-07T06:28:16Z"
+status:
+ kubernetes:
+ versions:
+ - version: 1.27.0
+ classification: supported
+ - version: 1.28.0
+ classification: supported
+ - version: 1.18.0
+ classification: expired
+ - version: 2.0.0
+ classification: unavailable
```
-## Automatic Version Upgrades
+## Automatic Version Upgrades
There are two ways, the Kubernetes version of the control plane as well as the Kubernetes and machine image version of a worker pool can be upgraded: `auto update` and `forceful` update.
See [Automatic Version Updates](../shoot/shoot_maintenance.md#automatic-version-updates) for how to enable `auto updates` for Kubernetes or machine image versions on the Shoot cluster.
@@ -104,7 +152,7 @@ This happens **even if the owner has opted out of automatic cluster updates!**
- The `Shoot` has auto-update enabled and the version is not the *latest eligible version* for the auto-update. Please note that this *latest version* that qualifies for an auto-update is not necessarily the overall latest version in the CloudProfile:
- For Kubernetes version, the latest eligible version for auto-updates is the latest patch version of the current minor.
- For machine image version, the latest eligible version for auto-updates is controlled by the `updateStrategy` field of the machine image in the CloudProfile.
-- The `Shoot` has auto-update disabled and the version is either expired or does not exist.
+- The `Shoot` has auto-update disabled and the version is either expired or does not exist.
The auto update can fail if the version is already on the *latest eligible version* for the auto-update. A failed auto update triggers a **force update**.
The force and auto update path for Kubernetes and machine image versions differ slightly and are described in more detail below.
@@ -135,7 +183,7 @@ machineImages:
- name: suse-chost
updateStrategy: patch
versions:
- - version: 15.3.20220818
+ - version: 15.3.20220818
- version: 15.3.20221118
```
diff --git a/extensions/pkg/bastion/machine.go b/extensions/pkg/bastion/machine.go
index 937bead203d..a46a48f396a 100644
--- a/extensions/pkg/bastion/machine.go
+++ b/extensions/pkg/bastion/machine.go
@@ -85,7 +85,7 @@ func findSupportedArchitectures(images []gardencorev1beta1.MachineImage, machine
// Skip versions that are not the specified one.
continue
}
- if version.Classification != nil && *version.Classification == gardencorev1beta1.ClassificationSupported {
+ if v1beta1helper.VersionIsSupported(version.ExpirableVersion) {
architectures.Insert(v1beta1helper.GetArchitecturesFromImageVersion(version)...)
}
if machineImageVersion != "" {
@@ -132,7 +132,7 @@ func getImageName(bastion *gardencorev1beta1.Bastion, images []gardencorev1beta1
// take the first image from cloud profile that is supported and arch compatible
for _, image := range images {
for _, version := range image.Versions {
- if version.Classification == nil || *version.Classification != gardencorev1beta1.ClassificationSupported {
+ if !v1beta1helper.VersionIsSupported(version.ExpirableVersion) {
continue
}
if !slices.Contains(v1beta1helper.GetArchitecturesFromImageVersion(version), arch) {
@@ -161,7 +161,7 @@ func getImageVersion(bastion *gardencorev1beta1.Bastion, imageName, machineArch
return "", fmt.Errorf("image version %s not found not found in cloudProfile", *bastion.MachineImage.Version)
}
- if image.Versions[versionIndex].Classification != nil && *image.Versions[versionIndex].Classification != gardencorev1beta1.ClassificationSupported {
+ if !v1beta1helper.VersionIsSupported(image.Versions[versionIndex].ExpirableVersion) {
return "", fmt.Errorf("specified image %s in version %s is not classified supported", imageName, *bastion.MachineImage.Version)
}
@@ -170,7 +170,7 @@ func getImageVersion(bastion *gardencorev1beta1.Bastion, imageName, machineArch
var greatest *semver.Version
for _, version := range image.Versions {
- if version.Classification == nil || *version.Classification != gardencorev1beta1.ClassificationSupported {
+ if !v1beta1helper.VersionIsSupported(version.ExpirableVersion) {
continue
}
diff --git a/pkg/apis/core/helper/cloudprofile.go b/pkg/apis/core/helper/cloudprofile.go
index 5eb7fd992fa..0f6af3c0688 100644
--- a/pkg/apis/core/helper/cloudprofile.go
+++ b/pkg/apis/core/helper/cloudprofile.go
@@ -7,6 +7,8 @@ package helper
import (
"errors"
"fmt"
+ "slices"
+ "time"
"github.com/Masterminds/semver/v3"
"k8s.io/apimachinery/pkg/util/sets"
@@ -16,6 +18,70 @@ import (
"github.com/gardener/gardener/pkg/utils"
)
+func CurrentLifecycleClassification(version core.ExpirableVersion) core.VersionClassification {
+ var (
+ currentClassification = core.ClassificationUnavailable
+ currentTime = time.Now()
+ )
+
+ if version.Classification != nil || version.ExpirationDate != nil {
+ // old cloud profile definition, convert to lifecycle
+ // this can be removed as soon as we remove the old classification and expiration date fields
+
+ if version.Classification != nil {
+ version.Lifecycle = append(version.Lifecycle, core.LifecycleStage{
+ Classification: *version.Classification,
+ })
+ }
+
+ if version.ExpirationDate != nil {
+ if version.Classification == nil {
+ version.Lifecycle = append(version.Lifecycle, core.LifecycleStage{
+ Classification: core.ClassificationSupported,
+ })
+ }
+
+ version.Lifecycle = append(version.Lifecycle, core.LifecycleStage{
+ Classification: core.ClassificationExpired,
+ StartTime: version.ExpirationDate,
+ })
+ }
+ }
+
+ if len(version.Lifecycle) == 0 {
+ // when there is no classification lifecycle defined then default to supported
+ version.Lifecycle = append(version.Lifecycle, core.LifecycleStage{
+ Classification: core.ClassificationSupported,
+ })
+ }
+
+ for _, stage := range version.Lifecycle {
+ startTime := time.Time{}
+ if stage.StartTime != nil {
+ startTime = stage.StartTime.Time
+ }
+
+ if startTime.Before(currentTime) {
+ currentClassification = stage.Classification
+ }
+ }
+
+ return currentClassification
+}
+
+func VersionIsSupported(version core.ExpirableVersion) bool {
+ return CurrentLifecycleClassification(version) == core.ClassificationSupported
+}
+
+func SupportedLifecycleClassification(version core.ExpirableVersion) *core.LifecycleStage {
+ for _, stage := range version.Lifecycle {
+ if stage.Classification == core.ClassificationSupported {
+ return &stage
+ }
+ }
+ return nil
+}
+
// FindMachineImageVersion finds the machine image version in the for the given and .
// In case no machine image version can be found with the given or , false is being returned.
func FindMachineImageVersion(machineImages []core.MachineImage, name, version string) (core.MachineImageVersion, bool) {
@@ -154,12 +220,24 @@ func getVersionDiff(v1, v2 []core.ExpirableVersion) map[string]int {
return diff
}
+// MachineImageDiff contains the diff of machine images and versions between two slices of machine images.
+type MachineImageDiff struct {
+ RemovedImages sets.Set[string]
+ RemovedVersions map[string]sets.Set[string]
+ RemovedVersionClassifications map[string]map[string][]core.VersionClassification
+ AddedImages sets.Set[string]
+ AddedVersions map[string]sets.Set[string]
+}
+
// GetMachineImageDiff returns the removed and added machine images and versions from the diff of two slices.
-func GetMachineImageDiff(old, new []core.MachineImage) (removedMachineImages sets.Set[string], removedMachineImageVersions map[string]sets.Set[string], addedMachineImages sets.Set[string], addedMachineImageVersions map[string]sets.Set[string]) {
- removedMachineImages = sets.Set[string]{}
- removedMachineImageVersions = map[string]sets.Set[string]{}
- addedMachineImages = sets.Set[string]{}
- addedMachineImageVersions = map[string]sets.Set[string]{}
+func GetMachineImageDiff(old, new []core.MachineImage) MachineImageDiff {
+ diff := MachineImageDiff{
+ RemovedImages: sets.Set[string]{},
+ RemovedVersions: map[string]sets.Set[string]{},
+ RemovedVersionClassifications: map[string]map[string][]core.VersionClassification{},
+ AddedImages: sets.Set[string]{},
+ AddedVersions: map[string]sets.Set[string]{},
+ }
oldImages := utils.CreateMapFromSlice(old, func(image core.MachineImage) string { return image.Name })
newImages := utils.CreateMapFromSlice(new, func(image core.MachineImage) string { return image.Name })
@@ -170,8 +248,8 @@ func GetMachineImageDiff(old, new []core.MachineImage) (removedMachineImages set
newImage, exists := newImages[imageName]
if !exists {
// Completely removed images.
- removedMachineImages.Insert(imageName)
- removedMachineImageVersions[imageName] = oldImageVersionsSet
+ diff.RemovedImages.Insert(imageName)
+ diff.RemovedVersions[imageName] = oldImageVersionsSet
} else {
// Check for image versions diff.
newImageVersions := utils.CreateMapFromSlice(newImage.Versions, func(version core.MachineImageVersion) string { return version.Version })
@@ -179,11 +257,30 @@ func GetMachineImageDiff(old, new []core.MachineImage) (removedMachineImages set
removedDiff := oldImageVersionsSet.Difference(newImageVersionsSet)
if removedDiff.Len() > 0 {
- removedMachineImageVersions[imageName] = removedDiff
+ diff.RemovedVersions[imageName] = removedDiff
}
addedDiff := newImageVersionsSet.Difference(oldImageVersionsSet)
if addedDiff.Len() > 0 {
- addedMachineImageVersions[imageName] = addedDiff
+ diff.AddedVersions[imageName] = addedDiff
+ }
+
+ for _, version := range oldImageVersions {
+ if removedDiff.Has(version.Version) {
+ continue
+ }
+ for _, existingStage := range version.Lifecycle {
+ if slices.ContainsFunc(newImageVersions[version.Version].Lifecycle, func(newStage core.LifecycleStage) bool {
+ return newStage.Classification == existingStage.Classification
+ }) {
+ continue
+ }
+ removedClassifications := diff.RemovedVersionClassifications[imageName]
+ if removedClassifications == nil {
+ removedClassifications = make(map[string][]core.VersionClassification)
+ diff.RemovedVersionClassifications[imageName] = removedClassifications
+ }
+ removedClassifications[version.Version] = append(removedClassifications[version.Version], existingStage.Classification)
+ }
}
}
}
@@ -194,18 +291,21 @@ func GetMachineImageDiff(old, new []core.MachineImage) (removedMachineImages set
newImageVersions := utils.CreateMapFromSlice(newImage.Versions, func(version core.MachineImageVersion) string { return version.Version })
newImageVersionsSet := sets.KeySet(newImageVersions)
- addedMachineImages.Insert(imageName)
- addedMachineImageVersions[imageName] = newImageVersionsSet
+ diff.AddedImages.Insert(imageName)
+ diff.AddedVersions[imageName] = newImageVersionsSet
}
}
- return
+ return diff
}
// FilterVersionsWithClassification filters versions for a classification
func FilterVersionsWithClassification(versions []core.ExpirableVersion, classification core.VersionClassification) []core.ExpirableVersion {
var result []core.ExpirableVersion
for _, version := range versions {
- if version.Classification == nil || *version.Classification != classification {
+ if (version.Classification == nil || *version.Classification != classification) &&
+ !slices.ContainsFunc(version.Lifecycle, func(s core.LifecycleStage) bool {
+ return s.Classification == classification
+ }) {
continue
}
diff --git a/pkg/apis/core/helper/cloudprofile_test.go b/pkg/apis/core/helper/cloudprofile_test.go
index b5f9dcf09dd..713ae9c2b96 100644
--- a/pkg/apis/core/helper/cloudprofile_test.go
+++ b/pkg/apis/core/helper/cloudprofile_test.go
@@ -6,18 +6,157 @@ package helper_test
import (
"strings"
+ "time"
"github.com/Masterminds/semver/v3"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
. "github.com/onsi/gomega/gstruct"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
+ "k8s.io/utils/ptr"
"github.com/gardener/gardener/pkg/apis/core"
. "github.com/gardener/gardener/pkg/apis/core/helper"
)
-var _ = Describe("Helper", func() {
+var _ = Describe("CloudProfile Helper", func() {
+ Context("calculate the current lifecycle classification", func() {
+ var now = time.Now()
+
+ It("only version is given", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(core.ClassificationSupported))
+ })
+
+ It("unavailable classification due to scheduled lifecycle start in the future", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(core.ClassificationUnavailable))
+ })
+
+ It("version is in preview stage", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(core.ClassificationPreview))
+ })
+
+ It("full version lifecycle with version currently in supported stage", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-3 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(5 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(8 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(core.ClassificationSupported))
+ })
+
+ It("version is expired", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-4 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-3 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(core.ClassificationExpired))
+ })
+
+ It("first lifecycle start time field is optional", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Version: "1.28.5",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationPreview,
+ },
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(4 * time.Hour))),
+ },
+ {
+ Classification: core.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(5 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(core.ClassificationPreview))
+ })
+
+ It("determining supported for deprecated classification field", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Classification: ptr.To(core.ClassificationSupported),
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(core.ClassificationSupported))
+ })
+
+ It("determining expired for deprecated expiration date field", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ ExpirationDate: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(core.ClassificationExpired))
+ })
+
+ It("determining preview for deprecated classification and expiration date field", func() {
+ classification := CurrentLifecycleClassification(core.ExpirableVersion{
+ Classification: ptr.To(core.ClassificationPreview),
+ Version: "1.28.0",
+ ExpirationDate: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ })
+ Expect(classification).To(Equal(core.ClassificationPreview))
+ })
+ })
+
Describe("#FindMachineImageVersion", func() {
var machineImages []core.MachineImage
@@ -256,17 +395,18 @@ var _ = Describe("Helper", func() {
},
}
- removedImages, removedVersions, addedImages, addedVersions := GetMachineImageDiff(versions1, versions2)
+ diff := GetMachineImageDiff(versions1, versions2)
- Expect(removedImages.UnsortedList()).To(ConsistOf("image-1"))
- Expect(removedVersions).To(BeEquivalentTo(
+ Expect(diff.RemovedImages.UnsortedList()).To(ConsistOf("image-1"))
+ Expect(diff.RemovedVersions).To(BeEquivalentTo(
map[string]sets.Set[string]{
"image-1": sets.New("version-1", "version-2"),
"image-2": sets.New("version-1"),
},
))
- Expect(addedImages.UnsortedList()).To(ConsistOf("image-3"))
- Expect(addedVersions).To(BeEquivalentTo(
+ // TODO(LucaBernstein, vknabel): Add RemovedVersionClassifications case
+ Expect(diff.AddedImages.UnsortedList()).To(ConsistOf("image-3"))
+ Expect(diff.AddedVersions).To(BeEquivalentTo(
map[string]sets.Set[string]{
"image-2": sets.New("version-3"),
"image-3": sets.New("version-1", "version-2"),
@@ -291,12 +431,13 @@ var _ = Describe("Helper", func() {
},
}
- removedImages, removedVersions, addedImages, addedVersions := GetMachineImageDiff(nil, versions2)
+ diff := GetMachineImageDiff(nil, versions2)
- Expect(removedImages.UnsortedList()).To(BeEmpty())
- Expect(removedVersions).To(BeEmpty())
- Expect(addedImages.UnsortedList()).To(ConsistOf("image-2", "image-3"))
- Expect(addedVersions).To(BeEquivalentTo(
+ Expect(diff.RemovedImages.UnsortedList()).To(BeEmpty())
+ Expect(diff.RemovedVersions).To(BeEmpty())
+ // TODO(LucaBernstein, vknabel): Add RemovedVersionClassifications case
+ Expect(diff.AddedImages.UnsortedList()).To(ConsistOf("image-2", "image-3"))
+ Expect(diff.AddedVersions).To(BeEquivalentTo(
map[string]sets.Set[string]{
"image-2": sets.New("version-3"),
"image-3": sets.New("version-1", "version-2"),
@@ -321,26 +462,28 @@ var _ = Describe("Helper", func() {
},
}
- removedImages, removedVersions, addedImages, addedVersions := GetMachineImageDiff(versions1, []core.MachineImage{})
+ diff := GetMachineImageDiff(versions1, []core.MachineImage{})
- Expect(removedImages.UnsortedList()).To(ConsistOf("image-2", "image-3"))
- Expect(removedVersions).To(BeEquivalentTo(
+ Expect(diff.RemovedImages.UnsortedList()).To(ConsistOf("image-2", "image-3"))
+ Expect(diff.RemovedVersions).To(BeEquivalentTo(
map[string]sets.Set[string]{
"image-2": sets.New("version-3"),
"image-3": sets.New("version-1", "version-2"),
},
))
- Expect(addedImages.UnsortedList()).To(BeEmpty())
- Expect(addedVersions).To(BeEmpty())
+ // TODO(LucaBernstein, vknabel): Add RemovedVersionClassifications case
+ Expect(diff.AddedImages.UnsortedList()).To(BeEmpty())
+ Expect(diff.AddedVersions).To(BeEmpty())
})
It("should return the diff between two empty machine image slices", func() {
- removedImages, removedVersions, addedImages, addedVersions := GetMachineImageDiff([]core.MachineImage{}, nil)
+ diff := GetMachineImageDiff([]core.MachineImage{}, nil)
- Expect(removedImages.UnsortedList()).To(BeEmpty())
- Expect(removedVersions).To(BeEmpty())
- Expect(addedImages.UnsortedList()).To(BeEmpty())
- Expect(addedVersions).To(BeEmpty())
+ Expect(diff.RemovedImages.UnsortedList()).To(BeEmpty())
+ Expect(diff.RemovedVersions).To(BeEmpty())
+ // TODO(LucaBernstein, vknabel): Add RemovedVersionClassifications case
+ Expect(diff.AddedImages.UnsortedList()).To(BeEmpty())
+ Expect(diff.AddedVersions).To(BeEmpty())
})
})
diff --git a/pkg/apis/core/types_cloudprofile.go b/pkg/apis/core/types_cloudprofile.go
index 724803e3a5e..a71d0ac1aec 100644
--- a/pkg/apis/core/types_cloudprofile.go
+++ b/pkg/apis/core/types_cloudprofile.go
@@ -26,6 +26,8 @@ type CloudProfile struct {
metav1.ObjectMeta
// Spec defines the provider environment properties.
Spec CloudProfileSpec
+ // Status contains the current status of the cloud profile.
+ Status CloudProfileStatus
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
@@ -143,9 +145,20 @@ type ExpirableVersion struct {
// Version is the version identifier.
Version string
// ExpirationDate defines the time at which this version expires.
+ // Deprecated: Is replaced by Lifecycle.
ExpirationDate *metav1.Time
- // Classification defines the state of a version (preview, supported, deprecated)
+ // Classification defines the state of a version (preview, supported, deprecated).
+ // Deprecated: Is replaced by Lifecycle.
Classification *VersionClassification
+ // Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with deprecated Classification and ExpirationDate.
+ Lifecycle []LifecycleStage
+}
+
+type LifecycleStage struct {
+ // Classification is the category of this lifecycle stage (unavailable, preview, supported, deprecated, expired).
+ Classification VersionClassification
+ // StartTime defines when this lifecycle stage becomes active.
+ StartTime *metav1.Time
}
// MachineType contains certain properties of a machine type.
@@ -247,6 +260,29 @@ type BastionMachineType struct {
Name string
}
+// CloudProfileStatus contains the status of the cloud profile.
+type CloudProfileStatus struct {
+ // KubernetesVersions contains the statuses of the kubernetes versions.
+ KubernetesVersions []ExpirableVersionStatus
+ // MachineImageVersions contains the statuses of the machine image versions.
+ MachineImageVersions []MachineImageVersionStatus
+}
+
+type MachineImageVersionStatus struct {
+ // Name matches the name of the MachineImage the status is represented of.
+ Name string
+ // Versions contains the statuses of the machine image versions.
+ Versions []ExpirableVersionStatus
+}
+
+// ExpirableVersionStatus defines the current status of an expirable version.
+type ExpirableVersionStatus struct {
+ // Version is the version identifier.
+ Version string
+ // Classification reflects the current state in the classification lifecycle.
+ Classification VersionClassification
+}
+
// Limits configures operational limits for Shoot clusters using this CloudProfile.
// See https://github.com/gardener/gardener/blob/master/docs/usage/shoot/shoot_limits.md.
type Limits struct {
@@ -264,7 +300,21 @@ const (
// VersionClassification is the logical state of a version.
type VersionClassification string
+var order = map[VersionClassification]int{
+ ClassificationUnavailable: 0,
+ ClassificationPreview: 1,
+ ClassificationSupported: 2,
+ ClassificationDeprecated: 3,
+ ClassificationExpired: 4,
+}
+
+func (c1 VersionClassification) Compare(c2 VersionClassification) int {
+ return order[c1] - order[c2]
+}
+
const (
+ // ClassificationUnavailable indicates that a version is currently not available and is planned to become available depending on the classification lifecycle.
+ ClassificationUnavailable VersionClassification = "unavailable"
// ClassificationPreview indicates that a version has recently been added and not promoted to "Supported" yet.
// ClassificationPreview versions will not be considered for automatic Kubernetes and Machine Image patch version updates.
ClassificationPreview VersionClassification = "preview"
@@ -275,6 +325,9 @@ const (
// ClassificationDeprecated indicates that a patch version should not be used anymore, should be updated to a new version
// and will eventually expire.
ClassificationDeprecated VersionClassification = "deprecated"
+ // ClassificationExpired indicates that a version has expired.
+ // New entities with that version cannot be created and existing entities are forcefully migrated to a higher version during the maintenance time.
+ ClassificationExpired VersionClassification = "expired"
)
// MachineImageUpdateStrategy is the update strategy to use for a machine image
diff --git a/pkg/apis/core/v1beta1/generated.pb.go b/pkg/apis/core/v1beta1/generated.pb.go
index 9820bfe11e8..0fc5fd218f6 100644
--- a/pkg/apis/core/v1beta1/generated.pb.go
+++ b/pkg/apis/core/v1beta1/generated.pb.go
@@ -995,10 +995,38 @@ func (m *CloudProfileSpec) XXX_DiscardUnknown() {
var xxx_messageInfo_CloudProfileSpec proto.InternalMessageInfo
+func (m *CloudProfileStatus) Reset() { *m = CloudProfileStatus{} }
+func (*CloudProfileStatus) ProtoMessage() {}
+func (*CloudProfileStatus) Descriptor() ([]byte, []int) {
+ return fileDescriptor_ca37af0df9a5bbd2, []int{34}
+}
+func (m *CloudProfileStatus) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *CloudProfileStatus) 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 *CloudProfileStatus) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_CloudProfileStatus.Merge(m, src)
+}
+func (m *CloudProfileStatus) XXX_Size() int {
+ return m.Size()
+}
+func (m *CloudProfileStatus) XXX_DiscardUnknown() {
+ xxx_messageInfo_CloudProfileStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CloudProfileStatus proto.InternalMessageInfo
+
func (m *ClusterAutoscaler) Reset() { *m = ClusterAutoscaler{} }
func (*ClusterAutoscaler) ProtoMessage() {}
func (*ClusterAutoscaler) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{34}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{35}
}
func (m *ClusterAutoscaler) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1026,7 +1054,7 @@ var xxx_messageInfo_ClusterAutoscaler proto.InternalMessageInfo
func (m *ClusterAutoscalerOptions) Reset() { *m = ClusterAutoscalerOptions{} }
func (*ClusterAutoscalerOptions) ProtoMessage() {}
func (*ClusterAutoscalerOptions) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{35}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{36}
}
func (m *ClusterAutoscalerOptions) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1054,7 +1082,7 @@ var xxx_messageInfo_ClusterAutoscalerOptions proto.InternalMessageInfo
func (m *Condition) Reset() { *m = Condition{} }
func (*Condition) ProtoMessage() {}
func (*Condition) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{36}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{37}
}
func (m *Condition) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1082,7 +1110,7 @@ var xxx_messageInfo_Condition proto.InternalMessageInfo
func (m *ContainerRuntime) Reset() { *m = ContainerRuntime{} }
func (*ContainerRuntime) ProtoMessage() {}
func (*ContainerRuntime) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{37}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{38}
}
func (m *ContainerRuntime) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1110,7 +1138,7 @@ var xxx_messageInfo_ContainerRuntime proto.InternalMessageInfo
func (m *ControlPlane) Reset() { *m = ControlPlane{} }
func (*ControlPlane) ProtoMessage() {}
func (*ControlPlane) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{38}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{39}
}
func (m *ControlPlane) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1138,7 +1166,7 @@ var xxx_messageInfo_ControlPlane proto.InternalMessageInfo
func (m *ControlPlaneAutoscaling) Reset() { *m = ControlPlaneAutoscaling{} }
func (*ControlPlaneAutoscaling) ProtoMessage() {}
func (*ControlPlaneAutoscaling) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{39}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{40}
}
func (m *ControlPlaneAutoscaling) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1166,7 +1194,7 @@ var xxx_messageInfo_ControlPlaneAutoscaling proto.InternalMessageInfo
func (m *ControllerDeployment) Reset() { *m = ControllerDeployment{} }
func (*ControllerDeployment) ProtoMessage() {}
func (*ControllerDeployment) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{40}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{41}
}
func (m *ControllerDeployment) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1194,7 +1222,7 @@ var xxx_messageInfo_ControllerDeployment proto.InternalMessageInfo
func (m *ControllerDeploymentList) Reset() { *m = ControllerDeploymentList{} }
func (*ControllerDeploymentList) ProtoMessage() {}
func (*ControllerDeploymentList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{41}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{42}
}
func (m *ControllerDeploymentList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1222,7 +1250,7 @@ var xxx_messageInfo_ControllerDeploymentList proto.InternalMessageInfo
func (m *ControllerInstallation) Reset() { *m = ControllerInstallation{} }
func (*ControllerInstallation) ProtoMessage() {}
func (*ControllerInstallation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{42}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{43}
}
func (m *ControllerInstallation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1250,7 +1278,7 @@ var xxx_messageInfo_ControllerInstallation proto.InternalMessageInfo
func (m *ControllerInstallationList) Reset() { *m = ControllerInstallationList{} }
func (*ControllerInstallationList) ProtoMessage() {}
func (*ControllerInstallationList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{43}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{44}
}
func (m *ControllerInstallationList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1278,7 +1306,7 @@ var xxx_messageInfo_ControllerInstallationList proto.InternalMessageInfo
func (m *ControllerInstallationSpec) Reset() { *m = ControllerInstallationSpec{} }
func (*ControllerInstallationSpec) ProtoMessage() {}
func (*ControllerInstallationSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{44}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{45}
}
func (m *ControllerInstallationSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1306,7 +1334,7 @@ var xxx_messageInfo_ControllerInstallationSpec proto.InternalMessageInfo
func (m *ControllerInstallationStatus) Reset() { *m = ControllerInstallationStatus{} }
func (*ControllerInstallationStatus) ProtoMessage() {}
func (*ControllerInstallationStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{45}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{46}
}
func (m *ControllerInstallationStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1334,7 +1362,7 @@ var xxx_messageInfo_ControllerInstallationStatus proto.InternalMessageInfo
func (m *ControllerRegistration) Reset() { *m = ControllerRegistration{} }
func (*ControllerRegistration) ProtoMessage() {}
func (*ControllerRegistration) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{46}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{47}
}
func (m *ControllerRegistration) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1362,7 +1390,7 @@ var xxx_messageInfo_ControllerRegistration proto.InternalMessageInfo
func (m *ControllerRegistrationDeployment) Reset() { *m = ControllerRegistrationDeployment{} }
func (*ControllerRegistrationDeployment) ProtoMessage() {}
func (*ControllerRegistrationDeployment) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{47}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{48}
}
func (m *ControllerRegistrationDeployment) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1390,7 +1418,7 @@ var xxx_messageInfo_ControllerRegistrationDeployment proto.InternalMessageInfo
func (m *ControllerRegistrationList) Reset() { *m = ControllerRegistrationList{} }
func (*ControllerRegistrationList) ProtoMessage() {}
func (*ControllerRegistrationList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{48}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{49}
}
func (m *ControllerRegistrationList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1418,7 +1446,7 @@ var xxx_messageInfo_ControllerRegistrationList proto.InternalMessageInfo
func (m *ControllerRegistrationSpec) Reset() { *m = ControllerRegistrationSpec{} }
func (*ControllerRegistrationSpec) ProtoMessage() {}
func (*ControllerRegistrationSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{49}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{50}
}
func (m *ControllerRegistrationSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1446,7 +1474,7 @@ var xxx_messageInfo_ControllerRegistrationSpec proto.InternalMessageInfo
func (m *ControllerResource) Reset() { *m = ControllerResource{} }
func (*ControllerResource) ProtoMessage() {}
func (*ControllerResource) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{50}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{51}
}
func (m *ControllerResource) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1474,7 +1502,7 @@ var xxx_messageInfo_ControllerResource proto.InternalMessageInfo
func (m *ControllerResourceLifecycle) Reset() { *m = ControllerResourceLifecycle{} }
func (*ControllerResourceLifecycle) ProtoMessage() {}
func (*ControllerResourceLifecycle) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{51}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{52}
}
func (m *ControllerResourceLifecycle) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1502,7 +1530,7 @@ var xxx_messageInfo_ControllerResourceLifecycle proto.InternalMessageInfo
func (m *CoreDNS) Reset() { *m = CoreDNS{} }
func (*CoreDNS) ProtoMessage() {}
func (*CoreDNS) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{52}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{53}
}
func (m *CoreDNS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1530,7 +1558,7 @@ var xxx_messageInfo_CoreDNS proto.InternalMessageInfo
func (m *CoreDNSAutoscaling) Reset() { *m = CoreDNSAutoscaling{} }
func (*CoreDNSAutoscaling) ProtoMessage() {}
func (*CoreDNSAutoscaling) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{53}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{54}
}
func (m *CoreDNSAutoscaling) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1558,7 +1586,7 @@ var xxx_messageInfo_CoreDNSAutoscaling proto.InternalMessageInfo
func (m *CoreDNSRewriting) Reset() { *m = CoreDNSRewriting{} }
func (*CoreDNSRewriting) ProtoMessage() {}
func (*CoreDNSRewriting) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{54}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{55}
}
func (m *CoreDNSRewriting) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1586,7 +1614,7 @@ var xxx_messageInfo_CoreDNSRewriting proto.InternalMessageInfo
func (m *DNS) Reset() { *m = DNS{} }
func (*DNS) ProtoMessage() {}
func (*DNS) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{55}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{56}
}
func (m *DNS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1614,7 +1642,7 @@ var xxx_messageInfo_DNS proto.InternalMessageInfo
func (m *DNSIncludeExclude) Reset() { *m = DNSIncludeExclude{} }
func (*DNSIncludeExclude) ProtoMessage() {}
func (*DNSIncludeExclude) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{56}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{57}
}
func (m *DNSIncludeExclude) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1642,7 +1670,7 @@ var xxx_messageInfo_DNSIncludeExclude proto.InternalMessageInfo
func (m *DNSProvider) Reset() { *m = DNSProvider{} }
func (*DNSProvider) ProtoMessage() {}
func (*DNSProvider) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{57}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{58}
}
func (m *DNSProvider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1670,7 +1698,7 @@ var xxx_messageInfo_DNSProvider proto.InternalMessageInfo
func (m *DataVolume) Reset() { *m = DataVolume{} }
func (*DataVolume) ProtoMessage() {}
func (*DataVolume) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{58}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{59}
}
func (m *DataVolume) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1698,7 +1726,7 @@ var xxx_messageInfo_DataVolume proto.InternalMessageInfo
func (m *DeploymentRef) Reset() { *m = DeploymentRef{} }
func (*DeploymentRef) ProtoMessage() {}
func (*DeploymentRef) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{59}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{60}
}
func (m *DeploymentRef) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1726,7 +1754,7 @@ var xxx_messageInfo_DeploymentRef proto.InternalMessageInfo
func (m *DualApprovalForDeletion) Reset() { *m = DualApprovalForDeletion{} }
func (*DualApprovalForDeletion) ProtoMessage() {}
func (*DualApprovalForDeletion) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{60}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{61}
}
func (m *DualApprovalForDeletion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1754,7 +1782,7 @@ var xxx_messageInfo_DualApprovalForDeletion proto.InternalMessageInfo
func (m *ETCD) Reset() { *m = ETCD{} }
func (*ETCD) ProtoMessage() {}
func (*ETCD) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{61}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{62}
}
func (m *ETCD) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1782,7 +1810,7 @@ var xxx_messageInfo_ETCD proto.InternalMessageInfo
func (m *ETCDConfig) Reset() { *m = ETCDConfig{} }
func (*ETCDConfig) ProtoMessage() {}
func (*ETCDConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{62}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{63}
}
func (m *ETCDConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1810,7 +1838,7 @@ var xxx_messageInfo_ETCDConfig proto.InternalMessageInfo
func (m *ETCDEncryptionKeyRotation) Reset() { *m = ETCDEncryptionKeyRotation{} }
func (*ETCDEncryptionKeyRotation) ProtoMessage() {}
func (*ETCDEncryptionKeyRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{63}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{64}
}
func (m *ETCDEncryptionKeyRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1838,7 +1866,7 @@ var xxx_messageInfo_ETCDEncryptionKeyRotation proto.InternalMessageInfo
func (m *EncryptionConfig) Reset() { *m = EncryptionConfig{} }
func (*EncryptionConfig) ProtoMessage() {}
func (*EncryptionConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{64}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{65}
}
func (m *EncryptionConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1866,7 +1894,7 @@ var xxx_messageInfo_EncryptionConfig proto.InternalMessageInfo
func (m *ExpirableVersion) Reset() { *m = ExpirableVersion{} }
func (*ExpirableVersion) ProtoMessage() {}
func (*ExpirableVersion) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{65}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{66}
}
func (m *ExpirableVersion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1891,10 +1919,38 @@ func (m *ExpirableVersion) XXX_DiscardUnknown() {
var xxx_messageInfo_ExpirableVersion proto.InternalMessageInfo
+func (m *ExpirableVersionStatus) Reset() { *m = ExpirableVersionStatus{} }
+func (*ExpirableVersionStatus) ProtoMessage() {}
+func (*ExpirableVersionStatus) Descriptor() ([]byte, []int) {
+ return fileDescriptor_ca37af0df9a5bbd2, []int{67}
+}
+func (m *ExpirableVersionStatus) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ExpirableVersionStatus) 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 *ExpirableVersionStatus) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ExpirableVersionStatus.Merge(m, src)
+}
+func (m *ExpirableVersionStatus) XXX_Size() int {
+ return m.Size()
+}
+func (m *ExpirableVersionStatus) XXX_DiscardUnknown() {
+ xxx_messageInfo_ExpirableVersionStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpirableVersionStatus proto.InternalMessageInfo
+
func (m *ExposureClass) Reset() { *m = ExposureClass{} }
func (*ExposureClass) ProtoMessage() {}
func (*ExposureClass) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{66}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{68}
}
func (m *ExposureClass) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1922,7 +1978,7 @@ var xxx_messageInfo_ExposureClass proto.InternalMessageInfo
func (m *ExposureClassList) Reset() { *m = ExposureClassList{} }
func (*ExposureClassList) ProtoMessage() {}
func (*ExposureClassList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{67}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{69}
}
func (m *ExposureClassList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1950,7 +2006,7 @@ var xxx_messageInfo_ExposureClassList proto.InternalMessageInfo
func (m *ExposureClassScheduling) Reset() { *m = ExposureClassScheduling{} }
func (*ExposureClassScheduling) ProtoMessage() {}
func (*ExposureClassScheduling) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{68}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{70}
}
func (m *ExposureClassScheduling) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1978,7 +2034,7 @@ var xxx_messageInfo_ExposureClassScheduling proto.InternalMessageInfo
func (m *Extension) Reset() { *m = Extension{} }
func (*Extension) ProtoMessage() {}
func (*Extension) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{69}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{71}
}
func (m *Extension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2006,7 +2062,7 @@ var xxx_messageInfo_Extension proto.InternalMessageInfo
func (m *ExtensionResourceState) Reset() { *m = ExtensionResourceState{} }
func (*ExtensionResourceState) ProtoMessage() {}
func (*ExtensionResourceState) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{70}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{72}
}
func (m *ExtensionResourceState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2034,7 +2090,7 @@ var xxx_messageInfo_ExtensionResourceState proto.InternalMessageInfo
func (m *FailureTolerance) Reset() { *m = FailureTolerance{} }
func (*FailureTolerance) ProtoMessage() {}
func (*FailureTolerance) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{71}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{73}
}
func (m *FailureTolerance) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2062,7 +2118,7 @@ var xxx_messageInfo_FailureTolerance proto.InternalMessageInfo
func (m *Gardener) Reset() { *m = Gardener{} }
func (*Gardener) ProtoMessage() {}
func (*Gardener) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{72}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{74}
}
func (m *Gardener) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2090,7 +2146,7 @@ var xxx_messageInfo_Gardener proto.InternalMessageInfo
func (m *GardenerResourceData) Reset() { *m = GardenerResourceData{} }
func (*GardenerResourceData) ProtoMessage() {}
func (*GardenerResourceData) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{73}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{75}
}
func (m *GardenerResourceData) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2118,7 +2174,7 @@ var xxx_messageInfo_GardenerResourceData proto.InternalMessageInfo
func (m *HelmControllerDeployment) Reset() { *m = HelmControllerDeployment{} }
func (*HelmControllerDeployment) ProtoMessage() {}
func (*HelmControllerDeployment) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{74}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{76}
}
func (m *HelmControllerDeployment) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2146,7 +2202,7 @@ var xxx_messageInfo_HelmControllerDeployment proto.InternalMessageInfo
func (m *Hibernation) Reset() { *m = Hibernation{} }
func (*Hibernation) ProtoMessage() {}
func (*Hibernation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{75}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{77}
}
func (m *Hibernation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2174,7 +2230,7 @@ var xxx_messageInfo_Hibernation proto.InternalMessageInfo
func (m *HibernationSchedule) Reset() { *m = HibernationSchedule{} }
func (*HibernationSchedule) ProtoMessage() {}
func (*HibernationSchedule) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{76}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{78}
}
func (m *HibernationSchedule) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2202,7 +2258,7 @@ var xxx_messageInfo_HibernationSchedule proto.InternalMessageInfo
func (m *HighAvailability) Reset() { *m = HighAvailability{} }
func (*HighAvailability) ProtoMessage() {}
func (*HighAvailability) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{77}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{79}
}
func (m *HighAvailability) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2230,7 +2286,7 @@ var xxx_messageInfo_HighAvailability proto.InternalMessageInfo
func (m *HorizontalPodAutoscalerConfig) Reset() { *m = HorizontalPodAutoscalerConfig{} }
func (*HorizontalPodAutoscalerConfig) ProtoMessage() {}
func (*HorizontalPodAutoscalerConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{78}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{80}
}
func (m *HorizontalPodAutoscalerConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2258,7 +2314,7 @@ var xxx_messageInfo_HorizontalPodAutoscalerConfig proto.InternalMessageInfo
func (m *InPlaceUpdates) Reset() { *m = InPlaceUpdates{} }
func (*InPlaceUpdates) ProtoMessage() {}
func (*InPlaceUpdates) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{79}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{81}
}
func (m *InPlaceUpdates) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2286,7 +2342,7 @@ var xxx_messageInfo_InPlaceUpdates proto.InternalMessageInfo
func (m *InPlaceUpdatesStatus) Reset() { *m = InPlaceUpdatesStatus{} }
func (*InPlaceUpdatesStatus) ProtoMessage() {}
func (*InPlaceUpdatesStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{80}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{82}
}
func (m *InPlaceUpdatesStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2314,7 +2370,7 @@ var xxx_messageInfo_InPlaceUpdatesStatus proto.InternalMessageInfo
func (m *Ingress) Reset() { *m = Ingress{} }
func (*Ingress) ProtoMessage() {}
func (*Ingress) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{81}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{83}
}
func (m *Ingress) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2342,7 +2398,7 @@ var xxx_messageInfo_Ingress proto.InternalMessageInfo
func (m *IngressController) Reset() { *m = IngressController{} }
func (*IngressController) ProtoMessage() {}
func (*IngressController) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{82}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{84}
}
func (m *IngressController) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2370,7 +2426,7 @@ var xxx_messageInfo_IngressController proto.InternalMessageInfo
func (m *InternalSecret) Reset() { *m = InternalSecret{} }
func (*InternalSecret) ProtoMessage() {}
func (*InternalSecret) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{83}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{85}
}
func (m *InternalSecret) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2398,7 +2454,7 @@ var xxx_messageInfo_InternalSecret proto.InternalMessageInfo
func (m *InternalSecretList) Reset() { *m = InternalSecretList{} }
func (*InternalSecretList) ProtoMessage() {}
func (*InternalSecretList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{84}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{86}
}
func (m *InternalSecretList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2426,7 +2482,7 @@ var xxx_messageInfo_InternalSecretList proto.InternalMessageInfo
func (m *KubeAPIServerConfig) Reset() { *m = KubeAPIServerConfig{} }
func (*KubeAPIServerConfig) ProtoMessage() {}
func (*KubeAPIServerConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{85}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{87}
}
func (m *KubeAPIServerConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2454,7 +2510,7 @@ var xxx_messageInfo_KubeAPIServerConfig proto.InternalMessageInfo
func (m *KubeControllerManagerConfig) Reset() { *m = KubeControllerManagerConfig{} }
func (*KubeControllerManagerConfig) ProtoMessage() {}
func (*KubeControllerManagerConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{86}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{88}
}
func (m *KubeControllerManagerConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2482,7 +2538,7 @@ var xxx_messageInfo_KubeControllerManagerConfig proto.InternalMessageInfo
func (m *KubeProxyConfig) Reset() { *m = KubeProxyConfig{} }
func (*KubeProxyConfig) ProtoMessage() {}
func (*KubeProxyConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{87}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{89}
}
func (m *KubeProxyConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2510,7 +2566,7 @@ var xxx_messageInfo_KubeProxyConfig proto.InternalMessageInfo
func (m *KubeSchedulerConfig) Reset() { *m = KubeSchedulerConfig{} }
func (*KubeSchedulerConfig) ProtoMessage() {}
func (*KubeSchedulerConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{88}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{90}
}
func (m *KubeSchedulerConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2538,7 +2594,7 @@ var xxx_messageInfo_KubeSchedulerConfig proto.InternalMessageInfo
func (m *KubeletConfig) Reset() { *m = KubeletConfig{} }
func (*KubeletConfig) ProtoMessage() {}
func (*KubeletConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{89}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{91}
}
func (m *KubeletConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2566,7 +2622,7 @@ var xxx_messageInfo_KubeletConfig proto.InternalMessageInfo
func (m *KubeletConfigEviction) Reset() { *m = KubeletConfigEviction{} }
func (*KubeletConfigEviction) ProtoMessage() {}
func (*KubeletConfigEviction) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{90}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{92}
}
func (m *KubeletConfigEviction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2594,7 +2650,7 @@ var xxx_messageInfo_KubeletConfigEviction proto.InternalMessageInfo
func (m *KubeletConfigEvictionMinimumReclaim) Reset() { *m = KubeletConfigEvictionMinimumReclaim{} }
func (*KubeletConfigEvictionMinimumReclaim) ProtoMessage() {}
func (*KubeletConfigEvictionMinimumReclaim) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{91}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{93}
}
func (m *KubeletConfigEvictionMinimumReclaim) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2622,7 +2678,7 @@ var xxx_messageInfo_KubeletConfigEvictionMinimumReclaim proto.InternalMessageInf
func (m *KubeletConfigEvictionSoftGracePeriod) Reset() { *m = KubeletConfigEvictionSoftGracePeriod{} }
func (*KubeletConfigEvictionSoftGracePeriod) ProtoMessage() {}
func (*KubeletConfigEvictionSoftGracePeriod) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{92}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{94}
}
func (m *KubeletConfigEvictionSoftGracePeriod) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2650,7 +2706,7 @@ var xxx_messageInfo_KubeletConfigEvictionSoftGracePeriod proto.InternalMessageIn
func (m *KubeletConfigReserved) Reset() { *m = KubeletConfigReserved{} }
func (*KubeletConfigReserved) ProtoMessage() {}
func (*KubeletConfigReserved) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{93}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{95}
}
func (m *KubeletConfigReserved) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2678,7 +2734,7 @@ var xxx_messageInfo_KubeletConfigReserved proto.InternalMessageInfo
func (m *Kubernetes) Reset() { *m = Kubernetes{} }
func (*Kubernetes) ProtoMessage() {}
func (*Kubernetes) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{94}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{96}
}
func (m *Kubernetes) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2706,7 +2762,7 @@ var xxx_messageInfo_Kubernetes proto.InternalMessageInfo
func (m *KubernetesConfig) Reset() { *m = KubernetesConfig{} }
func (*KubernetesConfig) ProtoMessage() {}
func (*KubernetesConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{95}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{97}
}
func (m *KubernetesConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2734,7 +2790,7 @@ var xxx_messageInfo_KubernetesConfig proto.InternalMessageInfo
func (m *KubernetesDashboard) Reset() { *m = KubernetesDashboard{} }
func (*KubernetesDashboard) ProtoMessage() {}
func (*KubernetesDashboard) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{96}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{98}
}
func (m *KubernetesDashboard) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2762,7 +2818,7 @@ var xxx_messageInfo_KubernetesDashboard proto.InternalMessageInfo
func (m *KubernetesSettings) Reset() { *m = KubernetesSettings{} }
func (*KubernetesSettings) ProtoMessage() {}
func (*KubernetesSettings) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{97}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{99}
}
func (m *KubernetesSettings) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2790,7 +2846,7 @@ var xxx_messageInfo_KubernetesSettings proto.InternalMessageInfo
func (m *LastError) Reset() { *m = LastError{} }
func (*LastError) ProtoMessage() {}
func (*LastError) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{98}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{100}
}
func (m *LastError) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2818,7 +2874,7 @@ var xxx_messageInfo_LastError proto.InternalMessageInfo
func (m *LastMaintenance) Reset() { *m = LastMaintenance{} }
func (*LastMaintenance) ProtoMessage() {}
func (*LastMaintenance) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{99}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{101}
}
func (m *LastMaintenance) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2846,7 +2902,7 @@ var xxx_messageInfo_LastMaintenance proto.InternalMessageInfo
func (m *LastOperation) Reset() { *m = LastOperation{} }
func (*LastOperation) ProtoMessage() {}
func (*LastOperation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{100}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{102}
}
func (m *LastOperation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2871,10 +2927,38 @@ func (m *LastOperation) XXX_DiscardUnknown() {
var xxx_messageInfo_LastOperation proto.InternalMessageInfo
+func (m *LifecycleStage) Reset() { *m = LifecycleStage{} }
+func (*LifecycleStage) ProtoMessage() {}
+func (*LifecycleStage) Descriptor() ([]byte, []int) {
+ return fileDescriptor_ca37af0df9a5bbd2, []int{103}
+}
+func (m *LifecycleStage) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *LifecycleStage) 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 *LifecycleStage) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_LifecycleStage.Merge(m, src)
+}
+func (m *LifecycleStage) XXX_Size() int {
+ return m.Size()
+}
+func (m *LifecycleStage) XXX_DiscardUnknown() {
+ xxx_messageInfo_LifecycleStage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LifecycleStage proto.InternalMessageInfo
+
func (m *Limits) Reset() { *m = Limits{} }
func (*Limits) ProtoMessage() {}
func (*Limits) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{101}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{104}
}
func (m *Limits) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2902,7 +2986,7 @@ var xxx_messageInfo_Limits proto.InternalMessageInfo
func (m *LoadBalancerServicesProxyProtocol) Reset() { *m = LoadBalancerServicesProxyProtocol{} }
func (*LoadBalancerServicesProxyProtocol) ProtoMessage() {}
func (*LoadBalancerServicesProxyProtocol) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{102}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{105}
}
func (m *LoadBalancerServicesProxyProtocol) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2930,7 +3014,7 @@ var xxx_messageInfo_LoadBalancerServicesProxyProtocol proto.InternalMessageInfo
func (m *Machine) Reset() { *m = Machine{} }
func (*Machine) ProtoMessage() {}
func (*Machine) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{103}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{106}
}
func (m *Machine) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2958,7 +3042,7 @@ var xxx_messageInfo_Machine proto.InternalMessageInfo
func (m *MachineControllerManagerSettings) Reset() { *m = MachineControllerManagerSettings{} }
func (*MachineControllerManagerSettings) ProtoMessage() {}
func (*MachineControllerManagerSettings) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{104}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{107}
}
func (m *MachineControllerManagerSettings) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2986,7 +3070,7 @@ var xxx_messageInfo_MachineControllerManagerSettings proto.InternalMessageInfo
func (m *MachineImage) Reset() { *m = MachineImage{} }
func (*MachineImage) ProtoMessage() {}
func (*MachineImage) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{105}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{108}
}
func (m *MachineImage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3014,7 +3098,7 @@ var xxx_messageInfo_MachineImage proto.InternalMessageInfo
func (m *MachineImageVersion) Reset() { *m = MachineImageVersion{} }
func (*MachineImageVersion) ProtoMessage() {}
func (*MachineImageVersion) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{106}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{109}
}
func (m *MachineImageVersion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3039,10 +3123,38 @@ func (m *MachineImageVersion) XXX_DiscardUnknown() {
var xxx_messageInfo_MachineImageVersion proto.InternalMessageInfo
+func (m *MachineImageVersionStatus) Reset() { *m = MachineImageVersionStatus{} }
+func (*MachineImageVersionStatus) ProtoMessage() {}
+func (*MachineImageVersionStatus) Descriptor() ([]byte, []int) {
+ return fileDescriptor_ca37af0df9a5bbd2, []int{110}
+}
+func (m *MachineImageVersionStatus) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *MachineImageVersionStatus) 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 *MachineImageVersionStatus) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_MachineImageVersionStatus.Merge(m, src)
+}
+func (m *MachineImageVersionStatus) XXX_Size() int {
+ return m.Size()
+}
+func (m *MachineImageVersionStatus) XXX_DiscardUnknown() {
+ xxx_messageInfo_MachineImageVersionStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MachineImageVersionStatus proto.InternalMessageInfo
+
func (m *MachineType) Reset() { *m = MachineType{} }
func (*MachineType) ProtoMessage() {}
func (*MachineType) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{107}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{111}
}
func (m *MachineType) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3070,7 +3182,7 @@ var xxx_messageInfo_MachineType proto.InternalMessageInfo
func (m *MachineTypeStorage) Reset() { *m = MachineTypeStorage{} }
func (*MachineTypeStorage) ProtoMessage() {}
func (*MachineTypeStorage) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{108}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{112}
}
func (m *MachineTypeStorage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3098,7 +3210,7 @@ var xxx_messageInfo_MachineTypeStorage proto.InternalMessageInfo
func (m *Maintenance) Reset() { *m = Maintenance{} }
func (*Maintenance) ProtoMessage() {}
func (*Maintenance) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{109}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{113}
}
func (m *Maintenance) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3126,7 +3238,7 @@ var xxx_messageInfo_Maintenance proto.InternalMessageInfo
func (m *MaintenanceAutoUpdate) Reset() { *m = MaintenanceAutoUpdate{} }
func (*MaintenanceAutoUpdate) ProtoMessage() {}
func (*MaintenanceAutoUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{110}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{114}
}
func (m *MaintenanceAutoUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3154,7 +3266,7 @@ var xxx_messageInfo_MaintenanceAutoUpdate proto.InternalMessageInfo
func (m *MaintenanceTimeWindow) Reset() { *m = MaintenanceTimeWindow{} }
func (*MaintenanceTimeWindow) ProtoMessage() {}
func (*MaintenanceTimeWindow) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{111}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{115}
}
func (m *MaintenanceTimeWindow) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3182,7 +3294,7 @@ var xxx_messageInfo_MaintenanceTimeWindow proto.InternalMessageInfo
func (m *MemorySwapConfiguration) Reset() { *m = MemorySwapConfiguration{} }
func (*MemorySwapConfiguration) ProtoMessage() {}
func (*MemorySwapConfiguration) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{112}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{116}
}
func (m *MemorySwapConfiguration) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3210,7 +3322,7 @@ var xxx_messageInfo_MemorySwapConfiguration proto.InternalMessageInfo
func (m *Monitoring) Reset() { *m = Monitoring{} }
func (*Monitoring) ProtoMessage() {}
func (*Monitoring) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{113}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{117}
}
func (m *Monitoring) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3238,7 +3350,7 @@ var xxx_messageInfo_Monitoring proto.InternalMessageInfo
func (m *NamedResourceReference) Reset() { *m = NamedResourceReference{} }
func (*NamedResourceReference) ProtoMessage() {}
func (*NamedResourceReference) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{114}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{118}
}
func (m *NamedResourceReference) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3266,7 +3378,7 @@ var xxx_messageInfo_NamedResourceReference proto.InternalMessageInfo
func (m *NamespacedCloudProfile) Reset() { *m = NamespacedCloudProfile{} }
func (*NamespacedCloudProfile) ProtoMessage() {}
func (*NamespacedCloudProfile) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{115}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{119}
}
func (m *NamespacedCloudProfile) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3294,7 +3406,7 @@ var xxx_messageInfo_NamespacedCloudProfile proto.InternalMessageInfo
func (m *NamespacedCloudProfileList) Reset() { *m = NamespacedCloudProfileList{} }
func (*NamespacedCloudProfileList) ProtoMessage() {}
func (*NamespacedCloudProfileList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{116}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{120}
}
func (m *NamespacedCloudProfileList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3322,7 +3434,7 @@ var xxx_messageInfo_NamespacedCloudProfileList proto.InternalMessageInfo
func (m *NamespacedCloudProfileSpec) Reset() { *m = NamespacedCloudProfileSpec{} }
func (*NamespacedCloudProfileSpec) ProtoMessage() {}
func (*NamespacedCloudProfileSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{117}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{121}
}
func (m *NamespacedCloudProfileSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3350,7 +3462,7 @@ var xxx_messageInfo_NamespacedCloudProfileSpec proto.InternalMessageInfo
func (m *NamespacedCloudProfileStatus) Reset() { *m = NamespacedCloudProfileStatus{} }
func (*NamespacedCloudProfileStatus) ProtoMessage() {}
func (*NamespacedCloudProfileStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{118}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{122}
}
func (m *NamespacedCloudProfileStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3378,7 +3490,7 @@ var xxx_messageInfo_NamespacedCloudProfileStatus proto.InternalMessageInfo
func (m *Networking) Reset() { *m = Networking{} }
func (*Networking) ProtoMessage() {}
func (*Networking) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{119}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{123}
}
func (m *Networking) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3406,7 +3518,7 @@ var xxx_messageInfo_Networking proto.InternalMessageInfo
func (m *NetworkingStatus) Reset() { *m = NetworkingStatus{} }
func (*NetworkingStatus) ProtoMessage() {}
func (*NetworkingStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{120}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{124}
}
func (m *NetworkingStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3434,7 +3546,7 @@ var xxx_messageInfo_NetworkingStatus proto.InternalMessageInfo
func (m *NginxIngress) Reset() { *m = NginxIngress{} }
func (*NginxIngress) ProtoMessage() {}
func (*NginxIngress) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{121}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{125}
}
func (m *NginxIngress) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3462,7 +3574,7 @@ var xxx_messageInfo_NginxIngress proto.InternalMessageInfo
func (m *NodeLocalDNS) Reset() { *m = NodeLocalDNS{} }
func (*NodeLocalDNS) ProtoMessage() {}
func (*NodeLocalDNS) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{122}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{126}
}
func (m *NodeLocalDNS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3490,7 +3602,7 @@ var xxx_messageInfo_NodeLocalDNS proto.InternalMessageInfo
func (m *OCIRepository) Reset() { *m = OCIRepository{} }
func (*OCIRepository) ProtoMessage() {}
func (*OCIRepository) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{123}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{127}
}
func (m *OCIRepository) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3518,7 +3630,7 @@ var xxx_messageInfo_OCIRepository proto.InternalMessageInfo
func (m *OIDCConfig) Reset() { *m = OIDCConfig{} }
func (*OIDCConfig) ProtoMessage() {}
func (*OIDCConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{124}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{128}
}
func (m *OIDCConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3546,7 +3658,7 @@ var xxx_messageInfo_OIDCConfig proto.InternalMessageInfo
func (m *ObservabilityRotation) Reset() { *m = ObservabilityRotation{} }
func (*ObservabilityRotation) ProtoMessage() {}
func (*ObservabilityRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{125}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{129}
}
func (m *ObservabilityRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3574,7 +3686,7 @@ var xxx_messageInfo_ObservabilityRotation proto.InternalMessageInfo
func (m *OpenIDConnectClientAuthentication) Reset() { *m = OpenIDConnectClientAuthentication{} }
func (*OpenIDConnectClientAuthentication) ProtoMessage() {}
func (*OpenIDConnectClientAuthentication) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{126}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{130}
}
func (m *OpenIDConnectClientAuthentication) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3602,7 +3714,7 @@ var xxx_messageInfo_OpenIDConnectClientAuthentication proto.InternalMessageInfo
func (m *PendingWorkerUpdates) Reset() { *m = PendingWorkerUpdates{} }
func (*PendingWorkerUpdates) ProtoMessage() {}
func (*PendingWorkerUpdates) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{127}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{131}
}
func (m *PendingWorkerUpdates) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3630,7 +3742,7 @@ var xxx_messageInfo_PendingWorkerUpdates proto.InternalMessageInfo
func (m *PendingWorkersRollout) Reset() { *m = PendingWorkersRollout{} }
func (*PendingWorkersRollout) ProtoMessage() {}
func (*PendingWorkersRollout) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{128}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{132}
}
func (m *PendingWorkersRollout) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3658,7 +3770,7 @@ var xxx_messageInfo_PendingWorkersRollout proto.InternalMessageInfo
func (m *Project) Reset() { *m = Project{} }
func (*Project) ProtoMessage() {}
func (*Project) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{129}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{133}
}
func (m *Project) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3686,7 +3798,7 @@ var xxx_messageInfo_Project proto.InternalMessageInfo
func (m *ProjectList) Reset() { *m = ProjectList{} }
func (*ProjectList) ProtoMessage() {}
func (*ProjectList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{130}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{134}
}
func (m *ProjectList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3714,7 +3826,7 @@ var xxx_messageInfo_ProjectList proto.InternalMessageInfo
func (m *ProjectMember) Reset() { *m = ProjectMember{} }
func (*ProjectMember) ProtoMessage() {}
func (*ProjectMember) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{131}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{135}
}
func (m *ProjectMember) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3742,7 +3854,7 @@ var xxx_messageInfo_ProjectMember proto.InternalMessageInfo
func (m *ProjectSpec) Reset() { *m = ProjectSpec{} }
func (*ProjectSpec) ProtoMessage() {}
func (*ProjectSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{132}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{136}
}
func (m *ProjectSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3770,7 +3882,7 @@ var xxx_messageInfo_ProjectSpec proto.InternalMessageInfo
func (m *ProjectStatus) Reset() { *m = ProjectStatus{} }
func (*ProjectStatus) ProtoMessage() {}
func (*ProjectStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{133}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{137}
}
func (m *ProjectStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3798,7 +3910,7 @@ var xxx_messageInfo_ProjectStatus proto.InternalMessageInfo
func (m *ProjectTolerations) Reset() { *m = ProjectTolerations{} }
func (*ProjectTolerations) ProtoMessage() {}
func (*ProjectTolerations) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{134}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{138}
}
func (m *ProjectTolerations) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3826,7 +3938,7 @@ var xxx_messageInfo_ProjectTolerations proto.InternalMessageInfo
func (m *Provider) Reset() { *m = Provider{} }
func (*Provider) ProtoMessage() {}
func (*Provider) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{135}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{139}
}
func (m *Provider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3854,7 +3966,7 @@ var xxx_messageInfo_Provider proto.InternalMessageInfo
func (m *Quota) Reset() { *m = Quota{} }
func (*Quota) ProtoMessage() {}
func (*Quota) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{136}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{140}
}
func (m *Quota) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3882,7 +3994,7 @@ var xxx_messageInfo_Quota proto.InternalMessageInfo
func (m *QuotaList) Reset() { *m = QuotaList{} }
func (*QuotaList) ProtoMessage() {}
func (*QuotaList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{137}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{141}
}
func (m *QuotaList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3910,7 +4022,7 @@ var xxx_messageInfo_QuotaList proto.InternalMessageInfo
func (m *QuotaSpec) Reset() { *m = QuotaSpec{} }
func (*QuotaSpec) ProtoMessage() {}
func (*QuotaSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{138}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{142}
}
func (m *QuotaSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3938,7 +4050,7 @@ var xxx_messageInfo_QuotaSpec proto.InternalMessageInfo
func (m *Region) Reset() { *m = Region{} }
func (*Region) ProtoMessage() {}
func (*Region) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{139}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{143}
}
func (m *Region) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3966,7 +4078,7 @@ var xxx_messageInfo_Region proto.InternalMessageInfo
func (m *ResourceData) Reset() { *m = ResourceData{} }
func (*ResourceData) ProtoMessage() {}
func (*ResourceData) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{140}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{144}
}
func (m *ResourceData) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3994,7 +4106,7 @@ var xxx_messageInfo_ResourceData proto.InternalMessageInfo
func (m *ResourceWatchCacheSize) Reset() { *m = ResourceWatchCacheSize{} }
func (*ResourceWatchCacheSize) ProtoMessage() {}
func (*ResourceWatchCacheSize) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{141}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{145}
}
func (m *ResourceWatchCacheSize) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4022,7 +4134,7 @@ var xxx_messageInfo_ResourceWatchCacheSize proto.InternalMessageInfo
func (m *SSHAccess) Reset() { *m = SSHAccess{} }
func (*SSHAccess) ProtoMessage() {}
func (*SSHAccess) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{142}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{146}
}
func (m *SSHAccess) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4050,7 +4162,7 @@ var xxx_messageInfo_SSHAccess proto.InternalMessageInfo
func (m *SecretBinding) Reset() { *m = SecretBinding{} }
func (*SecretBinding) ProtoMessage() {}
func (*SecretBinding) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{143}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{147}
}
func (m *SecretBinding) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4078,7 +4190,7 @@ var xxx_messageInfo_SecretBinding proto.InternalMessageInfo
func (m *SecretBindingList) Reset() { *m = SecretBindingList{} }
func (*SecretBindingList) ProtoMessage() {}
func (*SecretBindingList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{144}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{148}
}
func (m *SecretBindingList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4106,7 +4218,7 @@ var xxx_messageInfo_SecretBindingList proto.InternalMessageInfo
func (m *SecretBindingProvider) Reset() { *m = SecretBindingProvider{} }
func (*SecretBindingProvider) ProtoMessage() {}
func (*SecretBindingProvider) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{145}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{149}
}
func (m *SecretBindingProvider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4134,7 +4246,7 @@ var xxx_messageInfo_SecretBindingProvider proto.InternalMessageInfo
func (m *Seed) Reset() { *m = Seed{} }
func (*Seed) ProtoMessage() {}
func (*Seed) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{146}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{150}
}
func (m *Seed) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4162,7 +4274,7 @@ var xxx_messageInfo_Seed proto.InternalMessageInfo
func (m *SeedDNS) Reset() { *m = SeedDNS{} }
func (*SeedDNS) ProtoMessage() {}
func (*SeedDNS) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{147}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{151}
}
func (m *SeedDNS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4190,7 +4302,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{148}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{152}
}
func (m *SeedDNSProvider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4218,7 +4330,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{149}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{153}
}
func (m *SeedList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4246,7 +4358,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{150}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{154}
}
func (m *SeedNetworks) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4274,7 +4386,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{151}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{155}
}
func (m *SeedProvider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4302,7 +4414,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{152}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{156}
}
func (m *SeedSelector) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4330,7 +4442,7 @@ var xxx_messageInfo_SeedSelector proto.InternalMessageInfo
func (m *SeedSettingDependencyWatchdog) Reset() { *m = SeedSettingDependencyWatchdog{} }
func (*SeedSettingDependencyWatchdog) ProtoMessage() {}
func (*SeedSettingDependencyWatchdog) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{153}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{157}
}
func (m *SeedSettingDependencyWatchdog) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4358,7 +4470,7 @@ var xxx_messageInfo_SeedSettingDependencyWatchdog proto.InternalMessageInfo
func (m *SeedSettingDependencyWatchdogProber) Reset() { *m = SeedSettingDependencyWatchdogProber{} }
func (*SeedSettingDependencyWatchdogProber) ProtoMessage() {}
func (*SeedSettingDependencyWatchdogProber) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{154}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{158}
}
func (m *SeedSettingDependencyWatchdogProber) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4386,7 +4498,7 @@ var xxx_messageInfo_SeedSettingDependencyWatchdogProber proto.InternalMessageInf
func (m *SeedSettingDependencyWatchdogWeeder) Reset() { *m = SeedSettingDependencyWatchdogWeeder{} }
func (*SeedSettingDependencyWatchdogWeeder) ProtoMessage() {}
func (*SeedSettingDependencyWatchdogWeeder) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{155}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{159}
}
func (m *SeedSettingDependencyWatchdogWeeder) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4414,7 +4526,7 @@ var xxx_messageInfo_SeedSettingDependencyWatchdogWeeder proto.InternalMessageInf
func (m *SeedSettingExcessCapacityReservation) Reset() { *m = SeedSettingExcessCapacityReservation{} }
func (*SeedSettingExcessCapacityReservation) ProtoMessage() {}
func (*SeedSettingExcessCapacityReservation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{156}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{160}
}
func (m *SeedSettingExcessCapacityReservation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4444,7 +4556,7 @@ func (m *SeedSettingExcessCapacityReservationConfig) Reset() {
}
func (*SeedSettingExcessCapacityReservationConfig) ProtoMessage() {}
func (*SeedSettingExcessCapacityReservationConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{157}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{161}
}
func (m *SeedSettingExcessCapacityReservationConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4472,7 +4584,7 @@ var xxx_messageInfo_SeedSettingExcessCapacityReservationConfig proto.InternalMes
func (m *SeedSettingLoadBalancerServices) Reset() { *m = SeedSettingLoadBalancerServices{} }
func (*SeedSettingLoadBalancerServices) ProtoMessage() {}
func (*SeedSettingLoadBalancerServices) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{158}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{162}
}
func (m *SeedSettingLoadBalancerServices) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4500,7 +4612,7 @@ var xxx_messageInfo_SeedSettingLoadBalancerServices proto.InternalMessageInfo
func (m *SeedSettingLoadBalancerServicesZones) Reset() { *m = SeedSettingLoadBalancerServicesZones{} }
func (*SeedSettingLoadBalancerServicesZones) ProtoMessage() {}
func (*SeedSettingLoadBalancerServicesZones) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{159}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{163}
}
func (m *SeedSettingLoadBalancerServicesZones) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4528,7 +4640,7 @@ var xxx_messageInfo_SeedSettingLoadBalancerServicesZones proto.InternalMessageIn
func (m *SeedSettingScheduling) Reset() { *m = SeedSettingScheduling{} }
func (*SeedSettingScheduling) ProtoMessage() {}
func (*SeedSettingScheduling) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{160}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{164}
}
func (m *SeedSettingScheduling) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4556,7 +4668,7 @@ var xxx_messageInfo_SeedSettingScheduling proto.InternalMessageInfo
func (m *SeedSettingTopologyAwareRouting) Reset() { *m = SeedSettingTopologyAwareRouting{} }
func (*SeedSettingTopologyAwareRouting) ProtoMessage() {}
func (*SeedSettingTopologyAwareRouting) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{161}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{165}
}
func (m *SeedSettingTopologyAwareRouting) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4584,7 +4696,7 @@ var xxx_messageInfo_SeedSettingTopologyAwareRouting proto.InternalMessageInfo
func (m *SeedSettingVerticalPodAutoscaler) Reset() { *m = SeedSettingVerticalPodAutoscaler{} }
func (*SeedSettingVerticalPodAutoscaler) ProtoMessage() {}
func (*SeedSettingVerticalPodAutoscaler) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{162}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{166}
}
func (m *SeedSettingVerticalPodAutoscaler) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4612,7 +4724,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{163}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{167}
}
func (m *SeedSettings) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4640,7 +4752,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{164}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{168}
}
func (m *SeedSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4668,7 +4780,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{165}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{169}
}
func (m *SeedStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4696,7 +4808,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{166}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{170}
}
func (m *SeedTaint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4724,7 +4836,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{167}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{171}
}
func (m *SeedTemplate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4752,7 +4864,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{168}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{172}
}
func (m *SeedVolume) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4780,7 +4892,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{169}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{173}
}
func (m *SeedVolumeProvider) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4808,7 +4920,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{170}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{174}
}
func (m *ServiceAccountConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4836,7 +4948,7 @@ var xxx_messageInfo_ServiceAccountConfig proto.InternalMessageInfo
func (m *ServiceAccountKeyRotation) Reset() { *m = ServiceAccountKeyRotation{} }
func (*ServiceAccountKeyRotation) ProtoMessage() {}
func (*ServiceAccountKeyRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{171}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{175}
}
func (m *ServiceAccountKeyRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4864,7 +4976,7 @@ var xxx_messageInfo_ServiceAccountKeyRotation proto.InternalMessageInfo
func (m *Shoot) Reset() { *m = Shoot{} }
func (*Shoot) ProtoMessage() {}
func (*Shoot) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{172}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{176}
}
func (m *Shoot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4892,7 +5004,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{173}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{177}
}
func (m *ShootAdvertisedAddress) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4920,7 +5032,7 @@ var xxx_messageInfo_ShootAdvertisedAddress proto.InternalMessageInfo
func (m *ShootCredentials) Reset() { *m = ShootCredentials{} }
func (*ShootCredentials) ProtoMessage() {}
func (*ShootCredentials) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{174}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{178}
}
func (m *ShootCredentials) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4948,7 +5060,7 @@ var xxx_messageInfo_ShootCredentials proto.InternalMessageInfo
func (m *ShootCredentialsRotation) Reset() { *m = ShootCredentialsRotation{} }
func (*ShootCredentialsRotation) ProtoMessage() {}
func (*ShootCredentialsRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{175}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{179}
}
func (m *ShootCredentialsRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4976,7 +5088,7 @@ var xxx_messageInfo_ShootCredentialsRotation proto.InternalMessageInfo
func (m *ShootKubeconfigRotation) Reset() { *m = ShootKubeconfigRotation{} }
func (*ShootKubeconfigRotation) ProtoMessage() {}
func (*ShootKubeconfigRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{176}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{180}
}
func (m *ShootKubeconfigRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5004,7 +5116,7 @@ var xxx_messageInfo_ShootKubeconfigRotation proto.InternalMessageInfo
func (m *ShootList) Reset() { *m = ShootList{} }
func (*ShootList) ProtoMessage() {}
func (*ShootList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{177}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{181}
}
func (m *ShootList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5032,7 +5144,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{178}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{182}
}
func (m *ShootMachineImage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5060,7 +5172,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{179}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{183}
}
func (m *ShootNetworks) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5088,7 +5200,7 @@ var xxx_messageInfo_ShootNetworks proto.InternalMessageInfo
func (m *ShootSSHKeypairRotation) Reset() { *m = ShootSSHKeypairRotation{} }
func (*ShootSSHKeypairRotation) ProtoMessage() {}
func (*ShootSSHKeypairRotation) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{180}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{184}
}
func (m *ShootSSHKeypairRotation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5116,7 +5228,7 @@ var xxx_messageInfo_ShootSSHKeypairRotation proto.InternalMessageInfo
func (m *ShootSpec) Reset() { *m = ShootSpec{} }
func (*ShootSpec) ProtoMessage() {}
func (*ShootSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{181}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{185}
}
func (m *ShootSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5144,7 +5256,7 @@ var xxx_messageInfo_ShootSpec proto.InternalMessageInfo
func (m *ShootState) Reset() { *m = ShootState{} }
func (*ShootState) ProtoMessage() {}
func (*ShootState) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{182}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{186}
}
func (m *ShootState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5172,7 +5284,7 @@ var xxx_messageInfo_ShootState proto.InternalMessageInfo
func (m *ShootStateList) Reset() { *m = ShootStateList{} }
func (*ShootStateList) ProtoMessage() {}
func (*ShootStateList) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{183}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{187}
}
func (m *ShootStateList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5200,7 +5312,7 @@ var xxx_messageInfo_ShootStateList proto.InternalMessageInfo
func (m *ShootStateSpec) Reset() { *m = ShootStateSpec{} }
func (*ShootStateSpec) ProtoMessage() {}
func (*ShootStateSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{184}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{188}
}
func (m *ShootStateSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5228,7 +5340,7 @@ var xxx_messageInfo_ShootStateSpec proto.InternalMessageInfo
func (m *ShootStatus) Reset() { *m = ShootStatus{} }
func (*ShootStatus) ProtoMessage() {}
func (*ShootStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{185}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{189}
}
func (m *ShootStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5256,7 +5368,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{186}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{190}
}
func (m *ShootTemplate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5284,7 +5396,7 @@ var xxx_messageInfo_ShootTemplate proto.InternalMessageInfo
func (m *StructuredAuthentication) Reset() { *m = StructuredAuthentication{} }
func (*StructuredAuthentication) ProtoMessage() {}
func (*StructuredAuthentication) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{187}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{191}
}
func (m *StructuredAuthentication) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5312,7 +5424,7 @@ var xxx_messageInfo_StructuredAuthentication proto.InternalMessageInfo
func (m *StructuredAuthorization) Reset() { *m = StructuredAuthorization{} }
func (*StructuredAuthorization) ProtoMessage() {}
func (*StructuredAuthorization) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{188}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{192}
}
func (m *StructuredAuthorization) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5340,7 +5452,7 @@ var xxx_messageInfo_StructuredAuthorization proto.InternalMessageInfo
func (m *SystemComponents) Reset() { *m = SystemComponents{} }
func (*SystemComponents) ProtoMessage() {}
func (*SystemComponents) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{189}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{193}
}
func (m *SystemComponents) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5368,7 +5480,7 @@ var xxx_messageInfo_SystemComponents proto.InternalMessageInfo
func (m *Toleration) Reset() { *m = Toleration{} }
func (*Toleration) ProtoMessage() {}
func (*Toleration) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{190}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{194}
}
func (m *Toleration) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5396,7 +5508,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{191}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{195}
}
func (m *VerticalPodAutoscaler) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5424,7 +5536,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{192}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{196}
}
func (m *Volume) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5452,7 +5564,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{193}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{197}
}
func (m *VolumeType) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5480,7 +5592,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{194}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{198}
}
func (m *WatchCacheSizes) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5508,7 +5620,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{195}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{199}
}
func (m *Worker) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5536,7 +5648,7 @@ var xxx_messageInfo_Worker proto.InternalMessageInfo
func (m *WorkerControlPlane) Reset() { *m = WorkerControlPlane{} }
func (*WorkerControlPlane) ProtoMessage() {}
func (*WorkerControlPlane) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{196}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{200}
}
func (m *WorkerControlPlane) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5564,7 +5676,7 @@ var xxx_messageInfo_WorkerControlPlane proto.InternalMessageInfo
func (m *WorkerKubernetes) Reset() { *m = WorkerKubernetes{} }
func (*WorkerKubernetes) ProtoMessage() {}
func (*WorkerKubernetes) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{197}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{201}
}
func (m *WorkerKubernetes) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5592,7 +5704,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{198}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{202}
}
func (m *WorkerSystemComponents) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5620,7 +5732,7 @@ var xxx_messageInfo_WorkerSystemComponents proto.InternalMessageInfo
func (m *WorkersSettings) Reset() { *m = WorkersSettings{} }
func (*WorkersSettings) ProtoMessage() {}
func (*WorkersSettings) Descriptor() ([]byte, []int) {
- return fileDescriptor_ca37af0df9a5bbd2, []int{199}
+ return fileDescriptor_ca37af0df9a5bbd2, []int{203}
}
func (m *WorkersSettings) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5682,6 +5794,7 @@ func init() {
proto.RegisterType((*CloudProfileList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.CloudProfileList")
proto.RegisterType((*CloudProfileReference)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.CloudProfileReference")
proto.RegisterType((*CloudProfileSpec)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.CloudProfileSpec")
+ proto.RegisterType((*CloudProfileStatus)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.CloudProfileStatus")
proto.RegisterType((*ClusterAutoscaler)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ClusterAutoscaler")
proto.RegisterType((*ClusterAutoscalerOptions)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ClusterAutoscalerOptions")
proto.RegisterType((*Condition)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.Condition")
@@ -5715,6 +5828,7 @@ func init() {
proto.RegisterType((*ETCDEncryptionKeyRotation)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ETCDEncryptionKeyRotation")
proto.RegisterType((*EncryptionConfig)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.EncryptionConfig")
proto.RegisterType((*ExpirableVersion)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ExpirableVersion")
+ proto.RegisterType((*ExpirableVersionStatus)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ExpirableVersionStatus")
proto.RegisterType((*ExposureClass)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ExposureClass")
proto.RegisterType((*ExposureClassList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ExposureClassList")
proto.RegisterType((*ExposureClassScheduling)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ExposureClassScheduling")
@@ -5755,12 +5869,14 @@ func init() {
proto.RegisterType((*LastError)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.LastError")
proto.RegisterType((*LastMaintenance)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.LastMaintenance")
proto.RegisterType((*LastOperation)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.LastOperation")
+ proto.RegisterType((*LifecycleStage)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.LifecycleStage")
proto.RegisterType((*Limits)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.Limits")
proto.RegisterType((*LoadBalancerServicesProxyProtocol)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.LoadBalancerServicesProxyProtocol")
proto.RegisterType((*Machine)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.Machine")
proto.RegisterType((*MachineControllerManagerSettings)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineControllerManagerSettings")
proto.RegisterType((*MachineImage)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineImage")
proto.RegisterType((*MachineImageVersion)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineImageVersion")
+ proto.RegisterType((*MachineImageVersionStatus)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineImageVersionStatus")
proto.RegisterType((*MachineType)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineType")
proto.RegisterMapType((Capabilities)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineType.CapabilitiesEntry")
proto.RegisterType((*MachineTypeStorage)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.MachineTypeStorage")
@@ -5876,909 +5992,920 @@ func init() {
}
var fileDescriptor_ca37af0df9a5bbd2 = []byte{
- // 14428 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x70, 0x25, 0xd9,
- 0x59, 0x18, 0xee, 0xbe, 0x7a, 0x7f, 0x7a, 0x8c, 0x74, 0x46, 0x33, 0xa3, 0xd5, 0x3c, 0xee, 0xb8,
- 0x77, 0x6d, 0x66, 0x59, 0x5b, 0xc3, 0x0e, 0x6b, 0xaf, 0x77, 0x97, 0x7d, 0x48, 0x57, 0x9a, 0x99,
- 0xeb, 0x91, 0x34, 0xda, 0x73, 0x35, 0xbb, 0xcb, 0x1a, 0xd6, 0xb4, 0xfa, 0x1e, 0x5d, 0xf5, 0x4e,
- 0xdf, 0xee, 0xbb, 0xdd, 0x7d, 0x35, 0xd2, 0xae, 0x8d, 0xb1, 0xc1, 0xfc, 0x6c, 0x63, 0x5c, 0xc0,
- 0x0f, 0xf0, 0xcf, 0x36, 0xd4, 0xcf, 0x86, 0x02, 0x92, 0x90, 0x98, 0x14, 0x29, 0x92, 0x02, 0x92,
- 0x4a, 0x42, 0x15, 0xc1, 0x50, 0x40, 0x51, 0x3c, 0x12, 0x53, 0x01, 0x81, 0x15, 0x02, 0xa9, 0xca,
- 0xb3, 0x42, 0x55, 0xa8, 0x9a, 0xb8, 0x48, 0xea, 0x3c, 0xba, 0xfb, 0x9c, 0x7e, 0x5c, 0x5d, 0xf5,
- 0x95, 0x64, 0x2f, 0xf0, 0x97, 0x74, 0xcf, 0x77, 0xce, 0xf7, 0x9d, 0x57, 0x7f, 0xe7, 0x3b, 0xdf,
- 0xf9, 0x1e, 0xb0, 0xd0, 0xb0, 0x82, 0xad, 0xf6, 0xc6, 0x9c, 0xe9, 0x36, 0xaf, 0x36, 0x0c, 0xaf,
- 0x4e, 0x1c, 0xe2, 0xc5, 0xff, 0xb4, 0xee, 0x36, 0xae, 0x1a, 0x2d, 0xcb, 0xbf, 0x6a, 0xba, 0x1e,
- 0xb9, 0xba, 0xfd, 0xe8, 0x06, 0x09, 0x8c, 0x47, 0xaf, 0x36, 0x28, 0xcc, 0x08, 0x48, 0x7d, 0xae,
- 0xe5, 0xb9, 0x81, 0x8b, 0xae, 0xc5, 0x38, 0xe6, 0xc2, 0xa6, 0xf1, 0x3f, 0xad, 0xbb, 0x8d, 0x39,
- 0x8a, 0x63, 0x8e, 0xe2, 0x98, 0x13, 0x38, 0x66, 0xdf, 0x29, 0xd3, 0x75, 0x1b, 0xee, 0x55, 0x86,
- 0x6a, 0xa3, 0xbd, 0xc9, 0x7e, 0xb1, 0x1f, 0xec, 0x3f, 0x4e, 0x62, 0xf6, 0xe1, 0xbb, 0xef, 0xf1,
- 0xe7, 0x2c, 0x97, 0x76, 0xe6, 0xaa, 0xd1, 0x0e, 0x5c, 0xdf, 0x34, 0x6c, 0xcb, 0x69, 0x5c, 0xdd,
- 0x4e, 0xf5, 0x66, 0x56, 0x97, 0xaa, 0x8a, 0x6e, 0x77, 0xac, 0xe3, 0x6d, 0x18, 0x66, 0x56, 0x9d,
- 0x9b, 0x71, 0x1d, 0xb2, 0x13, 0x10, 0xc7, 0xb7, 0x5c, 0xc7, 0x7f, 0x27, 0x1d, 0x09, 0xf1, 0xb6,
- 0xe5, 0xb9, 0x51, 0x2a, 0x64, 0x61, 0x7a, 0x2c, 0xc6, 0xd4, 0x34, 0xcc, 0x2d, 0xcb, 0x21, 0xde,
- 0x6e, 0xd8, 0xfc, 0xaa, 0x47, 0x7c, 0xb7, 0xed, 0x99, 0xe4, 0x50, 0xad, 0xfc, 0xab, 0x4d, 0x12,
- 0x18, 0x59, 0xb4, 0xae, 0xe6, 0xb5, 0xf2, 0xda, 0x4e, 0x60, 0x35, 0xd3, 0x64, 0xde, 0x7d, 0x50,
- 0x03, 0xdf, 0xdc, 0x22, 0x4d, 0x23, 0xd5, 0xee, 0x9b, 0xf3, 0xda, 0xb5, 0x03, 0xcb, 0xbe, 0x6a,
- 0x39, 0x81, 0x1f, 0x78, 0xc9, 0x46, 0xfa, 0x27, 0x34, 0x98, 0x9c, 0x5f, 0xab, 0xd6, 0xd8, 0x0c,
- 0x2e, 0xbb, 0x8d, 0x86, 0xe5, 0x34, 0xd0, 0x23, 0x30, 0xb2, 0x4d, 0xbc, 0x0d, 0xd7, 0xb7, 0x82,
- 0xdd, 0x19, 0xed, 0xb2, 0x76, 0x65, 0x60, 0x61, 0x7c, 0x7f, 0xaf, 0x3c, 0xf2, 0x42, 0x58, 0x88,
- 0x63, 0x38, 0xaa, 0xc2, 0xe9, 0xad, 0x20, 0x68, 0xcd, 0x9b, 0x26, 0xf1, 0xfd, 0xa8, 0xc6, 0x4c,
- 0x89, 0x35, 0x3b, 0xb7, 0xbf, 0x57, 0x3e, 0x7d, 0x73, 0x7d, 0x7d, 0x2d, 0x01, 0xc6, 0x59, 0x6d,
- 0xf4, 0x9f, 0xd7, 0x60, 0x2a, 0xea, 0x0c, 0x26, 0xaf, 0xb5, 0x89, 0x1f, 0xf8, 0x08, 0xc3, 0xd9,
- 0xa6, 0xb1, 0xb3, 0xea, 0x3a, 0x2b, 0xed, 0xc0, 0x08, 0x2c, 0xa7, 0x51, 0x75, 0x36, 0x6d, 0xab,
- 0xb1, 0x15, 0x88, 0xae, 0xcd, 0xee, 0xef, 0x95, 0xcf, 0xae, 0x64, 0xd6, 0xc0, 0x39, 0x2d, 0x69,
- 0xa7, 0x9b, 0xc6, 0x4e, 0x0a, 0xa1, 0xd4, 0xe9, 0x95, 0x34, 0x18, 0x67, 0xb5, 0xd1, 0xdf, 0x05,
- 0x53, 0x7c, 0x1c, 0x98, 0xf8, 0x81, 0x67, 0x99, 0x81, 0xe5, 0x3a, 0xe8, 0x32, 0xf4, 0x3b, 0x46,
- 0x93, 0xb0, 0x1e, 0x8e, 0x2c, 0x8c, 0x7d, 0x69, 0xaf, 0xfc, 0x96, 0xfd, 0xbd, 0x72, 0xff, 0xaa,
- 0xd1, 0x24, 0x98, 0x41, 0xf4, 0xff, 0x55, 0x82, 0x0b, 0xa9, 0x76, 0x2f, 0x5a, 0xc1, 0xd6, 0xed,
- 0x16, 0xfd, 0xcf, 0x47, 0x9f, 0xd2, 0x60, 0xca, 0x48, 0x56, 0x60, 0x08, 0x47, 0xaf, 0x2d, 0xcd,
- 0x1d, 0xfe, 0x03, 0x9f, 0x4b, 0x51, 0x5b, 0x78, 0x40, 0xf4, 0x2b, 0x3d, 0x00, 0x9c, 0x26, 0x8d,
- 0x3e, 0xa6, 0xc1, 0x90, 0xcb, 0x3b, 0x37, 0x53, 0xba, 0xdc, 0x77, 0x65, 0xf4, 0xda, 0xb7, 0x1f,
- 0x49, 0x37, 0xa4, 0x41, 0xcf, 0x89, 0xbf, 0x4b, 0x4e, 0xe0, 0xed, 0x2e, 0x9c, 0x12, 0xdd, 0x1b,
- 0x12, 0xa5, 0x38, 0x24, 0x3f, 0xfb, 0x24, 0x8c, 0xc9, 0x35, 0xd1, 0x24, 0xf4, 0xdd, 0x25, 0x7c,
- 0xab, 0x8e, 0x60, 0xfa, 0x2f, 0x9a, 0x86, 0x81, 0x6d, 0xc3, 0x6e, 0x13, 0xb6, 0xa4, 0x23, 0x98,
- 0xff, 0x78, 0xb2, 0xf4, 0x1e, 0x4d, 0xbf, 0x06, 0x03, 0xf3, 0xf5, 0xba, 0xeb, 0xa0, 0x87, 0x61,
- 0x88, 0x38, 0xc6, 0x86, 0x4d, 0xea, 0xac, 0xe1, 0x70, 0x4c, 0x6f, 0x89, 0x17, 0xe3, 0x10, 0xae,
- 0xff, 0x48, 0x09, 0x06, 0x59, 0x23, 0x1f, 0xfd, 0x90, 0x06, 0xa7, 0xef, 0xb6, 0x37, 0x88, 0xe7,
- 0x90, 0x80, 0xf8, 0x8b, 0x86, 0xbf, 0xb5, 0xe1, 0x1a, 0x5e, 0x5d, 0x2c, 0xcc, 0x8d, 0x22, 0x33,
- 0x72, 0x2b, 0x8d, 0x8e, 0xef, 0xc1, 0x0c, 0x00, 0xce, 0x22, 0x8e, 0xb6, 0x61, 0xcc, 0x69, 0x58,
- 0xce, 0x4e, 0xd5, 0x69, 0x78, 0xc4, 0xf7, 0xd9, 0xa0, 0x47, 0xaf, 0x3d, 0x57, 0xa4, 0x33, 0xab,
- 0x12, 0x9e, 0x85, 0xc9, 0xfd, 0xbd, 0xf2, 0x98, 0x5c, 0x82, 0x15, 0x3a, 0xfa, 0x5f, 0x6b, 0x70,
- 0x6a, 0xbe, 0xde, 0xb4, 0x7c, 0xca, 0x69, 0xd7, 0xec, 0x76, 0xc3, 0xea, 0x62, 0xeb, 0xa3, 0xe7,
- 0x61, 0xd0, 0x74, 0x9d, 0x4d, 0xab, 0x21, 0xfa, 0xf9, 0xce, 0x39, 0xce, 0xb9, 0xe6, 0x64, 0xce,
- 0xc5, 0xba, 0x27, 0x38, 0xde, 0x1c, 0x36, 0xee, 0x2d, 0x85, 0x0c, 0x7d, 0x01, 0xf6, 0xf7, 0xca,
- 0x83, 0x15, 0x86, 0x00, 0x0b, 0x44, 0xe8, 0x0a, 0x0c, 0xd7, 0x2d, 0x9f, 0x2f, 0x66, 0x1f, 0x5b,
- 0xcc, 0xb1, 0xfd, 0xbd, 0xf2, 0xf0, 0xa2, 0x28, 0xc3, 0x11, 0x14, 0x2d, 0xc3, 0x34, 0x9d, 0x41,
- 0xde, 0xae, 0x46, 0x4c, 0x8f, 0x04, 0xb4, 0x6b, 0x33, 0xfd, 0xac, 0xbb, 0x33, 0xfb, 0x7b, 0xe5,
- 0xe9, 0x5b, 0x19, 0x70, 0x9c, 0xd9, 0x4a, 0xbf, 0x0e, 0xc3, 0xf3, 0x36, 0xf1, 0x28, 0x43, 0x40,
- 0x4f, 0xc2, 0x04, 0x69, 0x1a, 0x96, 0x8d, 0x89, 0x49, 0xac, 0x6d, 0xe2, 0xf9, 0x33, 0xda, 0xe5,
- 0xbe, 0x2b, 0x23, 0x0b, 0x68, 0x7f, 0xaf, 0x3c, 0xb1, 0xa4, 0x40, 0x70, 0xa2, 0xa6, 0xfe, 0x61,
- 0x0d, 0x46, 0xe7, 0xdb, 0x75, 0x2b, 0xe0, 0xe3, 0x42, 0x1e, 0x8c, 0x1a, 0xf4, 0xe7, 0x9a, 0x6b,
- 0x5b, 0xe6, 0xae, 0xd8, 0x5c, 0xcf, 0x16, 0xfa, 0xdc, 0x62, 0x34, 0x0b, 0xa7, 0xf6, 0xf7, 0xca,
- 0xa3, 0x52, 0x01, 0x96, 0x89, 0xe8, 0x5b, 0x20, 0xc3, 0xd0, 0xb7, 0xc2, 0x18, 0x1f, 0xee, 0x8a,
- 0xd1, 0xc2, 0x64, 0x53, 0xf4, 0xe1, 0x41, 0x69, 0xad, 0x42, 0x42, 0x73, 0xb7, 0x37, 0x5e, 0x25,
- 0x66, 0x80, 0xc9, 0x26, 0xf1, 0x88, 0x63, 0x12, 0xbe, 0x6d, 0x2a, 0x52, 0x63, 0xac, 0xa0, 0xd2,
- 0xff, 0x5f, 0x0d, 0x2e, 0xce, 0xb7, 0x83, 0x2d, 0xd7, 0xb3, 0x5e, 0x27, 0x5e, 0x3c, 0xdd, 0x11,
- 0x06, 0xf4, 0x0c, 0x4c, 0x18, 0x51, 0x85, 0xd5, 0x78, 0x3b, 0x9d, 0x15, 0xdb, 0x69, 0x62, 0x5e,
- 0x81, 0xe2, 0x44, 0x6d, 0x74, 0x0d, 0xc0, 0x8f, 0xd7, 0x96, 0xf1, 0x80, 0x05, 0x24, 0xda, 0x82,
- 0xb4, 0xaa, 0x52, 0x2d, 0xfd, 0x4f, 0xe8, 0x51, 0xb8, 0x6d, 0x58, 0xb6, 0xb1, 0x61, 0xd9, 0x56,
- 0xb0, 0xfb, 0xb2, 0xeb, 0x90, 0x2e, 0x76, 0xf3, 0x1d, 0x38, 0xd7, 0x76, 0x0c, 0xde, 0xce, 0x26,
- 0x2b, 0x7c, 0xff, 0xae, 0xef, 0xb6, 0x08, 0xe7, 0x92, 0x23, 0x0b, 0xe7, 0xf7, 0xf7, 0xca, 0xe7,
- 0xee, 0x64, 0x57, 0xc1, 0x79, 0x6d, 0xe9, 0xa9, 0x27, 0x81, 0x5e, 0x70, 0xed, 0x76, 0x53, 0x60,
- 0xed, 0x63, 0x58, 0xd9, 0xa9, 0x77, 0x27, 0xb3, 0x06, 0xce, 0x69, 0xa9, 0x7f, 0xb5, 0x04, 0x83,
- 0x0b, 0x86, 0x79, 0xb7, 0xdd, 0x42, 0xef, 0x80, 0xe1, 0x96, 0xe7, 0x6e, 0x5b, 0x75, 0xe2, 0x89,
- 0xb1, 0x4d, 0x8a, 0xb1, 0x0d, 0xaf, 0x89, 0x72, 0x1c, 0xd5, 0x40, 0x16, 0x4c, 0x84, 0xff, 0x57,
- 0x7a, 0xf8, 0x72, 0xd9, 0x97, 0xb0, 0xa6, 0x20, 0xc2, 0x09, 0xc4, 0x48, 0x87, 0x41, 0x8f, 0x34,
- 0xe8, 0x51, 0xd7, 0xc7, 0xba, 0xc5, 0xbe, 0x76, 0xcc, 0x4a, 0xb0, 0x80, 0xa0, 0x75, 0x18, 0xe1,
- 0xeb, 0x46, 0xf7, 0x65, 0x7f, 0xfe, 0xbe, 0xac, 0x85, 0x95, 0xc4, 0xbe, 0x9c, 0x12, 0x43, 0x1c,
- 0x89, 0x00, 0x38, 0x46, 0x84, 0xde, 0x0f, 0x13, 0xa6, 0x47, 0xea, 0xc4, 0x09, 0x2c, 0xc3, 0xf6,
- 0x29, 0xea, 0x81, 0xee, 0xb7, 0x3c, 0x1b, 0x5a, 0x45, 0x69, 0x8e, 0x13, 0xe8, 0xf4, 0x2f, 0x95,
- 0x60, 0x8c, 0x4f, 0xff, 0x42, 0xdb, 0xbc, 0x4b, 0x02, 0xf4, 0x1d, 0x30, 0x4c, 0xa5, 0xc6, 0xba,
- 0x11, 0x18, 0xe2, 0xf3, 0xfa, 0xa6, 0xdc, 0x09, 0x65, 0x5f, 0x36, 0xad, 0x1d, 0x53, 0x5f, 0x21,
- 0x81, 0x11, 0xef, 0xea, 0xb8, 0x0c, 0x47, 0x58, 0xd1, 0x26, 0xf4, 0xfb, 0x2d, 0x62, 0x8a, 0xe5,
- 0x5a, 0x2c, 0xc2, 0x40, 0xe4, 0x1e, 0xd7, 0x5a, 0xc4, 0x8c, 0x3f, 0x02, 0xfa, 0x0b, 0x33, 0xfc,
- 0xc8, 0x81, 0x41, 0x3f, 0x30, 0x82, 0xb6, 0xcf, 0x56, 0x6d, 0xf4, 0xda, 0xf5, 0x9e, 0x29, 0x31,
- 0x6c, 0x0b, 0x13, 0x82, 0xd6, 0x20, 0xff, 0x8d, 0x05, 0x15, 0xfd, 0xdf, 0x69, 0x30, 0x29, 0x57,
- 0x5f, 0xb6, 0xfc, 0x00, 0x7d, 0x5b, 0x6a, 0x3a, 0xe7, 0xba, 0x9b, 0x4e, 0xda, 0x9a, 0x4d, 0x66,
- 0xf4, 0x0d, 0x84, 0x25, 0xd2, 0x54, 0x12, 0x18, 0xb0, 0x02, 0xd2, 0x0c, 0x65, 0x9f, 0xe7, 0x7a,
- 0x1d, 0xe1, 0xc2, 0xb8, 0x20, 0x36, 0x50, 0xa5, 0x68, 0x31, 0xc7, 0xae, 0x7f, 0x07, 0x4c, 0xcb,
- 0xb5, 0xc2, 0xaf, 0x85, 0x32, 0xa2, 0x60, 0xb7, 0x95, 0x62, 0x44, 0xf4, 0xc3, 0xc6, 0x0c, 0x82,
- 0xde, 0x1e, 0x7d, 0x39, 0x9c, 0xdf, 0x45, 0x73, 0xa7, 0x7e, 0x3d, 0xfa, 0xbf, 0xed, 0x53, 0xe7,
- 0x8e, 0x2e, 0x23, 0xda, 0x4e, 0xf0, 0x83, 0xd1, 0x6b, 0x37, 0x7b, 0x1d, 0x60, 0xd8, 0xf5, 0xaf,
- 0x17, 0xce, 0xa2, 0x70, 0x8d, 0xbe, 0xa3, 0xe2, 0x1a, 0x57, 0x60, 0xd8, 0x27, 0xa4, 0x2e, 0xc9,
- 0x10, 0x4c, 0xf2, 0xa8, 0x89, 0x32, 0x1c, 0x41, 0x8f, 0x9f, 0xbf, 0x7c, 0xbe, 0x1f, 0x50, 0xfa,
- 0x1b, 0x92, 0xa7, 0x98, 0x97, 0x88, 0x05, 0xee, 0x65, 0x8a, 0xc5, 0xe7, 0x98, 0x40, 0x8c, 0x5e,
- 0x87, 0x71, 0xdb, 0xf0, 0x83, 0xdb, 0x2d, 0x7a, 0xc7, 0x0c, 0x77, 0xe2, 0xe8, 0xb5, 0xf9, 0x22,
- 0x5b, 0x69, 0x59, 0x46, 0xb4, 0x30, 0xb5, 0xbf, 0x57, 0x1e, 0x57, 0x8a, 0xb0, 0x4a, 0x0a, 0xbd,
- 0x0a, 0x23, 0xb4, 0x60, 0xc9, 0xf3, 0x5c, 0x4f, 0x2c, 0xef, 0xd3, 0x45, 0xe9, 0x32, 0x24, 0xfc,
- 0xce, 0x1b, 0xfd, 0xc4, 0x31, 0x7a, 0xf4, 0x5e, 0x40, 0xee, 0x06, 0xd3, 0x3a, 0xd4, 0x6f, 0xf0,
- 0x0b, 0x35, 0x1d, 0x2c, 0x5d, 0xfe, 0xbe, 0x85, 0x59, 0xb1, 0x5d, 0xd0, 0xed, 0x54, 0x0d, 0x9c,
- 0xd1, 0x0a, 0xdd, 0x05, 0x14, 0x5d, 0xca, 0xa3, 0x1d, 0xd6, 0x69, 0x6b, 0x24, 0xf7, 0xe7, 0x59,
- 0x4a, 0xec, 0x46, 0x0a, 0x05, 0xce, 0x40, 0xab, 0xff, 0x6a, 0x09, 0x46, 0xf9, 0x16, 0xe1, 0x17,
- 0xa7, 0xe3, 0x3f, 0x81, 0x88, 0x72, 0x02, 0x55, 0x8a, 0x33, 0x15, 0xd6, 0xe1, 0xdc, 0x03, 0xa8,
- 0x99, 0x38, 0x80, 0x96, 0x7a, 0x25, 0xd4, 0xf9, 0xfc, 0xf9, 0x03, 0x0d, 0x4e, 0x49, 0xb5, 0x4f,
- 0xe0, 0xf8, 0xa9, 0xab, 0xc7, 0xcf, 0xb3, 0x3d, 0x8e, 0x2f, 0xe7, 0xf4, 0x71, 0x95, 0x61, 0xb1,
- 0x93, 0xe1, 0x1a, 0xc0, 0x06, 0x63, 0x27, 0x92, 0x18, 0x1e, 0x2d, 0xf9, 0x42, 0x04, 0xc1, 0x52,
- 0x2d, 0x85, 0x29, 0x96, 0x3a, 0x31, 0x45, 0xfd, 0x3f, 0xf6, 0xc1, 0x54, 0x6a, 0xda, 0xd3, 0x7c,
- 0x44, 0xfb, 0x1a, 0xf1, 0x91, 0xd2, 0xd7, 0x82, 0x8f, 0xf4, 0x15, 0xe2, 0x23, 0xdd, 0x1f, 0x44,
- 0x1e, 0xa0, 0xa6, 0xd5, 0xe0, 0xcd, 0x6a, 0x81, 0xe1, 0x05, 0xeb, 0x56, 0x93, 0x08, 0x8e, 0xf3,
- 0x8d, 0xdd, 0x6d, 0x59, 0xda, 0x82, 0x33, 0x9e, 0x95, 0x14, 0x26, 0x9c, 0x81, 0x5d, 0xff, 0xee,
- 0x12, 0x0c, 0x2d, 0x18, 0x3e, 0xeb, 0xe9, 0x07, 0x61, 0x4c, 0xa0, 0xae, 0x36, 0x8d, 0x06, 0xe9,
- 0x45, 0x75, 0x22, 0x50, 0xae, 0x48, 0xe8, 0xf8, 0xed, 0x53, 0x2e, 0xc1, 0x0a, 0x39, 0xb4, 0x0b,
- 0xa3, 0xcd, 0xf8, 0xa6, 0x25, 0x96, 0xf8, 0x7a, 0xef, 0xd4, 0x29, 0x36, 0x7e, 0xc5, 0x96, 0x0a,
- 0xb0, 0x4c, 0x4b, 0x7f, 0x05, 0x4e, 0x67, 0xf4, 0xb8, 0x8b, 0x4b, 0xe6, 0xdb, 0x60, 0x68, 0x9b,
- 0x78, 0x7e, 0x2c, 0xdc, 0x8d, 0xee, 0xef, 0x95, 0x87, 0x5e, 0xe0, 0x45, 0x38, 0x84, 0xe9, 0xef,
- 0xa6, 0x02, 0x40, 0xb2, 0x4f, 0xdd, 0x28, 0x23, 0x07, 0x00, 0x2a, 0xf3, 0xd8, 0x0d, 0xf8, 0x56,
- 0x7a, 0x16, 0x06, 0x5a, 0x5b, 0x86, 0x1f, 0xb6, 0x78, 0x38, 0x64, 0x15, 0x6b, 0xb4, 0xf0, 0xfe,
- 0x5e, 0x79, 0x46, 0x16, 0x44, 0x44, 0x23, 0x06, 0xc3, 0xbc, 0x1d, 0xdd, 0x61, 0x74, 0x93, 0x57,
- 0xdc, 0x66, 0xcb, 0x26, 0x14, 0xca, 0x76, 0x58, 0xa9, 0xd8, 0x0e, 0x5b, 0x4e, 0x61, 0xc2, 0x19,
- 0xd8, 0x43, 0x9a, 0x55, 0xc7, 0x0a, 0x2c, 0x23, 0xa2, 0xd9, 0x57, 0x9c, 0xa6, 0x8a, 0x09, 0x67,
- 0x60, 0x47, 0x9f, 0xd0, 0x60, 0x56, 0x2d, 0xbe, 0x6e, 0x39, 0x96, 0xbf, 0x45, 0xea, 0x8c, 0x78,
- 0xff, 0xa1, 0x89, 0x5f, 0xda, 0xdf, 0x2b, 0xcf, 0x2e, 0xe7, 0x62, 0xc4, 0x1d, 0xa8, 0xa1, 0xef,
- 0xd7, 0xe0, 0x7c, 0x62, 0x5e, 0x3c, 0xab, 0xd1, 0x20, 0x9e, 0xe8, 0xcd, 0xe1, 0x3f, 0xf0, 0xf2,
- 0xfe, 0x5e, 0xf9, 0xfc, 0x72, 0x3e, 0x4a, 0xdc, 0x89, 0x1e, 0xfa, 0x82, 0x06, 0x67, 0x5b, 0xc4,
- 0xa9, 0x5b, 0x4e, 0xe3, 0x45, 0xd7, 0xbb, 0x4b, 0x3c, 0x1f, 0xbb, 0xb6, 0xed, 0xb6, 0x03, 0x7f,
- 0x66, 0x90, 0x9d, 0x61, 0xd5, 0x22, 0xdf, 0xdc, 0x5a, 0x16, 0xc6, 0x85, 0x4b, 0x62, 0x8b, 0x9e,
- 0xcd, 0x04, 0xfb, 0x38, 0xa7, 0x23, 0xfa, 0xaf, 0x68, 0xd0, 0x57, 0xc1, 0x55, 0xf4, 0x88, 0xf2,
- 0x89, 0x9c, 0x93, 0x3f, 0x91, 0xfb, 0x7b, 0xe5, 0xa1, 0x0a, 0xae, 0x4a, 0x1f, 0xe3, 0xf7, 0x6b,
- 0x30, 0x65, 0xba, 0x4e, 0x60, 0xd0, 0xb9, 0xc3, 0x5c, 0x56, 0x0e, 0xcf, 0xe5, 0x42, 0x57, 0xec,
- 0x4a, 0x02, 0x59, 0xac, 0x98, 0x4f, 0x42, 0x7c, 0x9c, 0xa6, 0xac, 0xff, 0x84, 0x06, 0xd3, 0x15,
- 0xa3, 0x25, 0xd4, 0x56, 0x8b, 0x64, 0xd3, 0xa2, 0x1b, 0xa4, 0x9b, 0x57, 0x08, 0xb4, 0x05, 0x83,
- 0x4c, 0x33, 0xee, 0xf7, 0xa2, 0x21, 0x88, 0x69, 0xbf, 0xc0, 0x70, 0x71, 0x9d, 0x0d, 0xff, 0x1f,
- 0x0b, 0xfc, 0xfa, 0x3f, 0x2b, 0xc1, 0x78, 0x5c, 0xb1, 0x46, 0x02, 0xf4, 0xe3, 0x1a, 0x8c, 0x99,
- 0x61, 0x89, 0x45, 0xb8, 0xba, 0x74, 0xf4, 0x5a, 0xad, 0xb7, 0x2e, 0xd4, 0x48, 0x10, 0xff, 0xb2,
- 0x88, 0x78, 0x4a, 0x78, 0x48, 0x8c, 0x7d, 0x4c, 0x06, 0xdd, 0x4f, 0xfc, 0xc6, 0x4a, 0x77, 0x66,
- 0x3f, 0xaa, 0xc1, 0x54, 0x0a, 0x53, 0xc6, 0x53, 0xc3, 0xcb, 0xf2, 0x53, 0xc3, 0x11, 0x4d, 0xa1,
- 0xfc, 0x60, 0xf1, 0x34, 0x4c, 0x26, 0xc1, 0xa8, 0x1c, 0x4a, 0x83, 0x5c, 0xc5, 0x3c, 0x92, 0x14,
- 0xe4, 0x9e, 0x1c, 0xfe, 0xff, 0x3e, 0x5f, 0x7e, 0xcb, 0x77, 0xfd, 0xd1, 0xe5, 0xb7, 0xe8, 0x5f,
- 0xd6, 0x60, 0xac, 0x62, 0xbb, 0xed, 0xfa, 0x9a, 0xe7, 0x6e, 0x5a, 0x36, 0x79, 0x73, 0x68, 0x9d,
- 0xe4, 0x1e, 0xe7, 0x09, 0xfd, 0x4c, 0x0b, 0x24, 0x57, 0x7c, 0x93, 0x68, 0x81, 0xe4, 0x2e, 0xe7,
- 0xc8, 0xe1, 0xef, 0x83, 0x33, 0x72, 0xad, 0x58, 0x31, 0x7e, 0x19, 0xfa, 0xef, 0x5a, 0x4e, 0x3d,
- 0xf9, 0x49, 0xdf, 0xb2, 0x9c, 0x3a, 0x66, 0x90, 0xe8, 0xa3, 0x2f, 0xe5, 0x9e, 0xf6, 0x7b, 0x23,
- 0xea, 0xb4, 0x31, 0x31, 0xff, 0x0a, 0x0c, 0x9b, 0xc6, 0x42, 0xdb, 0xa9, 0xdb, 0x11, 0xbf, 0xa0,
- 0x53, 0x50, 0x99, 0xe7, 0x65, 0x38, 0x82, 0xa2, 0xd7, 0x01, 0xe2, 0x37, 0xa8, 0x5e, 0xc4, 0xa7,
- 0xf8, 0x79, 0xab, 0x46, 0x82, 0xc0, 0x72, 0x1a, 0x7e, 0xbc, 0xaf, 0x62, 0x18, 0x96, 0xa8, 0xa1,
- 0x0f, 0xc2, 0xb8, 0x2c, 0xcb, 0x71, 0x65, 0x78, 0xc1, 0x65, 0x50, 0x84, 0xc6, 0x33, 0x82, 0xf0,
- 0xb8, 0x5c, 0xea, 0x63, 0x95, 0x1a, 0xda, 0x8d, 0x24, 0x57, 0xae, 0x8a, 0xef, 0x2f, 0x7e, 0x17,
- 0x93, 0x85, 0xc6, 0xe9, 0x90, 0x3b, 0x29, 0x4f, 0x03, 0x0a, 0xa9, 0x0c, 0x45, 0xd9, 0xc0, 0x71,
- 0x29, 0xca, 0x08, 0x0c, 0x71, 0x55, 0x61, 0x78, 0x50, 0x3f, 0x59, 0x64, 0x80, 0x5c, 0xeb, 0x18,
- 0x3f, 0xaa, 0xf2, 0xdf, 0x3e, 0x0e, 0x71, 0xa3, 0x6d, 0x18, 0xa3, 0x57, 0x92, 0x1a, 0xb1, 0x89,
- 0x19, 0xb8, 0xde, 0xcc, 0x50, 0xf1, 0x47, 0xcb, 0x9a, 0x84, 0x87, 0xcb, 0xff, 0x72, 0x09, 0x56,
- 0xe8, 0x44, 0x9a, 0xd4, 0xe1, 0x5c, 0x4d, 0x6a, 0x1b, 0x46, 0xb7, 0xa5, 0x07, 0x97, 0x11, 0x36,
- 0x09, 0xcf, 0x14, 0xe9, 0x58, 0xfc, 0xfa, 0xb2, 0x70, 0x5a, 0x10, 0x1a, 0x95, 0x5f, 0x6a, 0x64,
- 0x3a, 0x68, 0x03, 0x86, 0x36, 0xb8, 0xf4, 0x3e, 0x03, 0x6c, 0x2e, 0x9e, 0xea, 0xe1, 0x52, 0xc2,
- 0x6f, 0x08, 0xe2, 0x07, 0x0e, 0x11, 0xa3, 0x57, 0x60, 0xd0, 0xb6, 0x9a, 0x56, 0xe0, 0xcf, 0x8c,
- 0x32, 0x12, 0x85, 0x96, 0x76, 0x99, 0x61, 0xe0, 0xc7, 0x3c, 0xff, 0x1f, 0x0b, 0xac, 0xe8, 0x23,
- 0xc9, 0x43, 0x7d, 0x8c, 0x4d, 0xde, 0xcd, 0xde, 0x0e, 0xc5, 0x58, 0xa6, 0x89, 0xbf, 0x95, 0xfc,
- 0x93, 0x5b, 0xff, 0x97, 0xe3, 0x30, 0x55, 0xb1, 0xdb, 0x7e, 0x40, 0xbc, 0x79, 0x61, 0x9a, 0x44,
- 0x3c, 0xda, 0xb5, 0xb3, 0xec, 0xdf, 0x45, 0xf7, 0x9e, 0xb3, 0x48, 0x6c, 0x63, 0x77, 0x7e, 0x93,
- 0xd6, 0xa8, 0xd7, 0x0f, 0x77, 0x4e, 0x2c, 0xb6, 0x85, 0x2e, 0x81, 0x3d, 0xc1, 0xd5, 0x32, 0x31,
- 0xe2, 0x1c, 0x4a, 0xe8, 0xfb, 0x34, 0x78, 0x20, 0x03, 0xb4, 0x48, 0x6c, 0x12, 0x84, 0x12, 0xc4,
- 0x61, 0xfb, 0x71, 0x71, 0x7f, 0xaf, 0xfc, 0x40, 0x2d, 0x0f, 0x29, 0xce, 0xa7, 0x87, 0x3e, 0xa5,
- 0xc1, 0x6c, 0x06, 0xf4, 0xba, 0x61, 0xd9, 0x6d, 0x2f, 0xbc, 0x3c, 0x1d, 0xb6, 0x3b, 0xec, 0x0e,
- 0x53, 0xcb, 0xc5, 0x8a, 0x3b, 0x50, 0x44, 0x1f, 0x82, 0x33, 0x11, 0xf4, 0x8e, 0xe3, 0x10, 0x52,
- 0x57, 0xae, 0x52, 0x87, 0xed, 0xca, 0x03, 0xfb, 0x7b, 0xe5, 0x33, 0xb5, 0x2c, 0x84, 0x38, 0x9b,
- 0x0e, 0x6a, 0xc0, 0xc5, 0x18, 0x10, 0x58, 0xb6, 0xf5, 0x3a, 0xbf, 0xed, 0x6d, 0x79, 0xc4, 0xdf,
- 0x72, 0xed, 0x3a, 0xe3, 0xba, 0xda, 0xc2, 0x5b, 0xf7, 0xf7, 0xca, 0x17, 0x6b, 0x9d, 0x2a, 0xe2,
- 0xce, 0x78, 0x50, 0x1d, 0xc6, 0x7c, 0xd3, 0x70, 0xaa, 0x4e, 0x40, 0xbc, 0x6d, 0xc3, 0x9e, 0x19,
- 0x2c, 0x34, 0x40, 0xce, 0xeb, 0x24, 0x3c, 0x58, 0xc1, 0x8a, 0xde, 0x03, 0xc3, 0x64, 0xa7, 0x65,
- 0x38, 0x75, 0xc2, 0xf9, 0xeb, 0xc8, 0xc2, 0x05, 0x7a, 0xaa, 0x2f, 0x89, 0x32, 0x2a, 0x01, 0x87,
- 0xff, 0xaf, 0xb8, 0x75, 0x82, 0xa3, 0xda, 0xe8, 0x03, 0x30, 0xcd, 0x6c, 0xa7, 0xea, 0x84, 0x9d,
- 0x16, 0x7e, 0x78, 0xa1, 0x1e, 0x2e, 0xd4, 0x4f, 0x66, 0x57, 0xb1, 0x92, 0x81, 0x0f, 0x67, 0x52,
- 0xa1, 0xcb, 0xd0, 0x34, 0x76, 0x6e, 0x78, 0x86, 0x49, 0x36, 0xdb, 0xf6, 0x3a, 0xf1, 0x9a, 0x96,
- 0xc3, 0x35, 0x4a, 0xc4, 0x74, 0x9d, 0x3a, 0xe5, 0xc9, 0xda, 0x95, 0x01, 0xbe, 0x0c, 0x2b, 0x9d,
- 0x2a, 0xe2, 0xce, 0x78, 0xd0, 0x63, 0x30, 0x66, 0x35, 0x1c, 0xd7, 0x23, 0xeb, 0x86, 0xe5, 0x04,
- 0xfe, 0x0c, 0x30, 0x79, 0x9a, 0x4d, 0x6b, 0x55, 0x2a, 0xc7, 0x4a, 0x2d, 0xb4, 0x0d, 0xc8, 0x21,
- 0xf7, 0xd6, 0xdc, 0x3a, 0xdb, 0x02, 0x77, 0x5a, 0x6c, 0x23, 0x0b, 0x8e, 0x7a, 0xd8, 0xa9, 0x61,
- 0xfa, 0x86, 0xd5, 0x14, 0x36, 0x9c, 0x41, 0x01, 0x5d, 0x07, 0xd4, 0x34, 0x76, 0x96, 0x9a, 0xad,
- 0x60, 0x77, 0xa1, 0x6d, 0xdf, 0x15, 0x5c, 0x63, 0x8c, 0xcd, 0x05, 0xd7, 0xc6, 0xa5, 0xa0, 0x38,
- 0xa3, 0x05, 0x32, 0xe0, 0x3c, 0x1f, 0xcf, 0xa2, 0x41, 0x9a, 0xae, 0xe3, 0x93, 0xc0, 0x97, 0x36,
- 0xe9, 0xcc, 0x38, 0xb3, 0xa0, 0x61, 0xb7, 0xff, 0x6a, 0x7e, 0x35, 0xdc, 0x09, 0x87, 0x6a, 0x43,
- 0x38, 0x71, 0x80, 0x0d, 0xe1, 0xe3, 0x30, 0xee, 0x07, 0x86, 0x17, 0xb4, 0x5b, 0x62, 0x19, 0x4e,
- 0xb1, 0x65, 0x60, 0xca, 0xda, 0x9a, 0x0c, 0xc0, 0x6a, 0x3d, 0xba, 0x7c, 0x5c, 0x23, 0x2f, 0xda,
- 0x4d, 0xc6, 0xcb, 0x57, 0x93, 0xca, 0xb1, 0x52, 0x0b, 0xdd, 0x81, 0x73, 0x4d, 0x63, 0x27, 0xfa,
- 0x7c, 0xd7, 0x0c, 0xcf, 0xb0, 0x6d, 0x62, 0x5b, 0x7e, 0x73, 0x66, 0x8a, 0xf5, 0x94, 0x99, 0x6c,
- 0xac, 0x64, 0x57, 0xc1, 0x79, 0x6d, 0x85, 0x51, 0xe1, 0xa2, 0x67, 0x58, 0x0a, 0x4a, 0xa4, 0x18,
- 0x15, 0x26, 0xc1, 0x38, 0xab, 0x8d, 0xfe, 0x3f, 0xfb, 0x61, 0x26, 0x75, 0x82, 0x85, 0x96, 0x81,
- 0x07, 0xf2, 0x28, 0xed, 0x88, 0x78, 0x54, 0x0b, 0x2e, 0x47, 0x15, 0x6e, 0xb4, 0xda, 0x99, 0xb4,
- 0x4a, 0x8c, 0xd6, 0x43, 0xfb, 0x7b, 0xe5, 0xcb, 0xb5, 0x03, 0xea, 0xe2, 0x03, 0xb1, 0xe5, 0xf3,
- 0xff, 0xbe, 0x13, 0xe2, 0xff, 0x1f, 0x80, 0x69, 0x09, 0xe0, 0x11, 0xa3, 0xbe, 0xdb, 0xc3, 0xf9,
- 0xc3, 0xd8, 0x5e, 0x2d, 0x03, 0x1f, 0xce, 0xa4, 0x92, 0xcb, 0x74, 0x07, 0x4e, 0x82, 0xe9, 0xea,
- 0x7b, 0x7d, 0x30, 0x52, 0x71, 0x9d, 0x3a, 0x57, 0x1e, 0x3d, 0xaa, 0x18, 0x1c, 0x5c, 0x94, 0xc5,
- 0xe4, 0xfb, 0x7b, 0xe5, 0xf1, 0xa8, 0xa2, 0x24, 0x37, 0x3f, 0x11, 0x3d, 0xc2, 0xf1, 0xcb, 0xe7,
- 0x5b, 0xd5, 0xd7, 0xb3, 0xfb, 0x7b, 0xe5, 0x53, 0x51, 0x33, 0xf5, 0x41, 0x8d, 0x72, 0x54, 0xdb,
- 0xf0, 0x83, 0x75, 0xcf, 0x70, 0x7c, 0xab, 0x07, 0xed, 0x6d, 0xf4, 0x6a, 0xb2, 0x9c, 0xc2, 0x86,
- 0x33, 0x28, 0xa0, 0x57, 0x61, 0x82, 0x96, 0xde, 0x69, 0xd5, 0x8d, 0x80, 0x14, 0x54, 0xda, 0x46,
- 0x46, 0x69, 0xcb, 0x0a, 0x26, 0x9c, 0xc0, 0xcc, 0x0d, 0x34, 0x0c, 0xdf, 0x75, 0xd8, 0x7a, 0x2a,
- 0x06, 0x1a, 0xb4, 0x14, 0x0b, 0x28, 0x7a, 0x18, 0x86, 0x9a, 0xc4, 0xf7, 0x8d, 0x06, 0x61, 0x52,
- 0xc1, 0x48, 0x7c, 0x87, 0x5a, 0xe1, 0xc5, 0x38, 0x84, 0xa3, 0x77, 0xc0, 0x80, 0xe9, 0xd6, 0x89,
- 0x3f, 0x33, 0xc4, 0x18, 0x1f, 0x3d, 0x03, 0x06, 0x2a, 0xb4, 0xe0, 0xfe, 0x5e, 0x79, 0x84, 0xbd,
- 0x31, 0xd1, 0x5f, 0x98, 0x57, 0xd2, 0xff, 0x7f, 0x0d, 0x26, 0x93, 0x1a, 0xc5, 0x2e, 0x0c, 0x4b,
- 0x4e, 0xce, 0x46, 0x43, 0xff, 0xb4, 0x06, 0x63, 0xb4, 0x87, 0x9e, 0x6b, 0xaf, 0xd9, 0x86, 0x43,
- 0xd0, 0xf7, 0x6a, 0x30, 0xb9, 0x65, 0x35, 0xb6, 0x64, 0xc3, 0x3c, 0x21, 0xae, 0x17, 0xd2, 0x2b,
- 0xdd, 0x4c, 0xe0, 0x5a, 0x98, 0xde, 0xdf, 0x2b, 0x4f, 0x26, 0x4b, 0x71, 0x8a, 0xa6, 0xfe, 0xa7,
- 0x25, 0x38, 0x27, 0xf7, 0x6c, 0x3e, 0xf6, 0x79, 0x40, 0x7f, 0xa0, 0x01, 0x34, 0x2d, 0x67, 0xde,
- 0xb6, 0xdd, 0x7b, 0xcc, 0x9a, 0x98, 0x5e, 0x79, 0xde, 0x57, 0x54, 0x13, 0x9c, 0x41, 0x61, 0x6e,
- 0x25, 0xc2, 0xce, 0xf5, 0x99, 0x2f, 0x85, 0x7a, 0x92, 0x18, 0x70, 0x7f, 0xaf, 0x5c, 0x4e, 0x3b,
- 0x5a, 0xcc, 0x61, 0xe1, 0xcd, 0xb0, 0x6c, 0xf9, 0xc1, 0x47, 0xfe, 0xa4, 0x63, 0x15, 0xfe, 0x8c,
- 0x1b, 0x0f, 0x64, 0xb6, 0x09, 0xa7, 0x12, 0x84, 0x33, 0xd4, 0x9f, 0x8b, 0xaa, 0xfa, 0xb3, 0x23,
- 0x93, 0x9a, 0x0b, 0x7d, 0x2b, 0xe6, 0x9e, 0x6f, 0x1b, 0x4e, 0x40, 0x67, 0x5a, 0x52, 0x74, 0xfe,
- 0x71, 0x09, 0xa6, 0xc5, 0x04, 0xd8, 0xf4, 0x8a, 0xd2, 0xb2, 0xdd, 0xdd, 0x26, 0x71, 0x4e, 0xc2,
- 0x4e, 0x2e, 0xfc, 0x08, 0x4a, 0xb9, 0x1f, 0x41, 0x33, 0xf5, 0x11, 0xf4, 0x15, 0xf9, 0x08, 0x22,
- 0x5e, 0x71, 0x80, 0x0e, 0x06, 0xc3, 0x59, 0xcb, 0xa1, 0x1d, 0xbd, 0xc1, 0x36, 0x4c, 0x6c, 0x23,
- 0xcb, 0xf8, 0xd3, 0x30, 0xbf, 0x7b, 0x56, 0x33, 0x6b, 0xe0, 0x9c, 0x96, 0xfa, 0x5f, 0x68, 0x30,
- 0x93, 0x35, 0xbf, 0x27, 0xa0, 0x36, 0x6d, 0xaa, 0x6a, 0xd3, 0x9b, 0x3d, 0x7c, 0x1b, 0x4a, 0xd7,
- 0x73, 0xd4, 0xa7, 0x7f, 0x5e, 0x82, 0xb3, 0x71, 0xf5, 0xaa, 0xe3, 0x07, 0x86, 0x6d, 0x73, 0xb9,
- 0xf4, 0xf8, 0xf7, 0x52, 0x4b, 0xd1, 0x7e, 0xaf, 0xf6, 0x36, 0x54, 0xb9, 0xef, 0xb9, 0xc6, 0x2f,
- 0x3b, 0x09, 0xe3, 0x97, 0xb5, 0x23, 0xa4, 0xd9, 0xd9, 0x0e, 0xe6, 0x3f, 0x6b, 0x30, 0x9b, 0xdd,
- 0xf0, 0x04, 0x36, 0x95, 0xab, 0x6e, 0xaa, 0xf7, 0x1e, 0xdd, 0xa8, 0x73, 0xb6, 0xd5, 0xcf, 0x97,
- 0xf2, 0x46, 0xcb, 0x54, 0xe8, 0x9b, 0x70, 0xca, 0x23, 0x0d, 0xcb, 0x0f, 0x84, 0x95, 0xc6, 0xe1,
- 0x8c, 0xe6, 0xc3, 0x47, 0xc7, 0x53, 0x58, 0xc5, 0x81, 0x93, 0x48, 0xd1, 0x2a, 0x0c, 0xf9, 0x84,
- 0xd4, 0x29, 0xfe, 0x52, 0xf7, 0xf8, 0x23, 0x21, 0xa2, 0xc6, 0xdb, 0xe2, 0x10, 0x09, 0xfa, 0x36,
- 0x18, 0xaf, 0x47, 0x5f, 0xd4, 0x01, 0xc6, 0x91, 0x49, 0xac, 0xec, 0x8a, 0xb6, 0x28, 0xb7, 0xc6,
- 0x2a, 0x32, 0xfd, 0xab, 0x1a, 0x5c, 0xe8, 0xb4, 0xb7, 0xd0, 0x6b, 0x00, 0x66, 0x28, 0x15, 0x86,
- 0x8f, 0x80, 0x4f, 0x17, 0x5c, 0x4b, 0x8e, 0x25, 0xfe, 0x40, 0xa3, 0x22, 0x1f, 0x4b, 0x44, 0x32,
- 0x4c, 0x22, 0x4b, 0xc7, 0x64, 0x12, 0xa9, 0xff, 0x17, 0x4d, 0x66, 0x45, 0xf2, 0xda, 0xbe, 0xd9,
- 0x58, 0x91, 0xdc, 0xf7, 0xdc, 0x27, 0xb9, 0xdf, 0x2b, 0xc1, 0xe5, 0xec, 0x26, 0xd2, 0x79, 0xfe,
- 0x1c, 0x0c, 0xb6, 0xb8, 0x63, 0x0b, 0xb7, 0xf1, 0xbf, 0x42, 0x39, 0x0b, 0x77, 0x3b, 0xb9, 0xbf,
- 0x57, 0x9e, 0xcd, 0x62, 0xf4, 0xc2, 0x61, 0x45, 0xb4, 0x43, 0x56, 0xe2, 0xed, 0x80, 0x0b, 0xed,
- 0xdf, 0xdc, 0x25, 0x73, 0x31, 0x36, 0x88, 0xdd, 0xf5, 0x73, 0xc1, 0x87, 0x35, 0x98, 0x50, 0x76,
- 0xb4, 0x3f, 0x33, 0xc0, 0xf6, 0x68, 0x21, 0x6b, 0x34, 0xe5, 0x53, 0x89, 0xa5, 0x01, 0xa5, 0xd8,
- 0xc7, 0x09, 0x82, 0x09, 0x36, 0x2b, 0xcf, 0xea, 0x9b, 0x8e, 0xcd, 0xca, 0x9d, 0xcf, 0x61, 0xb3,
- 0x3f, 0x56, 0xca, 0x1b, 0x2d, 0x63, 0xb3, 0xf7, 0x60, 0x24, 0x14, 0x23, 0x43, 0x76, 0x71, 0xbd,
- 0xd7, 0x3e, 0x71, 0x74, 0xb1, 0xa9, 0x77, 0x58, 0xe2, 0xe3, 0x98, 0x16, 0xfa, 0x1e, 0x0d, 0x20,
- 0x5e, 0x18, 0xf1, 0x51, 0xad, 0x1f, 0xdd, 0x74, 0x48, 0x62, 0xcd, 0x04, 0xfd, 0xa4, 0xa5, 0x4d,
- 0x21, 0xd1, 0xd5, 0x7f, 0x64, 0x00, 0x50, 0xba, 0xef, 0xdd, 0xbd, 0x0c, 0x1f, 0x20, 0xe4, 0x3e,
- 0x0d, 0xa7, 0x1a, 0xb6, 0xbb, 0x61, 0xd8, 0xf6, 0xae, 0xf0, 0x81, 0x14, 0xde, 0x74, 0xa7, 0xe9,
- 0xc1, 0x74, 0x43, 0x05, 0xe1, 0x64, 0x5d, 0xd4, 0x82, 0x49, 0x8f, 0x0a, 0x9b, 0xa6, 0x65, 0xb3,
- 0x1b, 0xaf, 0xdb, 0x0e, 0x0a, 0x2a, 0x4e, 0xd8, 0xad, 0x0c, 0x27, 0x70, 0xe1, 0x14, 0x76, 0xf4,
- 0x36, 0x18, 0x6a, 0x79, 0x56, 0xd3, 0xf0, 0x76, 0xd9, 0x9d, 0x7a, 0x98, 0xbf, 0x7a, 0xad, 0xf1,
- 0x22, 0x1c, 0xc2, 0xd0, 0x07, 0x60, 0xc4, 0xb6, 0x36, 0x89, 0xb9, 0x6b, 0xda, 0x44, 0x68, 0xda,
- 0x6f, 0x1f, 0xcd, 0x96, 0x59, 0x0e, 0xd1, 0x0a, 0x2b, 0xcf, 0xf0, 0x27, 0x8e, 0x09, 0xa2, 0x2a,
- 0x9c, 0xbe, 0xc7, 0xec, 0x8e, 0x6c, 0xe2, 0xfb, 0xb5, 0x76, 0xab, 0xe5, 0x7a, 0x01, 0xa9, 0x33,
- 0x7d, 0xfc, 0x30, 0xd7, 0x0b, 0xbe, 0x98, 0x06, 0xe3, 0xac, 0x36, 0xe8, 0x69, 0x00, 0xa3, 0x1d,
- 0xb8, 0x7c, 0xc2, 0x67, 0x86, 0xd9, 0xa5, 0xff, 0x22, 0xdd, 0x2b, 0xf3, 0x51, 0xe9, 0xfd, 0xbd,
- 0xf2, 0xa8, 0x50, 0x1d, 0xb2, 0x95, 0x95, 0x1a, 0xa0, 0xf7, 0xc1, 0xb4, 0xc9, 0x41, 0x15, 0xb7,
- 0xd9, 0x32, 0x02, 0x4b, 0x5c, 0xa8, 0x47, 0x18, 0xa2, 0x6f, 0xd8, 0xdf, 0x2b, 0x4f, 0x57, 0x32,
- 0xe0, 0x49, 0x94, 0x99, 0x48, 0xf4, 0x4f, 0x94, 0xe0, 0x7c, 0x87, 0x09, 0x42, 0x98, 0x7e, 0xb7,
- 0x62, 0xfd, 0xc4, 0x2e, 0x7d, 0x8c, 0x7f, 0x6b, 0xa2, 0xf0, 0xfe, 0x5e, 0xf9, 0xc1, 0x0e, 0x08,
- 0x6a, 0xf4, 0x33, 0x21, 0x8d, 0x5d, 0x1c, 0xa3, 0x41, 0x55, 0x18, 0xac, 0xc7, 0x4f, 0x67, 0x23,
- 0x0b, 0x8f, 0xd2, 0x93, 0x84, 0x2b, 0xb9, 0xbb, 0xc5, 0x26, 0x10, 0xa0, 0x65, 0x18, 0xe2, 0x76,
- 0xab, 0x44, 0x9c, 0x4a, 0xd7, 0x98, 0xc6, 0x85, 0x17, 0x75, 0x8b, 0x2c, 0x44, 0xa1, 0xff, 0x95,
- 0x06, 0x43, 0x15, 0xd7, 0x23, 0x8b, 0xab, 0x35, 0xb4, 0x0b, 0xa3, 0x52, 0x84, 0x04, 0xc1, 0xa1,
- 0x0b, 0xb2, 0x2c, 0x86, 0x51, 0xd2, 0x0c, 0x84, 0x3e, 0x9d, 0x51, 0x01, 0x96, 0x69, 0xa1, 0xd7,
- 0xe8, 0x9c, 0xdf, 0xf3, 0xac, 0x80, 0x12, 0xee, 0xc5, 0x1c, 0x87, 0x13, 0xc6, 0x21, 0x2e, 0xbe,
- 0xdb, 0xa3, 0x9f, 0x38, 0xa6, 0xa2, 0xaf, 0x51, 0xee, 0x94, 0xec, 0x26, 0x7a, 0x12, 0xfa, 0x9b,
- 0x6e, 0x3d, 0x5c, 0xf7, 0xb7, 0x87, 0xbc, 0x67, 0xc5, 0xad, 0xd3, 0xb9, 0x3d, 0x9b, 0x6e, 0xc1,
- 0x9e, 0xa3, 0x58, 0x1b, 0x7d, 0x15, 0x26, 0x93, 0xf4, 0xd1, 0x93, 0x30, 0x61, 0xba, 0xcd, 0xa6,
- 0xeb, 0xd4, 0xda, 0x9b, 0x9b, 0xd6, 0x0e, 0x51, 0x9c, 0x6d, 0x2b, 0x0a, 0x04, 0x27, 0x6a, 0xea,
- 0x9f, 0xd3, 0xa0, 0x8f, 0xae, 0x8b, 0x0e, 0x83, 0x75, 0xb7, 0x69, 0x58, 0x8e, 0xe8, 0x15, 0x7b,
- 0xcf, 0x5e, 0x64, 0x25, 0x58, 0x40, 0x50, 0x0b, 0x46, 0x42, 0x81, 0xae, 0x27, 0xd3, 0xfb, 0xc5,
- 0xd5, 0x5a, 0xe4, 0x0f, 0x15, 0x9d, 0x32, 0x61, 0x89, 0x8f, 0x63, 0x22, 0xba, 0x01, 0x53, 0x8b,
- 0xab, 0xb5, 0xaa, 0x63, 0xda, 0xed, 0x3a, 0x59, 0xda, 0x61, 0x7f, 0x28, 0x9f, 0xb3, 0x78, 0x89,
- 0x18, 0x27, 0xe3, 0x73, 0xa2, 0x12, 0x0e, 0x61, 0xb4, 0x1a, 0xe1, 0x2d, 0x84, 0xef, 0x29, 0xab,
- 0x26, 0x90, 0xe0, 0x10, 0xa6, 0x7f, 0xb9, 0x04, 0xa3, 0x52, 0x87, 0x90, 0x0d, 0x43, 0x7c, 0xb8,
- 0x7e, 0x2f, 0xf1, 0x05, 0x52, 0xbd, 0xe6, 0xd4, 0xf9, 0x84, 0xfa, 0x38, 0x24, 0x21, 0xf3, 0xec,
- 0x52, 0x07, 0x9e, 0x3d, 0xa7, 0xb8, 0xf0, 0xf2, 0x4f, 0x72, 0x22, 0xdf, 0x7d, 0x17, 0x5d, 0x10,
- 0xa7, 0x1b, 0xb7, 0x7d, 0x1f, 0x4e, 0x9c, 0x6c, 0x9b, 0x30, 0xf0, 0xba, 0xeb, 0x10, 0x5f, 0xa8,
- 0xd2, 0x8f, 0x68, 0x80, 0xcc, 0xee, 0xee, 0x65, 0x8a, 0x17, 0x73, 0xf4, 0xfa, 0x17, 0x34, 0x80,
- 0x45, 0x23, 0x30, 0xb8, 0x91, 0x47, 0x17, 0x16, 0x98, 0x17, 0x94, 0x43, 0x79, 0x38, 0xe5, 0xd3,
- 0xd7, 0xef, 0x5b, 0xaf, 0x87, 0xc3, 0x8f, 0x84, 0x7d, 0x8e, 0xbd, 0x66, 0xbd, 0x4e, 0x30, 0x83,
- 0xa3, 0x47, 0x60, 0x84, 0x38, 0xa6, 0xb7, 0xdb, 0xa2, 0x07, 0x0b, 0xd7, 0x10, 0xb1, 0x2f, 0x74,
- 0x29, 0x2c, 0xc4, 0x31, 0x5c, 0x7f, 0x14, 0xd4, 0x1b, 0x5b, 0x17, 0x06, 0xe2, 0x7f, 0xad, 0xc1,
- 0xb9, 0xc5, 0xb6, 0x61, 0xcf, 0xb7, 0xe8, 0x46, 0x35, 0xec, 0xeb, 0x2e, 0x37, 0x21, 0xa0, 0xd7,
- 0x98, 0x77, 0xc0, 0x70, 0x28, 0x23, 0x25, 0x5d, 0x89, 0x43, 0x46, 0x89, 0xa3, 0x1a, 0xc8, 0x80,
- 0x61, 0x3f, 0x94, 0xda, 0x4b, 0x3d, 0x48, 0xed, 0x21, 0x89, 0x48, 0x6a, 0x8f, 0xd0, 0x72, 0xdd,
- 0x19, 0x5b, 0xa0, 0x1a, 0xf1, 0xb6, 0x2d, 0x93, 0xcc, 0x9b, 0xa6, 0xdb, 0x76, 0x02, 0x5f, 0x08,
- 0x33, 0x42, 0x77, 0x96, 0x55, 0x03, 0xe7, 0xb4, 0xd4, 0xbf, 0xa4, 0x41, 0xff, 0xd2, 0x7a, 0x65,
- 0x11, 0x7d, 0x1b, 0xf4, 0x47, 0x2c, 0xa3, 0xa0, 0x51, 0x10, 0xc5, 0xc3, 0xd5, 0x7c, 0x7c, 0xbd,
- 0x57, 0x28, 0xc3, 0x61, 0x58, 0xd1, 0x06, 0x0c, 0x92, 0x6d, 0x42, 0xbb, 0x5a, 0x3a, 0x12, 0xfc,
- 0x8c, 0xa5, 0x2d, 0x31, 0x8c, 0x58, 0x60, 0xd6, 0x3f, 0xa9, 0x01, 0xc4, 0x55, 0xd0, 0x77, 0x66,
- 0x9d, 0x4e, 0xb7, 0x8e, 0x50, 0x79, 0xdd, 0xf9, 0x88, 0xd2, 0xbf, 0xd2, 0x0f, 0x0f, 0xd0, 0xee,
- 0x88, 0xad, 0x6a, 0xb9, 0xce, 0x2d, 0xb2, 0xfb, 0x77, 0xae, 0x08, 0x7f, 0xe7, 0x8a, 0x70, 0x74,
- 0xae, 0x08, 0xfa, 0xb3, 0x30, 0x19, 0x6f, 0x2f, 0xb1, 0xef, 0x1f, 0x49, 0x5e, 0x23, 0x47, 0x42,
- 0xa1, 0x26, 0x7d, 0xf5, 0xd3, 0xef, 0x6b, 0x30, 0xb9, 0xb4, 0xd3, 0xb2, 0x3c, 0x16, 0x52, 0x81,
- 0x7b, 0xdb, 0xa0, 0x87, 0x63, 0xa7, 0x1c, 0x4d, 0x7d, 0xa7, 0x4b, 0x3a, 0xe6, 0xa0, 0x4d, 0x98,
- 0x20, 0xac, 0x39, 0xbb, 0xe7, 0x19, 0x41, 0x91, 0x1d, 0xc8, 0xe3, 0x88, 0x28, 0x58, 0x70, 0x02,
- 0x2b, 0xaa, 0xc1, 0x84, 0x69, 0x1b, 0xbe, 0x6f, 0x6d, 0x5a, 0x66, 0xec, 0x4c, 0x36, 0xb2, 0xf0,
- 0x08, 0x13, 0x8b, 0x14, 0xc8, 0xfd, 0xbd, 0xf2, 0x19, 0xd1, 0x4f, 0x15, 0x80, 0x13, 0x28, 0xf4,
- 0xcf, 0x94, 0x60, 0x7c, 0x69, 0xa7, 0xe5, 0xfa, 0x6d, 0x8f, 0xb0, 0xaa, 0x27, 0xa0, 0xb9, 0x7a,
- 0x18, 0x86, 0xb6, 0x0c, 0xa7, 0x6e, 0x13, 0x4f, 0x9c, 0x8c, 0xd1, 0xdc, 0xde, 0xe4, 0xc5, 0x38,
- 0x84, 0xa3, 0x37, 0x00, 0x7c, 0x73, 0x8b, 0xd4, 0xdb, 0x8c, 0x7f, 0xf5, 0x15, 0xe7, 0x5f, 0xca,
- 0x18, 0x6b, 0x11, 0x4a, 0x21, 0x75, 0x44, 0xbf, 0xb1, 0x44, 0x4e, 0xff, 0x43, 0x0d, 0xa6, 0x94,
- 0x76, 0x27, 0xa0, 0x90, 0xd9, 0x54, 0x15, 0x32, 0xf3, 0x3d, 0x8f, 0x35, 0x47, 0x0f, 0xf3, 0xb1,
- 0x12, 0x9c, 0xcb, 0x99, 0x93, 0x94, 0xf1, 0xae, 0x76, 0x42, 0xc6, 0xbb, 0x6d, 0x18, 0x0d, 0x5c,
- 0x5b, 0xf8, 0x3c, 0x86, 0x33, 0x50, 0xe8, 0x94, 0x5c, 0x8f, 0xd0, 0xc4, 0xa6, 0xb9, 0x71, 0x99,
- 0x8f, 0x65, 0x3a, 0xfa, 0xaf, 0x68, 0x30, 0x12, 0xe9, 0x7d, 0xbf, 0xae, 0x9e, 0xcc, 0xbb, 0x0f,
- 0x7d, 0xa4, 0xff, 0x66, 0x09, 0xce, 0x46, 0xb8, 0x43, 0x36, 0x57, 0x0b, 0x28, 0xdf, 0x38, 0x58,
- 0x79, 0x74, 0x41, 0x71, 0x2b, 0x18, 0x4e, 0xfb, 0x27, 0xb6, 0xda, 0x5e, 0xcb, 0xf5, 0x43, 0x51,
- 0x95, 0xcb, 0xf4, 0xbc, 0x08, 0x87, 0x30, 0xb4, 0x0a, 0x03, 0x3e, 0xa5, 0x27, 0x8e, 0xa3, 0x43,
- 0xce, 0x06, 0x93, 0xb6, 0x59, 0x7f, 0x31, 0x47, 0x83, 0xde, 0x90, 0x79, 0xf8, 0x40, 0x71, 0xf5,
- 0x24, 0x1d, 0x49, 0x3d, 0x12, 0x56, 0xd3, 0x91, 0x1f, 0x32, 0xcf, 0x84, 0x65, 0x98, 0x14, 0x66,
- 0xab, 0x7c, 0xdb, 0x38, 0x26, 0x41, 0xef, 0x51, 0x76, 0xc6, 0x43, 0x09, 0xa3, 0x99, 0xe9, 0x64,
- 0xfd, 0x78, 0xc7, 0xe8, 0x3e, 0x0c, 0xdf, 0x10, 0x9d, 0x44, 0xb3, 0x50, 0xb2, 0xc2, 0xb5, 0x00,
- 0x81, 0xa3, 0x54, 0x5d, 0xc4, 0x25, 0xab, 0x0b, 0xf7, 0x0e, 0xf9, 0x58, 0xea, 0xeb, 0x7c, 0x2c,
- 0xe9, 0x7f, 0x56, 0x82, 0xe9, 0x90, 0x6a, 0x38, 0xc6, 0x45, 0xf1, 0x1e, 0x7e, 0xc0, 0xbd, 0xe5,
- 0x60, 0x65, 0xe2, 0x6d, 0xe8, 0x67, 0x0c, 0xb0, 0xd0, 0x3b, 0x79, 0x84, 0x90, 0x76, 0x07, 0x33,
- 0x44, 0xe8, 0x03, 0x30, 0x68, 0xd3, 0x4b, 0x40, 0xe8, 0x77, 0x51, 0x48, 0xf5, 0x9a, 0x35, 0x5c,
- 0x7e, 0xb7, 0x10, 0xae, 0x62, 0xd1, 0x53, 0x27, 0x2f, 0xc4, 0x82, 0xe6, 0xec, 0x13, 0x30, 0x2a,
- 0x55, 0x3b, 0x54, 0xc8, 0xb9, 0xcf, 0x95, 0x60, 0xe6, 0x26, 0xb1, 0x9b, 0x99, 0xc6, 0x0d, 0x65,
- 0x18, 0x30, 0xb7, 0x0c, 0x8f, 0x47, 0x33, 0x1c, 0xe3, 0x9b, 0xbc, 0x42, 0x0b, 0x30, 0x2f, 0xa7,
- 0x77, 0x02, 0xc5, 0x47, 0xef, 0x19, 0x69, 0x26, 0xe3, 0x30, 0x97, 0xef, 0x8f, 0xe2, 0x60, 0xc6,
- 0x03, 0x57, 0x2a, 0xd0, 0xe3, 0xe5, 0xbd, 0xb5, 0xdb, 0xab, 0x59, 0xde, 0x79, 0xe8, 0x75, 0x18,
- 0x77, 0x4d, 0x0b, 0x93, 0x96, 0xeb, 0x5b, 0x81, 0xeb, 0xed, 0x8a, 0x45, 0x2b, 0x74, 0xb4, 0xdc,
- 0xae, 0x54, 0x63, 0x44, 0xfc, 0x81, 0x50, 0x29, 0xc2, 0x2a, 0x29, 0xfd, 0x8b, 0x1a, 0x8c, 0xde,
- 0xb4, 0x36, 0x88, 0xc7, 0x2d, 0x73, 0x99, 0x12, 0x43, 0x89, 0xcb, 0x37, 0x9a, 0x15, 0x93, 0x0f,
- 0xed, 0xc0, 0x88, 0x38, 0x87, 0x23, 0xe7, 0xcb, 0x1b, 0xc5, 0x2c, 0x82, 0x22, 0xd2, 0xe2, 0x7c,
- 0x93, 0x43, 0xbe, 0x84, 0x14, 0x70, 0x4c, 0x4c, 0x7f, 0x03, 0x4e, 0x67, 0x34, 0xa2, 0x0b, 0xc9,
- 0x8c, 0x53, 0xc5, 0x47, 0x13, 0x72, 0x2b, 0xba, 0x90, 0xac, 0x1c, 0x3d, 0x00, 0x7d, 0xc4, 0xa9,
- 0x8b, 0x2f, 0x66, 0x68, 0x7f, 0xaf, 0xdc, 0xb7, 0xe4, 0xd4, 0x31, 0x2d, 0xa3, 0x4c, 0xdc, 0x76,
- 0x15, 0x89, 0x8d, 0x31, 0xf1, 0x65, 0x51, 0x86, 0x23, 0x28, 0xb3, 0xe1, 0x4a, 0x9a, 0x2b, 0x51,
- 0xe1, 0x7f, 0x72, 0x33, 0xc1, 0x5b, 0x7a, 0xb1, 0x92, 0x4a, 0xf2, 0xa9, 0x85, 0x19, 0x31, 0x21,
- 0x29, 0x8e, 0x87, 0x53, 0x74, 0xf5, 0x5f, 0xea, 0x87, 0x8b, 0x37, 0x5d, 0xcf, 0x7a, 0xdd, 0x75,
- 0x02, 0xc3, 0x5e, 0x73, 0xeb, 0xb1, 0x05, 0xab, 0x38, 0xb2, 0x3e, 0xaa, 0xc1, 0x39, 0xb3, 0xd5,
- 0xe6, 0x97, 0x87, 0xd0, 0x08, 0x74, 0x8d, 0x78, 0x96, 0x5b, 0xd4, 0x15, 0x83, 0x19, 0xec, 0x56,
- 0xd6, 0xee, 0x64, 0xa1, 0xc4, 0x79, 0xb4, 0x98, 0x47, 0x48, 0xdd, 0xbd, 0xe7, 0xb0, 0xce, 0xd5,
- 0x02, 0x36, 0x9b, 0xaf, 0xc7, 0x8b, 0x50, 0xd0, 0x23, 0x64, 0x31, 0x13, 0x23, 0xce, 0xa1, 0x84,
- 0x3e, 0x04, 0x67, 0x2c, 0xde, 0x39, 0x4c, 0x8c, 0xba, 0xe5, 0x10, 0xdf, 0xe7, 0xe6, 0xe4, 0x3d,
- 0xb8, 0x3c, 0x54, 0xb3, 0x10, 0xe2, 0x6c, 0x3a, 0xe8, 0x15, 0x00, 0x7f, 0xd7, 0x31, 0xc5, 0xfc,
- 0x17, 0x33, 0x35, 0xe5, 0x22, 0x72, 0x84, 0x05, 0x4b, 0x18, 0xe9, 0x45, 0x2b, 0x88, 0x36, 0xe5,
- 0x20, 0x33, 0x17, 0x66, 0x17, 0xad, 0x78, 0x0f, 0xc5, 0x70, 0xfd, 0x93, 0x1a, 0x4c, 0x54, 0x9d,
- 0x35, 0xdb, 0x30, 0x09, 0xb7, 0x9c, 0xf4, 0xd1, 0x55, 0x18, 0xf1, 0xa3, 0x47, 0x13, 0xce, 0x11,
- 0xe2, 0xef, 0x33, 0x7a, 0x2e, 0x89, 0xeb, 0x30, 0x3b, 0x6c, 0xcb, 0x11, 0x87, 0xdd, 0x75, 0xd7,
- 0xe3, 0x88, 0xc4, 0x77, 0xc7, 0xed, 0xb0, 0xd3, 0x60, 0x9c, 0xd5, 0x46, 0xff, 0x39, 0x0d, 0xa6,
- 0xd5, 0xee, 0x08, 0xa3, 0x85, 0x1f, 0xd5, 0x60, 0x5a, 0xf1, 0x29, 0x17, 0xe0, 0x5e, 0x82, 0x67,
- 0xad, 0x65, 0xe0, 0xe3, 0x46, 0xbc, 0x59, 0x10, 0x9c, 0x49, 0x5f, 0xff, 0x87, 0x1a, 0x0c, 0x89,
- 0xf0, 0x9c, 0xe8, 0xed, 0x09, 0x05, 0x77, 0x74, 0xb4, 0x25, 0x94, 0xdc, 0xbb, 0xcc, 0x02, 0x43,
- 0x1c, 0x4d, 0xe2, 0x94, 0x29, 0xa4, 0x21, 0x15, 0x84, 0xe3, 0x73, 0x4e, 0xb1, 0xc4, 0x08, 0x5f,
- 0x4f, 0x24, 0x62, 0xfa, 0xe7, 0x35, 0x98, 0x4a, 0xb5, 0xea, 0x42, 0x1c, 0x3d, 0x41, 0x9b, 0xd4,
- 0xdf, 0xeb, 0xa7, 0x5b, 0x32, 0xa0, 0xfc, 0xde, 0xe6, 0xba, 0xe7, 0x13, 0xb8, 0xff, 0x3e, 0x02,
- 0x23, 0x56, 0xb3, 0xd9, 0x0e, 0xd8, 0x3b, 0xdf, 0x40, 0xac, 0xd0, 0xad, 0x86, 0x85, 0x38, 0x86,
- 0x23, 0x47, 0x48, 0x5a, 0xfc, 0x14, 0x5c, 0x2e, 0xb6, 0x72, 0xf2, 0x00, 0xe7, 0xa8, 0x54, 0xc4,
- 0xc5, 0xa1, 0x2c, 0x41, 0xec, 0x7b, 0x35, 0x00, 0x3f, 0xf0, 0x2c, 0xa7, 0x41, 0x0b, 0x85, 0x34,
- 0x86, 0x8f, 0x80, 0x6c, 0x2d, 0x42, 0xca, 0x89, 0xc7, 0x21, 0x3b, 0x23, 0x00, 0x96, 0x28, 0xa3,
- 0x79, 0x21, 0x84, 0xf2, 0x23, 0xf3, 0x9d, 0x09, 0x71, 0xfb, 0x62, 0x86, 0xad, 0x2b, 0x27, 0x14,
- 0x4b, 0xa9, 0xb3, 0x8f, 0xc3, 0x48, 0x44, 0xef, 0x20, 0xa1, 0x6e, 0x4c, 0x12, 0xea, 0x66, 0x9f,
- 0x86, 0x53, 0x89, 0xee, 0x1e, 0x4a, 0x26, 0xfc, 0xf7, 0x1a, 0x20, 0x75, 0xf4, 0x27, 0xa0, 0x39,
- 0x68, 0xa8, 0x9a, 0x83, 0x85, 0xde, 0x97, 0x2c, 0x47, 0x75, 0xf0, 0x33, 0x08, 0x58, 0xf4, 0xe2,
- 0x28, 0x9a, 0xb7, 0x38, 0xf9, 0xa9, 0xa0, 0x12, 0xbb, 0x73, 0x8b, 0x2f, 0xb7, 0x07, 0x41, 0xe5,
- 0x56, 0x02, 0x57, 0x2c, 0xa8, 0x24, 0x21, 0x38, 0x45, 0x17, 0x7d, 0x5c, 0x83, 0x49, 0x43, 0x8d,
- 0x5e, 0x1c, 0xce, 0x4c, 0xa1, 0x38, 0x65, 0x89, 0x48, 0xc8, 0x71, 0x5f, 0x12, 0x00, 0x1f, 0xa7,
- 0xc8, 0xa2, 0xc7, 0x60, 0xcc, 0x68, 0x59, 0xf3, 0xed, 0xba, 0x45, 0x6f, 0x9e, 0x61, 0x90, 0x57,
- 0xa6, 0x0d, 0x99, 0x5f, 0xab, 0x46, 0xe5, 0x58, 0xa9, 0x15, 0x85, 0x09, 0xae, 0xc4, 0xa6, 0xc1,
- 0xbd, 0x84, 0x09, 0x16, 0x73, 0x18, 0x87, 0x09, 0x16, 0x53, 0x27, 0x13, 0x41, 0x0e, 0x80, 0x6b,
- 0xd5, 0x4d, 0x41, 0x72, 0xb0, 0xf8, 0x33, 0xc5, 0xed, 0xea, 0x62, 0x45, 0x50, 0x64, 0xe2, 0x43,
- 0xfc, 0x1b, 0x4b, 0x14, 0xd0, 0xa7, 0x35, 0x18, 0x17, 0xbc, 0x5b, 0xd0, 0x1c, 0x62, 0x4b, 0xf4,
- 0x72, 0xd1, 0xfd, 0x92, 0xd8, 0x93, 0x73, 0x58, 0x46, 0xce, 0xf9, 0x4e, 0x14, 0x0d, 0x40, 0x81,
- 0x61, 0xb5, 0x1f, 0x4c, 0x06, 0xf0, 0x95, 0x77, 0x22, 0xd1, 0xc1, 0xe1, 0xe2, 0x32, 0x40, 0x2d,
- 0x03, 0x9f, 0x70, 0x23, 0xca, 0x80, 0xe0, 0x4c, 0xfa, 0x54, 0xae, 0x3d, 0x75, 0xcf, 0x08, 0xcc,
- 0xad, 0x8a, 0x61, 0x6e, 0xb1, 0x67, 0x42, 0xee, 0x30, 0x59, 0x70, 0x5f, 0xbf, 0xa8, 0xa2, 0xe2,
- 0xc6, 0x40, 0x89, 0x42, 0x9c, 0x24, 0x88, 0x5c, 0x18, 0xf6, 0x44, 0x08, 0x7f, 0xe1, 0xce, 0x5e,
- 0x2c, 0x6a, 0x7d, 0x32, 0x1f, 0x00, 0xbf, 0x19, 0x85, 0xbf, 0x70, 0x44, 0x04, 0x35, 0xe0, 0x22,
- 0xbf, 0x1b, 0xce, 0x3b, 0xae, 0xb3, 0xdb, 0x74, 0xdb, 0xfe, 0x7c, 0x3b, 0xd8, 0x22, 0x4e, 0x10,
- 0xaa, 0xc2, 0x47, 0xd9, 0x31, 0xca, 0xdc, 0xe2, 0x96, 0x3a, 0x55, 0xc4, 0x9d, 0xf1, 0xa0, 0x97,
- 0x60, 0x98, 0x3d, 0xa5, 0xad, 0xaf, 0x2f, 0x33, 0xdf, 0xcb, 0xc3, 0x8b, 0xcb, 0x6c, 0x08, 0x4b,
- 0x02, 0x07, 0x8e, 0xb0, 0xa1, 0xbb, 0x30, 0x64, 0xf3, 0x1c, 0x0c, 0xcc, 0x07, 0xb3, 0x20, 0x53,
- 0x4c, 0xe6, 0x73, 0xe0, 0x17, 0x68, 0xf1, 0x03, 0x87, 0x14, 0x50, 0x0b, 0x2e, 0xd7, 0xc9, 0xa6,
- 0xd1, 0xb6, 0x83, 0x55, 0x37, 0xc0, 0xcc, 0x07, 0x2d, 0xd2, 0x78, 0x86, 0x6e, 0xb6, 0x13, 0x2c,
- 0x14, 0x1d, 0xf3, 0xee, 0x5b, 0x3c, 0xa0, 0x2e, 0x3e, 0x10, 0x1b, 0xda, 0x85, 0x07, 0x45, 0x1d,
- 0xe6, 0xf4, 0x66, 0x6e, 0xd1, 0x59, 0x4e, 0x13, 0x3d, 0xc5, 0x88, 0x7e, 0xc3, 0xfe, 0x5e, 0xf9,
- 0xc1, 0xc5, 0x83, 0xab, 0xe3, 0x6e, 0x70, 0x32, 0x3f, 0x22, 0x92, 0x78, 0x02, 0x9a, 0x99, 0x2c,
- 0x3e, 0xc7, 0xc9, 0xe7, 0x24, 0x6e, 0xb1, 0x96, 0x2c, 0xc5, 0x29, 0x9a, 0xe8, 0xa7, 0x35, 0x98,
- 0xf1, 0x03, 0xaf, 0x6d, 0x06, 0x6d, 0x8f, 0xd4, 0x13, 0x3b, 0x74, 0x8a, 0x75, 0xa8, 0x90, 0x00,
- 0x57, 0xcb, 0xc1, 0xc9, 0x1c, 0xbe, 0x67, 0xf2, 0xa0, 0x38, 0xb7, 0x2f, 0xe8, 0x27, 0x34, 0x38,
- 0xa7, 0x02, 0xe9, 0x9d, 0x9e, 0xf7, 0x13, 0x15, 0x7f, 0x64, 0xa9, 0x65, 0xa3, 0xe4, 0x37, 0xf8,
- 0x1c, 0x20, 0xce, 0xeb, 0x48, 0xf2, 0xf1, 0xfa, 0xf4, 0x09, 0x3f, 0x5e, 0xcf, 0x3e, 0x07, 0x28,
- 0x7d, 0x7c, 0x1c, 0x24, 0x07, 0x0e, 0xcb, 0x72, 0xe0, 0x67, 0x07, 0xe0, 0x3c, 0x3d, 0x95, 0xe2,
- 0xdb, 0xcf, 0x8a, 0xe1, 0x18, 0x8d, 0xaf, 0x4f, 0x89, 0xe9, 0x8b, 0x1a, 0x9c, 0xdb, 0xca, 0x56,
- 0xed, 0x88, 0xfb, 0xd7, 0xf3, 0x85, 0x54, 0x70, 0x9d, 0xb4, 0x45, 0x9c, 0x61, 0x77, 0xac, 0x82,
- 0xf3, 0x3a, 0x85, 0x9e, 0x83, 0x49, 0xc7, 0xad, 0x93, 0x4a, 0x75, 0x11, 0xaf, 0x18, 0xfe, 0xdd,
- 0x5a, 0x68, 0x4b, 0x33, 0xc0, 0xbf, 0xd7, 0xd5, 0x04, 0x0c, 0xa7, 0x6a, 0xa3, 0x6d, 0x40, 0x2d,
- 0xb7, 0xbe, 0xb4, 0xcd, 0x73, 0x95, 0xf4, 0x66, 0xd5, 0xca, 0xde, 0xf3, 0xd7, 0x52, 0xd8, 0x70,
- 0x06, 0x05, 0xa6, 0x9b, 0xa2, 0x9d, 0x59, 0x71, 0x1d, 0x2b, 0x70, 0x3d, 0x16, 0xc2, 0xa0, 0x27,
- 0x15, 0x0d, 0xd3, 0x4d, 0xad, 0x66, 0x62, 0xc4, 0x39, 0x94, 0xf4, 0xff, 0xa1, 0xc1, 0x29, 0xba,
- 0x2d, 0xd6, 0x3c, 0x77, 0x67, 0xf7, 0xeb, 0x71, 0x43, 0x3e, 0x2c, 0xcc, 0x0a, 0xb9, 0x6e, 0xe7,
- 0x8c, 0x64, 0x52, 0x38, 0xc2, 0xfa, 0x1c, 0x5b, 0x11, 0xca, 0x6a, 0xe5, 0xbe, 0x7c, 0xb5, 0xb2,
- 0xfe, 0xe9, 0x12, 0xbf, 0xb9, 0x84, 0x6a, 0xdd, 0xaf, 0xcb, 0xef, 0xf0, 0x71, 0x18, 0xa7, 0x65,
- 0x2b, 0xc6, 0xce, 0xda, 0xe2, 0x0b, 0xae, 0x1d, 0xfa, 0x5b, 0x33, 0x5d, 0xfb, 0x2d, 0x19, 0x80,
- 0xd5, 0x7a, 0xe8, 0x49, 0x18, 0x6a, 0xf1, 0xa0, 0x5f, 0xe2, 0xce, 0x7c, 0x99, 0xdb, 0xde, 0xb1,
- 0xa2, 0xfb, 0x7b, 0xe5, 0xa9, 0xf8, 0x89, 0x37, 0x0c, 0x3d, 0x16, 0x36, 0xd0, 0x7f, 0xe9, 0x2c,
- 0x30, 0xe4, 0x36, 0x09, 0xbe, 0x1e, 0xe7, 0xe4, 0x51, 0x18, 0x35, 0x5b, 0xed, 0xca, 0xf5, 0xda,
- 0xf3, 0x6d, 0x97, 0xe9, 0x42, 0x58, 0x4a, 0x1f, 0xca, 0xbd, 0x2b, 0x6b, 0x77, 0xc2, 0x62, 0x2c,
- 0xd7, 0xa1, 0xdc, 0xc1, 0x6c, 0xb5, 0x05, 0xbf, 0x5d, 0x93, 0x3d, 0x52, 0x18, 0x77, 0xa8, 0xac,
- 0xdd, 0x51, 0x60, 0x38, 0x55, 0x1b, 0x7d, 0x08, 0xc6, 0x88, 0xf8, 0x70, 0x6f, 0x1a, 0x5e, 0x5d,
- 0xf0, 0x85, 0x6a, 0xd1, 0xc1, 0x47, 0x53, 0x1b, 0x72, 0x03, 0x7e, 0x03, 0x5c, 0x92, 0x48, 0x60,
- 0x85, 0x20, 0x7a, 0x1f, 0x3c, 0x10, 0xfe, 0xa6, 0xab, 0xec, 0xd6, 0x93, 0x8c, 0x62, 0x80, 0x87,
- 0x07, 0x5a, 0xca, 0xab, 0x84, 0xf3, 0xdb, 0xa3, 0x9f, 0xd5, 0xe0, 0x6c, 0x04, 0xb5, 0x1c, 0xab,
- 0xd9, 0x6e, 0x62, 0x62, 0xda, 0x86, 0xd5, 0x14, 0xf7, 0xbe, 0x17, 0x8f, 0x6c, 0xa0, 0x2a, 0x7a,
- 0xce, 0xac, 0xb2, 0x61, 0x38, 0xa7, 0x4b, 0xe8, 0xf3, 0x1a, 0x5c, 0x0e, 0x41, 0x6b, 0x1e, 0xf1,
- 0xfd, 0xb6, 0x47, 0x62, 0x6f, 0x7f, 0x31, 0x25, 0x43, 0x85, 0x78, 0x27, 0x13, 0x80, 0x97, 0x0e,
- 0xc0, 0x8d, 0x0f, 0xa4, 0x2e, 0x6f, 0x97, 0x9a, 0xbb, 0x19, 0x88, 0x8b, 0xe2, 0x71, 0x6d, 0x17,
- 0x4a, 0x02, 0x2b, 0x04, 0xd1, 0xcf, 0x69, 0x70, 0x4e, 0x2e, 0x90, 0x77, 0x0b, 0xbf, 0x21, 0xbe,
- 0x74, 0x64, 0x9d, 0x49, 0xe0, 0xe7, 0x12, 0x5e, 0x0e, 0x10, 0xe7, 0xf5, 0x8a, 0xb2, 0xed, 0x26,
- 0xdb, 0x98, 0xfc, 0x16, 0x39, 0xc0, 0xd9, 0x36, 0xdf, 0xab, 0x3e, 0x0e, 0x61, 0xe8, 0x31, 0x18,
- 0x6b, 0xb9, 0xf5, 0x35, 0xab, 0xee, 0xb3, 0x80, 0x64, 0xec, 0xae, 0xd7, 0xc7, 0xa7, 0x63, 0xcd,
- 0xad, 0xaf, 0x55, 0x17, 0x79, 0x39, 0x56, 0x6a, 0xa1, 0x39, 0x80, 0x4d, 0xc3, 0xb2, 0x6b, 0xf7,
- 0x8c, 0xd6, 0xed, 0x30, 0xec, 0x0d, 0xd3, 0x45, 0x5c, 0x8f, 0x4a, 0xb1, 0x54, 0x83, 0xae, 0x1f,
- 0xe5, 0x3b, 0x98, 0xf0, 0xe8, 0xdb, 0xec, 0x7a, 0x74, 0x14, 0xeb, 0x17, 0x22, 0xe4, 0x1d, 0xbe,
- 0x25, 0x91, 0xc0, 0x0a, 0x41, 0xf4, 0x51, 0x0d, 0x26, 0xfc, 0x5d, 0x3f, 0x20, 0xcd, 0xa8, 0x0f,
- 0xa7, 0x8e, 0xba, 0x0f, 0x4c, 0x27, 0x5e, 0x53, 0x88, 0xe0, 0x04, 0x51, 0x16, 0x40, 0xa8, 0x69,
- 0x34, 0xc8, 0x8d, 0xca, 0x4d, 0xab, 0xb1, 0x15, 0xc5, 0x6f, 0x59, 0x23, 0x9e, 0x49, 0x9c, 0x80,
- 0x5d, 0xac, 0x06, 0x44, 0x00, 0xa1, 0xfc, 0x6a, 0xb8, 0x13, 0x0e, 0xf4, 0x0a, 0xcc, 0x0a, 0xf0,
- 0xb2, 0x7b, 0x2f, 0x45, 0x81, 0xc7, 0xe9, 0x61, 0x36, 0x8a, 0xd5, 0xdc, 0x5a, 0xb8, 0x03, 0x06,
- 0x54, 0x85, 0xd3, 0x3e, 0xf1, 0xd8, 0x9b, 0x20, 0x0f, 0xef, 0xb8, 0xd6, 0xb6, 0x6d, 0x9f, 0x5d,
- 0x6d, 0x84, 0x57, 0x4e, 0x2d, 0x0d, 0xc6, 0x59, 0x6d, 0xd0, 0xd3, 0x91, 0xe3, 0xef, 0x2e, 0x2d,
- 0x78, 0x7e, 0xad, 0xc6, 0x6e, 0x22, 0x03, 0x5c, 0x53, 0x82, 0x55, 0x10, 0x4e, 0xd6, 0xa5, 0xa7,
- 0x79, 0x58, 0xb4, 0xd0, 0xf6, 0xfc, 0x60, 0x66, 0x9a, 0x35, 0x66, 0xa7, 0x39, 0x96, 0x01, 0x58,
- 0xad, 0x87, 0x9e, 0x84, 0x09, 0x9f, 0x98, 0xa6, 0xdb, 0x6c, 0x89, 0x7b, 0xf2, 0xcc, 0x19, 0xd6,
- 0x7b, 0xbe, 0x82, 0x0a, 0x04, 0x27, 0x6a, 0xa2, 0x5d, 0x38, 0x1d, 0x45, 0x12, 0x5e, 0x76, 0x1b,
- 0x2b, 0xc6, 0x0e, 0x13, 0x8e, 0xcf, 0x16, 0x09, 0xe2, 0xc0, 0xa7, 0xab, 0x92, 0x46, 0x87, 0xb3,
- 0x68, 0xa0, 0x65, 0x98, 0x4e, 0x14, 0x5f, 0xb7, 0x6c, 0xe2, 0xcf, 0x9c, 0x63, 0xc3, 0x66, 0xca,
- 0xae, 0x4a, 0x06, 0x1c, 0x67, 0xb6, 0x42, 0xb7, 0xe1, 0x4c, 0xcb, 0x73, 0x03, 0x62, 0x06, 0xb7,
- 0xa8, 0x40, 0x60, 0x8b, 0x01, 0xfa, 0x33, 0x33, 0x6c, 0x2e, 0xd8, 0x7b, 0xe8, 0x5a, 0x56, 0x05,
- 0x9c, 0xdd, 0x0e, 0x7d, 0x56, 0x83, 0x4b, 0x7e, 0xe0, 0x11, 0xa3, 0x69, 0x39, 0x8d, 0x8a, 0xeb,
- 0x38, 0x84, 0x31, 0xa6, 0x6a, 0x3d, 0x76, 0x6a, 0x7b, 0xa0, 0xd0, 0x29, 0xa2, 0xef, 0xef, 0x95,
- 0x2f, 0xd5, 0x3a, 0x62, 0xc6, 0x07, 0x50, 0x46, 0x6f, 0x00, 0x34, 0x49, 0xd3, 0xf5, 0x76, 0x29,
- 0x47, 0x9a, 0x99, 0x2d, 0x7e, 0xdf, 0x5d, 0x89, 0xb0, 0xf0, 0xcf, 0x5f, 0x79, 0xc9, 0x8d, 0x81,
- 0x58, 0x22, 0x47, 0xa7, 0x9a, 0xf2, 0x5b, 0x11, 0xa7, 0x4a, 0xfa, 0x68, 0xce, 0xb3, 0x95, 0x63,
- 0x53, 0xbd, 0x92, 0x55, 0x01, 0x67, 0xb7, 0x43, 0x3e, 0x4c, 0xb1, 0x2f, 0x54, 0x9c, 0xe4, 0x37,
- 0x2a, 0xf3, 0x0d, 0x32, 0x73, 0xa1, 0xd0, 0xe4, 0x52, 0xd9, 0x7f, 0xaa, 0x9a, 0x44, 0x86, 0xd3,
- 0xf8, 0x63, 0xa2, 0xc6, 0x4e, 0x4c, 0xf4, 0x62, 0xaf, 0x44, 0x25, 0x64, 0x38, 0x8d, 0x5f, 0xdf,
- 0x2b, 0xc1, 0x99, 0xcc, 0x53, 0x92, 0x32, 0x0f, 0x3e, 0xc5, 0xf3, 0x61, 0xca, 0x36, 0xf1, 0xec,
- 0xc9, 0x98, 0xc7, 0x8a, 0x0a, 0xc2, 0xc9, 0xba, 0x54, 0x86, 0x65, 0xd4, 0xae, 0xd7, 0xe2, 0xf6,
- 0xa5, 0x58, 0x86, 0xad, 0x26, 0x60, 0x38, 0x55, 0x1b, 0x55, 0xc4, 0x7c, 0x5c, 0xaf, 0x55, 0xe9,
- 0x35, 0xd0, 0xbf, 0xee, 0x91, 0xf0, 0x76, 0x10, 0x8f, 0x4f, 0x06, 0xe2, 0x74, 0x7d, 0x3a, 0x0a,
- 0xfa, 0x43, 0xee, 0x45, 0x7f, 0x3c, 0x8a, 0x55, 0x15, 0x84, 0x93, 0x75, 0xc3, 0x7b, 0xba, 0xd2,
- 0x85, 0x81, 0x78, 0x14, 0xab, 0x09, 0x18, 0x4e, 0xd5, 0xd6, 0xff, 0xa8, 0x1f, 0x1e, 0xec, 0x42,
- 0xb2, 0x44, 0xcd, 0xec, 0xe9, 0x3e, 0x3c, 0xcf, 0xeb, 0x6e, 0x79, 0x5a, 0x39, 0xcb, 0x73, 0x78,
- 0x7a, 0xdd, 0x2e, 0xa7, 0x9f, 0xb7, 0x9c, 0x87, 0x27, 0xd9, 0xfd, 0xf2, 0x37, 0xb3, 0x97, 0xbf,
- 0xe0, 0xac, 0x1e, 0xb8, 0x5d, 0x5a, 0x39, 0xdb, 0xa5, 0xe0, 0xac, 0x76, 0xb1, 0xbd, 0xfe, 0xb8,
- 0x1f, 0x1e, 0xea, 0x46, 0xca, 0x2d, 0xb8, 0xbf, 0x32, 0x78, 0xcb, 0xb1, 0xee, 0xaf, 0x3c, 0x97,
- 0xeb, 0x63, 0xdc, 0x5f, 0x1d, 0xd9, 0xe7, 0xf1, 0xec, 0xaf, 0xbc, 0x59, 0x3d, 0xae, 0xfd, 0x95,
- 0x37, 0xab, 0x5d, 0xec, 0xaf, 0xbf, 0x4c, 0x9e, 0x0f, 0x91, 0xa8, 0x5d, 0x85, 0x3e, 0xb3, 0xd5,
- 0x2e, 0xc8, 0xa4, 0x98, 0x95, 0x61, 0x65, 0xed, 0x0e, 0xa6, 0x38, 0x10, 0x86, 0x41, 0xbe, 0x7f,
- 0x0a, 0xb2, 0x20, 0x66, 0x39, 0xca, 0xb7, 0x24, 0x16, 0x98, 0xe8, 0x54, 0x91, 0xd6, 0x16, 0x69,
- 0x12, 0xcf, 0xb0, 0x6b, 0x81, 0xeb, 0x19, 0x8d, 0xa2, 0xdc, 0x86, 0xbf, 0xa0, 0x24, 0x70, 0xe1,
- 0x14, 0x76, 0x3a, 0x21, 0x2d, 0xab, 0x5e, 0x90, 0xbf, 0xb0, 0x09, 0x59, 0xab, 0x2e, 0x62, 0x8a,
- 0x43, 0xff, 0xc2, 0x08, 0x48, 0x91, 0xe6, 0xd1, 0x27, 0x34, 0x98, 0x32, 0x93, 0x51, 0x37, 0x7b,
- 0xb1, 0x87, 0x4a, 0x85, 0xf0, 0xe4, 0x5b, 0x3e, 0x55, 0x8c, 0xd3, 0x64, 0xd1, 0x77, 0x69, 0x5c,
- 0xc9, 0x17, 0xbd, 0xe6, 0x89, 0x69, 0xbd, 0x71, 0x44, 0xef, 0xde, 0xb1, 0xb6, 0x30, 0x7e, 0x62,
- 0x55, 0x09, 0xa2, 0xcf, 0x6b, 0x70, 0xe6, 0x6e, 0xd6, 0xdb, 0x84, 0x98, 0xfc, 0xdb, 0x45, 0xbb,
- 0x92, 0xf3, 0xd8, 0xc1, 0x25, 0xc8, 0xcc, 0x0a, 0x38, 0xbb, 0x23, 0xd1, 0x2c, 0x45, 0xea, 0x5a,
- 0xf1, 0x9d, 0x16, 0x9e, 0xa5, 0x84, 0xde, 0x37, 0x9e, 0xa5, 0x08, 0x80, 0x55, 0x82, 0xa8, 0x05,
- 0x23, 0x77, 0x43, 0x1d, 0xb9, 0xd0, 0x8b, 0x55, 0x8a, 0x52, 0x97, 0x14, 0xed, 0xdc, 0xde, 0x2b,
- 0x2a, 0xc4, 0x31, 0x11, 0xb4, 0x05, 0x43, 0x77, 0x39, 0xaf, 0x10, 0xfa, 0xac, 0xf9, 0x9e, 0x6f,
- 0xff, 0x5c, 0xad, 0x22, 0x8a, 0x70, 0x88, 0x5e, 0xf6, 0x25, 0x18, 0x3e, 0xc0, 0xc5, 0xed, 0xb3,
- 0x1a, 0x9c, 0xd9, 0x26, 0x5e, 0x60, 0x99, 0xc9, 0x97, 0xa1, 0x91, 0xe2, 0x1a, 0x8a, 0x17, 0xb2,
- 0x10, 0xf2, 0x6d, 0x92, 0x09, 0xc2, 0xd9, 0x5d, 0x40, 0x06, 0x9c, 0xe7, 0x0a, 0xfe, 0x5a, 0x60,
- 0x04, 0x96, 0xb9, 0xee, 0xde, 0x55, 0x62, 0xea, 0x41, 0x1c, 0xf0, 0x78, 0x29, 0xbf, 0x1a, 0xee,
- 0x84, 0x03, 0xbd, 0x00, 0xfd, 0x24, 0x30, 0xeb, 0x22, 0x0a, 0xf4, 0x7b, 0x8a, 0x3a, 0xee, 0x72,
- 0xd7, 0x1a, 0xfa, 0x1f, 0x66, 0xf8, 0xf4, 0x3f, 0xd7, 0x20, 0xa5, 0xfe, 0x46, 0x3f, 0xa0, 0xc1,
- 0xd8, 0x26, 0x31, 0x82, 0xb6, 0x47, 0x6e, 0x08, 0xb3, 0xd3, 0xbe, 0x2b, 0xa3, 0xd7, 0x5e, 0x38,
- 0x0a, 0xad, 0xfb, 0xdc, 0x75, 0x09, 0x31, 0xb7, 0x87, 0x89, 0x82, 0xee, 0xcb, 0x20, 0xac, 0xf4,
- 0x60, 0xf6, 0x59, 0x98, 0x4a, 0x35, 0x3c, 0xd4, 0x4b, 0xe8, 0xbf, 0xd0, 0x20, 0x2b, 0xe3, 0x3d,
- 0x7a, 0x05, 0x06, 0x8c, 0x7a, 0x3d, 0x4a, 0x26, 0xfa, 0x44, 0x31, 0xd3, 0xac, 0xba, 0x1c, 0x6e,
- 0x88, 0xfd, 0xc4, 0x1c, 0x2d, 0xba, 0x0e, 0xc8, 0x50, 0x9e, 0xbe, 0x57, 0xe2, 0x40, 0x15, 0xec,
- 0xc5, 0x6e, 0x3e, 0x05, 0xc5, 0x19, 0x2d, 0xf4, 0x8f, 0x69, 0x80, 0xd2, 0x29, 0x4d, 0x90, 0x07,
- 0xc3, 0xe2, 0x13, 0x09, 0x57, 0x69, 0xb1, 0xa0, 0xc3, 0x9e, 0xe2, 0x7d, 0x1a, 0xdb, 0xf9, 0x89,
- 0x02, 0x1f, 0x47, 0x74, 0xf4, 0xaf, 0x6a, 0x10, 0x27, 0x1c, 0x44, 0xef, 0x82, 0xd1, 0x3a, 0xf1,
- 0x4d, 0xcf, 0x6a, 0x05, 0xb1, 0xaf, 0x6a, 0xe4, 0xf3, 0xb6, 0x18, 0x83, 0xb0, 0x5c, 0x0f, 0xe9,
- 0x30, 0x18, 0x18, 0xfe, 0xdd, 0xea, 0xa2, 0xb8, 0x4f, 0xb2, 0xd3, 0x7f, 0x9d, 0x95, 0x60, 0x01,
- 0x89, 0xe3, 0xcf, 0xf6, 0x75, 0x11, 0x7f, 0x16, 0x6d, 0x1e, 0x41, 0xb0, 0x5d, 0x74, 0x70, 0xa0,
- 0x5d, 0xfd, 0xa7, 0x4a, 0x70, 0x8a, 0x56, 0x59, 0x31, 0x2c, 0x27, 0x20, 0x0e, 0xf3, 0xcc, 0x2a,
- 0x38, 0x09, 0x0d, 0x18, 0x0f, 0x14, 0xd7, 0xe5, 0xc3, 0xfb, 0xed, 0x46, 0xc6, 0x64, 0xaa, 0xc3,
- 0xb2, 0x8a, 0x17, 0x3d, 0x11, 0xba, 0xc6, 0xf1, 0x9b, 0xf7, 0x83, 0xe1, 0x56, 0x65, 0xfe, 0x6e,
- 0xf7, 0x85, 0x1f, 0x78, 0x94, 0xa5, 0x52, 0xf1, 0x82, 0x7b, 0x1c, 0xc6, 0x85, 0x13, 0x06, 0x0f,
- 0x24, 0x2c, 0x6e, 0xde, 0xec, 0xe4, 0xba, 0x2e, 0x03, 0xb0, 0x5a, 0x4f, 0xff, 0xdd, 0x12, 0xa8,
- 0xb9, 0x30, 0x8b, 0xce, 0x52, 0x3a, 0x8a, 0x72, 0xe9, 0xd8, 0xa2, 0x28, 0xf3, 0xcc, 0xf5, 0xcc,
- 0x62, 0x5c, 0x3c, 0xe5, 0xcb, 0xf9, 0xa5, 0x59, 0x39, 0x8e, 0x6a, 0xc4, 0xd3, 0xda, 0x7f, 0xe8,
- 0x69, 0x7d, 0x97, 0x30, 0x2e, 0x1e, 0x50, 0x62, 0x59, 0x87, 0xc6, 0xc5, 0x53, 0x4a, 0x43, 0xc9,
- 0x91, 0x6f, 0x1e, 0x44, 0x4e, 0x14, 0xba, 0x2e, 0x22, 0xce, 0xb6, 0xbf, 0xee, 0x06, 0x86, 0xcd,
- 0xa6, 0x53, 0xe8, 0x75, 0x57, 0x64, 0x00, 0x56, 0xeb, 0xe9, 0xab, 0xf0, 0xd6, 0x65, 0xd7, 0xa8,
- 0x2f, 0x18, 0x36, 0xdd, 0xba, 0x9e, 0xb0, 0xfc, 0xf3, 0xd9, 0xe1, 0xbf, 0xe6, 0xb9, 0x81, 0x6b,
- 0xba, 0x36, 0x3d, 0x9a, 0x8d, 0x28, 0xe0, 0x30, 0x7b, 0xeb, 0x0c, 0x8f, 0x66, 0x11, 0xb0, 0x17,
- 0x87, 0x70, 0xfd, 0xd7, 0x35, 0x18, 0x12, 0xa9, 0x85, 0xba, 0xf0, 0x5d, 0xdd, 0x84, 0x01, 0x76,
- 0x01, 0xeb, 0x45, 0xf0, 0xad, 0x6d, 0xb9, 0x6e, 0xa0, 0x24, 0x58, 0xe2, 0x29, 0xca, 0x58, 0x3a,
- 0x4e, 0x8e, 0x9e, 0x99, 0xbc, 0x7a, 0xe6, 0x96, 0x15, 0x10, 0x66, 0xd9, 0x23, 0x36, 0x3e, 0x37,
- 0x79, 0x95, 0xca, 0xb1, 0x52, 0x4b, 0xff, 0xef, 0x03, 0x70, 0x59, 0x20, 0x4e, 0x49, 0x83, 0x11,
- 0xcf, 0xdd, 0x85, 0xd3, 0x62, 0xbb, 0xb1, 0xc8, 0xfa, 0xa1, 0xda, 0xb6, 0xd8, 0x45, 0x5c, 0x44,
- 0xee, 0x4f, 0xa1, 0xc3, 0x59, 0x34, 0x78, 0x08, 0x77, 0x56, 0x7c, 0x93, 0x18, 0x76, 0xb0, 0x15,
- 0xd2, 0x2e, 0xf5, 0x12, 0xc2, 0x3d, 0x8d, 0x0f, 0x67, 0x52, 0x61, 0x56, 0x23, 0x02, 0x50, 0xf1,
- 0x88, 0x21, 0x9b, 0xac, 0xf4, 0xe0, 0xd1, 0xb4, 0x92, 0x89, 0x11, 0xe7, 0x50, 0x62, 0x1a, 0x4d,
- 0x63, 0x87, 0x29, 0x48, 0x30, 0x09, 0x3c, 0x8b, 0x25, 0xca, 0x8a, 0x9e, 0x43, 0x56, 0x54, 0x10,
- 0x4e, 0xd6, 0x45, 0x4f, 0xc2, 0x04, 0xb3, 0xc2, 0x89, 0x63, 0x82, 0x0e, 0xc4, 0xa1, 0x9d, 0x56,
- 0x15, 0x08, 0x4e, 0xd4, 0x44, 0xdf, 0xad, 0xc1, 0xb4, 0x25, 0xfb, 0xeb, 0x84, 0xa3, 0x2f, 0x96,
- 0x5e, 0x85, 0x49, 0x84, 0xe1, 0x36, 0xce, 0x40, 0x8b, 0x33, 0x89, 0xa1, 0x65, 0x98, 0x16, 0x4e,
- 0xd7, 0xea, 0x1e, 0xe0, 0x11, 0xdf, 0xd8, 0x9a, 0x2e, 0x66, 0xc0, 0x71, 0x66, 0x2b, 0xfd, 0xc3,
- 0x25, 0x18, 0x3b, 0x64, 0xba, 0xd8, 0xb6, 0x24, 0x73, 0xf4, 0xe0, 0x1a, 0x29, 0x53, 0xed, 0x42,
- 0xec, 0x40, 0x2f, 0xc1, 0x44, 0x9b, 0x4d, 0x44, 0x18, 0x0f, 0x4d, 0x7c, 0xd3, 0xdf, 0x44, 0x57,
- 0xee, 0x8e, 0x02, 0xb9, 0xbf, 0x57, 0x9e, 0x95, 0xd1, 0xab, 0x50, 0x9c, 0xc0, 0xa3, 0xff, 0xe0,
- 0x00, 0x9c, 0xce, 0xe8, 0x0d, 0xb3, 0x40, 0x21, 0x09, 0xc9, 0xa8, 0x17, 0x0b, 0x94, 0x94, 0x94,
- 0x15, 0x59, 0xa0, 0x24, 0x21, 0x38, 0x45, 0x17, 0xbd, 0x00, 0x7d, 0xa6, 0x67, 0x89, 0x09, 0x7f,
- 0xbc, 0x90, 0xbe, 0x00, 0x57, 0x17, 0x46, 0x05, 0xc5, 0xbe, 0x0a, 0xae, 0x62, 0x8a, 0x90, 0x9e,
- 0x23, 0x32, 0x0b, 0x0c, 0x85, 0x2d, 0x76, 0x8e, 0xc8, 0x9c, 0xd2, 0xc7, 0x6a, 0x3d, 0xf4, 0x12,
- 0xcc, 0x88, 0x8b, 0x5c, 0x18, 0xe8, 0xc3, 0x75, 0xfc, 0x80, 0x72, 0xab, 0x40, 0x9c, 0x87, 0xcc,
- 0x38, 0xf4, 0x56, 0x4e, 0x1d, 0x9c, 0xdb, 0x1a, 0x7d, 0x27, 0x4c, 0x28, 0x3b, 0x3f, 0x8c, 0xab,
- 0x55, 0xd0, 0xa3, 0x44, 0xc6, 0xc4, 0xbf, 0x73, 0xb5, 0x0c, 0x27, 0xa8, 0xb1, 0xa0, 0xac, 0xa6,
- 0x9c, 0xf3, 0x33, 0x4c, 0x55, 0x37, 0xdf, 0x73, 0xf6, 0xd0, 0x58, 0x10, 0x51, 0x8a, 0x7d, 0x9c,
- 0x20, 0xa8, 0xff, 0xf0, 0x20, 0xc8, 0x99, 0x9e, 0xd1, 0x4a, 0x2f, 0x8a, 0xba, 0x78, 0xd5, 0x43,
- 0x65, 0xdd, 0x0a, 0xf4, 0x35, 0x5a, 0xed, 0x82, 0x9a, 0xba, 0x08, 0xdd, 0x0d, 0x8a, 0xae, 0xd1,
- 0x6a, 0xa3, 0x17, 0x22, 0xdd, 0x5f, 0x31, 0xed, 0x5c, 0xe4, 0x3b, 0x98, 0xd0, 0xff, 0x85, 0xcc,
- 0xa8, 0x3f, 0x97, 0x19, 0x35, 0x61, 0xc8, 0x17, 0x8a, 0xc1, 0x81, 0xe2, 0xa1, 0x0f, 0xa5, 0x99,
- 0x16, 0x8a, 0x40, 0xae, 0xb2, 0x08, 0xf5, 0x84, 0x21, 0x0d, 0x7a, 0x6d, 0x69, 0x33, 0x2e, 0xca,
- 0x78, 0xfe, 0x30, 0xbf, 0xb6, 0xdc, 0x61, 0x25, 0x58, 0x40, 0x52, 0xa2, 0xc7, 0x50, 0x37, 0xa2,
- 0x07, 0xfa, 0x5c, 0x32, 0xb7, 0xdd, 0x30, 0xdb, 0x72, 0xcf, 0xf7, 0x38, 0x9c, 0xbf, 0x61, 0xe9,
- 0x6a, 0xff, 0x9f, 0x12, 0xa0, 0xf4, 0x62, 0xa1, 0x07, 0x61, 0x80, 0x85, 0x15, 0x12, 0xa7, 0x56,
- 0x74, 0x15, 0x67, 0x81, 0x65, 0x30, 0x87, 0xa1, 0x9a, 0x08, 0x77, 0x57, 0x6c, 0xd3, 0x33, 0x63,
- 0x3f, 0x41, 0x4f, 0x8a, 0x8d, 0x77, 0x59, 0x71, 0x12, 0xcc, 0x92, 0x78, 0xef, 0xc0, 0x50, 0xd3,
- 0x72, 0x98, 0xfd, 0x43, 0x31, 0xad, 0x32, 0xb7, 0x49, 0xe2, 0x28, 0x70, 0x88, 0x4b, 0xff, 0xe3,
- 0x12, 0x65, 0x10, 0xf1, 0x15, 0x74, 0x97, 0x07, 0x6f, 0x15, 0xee, 0xc8, 0x5a, 0x71, 0xad, 0x98,
- 0x84, 0x74, 0x3e, 0x42, 0xc8, 0x5f, 0xee, 0xe3, 0xdf, 0x58, 0x22, 0x46, 0x49, 0x07, 0x56, 0x93,
- 0xbc, 0x68, 0x39, 0x75, 0xf7, 0x9e, 0x98, 0xde, 0x5e, 0x49, 0xaf, 0x47, 0x08, 0x39, 0xe9, 0xf8,
- 0x37, 0x96, 0x88, 0xd1, 0x43, 0x88, 0x69, 0xc8, 0x1c, 0x96, 0x67, 0x56, 0xf4, 0x8d, 0xe7, 0xdf,
- 0x16, 0x86, 0xb8, 0xec, 0x10, 0xaa, 0xe4, 0xd4, 0xc1, 0xb9, 0xad, 0xf5, 0x9f, 0xd5, 0xe0, 0x4c,
- 0xe6, 0x54, 0xa0, 0x1b, 0x30, 0x15, 0xdb, 0x87, 0xca, 0x62, 0xc1, 0x70, 0x9c, 0x5a, 0xfb, 0x56,
- 0xb2, 0x02, 0x4e, 0xb7, 0xe1, 0x29, 0xbd, 0x52, 0x62, 0x87, 0x30, 0x2e, 0x95, 0x2f, 0x06, 0x32,
- 0x18, 0x67, 0xb5, 0xd1, 0xdf, 0xa7, 0x74, 0x36, 0x9e, 0x2c, 0xfa, 0x65, 0x6c, 0x90, 0x46, 0xe4,
- 0xa4, 0x1d, 0x7d, 0x19, 0x0b, 0xb4, 0x10, 0x73, 0x18, 0xba, 0x28, 0xc7, 0x8e, 0x88, 0xb8, 0x7b,
- 0x18, 0x3f, 0x42, 0x7f, 0x3f, 0x9c, 0xcb, 0x31, 0xe8, 0x40, 0x8b, 0x30, 0xe6, 0xdf, 0x33, 0x5a,
- 0x0b, 0x64, 0xcb, 0xd8, 0xb6, 0x44, 0xa4, 0x26, 0x6e, 0xf7, 0x3b, 0x56, 0x93, 0xca, 0xef, 0x27,
- 0x7e, 0x63, 0xa5, 0x95, 0x1e, 0x00, 0x08, 0xfb, 0x70, 0xcb, 0x69, 0xa0, 0x4d, 0x18, 0x36, 0x6c,
- 0xe2, 0x05, 0x71, 0xc0, 0xc0, 0x6f, 0x29, 0xa4, 0x95, 0x13, 0x38, 0xb8, 0x3f, 0x54, 0xf8, 0x0b,
- 0x47, 0xb8, 0xf5, 0xbf, 0xaf, 0xc1, 0xd9, 0xec, 0xd8, 0x3c, 0x5d, 0x08, 0xc1, 0x4d, 0x18, 0xf5,
- 0xe2, 0x66, 0x62, 0xd3, 0xbf, 0x5b, 0x4e, 0x6a, 0x20, 0x79, 0x72, 0x50, 0xb1, 0xbf, 0xe2, 0xb9,
- 0x7e, 0xb8, 0xf2, 0xc9, 0x3c, 0x07, 0x91, 0x0e, 0x44, 0xea, 0x09, 0x96, 0xf1, 0xb3, 0x9c, 0x23,
- 0x94, 0xba, 0xdf, 0x32, 0x4c, 0x52, 0x3f, 0xe1, 0x8c, 0xdb, 0x47, 0x10, 0xe8, 0x3f, 0xbb, 0xef,
- 0xc7, 0x9b, 0x73, 0x24, 0x87, 0xe6, 0xc1, 0x39, 0x47, 0xb2, 0x1b, 0xbe, 0x49, 0x82, 0xe1, 0x67,
- 0x77, 0x3e, 0xc7, 0x93, 0xfa, 0xbf, 0x0e, 0xe6, 0x8d, 0xf6, 0x90, 0x69, 0xbb, 0xb7, 0x8f, 0x31,
- 0x6d, 0xf7, 0xc4, 0xdf, 0xa5, 0xec, 0xce, 0x48, 0xd9, 0x9d, 0x48, 0x23, 0x3d, 0x78, 0x42, 0x69,
- 0xa4, 0x5f, 0x83, 0xc1, 0x96, 0xe1, 0x11, 0x27, 0x7c, 0x1c, 0xac, 0xf6, 0x9a, 0xa3, 0x3e, 0xe6,
- 0x82, 0xd1, 0x27, 0xb9, 0xc6, 0x08, 0x60, 0x41, 0x28, 0x23, 0x1a, 0xc7, 0xf0, 0x71, 0x85, 0xbb,
- 0x8b, 0x13, 0x58, 0x8f, 0x1c, 0x47, 0x02, 0x6b, 0xfd, 0xaf, 0x34, 0xb8, 0xd0, 0x89, 0x2d, 0x31,
- 0x95, 0x83, 0x99, 0xf8, 0x0c, 0x7b, 0x51, 0x39, 0xa4, 0xb8, 0x6d, 0xa4, 0x72, 0x48, 0x42, 0x70,
- 0x8a, 0x2e, 0x7a, 0x2f, 0x20, 0x77, 0x83, 0x1b, 0x8a, 0xdc, 0xa0, 0x34, 0xb8, 0x7b, 0x66, 0x89,
- 0x19, 0xbf, 0x47, 0xa9, 0x10, 0x6f, 0xa7, 0x6a, 0xe0, 0x8c, 0x56, 0xfa, 0x2f, 0x95, 0x00, 0x56,
- 0x49, 0x70, 0xcf, 0xf5, 0xee, 0xd2, 0x33, 0xfe, 0x82, 0xa2, 0x28, 0x1e, 0xfe, 0xda, 0x05, 0x38,
- 0xbc, 0x00, 0xfd, 0x2d, 0xb7, 0xee, 0x0b, 0xf9, 0x9d, 0x75, 0x84, 0xd9, 0xfe, 0xb3, 0x52, 0x54,
- 0x86, 0x01, 0x66, 0x45, 0x23, 0x2e, 0xa0, 0x4c, 0xcd, 0xcc, 0x54, 0xe9, 0x98, 0x97, 0x53, 0x0e,
- 0x29, 0x9c, 0xe4, 0x7d, 0xa1, 0xca, 0x1f, 0xe3, 0x71, 0xa3, 0x79, 0x19, 0x8e, 0xa0, 0xe8, 0x49,
- 0x00, 0xab, 0x75, 0xdd, 0x68, 0x5a, 0xb6, 0x25, 0x3e, 0xd7, 0x11, 0xa6, 0xff, 0x84, 0xea, 0x5a,
- 0x58, 0x7a, 0x7f, 0xaf, 0x3c, 0x2c, 0x7e, 0xed, 0x62, 0xa9, 0xb6, 0xfe, 0x45, 0x0d, 0x26, 0xe3,
- 0xc9, 0x13, 0x5b, 0x25, 0xec, 0x39, 0x8f, 0x2e, 0x9b, 0xdb, 0x73, 0x1e, 0xaa, 0xbd, 0x73, 0xcf,
- 0xb9, 0xca, 0x27, 0xaf, 0xe7, 0x8f, 0xc2, 0x28, 0xe1, 0x31, 0x74, 0xaa, 0x8b, 0x98, 0xf3, 0xb8,
- 0x11, 0x7e, 0x1d, 0x5a, 0x8a, 0x8b, 0xb1, 0x5c, 0x47, 0xff, 0xeb, 0x3e, 0x18, 0x5b, 0x6d, 0x58,
- 0xce, 0x4e, 0x18, 0x2c, 0x28, 0x7a, 0x66, 0xd5, 0x8e, 0xe7, 0x99, 0xf5, 0x25, 0x98, 0xb1, 0xe5,
- 0x47, 0x0d, 0x2e, 0x38, 0x19, 0x4e, 0x23, 0x9a, 0x01, 0x76, 0x0f, 0x58, 0xce, 0xa9, 0x83, 0x73,
- 0x5b, 0xa3, 0x00, 0x06, 0xcd, 0x30, 0x25, 0x5f, 0xe1, 0x00, 0x38, 0xf2, 0x5c, 0xcc, 0xc9, 0xb1,
- 0x20, 0x22, 0x9e, 0x27, 0xb6, 0xa7, 0xa0, 0x85, 0x3e, 0xa2, 0xc1, 0x19, 0xb2, 0xc3, 0x63, 0xa1,
- 0xac, 0x7b, 0xc6, 0xe6, 0xa6, 0x65, 0x0a, 0x17, 0x32, 0xbe, 0x13, 0x97, 0xf7, 0xf7, 0xca, 0x67,
- 0x96, 0xb2, 0x2a, 0xdc, 0xdf, 0x2b, 0x5f, 0xcd, 0x0c, 0x4d, 0xc3, 0x56, 0x33, 0xb3, 0x09, 0xce,
- 0x26, 0x35, 0xfb, 0x04, 0x8c, 0x1e, 0xc2, 0xf1, 0x58, 0x09, 0x40, 0xf3, 0xcb, 0x25, 0x18, 0xa3,
- 0xdb, 0x6d, 0xd9, 0x35, 0x0d, 0x7b, 0x71, 0xb5, 0x86, 0x1e, 0x4e, 0xc6, 0xdd, 0x8b, 0x1e, 0x94,
- 0x52, 0xb1, 0xf7, 0x96, 0x61, 0x7a, 0xd3, 0xf5, 0x4c, 0xb2, 0x5e, 0x59, 0x5b, 0x77, 0x85, 0x35,
- 0xd3, 0xe2, 0x6a, 0x4d, 0xdc, 0x8b, 0x98, 0x82, 0xfb, 0x7a, 0x06, 0x1c, 0x67, 0xb6, 0x42, 0xb7,
- 0xe1, 0x4c, 0x5c, 0x7e, 0xa7, 0xc5, 0x2d, 0xe0, 0x29, 0xba, 0xbe, 0xd8, 0x82, 0xff, 0x7a, 0x56,
- 0x05, 0x9c, 0xdd, 0x0e, 0x19, 0x70, 0x5e, 0x68, 0xd2, 0xaf, 0xbb, 0xde, 0x3d, 0xc3, 0xab, 0xab,
- 0x68, 0xfb, 0x63, 0x6b, 0x8f, 0xc5, 0xfc, 0x6a, 0xb8, 0x13, 0x0e, 0xfd, 0xab, 0x1a, 0xa8, 0x51,
- 0x0d, 0xd1, 0x03, 0xd0, 0xe7, 0x89, 0x8c, 0x6f, 0x22, 0xba, 0x1f, 0xbd, 0x22, 0xd0, 0x32, 0x34,
- 0x07, 0xe0, 0xc5, 0xa1, 0x15, 0x4b, 0x71, 0x2a, 0x03, 0x29, 0x28, 0xa2, 0x54, 0x83, 0xa2, 0x0a,
- 0x8c, 0x86, 0x60, 0x78, 0x0c, 0xd5, 0xba, 0xd1, 0xc0, 0xb4, 0x8c, 0xe5, 0xac, 0xb0, 0x1a, 0xc4,
- 0x0f, 0x15, 0xb8, 0x3c, 0x67, 0x05, 0x2b, 0xc1, 0x02, 0x82, 0x0c, 0x18, 0x6f, 0xb5, 0x6d, 0x11,
- 0xa0, 0x87, 0x5e, 0x7d, 0xb8, 0xda, 0xed, 0x4a, 0x56, 0x3e, 0x37, 0xb6, 0xfa, 0x99, 0x49, 0xdd,
- 0xd6, 0x64, 0x14, 0x58, 0xc5, 0xa8, 0xff, 0xd8, 0x20, 0x48, 0xf1, 0x5a, 0x0e, 0x21, 0x85, 0xfe,
- 0xa4, 0x06, 0xd3, 0xa6, 0x6d, 0x11, 0x27, 0x48, 0x84, 0x3e, 0xe0, 0xc7, 0xc7, 0x9d, 0x42, 0x81,
- 0x64, 0x5a, 0xc4, 0xa9, 0x2e, 0x0a, 0x7f, 0x89, 0x4a, 0x06, 0x72, 0xe1, 0x53, 0x92, 0x01, 0xc1,
- 0x99, 0x9d, 0x61, 0xe3, 0x61, 0xe5, 0xd5, 0x45, 0x39, 0x1c, 0x63, 0x45, 0x94, 0xe1, 0x08, 0x4a,
- 0x39, 0x6f, 0xc3, 0x73, 0xdb, 0x2d, 0xbf, 0xc2, 0xdc, 0x22, 0xf9, 0xa2, 0x30, 0xce, 0x7b, 0x23,
- 0x2e, 0xc6, 0x72, 0x1d, 0xf4, 0x18, 0x8c, 0xf1, 0x9f, 0x6b, 0x1e, 0xd9, 0xb4, 0x76, 0xc4, 0xa1,
- 0xc4, 0x94, 0x8f, 0x37, 0xa4, 0x72, 0xac, 0xd4, 0x62, 0x01, 0xc1, 0x7c, 0xbf, 0x4d, 0xbc, 0x3b,
- 0x78, 0x59, 0xa4, 0x05, 0xe6, 0x01, 0xc1, 0xc2, 0x42, 0x1c, 0xc3, 0xd1, 0x0f, 0x69, 0x30, 0xe1,
- 0x91, 0xd7, 0xda, 0x96, 0x47, 0x45, 0x18, 0xc3, 0x6a, 0xfa, 0x22, 0x68, 0x0e, 0xee, 0x2d, 0x50,
- 0xcf, 0x1c, 0x56, 0x90, 0x72, 0x06, 0x19, 0xe9, 0xcb, 0x55, 0x20, 0x4e, 0xf4, 0x80, 0x4e, 0x95,
- 0x6f, 0x35, 0x1c, 0xcb, 0x69, 0xcc, 0xdb, 0x0d, 0x5f, 0x24, 0x2f, 0xe2, 0x3a, 0xbb, 0xb8, 0x18,
- 0xcb, 0x75, 0xd0, 0xe3, 0x30, 0xde, 0xf6, 0x29, 0xdb, 0x6b, 0x12, 0x3e, 0xbf, 0x23, 0xb1, 0x65,
- 0xc3, 0x1d, 0x19, 0x80, 0xd5, 0x7a, 0xe8, 0x49, 0x98, 0x08, 0x0b, 0xc4, 0x2c, 0x03, 0xcf, 0xa0,
- 0xc1, 0x5e, 0xa2, 0x14, 0x08, 0x4e, 0xd4, 0x9c, 0x9d, 0x87, 0xd3, 0x19, 0xc3, 0x3c, 0x14, 0x6f,
- 0xfd, 0x3f, 0x1a, 0x9c, 0xe1, 0x52, 0x57, 0x98, 0x50, 0x38, 0xcc, 0x67, 0x90, 0x9d, 0x1a, 0x40,
- 0x3b, 0xd6, 0xd4, 0x00, 0x5f, 0x83, 0x14, 0x08, 0xfa, 0xcf, 0x94, 0xe0, 0xad, 0x07, 0x7e, 0x97,
- 0xe8, 0xc7, 0x35, 0x18, 0x25, 0x3b, 0x81, 0x67, 0x44, 0xbe, 0xe3, 0x74, 0x93, 0x6e, 0x1e, 0x0b,
- 0x13, 0x98, 0x5b, 0x8a, 0x09, 0xf1, 0x8d, 0x1b, 0x5d, 0xa5, 0x24, 0x08, 0x96, 0xfb, 0x43, 0xb9,
- 0x2d, 0xcf, 0x30, 0x23, 0x9b, 0x40, 0x09, 0x2e, 0x28, 0x20, 0xb3, 0xcf, 0xc0, 0x64, 0x12, 0xf3,
- 0xa1, 0xf6, 0xca, 0x4f, 0x6b, 0x90, 0x19, 0xdf, 0x11, 0x55, 0x60, 0xca, 0x68, 0x07, 0xae, 0xf2,
- 0x12, 0x26, 0x44, 0x49, 0x66, 0x45, 0x3c, 0x9f, 0x04, 0xe2, 0x74, 0x7d, 0xae, 0xc0, 0x74, 0xda,
- 0x86, 0xad, 0xa2, 0xe1, 0x02, 0x97, 0x50, 0x60, 0xa6, 0xc0, 0x38, 0xab, 0x8d, 0xfe, 0x8f, 0x34,
- 0x38, 0xa3, 0x74, 0xd4, 0x17, 0x8a, 0xd8, 0x2e, 0x74, 0x71, 0xd9, 0xdb, 0xbe, 0x74, 0x9c, 0xdb,
- 0x5e, 0xff, 0xc5, 0x12, 0x0c, 0xad, 0x79, 0x2e, 0x3d, 0xda, 0x4e, 0x40, 0x03, 0x67, 0x28, 0x1a,
- 0xb8, 0x42, 0xfa, 0x05, 0xd1, 0xd9, 0x5c, 0x95, 0x9b, 0x95, 0x50, 0xb9, 0xcd, 0xf7, 0x42, 0xa4,
- 0xb3, 0x8e, 0xed, 0xb7, 0x34, 0x18, 0x15, 0x35, 0x4f, 0x40, 0xa9, 0xf6, 0x1d, 0xaa, 0x52, 0xed,
- 0xa9, 0x1e, 0xc6, 0x95, 0xa3, 0x45, 0xfb, 0xac, 0x06, 0xe3, 0xa2, 0xc6, 0x0a, 0x69, 0x6e, 0x10,
- 0x0f, 0x5d, 0x87, 0x21, 0xbf, 0xcd, 0x16, 0x52, 0x0c, 0xe8, 0xbc, 0x2c, 0x1e, 0x79, 0x1b, 0x86,
- 0x49, 0xbb, 0x5f, 0xe3, 0x55, 0xa4, 0xe4, 0xb9, 0xbc, 0x00, 0x87, 0x8d, 0xe9, 0xde, 0xf7, 0x5c,
- 0x3b, 0x15, 0x07, 0x1d, 0xbb, 0x36, 0xc1, 0x0c, 0x42, 0xef, 0x79, 0xf4, 0x6f, 0x78, 0x87, 0x63,
- 0xf7, 0x3c, 0x0a, 0xf6, 0x31, 0x2f, 0xd7, 0xbf, 0x38, 0x10, 0x4d, 0x36, 0xbb, 0xd4, 0xdf, 0x84,
- 0x11, 0xd3, 0x23, 0x46, 0x40, 0xea, 0x0b, 0xbb, 0xdd, 0x74, 0x8e, 0xc9, 0x01, 0x95, 0xb0, 0x05,
- 0x8e, 0x1b, 0xd3, 0x23, 0x57, 0x36, 0xe7, 0x2b, 0xc5, 0xd2, 0x49, 0xae, 0x29, 0xdf, 0xb7, 0xc0,
- 0x80, 0x7b, 0xcf, 0x89, 0xbc, 0x0d, 0x3a, 0x12, 0x66, 0x43, 0xb9, 0x4d, 0x6b, 0x63, 0xde, 0x48,
- 0xce, 0x03, 0xd0, 0xdf, 0x21, 0x0f, 0x80, 0x0d, 0x43, 0x4d, 0xb6, 0x0c, 0x3d, 0xe5, 0x52, 0x55,
- 0x16, 0x34, 0x5e, 0x22, 0xfe, 0xdb, 0xc7, 0x21, 0x09, 0x2a, 0x3a, 0x39, 0xa1, 0x46, 0x47, 0x16,
- 0x9d, 0x22, 0x35, 0x0f, 0x8e, 0xe1, 0x68, 0x57, 0x4d, 0x30, 0x31, 0x54, 0x5c, 0x4f, 0x2a, 0xba,
- 0x27, 0xe5, 0x94, 0xe0, 0x53, 0x9f, 0x97, 0x64, 0x02, 0xfd, 0xb4, 0x06, 0xe7, 0xea, 0xd9, 0x49,
- 0xb6, 0xc4, 0x53, 0x73, 0x21, 0x4f, 0xdf, 0x9c, 0xbc, 0x5d, 0x0b, 0x65, 0x31, 0x61, 0x79, 0x89,
- 0xbd, 0x70, 0x5e, 0x67, 0xf4, 0xef, 0xeb, 0x8f, 0xbe, 0x26, 0xa1, 0xe9, 0xc8, 0xd6, 0x43, 0x69,
- 0x45, 0xf4, 0x50, 0xe8, 0x9b, 0xc3, 0x94, 0x4f, 0x7c, 0xbb, 0x5e, 0x4c, 0xa6, 0x7c, 0x1a, 0x13,
- 0xa4, 0x95, 0x34, 0x4f, 0x6d, 0x38, 0xed, 0x07, 0x86, 0x4d, 0x6a, 0x96, 0x78, 0x5c, 0xf3, 0x03,
- 0xa3, 0xd9, 0x2a, 0x90, 0x73, 0x89, 0x7b, 0xfe, 0xa7, 0x51, 0xe1, 0x2c, 0xfc, 0xe8, 0x7b, 0x58,
- 0x34, 0x37, 0xc3, 0x66, 0x8f, 0x8f, 0x3c, 0xef, 0x64, 0x4c, 0xfc, 0xf0, 0xc6, 0xcd, 0x22, 0x56,
- 0x5b, 0x36, 0x3e, 0x9c, 0x4b, 0x09, 0xbd, 0x01, 0x67, 0xe8, 0x01, 0x38, 0x6f, 0x06, 0xd6, 0xb6,
- 0x15, 0xec, 0xc6, 0x5d, 0x38, 0x7c, 0xa2, 0x25, 0x76, 0xdb, 0x5e, 0xce, 0x42, 0x86, 0xb3, 0x69,
- 0xe8, 0x7f, 0xa9, 0x01, 0x4a, 0xef, 0x75, 0x64, 0xc3, 0x70, 0x3d, 0x74, 0xc5, 0xd7, 0x8e, 0x24,
- 0x4d, 0x4b, 0x74, 0x84, 0x44, 0x1e, 0xfc, 0x11, 0x05, 0xe4, 0xc2, 0xc8, 0xbd, 0x2d, 0x2b, 0x20,
- 0xb6, 0xe5, 0x07, 0x47, 0x94, 0x15, 0x26, 0x0a, 0x32, 0xfe, 0x62, 0x88, 0x18, 0xc7, 0x34, 0xf4,
- 0x4f, 0xf6, 0xc3, 0x70, 0x94, 0x40, 0xf1, 0x60, 0xa3, 0xda, 0x36, 0x20, 0x53, 0x8a, 0x30, 0xd7,
- 0x8b, 0xce, 0x94, 0xc9, 0x40, 0x95, 0x14, 0x32, 0x9c, 0x41, 0x00, 0xbd, 0x01, 0xd3, 0x96, 0xb3,
- 0xe9, 0x19, 0x51, 0xfc, 0xbc, 0x4a, 0xa8, 0x28, 0x2b, 0x40, 0x98, 0xdd, 0xa2, 0xab, 0x19, 0xe8,
- 0x70, 0x26, 0x11, 0x44, 0x60, 0x88, 0xe7, 0xb0, 0x0d, 0x5f, 0x5d, 0x0a, 0xe9, 0xea, 0xb9, 0xac,
- 0x19, 0xb3, 0xf7, 0x50, 0xf6, 0x0c, 0x71, 0xf3, 0x68, 0xa7, 0xfc, 0xff, 0xf0, 0x41, 0x4a, 0xec,
- 0xfb, 0x4a, 0x71, 0x7a, 0xf1, 0xdb, 0x16, 0x8f, 0x76, 0xaa, 0x16, 0xe2, 0x24, 0x41, 0xfd, 0x37,
- 0x34, 0x18, 0xe0, 0x41, 0xa5, 0x8e, 0x5f, 0xd4, 0x7c, 0xbf, 0x22, 0x6a, 0x16, 0x4a, 0x95, 0xcf,
- 0xba, 0x9a, 0x9b, 0xc4, 0xfd, 0xd7, 0x35, 0x18, 0x61, 0x35, 0x4e, 0x40, 0xf6, 0x7b, 0x45, 0x95,
- 0xfd, 0x9e, 0x28, 0x3c, 0x9a, 0x1c, 0xc9, 0xef, 0x37, 0xfa, 0xc4, 0x58, 0x98, 0x68, 0x55, 0x85,
- 0xd3, 0xc2, 0xd3, 0x72, 0xd9, 0xda, 0x24, 0x74, 0x8b, 0x2f, 0x1a, 0xbb, 0xbe, 0x30, 0xcc, 0xe7,
- 0x51, 0x4c, 0xd2, 0x60, 0x9c, 0xd5, 0x06, 0xfd, 0xb2, 0x46, 0x85, 0x98, 0xc0, 0xb3, 0xcc, 0x9e,
- 0x1e, 0x83, 0xa3, 0xbe, 0xcd, 0xad, 0x70, 0x64, 0xfc, 0x6e, 0x7a, 0x27, 0x96, 0x66, 0x58, 0xe9,
- 0xfd, 0xbd, 0x72, 0x39, 0x43, 0x67, 0x1c, 0x67, 0x22, 0xf6, 0x83, 0x8f, 0xfc, 0x49, 0xc7, 0x2a,
- 0xec, 0x36, 0x16, 0xf6, 0x18, 0xdd, 0x84, 0x01, 0xdf, 0x74, 0x5b, 0xa1, 0xaf, 0xee, 0x83, 0x59,
- 0xba, 0xc1, 0xa4, 0x5a, 0x30, 0x9a, 0xe0, 0x1a, 0x6d, 0x89, 0x39, 0x82, 0xd9, 0x57, 0x61, 0x4c,
- 0xee, 0x79, 0xc6, 0xdd, 0x77, 0x51, 0xb5, 0x38, 0x3b, 0xa4, 0x71, 0x95, 0x7c, 0x57, 0xfe, 0xfd,
- 0x3e, 0x18, 0xc4, 0xa4, 0x21, 0x72, 0x70, 0x1d, 0x70, 0xe7, 0xb4, 0xc2, 0x94, 0xaf, 0xa5, 0xe2,
- 0x5e, 0x57, 0x72, 0x96, 0x95, 0x97, 0x5d, 0x47, 0x9a, 0x03, 0x39, 0xeb, 0x2b, 0x72, 0xa2, 0xcc,
- 0x44, 0x7d, 0xc5, 0xf3, 0xd1, 0xf3, 0x81, 0x75, 0x93, 0x8b, 0x08, 0xfd, 0xa0, 0x06, 0xc8, 0x30,
- 0x4d, 0xe2, 0xfb, 0x98, 0xf8, 0x74, 0xee, 0xb9, 0xb0, 0xca, 0xb9, 0x6c, 0xb1, 0x30, 0xcb, 0x49,
- 0x6c, 0xb1, 0xd8, 0x96, 0x02, 0xf9, 0x38, 0x83, 0x78, 0x2f, 0xf9, 0x91, 0x7e, 0x5b, 0x83, 0x31,
- 0x25, 0xfd, 0x54, 0x33, 0xd6, 0xa5, 0x17, 0x37, 0xd9, 0x09, 0x7d, 0x7d, 0xce, 0x77, 0xa8, 0xc4,
- 0xf5, 0xf3, 0xb7, 0xa3, 0xfc, 0x09, 0x47, 0x93, 0xa9, 0x4a, 0xff, 0xb4, 0x06, 0x67, 0xc3, 0x01,
- 0xa9, 0x81, 0xb2, 0xd1, 0x15, 0x18, 0x36, 0x5a, 0x16, 0x53, 0xf4, 0xca, 0xaa, 0xf2, 0xf9, 0xb5,
- 0x2a, 0x2b, 0xc3, 0x11, 0x54, 0xc9, 0xab, 0x5b, 0x3a, 0x30, 0xaf, 0xee, 0xdb, 0xa4, 0x4c, 0xc1,
- 0x03, 0xb1, 0xec, 0x12, 0x11, 0xe6, 0xc6, 0x90, 0xfa, 0xbb, 0x61, 0xa4, 0x56, 0xbb, 0xc9, 0x97,
- 0xf4, 0x10, 0x2f, 0x3e, 0xfa, 0xc7, 0xfb, 0x60, 0x5c, 0x44, 0xfc, 0xb7, 0x98, 0x0a, 0xe8, 0x04,
- 0xce, 0xb9, 0x75, 0x18, 0xf1, 0xa3, 0x37, 0x8c, 0x52, 0x3e, 0x9f, 0x8a, 0x9e, 0x25, 0x92, 0x69,
- 0xdb, 0xe2, 0xe7, 0x8b, 0x18, 0x11, 0xba, 0x05, 0x83, 0xaf, 0x51, 0x9e, 0x1b, 0x7e, 0xab, 0x5d,
- 0xb1, 0xbe, 0xe8, 0x43, 0x64, 0xec, 0xda, 0xc7, 0x02, 0x05, 0xf2, 0x99, 0x33, 0x1a, 0x13, 0x02,
- 0x7b, 0x89, 0xfd, 0xa8, 0xcc, 0x6c, 0x94, 0x27, 0x7c, 0x4c, 0xf8, 0xb4, 0xb1, 0x5f, 0x38, 0x22,
- 0xc4, 0x72, 0x4e, 0x2a, 0x2d, 0xde, 0x24, 0x39, 0x27, 0x95, 0x3e, 0xe7, 0x1c, 0xd7, 0x4f, 0xc0,
- 0x99, 0xcc, 0xc9, 0x38, 0x58, 0xc4, 0xd6, 0xff, 0x71, 0x09, 0xfa, 0x6b, 0x84, 0xd4, 0x4f, 0x60,
- 0x67, 0xbe, 0xa2, 0x48, 0x60, 0xdf, 0x52, 0x38, 0xeb, 0x65, 0x9e, 0xa6, 0x6f, 0x33, 0xa1, 0xe9,
- 0x7b, 0xa6, 0x30, 0x85, 0xce, 0x6a, 0xbe, 0x1d, 0x18, 0xa2, 0xb5, 0x16, 0x57, 0x6b, 0xa8, 0x29,
- 0xed, 0xe4, 0x52, 0x71, 0xe9, 0x59, 0xa0, 0x3b, 0x70, 0x0f, 0x7f, 0x5c, 0x83, 0x53, 0x89, 0xba,
- 0x5d, 0xdc, 0xa2, 0x8e, 0x85, 0x23, 0xe8, 0xbf, 0xa6, 0xc1, 0x30, 0xed, 0xcb, 0x09, 0x7c, 0x46,
- 0xdf, 0xae, 0x7e, 0x46, 0xef, 0x29, 0x3a, 0xc5, 0x39, 0x5f, 0xcf, 0x5f, 0x94, 0x80, 0x25, 0x4f,
- 0x15, 0x96, 0x28, 0x92, 0x8d, 0x89, 0x96, 0x63, 0x1d, 0x73, 0x59, 0x98, 0xa8, 0x24, 0xd4, 0x97,
- 0x92, 0x99, 0xca, 0x3b, 0x14, 0x2b, 0x14, 0xe5, 0x18, 0xca, 0xb0, 0x44, 0x79, 0x1d, 0xc6, 0xfd,
- 0x2d, 0xd7, 0x0d, 0xa2, 0x28, 0x7c, 0xfd, 0xc5, 0x55, 0xd5, 0xcc, 0x89, 0x34, 0x1c, 0x0a, 0x7f,
- 0xf4, 0xab, 0xc9, 0xb8, 0xb1, 0x4a, 0x0a, 0xcd, 0x01, 0x6c, 0xd8, 0xae, 0x79, 0x97, 0x1b, 0xc1,
- 0x70, 0xa7, 0x41, 0xf6, 0xcc, 0xbe, 0x10, 0x95, 0x62, 0xa9, 0x46, 0x4f, 0xf6, 0x3e, 0x7f, 0xa6,
- 0xf1, 0x99, 0x3e, 0xc4, 0xe6, 0x3d, 0x41, 0x93, 0xa9, 0xb7, 0xc3, 0xa0, 0xc7, 0xa4, 0x49, 0xb1,
- 0x62, 0xd1, 0xf7, 0xcf, 0x65, 0x4c, 0x2c, 0xa0, 0x74, 0x7b, 0x70, 0x11, 0xb9, 0x3f, 0x56, 0x4d,
- 0xcb, 0x82, 0xad, 0xfe, 0x8b, 0x62, 0x98, 0x51, 0xfe, 0xdd, 0x16, 0x8c, 0xdb, 0x72, 0x22, 0x7e,
- 0xf1, 0x8d, 0x14, 0xca, 0xe1, 0x1f, 0x19, 0x70, 0x2a, 0xc5, 0x58, 0x25, 0x80, 0x1e, 0x87, 0xf1,
- 0x70, 0x74, 0xdc, 0x8e, 0xb2, 0x14, 0x7b, 0xbf, 0xad, 0xc9, 0x00, 0xac, 0xd6, 0xd3, 0x3f, 0x53,
- 0x82, 0x8b, 0xbc, 0xef, 0xec, 0x8e, 0xbe, 0x48, 0x5a, 0xc4, 0xa9, 0x13, 0xc7, 0xdc, 0x65, 0x12,
- 0x59, 0xdd, 0x6d, 0xa0, 0x37, 0x60, 0xf0, 0x1e, 0x21, 0xf5, 0x48, 0xd9, 0xfd, 0x62, 0xf1, 0xf4,
- 0xc5, 0x39, 0x24, 0x5e, 0x64, 0xe8, 0xf9, 0xbb, 0x21, 0xff, 0x1f, 0x0b, 0x92, 0x94, 0x78, 0xcb,
- 0x73, 0x37, 0x22, 0xc1, 0xe1, 0xe8, 0x89, 0xaf, 0x31, 0xf4, 0x9c, 0x38, 0xff, 0x1f, 0x0b, 0x92,
- 0xfa, 0x1a, 0x3c, 0xd8, 0x45, 0xd3, 0xc3, 0x08, 0x88, 0x07, 0x61, 0xe4, 0xa3, 0x3f, 0x0c, 0xc6,
- 0x3f, 0xd4, 0xe0, 0x21, 0x09, 0xe5, 0xd2, 0x0e, 0x95, 0x59, 0x2b, 0x46, 0xcb, 0x30, 0xe9, 0xad,
- 0x90, 0x85, 0xc7, 0x3a, 0x54, 0xc2, 0xd0, 0x8f, 0x6b, 0x30, 0xc4, 0x6d, 0xb7, 0x42, 0xf6, 0xfb,
- 0x4a, 0x8f, 0x53, 0x9e, 0xdb, 0xa5, 0x30, 0x91, 0x52, 0x38, 0x36, 0xfe, 0xdb, 0xc7, 0x21, 0x7d,
- 0xfd, 0xdf, 0x0c, 0xc0, 0x37, 0x76, 0x8f, 0x08, 0xfd, 0x99, 0x96, 0x4c, 0x56, 0x3f, 0x7a, 0xad,
- 0x79, 0xbc, 0x9d, 0x8f, 0xf4, 0x06, 0xe2, 0x2a, 0xfa, 0x62, 0x2a, 0x17, 0xf2, 0x11, 0xa9, 0x24,
- 0xe2, 0x81, 0xa1, 0x7f, 0xa0, 0xc1, 0x18, 0x3d, 0x96, 0x22, 0xe6, 0xc2, 0x97, 0xa9, 0x75, 0xcc,
- 0x23, 0x5d, 0x95, 0x48, 0x26, 0xe2, 0xdd, 0xc8, 0x20, 0xac, 0xf4, 0x0d, 0xdd, 0x51, 0x1f, 0x8a,
- 0xf8, 0x65, 0xe2, 0x52, 0x96, 0x34, 0x72, 0x98, 0x4c, 0xe3, 0xb3, 0x36, 0x4c, 0xa8, 0x33, 0x7f,
- 0x9c, 0x0a, 0x95, 0xd9, 0x67, 0x61, 0x2a, 0x35, 0xfa, 0x43, 0x5d, 0xdd, 0x7f, 0x78, 0x00, 0xca,
- 0xd2, 0x54, 0x67, 0x85, 0xad, 0x40, 0x9f, 0xd3, 0x60, 0xd4, 0x70, 0x1c, 0x61, 0x02, 0x13, 0xee,
- 0xdf, 0x7a, 0x8f, 0xab, 0x9a, 0x45, 0x6a, 0x6e, 0x3e, 0x26, 0x93, 0xb0, 0xf1, 0x90, 0x20, 0x58,
- 0xee, 0x4d, 0x07, 0x3b, 0xce, 0xd2, 0x89, 0xd9, 0x71, 0xa2, 0x0f, 0x86, 0x07, 0x31, 0xdf, 0x46,
- 0x2f, 0x1d, 0xc3, 0xdc, 0xb0, 0x73, 0x3d, 0x47, 0x7f, 0xf5, 0x29, 0x8d, 0x1d, 0xb2, 0x71, 0x74,
- 0x11, 0x71, 0x26, 0x15, 0x32, 0xc7, 0x3b, 0x30, 0x74, 0x49, 0x74, 0x76, 0xc7, 0x45, 0x58, 0x25,
- 0x3f, 0xfb, 0x0c, 0x4c, 0x26, 0x97, 0xf2, 0x50, 0xdb, 0xf2, 0x5f, 0xf7, 0x2b, 0x67, 0x47, 0xee,
- 0x7c, 0x74, 0xa1, 0x46, 0xfc, 0x7c, 0x62, 0xf7, 0x72, 0x9e, 0x64, 0x1d, 0xd7, 0x0a, 0x1d, 0xed,
- 0x16, 0xee, 0x3b, 0xb9, 0x2d, 0xfc, 0x37, 0x6e, 0x0f, 0x2d, 0xc0, 0x19, 0x69, 0xc1, 0xe2, 0xc4,
- 0x28, 0x2c, 0x28, 0x9e, 0xe5, 0x5b, 0x61, 0x68, 0x57, 0x49, 0x86, 0x79, 0x81, 0x17, 0xe3, 0x10,
- 0xae, 0x2f, 0x2b, 0xdc, 0x71, 0xdd, 0x6d, 0xb9, 0xb6, 0xdb, 0xd8, 0x9d, 0xbf, 0x67, 0x78, 0x04,
- 0xbb, 0xed, 0x40, 0x60, 0xeb, 0x56, 0x22, 0x5a, 0x81, 0xcb, 0x12, 0xb6, 0xcc, 0x00, 0x78, 0x87,
- 0x41, 0xf7, 0x5b, 0x43, 0xa1, 0x70, 0x2f, 0xc2, 0xe6, 0xfc, 0x82, 0x06, 0x0f, 0x90, 0xbc, 0xc3,
- 0x52, 0x48, 0xfa, 0x2f, 0x1d, 0xd7, 0x61, 0x2c, 0xf2, 0x94, 0xe4, 0x81, 0x71, 0x7e, 0xcf, 0xd0,
- 0x2e, 0x80, 0x1f, 0x2d, 0x4f, 0x2f, 0xde, 0xcd, 0x99, 0xeb, 0x2d, 0x92, 0x5b, 0x47, 0xbf, 0xb1,
- 0x44, 0x0c, 0x7d, 0x41, 0x83, 0x69, 0x3b, 0x63, 0xb3, 0x8a, 0xcd, 0x5f, 0x3b, 0x06, 0x36, 0xc1,
- 0xdf, 0x61, 0xb3, 0x20, 0x38, 0xb3, 0x2b, 0xe8, 0xa7, 0x72, 0x23, 0x33, 0xf2, 0x67, 0xd2, 0xf5,
- 0x1e, 0x3b, 0x79, 0x54, 0x41, 0x1a, 0x3f, 0xa3, 0x01, 0xaa, 0xa7, 0x2e, 0x0e, 0xc2, 0x04, 0xe7,
- 0xf9, 0x23, 0xbf, 0x1e, 0xf1, 0x87, 0xf4, 0x74, 0x39, 0xce, 0xe8, 0x04, 0x5b, 0xe7, 0x20, 0xe3,
- 0xf3, 0x15, 0x8e, 0x6e, 0xbd, 0xae, 0x73, 0x16, 0x67, 0xe0, 0xeb, 0x9c, 0x05, 0xc1, 0x99, 0x5d,
- 0xd1, 0x7f, 0x75, 0x84, 0xeb, 0xb1, 0xd8, 0x4b, 0xe7, 0x2b, 0x30, 0xb8, 0x61, 0x98, 0x77, 0xc5,
- 0x2b, 0x43, 0xc1, 0xb7, 0xf7, 0x05, 0x86, 0x81, 0xdf, 0x20, 0xf9, 0xff, 0x58, 0x60, 0x45, 0x2f,
- 0x43, 0x5f, 0xdd, 0x09, 0xfd, 0x48, 0x9f, 0xea, 0x41, 0x55, 0x18, 0x7b, 0xb3, 0x2f, 0xae, 0xd6,
- 0x30, 0x45, 0x8a, 0x1c, 0x18, 0x76, 0x84, 0xda, 0x47, 0xdc, 0xcc, 0x9f, 0x2b, 0x4a, 0x20, 0x52,
- 0x1f, 0x45, 0x4a, 0xab, 0xb0, 0x04, 0x47, 0x34, 0x28, 0xbd, 0x84, 0x16, 0xbf, 0x30, 0xbd, 0x48,
- 0xf1, 0x29, 0x07, 0xa5, 0x4b, 0x28, 0x3f, 0x11, 0x81, 0xc1, 0xc0, 0xb0, 0x9c, 0x28, 0x68, 0xcd,
- 0xd3, 0x45, 0xa9, 0xad, 0x53, 0x2c, 0xb1, 0x76, 0x87, 0xfd, 0xf4, 0xb1, 0x40, 0x8e, 0x36, 0x60,
- 0x90, 0xfb, 0x85, 0x8a, 0x4f, 0xa8, 0xb0, 0x16, 0x99, 0xbb, 0x9a, 0xf2, 0x6d, 0xc0, 0xff, 0xc7,
- 0x02, 0x33, 0x7a, 0x15, 0x86, 0xfd, 0xd0, 0xe8, 0x62, 0xb8, 0xb7, 0xa9, 0x8b, 0x2c, 0x2e, 0x84,
- 0x97, 0x9b, 0x30, 0xb5, 0x88, 0xf0, 0xa3, 0x0d, 0x18, 0xb2, 0xb8, 0x83, 0x96, 0xf0, 0xfd, 0x7c,
- 0xaa, 0x87, 0x1c, 0xf5, 0x5c, 0x49, 0x20, 0x7e, 0xe0, 0x10, 0x71, 0xde, 0xcb, 0x2a, 0x7c, 0x0d,
- 0x5f, 0x56, 0xd1, 0x6b, 0x00, 0x24, 0x54, 0xff, 0xf9, 0x33, 0xa3, 0xc5, 0xb7, 0x8c, 0xa4, 0x44,
- 0x0c, 0x9f, 0x37, 0xa2, 0x22, 0x1f, 0x4b, 0x44, 0xd0, 0x1b, 0xb2, 0xbe, 0x61, 0xac, 0x37, 0x57,
- 0xf7, 0x74, 0xf0, 0x86, 0x58, 0x1f, 0x1f, 0x5d, 0x75, 0x25, 0x35, 0x80, 0xfe, 0x5b, 0x00, 0x10,
- 0x3f, 0x5e, 0xa0, 0x4d, 0x18, 0x0e, 0xa9, 0xf4, 0x12, 0x6c, 0xe2, 0x86, 0x00, 0xf3, 0xed, 0x15,
- 0xfe, 0xc2, 0x11, 0x6e, 0x54, 0xc9, 0x0a, 0x1a, 0x12, 0x27, 0x16, 0xec, 0x2e, 0x60, 0xc8, 0x6b,
- 0x00, 0x66, 0x1c, 0xb8, 0xae, 0xaf, 0xf8, 0x5a, 0x45, 0x41, 0xed, 0xe2, 0xb5, 0x92, 0xe2, 0xde,
- 0x49, 0x44, 0x72, 0x6c, 0x2f, 0xfb, 0x0b, 0xd9, 0x5e, 0x3e, 0x0d, 0xa7, 0x84, 0xad, 0x4b, 0xb5,
- 0x4e, 0x98, 0xb6, 0x40, 0xb8, 0x27, 0x31, 0x2b, 0xa8, 0x8a, 0x0a, 0xc2, 0xc9, 0xba, 0xe8, 0x5f,
- 0x69, 0x30, 0x6c, 0x0a, 0x01, 0x4d, 0xf0, 0xb6, 0xe5, 0xde, 0x9e, 0xae, 0xe6, 0x42, 0x79, 0x8f,
- 0xdf, 0x85, 0x5e, 0x08, 0xb9, 0x6a, 0x58, 0x7c, 0x44, 0x4a, 0xa8, 0xa8, 0xd7, 0xe8, 0x37, 0xe9,
- 0x75, 0xcf, 0xb6, 0x5d, 0xd3, 0x08, 0x58, 0x10, 0x29, 0xee, 0x37, 0x75, 0xbb, 0xc7, 0x51, 0xcc,
- 0xc7, 0x18, 0xf9, 0x40, 0xbe, 0x35, 0xba, 0xd4, 0xc5, 0x90, 0x23, 0x1a, 0x8b, 0xdc, 0x7d, 0xf4,
- 0xf7, 0x34, 0x78, 0x88, 0x3b, 0xab, 0x55, 0xa8, 0xcc, 0xb5, 0x69, 0x99, 0x46, 0x40, 0x78, 0x2c,
- 0xbb, 0xd0, 0x51, 0x82, 0x5b, 0x8a, 0x0e, 0x1f, 0xda, 0x52, 0xf4, 0xca, 0xfe, 0x5e, 0xf9, 0xa1,
- 0x4a, 0x17, 0xb8, 0x71, 0x57, 0x3d, 0x40, 0xaf, 0xc3, 0xb8, 0x2d, 0xc7, 0x54, 0x15, 0x4c, 0xbe,
- 0xd0, 0xd3, 0x91, 0x12, 0x9c, 0x95, 0xdf, 0x15, 0x95, 0x22, 0xac, 0x92, 0x9a, 0xbd, 0x0b, 0xe3,
- 0xca, 0x46, 0x3b, 0x56, 0xa5, 0x9b, 0x03, 0x93, 0xc9, 0xfd, 0x70, 0xac, 0x56, 0x53, 0xb7, 0x60,
- 0x24, 0x12, 0x16, 0xd0, 0x45, 0x89, 0x50, 0x2c, 0x7a, 0xdd, 0x22, 0xbb, 0x9c, 0x6a, 0x59, 0xb9,
- 0x0e, 0xf3, 0x17, 0x21, 0x16, 0xe3, 0x4b, 0x20, 0xd4, 0x7f, 0x47, 0xbc, 0x08, 0xad, 0x93, 0x66,
- 0xcb, 0x36, 0x02, 0xf2, 0xe6, 0x7f, 0x6d, 0xd7, 0xff, 0x93, 0xc6, 0xcf, 0x1b, 0x2e, 0xda, 0x20,
- 0x03, 0x46, 0x9b, 0x3c, 0x67, 0x10, 0x8b, 0x08, 0xa6, 0x15, 0x8f, 0x45, 0xb6, 0x12, 0xa3, 0xc1,
- 0x32, 0x4e, 0x74, 0x0f, 0x46, 0x42, 0x61, 0x30, 0x54, 0x28, 0x5d, 0xef, 0x4d, 0x38, 0x8b, 0xe4,
- 0xce, 0xe8, 0x68, 0x0d, 0x4b, 0x7c, 0x1c, 0xd3, 0xd2, 0x0d, 0x40, 0xe9, 0x36, 0xe8, 0xe1, 0xd8,
- 0x6b, 0x43, 0x53, 0xa3, 0xfc, 0xa7, 0x3c, 0x37, 0x42, 0x7d, 0x59, 0x29, 0x4f, 0x5f, 0xa6, 0xff,
- 0x4a, 0x09, 0xa6, 0xc5, 0xd5, 0x73, 0xde, 0x34, 0xdd, 0xb6, 0x13, 0xc4, 0xce, 0x74, 0xdc, 0x43,
- 0x55, 0x10, 0x61, 0xe2, 0x24, 0x77, 0x5f, 0xc5, 0x02, 0x82, 0x6e, 0x73, 0x45, 0x96, 0x53, 0x67,
- 0xd1, 0xf5, 0x63, 0x2e, 0x21, 0xbb, 0x82, 0x2f, 0x65, 0x55, 0xc0, 0xd9, 0xed, 0xd0, 0x36, 0xa0,
- 0xa6, 0xb1, 0x93, 0xc4, 0xd6, 0x43, 0xfa, 0xe6, 0x95, 0x14, 0x36, 0x9c, 0x41, 0x81, 0x1e, 0xa4,
- 0x54, 0x92, 0x6b, 0x05, 0xa4, 0xce, 0x87, 0x18, 0x3e, 0x48, 0xb3, 0x83, 0x74, 0x5e, 0x05, 0xe1,
- 0x64, 0x5d, 0xfd, 0xa3, 0x83, 0xf0, 0x80, 0x3a, 0x89, 0xf4, 0x0b, 0x0d, 0x9d, 0x48, 0x9f, 0x0d,
- 0x3d, 0x24, 0xf8, 0x44, 0x3e, 0x9c, 0xf4, 0x90, 0x98, 0xa9, 0x78, 0x84, 0x1d, 0xc9, 0x86, 0xed,
- 0x87, 0x8d, 0x14, 0x6f, 0x89, 0xaf, 0x81, 0x47, 0x68, 0x8e, 0x0b, 0x60, 0xdf, 0xb1, 0x7a, 0xbe,
- 0x7e, 0x42, 0x83, 0x59, 0xb5, 0xf8, 0xba, 0xe5, 0x58, 0xfe, 0x96, 0x88, 0xe5, 0x7e, 0x78, 0x07,
- 0x0d, 0x96, 0x70, 0x72, 0x39, 0x17, 0x23, 0xee, 0x40, 0x0d, 0x7d, 0xbf, 0x06, 0xe7, 0x13, 0xf3,
- 0xa2, 0x44, 0x96, 0x3f, 0xbc, 0xaf, 0x06, 0x0b, 0x61, 0xb0, 0x9c, 0x8f, 0x12, 0x77, 0xa2, 0x87,
- 0xbe, 0xa0, 0xc1, 0xd9, 0x56, 0x96, 0x3f, 0x67, 0x78, 0x2d, 0x2d, 0xa4, 0x42, 0xcb, 0xf4, 0x10,
- 0x5d, 0xb8, 0x24, 0xb6, 0xe8, 0xd9, 0x4c, 0xb0, 0x8f, 0x73, 0x3a, 0xa2, 0xff, 0x93, 0x12, 0x0c,
- 0x30, 0x9b, 0x8f, 0x37, 0x87, 0x59, 0x3d, 0xeb, 0x6a, 0xae, 0x55, 0x57, 0x23, 0x61, 0xd5, 0xf5,
- 0x6c, 0x71, 0x12, 0x9d, 0xcd, 0xba, 0xbe, 0x15, 0xce, 0xb2, 0x6a, 0xf3, 0x75, 0xa6, 0x68, 0xf3,
- 0x49, 0x7d, 0xbe, 0x5e, 0x67, 0xd7, 0xdb, 0x83, 0x9f, 0x3b, 0x2e, 0x42, 0x5f, 0xdb, 0xb3, 0x93,
- 0x81, 0x06, 0xef, 0xe0, 0x65, 0x4c, 0xcb, 0xf5, 0x4f, 0x68, 0x30, 0xc9, 0x70, 0x4b, 0x2c, 0x06,
- 0x6d, 0xc3, 0xb0, 0x27, 0xd8, 0x8c, 0x58, 0x9b, 0xe5, 0xc2, 0x43, 0xcb, 0x60, 0x5d, 0xfc, 0xc6,
- 0x16, 0xfe, 0xc2, 0x11, 0x2d, 0xfd, 0xcb, 0x83, 0x30, 0x93, 0xd7, 0x08, 0xfd, 0x90, 0x06, 0x67,
- 0xcd, 0x58, 0xe2, 0x9c, 0x6f, 0x07, 0x5b, 0xae, 0xc7, 0xe3, 0xb6, 0x6a, 0xc5, 0xd5, 0x21, 0x95,
- 0xf9, 0xa8, 0x57, 0x2c, 0x34, 0x7a, 0x25, 0x93, 0x02, 0xce, 0xa1, 0x8c, 0xde, 0xe0, 0x41, 0xd8,
- 0x4c, 0xd9, 0xfe, 0xe7, 0x56, 0xe1, 0xb9, 0x92, 0x52, 0xd3, 0x84, 0x9d, 0x8a, 0x22, 0xb1, 0x89,
- 0x72, 0x89, 0x1c, 0x25, 0xee, 0xfb, 0x5b, 0xb7, 0xc8, 0x6e, 0xcb, 0xb0, 0x42, 0x93, 0x97, 0xe2,
- 0xc4, 0x6b, 0xb5, 0x9b, 0x02, 0x95, 0x4a, 0x5c, 0x2a, 0x97, 0xc8, 0xa1, 0x8f, 0x68, 0x30, 0xee,
- 0xca, 0x21, 0x11, 0x7a, 0xb1, 0x97, 0xcd, 0x8c, 0xad, 0xc0, 0xc5, 0x7c, 0x15, 0xa4, 0x92, 0xa4,
- 0x7b, 0x62, 0xca, 0x4f, 0x1e, 0xab, 0x82, 0xf1, 0xae, 0x14, 0x13, 0xc0, 0x72, 0xce, 0x68, 0xae,
- 0x32, 0x48, 0x83, 0xd3, 0xe4, 0x59, 0xa7, 0x48, 0x60, 0xd6, 0x97, 0x1c, 0xd3, 0xdb, 0x65, 0x4e,
- 0xb8, 0xb4, 0x53, 0x83, 0xc5, 0x3b, 0xb5, 0xb4, 0x5e, 0x59, 0x54, 0x90, 0xa9, 0x9d, 0x4a, 0x83,
- 0xd3, 0xe4, 0xf5, 0x0f, 0x97, 0xe0, 0x5c, 0xce, 0x1e, 0xfb, 0x5b, 0x13, 0xc3, 0xe2, 0xd7, 0x35,
- 0x18, 0x61, 0x73, 0xf0, 0x26, 0x71, 0x83, 0x62, 0x7d, 0xcd, 0xb1, 0x0c, 0xfd, 0x35, 0x0d, 0xa6,
- 0x52, 0x49, 0x39, 0xba, 0x72, 0xa2, 0x39, 0x31, 0xa3, 0xc5, 0xb7, 0xc5, 0xb9, 0xc6, 0xfa, 0x62,
- 0xdf, 0xf1, 0x64, 0x9e, 0x31, 0xfd, 0x45, 0x18, 0x57, 0x0c, 0x43, 0xa5, 0x28, 0x6b, 0x59, 0xf1,
- 0xe1, 0xe4, 0x20, 0x6a, 0xa5, 0x4e, 0xe1, 0xdf, 0xe2, 0x2d, 0x9f, 0xe6, 0x6c, 0x7f, 0x7b, 0xb6,
- 0x3c, 0x12, 0x5b, 0x3e, 0x7c, 0x43, 0x62, 0xb1, 0xdb, 0xfc, 0x5e, 0xde, 0x90, 0x58, 0x10, 0x38,
- 0x11, 0x6b, 0x91, 0xff, 0x8f, 0x05, 0x56, 0xf4, 0x9c, 0x1a, 0x49, 0x71, 0x35, 0xbe, 0x58, 0x4e,
- 0x27, 0xe3, 0x1f, 0xb2, 0x2d, 0x99, 0xaa, 0x8d, 0x30, 0x7f, 0x85, 0xe2, 0x67, 0x59, 0xa1, 0x94,
- 0x0b, 0x8b, 0xab, 0x35, 0x1e, 0x62, 0x2b, 0x7a, 0x7d, 0x52, 0xd5, 0xed, 0xfd, 0x27, 0xa1, 0x6e,
- 0xf7, 0x60, 0x74, 0xcb, 0xda, 0x20, 0x9e, 0xc3, 0x65, 0xa8, 0x81, 0xe2, 0xe2, 0xe1, 0xcd, 0x18,
- 0x0d, 0xd7, 0x41, 0x48, 0x05, 0x58, 0x26, 0x82, 0x3c, 0x25, 0x1e, 0xec, 0x60, 0x71, 0x91, 0x28,
- 0xd6, 0x8b, 0xc7, 0xe3, 0xcc, 0x89, 0x05, 0xeb, 0x00, 0x38, 0x51, 0x90, 0xc4, 0x5e, 0x5e, 0xa5,
- 0xe2, 0x50, 0x8b, 0x5c, 0xe8, 0x88, 0x7f, 0x63, 0x89, 0x02, 0x9d, 0xd7, 0x66, 0x1c, 0x73, 0x5b,
- 0xe8, 0x38, 0x9f, 0xed, 0x31, 0xee, 0xb9, 0xd0, 0xed, 0xc4, 0x05, 0x58, 0x26, 0x42, 0xc7, 0xd8,
- 0x8c, 0x22, 0x65, 0x0b, 0x1d, 0x66, 0xa1, 0x31, 0xc6, 0xf1, 0xb6, 0x45, 0x52, 0xf6, 0xe8, 0x37,
- 0x96, 0x28, 0xa0, 0x57, 0xa5, 0xc7, 0x4b, 0x28, 0xae, 0x21, 0xeb, 0xea, 0xe1, 0xf2, 0x5d, 0xb1,
- 0xa2, 0x68, 0x94, 0x7d, 0xa7, 0xe7, 0x25, 0x25, 0x11, 0x8b, 0x20, 0x4e, 0x79, 0x47, 0x4a, 0x69,
- 0x14, 0x9b, 0xa3, 0x8f, 0x75, 0x34, 0x47, 0xaf, 0x50, 0xe9, 0x4c, 0x72, 0xfe, 0x61, 0x0c, 0x61,
- 0x3c, 0x7e, 0x81, 0xa9, 0x25, 0x81, 0x38, 0x5d, 0x9f, 0x33, 0x7c, 0x52, 0x67, 0x6d, 0x27, 0x64,
- 0x86, 0xcf, 0xcb, 0x70, 0x04, 0x45, 0xdb, 0x30, 0xe6, 0x4b, 0xb6, 0xed, 0x33, 0xa7, 0x7a, 0x7d,
- 0xbf, 0x14, 0x76, 0xed, 0x2c, 0x94, 0x9b, 0x5c, 0x82, 0x15, 0x3a, 0xea, 0xe3, 0xda, 0xe4, 0xc9,
- 0x3e, 0xae, 0xa1, 0xb6, 0x6a, 0xb6, 0x3a, 0x75, 0x24, 0xa1, 0x12, 0x0e, 0x34, 0x6b, 0xa5, 0x4b,
- 0x4b, 0x76, 0x5a, 0xae, 0xdf, 0xf6, 0x08, 0xcb, 0xf8, 0xc0, 0x96, 0x07, 0xc5, 0x4b, 0xbb, 0x94,
- 0x04, 0xe2, 0x74, 0x7d, 0xf4, 0xbd, 0x1a, 0x4c, 0xfa, 0xbb, 0x7e, 0x40, 0x9a, 0xf4, 0xd8, 0x72,
- 0x1d, 0xe2, 0x04, 0xfe, 0xcc, 0xe9, 0xe2, 0xa1, 0x77, 0x6b, 0x09, 0x5c, 0xfc, 0xd8, 0x49, 0x96,
- 0xe2, 0x14, 0x4d, 0xba, 0x73, 0xe4, 0x60, 0x0b, 0x33, 0xd3, 0xc5, 0x77, 0x8e, 0x1c, 0xc8, 0x81,
- 0xef, 0x1c, 0xb9, 0x04, 0x2b, 0x74, 0xd0, 0xe3, 0x30, 0xee, 0x87, 0x79, 0x67, 0xd9, 0x0c, 0x9e,
- 0x89, 0xe3, 0xe1, 0xd5, 0x64, 0x00, 0x56, 0xeb, 0xa1, 0x0f, 0xc1, 0x98, 0x7c, 0x76, 0xce, 0x9c,
- 0x3d, 0xea, 0xc8, 0xd0, 0xbc, 0xe7, 0x32, 0x48, 0x21, 0x88, 0x30, 0x9c, 0x35, 0xe3, 0x4b, 0xba,
- 0xfc, 0x7d, 0x9f, 0x63, 0x43, 0xe0, 0x97, 0xe9, 0xcc, 0x1a, 0x38, 0xa7, 0x25, 0xfa, 0xb1, 0xec,
- 0xb7, 0xfa, 0x19, 0xb6, 0xa5, 0xd7, 0x8e, 0xe4, 0xad, 0xfe, 0x45, 0x2b, 0xd8, 0xba, 0xdd, 0xe2,
- 0xc1, 0x7b, 0x0e, 0xf9, 0x6c, 0xaf, 0xff, 0xbe, 0x06, 0x10, 0x69, 0x6b, 0x4e, 0xe2, 0x9d, 0xa4,
- 0xae, 0x28, 0xb0, 0x16, 0x7a, 0xd2, 0x2e, 0xe5, 0x06, 0xfe, 0xd7, 0x7f, 0x4f, 0x83, 0x89, 0xb8,
- 0xda, 0x09, 0x5c, 0x8d, 0x4c, 0xf5, 0x6a, 0xf4, 0x4c, 0x6f, 0xe3, 0xca, 0xb9, 0x1f, 0xfd, 0xef,
- 0x92, 0x3c, 0x2a, 0x26, 0xfd, 0x6e, 0x2b, 0x76, 0x07, 0x94, 0xf4, 0xcd, 0x5e, 0xec, 0x0e, 0x64,
- 0x07, 0xf7, 0x78, 0xbc, 0x19, 0x76, 0x08, 0xdf, 0xa9, 0xc8, 0x9f, 0x3d, 0x84, 0x96, 0x88, 0x84,
- 0xcd, 0x90, 0x34, 0x9f, 0x80, 0x83, 0x84, 0xd1, 0xd7, 0xe4, 0xe3, 0xa9, 0x87, 0x60, 0xfd, 0xca,
- 0x80, 0x3b, 0x5b, 0x7c, 0x7c, 0x6a, 0x12, 0x46, 0x25, 0xc5, 0x66, 0xc2, 0x8a, 0x42, 0x3b, 0x09,
- 0x2b, 0x8a, 0x00, 0x46, 0xcd, 0x28, 0xbf, 0x59, 0x38, 0xed, 0x3d, 0xd2, 0x8c, 0x8e, 0xc5, 0x38,
- 0x73, 0x9a, 0x8f, 0x65, 0x32, 0x54, 0x78, 0x8b, 0xf6, 0x58, 0xdf, 0x11, 0xd8, 0xb6, 0x74, 0xda,
- 0x57, 0x8f, 0x01, 0x84, 0xf2, 0x3f, 0xa9, 0x8b, 0x20, 0xc8, 0x91, 0xa3, 0x4b, 0xd5, 0xbf, 0x19,
- 0xc1, 0xb0, 0x54, 0x2f, 0xfd, 0x2a, 0x3f, 0x70, 0x62, 0xaf, 0xf2, 0x74, 0x1b, 0xd8, 0x61, 0x16,
- 0xe3, 0x9e, 0x6c, 0xe5, 0xa2, 0x5c, 0xc8, 0xf1, 0x36, 0x88, 0x8a, 0x7c, 0x2c, 0x11, 0xc9, 0x31,
- 0xa6, 0x19, 0x2a, 0x64, 0x4c, 0xd3, 0x86, 0xd3, 0x1e, 0x09, 0xbc, 0xdd, 0xca, 0xae, 0xc9, 0xb2,
- 0x07, 0x78, 0x01, 0xbb, 0xc1, 0x0f, 0x17, 0x8b, 0x49, 0x86, 0xd3, 0xa8, 0x70, 0x16, 0x7e, 0x45,
- 0x00, 0x1e, 0xe9, 0x28, 0x00, 0xbf, 0x0b, 0x46, 0x03, 0x62, 0x6e, 0x39, 0x96, 0x69, 0xd8, 0xd5,
- 0x45, 0x11, 0x22, 0x37, 0x96, 0xe5, 0x62, 0x10, 0x96, 0xeb, 0xa1, 0x05, 0xe8, 0x6b, 0x5b, 0x75,
- 0x71, 0x03, 0xf8, 0xa6, 0xe8, 0x89, 0xa0, 0xba, 0x78, 0x7f, 0xaf, 0xfc, 0xd6, 0xd8, 0x3a, 0x25,
- 0x1a, 0xd5, 0xd5, 0xd6, 0xdd, 0xc6, 0xd5, 0x60, 0xb7, 0x45, 0xfc, 0xb9, 0x3b, 0xd5, 0x45, 0x4c,
- 0x1b, 0x67, 0x19, 0x1a, 0x8d, 0x1d, 0xc2, 0xd0, 0xe8, 0x33, 0x1a, 0x9c, 0x36, 0x92, 0xaf, 0x1b,
- 0xc4, 0x9f, 0x19, 0x2f, 0xce, 0x2d, 0xb3, 0x5f, 0x4c, 0x16, 0xce, 0x8b, 0xf1, 0x9d, 0x9e, 0x4f,
- 0x93, 0xc3, 0x59, 0x7d, 0x40, 0x1e, 0xa0, 0xa6, 0xd5, 0x88, 0x12, 0x0a, 0x8b, 0x55, 0x9f, 0x28,
- 0xa6, 0xb7, 0x59, 0x49, 0x61, 0xc2, 0x19, 0xd8, 0xd1, 0x3d, 0x18, 0x95, 0x84, 0x24, 0x71, 0x93,
- 0x59, 0x3c, 0x8a, 0x47, 0x18, 0x7e, 0xdb, 0x95, 0x1f, 0x58, 0x64, 0x4a, 0xd1, 0x0b, 0xab, 0xa4,
- 0x66, 0x10, 0xaf, 0x8c, 0x6c, 0xd4, 0x93, 0xc5, 0x5f, 0x58, 0xb3, 0x31, 0xe2, 0x0e, 0xd4, 0x58,
- 0x24, 0x30, 0x5b, 0xcd, 0xfb, 0x3d, 0x33, 0x55, 0x3c, 0x96, 0x41, 0x22, 0x85, 0x38, 0xdf, 0x9a,
- 0x89, 0x42, 0x9c, 0x24, 0x88, 0xae, 0x03, 0x22, 0x5c, 0x95, 0x1e, 0x5f, 0xce, 0xfc, 0x19, 0x14,
- 0xe5, 0x47, 0x47, 0x4b, 0x29, 0x28, 0xce, 0x68, 0x81, 0x02, 0x45, 0x57, 0xd2, 0xc3, 0x2d, 0x27,
- 0x99, 0x96, 0xa2, 0xa3, 0xc6, 0xe4, 0x7b, 0xb4, 0x54, 0x66, 0x4f, 0x7e, 0xb9, 0xb9, 0xd9, 0x7b,
- 0x66, 0x4f, 0x41, 0xbe, 0x8b, 0xfc, 0x9e, 0xfa, 0xef, 0x6a, 0x42, 0xcb, 0x7b, 0x82, 0x66, 0x46,
- 0xc7, 0xfd, 0xfe, 0xab, 0xbf, 0x08, 0x33, 0xb5, 0x30, 0x44, 0x5e, 0x3d, 0x11, 0x09, 0xfb, 0x29,
- 0x18, 0xe7, 0xaf, 0x2c, 0x2b, 0x46, 0x6b, 0x35, 0x56, 0xc9, 0x47, 0x2e, 0xf2, 0x15, 0x19, 0x88,
- 0xd5, 0xba, 0xfa, 0x57, 0x34, 0x38, 0xa7, 0x62, 0x76, 0x3d, 0xeb, 0xf5, 0xde, 0x11, 0xa3, 0x8f,
- 0x69, 0x30, 0x1a, 0x3f, 0x20, 0x86, 0x52, 0x51, 0x21, 0x57, 0x8c, 0xb0, 0x57, 0xc4, 0x93, 0x5e,
- 0x94, 0xd2, 0xe9, 0xd5, 0x62, 0xa0, 0x8f, 0x65, 0xd2, 0xfa, 0x7f, 0xd3, 0x20, 0x75, 0x33, 0x47,
- 0x1b, 0x30, 0x44, 0x89, 0x2c, 0xae, 0xd6, 0xc4, 0x9e, 0x78, 0xaa, 0x98, 0xc0, 0xc6, 0x50, 0xf0,
- 0xf7, 0x06, 0xf1, 0x03, 0x87, 0x88, 0xe9, 0x5d, 0xdf, 0x91, 0xd2, 0x64, 0x88, 0xed, 0x51, 0x48,
- 0x22, 0x96, 0xd3, 0x6d, 0xf0, 0x1b, 0xb3, 0x5c, 0x82, 0x15, 0x3a, 0xfa, 0x32, 0x40, 0xac, 0x4d,
- 0xe9, 0xd9, 0x6c, 0xef, 0x9f, 0x9f, 0x82, 0x33, 0xbd, 0x3a, 0x8c, 0xb1, 0xec, 0xe2, 0x64, 0xdb,
- 0x32, 0x83, 0xf9, 0xcd, 0x80, 0x78, 0xb7, 0x6f, 0xaf, 0xac, 0x6f, 0x79, 0xc4, 0xdf, 0x72, 0xed,
- 0x7a, 0xc1, 0xf4, 0xe6, 0xec, 0xd6, 0xbf, 0x94, 0x89, 0x11, 0xe7, 0x50, 0x62, 0x9a, 0xa4, 0x6d,
- 0x7e, 0xc7, 0xc6, 0xf4, 0x3a, 0xd3, 0xf6, 0xfc, 0x40, 0x44, 0xbd, 0xe2, 0x9a, 0xa4, 0x24, 0x10,
- 0xa7, 0xeb, 0x27, 0x91, 0xb0, 0x1c, 0x50, 0x4c, 0x24, 0xd6, 0xd2, 0x48, 0x18, 0x10, 0xa7, 0xeb,
- 0xcb, 0x48, 0xf8, 0x4a, 0xd1, 0xf3, 0x66, 0x20, 0x8d, 0x24, 0x02, 0xe2, 0x74, 0x7d, 0x54, 0x87,
- 0x0b, 0x1e, 0x31, 0xdd, 0x66, 0x93, 0x38, 0x75, 0x36, 0x29, 0x2b, 0x86, 0xd7, 0xb0, 0x9c, 0xeb,
- 0x9e, 0xc1, 0x2a, 0x32, 0xc5, 0xbc, 0xc6, 0xd2, 0x35, 0x5e, 0xc0, 0x1d, 0xea, 0xe1, 0x8e, 0x58,
- 0x50, 0x13, 0x4e, 0xf1, 0x8c, 0xda, 0x5e, 0xd5, 0x09, 0x88, 0xb7, 0x6d, 0xd8, 0x42, 0xfb, 0x7e,
- 0xd8, 0x15, 0x63, 0x67, 0xe0, 0x1d, 0x15, 0x15, 0x4e, 0xe2, 0x46, 0xbb, 0x54, 0xf2, 0x15, 0xdd,
- 0x91, 0x48, 0x0e, 0x17, 0xcf, 0xbf, 0x8f, 0xd3, 0xe8, 0x70, 0x16, 0x0d, 0x54, 0x85, 0xd3, 0x81,
- 0xe1, 0x35, 0x48, 0x50, 0x59, 0xbb, 0xb3, 0x46, 0x3c, 0x93, 0xf2, 0x58, 0x9b, 0x0b, 0xc2, 0x1a,
- 0x47, 0xb5, 0x9e, 0x06, 0xe3, 0xac, 0x36, 0xe8, 0x43, 0xf0, 0x36, 0x75, 0x52, 0x97, 0xdd, 0x7b,
- 0xc4, 0x5b, 0x70, 0xdb, 0x4e, 0x5d, 0x45, 0x0e, 0x0c, 0xf9, 0xc3, 0xfb, 0x7b, 0xe5, 0xb7, 0xe1,
- 0x6e, 0x1a, 0xe0, 0xee, 0xf0, 0xa6, 0x3b, 0x70, 0xa7, 0xd5, 0xca, 0xec, 0xc0, 0x68, 0x5e, 0x07,
- 0x72, 0x1a, 0xe0, 0xee, 0xf0, 0x22, 0x0c, 0x67, 0xf9, 0xc4, 0xf0, 0xe4, 0xa2, 0x12, 0xc5, 0x31,
- 0x46, 0x91, 0x7d, 0xbf, 0xeb, 0x99, 0x35, 0x70, 0x4e, 0x4b, 0x7a, 0xa6, 0x5c, 0xc9, 0x1b, 0x7e,
- 0x8a, 0xcc, 0x38, 0x23, 0xf3, 0x8e, 0xfd, 0xbd, 0xf2, 0x15, 0xdc, 0x65, 0x1b, 0xdc, 0x35, 0xf6,
- 0x8c, 0xae, 0xc4, 0x13, 0x91, 0xea, 0xca, 0x44, 0x5e, 0x57, 0xf2, 0xdb, 0xe0, 0xae, 0xb1, 0xa3,
- 0xef, 0xd3, 0xe0, 0x01, 0xb3, 0xd5, 0xbe, 0x69, 0xf9, 0x81, 0xdb, 0xf0, 0x8c, 0xe6, 0x22, 0x31,
- 0x8d, 0xdd, 0x9b, 0x86, 0xbd, 0xb9, 0x6c, 0x6d, 0x12, 0x21, 0xcf, 0x1f, 0xf6, 0xc3, 0x61, 0x0e,
- 0xb5, 0x95, 0xb5, 0x3b, 0xd9, 0x48, 0x71, 0x3e, 0x3d, 0xf4, 0xc3, 0x1a, 0x5c, 0xe0, 0xf9, 0xbd,
- 0x73, 0x3a, 0x34, 0x59, 0xa8, 0x43, 0x8c, 0x8b, 0xad, 0x74, 0xc0, 0x8b, 0x3b, 0x52, 0x65, 0x93,
- 0xc4, 0x2b, 0xcc, 0x37, 0x1a, 0x1e, 0x69, 0x30, 0xac, 0x11, 0x77, 0x99, 0x2a, 0x3e, 0x49, 0x2b,
- 0x79, 0x48, 0x71, 0x3e, 0x3d, 0xf4, 0x2a, 0x5c, 0xca, 0x05, 0x56, 0xdc, 0xb6, 0x13, 0xb0, 0xf7,
- 0x8d, 0xbe, 0x05, 0x7d, 0x7f, 0xaf, 0x7c, 0x69, 0xa5, 0x63, 0x4d, 0x7c, 0x00, 0x26, 0xfd, 0x33,
- 0x1a, 0x08, 0xcf, 0x3b, 0x74, 0x41, 0xb1, 0xd9, 0x18, 0x4e, 0xd8, 0x6b, 0x84, 0x59, 0xfb, 0x4a,
- 0x99, 0x59, 0xfb, 0xde, 0x2e, 0x05, 0x89, 0x1c, 0x89, 0xc5, 0x61, 0x8e, 0x59, 0x4a, 0x99, 0xfd,
- 0x08, 0x8c, 0x44, 0x37, 0x12, 0xa1, 0x29, 0x62, 0x11, 0xf3, 0xe3, 0xab, 0x4b, 0x0c, 0xd7, 0x7f,
- 0x5b, 0x03, 0x88, 0x93, 0x51, 0x76, 0x97, 0xe8, 0xfb, 0x40, 0x33, 0x72, 0x29, 0x8d, 0x7b, 0x5f,
- 0x6e, 0x1a, 0xf7, 0x63, 0xca, 0xdb, 0xfd, 0x0b, 0x1a, 0x9c, 0x52, 0xa3, 0x76, 0xfa, 0xe8, 0x6d,
- 0x30, 0x24, 0x62, 0x8d, 0x8b, 0x60, 0xc1, 0xac, 0xa9, 0x08, 0x3d, 0x86, 0x43, 0x98, 0xfa, 0xb4,
- 0xd7, 0x83, 0xea, 0x36, 0x3b, 0x78, 0xe8, 0x01, 0x5a, 0xd4, 0x1f, 0x3d, 0x0d, 0x83, 0xdc, 0x80,
- 0x96, 0x4a, 0x6a, 0x19, 0x21, 0x57, 0x6e, 0x15, 0x8f, 0x87, 0x5d, 0x24, 0x2c, 0x85, 0x9c, 0x15,
- 0xac, 0xd4, 0x31, 0x2b, 0x18, 0x86, 0x3e, 0xd3, 0xb3, 0x7a, 0x31, 0xe3, 0xa8, 0xe0, 0x2a, 0x37,
- 0xe3, 0xa8, 0xe0, 0x2a, 0xa6, 0xc8, 0xe8, 0xfd, 0x59, 0xb2, 0x6f, 0xe8, 0x2f, 0x7e, 0x7f, 0xe6,
- 0x13, 0x20, 0x59, 0x39, 0x4c, 0x74, 0xb4, 0x70, 0x08, 0x23, 0x01, 0x0f, 0x14, 0x77, 0xeb, 0x10,
- 0x53, 0xde, 0x4d, 0x24, 0xe0, 0xf0, 0x43, 0x1a, 0xcc, 0xfd, 0x90, 0x36, 0x61, 0x48, 0x7c, 0x0a,
- 0x42, 0xe4, 0x7b, 0xaa, 0x87, 0xdc, 0xb7, 0x52, 0x96, 0x0d, 0x5e, 0x80, 0x43, 0xe4, 0xf4, 0x1e,
- 0xd1, 0x34, 0x76, 0xac, 0x66, 0xbb, 0xc9, 0xe4, 0xbc, 0x01, 0xb9, 0x2a, 0x2b, 0xc6, 0x21, 0x9c,
- 0x55, 0xe5, 0xde, 0x30, 0x4c, 0x2e, 0x93, 0xab, 0xf2, 0x62, 0x1c, 0xc2, 0xd1, 0xcb, 0x30, 0xdc,
- 0x34, 0x76, 0x6a, 0x6d, 0xaf, 0x41, 0x84, 0x75, 0x43, 0xfe, 0xb5, 0xbf, 0x1d, 0x58, 0xf6, 0x9c,
- 0xe5, 0x04, 0x7e, 0xe0, 0xcd, 0x55, 0x9d, 0xe0, 0xb6, 0x57, 0x0b, 0xbc, 0x28, 0xbb, 0xf8, 0x8a,
- 0xc0, 0x82, 0x23, 0x7c, 0xc8, 0x86, 0x89, 0xa6, 0xb1, 0x73, 0xc7, 0x31, 0x78, 0x90, 0x67, 0x21,
- 0x47, 0x15, 0xa1, 0xc0, 0x54, 0x1a, 0x2b, 0x0a, 0x2e, 0x9c, 0xc0, 0x9d, 0x61, 0x49, 0x37, 0x76,
- 0x5c, 0x96, 0x74, 0xf3, 0x91, 0x7f, 0x39, 0xd7, 0x87, 0x3e, 0x90, 0x19, 0x95, 0xaa, 0xa3, 0xef,
- 0xf8, 0x2b, 0x91, 0xef, 0xf8, 0x44, 0x71, 0xd3, 0xaf, 0x0e, 0x7e, 0xe3, 0x6d, 0x18, 0xad, 0x1b,
- 0x81, 0xc1, 0x4b, 0xfd, 0x99, 0x53, 0xc5, 0x9f, 0xf6, 0x16, 0x23, 0x34, 0x31, 0x4b, 0x8a, 0xcb,
- 0x7c, 0x2c, 0xd3, 0x41, 0xb7, 0xe1, 0x0c, 0xfd, 0x58, 0x6d, 0x12, 0xc4, 0x55, 0x98, 0x56, 0x64,
- 0x92, 0x7d, 0x3f, 0xcc, 0xbf, 0xe8, 0x56, 0x56, 0x05, 0x9c, 0xdd, 0x2e, 0x8e, 0xa0, 0x38, 0x95,
- 0x1d, 0x41, 0x11, 0x7d, 0x32, 0xcb, 0x66, 0x01, 0xb1, 0x39, 0x7d, 0x6f, 0x71, 0xde, 0x50, 0xd8,
- 0x72, 0xe1, 0x9f, 0x6a, 0x30, 0x23, 0x76, 0x99, 0xb0, 0x33, 0xb0, 0x89, 0xb7, 0x62, 0x38, 0x46,
- 0x83, 0x78, 0x42, 0xc9, 0xb8, 0xde, 0x03, 0x7f, 0x48, 0xe1, 0x8c, 0x9c, 0xfa, 0x1f, 0xda, 0xdf,
- 0x2b, 0x5f, 0x3e, 0xa8, 0x16, 0xce, 0xed, 0x1b, 0xf2, 0x60, 0xc8, 0xdf, 0xf5, 0xcd, 0xc0, 0xf6,
- 0x67, 0xa6, 0xd9, 0x66, 0xb9, 0xd1, 0x03, 0x67, 0xad, 0x71, 0x4c, 0x9c, 0xb5, 0xc6, 0xb9, 0x9d,
- 0x78, 0x29, 0x0e, 0x09, 0xa1, 0x1f, 0xd4, 0x60, 0x4a, 0xbc, 0x3c, 0x48, 0x41, 0x53, 0xce, 0x14,
- 0xf7, 0x70, 0xa8, 0x24, 0x91, 0x85, 0xb6, 0x05, 0x4c, 0x5f, 0x90, 0x82, 0xe2, 0x34, 0x75, 0x7a,
- 0xa8, 0xb6, 0x3c, 0xcb, 0xf5, 0xac, 0x60, 0x97, 0x59, 0x71, 0x0c, 0x84, 0x21, 0x76, 0x79, 0x19,
- 0x8e, 0xa0, 0xa8, 0x06, 0x13, 0xfc, 0x5e, 0x5e, 0x0b, 0x3c, 0x23, 0x20, 0x8d, 0x5d, 0x61, 0x6a,
- 0xf1, 0x08, 0xcb, 0x81, 0xa8, 0x40, 0xee, 0xef, 0x95, 0xcf, 0x88, 0xb5, 0x51, 0x01, 0x38, 0x81,
- 0x02, 0x7d, 0x20, 0x61, 0xf9, 0x32, 0x53, 0x3c, 0x3f, 0x12, 0x5f, 0x8b, 0xc3, 0xd8, 0xbf, 0xf4,
- 0x1a, 0xd2, 0xa9, 0x87, 0x18, 0xf5, 0xb3, 0x4f, 0xc2, 0x98, 0xbc, 0x6b, 0x0e, 0x15, 0x49, 0x2a,
- 0x00, 0x94, 0x1e, 0xec, 0x71, 0x47, 0x68, 0xd1, 0x7f, 0x52, 0x83, 0xc9, 0xa4, 0xec, 0x82, 0xb6,
- 0x60, 0x48, 0x30, 0x32, 0x41, 0x75, 0xbe, 0xa8, 0xc9, 0xa7, 0x4d, 0x84, 0x63, 0x27, 0x17, 0x85,
- 0x45, 0x11, 0x0e, 0xd1, 0xcb, 0xe6, 0xdc, 0xa5, 0x0e, 0xe6, 0xdc, 0x4f, 0xc3, 0xd9, 0x6c, 0x96,
- 0x46, 0x2f, 0x12, 0x86, 0x6d, 0xbb, 0xf7, 0x84, 0x5a, 0x32, 0xce, 0x2a, 0x4d, 0x0b, 0x31, 0x87,
- 0xe9, 0x1f, 0x84, 0x64, 0x6e, 0x16, 0xf4, 0x2a, 0x8c, 0xf8, 0xfe, 0x16, 0x37, 0xd2, 0x11, 0x83,
- 0x2c, 0xa6, 0xcc, 0x0f, 0xe3, 0xe4, 0xf3, 0xbb, 0x4f, 0xf4, 0x13, 0xc7, 0xe8, 0x17, 0x5e, 0xfa,
- 0xd2, 0x57, 0x2e, 0xbd, 0xe5, 0x77, 0xbe, 0x72, 0xe9, 0x2d, 0x5f, 0xfe, 0xca, 0xa5, 0xb7, 0x7c,
- 0xd7, 0xfe, 0x25, 0xed, 0x4b, 0xfb, 0x97, 0xb4, 0xdf, 0xd9, 0xbf, 0xa4, 0x7d, 0x79, 0xff, 0x92,
- 0xf6, 0xa7, 0xfb, 0x97, 0xb4, 0x1f, 0xf8, 0x0f, 0x97, 0xde, 0xf2, 0xf2, 0xb5, 0x98, 0xfa, 0xd5,
- 0x90, 0x68, 0xfc, 0x4f, 0xeb, 0x6e, 0xe3, 0x2a, 0xa5, 0x1e, 0x7a, 0xf3, 0x33, 0xea, 0xff, 0x37,
- 0x00, 0x00, 0xff, 0xff, 0x91, 0x73, 0xda, 0xc2, 0x07, 0x1e, 0x01, 0x00,
+ // 14593 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x70, 0x25, 0xd9,
+ 0x59, 0x98, 0xfb, 0xea, 0xfd, 0xe9, 0x31, 0xd2, 0x19, 0xcd, 0x8c, 0x46, 0xf3, 0xb8, 0xe3, 0xde,
+ 0xb5, 0x99, 0x65, 0x6d, 0x0d, 0x1e, 0x3f, 0xd6, 0x5e, 0xb3, 0x5e, 0x4b, 0x57, 0x9a, 0x99, 0xeb,
+ 0x91, 0x34, 0xf2, 0xb9, 0x9a, 0x9d, 0x65, 0x0d, 0x6b, 0x5a, 0x7d, 0x8f, 0xae, 0x7a, 0xa7, 0x6f,
+ 0xf7, 0xdd, 0xee, 0xbe, 0x1a, 0x69, 0xd7, 0xc6, 0xd8, 0x60, 0x62, 0x1b, 0xe3, 0x02, 0x02, 0x38,
+ 0x7e, 0x50, 0xd8, 0x50, 0x40, 0x12, 0x12, 0x93, 0x22, 0x45, 0x28, 0x20, 0xa9, 0x24, 0xae, 0x22,
+ 0x18, 0x0a, 0x08, 0xc5, 0x23, 0x31, 0x15, 0x10, 0x58, 0x21, 0x90, 0xaa, 0x3c, 0x48, 0x85, 0xaa,
+ 0x50, 0x35, 0x71, 0x91, 0xd4, 0x79, 0x74, 0xf7, 0x39, 0xfd, 0xb8, 0xba, 0xea, 0x2b, 0xc9, 0x5e,
+ 0xe0, 0x97, 0x74, 0xcf, 0x77, 0xce, 0xf7, 0x9d, 0x57, 0x7f, 0xe7, 0x3b, 0xdf, 0xf9, 0x1e, 0xb0,
+ 0xd0, 0xb0, 0x82, 0xad, 0xf6, 0xc6, 0x9c, 0xe9, 0x36, 0xaf, 0x35, 0x0c, 0xaf, 0x4e, 0x1c, 0xe2,
+ 0xc5, 0xff, 0xb4, 0xee, 0x37, 0xae, 0x19, 0x2d, 0xcb, 0xbf, 0x66, 0xba, 0x1e, 0xb9, 0xb6, 0xfd,
+ 0x86, 0x0d, 0x12, 0x18, 0x6f, 0xb8, 0xd6, 0xa0, 0x30, 0x23, 0x20, 0xf5, 0xb9, 0x96, 0xe7, 0x06,
+ 0x2e, 0xba, 0x1e, 0xe3, 0x98, 0x0b, 0x9b, 0xc6, 0xff, 0xb4, 0xee, 0x37, 0xe6, 0x28, 0x8e, 0x39,
+ 0x8a, 0x63, 0x4e, 0xe0, 0x98, 0x7d, 0xbd, 0x4c, 0xd7, 0x6d, 0xb8, 0xd7, 0x18, 0xaa, 0x8d, 0xf6,
+ 0x26, 0xfb, 0xc5, 0x7e, 0xb0, 0xff, 0x38, 0x89, 0xd9, 0xc7, 0xee, 0xbf, 0xd5, 0x9f, 0xb3, 0x5c,
+ 0xda, 0x99, 0x6b, 0x46, 0x3b, 0x70, 0x7d, 0xd3, 0xb0, 0x2d, 0xa7, 0x71, 0x6d, 0x3b, 0xd5, 0x9b,
+ 0x59, 0x5d, 0xaa, 0x2a, 0xba, 0xdd, 0xb1, 0x8e, 0xb7, 0x61, 0x98, 0x59, 0x75, 0x6e, 0xc5, 0x75,
+ 0xc8, 0x4e, 0x40, 0x1c, 0xdf, 0x72, 0x1d, 0xff, 0xf5, 0x74, 0x24, 0xc4, 0xdb, 0x96, 0xe7, 0x46,
+ 0xa9, 0x90, 0x85, 0xe9, 0x4d, 0x31, 0xa6, 0xa6, 0x61, 0x6e, 0x59, 0x0e, 0xf1, 0x76, 0xc3, 0xe6,
+ 0xd7, 0x3c, 0xe2, 0xbb, 0x6d, 0xcf, 0x24, 0x87, 0x6a, 0xe5, 0x5f, 0x6b, 0x92, 0xc0, 0xc8, 0xa2,
+ 0x75, 0x2d, 0xaf, 0x95, 0xd7, 0x76, 0x02, 0xab, 0x99, 0x26, 0xf3, 0x96, 0x83, 0x1a, 0xf8, 0xe6,
+ 0x16, 0x69, 0x1a, 0xa9, 0x76, 0x6f, 0xcc, 0x6b, 0xd7, 0x0e, 0x2c, 0xfb, 0x9a, 0xe5, 0x04, 0x7e,
+ 0xe0, 0x25, 0x1b, 0xe9, 0x1f, 0xd3, 0x60, 0x72, 0x7e, 0xad, 0x5a, 0x63, 0x33, 0xb8, 0xec, 0x36,
+ 0x1a, 0x96, 0xd3, 0x40, 0x8f, 0xc3, 0xc8, 0x36, 0xf1, 0x36, 0x5c, 0xdf, 0x0a, 0x76, 0x67, 0xb4,
+ 0x2b, 0xda, 0xd5, 0x81, 0x85, 0xf1, 0xfd, 0xbd, 0xf2, 0xc8, 0x33, 0x61, 0x21, 0x8e, 0xe1, 0xa8,
+ 0x0a, 0xa7, 0xb7, 0x82, 0xa0, 0x35, 0x6f, 0x9a, 0xc4, 0xf7, 0xa3, 0x1a, 0x33, 0x25, 0xd6, 0xec,
+ 0xdc, 0xfe, 0x5e, 0xf9, 0xf4, 0xad, 0xf5, 0xf5, 0xb5, 0x04, 0x18, 0x67, 0xb5, 0xd1, 0x7f, 0x4e,
+ 0x83, 0xa9, 0xa8, 0x33, 0x98, 0xbc, 0xd8, 0x26, 0x7e, 0xe0, 0x23, 0x0c, 0x67, 0x9b, 0xc6, 0xce,
+ 0xaa, 0xeb, 0xac, 0xb4, 0x03, 0x23, 0xb0, 0x9c, 0x46, 0xd5, 0xd9, 0xb4, 0xad, 0xc6, 0x56, 0x20,
+ 0xba, 0x36, 0xbb, 0xbf, 0x57, 0x3e, 0xbb, 0x92, 0x59, 0x03, 0xe7, 0xb4, 0xa4, 0x9d, 0x6e, 0x1a,
+ 0x3b, 0x29, 0x84, 0x52, 0xa7, 0x57, 0xd2, 0x60, 0x9c, 0xd5, 0x46, 0x7f, 0x33, 0x4c, 0xf1, 0x71,
+ 0x60, 0xe2, 0x07, 0x9e, 0x65, 0x06, 0x96, 0xeb, 0xa0, 0x2b, 0xd0, 0xef, 0x18, 0x4d, 0xc2, 0x7a,
+ 0x38, 0xb2, 0x30, 0xf6, 0xa5, 0xbd, 0xf2, 0xab, 0xf6, 0xf7, 0xca, 0xfd, 0xab, 0x46, 0x93, 0x60,
+ 0x06, 0xd1, 0xff, 0x4f, 0x09, 0x2e, 0xa6, 0xda, 0xdd, 0xb3, 0x82, 0xad, 0x3b, 0x2d, 0xfa, 0x9f,
+ 0x8f, 0x3e, 0xa1, 0xc1, 0x94, 0x91, 0xac, 0xc0, 0x10, 0x8e, 0x5e, 0x5f, 0x9a, 0x3b, 0xfc, 0x07,
+ 0x3e, 0x97, 0xa2, 0xb6, 0x70, 0x5e, 0xf4, 0x2b, 0x3d, 0x00, 0x9c, 0x26, 0x8d, 0x3e, 0xa2, 0xc1,
+ 0x90, 0xcb, 0x3b, 0x37, 0x53, 0xba, 0xd2, 0x77, 0x75, 0xf4, 0xfa, 0xb7, 0x1d, 0x49, 0x37, 0xa4,
+ 0x41, 0xcf, 0x89, 0xbf, 0x4b, 0x4e, 0xe0, 0xed, 0x2e, 0x9c, 0x12, 0xdd, 0x1b, 0x12, 0xa5, 0x38,
+ 0x24, 0x3f, 0xfb, 0x24, 0x8c, 0xc9, 0x35, 0xd1, 0x24, 0xf4, 0xdd, 0x27, 0x7c, 0xab, 0x8e, 0x60,
+ 0xfa, 0x2f, 0x9a, 0x86, 0x81, 0x6d, 0xc3, 0x6e, 0x13, 0xb6, 0xa4, 0x23, 0x98, 0xff, 0x78, 0xb2,
+ 0xf4, 0x56, 0x4d, 0xbf, 0x0e, 0x03, 0xf3, 0xf5, 0xba, 0xeb, 0xa0, 0xc7, 0x60, 0x88, 0x38, 0xc6,
+ 0x86, 0x4d, 0xea, 0xac, 0xe1, 0x70, 0x4c, 0x6f, 0x89, 0x17, 0xe3, 0x10, 0xae, 0xff, 0x70, 0x09,
+ 0x06, 0x59, 0x23, 0x1f, 0xfd, 0xa0, 0x06, 0xa7, 0xef, 0xb7, 0x37, 0x88, 0xe7, 0x90, 0x80, 0xf8,
+ 0x8b, 0x86, 0xbf, 0xb5, 0xe1, 0x1a, 0x5e, 0x5d, 0x2c, 0xcc, 0xcd, 0x22, 0x33, 0x72, 0x3b, 0x8d,
+ 0x8e, 0xef, 0xc1, 0x0c, 0x00, 0xce, 0x22, 0x8e, 0xb6, 0x61, 0xcc, 0x69, 0x58, 0xce, 0x4e, 0xd5,
+ 0x69, 0x78, 0xc4, 0xf7, 0xd9, 0xa0, 0x47, 0xaf, 0xbf, 0xb3, 0x48, 0x67, 0x56, 0x25, 0x3c, 0x0b,
+ 0x93, 0xfb, 0x7b, 0xe5, 0x31, 0xb9, 0x04, 0x2b, 0x74, 0xf4, 0xbf, 0xd6, 0xe0, 0xd4, 0x7c, 0xbd,
+ 0x69, 0xf9, 0x94, 0xd3, 0xae, 0xd9, 0xed, 0x86, 0xd5, 0xc5, 0xd6, 0x47, 0xef, 0x86, 0x41, 0xd3,
+ 0x75, 0x36, 0xad, 0x86, 0xe8, 0xe7, 0xeb, 0xe7, 0x38, 0xe7, 0x9a, 0x93, 0x39, 0x17, 0xeb, 0x9e,
+ 0xe0, 0x78, 0x73, 0xd8, 0x78, 0xb0, 0x14, 0x32, 0xf4, 0x05, 0xd8, 0xdf, 0x2b, 0x0f, 0x56, 0x18,
+ 0x02, 0x2c, 0x10, 0xa1, 0xab, 0x30, 0x5c, 0xb7, 0x7c, 0xbe, 0x98, 0x7d, 0x6c, 0x31, 0xc7, 0xf6,
+ 0xf7, 0xca, 0xc3, 0x8b, 0xa2, 0x0c, 0x47, 0x50, 0xb4, 0x0c, 0xd3, 0x74, 0x06, 0x79, 0xbb, 0x1a,
+ 0x31, 0x3d, 0x12, 0xd0, 0xae, 0xcd, 0xf4, 0xb3, 0xee, 0xce, 0xec, 0xef, 0x95, 0xa7, 0x6f, 0x67,
+ 0xc0, 0x71, 0x66, 0x2b, 0xfd, 0x06, 0x0c, 0xcf, 0xdb, 0xc4, 0xa3, 0x0c, 0x01, 0x3d, 0x09, 0x13,
+ 0xa4, 0x69, 0x58, 0x36, 0x26, 0x26, 0xb1, 0xb6, 0x89, 0xe7, 0xcf, 0x68, 0x57, 0xfa, 0xae, 0x8e,
+ 0x2c, 0xa0, 0xfd, 0xbd, 0xf2, 0xc4, 0x92, 0x02, 0xc1, 0x89, 0x9a, 0xfa, 0x07, 0x35, 0x18, 0x9d,
+ 0x6f, 0xd7, 0xad, 0x80, 0x8f, 0x0b, 0x79, 0x30, 0x6a, 0xd0, 0x9f, 0x6b, 0xae, 0x6d, 0x99, 0xbb,
+ 0x62, 0x73, 0x3d, 0x5d, 0xe8, 0x73, 0x8b, 0xd1, 0x2c, 0x9c, 0xda, 0xdf, 0x2b, 0x8f, 0x4a, 0x05,
+ 0x58, 0x26, 0xa2, 0x6f, 0x81, 0x0c, 0x43, 0xdf, 0x02, 0x63, 0x7c, 0xb8, 0x2b, 0x46, 0x0b, 0x93,
+ 0x4d, 0xd1, 0x87, 0x47, 0xa4, 0xb5, 0x0a, 0x09, 0xcd, 0xdd, 0xd9, 0x78, 0x81, 0x98, 0x01, 0x26,
+ 0x9b, 0xc4, 0x23, 0x8e, 0x49, 0xf8, 0xb6, 0xa9, 0x48, 0x8d, 0xb1, 0x82, 0x4a, 0xff, 0xfb, 0x1a,
+ 0x5c, 0x9a, 0x6f, 0x07, 0x5b, 0xae, 0x67, 0xbd, 0x44, 0xbc, 0x78, 0xba, 0x23, 0x0c, 0xe8, 0x1d,
+ 0x30, 0x61, 0x44, 0x15, 0x56, 0xe3, 0xed, 0x74, 0x56, 0x6c, 0xa7, 0x89, 0x79, 0x05, 0x8a, 0x13,
+ 0xb5, 0xd1, 0x75, 0x00, 0x3f, 0x5e, 0x5b, 0xc6, 0x03, 0x16, 0x90, 0x68, 0x0b, 0xd2, 0xaa, 0x4a,
+ 0xb5, 0xf4, 0x3f, 0xa6, 0x47, 0xe1, 0xb6, 0x61, 0xd9, 0xc6, 0x86, 0x65, 0x5b, 0xc1, 0xee, 0x73,
+ 0xae, 0x43, 0xba, 0xd8, 0xcd, 0x77, 0xe1, 0x5c, 0xdb, 0x31, 0x78, 0x3b, 0x9b, 0xac, 0xf0, 0xfd,
+ 0xbb, 0xbe, 0xdb, 0x22, 0x9c, 0x4b, 0x8e, 0x2c, 0x5c, 0xd8, 0xdf, 0x2b, 0x9f, 0xbb, 0x9b, 0x5d,
+ 0x05, 0xe7, 0xb5, 0xa5, 0xa7, 0x9e, 0x04, 0x7a, 0xc6, 0xb5, 0xdb, 0x4d, 0x81, 0xb5, 0x8f, 0x61,
+ 0x65, 0xa7, 0xde, 0xdd, 0xcc, 0x1a, 0x38, 0xa7, 0xa5, 0xfe, 0xd5, 0x12, 0x0c, 0x2e, 0x18, 0xe6,
+ 0xfd, 0x76, 0x0b, 0xbd, 0x0e, 0x86, 0x5b, 0x9e, 0xbb, 0x6d, 0xd5, 0x89, 0x27, 0xc6, 0x36, 0x29,
+ 0xc6, 0x36, 0xbc, 0x26, 0xca, 0x71, 0x54, 0x03, 0x59, 0x30, 0x11, 0xfe, 0x5f, 0xe9, 0xe1, 0xcb,
+ 0x65, 0x5f, 0xc2, 0x9a, 0x82, 0x08, 0x27, 0x10, 0x23, 0x1d, 0x06, 0x3d, 0xd2, 0xa0, 0x47, 0x5d,
+ 0x1f, 0xeb, 0x16, 0xfb, 0xda, 0x31, 0x2b, 0xc1, 0x02, 0x82, 0xd6, 0x61, 0x84, 0xaf, 0x1b, 0xdd,
+ 0x97, 0xfd, 0xf9, 0xfb, 0xb2, 0x16, 0x56, 0x12, 0xfb, 0x72, 0x4a, 0x0c, 0x71, 0x24, 0x02, 0xe0,
+ 0x18, 0x11, 0x7a, 0x2f, 0x4c, 0x98, 0x1e, 0xa9, 0x13, 0x27, 0xb0, 0x0c, 0xdb, 0xa7, 0xa8, 0x07,
+ 0xba, 0xdf, 0xf2, 0x6c, 0x68, 0x15, 0xa5, 0x39, 0x4e, 0xa0, 0xd3, 0xbf, 0x54, 0x82, 0x31, 0x3e,
+ 0xfd, 0x0b, 0x6d, 0xf3, 0x3e, 0x09, 0xd0, 0xb7, 0xc3, 0x30, 0x95, 0x1a, 0xeb, 0x46, 0x60, 0x88,
+ 0xcf, 0xeb, 0x9b, 0x72, 0x27, 0x94, 0x7d, 0xd9, 0xb4, 0x76, 0x4c, 0x7d, 0x85, 0x04, 0x46, 0xbc,
+ 0xab, 0xe3, 0x32, 0x1c, 0x61, 0x45, 0x9b, 0xd0, 0xef, 0xb7, 0x88, 0x29, 0x96, 0x6b, 0xb1, 0x08,
+ 0x03, 0x91, 0x7b, 0x5c, 0x6b, 0x11, 0x33, 0xfe, 0x08, 0xe8, 0x2f, 0xcc, 0xf0, 0x23, 0x07, 0x06,
+ 0xfd, 0xc0, 0x08, 0xda, 0x3e, 0x5b, 0xb5, 0xd1, 0xeb, 0x37, 0x7a, 0xa6, 0xc4, 0xb0, 0x2d, 0x4c,
+ 0x08, 0x5a, 0x83, 0xfc, 0x37, 0x16, 0x54, 0xf4, 0xff, 0xa8, 0xc1, 0xa4, 0x5c, 0x7d, 0xd9, 0xf2,
+ 0x03, 0xf4, 0xad, 0xa9, 0xe9, 0x9c, 0xeb, 0x6e, 0x3a, 0x69, 0x6b, 0x36, 0x99, 0xd1, 0x37, 0x10,
+ 0x96, 0x48, 0x53, 0x49, 0x60, 0xc0, 0x0a, 0x48, 0x33, 0x94, 0x7d, 0xde, 0xd9, 0xeb, 0x08, 0x17,
+ 0xc6, 0x05, 0xb1, 0x81, 0x2a, 0x45, 0x8b, 0x39, 0x76, 0xfd, 0xdb, 0x61, 0x5a, 0xae, 0x15, 0x7e,
+ 0x2d, 0x94, 0x11, 0x05, 0xbb, 0xad, 0x14, 0x23, 0xa2, 0x1f, 0x36, 0x66, 0x10, 0xf4, 0xda, 0xe8,
+ 0xcb, 0xe1, 0xfc, 0x2e, 0x9a, 0x3b, 0xf5, 0xeb, 0xd1, 0xff, 0x43, 0x9f, 0x3a, 0x77, 0x74, 0x19,
+ 0xd1, 0x76, 0x82, 0x1f, 0x8c, 0x5e, 0xbf, 0xd5, 0xeb, 0x00, 0xc3, 0xae, 0x7f, 0xbd, 0x70, 0x16,
+ 0x85, 0x6b, 0xf4, 0x1d, 0x15, 0xd7, 0xb8, 0x0a, 0xc3, 0x3e, 0x21, 0x75, 0x49, 0x86, 0x60, 0x92,
+ 0x47, 0x4d, 0x94, 0xe1, 0x08, 0x7a, 0xfc, 0xfc, 0xe5, 0x73, 0xfd, 0x80, 0xd2, 0xdf, 0x90, 0x3c,
+ 0xc5, 0xbc, 0x44, 0x2c, 0x70, 0x2f, 0x53, 0x2c, 0x3e, 0xc7, 0x04, 0x62, 0xf4, 0x12, 0x8c, 0xdb,
+ 0x86, 0x1f, 0xdc, 0x69, 0xd1, 0x3b, 0x66, 0xb8, 0x13, 0x47, 0xaf, 0xcf, 0x17, 0xd9, 0x4a, 0xcb,
+ 0x32, 0xa2, 0x85, 0xa9, 0xfd, 0xbd, 0xf2, 0xb8, 0x52, 0x84, 0x55, 0x52, 0xe8, 0x05, 0x18, 0xa1,
+ 0x05, 0x4b, 0x9e, 0xe7, 0x7a, 0x62, 0x79, 0x9f, 0x2a, 0x4a, 0x97, 0x21, 0xe1, 0x77, 0xde, 0xe8,
+ 0x27, 0x8e, 0xd1, 0xa3, 0x77, 0x01, 0x72, 0x37, 0x98, 0xd6, 0xa1, 0x7e, 0x93, 0x5f, 0xa8, 0xe9,
+ 0x60, 0xe9, 0xf2, 0xf7, 0x2d, 0xcc, 0x8a, 0xed, 0x82, 0xee, 0xa4, 0x6a, 0xe0, 0x8c, 0x56, 0xe8,
+ 0x3e, 0xa0, 0xe8, 0x52, 0x1e, 0xed, 0xb0, 0x4e, 0x5b, 0x23, 0xb9, 0x3f, 0xcf, 0x52, 0x62, 0x37,
+ 0x53, 0x28, 0x70, 0x06, 0x5a, 0xfd, 0x57, 0x4a, 0x30, 0xca, 0xb7, 0x08, 0xbf, 0x38, 0x1d, 0xff,
+ 0x09, 0x44, 0x94, 0x13, 0xa8, 0x52, 0x9c, 0xa9, 0xb0, 0x0e, 0xe7, 0x1e, 0x40, 0xcd, 0xc4, 0x01,
+ 0xb4, 0xd4, 0x2b, 0xa1, 0xce, 0xe7, 0xcf, 0xef, 0x6b, 0x70, 0x4a, 0xaa, 0x7d, 0x02, 0xc7, 0x4f,
+ 0x5d, 0x3d, 0x7e, 0x9e, 0xee, 0x71, 0x7c, 0x39, 0xa7, 0x8f, 0xab, 0x0c, 0x8b, 0x9d, 0x0c, 0xd7,
+ 0x01, 0x36, 0x18, 0x3b, 0x91, 0xc4, 0xf0, 0x68, 0xc9, 0x17, 0x22, 0x08, 0x96, 0x6a, 0x29, 0x4c,
+ 0xb1, 0xd4, 0x89, 0x29, 0xea, 0xff, 0xa5, 0x0f, 0xa6, 0x52, 0xd3, 0x9e, 0xe6, 0x23, 0xda, 0xd7,
+ 0x88, 0x8f, 0x94, 0xbe, 0x16, 0x7c, 0xa4, 0xaf, 0x10, 0x1f, 0xe9, 0xfe, 0x20, 0xf2, 0x00, 0x35,
+ 0xad, 0x06, 0x6f, 0x56, 0x0b, 0x0c, 0x2f, 0x58, 0xb7, 0x9a, 0x44, 0x70, 0x9c, 0x6f, 0xec, 0x6e,
+ 0xcb, 0xd2, 0x16, 0x9c, 0xf1, 0xac, 0xa4, 0x30, 0xe1, 0x0c, 0xec, 0xfa, 0x77, 0x95, 0x60, 0x68,
+ 0xc1, 0xf0, 0x59, 0x4f, 0xdf, 0x0f, 0x63, 0x02, 0x75, 0xb5, 0x69, 0x34, 0x48, 0x2f, 0xaa, 0x13,
+ 0x81, 0x72, 0x45, 0x42, 0xc7, 0x6f, 0x9f, 0x72, 0x09, 0x56, 0xc8, 0xa1, 0x5d, 0x18, 0x6d, 0xc6,
+ 0x37, 0x2d, 0xb1, 0xc4, 0x37, 0x7a, 0xa7, 0x4e, 0xb1, 0xf1, 0x2b, 0xb6, 0x54, 0x80, 0x65, 0x5a,
+ 0xfa, 0xf3, 0x70, 0x3a, 0xa3, 0xc7, 0x5d, 0x5c, 0x32, 0x5f, 0x03, 0x43, 0xdb, 0xc4, 0xf3, 0x63,
+ 0xe1, 0x6e, 0x74, 0x7f, 0xaf, 0x3c, 0xf4, 0x0c, 0x2f, 0xc2, 0x21, 0x4c, 0x7f, 0x0b, 0x15, 0x00,
+ 0x92, 0x7d, 0xea, 0x46, 0x19, 0x39, 0x00, 0x50, 0x99, 0xc7, 0x6e, 0xc0, 0xb7, 0xd2, 0xd3, 0x30,
+ 0xd0, 0xda, 0x32, 0xfc, 0xb0, 0xc5, 0x63, 0x21, 0xab, 0x58, 0xa3, 0x85, 0x0f, 0xf7, 0xca, 0x33,
+ 0xb2, 0x20, 0x22, 0x1a, 0x31, 0x18, 0xe6, 0xed, 0xe8, 0x0e, 0xa3, 0x9b, 0xbc, 0xe2, 0x36, 0x5b,
+ 0x36, 0xa1, 0x50, 0xb6, 0xc3, 0x4a, 0xc5, 0x76, 0xd8, 0x72, 0x0a, 0x13, 0xce, 0xc0, 0x1e, 0xd2,
+ 0xac, 0x3a, 0x56, 0x60, 0x19, 0x11, 0xcd, 0xbe, 0xe2, 0x34, 0x55, 0x4c, 0x38, 0x03, 0x3b, 0xfa,
+ 0x98, 0x06, 0xb3, 0x6a, 0xf1, 0x0d, 0xcb, 0xb1, 0xfc, 0x2d, 0x52, 0x67, 0xc4, 0xfb, 0x0f, 0x4d,
+ 0xfc, 0xf2, 0xfe, 0x5e, 0x79, 0x76, 0x39, 0x17, 0x23, 0xee, 0x40, 0x0d, 0x7d, 0x9f, 0x06, 0x17,
+ 0x12, 0xf3, 0xe2, 0x59, 0x8d, 0x06, 0xf1, 0x44, 0x6f, 0x0e, 0xff, 0x81, 0x97, 0xf7, 0xf7, 0xca,
+ 0x17, 0x96, 0xf3, 0x51, 0xe2, 0x4e, 0xf4, 0xd0, 0xe7, 0x35, 0x38, 0xdb, 0x22, 0x4e, 0xdd, 0x72,
+ 0x1a, 0xf7, 0x5c, 0xef, 0x3e, 0xf1, 0x7c, 0xec, 0xda, 0xb6, 0xdb, 0x0e, 0xfc, 0x99, 0x41, 0x76,
+ 0x86, 0x55, 0x8b, 0x7c, 0x73, 0x6b, 0x59, 0x18, 0x17, 0x2e, 0x8b, 0x2d, 0x7a, 0x36, 0x13, 0xec,
+ 0xe3, 0x9c, 0x8e, 0xe8, 0x5f, 0xd4, 0xa0, 0xaf, 0x82, 0xab, 0xe8, 0x71, 0xe5, 0x13, 0x39, 0x27,
+ 0x7f, 0x22, 0x0f, 0xf7, 0xca, 0x43, 0x15, 0x5c, 0x95, 0x3e, 0xc6, 0xef, 0xd3, 0x60, 0xca, 0x74,
+ 0x9d, 0xc0, 0xa0, 0x73, 0x87, 0xb9, 0xac, 0x1c, 0x9e, 0xcb, 0x85, 0xae, 0xd8, 0x95, 0x04, 0xb2,
+ 0x58, 0x31, 0x9f, 0x84, 0xf8, 0x38, 0x4d, 0x59, 0xff, 0x71, 0x0d, 0xa6, 0x2b, 0x46, 0x4b, 0xa8,
+ 0xad, 0x16, 0xc9, 0xa6, 0x45, 0x37, 0x48, 0x37, 0xaf, 0x10, 0x68, 0x0b, 0x06, 0x99, 0x66, 0xdc,
+ 0xef, 0x45, 0x43, 0x10, 0xd3, 0x7e, 0x86, 0xe1, 0xe2, 0x3a, 0x1b, 0xfe, 0x3f, 0x16, 0xf8, 0xf5,
+ 0x5f, 0x28, 0xc1, 0x78, 0x5c, 0xb1, 0x46, 0x02, 0xf4, 0xa3, 0x1a, 0x8c, 0x99, 0x61, 0x89, 0x45,
+ 0xb8, 0xba, 0x74, 0xf4, 0x7a, 0xad, 0xb7, 0x2e, 0xd4, 0x48, 0x10, 0xff, 0xb2, 0x88, 0x78, 0x4a,
+ 0x78, 0x54, 0x8c, 0x7d, 0x4c, 0x06, 0x3d, 0x4c, 0xfc, 0xc6, 0x4a, 0x77, 0x66, 0x3f, 0xac, 0xc1,
+ 0x54, 0x0a, 0x53, 0xc6, 0x53, 0xc3, 0x73, 0xf2, 0x53, 0xc3, 0x11, 0x4d, 0xa1, 0xfc, 0x60, 0xf1,
+ 0x14, 0x4c, 0x26, 0xc1, 0xa8, 0x1c, 0x4a, 0x83, 0x5c, 0xc5, 0x3c, 0x92, 0x14, 0xe4, 0x9e, 0x1c,
+ 0xfe, 0x07, 0x9f, 0x2b, 0xbf, 0xea, 0x3b, 0xff, 0xf0, 0xca, 0xab, 0x98, 0xd6, 0xa9, 0x62, 0xbb,
+ 0xed, 0xfa, 0x9a, 0xe7, 0x6e, 0x5a, 0x36, 0x79, 0x65, 0x68, 0x9d, 0xe4, 0x1e, 0x1f, 0xaf, 0xd6,
+ 0x49, 0xa1, 0x74, 0xb0, 0xd6, 0x49, 0xae, 0xfe, 0x0a, 0xd1, 0x3a, 0xc9, 0x5d, 0xce, 0x91, 0xfb,
+ 0xdf, 0x03, 0x67, 0xe4, 0x5a, 0xb1, 0x22, 0xfe, 0x0a, 0xf4, 0xdf, 0xb7, 0x9c, 0x7a, 0x92, 0x85,
+ 0xdc, 0xb6, 0x9c, 0x3a, 0x66, 0x90, 0x88, 0xc9, 0x94, 0x72, 0xa5, 0x8b, 0xbd, 0x11, 0x75, 0xda,
+ 0xd8, 0xb5, 0xe2, 0x2a, 0x0c, 0x9b, 0xc6, 0x42, 0xdb, 0xa9, 0xdb, 0x11, 0x7f, 0xa2, 0x53, 0x50,
+ 0x99, 0xe7, 0x65, 0x38, 0x82, 0xa2, 0x97, 0x00, 0xe2, 0x37, 0xaf, 0x5e, 0xc4, 0xb5, 0xf8, 0x39,
+ 0xad, 0x46, 0x82, 0xc0, 0x72, 0x1a, 0x7e, 0xbc, 0x8f, 0x63, 0x18, 0x96, 0xa8, 0xa1, 0xf7, 0xc3,
+ 0xb8, 0x2c, 0x3b, 0x72, 0xe5, 0x7b, 0xc1, 0x65, 0x50, 0x84, 0xd4, 0x33, 0x82, 0xf0, 0xb8, 0x5c,
+ 0xea, 0x63, 0x95, 0x1a, 0xda, 0x8d, 0x24, 0x65, 0xae, 0xfa, 0xef, 0x2f, 0x7e, 0xf7, 0x93, 0x85,
+ 0xd4, 0xe9, 0x90, 0x1b, 0x2a, 0x4f, 0x11, 0x0a, 0xa9, 0x0c, 0xc5, 0xdc, 0xc0, 0x71, 0x29, 0xe6,
+ 0x08, 0x0c, 0x71, 0xd5, 0x64, 0x28, 0x18, 0x3c, 0x59, 0x64, 0x80, 0x5c, 0xcb, 0x19, 0x3f, 0xe2,
+ 0xf2, 0xdf, 0x3e, 0x0e, 0x71, 0xa3, 0x6d, 0x18, 0xa3, 0x57, 0xa0, 0x1a, 0xb1, 0x89, 0x19, 0xb8,
+ 0xde, 0xcc, 0x50, 0xf1, 0x47, 0xd2, 0x9a, 0x84, 0x87, 0xdf, 0x37, 0xe4, 0x12, 0xac, 0xd0, 0x89,
+ 0x34, 0xb7, 0xc3, 0xb9, 0x9a, 0xdb, 0x36, 0x8c, 0x6e, 0x4b, 0x0f, 0x3c, 0x23, 0x6c, 0x12, 0xde,
+ 0x51, 0xa4, 0x63, 0xf1, 0x6b, 0xcf, 0xc2, 0x69, 0x41, 0x68, 0x54, 0x7e, 0x19, 0x92, 0xe9, 0xa0,
+ 0x0d, 0x18, 0xda, 0xe0, 0xb7, 0x85, 0x19, 0x60, 0x73, 0xf1, 0xf6, 0x1e, 0x2e, 0x41, 0xfc, 0x46,
+ 0x22, 0x7e, 0xe0, 0x10, 0x31, 0x7a, 0x1e, 0x06, 0x6d, 0xab, 0x69, 0x05, 0xfe, 0xcc, 0x28, 0x23,
+ 0x51, 0x68, 0x69, 0x97, 0x19, 0x06, 0x2e, 0x56, 0xf0, 0xff, 0xb1, 0xc0, 0x8a, 0x3e, 0x94, 0x14,
+ 0x22, 0xc6, 0xd8, 0xe4, 0xdd, 0xea, 0xed, 0x10, 0x8e, 0x65, 0xa8, 0xf8, 0x5b, 0xc9, 0x97, 0x14,
+ 0xf4, 0x7f, 0x5f, 0x02, 0x94, 0x3e, 0x46, 0xd0, 0x8f, 0x68, 0x80, 0x62, 0x5e, 0x22, 0x2e, 0x6b,
+ 0xa1, 0x98, 0xf3, 0xae, 0x22, 0x3d, 0x5c, 0xda, 0x69, 0x59, 0x1e, 0x7b, 0xd5, 0xe3, 0xc8, 0xc4,
+ 0x79, 0x15, 0xa9, 0x0a, 0x6e, 0xa7, 0xa8, 0xe1, 0x8c, 0x1e, 0xa0, 0x1f, 0xd3, 0x60, 0x5a, 0x66,
+ 0x34, 0x51, 0xd7, 0xf8, 0x21, 0xb3, 0xd2, 0x2b, 0x77, 0x53, 0x7b, 0x77, 0x51, 0xf4, 0x6e, 0x3a,
+ 0xa3, 0x8a, 0x8f, 0x33, 0x3b, 0xa2, 0xff, 0xeb, 0x71, 0x98, 0xaa, 0xd8, 0x6d, 0x3f, 0x20, 0xde,
+ 0xbc, 0x30, 0x2e, 0x23, 0x1e, 0x5d, 0xec, 0xb3, 0xec, 0xdf, 0x45, 0xf7, 0x81, 0xb3, 0x48, 0x6c,
+ 0x63, 0x77, 0x7e, 0x93, 0xd6, 0xa8, 0xd7, 0x0f, 0x77, 0xf2, 0x2e, 0xb6, 0x85, 0x36, 0x88, 0x3d,
+ 0xa2, 0xd6, 0x32, 0x31, 0xe2, 0x1c, 0x4a, 0xe8, 0x7b, 0x35, 0x38, 0x9f, 0x01, 0x5a, 0x24, 0x36,
+ 0x09, 0x42, 0x19, 0xf0, 0xb0, 0xfd, 0xb8, 0xb4, 0xbf, 0x57, 0x3e, 0x5f, 0xcb, 0x43, 0x8a, 0xf3,
+ 0xe9, 0xa1, 0x4f, 0x68, 0x30, 0x9b, 0x01, 0xbd, 0x61, 0x58, 0x76, 0xdb, 0x0b, 0xaf, 0xbf, 0x87,
+ 0xed, 0x0e, 0xbb, 0x85, 0xd6, 0x72, 0xb1, 0xe2, 0x0e, 0x14, 0xd1, 0x07, 0xe0, 0x4c, 0x04, 0xbd,
+ 0xeb, 0x38, 0x84, 0xd4, 0x95, 0xcb, 0xf0, 0x61, 0xbb, 0x72, 0x7e, 0x7f, 0xaf, 0x7c, 0xa6, 0x96,
+ 0x85, 0x10, 0x67, 0xd3, 0x41, 0x0d, 0xb8, 0x14, 0x03, 0x02, 0xcb, 0xb6, 0x5e, 0xe2, 0xf7, 0xf5,
+ 0x2d, 0x8f, 0xf8, 0x5b, 0xae, 0x5d, 0x67, 0xe7, 0x98, 0xb6, 0xf0, 0xea, 0xfd, 0xbd, 0xf2, 0xa5,
+ 0x5a, 0xa7, 0x8a, 0xb8, 0x33, 0x1e, 0x54, 0x87, 0x31, 0xdf, 0x34, 0x9c, 0xaa, 0x13, 0x10, 0x6f,
+ 0xdb, 0xb0, 0x67, 0x06, 0x0b, 0x0d, 0x90, 0x9f, 0x1e, 0x12, 0x1e, 0xac, 0x60, 0x45, 0x6f, 0x85,
+ 0x61, 0xb2, 0xd3, 0x32, 0x9c, 0x3a, 0xe1, 0x27, 0xd6, 0xc8, 0xc2, 0x45, 0x2a, 0x27, 0x2d, 0x89,
+ 0x32, 0x7a, 0x87, 0x09, 0xff, 0x5f, 0x71, 0xeb, 0x04, 0x47, 0xb5, 0xd1, 0xfb, 0xe8, 0x47, 0xbe,
+ 0xb3, 0xea, 0xd6, 0x09, 0x3b, 0x7f, 0xfd, 0x50, 0x25, 0x32, 0x5c, 0xa8, 0x9f, 0x33, 0xfc, 0x0b,
+ 0x4e, 0xe3, 0xc3, 0x99, 0x54, 0xe8, 0x32, 0x34, 0x8d, 0x9d, 0x9b, 0x9e, 0x61, 0x92, 0xcd, 0xb6,
+ 0xbd, 0x4e, 0xbc, 0xa6, 0xe5, 0x70, 0x9d, 0x20, 0x31, 0x5d, 0xa7, 0x4e, 0x4f, 0x39, 0xed, 0xea,
+ 0x00, 0x5f, 0x86, 0x95, 0x4e, 0x15, 0x71, 0x67, 0x3c, 0xe8, 0x4d, 0x30, 0x66, 0x35, 0x1c, 0xd7,
+ 0x23, 0xeb, 0x86, 0xe5, 0x04, 0xfe, 0x0c, 0xb0, 0x1b, 0x11, 0x9b, 0xd6, 0xaa, 0x54, 0x8e, 0x95,
+ 0x5a, 0x68, 0x1b, 0x90, 0x43, 0x1e, 0xac, 0xb9, 0x75, 0xb6, 0x05, 0xee, 0xb6, 0xd8, 0x46, 0x16,
+ 0x67, 0xd4, 0x61, 0xa7, 0x86, 0x69, 0x8c, 0x56, 0x53, 0xd8, 0x70, 0x06, 0x05, 0x74, 0x03, 0x50,
+ 0xd3, 0xd8, 0x59, 0x6a, 0xb6, 0x82, 0xdd, 0x85, 0xb6, 0x7d, 0x5f, 0x70, 0x8d, 0x31, 0x36, 0x17,
+ 0x5c, 0x9f, 0x9a, 0x82, 0xe2, 0x8c, 0x16, 0xc8, 0x80, 0x0b, 0x7c, 0x3c, 0x8b, 0x06, 0x69, 0xba,
+ 0x8e, 0x4f, 0x02, 0x5f, 0xda, 0xa4, 0x33, 0xe3, 0xcc, 0x06, 0x8a, 0xe9, 0x6f, 0xaa, 0xf9, 0xd5,
+ 0x70, 0x27, 0x1c, 0xaa, 0x15, 0xe8, 0xc4, 0x01, 0x56, 0xa0, 0x4f, 0xc0, 0xb8, 0x1f, 0x18, 0x5e,
+ 0xd0, 0x6e, 0x89, 0x65, 0x38, 0xc5, 0x96, 0x81, 0xa9, 0xdb, 0x6b, 0x32, 0x00, 0xab, 0xf5, 0xe8,
+ 0xf2, 0xf1, 0xdb, 0x95, 0x68, 0x37, 0x19, 0x2f, 0x5f, 0x4d, 0x2a, 0xc7, 0x4a, 0x2d, 0x74, 0x17,
+ 0xce, 0x35, 0x8d, 0x9d, 0xe8, 0xf3, 0x5d, 0x33, 0x3c, 0xc3, 0xb6, 0x89, 0x6d, 0xf9, 0xcd, 0x99,
+ 0x29, 0xd6, 0x53, 0x66, 0x74, 0xb3, 0x92, 0x5d, 0x05, 0xe7, 0xb5, 0x15, 0x66, 0xa1, 0x8b, 0x9e,
+ 0x61, 0x29, 0x28, 0x91, 0x62, 0x16, 0x9a, 0x04, 0xe3, 0xac, 0x36, 0xfa, 0xff, 0xee, 0x87, 0x99,
+ 0xd4, 0x09, 0x16, 0xda, 0x76, 0x1e, 0xc8, 0xa3, 0xb4, 0x23, 0xe2, 0x51, 0x2d, 0xb8, 0x12, 0x55,
+ 0xb8, 0xd9, 0x6a, 0x67, 0xd2, 0x2a, 0x31, 0x5a, 0x8f, 0xee, 0xef, 0x95, 0xaf, 0xd4, 0x0e, 0xa8,
+ 0x8b, 0x0f, 0xc4, 0x96, 0xcf, 0xff, 0xfb, 0x4e, 0x88, 0xff, 0xbf, 0x0f, 0xa6, 0x25, 0x80, 0x47,
+ 0x8c, 0xfa, 0x6e, 0x0f, 0xe7, 0x0f, 0x63, 0x7b, 0xb5, 0x0c, 0x7c, 0x38, 0x93, 0x4a, 0x2e, 0xd3,
+ 0x1d, 0x38, 0x09, 0xa6, 0xab, 0xef, 0xf5, 0xc1, 0x48, 0xc5, 0x75, 0xea, 0x5c, 0xfd, 0xf7, 0x06,
+ 0xc5, 0x64, 0xe4, 0x92, 0x7c, 0xf1, 0x78, 0xb8, 0x57, 0x1e, 0x8f, 0x2a, 0x4a, 0x37, 0x91, 0xb7,
+ 0x45, 0x1a, 0x15, 0x7e, 0x9d, 0x7f, 0xb5, 0xaa, 0x09, 0x79, 0xb8, 0x57, 0x3e, 0x15, 0x35, 0x53,
+ 0x95, 0x23, 0x94, 0xa3, 0xda, 0x86, 0x1f, 0xac, 0x7b, 0x86, 0xe3, 0x5b, 0x3d, 0xe8, 0xdf, 0x23,
+ 0x61, 0x76, 0x39, 0x85, 0x0d, 0x67, 0x50, 0x40, 0x2f, 0xc0, 0x04, 0x2d, 0xbd, 0xdb, 0xaa, 0x1b,
+ 0x01, 0x29, 0xa8, 0x76, 0x8f, 0xcc, 0x0a, 0x97, 0x15, 0x4c, 0x38, 0x81, 0x99, 0x9b, 0xd8, 0x18,
+ 0xbe, 0xeb, 0xb0, 0xf5, 0x54, 0x4c, 0x6c, 0x68, 0x29, 0x16, 0x50, 0xf4, 0x18, 0x0c, 0x35, 0x89,
+ 0xef, 0x1b, 0x0d, 0xc2, 0xa4, 0x82, 0x91, 0xf8, 0x56, 0xba, 0xc2, 0x8b, 0x71, 0x08, 0x47, 0xaf,
+ 0x83, 0x01, 0xd3, 0xad, 0x13, 0x7f, 0x66, 0x88, 0x31, 0x3e, 0x7a, 0x06, 0x0c, 0x54, 0x68, 0xc1,
+ 0xc3, 0xbd, 0xf2, 0x08, 0x7b, 0x25, 0xa4, 0xbf, 0x30, 0xaf, 0xa4, 0xff, 0x98, 0x06, 0x93, 0x49,
+ 0x9d, 0x70, 0x17, 0xa6, 0x41, 0x27, 0x67, 0x65, 0xa3, 0x7f, 0x52, 0x83, 0x31, 0xda, 0x43, 0xcf,
+ 0xb5, 0xd7, 0x6c, 0xc3, 0x21, 0xe8, 0x7b, 0x34, 0x98, 0xdc, 0xb2, 0x1a, 0x5b, 0xb2, 0x69, 0xa5,
+ 0x10, 0xd7, 0x0b, 0x69, 0x06, 0x6f, 0x25, 0x70, 0x2d, 0x4c, 0xef, 0xef, 0x95, 0x27, 0x93, 0xa5,
+ 0x38, 0x45, 0x53, 0xff, 0x93, 0x12, 0x9c, 0x93, 0x7b, 0x36, 0x1f, 0x7b, 0xad, 0xa0, 0xdf, 0xd7,
+ 0x00, 0x9a, 0x96, 0x33, 0x6f, 0xdb, 0xee, 0x03, 0x66, 0x0f, 0x4e, 0xef, 0x41, 0xef, 0x29, 0xaa,
+ 0xcb, 0xcf, 0xa0, 0x30, 0xb7, 0x12, 0x61, 0xe7, 0x1a, 0xe9, 0x67, 0x43, 0xcd, 0x53, 0x0c, 0x78,
+ 0xb8, 0x57, 0x2e, 0xa7, 0x5d, 0x65, 0xe6, 0xb0, 0xf0, 0x47, 0x59, 0xb6, 0xfc, 0xe0, 0x43, 0x7f,
+ 0xdc, 0xb1, 0x0a, 0x7f, 0x88, 0x8f, 0x07, 0x32, 0xdb, 0x84, 0x53, 0x09, 0xc2, 0x19, 0x0a, 0xec,
+ 0x45, 0x55, 0x81, 0xdd, 0x91, 0x49, 0xcd, 0x85, 0xde, 0x31, 0x73, 0xef, 0x6e, 0x1b, 0x4e, 0x40,
+ 0x67, 0x5a, 0x52, 0x55, 0xff, 0x51, 0x09, 0xa6, 0xc5, 0x04, 0xd8, 0xf4, 0x8a, 0xd2, 0xb2, 0xdd,
+ 0xdd, 0x26, 0x71, 0x4e, 0xc2, 0xd2, 0x31, 0xfc, 0x08, 0x4a, 0xb9, 0x1f, 0x41, 0x33, 0xf5, 0x11,
+ 0xf4, 0x15, 0xf9, 0x08, 0x22, 0x5e, 0x71, 0x80, 0x56, 0x0b, 0xc3, 0x59, 0xcb, 0xa1, 0x1d, 0xbd,
+ 0xc9, 0x36, 0x4c, 0x6c, 0xe5, 0xcc, 0xf8, 0xd3, 0x30, 0xbf, 0x7b, 0x56, 0x33, 0x6b, 0xe0, 0x9c,
+ 0x96, 0xfa, 0x9f, 0x6b, 0x30, 0x93, 0x35, 0xbf, 0x27, 0xa0, 0x88, 0x6e, 0xaa, 0x8a, 0xe8, 0x5b,
+ 0x3d, 0x7c, 0x1b, 0x4a, 0xd7, 0x73, 0x14, 0xd2, 0x7f, 0x56, 0x82, 0xb3, 0x71, 0xf5, 0xaa, 0xe3,
+ 0x07, 0x86, 0x6d, 0x73, 0xb9, 0xf4, 0xf8, 0xf7, 0x52, 0x4b, 0x79, 0xbf, 0x58, 0xed, 0x6d, 0xa8,
+ 0x72, 0xdf, 0x73, 0x5f, 0x32, 0x76, 0x12, 0x2f, 0x19, 0x6b, 0x47, 0x48, 0xb3, 0xf3, 0x9b, 0xc6,
+ 0x7f, 0xd3, 0x60, 0x36, 0xbb, 0xe1, 0x09, 0x6c, 0x2a, 0x57, 0xdd, 0x54, 0xef, 0x3a, 0xba, 0x51,
+ 0xe7, 0x6c, 0xab, 0x9f, 0x2b, 0xe5, 0x8d, 0x96, 0x3d, 0x4a, 0x6c, 0xc2, 0x29, 0x8f, 0x34, 0x2c,
+ 0x3f, 0x10, 0x76, 0x36, 0x87, 0x73, 0x7b, 0x08, 0x9f, 0x8d, 0x4f, 0x61, 0x15, 0x07, 0x4e, 0x22,
+ 0x45, 0xab, 0x30, 0xe4, 0x13, 0x52, 0xa7, 0xf8, 0x4b, 0xdd, 0xe3, 0x8f, 0x84, 0x88, 0x1a, 0x6f,
+ 0x8b, 0x43, 0x24, 0xe8, 0x5b, 0x61, 0xbc, 0x1e, 0x7d, 0x51, 0x07, 0x98, 0xb7, 0x26, 0xb1, 0xb2,
+ 0x2b, 0xda, 0xa2, 0xdc, 0x1a, 0xab, 0xc8, 0xf4, 0xaf, 0x6a, 0x70, 0xb1, 0xd3, 0xde, 0x42, 0x2f,
+ 0x02, 0x98, 0xa1, 0x54, 0x18, 0xea, 0x37, 0x9f, 0x2a, 0xb8, 0x96, 0x1c, 0x4b, 0xfc, 0x81, 0x46,
+ 0x45, 0x3e, 0x96, 0x88, 0x64, 0x18, 0xb5, 0x96, 0x8e, 0xc9, 0xa8, 0x55, 0xff, 0xef, 0x9a, 0xcc,
+ 0x8a, 0xe4, 0xb5, 0x7d, 0xa5, 0xb1, 0x22, 0xb9, 0xef, 0x79, 0xac, 0x48, 0xff, 0xdd, 0x12, 0x5c,
+ 0xc9, 0x6e, 0x22, 0x9d, 0xe7, 0xef, 0x84, 0xc1, 0x16, 0x77, 0x4d, 0xe2, 0x5e, 0x1a, 0x57, 0x29,
+ 0x67, 0xe1, 0x8e, 0x43, 0x0f, 0xf7, 0xca, 0xb3, 0x59, 0x8c, 0x5e, 0xb8, 0x1c, 0x89, 0x76, 0xc8,
+ 0x4a, 0xbc, 0xc6, 0x70, 0xa1, 0xfd, 0x8d, 0x5d, 0x32, 0x17, 0x63, 0x83, 0xd8, 0x5d, 0x3f, 0xc0,
+ 0x7c, 0x50, 0x83, 0x09, 0x65, 0x47, 0xfb, 0x33, 0x03, 0x6c, 0x8f, 0x16, 0xb2, 0x27, 0x54, 0x3e,
+ 0x95, 0x58, 0x1a, 0x50, 0x8a, 0x7d, 0x9c, 0x20, 0x98, 0x60, 0xb3, 0xf2, 0xac, 0xbe, 0xe2, 0xd8,
+ 0xac, 0xdc, 0xf9, 0x1c, 0x36, 0xfb, 0xd9, 0x52, 0xde, 0x68, 0x19, 0x9b, 0x7d, 0x00, 0x23, 0xa1,
+ 0x18, 0x19, 0xb2, 0x8b, 0x1b, 0xbd, 0xf6, 0x89, 0xa3, 0x8b, 0x8d, 0xf5, 0xc3, 0x12, 0x1f, 0xc7,
+ 0xb4, 0xd0, 0x77, 0x6b, 0x00, 0xf1, 0xc2, 0x88, 0x8f, 0x6a, 0xfd, 0xe8, 0xa6, 0x43, 0x12, 0x6b,
+ 0x26, 0xe8, 0x27, 0x2d, 0x6d, 0x0a, 0x89, 0xae, 0xfe, 0xc3, 0x03, 0x80, 0xd2, 0x7d, 0xef, 0xee,
+ 0xad, 0xfd, 0x00, 0x21, 0xf7, 0x29, 0x38, 0xd5, 0xb0, 0xdd, 0x0d, 0xc3, 0xb6, 0x77, 0x85, 0x17,
+ 0xab, 0xf0, 0x87, 0x3c, 0x4d, 0x0f, 0xa6, 0x9b, 0x2a, 0x08, 0x27, 0xeb, 0xa2, 0x16, 0x4c, 0x7a,
+ 0x54, 0xd8, 0x34, 0x2d, 0x9b, 0xdd, 0x78, 0xdd, 0x76, 0x50, 0x50, 0x71, 0xc2, 0x6e, 0x65, 0x38,
+ 0x81, 0x0b, 0xa7, 0xb0, 0xa3, 0xd7, 0xc0, 0x50, 0xcb, 0xb3, 0x9a, 0x86, 0xb7, 0xcb, 0xee, 0xd4,
+ 0xc3, 0xfc, 0x1d, 0x71, 0x8d, 0x17, 0xe1, 0x10, 0x86, 0xde, 0x07, 0x23, 0xb6, 0xb5, 0x49, 0xcc,
+ 0x5d, 0xd3, 0x26, 0x42, 0xd3, 0x7e, 0xe7, 0x68, 0xb6, 0xcc, 0x72, 0x88, 0x56, 0xd8, 0xe9, 0x86,
+ 0x3f, 0x71, 0x4c, 0x10, 0x55, 0xe1, 0xf4, 0x03, 0x66, 0x39, 0x66, 0x13, 0xdf, 0xaf, 0xb5, 0x5b,
+ 0x2d, 0xd7, 0x0b, 0x48, 0x9d, 0xe9, 0xe3, 0x87, 0xb9, 0x5e, 0xf0, 0x5e, 0x1a, 0x8c, 0xb3, 0xda,
+ 0xa0, 0xa7, 0x00, 0x8c, 0x76, 0xe0, 0xf2, 0x09, 0x9f, 0x19, 0x66, 0x97, 0xfe, 0x4b, 0x74, 0xaf,
+ 0xcc, 0x47, 0xa5, 0x0f, 0xf7, 0xca, 0xa3, 0x42, 0x75, 0xc8, 0x56, 0x56, 0x6a, 0x80, 0xde, 0x03,
+ 0xd3, 0x26, 0x07, 0x55, 0xdc, 0x66, 0xcb, 0x08, 0x2c, 0x71, 0xa1, 0x1e, 0x61, 0x88, 0xbe, 0x61,
+ 0x7f, 0xaf, 0x3c, 0x5d, 0xc9, 0x80, 0x27, 0x51, 0x66, 0x22, 0xd1, 0x3f, 0x56, 0x82, 0x0b, 0x1d,
+ 0x26, 0x08, 0x61, 0xfa, 0xdd, 0x8a, 0xf5, 0x13, 0xbb, 0xf4, 0x4d, 0xfc, 0x5b, 0x13, 0x85, 0x0f,
+ 0xf7, 0xca, 0x8f, 0x74, 0x40, 0x50, 0xa3, 0x9f, 0x09, 0x69, 0xec, 0xe2, 0x18, 0x0d, 0xaa, 0xc2,
+ 0x60, 0x3d, 0x7e, 0x3a, 0x1b, 0x59, 0x78, 0x03, 0x3d, 0x49, 0xb8, 0x92, 0xbb, 0x5b, 0x6c, 0x02,
+ 0x01, 0x5a, 0x86, 0x21, 0x6e, 0x79, 0x4c, 0xc4, 0xa9, 0x74, 0x9d, 0x69, 0x5c, 0x78, 0x51, 0xb7,
+ 0xc8, 0x42, 0x14, 0xfa, 0x5f, 0x69, 0x30, 0x54, 0x71, 0x3d, 0xb2, 0xb8, 0x5a, 0x43, 0xbb, 0x30,
+ 0x2a, 0xc5, 0xb8, 0x10, 0x1c, 0xba, 0x20, 0xcb, 0x62, 0x18, 0x25, 0xcd, 0x40, 0xe8, 0x95, 0x1b,
+ 0x15, 0x60, 0x99, 0x16, 0x7a, 0x91, 0xce, 0xf9, 0x03, 0xcf, 0x0a, 0x28, 0xe1, 0x5e, 0x0c, 0xaa,
+ 0x38, 0x61, 0x1c, 0xe2, 0xe2, 0xbb, 0x3d, 0xfa, 0x89, 0x63, 0x2a, 0xfa, 0x1a, 0xe5, 0x4e, 0xc9,
+ 0x6e, 0xa2, 0x27, 0xa1, 0xbf, 0xe9, 0xd6, 0xc3, 0x75, 0x7f, 0x6d, 0xc8, 0x7b, 0x56, 0xdc, 0x3a,
+ 0x9d, 0xdb, 0xb3, 0xe9, 0x16, 0xec, 0x39, 0x8a, 0xb5, 0xd1, 0x57, 0x61, 0x32, 0x49, 0x1f, 0x3d,
+ 0x09, 0x13, 0xa6, 0xdb, 0x6c, 0xba, 0x4e, 0xad, 0xbd, 0xb9, 0x69, 0xed, 0x10, 0xc5, 0x5d, 0xba,
+ 0xa2, 0x40, 0x70, 0xa2, 0xa6, 0xfe, 0x19, 0x0d, 0xfa, 0xe8, 0xba, 0xe8, 0x30, 0x58, 0x77, 0x9b,
+ 0x86, 0xe5, 0x88, 0x5e, 0x31, 0x0b, 0x81, 0x45, 0x56, 0x82, 0x05, 0x04, 0xb5, 0x60, 0x24, 0x14,
+ 0xe8, 0x7a, 0x72, 0x9e, 0x58, 0x5c, 0xad, 0x45, 0x1e, 0x6d, 0xd1, 0x29, 0x13, 0x96, 0xf8, 0x38,
+ 0x26, 0xa2, 0x1b, 0x30, 0xb5, 0xb8, 0x5a, 0xab, 0x3a, 0xa6, 0xdd, 0xae, 0x93, 0xa5, 0x1d, 0xf6,
+ 0x87, 0xf2, 0x39, 0x8b, 0x97, 0x88, 0x71, 0x32, 0x3e, 0x27, 0x2a, 0xe1, 0x10, 0x46, 0xab, 0x11,
+ 0xde, 0x42, 0x78, 0x0f, 0xb3, 0x6a, 0x02, 0x09, 0x0e, 0x61, 0xfa, 0x97, 0x4b, 0x30, 0x2a, 0x75,
+ 0x08, 0xd9, 0x30, 0xc4, 0x87, 0xeb, 0xf7, 0x12, 0x21, 0x22, 0xd5, 0x6b, 0x4e, 0x9d, 0x4f, 0xa8,
+ 0x8f, 0x43, 0x12, 0x32, 0xcf, 0x2e, 0x75, 0xe0, 0xd9, 0x73, 0x8a, 0x13, 0x36, 0xff, 0x24, 0x27,
+ 0xf2, 0x1d, 0xb0, 0xd1, 0x45, 0x71, 0xba, 0x71, 0xef, 0x85, 0xe1, 0xc4, 0xc9, 0xb6, 0x09, 0x03,
+ 0x2f, 0xb9, 0x0e, 0xf1, 0x85, 0x2a, 0xfd, 0x88, 0x06, 0xc8, 0x2c, 0x27, 0x9f, 0xa3, 0x78, 0x31,
+ 0x47, 0xaf, 0x7f, 0x5e, 0x03, 0x58, 0x34, 0x02, 0x83, 0x9b, 0xcd, 0x74, 0x61, 0x43, 0x7b, 0x51,
+ 0x39, 0x94, 0x87, 0x53, 0x5e, 0x99, 0xfd, 0xbe, 0xf5, 0x52, 0x38, 0xfc, 0x48, 0xd8, 0xe7, 0xd8,
+ 0x6b, 0xd6, 0x4b, 0x04, 0x33, 0x38, 0x7a, 0x1c, 0x46, 0x88, 0x63, 0x7a, 0xbb, 0x2d, 0x7a, 0xb0,
+ 0x70, 0x0d, 0x11, 0xfb, 0x42, 0x97, 0xc2, 0x42, 0x1c, 0xc3, 0xf5, 0x37, 0x80, 0x7a, 0x63, 0xeb,
+ 0xc2, 0xc4, 0xff, 0xaf, 0x35, 0x38, 0xb7, 0xd8, 0x36, 0xec, 0xf9, 0x16, 0xdd, 0xa8, 0x86, 0x7d,
+ 0xc3, 0xe5, 0x26, 0x04, 0xf4, 0x1a, 0xf3, 0x3a, 0x18, 0x0e, 0x65, 0xa4, 0xa4, 0x33, 0x78, 0xc8,
+ 0x28, 0x71, 0x54, 0x03, 0x19, 0x30, 0xec, 0x87, 0x52, 0x7b, 0xa9, 0x07, 0xa9, 0x3d, 0x24, 0x11,
+ 0x49, 0xed, 0x11, 0x5a, 0xae, 0x3b, 0x63, 0x0b, 0x54, 0x23, 0xde, 0xb6, 0x65, 0x92, 0x79, 0xd3,
+ 0x74, 0xdb, 0x4e, 0xe0, 0x0b, 0x61, 0x46, 0xe8, 0xce, 0xb2, 0x6a, 0xe0, 0x9c, 0x96, 0xfa, 0x97,
+ 0x34, 0xe8, 0x5f, 0x5a, 0xaf, 0x2c, 0xa2, 0x6f, 0x85, 0xfe, 0x88, 0x65, 0x14, 0x34, 0xb3, 0xa2,
+ 0x78, 0xb8, 0x9a, 0x8f, 0xaf, 0xf7, 0x0a, 0x65, 0x38, 0x0c, 0x2b, 0xda, 0x80, 0x41, 0xb2, 0x4d,
+ 0x68, 0x57, 0x4b, 0x47, 0x82, 0x9f, 0xb1, 0xb4, 0x25, 0x86, 0x11, 0x0b, 0xcc, 0xfa, 0xc7, 0x35,
+ 0x80, 0xb8, 0x0a, 0xfa, 0x8e, 0xac, 0xd3, 0xe9, 0xf6, 0x11, 0x2a, 0xaf, 0x3b, 0x1f, 0x51, 0xfa,
+ 0x57, 0xfa, 0xe1, 0x3c, 0xed, 0x8e, 0xd8, 0xaa, 0x96, 0xeb, 0xdc, 0x26, 0xbb, 0x7f, 0xe7, 0x4c,
+ 0xf2, 0x77, 0xce, 0x24, 0x47, 0xe7, 0x4c, 0xa2, 0x3f, 0x0d, 0x93, 0xf1, 0xf6, 0x12, 0xfb, 0xfe,
+ 0xf1, 0xe4, 0x35, 0x72, 0x24, 0x14, 0x6a, 0xd2, 0x57, 0x3f, 0xfd, 0x2f, 0x4a, 0x30, 0x99, 0x34,
+ 0x9f, 0x43, 0x8f, 0xc5, 0x6e, 0x55, 0x9a, 0xfa, 0x4e, 0x97, 0x74, 0xad, 0x42, 0x9b, 0x30, 0x41,
+ 0x58, 0x73, 0x76, 0xcf, 0x33, 0x82, 0x22, 0x3b, 0x90, 0x47, 0x82, 0x51, 0xb0, 0xe0, 0x04, 0x56,
+ 0x54, 0x83, 0x09, 0xd3, 0x36, 0x7c, 0xdf, 0xda, 0xb4, 0xcc, 0xd8, 0x1d, 0x70, 0x64, 0xe1, 0x71,
+ 0x26, 0x16, 0x29, 0x90, 0x87, 0x7b, 0xe5, 0x33, 0xa2, 0x9f, 0x2a, 0x00, 0x27, 0x50, 0x20, 0x5f,
+ 0xbe, 0x3d, 0x71, 0x23, 0xe2, 0x85, 0x62, 0x86, 0x98, 0x91, 0xb8, 0x6c, 0x34, 0xa4, 0xcb, 0x76,
+ 0xd6, 0xa5, 0x49, 0xff, 0xac, 0x06, 0x67, 0xb3, 0x0d, 0x16, 0x0f, 0x33, 0xef, 0xf7, 0x52, 0xf3,
+ 0xc1, 0xcf, 0xd9, 0x6b, 0xa1, 0xe2, 0xa5, 0xe0, 0x9c, 0xe8, 0x9f, 0x2a, 0xc1, 0xf8, 0xd2, 0x4e,
+ 0xcb, 0xf5, 0xdb, 0x1e, 0x61, 0x55, 0x4f, 0x40, 0x9b, 0xf7, 0x18, 0x0c, 0x6d, 0x19, 0x4e, 0xdd,
+ 0x26, 0x9e, 0x18, 0x45, 0x34, 0xee, 0x5b, 0xbc, 0x18, 0x87, 0x70, 0xf4, 0x32, 0x80, 0x6f, 0x6e,
+ 0x91, 0x7a, 0x9b, 0xf1, 0xf4, 0xbe, 0xe2, 0x3c, 0x5d, 0x19, 0x63, 0x2d, 0x42, 0x29, 0x24, 0xb1,
+ 0xe8, 0x37, 0x96, 0xc8, 0xe9, 0x7f, 0xa0, 0xc1, 0x94, 0xd2, 0xee, 0x04, 0x94, 0x54, 0x9b, 0xaa,
+ 0x92, 0x6a, 0xbe, 0xe7, 0xb1, 0xe6, 0xe8, 0xa6, 0x3e, 0x52, 0x82, 0x73, 0x39, 0x73, 0x92, 0x32,
+ 0x11, 0xd7, 0x4e, 0xc8, 0x44, 0xbc, 0x0d, 0xa3, 0x81, 0x6b, 0x0b, 0x4f, 0xde, 0x70, 0x06, 0x0a,
+ 0x49, 0x0e, 0xeb, 0x11, 0x9a, 0xd8, 0x00, 0x3c, 0x2e, 0xf3, 0xb1, 0x4c, 0x47, 0xff, 0xa2, 0x06,
+ 0x23, 0x91, 0x2e, 0xfc, 0xeb, 0xca, 0x8c, 0xa0, 0xfb, 0x80, 0x5e, 0xfa, 0x6f, 0x94, 0x28, 0x9b,
+ 0x11, 0xb8, 0x43, 0xd6, 0x4f, 0xf9, 0x4c, 0x37, 0x0a, 0xb5, 0x8b, 0x8a, 0xf3, 0xca, 0x70, 0xda,
+ 0xeb, 0xb6, 0xd5, 0xf6, 0x5a, 0xae, 0x1f, 0x8a, 0xef, 0xfc, 0x9e, 0xc3, 0x8b, 0x70, 0x08, 0x43,
+ 0xab, 0x30, 0xe0, 0x53, 0x7a, 0xe2, 0x88, 0x3e, 0xe4, 0x6c, 0xb0, 0x1b, 0x08, 0xeb, 0x2f, 0xe6,
+ 0x68, 0xd0, 0xcb, 0xf2, 0xb9, 0x36, 0x50, 0x5c, 0x65, 0x4b, 0x47, 0x52, 0x8f, 0x04, 0xf8, 0x74,
+ 0x3c, 0x93, 0xcc, 0x73, 0x72, 0x19, 0x26, 0x85, 0x29, 0x2f, 0xdf, 0x36, 0x8e, 0x49, 0xd0, 0x5b,
+ 0x95, 0x9d, 0xf1, 0x68, 0xc2, 0x90, 0x68, 0x3a, 0x59, 0x3f, 0xde, 0x31, 0xba, 0x0f, 0xc3, 0x37,
+ 0x45, 0x27, 0xd1, 0x2c, 0x94, 0xac, 0x70, 0x2d, 0x40, 0xe0, 0x28, 0x55, 0x17, 0x71, 0xc9, 0xea,
+ 0xc2, 0x89, 0x48, 0x3e, 0x32, 0xfa, 0x3a, 0x1f, 0x19, 0xfa, 0x9f, 0x96, 0x60, 0x3a, 0xa4, 0x1a,
+ 0x8e, 0x71, 0x51, 0xd8, 0x08, 0x1c, 0x70, 0x97, 0x3b, 0x58, 0xc1, 0x7a, 0x07, 0xfa, 0x19, 0x03,
+ 0x2c, 0x64, 0x3b, 0x10, 0x21, 0xa4, 0xdd, 0xc1, 0x0c, 0x11, 0x7a, 0x1f, 0x0c, 0xda, 0xf4, 0x62,
+ 0x14, 0x7a, 0xf7, 0x14, 0x52, 0x47, 0x67, 0x0d, 0x97, 0xdf, 0xb7, 0x84, 0x03, 0x64, 0xf4, 0xfc,
+ 0xcb, 0x0b, 0xb1, 0xa0, 0x39, 0xfb, 0x36, 0x18, 0x95, 0xaa, 0x1d, 0x2a, 0x90, 0xe2, 0x67, 0x4a,
+ 0x30, 0x73, 0x8b, 0xd8, 0xcd, 0x4c, 0x83, 0x8f, 0x32, 0x0c, 0x98, 0x5b, 0x86, 0xc7, 0x63, 0x74,
+ 0x8e, 0xf1, 0x4d, 0x5e, 0xa1, 0x05, 0x98, 0x97, 0xd3, 0x7b, 0x92, 0xe2, 0x79, 0xfa, 0x0e, 0x69,
+ 0x26, 0xe3, 0xe0, 0xad, 0xef, 0x8d, 0xa2, 0xbb, 0xc6, 0x03, 0x57, 0x2a, 0xd0, 0xe3, 0xe5, 0x5d,
+ 0xb5, 0x3b, 0xab, 0x59, 0x3e, 0xa7, 0xe8, 0x25, 0x18, 0x77, 0x4d, 0x0b, 0x93, 0x96, 0xeb, 0x5b,
+ 0x81, 0xeb, 0xed, 0x8a, 0x45, 0x2b, 0x74, 0xb4, 0xdc, 0xa9, 0x54, 0x63, 0x44, 0xfc, 0xd1, 0x54,
+ 0x29, 0xc2, 0x2a, 0x29, 0xfd, 0x0b, 0x1a, 0x8c, 0xde, 0xb2, 0x36, 0x88, 0xc7, 0xad, 0x95, 0x99,
+ 0x62, 0x47, 0x89, 0x36, 0x39, 0x9a, 0x15, 0x69, 0x12, 0xed, 0xc0, 0x88, 0x38, 0x87, 0x23, 0x97,
+ 0xe2, 0x9b, 0xc5, 0xac, 0xa4, 0x22, 0xd2, 0xe2, 0x7c, 0x93, 0x03, 0x19, 0x85, 0x14, 0x70, 0x4c,
+ 0x4c, 0x7f, 0x19, 0x4e, 0x67, 0x34, 0xa2, 0x0b, 0xc9, 0x0c, 0x76, 0xc5, 0x47, 0x13, 0x72, 0x2b,
+ 0xba, 0x90, 0xac, 0x1c, 0x9d, 0x87, 0x3e, 0xe2, 0xd4, 0xc5, 0x17, 0x33, 0xb4, 0xbf, 0x57, 0xee,
+ 0x5b, 0x72, 0xea, 0x98, 0x96, 0x51, 0x26, 0x6e, 0xbb, 0x8a, 0x14, 0xcb, 0x98, 0xf8, 0xb2, 0x28,
+ 0xc3, 0x11, 0x94, 0xd9, 0xb5, 0x25, 0x4d, 0xb8, 0xe8, 0x85, 0x68, 0x72, 0x33, 0xc1, 0x5b, 0x7a,
+ 0xb1, 0x1c, 0x4b, 0xf2, 0xa9, 0x85, 0x19, 0x31, 0x21, 0x29, 0x8e, 0x87, 0x53, 0x74, 0xf5, 0x5f,
+ 0xea, 0x87, 0x4b, 0xb7, 0x5c, 0xcf, 0x7a, 0xc9, 0x75, 0x02, 0xc3, 0x5e, 0x73, 0xeb, 0xb1, 0x55,
+ 0xaf, 0x38, 0xb2, 0x3e, 0xac, 0xc1, 0x39, 0xb3, 0xd5, 0xe6, 0x17, 0xaa, 0xd0, 0x30, 0x76, 0x8d,
+ 0x78, 0x96, 0x5b, 0xd4, 0x3d, 0x85, 0x19, 0x31, 0x57, 0xd6, 0xee, 0x66, 0xa1, 0xc4, 0x79, 0xb4,
+ 0x98, 0x97, 0x4c, 0xdd, 0x7d, 0xe0, 0xb0, 0xce, 0xd5, 0x02, 0x36, 0x9b, 0x2f, 0xc5, 0x8b, 0x50,
+ 0xd0, 0x4b, 0x66, 0x31, 0x13, 0x23, 0xce, 0xa1, 0x84, 0x3e, 0x00, 0x67, 0x2c, 0xde, 0x39, 0x4c,
+ 0x8c, 0xba, 0xe5, 0x10, 0xdf, 0xe7, 0x26, 0xf6, 0x3d, 0xb8, 0x81, 0x54, 0xb3, 0x10, 0xe2, 0x6c,
+ 0x3a, 0xe8, 0x79, 0x00, 0x7f, 0xd7, 0x31, 0xc5, 0xfc, 0x17, 0x33, 0xbf, 0xe5, 0x22, 0x72, 0x84,
+ 0x05, 0x4b, 0x18, 0xe9, 0xe5, 0x33, 0x88, 0x36, 0xe5, 0x20, 0x33, 0xa1, 0x66, 0x97, 0xcf, 0x78,
+ 0x0f, 0xc5, 0x70, 0xfd, 0xe3, 0x1a, 0x4c, 0x54, 0x9d, 0x35, 0xdb, 0x30, 0x09, 0xb7, 0x26, 0xf5,
+ 0xd1, 0x35, 0x18, 0xf1, 0xa3, 0x87, 0x24, 0xce, 0x11, 0xe2, 0xef, 0x33, 0x7a, 0x42, 0x8a, 0xeb,
+ 0x30, 0xdb, 0x74, 0xcb, 0x11, 0x87, 0xdd, 0x0d, 0xd7, 0xe3, 0x88, 0xc4, 0x77, 0xc7, 0x6d, 0xd3,
+ 0xd3, 0x60, 0x9c, 0xd5, 0x46, 0xff, 0x59, 0x0d, 0xa6, 0xd5, 0xee, 0xc4, 0x1e, 0x6b, 0xd3, 0x4a,
+ 0xa4, 0x04, 0x01, 0xee, 0x25, 0x24, 0xdc, 0x5a, 0x06, 0x3e, 0x6e, 0xd8, 0x9c, 0x05, 0xc1, 0x99,
+ 0xf4, 0xf5, 0x7f, 0xa2, 0xc1, 0x90, 0x08, 0x3a, 0x8b, 0x5e, 0x9b, 0x50, 0xfa, 0x47, 0x47, 0x5b,
+ 0x42, 0xf1, 0xbf, 0xcb, 0xac, 0x52, 0xc4, 0xd1, 0x24, 0x4e, 0x99, 0x42, 0x5a, 0x63, 0x41, 0x38,
+ 0x3e, 0xe7, 0x14, 0xeb, 0x94, 0xf0, 0x45, 0x49, 0x22, 0xa6, 0x7f, 0x4e, 0x83, 0xa9, 0x54, 0xab,
+ 0x2e, 0xc4, 0xd1, 0x13, 0xb4, 0xd3, 0xfd, 0xdd, 0x7e, 0xba, 0x25, 0x03, 0xca, 0xef, 0x6d, 0xae,
+ 0x8f, 0x3f, 0x81, 0xfb, 0xef, 0xe3, 0x30, 0x62, 0x35, 0x9b, 0xed, 0x80, 0xbd, 0x7d, 0x0e, 0xc4,
+ 0x4a, 0xee, 0x6a, 0x58, 0x88, 0x63, 0x38, 0x72, 0x84, 0xa4, 0xc5, 0x4f, 0xc1, 0xe5, 0x62, 0x2b,
+ 0x27, 0x0f, 0x70, 0x8e, 0x4a, 0x45, 0x5c, 0x1c, 0xca, 0x12, 0xc4, 0xbe, 0x47, 0x03, 0xf0, 0x03,
+ 0xcf, 0x72, 0x1a, 0xb4, 0x50, 0x48, 0x63, 0xf8, 0x08, 0xc8, 0xd6, 0x22, 0xa4, 0x9c, 0x78, 0x1c,
+ 0x88, 0x36, 0x02, 0x60, 0x89, 0x32, 0x9a, 0x17, 0x42, 0x28, 0x3f, 0x32, 0x5f, 0x9f, 0x10, 0xb7,
+ 0x2f, 0x65, 0xd8, 0xff, 0x72, 0x42, 0xb1, 0x94, 0x3a, 0xfb, 0x04, 0x8c, 0x44, 0xf4, 0x0e, 0x12,
+ 0xea, 0xc6, 0x24, 0xa1, 0x6e, 0xf6, 0x29, 0x38, 0x95, 0xe8, 0xee, 0xa1, 0x64, 0xc2, 0xff, 0xa4,
+ 0x01, 0x52, 0x47, 0x7f, 0x02, 0x9a, 0x83, 0x86, 0xaa, 0x39, 0x58, 0xe8, 0x7d, 0xc9, 0x72, 0x54,
+ 0x07, 0x3f, 0x8d, 0x80, 0xc5, 0xe4, 0x8e, 0x62, 0xd4, 0x8b, 0x93, 0x9f, 0x0a, 0x2a, 0xb1, 0x9b,
+ 0xad, 0xf8, 0x72, 0x7b, 0x10, 0x54, 0x6e, 0x27, 0x70, 0xc5, 0x82, 0x4a, 0x12, 0x82, 0x53, 0x74,
+ 0xd1, 0x47, 0x35, 0x98, 0x34, 0xd4, 0x98, 0xdc, 0xe1, 0xcc, 0x14, 0x8a, 0xbe, 0x97, 0x88, 0xef,
+ 0x1d, 0xf7, 0x25, 0x01, 0xf0, 0x71, 0x8a, 0x2c, 0x7a, 0x13, 0x8c, 0x19, 0x2d, 0x6b, 0xbe, 0x5d,
+ 0xb7, 0xe8, 0xcd, 0x33, 0x0c, 0x5d, 0xcc, 0xb4, 0x21, 0xf3, 0x6b, 0xd5, 0xa8, 0x1c, 0x2b, 0xb5,
+ 0xa2, 0xe0, 0xd7, 0x95, 0xd8, 0x5c, 0xba, 0x97, 0xe0, 0xd7, 0x62, 0x0e, 0xe3, 0xe0, 0xd7, 0x62,
+ 0xea, 0x64, 0x22, 0xc8, 0x01, 0x70, 0xad, 0xba, 0x29, 0x48, 0x0e, 0x16, 0x7f, 0xba, 0xb9, 0x53,
+ 0x5d, 0xac, 0x08, 0x8a, 0x4c, 0x7c, 0x88, 0x7f, 0x63, 0x89, 0x02, 0xfa, 0xa4, 0x06, 0xe3, 0x82,
+ 0x77, 0x0b, 0x9a, 0x43, 0x6c, 0x89, 0x9e, 0x2b, 0xba, 0x5f, 0x12, 0x7b, 0x72, 0x0e, 0xcb, 0xc8,
+ 0x39, 0xdf, 0x89, 0x62, 0x4e, 0x28, 0x30, 0xac, 0xf6, 0x83, 0xc9, 0x00, 0xbe, 0xf2, 0x76, 0x26,
+ 0x3a, 0x38, 0x5c, 0x5c, 0x06, 0xa8, 0x65, 0xe0, 0x13, 0xae, 0x55, 0x19, 0x10, 0x9c, 0x49, 0x9f,
+ 0xca, 0xb5, 0xa7, 0x1e, 0x18, 0x81, 0xb9, 0x55, 0x31, 0xcc, 0x2d, 0xf6, 0x74, 0xca, 0x9d, 0x48,
+ 0x0b, 0xee, 0xeb, 0x7b, 0x2a, 0x2a, 0x6e, 0x20, 0x95, 0x28, 0xc4, 0x49, 0x82, 0xc8, 0x85, 0x61,
+ 0x4f, 0x24, 0xa6, 0x10, 0x41, 0x13, 0x8a, 0xe5, 0x62, 0x48, 0x66, 0xb9, 0xe0, 0x37, 0xa3, 0xf0,
+ 0x17, 0x8e, 0x88, 0xa0, 0x06, 0x5c, 0xe2, 0x77, 0xc3, 0x79, 0xc7, 0x75, 0x76, 0x9b, 0x6e, 0xdb,
+ 0x9f, 0x6f, 0x07, 0x5b, 0xc4, 0x09, 0x42, 0x75, 0xf8, 0x28, 0x3b, 0x46, 0x99, 0xab, 0xe0, 0x52,
+ 0xa7, 0x8a, 0xb8, 0x33, 0x1e, 0xf4, 0x2c, 0x0c, 0xb3, 0xe7, 0xc5, 0xf5, 0xf5, 0x65, 0xe6, 0x8f,
+ 0x7a, 0x78, 0x71, 0x99, 0x0d, 0x61, 0x49, 0xe0, 0xc0, 0x11, 0x36, 0x74, 0x1f, 0x86, 0x6c, 0x9e,
+ 0x59, 0x84, 0xf9, 0xa5, 0x16, 0x64, 0x8a, 0xc9, 0x2c, 0x25, 0xfc, 0x02, 0x2d, 0x7e, 0xe0, 0x90,
+ 0x02, 0x6a, 0xc1, 0x95, 0x3a, 0xd9, 0x34, 0xda, 0x76, 0xb0, 0xea, 0x06, 0x98, 0xf9, 0xe5, 0x45,
+ 0x1a, 0xcf, 0xd0, 0xf5, 0x78, 0x82, 0x05, 0x58, 0x64, 0x1e, 0x8f, 0x8b, 0x07, 0xd4, 0xc5, 0x07,
+ 0x62, 0x43, 0xbb, 0xf0, 0x88, 0xa8, 0xc3, 0x1c, 0x01, 0xcd, 0x2d, 0x3a, 0xcb, 0x69, 0xa2, 0xa7,
+ 0x18, 0xd1, 0x6f, 0xd8, 0xdf, 0x2b, 0x3f, 0xb2, 0x78, 0x70, 0x75, 0xdc, 0x0d, 0x4e, 0xe6, 0x5b,
+ 0x45, 0x12, 0xcf, 0x62, 0x33, 0x93, 0xc5, 0xe7, 0x38, 0xf9, 0xc4, 0xc6, 0xad, 0xf8, 0x92, 0xa5,
+ 0x38, 0x45, 0x13, 0xfd, 0x94, 0x06, 0x33, 0x7e, 0xe0, 0xb5, 0xcd, 0xa0, 0xed, 0x91, 0x7a, 0x62,
+ 0x87, 0x4e, 0xb1, 0x0e, 0x15, 0x12, 0xe0, 0x6a, 0x39, 0x38, 0x99, 0x13, 0xfc, 0x4c, 0x1e, 0x14,
+ 0xe7, 0xf6, 0x05, 0xfd, 0xb8, 0x06, 0xe7, 0x54, 0x20, 0xbd, 0xd3, 0xf3, 0x7e, 0xa2, 0xe2, 0x8f,
+ 0x2c, 0xb5, 0x6c, 0x94, 0xfc, 0x06, 0x9f, 0x03, 0xc4, 0x79, 0x1d, 0x49, 0x3e, 0xe8, 0x9f, 0x3e,
+ 0xe1, 0x07, 0xfd, 0xd9, 0x77, 0x02, 0x4a, 0x1f, 0x1f, 0x07, 0xc9, 0x81, 0xc3, 0xb2, 0x1c, 0xf8,
+ 0xe9, 0x01, 0xb8, 0x40, 0x4f, 0xa5, 0xf8, 0xf6, 0xb3, 0x62, 0x38, 0x46, 0xe3, 0xeb, 0x53, 0x62,
+ 0xfa, 0x82, 0x06, 0xe7, 0xb6, 0xb2, 0x55, 0x3b, 0xe2, 0xfe, 0xf5, 0xee, 0x42, 0x2a, 0xb8, 0x4e,
+ 0xda, 0x22, 0xce, 0xb0, 0x3b, 0x56, 0xc1, 0x79, 0x9d, 0x42, 0xef, 0x84, 0x49, 0xc7, 0xad, 0x93,
+ 0x4a, 0x75, 0x11, 0xaf, 0x18, 0xfe, 0xfd, 0x5a, 0x68, 0x5f, 0x34, 0xc0, 0xbf, 0xd7, 0xd5, 0x04,
+ 0x0c, 0xa7, 0x6a, 0xa3, 0x6d, 0x40, 0x2d, 0xb7, 0xbe, 0xb4, 0xcd, 0x33, 0xf0, 0xf4, 0x66, 0xe9,
+ 0xcb, 0x6c, 0x1c, 0xd6, 0x52, 0xd8, 0x70, 0x06, 0x05, 0xa6, 0x9b, 0xa2, 0x9d, 0x59, 0x71, 0x1d,
+ 0x2b, 0x70, 0x3d, 0x16, 0xd6, 0xa1, 0x27, 0x15, 0x0d, 0xd3, 0x4d, 0xad, 0x66, 0x62, 0xc4, 0x39,
+ 0x94, 0xf4, 0xff, 0xa5, 0xc1, 0x29, 0xba, 0x2d, 0xd6, 0x3c, 0x77, 0x67, 0xf7, 0xeb, 0x71, 0x43,
+ 0x3e, 0x26, 0x4c, 0x2d, 0xb9, 0x6e, 0xe7, 0x8c, 0x64, 0x66, 0x39, 0xc2, 0xfa, 0x1c, 0x5b, 0x56,
+ 0xca, 0x6a, 0xe5, 0xbe, 0x7c, 0xb5, 0xb2, 0xfe, 0xc9, 0x12, 0xbf, 0xb9, 0x84, 0x6a, 0xdd, 0xaf,
+ 0xcb, 0xef, 0xf0, 0x09, 0x18, 0xa7, 0x65, 0x2b, 0xc6, 0xce, 0xda, 0xe2, 0x33, 0xae, 0x1d, 0xfa,
+ 0xa0, 0x33, 0x5d, 0xfb, 0x6d, 0x19, 0x80, 0xd5, 0x7a, 0xe8, 0x49, 0x18, 0x6a, 0xf1, 0xc8, 0x4b,
+ 0xe2, 0xce, 0x7c, 0x85, 0xdb, 0x23, 0xb2, 0xa2, 0x87, 0x7b, 0xe5, 0xa9, 0xf8, 0x89, 0x37, 0x0c,
+ 0x70, 0x17, 0x36, 0xd0, 0x7f, 0xe9, 0x2c, 0x30, 0xe4, 0x36, 0x09, 0xbe, 0x1e, 0xe7, 0xe4, 0x0d,
+ 0x30, 0x6a, 0xb6, 0xda, 0x95, 0x1b, 0xb5, 0x77, 0xb7, 0x5d, 0xa6, 0x0b, 0x61, 0x89, 0xaa, 0x28,
+ 0xf7, 0xae, 0xac, 0xdd, 0x0d, 0x8b, 0xb1, 0x5c, 0x87, 0x72, 0x07, 0xb3, 0xd5, 0x16, 0xfc, 0x76,
+ 0x4d, 0xf6, 0xd2, 0x61, 0xdc, 0xa1, 0xb2, 0x76, 0x57, 0x81, 0xe1, 0x54, 0x6d, 0xf4, 0x01, 0x18,
+ 0x23, 0xe2, 0xc3, 0xbd, 0x65, 0x78, 0x75, 0xc1, 0x17, 0xaa, 0x45, 0x07, 0x1f, 0x4d, 0x6d, 0xc8,
+ 0x0d, 0xf8, 0x0d, 0x70, 0x49, 0x22, 0x81, 0x15, 0x82, 0xe8, 0x3d, 0x70, 0x3e, 0xfc, 0x4d, 0x57,
+ 0xd9, 0xad, 0x27, 0x19, 0xc5, 0x00, 0x0f, 0x99, 0xb4, 0x94, 0x57, 0x09, 0xe7, 0xb7, 0x47, 0x3f,
+ 0xa3, 0xc1, 0xd9, 0x08, 0x6a, 0x39, 0x56, 0xb3, 0xdd, 0xc4, 0xc4, 0xb4, 0x0d, 0xab, 0x29, 0xee,
+ 0x7d, 0xf7, 0x8e, 0x6c, 0xa0, 0x2a, 0x7a, 0xce, 0xac, 0xb2, 0x61, 0x38, 0xa7, 0x4b, 0xe8, 0x73,
+ 0x1a, 0x5c, 0x09, 0x41, 0x6b, 0x1e, 0xf1, 0xfd, 0xb6, 0x47, 0xe2, 0x08, 0x08, 0x62, 0x4a, 0x86,
+ 0x0a, 0xf1, 0x4e, 0x26, 0x00, 0x2f, 0x1d, 0x80, 0x1b, 0x1f, 0x48, 0x5d, 0xde, 0x2e, 0x35, 0x77,
+ 0x33, 0x10, 0x17, 0xc5, 0xe3, 0xda, 0x2e, 0x94, 0x04, 0x56, 0x08, 0xa2, 0x9f, 0xd5, 0xe0, 0x9c,
+ 0x5c, 0x20, 0xef, 0x16, 0x7e, 0x43, 0x7c, 0xf6, 0xc8, 0x3a, 0x93, 0xc0, 0xcf, 0x25, 0xbc, 0x1c,
+ 0x20, 0xce, 0xeb, 0x15, 0x65, 0xdb, 0x4d, 0xb6, 0x31, 0xf9, 0x2d, 0x72, 0x80, 0xb3, 0x6d, 0xbe,
+ 0x57, 0x7d, 0x1c, 0xc2, 0xd0, 0x9b, 0x60, 0xac, 0xe5, 0xd6, 0xd7, 0xac, 0xba, 0xcf, 0xc2, 0xde,
+ 0xb1, 0xbb, 0x5e, 0x1f, 0x9f, 0x8e, 0x35, 0xb7, 0xbe, 0x56, 0x5d, 0xe4, 0xe5, 0x58, 0xa9, 0x85,
+ 0xe6, 0x00, 0x36, 0x0d, 0xcb, 0xae, 0x3d, 0x30, 0x5a, 0x77, 0xc2, 0x50, 0x40, 0x4c, 0x17, 0x71,
+ 0x23, 0x2a, 0xc5, 0x52, 0x0d, 0xba, 0x7e, 0x94, 0xef, 0x60, 0xc2, 0x63, 0xca, 0xb3, 0xeb, 0xd1,
+ 0x51, 0xac, 0x5f, 0x88, 0x90, 0x77, 0xf8, 0xb6, 0x44, 0x02, 0x2b, 0x04, 0xd1, 0x87, 0x35, 0x98,
+ 0xf0, 0x77, 0xfd, 0x80, 0x34, 0xa3, 0x3e, 0x9c, 0x3a, 0xea, 0x3e, 0x30, 0x9d, 0x78, 0x4d, 0x21,
+ 0x82, 0x13, 0x44, 0x59, 0x50, 0xa5, 0xa6, 0xd1, 0x20, 0x37, 0x2b, 0xb7, 0xac, 0xc6, 0x56, 0x14,
+ 0xd3, 0x66, 0x8d, 0x78, 0x26, 0x71, 0x02, 0x76, 0xb1, 0x1a, 0x10, 0x41, 0x95, 0xf2, 0xab, 0xe1,
+ 0x4e, 0x38, 0xd0, 0xf3, 0x30, 0x2b, 0xc0, 0xcb, 0xee, 0x83, 0x14, 0x05, 0x1e, 0xbb, 0x88, 0xd9,
+ 0x6d, 0x56, 0x73, 0x6b, 0xe1, 0x0e, 0x18, 0x50, 0x15, 0x4e, 0xfb, 0xc4, 0x63, 0x6f, 0x82, 0x3c,
+ 0xa4, 0xde, 0x5a, 0xdb, 0xb6, 0x7d, 0x76, 0xb5, 0x11, 0x9e, 0x4a, 0xb5, 0x34, 0x18, 0x67, 0xb5,
+ 0x41, 0x4f, 0x45, 0xce, 0xd0, 0xbb, 0xb4, 0xe0, 0xdd, 0x6b, 0x35, 0x76, 0x13, 0x19, 0xe0, 0x9a,
+ 0x12, 0xac, 0x82, 0x70, 0xb2, 0x2e, 0x3d, 0xcd, 0xc3, 0xa2, 0x85, 0xb6, 0xe7, 0x07, 0x33, 0xd3,
+ 0xac, 0x31, 0x3b, 0xcd, 0xb1, 0x0c, 0xc0, 0x6a, 0x3d, 0xf4, 0x24, 0x4c, 0xf8, 0xc4, 0x34, 0xdd,
+ 0x66, 0x4b, 0xdc, 0x93, 0x67, 0xce, 0xb0, 0xde, 0xf3, 0x15, 0x54, 0x20, 0x38, 0x51, 0x13, 0xed,
+ 0xc2, 0xe9, 0x28, 0x3e, 0xf6, 0xb2, 0xdb, 0x58, 0x31, 0x76, 0x98, 0x70, 0x7c, 0xb6, 0x48, 0x60,
+ 0x0b, 0x3e, 0x5d, 0x95, 0x34, 0x3a, 0x9c, 0x45, 0x03, 0x2d, 0xc3, 0x74, 0xa2, 0xf8, 0x86, 0x65,
+ 0x13, 0x7f, 0xe6, 0x1c, 0x1b, 0x36, 0x53, 0x76, 0x55, 0x32, 0xe0, 0x38, 0xb3, 0x15, 0xba, 0x03,
+ 0x67, 0x5a, 0x9e, 0x1b, 0x10, 0x33, 0xb8, 0x4d, 0x05, 0x02, 0x5b, 0x0c, 0xd0, 0x9f, 0x99, 0x61,
+ 0x73, 0xc1, 0xde, 0x43, 0xd7, 0xb2, 0x2a, 0xe0, 0xec, 0x76, 0xe8, 0xd3, 0x1a, 0x5c, 0xf6, 0x03,
+ 0x8f, 0x18, 0x4d, 0xcb, 0x69, 0x54, 0x5c, 0xc7, 0x21, 0x8c, 0x31, 0x55, 0xeb, 0xb1, 0xa3, 0xdf,
+ 0xf9, 0x42, 0xa7, 0x88, 0xbe, 0xbf, 0x57, 0xbe, 0x5c, 0xeb, 0x88, 0x19, 0x1f, 0x40, 0x19, 0xbd,
+ 0x0c, 0xd0, 0x24, 0x4d, 0xd7, 0xdb, 0xa5, 0x1c, 0x69, 0x66, 0xb6, 0xf8, 0x7d, 0x77, 0x25, 0xc2,
+ 0xc2, 0x3f, 0x7f, 0xe5, 0x25, 0x37, 0x06, 0x62, 0x89, 0x1c, 0x9d, 0x6a, 0xca, 0x6f, 0x45, 0xec,
+ 0x2e, 0xe9, 0xa3, 0xb9, 0xc0, 0x56, 0x8e, 0x4d, 0xf5, 0x4a, 0x56, 0x05, 0x9c, 0xdd, 0x0e, 0xf9,
+ 0x30, 0xc5, 0xbe, 0x50, 0x71, 0x92, 0xdf, 0xac, 0xcc, 0x37, 0xc8, 0xcc, 0xc5, 0x42, 0x93, 0x4b,
+ 0x65, 0xff, 0xa9, 0x6a, 0x12, 0x19, 0x4e, 0xe3, 0x8f, 0x89, 0x1a, 0x3b, 0x31, 0xd1, 0x4b, 0xbd,
+ 0x12, 0x95, 0x90, 0xe1, 0x34, 0x7e, 0x7d, 0xaf, 0x04, 0x67, 0x32, 0x4f, 0x49, 0xca, 0x3c, 0xf8,
+ 0x14, 0xcf, 0x87, 0x89, 0x08, 0xc5, 0xb3, 0x27, 0x63, 0x1e, 0x2b, 0x2a, 0x08, 0x27, 0xeb, 0x52,
+ 0x19, 0x96, 0x51, 0xbb, 0x51, 0x8b, 0xdb, 0x97, 0x62, 0x19, 0xb6, 0x9a, 0x80, 0xe1, 0x54, 0x6d,
+ 0x54, 0x11, 0xf3, 0x71, 0xa3, 0x56, 0xa5, 0xd7, 0x40, 0xff, 0x86, 0x47, 0xc2, 0xdb, 0x41, 0x3c,
+ 0x3e, 0x19, 0x88, 0xd3, 0xf5, 0xe9, 0x28, 0xe8, 0x0f, 0xb9, 0x17, 0xfd, 0xf1, 0x28, 0x56, 0x55,
+ 0x10, 0x4e, 0xd6, 0x0d, 0xef, 0xe9, 0x4a, 0x17, 0x06, 0xe2, 0x51, 0xac, 0x26, 0x60, 0x38, 0x55,
+ 0x5b, 0xff, 0xc3, 0x7e, 0x78, 0xa4, 0x0b, 0xc9, 0x12, 0x35, 0xb3, 0xa7, 0xfb, 0xf0, 0x3c, 0xaf,
+ 0xbb, 0xe5, 0x69, 0xe5, 0x2c, 0xcf, 0xe1, 0xe9, 0x75, 0xbb, 0x9c, 0x7e, 0xde, 0x72, 0x1e, 0x9e,
+ 0x64, 0xf7, 0xcb, 0xdf, 0xcc, 0x5e, 0xfe, 0x82, 0xb3, 0x7a, 0xe0, 0x76, 0x69, 0xe5, 0x6c, 0x97,
+ 0x82, 0xb3, 0xda, 0xc5, 0xf6, 0xfa, 0xa3, 0x7e, 0x78, 0xb4, 0x1b, 0x29, 0xb7, 0xe0, 0xfe, 0xca,
+ 0xe0, 0x2d, 0xc7, 0xba, 0xbf, 0xf2, 0xdc, 0xd0, 0x8f, 0x71, 0x7f, 0x75, 0x64, 0x9f, 0xc7, 0xb3,
+ 0xbf, 0xf2, 0x66, 0xf5, 0xb8, 0xf6, 0x57, 0xde, 0xac, 0x76, 0xb1, 0xbf, 0xfe, 0x32, 0x79, 0x3e,
+ 0x44, 0xa2, 0x76, 0x15, 0xfa, 0xcc, 0x56, 0xbb, 0x20, 0x93, 0x62, 0x56, 0x86, 0x95, 0xb5, 0xbb,
+ 0x98, 0xe2, 0x40, 0x18, 0x06, 0xf9, 0xfe, 0x29, 0xc8, 0x82, 0x98, 0xe5, 0x28, 0xdf, 0x92, 0x58,
+ 0x60, 0xa2, 0x53, 0x45, 0x5a, 0x5b, 0xa4, 0x49, 0x3c, 0xc3, 0xae, 0x05, 0xae, 0x67, 0x34, 0x8a,
+ 0x72, 0x1b, 0xfe, 0x82, 0x92, 0xc0, 0x85, 0x53, 0xd8, 0xe9, 0x84, 0xb4, 0xac, 0x7a, 0x41, 0xfe,
+ 0xc2, 0x26, 0x64, 0xad, 0xba, 0x88, 0x29, 0x0e, 0xfd, 0xf3, 0x23, 0x20, 0xe5, 0x33, 0x40, 0x1f,
+ 0xd3, 0x60, 0xca, 0x4c, 0x46, 0x22, 0xed, 0xc5, 0x1e, 0x2a, 0x15, 0xd6, 0x94, 0x6f, 0xf9, 0x54,
+ 0x31, 0x4e, 0x93, 0x45, 0xdf, 0xa9, 0x71, 0x25, 0x5f, 0xf4, 0x9a, 0x27, 0xa6, 0xf5, 0xe6, 0x11,
+ 0xbd, 0x7b, 0xc7, 0xda, 0xc2, 0xf8, 0x89, 0x55, 0x25, 0x88, 0x3e, 0xa7, 0xc1, 0x99, 0xfb, 0x59,
+ 0x6f, 0x13, 0x62, 0xf2, 0xef, 0x14, 0xed, 0x4a, 0xce, 0x63, 0x07, 0x97, 0x20, 0x33, 0x2b, 0xe0,
+ 0xec, 0x8e, 0x44, 0xb3, 0x14, 0xa9, 0x6b, 0xc5, 0x77, 0x5a, 0x78, 0x96, 0x12, 0x7a, 0xdf, 0x78,
+ 0x96, 0x22, 0x00, 0x56, 0x09, 0xa2, 0x16, 0x8c, 0xdc, 0x0f, 0x75, 0xe4, 0x42, 0x2f, 0x56, 0x29,
+ 0x4a, 0x5d, 0x52, 0xb4, 0x73, 0x7b, 0xaf, 0xa8, 0x10, 0xc7, 0x44, 0xd0, 0x16, 0x0c, 0xdd, 0xe7,
+ 0xbc, 0x42, 0xe8, 0xb3, 0xe6, 0x7b, 0xbe, 0xfd, 0x73, 0xb5, 0x8a, 0x28, 0xc2, 0x21, 0x7a, 0xd9,
+ 0x97, 0x60, 0xf8, 0x00, 0xf7, 0xb3, 0x4f, 0x6b, 0x70, 0x66, 0x9b, 0x78, 0x81, 0x65, 0x26, 0x5f,
+ 0x86, 0x46, 0x8a, 0x6b, 0x28, 0x9e, 0xc9, 0x42, 0xc8, 0xb7, 0x49, 0x26, 0x08, 0x67, 0x77, 0x01,
+ 0x19, 0x70, 0x81, 0x2b, 0xf8, 0x6b, 0x81, 0x11, 0x58, 0xe6, 0xba, 0x7b, 0x5f, 0x89, 0x33, 0x08,
+ 0x71, 0x10, 0xe8, 0xa5, 0xfc, 0x6a, 0xb8, 0x13, 0x0e, 0xf4, 0x0c, 0xf4, 0x93, 0xc0, 0xac, 0x8b,
+ 0xc8, 0xd8, 0x6f, 0x2d, 0xea, 0xcc, 0xcc, 0x5d, 0x6b, 0xe8, 0x7f, 0x98, 0xe1, 0xd3, 0xff, 0x4c,
+ 0x83, 0x94, 0xfa, 0x1b, 0x7d, 0xbf, 0x06, 0x63, 0x9b, 0xc4, 0x08, 0xda, 0x1e, 0xb9, 0x29, 0xcc,
+ 0x4e, 0xfb, 0xae, 0x8e, 0x5e, 0x7f, 0xe6, 0x28, 0xb4, 0xee, 0x73, 0x37, 0x24, 0xc4, 0xdc, 0x1e,
+ 0x26, 0x4a, 0xed, 0x20, 0x83, 0xb0, 0xd2, 0x83, 0xd9, 0xa7, 0x61, 0x2a, 0xd5, 0xf0, 0x50, 0x2f,
+ 0xa1, 0xff, 0x4a, 0xe3, 0x2f, 0x2f, 0xbc, 0x2f, 0x8b, 0x86, 0xbf, 0xb5, 0xe1, 0x1a, 0x5e, 0x1d,
+ 0x3d, 0x0f, 0x03, 0x46, 0xbd, 0x1e, 0xa5, 0xc8, 0x7d, 0x5b, 0x31, 0xd3, 0xac, 0xba, 0x1c, 0x82,
+ 0x89, 0xfd, 0xc4, 0x1c, 0x2d, 0xba, 0x01, 0xc8, 0x50, 0x9e, 0xbe, 0x57, 0xe2, 0xe0, 0x1d, 0xec,
+ 0xc5, 0x6e, 0x3e, 0x05, 0xc5, 0x19, 0x2d, 0xf4, 0x8f, 0x68, 0x80, 0xd2, 0x89, 0x73, 0x90, 0x07,
+ 0xc3, 0xdb, 0x6a, 0x42, 0x8b, 0xc5, 0xa3, 0x48, 0x68, 0x11, 0xdb, 0xf9, 0x45, 0x09, 0x22, 0x22,
+ 0x3a, 0xfa, 0x57, 0x35, 0x88, 0xd3, 0x68, 0xa2, 0x37, 0xc3, 0x68, 0x9d, 0xf8, 0xa6, 0x67, 0xb5,
+ 0x82, 0xd8, 0x8f, 0x34, 0xf2, 0x79, 0x5b, 0x8c, 0x41, 0x58, 0xae, 0x87, 0x74, 0x18, 0x0c, 0x0c,
+ 0xff, 0x7e, 0x75, 0x51, 0xdc, 0x27, 0xd9, 0xe9, 0xbf, 0xce, 0x4a, 0xb0, 0x80, 0xc4, 0x31, 0x79,
+ 0xfb, 0xba, 0x88, 0xc9, 0x8b, 0x36, 0x8f, 0x20, 0x00, 0x31, 0x3a, 0x38, 0xf8, 0xb0, 0xfe, 0x93,
+ 0x25, 0x38, 0x45, 0xab, 0xac, 0x18, 0x96, 0x13, 0x10, 0x87, 0x79, 0x66, 0x15, 0x9c, 0x84, 0x06,
+ 0x8c, 0x07, 0x8a, 0x3b, 0xf7, 0xe1, 0x7d, 0x99, 0x23, 0x63, 0x32, 0xd5, 0x89, 0x5b, 0xc5, 0x8b,
+ 0xde, 0x16, 0xba, 0xc6, 0xf1, 0x9b, 0xf7, 0x23, 0xe1, 0x56, 0x65, 0xfe, 0x6e, 0x0f, 0x85, 0x6f,
+ 0x7c, 0x94, 0x7b, 0x55, 0xf1, 0x82, 0x7b, 0x02, 0xc6, 0x85, 0x13, 0x06, 0x0f, 0xae, 0x2c, 0x6e,
+ 0xde, 0xec, 0xe4, 0xba, 0x21, 0x03, 0xb0, 0x5a, 0x4f, 0xff, 0x9d, 0x12, 0xa8, 0x19, 0x5e, 0x8b,
+ 0xce, 0x52, 0x3a, 0xb2, 0x74, 0xe9, 0xd8, 0x22, 0x4b, 0xbf, 0x8e, 0xe5, 0x5f, 0x67, 0x16, 0xe3,
+ 0xe2, 0x29, 0x5f, 0xce, 0x9a, 0xce, 0xca, 0x71, 0x54, 0x23, 0x9e, 0xd6, 0xfe, 0x43, 0x4f, 0xeb,
+ 0x9b, 0x85, 0x71, 0xf1, 0x80, 0x12, 0xdf, 0x3b, 0x34, 0x2e, 0x9e, 0x52, 0x1a, 0x4a, 0x8e, 0x7c,
+ 0x5f, 0xd4, 0x60, 0x42, 0xf5, 0xfe, 0xce, 0xf0, 0xcc, 0xd6, 0x8e, 0xc4, 0x33, 0x1b, 0xdd, 0x83,
+ 0x11, 0x3f, 0x4a, 0x4b, 0x7b, 0xf8, 0x29, 0x67, 0x12, 0x46, 0x9c, 0x8d, 0x36, 0xc6, 0xa5, 0xcf,
+ 0x83, 0x48, 0x1f, 0x44, 0x37, 0x97, 0x08, 0xa0, 0xee, 0xaf, 0xbb, 0x81, 0x61, 0xb3, 0xae, 0x0b,
+ 0xe5, 0xf4, 0x8a, 0x0c, 0xc0, 0x6a, 0x3d, 0x7d, 0x15, 0x5e, 0xbd, 0xec, 0x1a, 0xf5, 0x05, 0xc3,
+ 0xa6, 0xdf, 0x9f, 0x27, 0xcc, 0x17, 0x7d, 0x26, 0xc1, 0xac, 0x79, 0x6e, 0xe0, 0x9a, 0xae, 0x4d,
+ 0xe5, 0x0b, 0x23, 0x8a, 0x24, 0xcd, 0x1e, 0x6c, 0x43, 0xf9, 0x42, 0x44, 0x62, 0xc6, 0x21, 0x5c,
+ 0xff, 0x35, 0x0d, 0x86, 0x44, 0x5e, 0x9c, 0x2e, 0x1c, 0x70, 0x37, 0x61, 0x80, 0xdd, 0x22, 0x7b,
+ 0x91, 0xde, 0x6b, 0x5b, 0xae, 0x1b, 0x28, 0xb9, 0xc8, 0x78, 0xf6, 0x40, 0x96, 0x29, 0x97, 0xa3,
+ 0x67, 0x76, 0xbb, 0x9e, 0xb9, 0x65, 0x05, 0x84, 0x99, 0x27, 0x89, 0xaf, 0x97, 0xdb, 0xed, 0x4a,
+ 0xe5, 0x58, 0xa9, 0xa5, 0xff, 0xc5, 0x00, 0x5c, 0x11, 0x88, 0x53, 0x22, 0x6d, 0x74, 0x70, 0xec,
+ 0xc2, 0x69, 0xb1, 0x80, 0x2c, 0x65, 0x42, 0xa8, 0x7b, 0x2e, 0xa6, 0x4d, 0x10, 0x29, 0x19, 0x52,
+ 0xe8, 0x70, 0x16, 0x0d, 0x1e, 0x9b, 0x9f, 0x15, 0xdf, 0x22, 0x86, 0x1d, 0x6c, 0x85, 0xb4, 0x4b,
+ 0xbd, 0xc4, 0xe6, 0x4f, 0xe3, 0xc3, 0x99, 0x54, 0x98, 0xe9, 0x8b, 0x00, 0x54, 0x3c, 0x62, 0xc8,
+ 0x76, 0x37, 0x3d, 0xb8, 0x65, 0xad, 0x64, 0x62, 0xc4, 0x39, 0x94, 0x98, 0x5a, 0xd6, 0xd8, 0x61,
+ 0x5a, 0x1e, 0x4c, 0x02, 0xcf, 0x62, 0x39, 0xe5, 0xa2, 0x37, 0x9d, 0x15, 0x15, 0x84, 0x93, 0x75,
+ 0xd1, 0x93, 0x30, 0xc1, 0x4c, 0x89, 0xe2, 0x60, 0xaf, 0x03, 0x71, 0xcc, 0xae, 0x55, 0x05, 0x82,
+ 0x13, 0x35, 0xd1, 0x77, 0x69, 0x30, 0x6d, 0xc9, 0x4e, 0x47, 0xe1, 0xe8, 0x8b, 0xe5, 0xcd, 0x61,
+ 0x62, 0x6d, 0xb8, 0x8d, 0x33, 0xd0, 0xe2, 0x4c, 0x62, 0x68, 0x19, 0xa6, 0x85, 0xe7, 0xb8, 0xba,
+ 0x07, 0x78, 0x28, 0x3f, 0xb6, 0xa6, 0x8b, 0x19, 0x70, 0x9c, 0xd9, 0x4a, 0xff, 0x60, 0x09, 0xc6,
+ 0x0e, 0x99, 0xc9, 0xb9, 0x2d, 0x09, 0x4e, 0x3d, 0xf8, 0x77, 0x66, 0xe4, 0xd2, 0xea, 0x24, 0x3b,
+ 0xa1, 0x67, 0x61, 0xa2, 0xcd, 0x26, 0x22, 0x0c, 0x74, 0x27, 0xbe, 0xe9, 0x6f, 0xa2, 0x2b, 0x77,
+ 0x57, 0x81, 0x3c, 0xdc, 0x2b, 0xcf, 0xca, 0xe8, 0x55, 0x28, 0x4e, 0xe0, 0xd1, 0x7f, 0x60, 0x00,
+ 0x4e, 0x67, 0xf4, 0x86, 0x99, 0xd1, 0x90, 0x84, 0x78, 0xd7, 0x8b, 0x19, 0x4d, 0x4a, 0x54, 0x8c,
+ 0xcc, 0x68, 0x92, 0x10, 0x9c, 0xa2, 0x8b, 0x9e, 0x81, 0x3e, 0xd3, 0xb3, 0xc4, 0x84, 0x3f, 0x51,
+ 0x48, 0xe9, 0x81, 0xab, 0x0b, 0xa3, 0x82, 0x62, 0x5f, 0x05, 0x57, 0x31, 0x45, 0x48, 0xcf, 0x11,
+ 0x99, 0x05, 0x86, 0x12, 0x23, 0x3b, 0x47, 0x64, 0x4e, 0xe9, 0x63, 0xb5, 0x1e, 0x7a, 0x16, 0x66,
+ 0xc4, 0x6d, 0x34, 0x3c, 0x13, 0x5d, 0xc7, 0x0f, 0x28, 0xb7, 0x0a, 0xc4, 0xa1, 0xce, 0x2c, 0x5c,
+ 0x6f, 0xe7, 0xd4, 0xc1, 0xb9, 0xad, 0xd1, 0x77, 0xc0, 0x84, 0xb2, 0xf3, 0xc3, 0x80, 0x69, 0x05,
+ 0xdd, 0x62, 0x64, 0x4c, 0xfc, 0x3b, 0x57, 0xcb, 0x70, 0x82, 0x1a, 0x8b, 0xb6, 0x6b, 0xca, 0xe9,
+ 0x78, 0xc3, 0xac, 0x8e, 0xf3, 0x3d, 0x27, 0xf6, 0x8d, 0xa5, 0x29, 0xa5, 0xd8, 0xc7, 0x09, 0x82,
+ 0xfa, 0x2f, 0x68, 0x70, 0x3e, 0x37, 0x21, 0x5d, 0x17, 0x1f, 0xe9, 0x4e, 0xea, 0x23, 0x3d, 0xca,
+ 0x74, 0x7d, 0x9d, 0xee, 0x38, 0x3f, 0x34, 0x08, 0x72, 0xfa, 0x78, 0xb4, 0xd2, 0x8b, 0x9e, 0x34,
+ 0xde, 0xaf, 0xa1, 0xae, 0x74, 0x05, 0xfa, 0x1a, 0xad, 0x76, 0x41, 0x45, 0x69, 0x84, 0xee, 0x26,
+ 0x45, 0xd7, 0x68, 0xb5, 0xd1, 0x33, 0x91, 0xea, 0xb5, 0x98, 0x72, 0x34, 0x72, 0xdd, 0x4c, 0xa8,
+ 0x5f, 0xc3, 0x15, 0xea, 0xcf, 0x5d, 0xa1, 0x26, 0x0c, 0xf9, 0x42, 0x2f, 0x3b, 0x50, 0x3c, 0x1a,
+ 0xa7, 0x34, 0xd3, 0x42, 0x0f, 0xcb, 0x35, 0x46, 0xa1, 0x9a, 0x36, 0xa4, 0x41, 0x6f, 0x8d, 0x6d,
+ 0xc6, 0xff, 0xd9, 0x69, 0x35, 0xcc, 0x6f, 0x8d, 0x77, 0x59, 0x09, 0x16, 0x90, 0x94, 0xd0, 0x34,
+ 0xd4, 0x8d, 0xd0, 0x84, 0x3e, 0x93, 0x4c, 0x60, 0x39, 0xcc, 0xf6, 0xdb, 0xbb, 0x7b, 0x1c, 0xce,
+ 0xdf, 0xb0, 0x1c, 0xd8, 0x7f, 0xaf, 0x04, 0x28, 0xbd, 0x58, 0xe8, 0x11, 0x18, 0x60, 0x77, 0x07,
+ 0xf1, 0x29, 0x47, 0x9a, 0x10, 0x76, 0xc1, 0xc0, 0x1c, 0x86, 0x6a, 0x22, 0x02, 0x63, 0xb1, 0x4d,
+ 0xcf, 0x6c, 0x2d, 0x05, 0x3d, 0x29, 0x5c, 0xe3, 0x15, 0xc5, 0x47, 0x33, 0x4b, 0x56, 0xbf, 0x0b,
+ 0x43, 0x4d, 0xcb, 0x61, 0xe6, 0x27, 0xc5, 0x94, 0xfa, 0xdc, 0x24, 0x8c, 0xa3, 0xc0, 0x21, 0x2e,
+ 0xfd, 0x8f, 0x4a, 0x94, 0x41, 0xc4, 0x1a, 0x80, 0x5d, 0x1e, 0x4f, 0x58, 0x78, 0x83, 0x6b, 0xc5,
+ 0x95, 0x92, 0x12, 0xd2, 0xf9, 0x08, 0x21, 0x37, 0x9c, 0x88, 0x7f, 0x63, 0x89, 0x18, 0x25, 0x1d,
+ 0x58, 0x4d, 0x72, 0xcf, 0x72, 0xea, 0xee, 0x03, 0x31, 0xbd, 0xbd, 0x92, 0x5e, 0x8f, 0x10, 0x72,
+ 0xd2, 0xf1, 0x6f, 0x2c, 0x11, 0xa3, 0xc7, 0x27, 0x53, 0x50, 0x3a, 0x2c, 0x99, 0xb4, 0xe8, 0x1b,
+ 0x4f, 0xea, 0x2f, 0xec, 0xa0, 0xd9, 0xf1, 0x59, 0xc9, 0xa9, 0x83, 0x73, 0x5b, 0xeb, 0x3f, 0xa3,
+ 0xc1, 0x99, 0xcc, 0xa9, 0x40, 0x37, 0x61, 0x2a, 0x95, 0x4b, 0x55, 0xdc, 0xef, 0xa2, 0x7c, 0xfd,
+ 0xa9, 0x04, 0xac, 0x38, 0xdd, 0x86, 0x67, 0x99, 0x4b, 0x1d, 0x4e, 0xc2, 0xb6, 0x57, 0xbe, 0xd2,
+ 0xc8, 0x60, 0x9c, 0xd5, 0x46, 0x7f, 0x8f, 0xd2, 0xd9, 0x78, 0xb2, 0xe8, 0x97, 0xb1, 0x41, 0x1a,
+ 0x91, 0x8f, 0x7c, 0xf4, 0x65, 0x2c, 0xd0, 0x42, 0xcc, 0x61, 0xe8, 0x92, 0x1c, 0xba, 0x23, 0xe2,
+ 0xee, 0x61, 0xf8, 0x0e, 0xfd, 0xbd, 0x70, 0x2e, 0xc7, 0x9e, 0x06, 0x2d, 0xc2, 0x98, 0xff, 0xc0,
+ 0x68, 0x2d, 0x90, 0x2d, 0x63, 0xdb, 0x12, 0x81, 0xb2, 0xb8, 0xd9, 0xf5, 0x58, 0x4d, 0x2a, 0x7f,
+ 0x98, 0xf8, 0x8d, 0x95, 0x56, 0x7a, 0x00, 0x20, 0xcc, 0xf3, 0x2d, 0xa7, 0x81, 0x36, 0x61, 0xd8,
+ 0xb0, 0x89, 0x17, 0xc4, 0x31, 0x2c, 0xbf, 0xb9, 0x90, 0x52, 0x54, 0xe0, 0xe0, 0xee, 0x68, 0xe1,
+ 0x2f, 0x1c, 0xe1, 0xd6, 0xff, 0x91, 0x06, 0x67, 0xb3, 0x43, 0x23, 0x75, 0x21, 0x19, 0x34, 0x61,
+ 0xd4, 0x8b, 0x9b, 0x89, 0x4d, 0xff, 0x16, 0x39, 0xcf, 0x86, 0xe4, 0x48, 0x43, 0x2f, 0x2c, 0x15,
+ 0xcf, 0xf5, 0xc3, 0x95, 0x4f, 0xa6, 0xde, 0x88, 0x54, 0x50, 0x52, 0x4f, 0xb0, 0x8c, 0x9f, 0xa5,
+ 0xc1, 0xa1, 0xd4, 0xfd, 0x96, 0x61, 0x92, 0xfa, 0x09, 0xa7, 0xf1, 0x3f, 0x82, 0xdc, 0x13, 0xd9,
+ 0x7d, 0x3f, 0xde, 0x34, 0x38, 0x39, 0x34, 0x0f, 0x4e, 0x83, 0x93, 0xdd, 0xf0, 0x15, 0x92, 0x9f,
+ 0x21, 0xbb, 0xf3, 0x39, 0x8e, 0xec, 0xff, 0x63, 0x30, 0x6f, 0xb4, 0x87, 0xcc, 0xcd, 0xbf, 0x7d,
+ 0x8c, 0xb9, 0xf9, 0x27, 0xfe, 0x2e, 0x2f, 0x7f, 0x46, 0x5e, 0xfe, 0x44, 0xae, 0xf8, 0xc1, 0x13,
+ 0xca, 0x15, 0xff, 0x22, 0x0c, 0xb6, 0x0c, 0x8f, 0x38, 0xe1, 0xdb, 0x6c, 0xb5, 0x98, 0xe1, 0x40,
+ 0xbc, 0xd1, 0x62, 0x2e, 0x18, 0x7d, 0x92, 0x6b, 0x8c, 0x00, 0x16, 0x84, 0x32, 0x82, 0xa1, 0x0c,
+ 0x1f, 0x57, 0xb4, 0xc1, 0x38, 0x4b, 0xfd, 0xc8, 0x71, 0x64, 0xa9, 0xd7, 0xff, 0x4a, 0x83, 0x8b,
+ 0x9d, 0xd8, 0x12, 0x53, 0x96, 0x98, 0x89, 0xcf, 0xb0, 0x17, 0x65, 0x49, 0x8a, 0xdb, 0x46, 0xca,
+ 0x92, 0x24, 0x04, 0xa7, 0xe8, 0xa2, 0x77, 0x01, 0x72, 0x37, 0xb8, 0x9d, 0xce, 0x4d, 0x4a, 0x23,
+ 0x0e, 0xbb, 0xda, 0x17, 0x67, 0xe7, 0xbc, 0x93, 0xaa, 0x81, 0x33, 0x5a, 0xe9, 0xbf, 0x54, 0x02,
+ 0x58, 0x25, 0xc1, 0x03, 0xd7, 0xbb, 0x4f, 0xcf, 0xf8, 0x8b, 0x8a, 0x8a, 0x7b, 0xf8, 0x6b, 0x17,
+ 0x5f, 0xf2, 0x22, 0xf4, 0xb7, 0xdc, 0xba, 0x2f, 0xe4, 0x77, 0xd6, 0x11, 0xe6, 0x7a, 0xc1, 0x4a,
+ 0x51, 0x19, 0x06, 0x98, 0x11, 0x93, 0xb8, 0x80, 0x32, 0x05, 0x39, 0x7b, 0x04, 0xc0, 0xbc, 0x9c,
+ 0x72, 0x48, 0x11, 0xa3, 0xc0, 0x17, 0x2f, 0x29, 0x63, 0x3c, 0x94, 0x39, 0x2f, 0xc3, 0x11, 0x14,
+ 0x3d, 0x09, 0x60, 0xb5, 0x6e, 0x18, 0x4d, 0xcb, 0xb6, 0xc4, 0xe7, 0x3a, 0xc2, 0x34, 0xb7, 0x50,
+ 0x5d, 0x0b, 0x4b, 0x1f, 0xee, 0x95, 0x87, 0xc5, 0xaf, 0x5d, 0x2c, 0xd5, 0xd6, 0xbf, 0xa0, 0xc1,
+ 0x64, 0x3c, 0x79, 0x62, 0xab, 0x84, 0x3d, 0xe7, 0x01, 0x8f, 0x73, 0x7b, 0xce, 0xb3, 0x07, 0x74,
+ 0xee, 0x39, 0x57, 0x56, 0xe5, 0xf5, 0xfc, 0x0d, 0x30, 0x4a, 0x78, 0x08, 0xa3, 0xea, 0x22, 0xe6,
+ 0x3c, 0x6e, 0x84, 0x5f, 0x87, 0x96, 0xe2, 0x62, 0x2c, 0xd7, 0xd1, 0xff, 0xba, 0x0f, 0xc6, 0x56,
+ 0x1b, 0x96, 0xb3, 0x13, 0xc6, 0x6a, 0x8a, 0x5e, 0xb9, 0xb5, 0xe3, 0x79, 0xe5, 0x7e, 0x16, 0x66,
+ 0x6c, 0xf9, 0x39, 0x86, 0x0b, 0x4e, 0x86, 0xd3, 0x88, 0x66, 0x80, 0xdd, 0x03, 0x96, 0x73, 0xea,
+ 0xe0, 0xdc, 0xd6, 0x28, 0x80, 0x41, 0x33, 0xcc, 0x12, 0x59, 0x38, 0xfe, 0x90, 0x3c, 0x17, 0x73,
+ 0x72, 0x28, 0x8e, 0x88, 0xe7, 0x89, 0xed, 0x29, 0x68, 0xa1, 0x0f, 0x69, 0x70, 0x86, 0xec, 0xf0,
+ 0x50, 0x34, 0xeb, 0x9e, 0xb1, 0xb9, 0x69, 0x99, 0xc2, 0x83, 0x8f, 0xef, 0xc4, 0xe5, 0xfd, 0xbd,
+ 0xf2, 0x99, 0xa5, 0xac, 0x0a, 0x0f, 0xf7, 0xca, 0xd7, 0x32, 0x23, 0x03, 0xb1, 0xd5, 0xcc, 0x6c,
+ 0x82, 0xb3, 0x49, 0xcd, 0xbe, 0x0d, 0x46, 0x0f, 0xe1, 0xf7, 0xad, 0xc4, 0xff, 0xf9, 0xe5, 0x12,
+ 0x8c, 0xd1, 0xed, 0xb6, 0xec, 0x9a, 0x86, 0xbd, 0xb8, 0x5a, 0x43, 0x8f, 0x25, 0xc3, 0x1e, 0x46,
+ 0x4f, 0x61, 0xa9, 0xd0, 0x87, 0xcb, 0x30, 0xbd, 0xe9, 0x7a, 0x26, 0x59, 0xaf, 0xac, 0xad, 0xbb,
+ 0xc2, 0x98, 0x6c, 0x71, 0xb5, 0x26, 0xee, 0x45, 0x4c, 0x35, 0x7f, 0x23, 0x03, 0x8e, 0x33, 0x5b,
+ 0xa1, 0x3b, 0x70, 0x26, 0x2e, 0xbf, 0xdb, 0xe2, 0x0e, 0x08, 0x14, 0x5d, 0x5f, 0xec, 0x40, 0x71,
+ 0x23, 0xab, 0x02, 0xce, 0x6e, 0x87, 0x0c, 0xb8, 0x20, 0xde, 0x00, 0x6e, 0xb8, 0xde, 0x03, 0xc3,
+ 0xab, 0xab, 0x68, 0xfb, 0x63, 0x63, 0x9b, 0xc5, 0xfc, 0x6a, 0xb8, 0x13, 0x0e, 0xfd, 0xab, 0x1a,
+ 0xa8, 0x41, 0x25, 0xd1, 0x79, 0xe8, 0xf3, 0x44, 0x12, 0x42, 0x11, 0x5c, 0x91, 0x5e, 0x11, 0x68,
+ 0x19, 0x9a, 0x03, 0xf0, 0xe2, 0xc8, 0x96, 0xa5, 0x38, 0xbb, 0x86, 0x14, 0x93, 0x52, 0xaa, 0x41,
+ 0x51, 0x05, 0x46, 0x43, 0x30, 0x3c, 0x86, 0x6a, 0xdd, 0x68, 0x60, 0x5a, 0xc6, 0xd2, 0xa8, 0x58,
+ 0x0d, 0xe2, 0x87, 0xaa, 0x67, 0x9e, 0x46, 0x85, 0x95, 0x60, 0x01, 0x41, 0x06, 0x8c, 0xb7, 0xda,
+ 0xb6, 0x88, 0x8f, 0x44, 0xaf, 0x3e, 0x5c, 0xed, 0x76, 0x35, 0x2b, 0xc5, 0x20, 0x5b, 0xfd, 0xcc,
+ 0x3c, 0x83, 0x6b, 0x32, 0x0a, 0xac, 0x62, 0xd4, 0x3f, 0x3b, 0x08, 0x52, 0xb8, 0x9c, 0x43, 0x48,
+ 0xa1, 0x3f, 0xa1, 0xc1, 0xb4, 0x69, 0x5b, 0xc4, 0x09, 0x12, 0x91, 0x27, 0xf8, 0xf1, 0x71, 0xb7,
+ 0x50, 0x1c, 0x9f, 0x16, 0x71, 0xaa, 0x8b, 0xc2, 0x5d, 0xa5, 0x92, 0x81, 0x5c, 0xb8, 0xf4, 0x64,
+ 0x40, 0x70, 0x66, 0x67, 0xd8, 0x78, 0x58, 0x79, 0x75, 0x51, 0x8e, 0x86, 0x59, 0x11, 0x65, 0x38,
+ 0x82, 0x52, 0xce, 0xdb, 0xf0, 0xdc, 0x76, 0xcb, 0xaf, 0x30, 0xaf, 0x54, 0xbe, 0x28, 0x8c, 0xf3,
+ 0xde, 0x8c, 0x8b, 0xb1, 0x5c, 0x07, 0xbd, 0x09, 0xc6, 0xf8, 0xcf, 0x35, 0x8f, 0x6c, 0x5a, 0x3b,
+ 0xe2, 0x50, 0x62, 0xca, 0xc7, 0x9b, 0x52, 0x39, 0x56, 0x6a, 0xb1, 0x78, 0x6c, 0xbe, 0xdf, 0x26,
+ 0xde, 0x5d, 0xbc, 0x2c, 0x32, 0x55, 0xf3, 0x78, 0x6c, 0x61, 0x21, 0x8e, 0xe1, 0xe8, 0x07, 0x35,
+ 0x98, 0xf0, 0xc8, 0x8b, 0x6d, 0xcb, 0xa3, 0x22, 0x8c, 0x61, 0x35, 0x7d, 0x11, 0xb3, 0x08, 0xf7,
+ 0x16, 0x27, 0x69, 0x0e, 0x2b, 0x48, 0x39, 0x83, 0x8c, 0x34, 0xfd, 0x2a, 0x10, 0x27, 0x7a, 0x40,
+ 0xa7, 0xca, 0xb7, 0x1a, 0x8e, 0xe5, 0x34, 0xe6, 0xed, 0x86, 0x2f, 0xf2, 0x69, 0x71, 0x9d, 0x5d,
+ 0x5c, 0x8c, 0xe5, 0x3a, 0xe8, 0x09, 0x18, 0x6f, 0xfb, 0x94, 0xed, 0x35, 0x09, 0x9f, 0xdf, 0x91,
+ 0xd8, 0xb0, 0xe4, 0xae, 0x0c, 0xc0, 0x6a, 0x3d, 0xf4, 0x24, 0x4c, 0x84, 0x05, 0x62, 0x96, 0x81,
+ 0x27, 0x75, 0x61, 0x6f, 0x68, 0x0a, 0x04, 0x27, 0x6a, 0xce, 0xce, 0xc3, 0xe9, 0x8c, 0x61, 0x1e,
+ 0x8a, 0xb7, 0xfe, 0x3f, 0x0d, 0xce, 0x70, 0xa9, 0x2b, 0xcc, 0x71, 0x1d, 0xa6, 0xd8, 0xc8, 0xce,
+ 0x56, 0xa1, 0x1d, 0x6b, 0xb6, 0x8a, 0xaf, 0x41, 0x56, 0x0e, 0xfd, 0xa7, 0x4b, 0xf0, 0xea, 0x03,
+ 0xbf, 0x4b, 0xf4, 0xa3, 0x1a, 0x8c, 0x92, 0x9d, 0xc0, 0x33, 0x22, 0xd7, 0x7d, 0xba, 0x49, 0x37,
+ 0x8f, 0x85, 0x09, 0xcc, 0x2d, 0xc5, 0x84, 0xf8, 0xc6, 0x8d, 0xae, 0x52, 0x12, 0x04, 0xcb, 0xfd,
+ 0xa1, 0xdc, 0x96, 0x27, 0x3d, 0x92, 0x2d, 0xd0, 0x04, 0x17, 0x14, 0x90, 0xd9, 0x77, 0xc0, 0x64,
+ 0x12, 0xf3, 0xa1, 0xf6, 0xca, 0x4f, 0x69, 0x90, 0x19, 0x5e, 0x13, 0x55, 0x60, 0xca, 0x68, 0x07,
+ 0xae, 0xf2, 0x86, 0x27, 0x44, 0x49, 0x66, 0xc4, 0x3d, 0x9f, 0x04, 0xe2, 0x74, 0x7d, 0xae, 0xc0,
+ 0x74, 0xda, 0x86, 0xad, 0xa2, 0xe1, 0x02, 0x97, 0x50, 0x60, 0xa6, 0xc0, 0x38, 0xab, 0x8d, 0xfe,
+ 0x4f, 0x35, 0x38, 0xa3, 0x74, 0xd4, 0x17, 0x8a, 0xd8, 0x2e, 0x74, 0x71, 0xd9, 0xdb, 0xbe, 0x74,
+ 0x9c, 0xdb, 0x5e, 0xff, 0xc5, 0x12, 0x0c, 0xad, 0x79, 0x2e, 0x3d, 0xda, 0x4e, 0x40, 0x03, 0x67,
+ 0x28, 0x1a, 0xb8, 0x42, 0xfa, 0x05, 0xd1, 0xd9, 0x5c, 0x95, 0x9b, 0x95, 0x50, 0xb9, 0xcd, 0xf7,
+ 0x42, 0xa4, 0xb3, 0x8e, 0xed, 0x37, 0x35, 0x18, 0x15, 0x35, 0x4f, 0x40, 0xa9, 0xf6, 0xed, 0xaa,
+ 0x52, 0xed, 0xed, 0x3d, 0x8c, 0x2b, 0x47, 0x8b, 0xf6, 0x69, 0x0d, 0xc6, 0x45, 0x8d, 0x15, 0xd2,
+ 0xdc, 0x20, 0x1e, 0xba, 0x01, 0x43, 0x7e, 0x9b, 0x2d, 0xa4, 0x18, 0xd0, 0x05, 0x59, 0x3c, 0xf2,
+ 0x36, 0x0c, 0x93, 0x76, 0xbf, 0xc6, 0xab, 0x48, 0xf9, 0x9c, 0x79, 0x01, 0x0e, 0x1b, 0xd3, 0xbd,
+ 0xef, 0xb9, 0x76, 0x2a, 0x0c, 0x3d, 0x76, 0x6d, 0x82, 0x19, 0x84, 0xde, 0xf3, 0xe8, 0xdf, 0xf0,
+ 0x0e, 0xc7, 0xee, 0x79, 0x14, 0xec, 0x63, 0x5e, 0xae, 0x7f, 0x61, 0x20, 0x9a, 0x6c, 0x76, 0xa9,
+ 0xbf, 0x05, 0x23, 0xa6, 0x47, 0x8c, 0x80, 0xd4, 0x17, 0x76, 0xbb, 0xe9, 0x1c, 0x93, 0x03, 0x2a,
+ 0x61, 0x0b, 0x1c, 0x37, 0xa6, 0x47, 0xae, 0x6c, 0x4d, 0x59, 0x8a, 0xa5, 0x93, 0x5c, 0x4b, 0xca,
+ 0x6f, 0x86, 0x01, 0xf7, 0x81, 0x13, 0x39, 0x7b, 0x74, 0x24, 0xcc, 0x86, 0x72, 0x87, 0xd6, 0xc6,
+ 0xbc, 0x91, 0x9c, 0x86, 0xa1, 0xbf, 0x43, 0x1a, 0x06, 0x1b, 0x86, 0x9a, 0x6c, 0x19, 0x7a, 0x4a,
+ 0xef, 0xab, 0x2c, 0x68, 0xbc, 0x44, 0xfc, 0xb7, 0x8f, 0x43, 0x12, 0x54, 0x74, 0x72, 0x42, 0x8d,
+ 0x8e, 0x2c, 0x3a, 0x45, 0x6a, 0x1e, 0x1c, 0xc3, 0xd1, 0xae, 0x9a, 0xdf, 0x63, 0xa8, 0xb8, 0x9e,
+ 0x54, 0x74, 0x4f, 0x4a, 0xe9, 0xc1, 0xa7, 0x3e, 0x2f, 0xc7, 0x07, 0xfa, 0x29, 0x0d, 0xce, 0xd5,
+ 0xb3, 0xf3, 0xbe, 0x89, 0xa7, 0xe6, 0x42, 0x8e, 0xd6, 0x39, 0xa9, 0xe4, 0x16, 0xca, 0x62, 0xc2,
+ 0xf2, 0x72, 0xcd, 0xe1, 0xbc, 0xce, 0xe8, 0xdf, 0xdb, 0x1f, 0x7d, 0x4d, 0x42, 0xd3, 0x91, 0xad,
+ 0x87, 0xd2, 0x8a, 0xe8, 0xa1, 0xd0, 0x1b, 0xc3, 0x2c, 0x64, 0x7c, 0xbb, 0x5e, 0x4a, 0x66, 0x21,
+ 0x1b, 0x13, 0xa4, 0x95, 0xcc, 0x63, 0x6d, 0x38, 0xed, 0x07, 0x86, 0x4d, 0x6a, 0x96, 0x78, 0x5c,
+ 0xf3, 0x03, 0xa3, 0xd9, 0x2a, 0x90, 0x06, 0x8c, 0x07, 0x5e, 0x48, 0xa3, 0xc2, 0x59, 0xf8, 0xd1,
+ 0x77, 0xb3, 0x60, 0x7a, 0x86, 0xcd, 0x1e, 0x1f, 0x79, 0x2a, 0xd4, 0x98, 0xf8, 0xe1, 0x6d, 0xcb,
+ 0x45, 0xa8, 0xbc, 0x6c, 0x7c, 0x38, 0x97, 0x12, 0x7a, 0x19, 0xce, 0xd0, 0x03, 0x70, 0xde, 0x0c,
+ 0xac, 0x6d, 0x2b, 0xd8, 0x8d, 0xbb, 0x70, 0xf8, 0xdc, 0x5f, 0xec, 0xb6, 0xbd, 0x9c, 0x85, 0x0c,
+ 0x67, 0xd3, 0xd0, 0xff, 0x52, 0x03, 0x94, 0xde, 0xeb, 0xc8, 0x86, 0xe1, 0x7a, 0x18, 0x09, 0x41,
+ 0x3b, 0x92, 0x2c, 0x39, 0xd1, 0x11, 0x12, 0x05, 0x50, 0x88, 0x28, 0x20, 0x17, 0x46, 0x1e, 0x6c,
+ 0x59, 0x01, 0xb1, 0x2d, 0x3f, 0x38, 0xa2, 0xa4, 0x3c, 0x51, 0x8c, 0xf7, 0x7b, 0x21, 0x62, 0x1c,
+ 0xd3, 0xd0, 0x3f, 0xde, 0x0f, 0xc3, 0x51, 0x4e, 0xcf, 0x83, 0xcd, 0x81, 0xdb, 0x80, 0x4c, 0x29,
+ 0xc0, 0x5f, 0x2f, 0x3a, 0x53, 0x26, 0x03, 0x55, 0x52, 0xc8, 0x70, 0x06, 0x01, 0xf4, 0x32, 0x4c,
+ 0x5b, 0xce, 0xa6, 0x67, 0x44, 0xe1, 0x0b, 0x2b, 0xa1, 0xa2, 0xac, 0x00, 0x61, 0x76, 0x8b, 0xae,
+ 0x66, 0xa0, 0xc3, 0x99, 0x44, 0x10, 0x81, 0x21, 0x9e, 0x56, 0x39, 0x7c, 0x75, 0x29, 0xa4, 0xab,
+ 0xe7, 0xb2, 0x66, 0xcc, 0xde, 0x43, 0xd9, 0x33, 0xc4, 0xcd, 0x83, 0xcd, 0xf2, 0xff, 0xc3, 0x07,
+ 0x29, 0xb1, 0xef, 0x2b, 0xc5, 0xe9, 0xc5, 0x6f, 0x5b, 0x3c, 0xd8, 0xac, 0x5a, 0x88, 0x93, 0x04,
+ 0xf5, 0x5f, 0xd7, 0x60, 0x80, 0xc7, 0xf4, 0x3a, 0x7e, 0x51, 0xf3, 0xbd, 0x8a, 0xa8, 0xf9, 0x54,
+ 0x91, 0x41, 0xb2, 0xae, 0xe6, 0x09, 0x9a, 0xfa, 0xaf, 0x69, 0x30, 0xc2, 0x6a, 0x9c, 0x80, 0xec,
+ 0xf7, 0xbc, 0x2a, 0xfb, 0xbd, 0xad, 0xf0, 0x68, 0x72, 0x24, 0xbf, 0x5f, 0xef, 0x13, 0x63, 0x61,
+ 0xa2, 0x55, 0x15, 0x4e, 0x0b, 0x47, 0xd7, 0x65, 0x6b, 0x93, 0xd0, 0x2d, 0xbe, 0x68, 0xec, 0xfa,
+ 0xc2, 0xa5, 0x80, 0x07, 0x91, 0x49, 0x83, 0x71, 0x56, 0x1b, 0xf4, 0xcb, 0x1a, 0x15, 0x62, 0x02,
+ 0xcf, 0x32, 0x7b, 0x7a, 0x0c, 0x8e, 0xfa, 0x36, 0xb7, 0xc2, 0x91, 0xf1, 0xbb, 0xe9, 0xdd, 0x58,
+ 0x9a, 0x61, 0xa5, 0x0f, 0xf7, 0xca, 0xe5, 0x0c, 0x9d, 0x71, 0x9c, 0x1c, 0xdb, 0x0f, 0x3e, 0xf4,
+ 0xc7, 0x1d, 0xab, 0xb0, 0xdb, 0x58, 0xd8, 0x63, 0x74, 0x0b, 0x06, 0x7c, 0xd3, 0x6d, 0x85, 0xae,
+ 0xd2, 0x8f, 0x64, 0xe9, 0x06, 0x93, 0x6a, 0xc1, 0x68, 0x82, 0x6b, 0xb4, 0x25, 0xe6, 0x08, 0x66,
+ 0x5f, 0x80, 0x31, 0xb9, 0xe7, 0x19, 0x77, 0xdf, 0x45, 0xd5, 0xe2, 0xec, 0x90, 0xc6, 0x55, 0xf2,
+ 0x5d, 0xf9, 0xf7, 0xfa, 0x60, 0x10, 0x93, 0x86, 0x48, 0x81, 0x76, 0xc0, 0x9d, 0xd3, 0x0a, 0xb3,
+ 0x10, 0x97, 0x8a, 0x3b, 0xbd, 0xc9, 0x49, 0x6e, 0x9e, 0x73, 0x1d, 0x69, 0x0e, 0xe4, 0x44, 0xc4,
+ 0xc8, 0x89, 0x12, 0x43, 0xf1, 0x17, 0x88, 0x42, 0xf2, 0x22, 0x1f, 0x58, 0x37, 0xa9, 0xa0, 0xd0,
+ 0x0f, 0x68, 0x80, 0x0c, 0xd3, 0x24, 0xbe, 0x8f, 0x89, 0x4f, 0xe7, 0x9e, 0x0b, 0xab, 0x9c, 0xcb,
+ 0x16, 0x8b, 0x72, 0x9d, 0xc4, 0x16, 0x8b, 0x6d, 0x29, 0x90, 0x8f, 0x33, 0x88, 0xf7, 0x92, 0x9e,
+ 0xea, 0xb7, 0x34, 0x18, 0x53, 0xb2, 0x7f, 0x35, 0x63, 0x5d, 0x7a, 0x71, 0x93, 0x9d, 0xd0, 0xd5,
+ 0xea, 0x42, 0x87, 0x4a, 0x5c, 0x3f, 0x7f, 0x27, 0x4a, 0x5f, 0x71, 0x34, 0x89, 0xc2, 0xf4, 0x4f,
+ 0x6a, 0x70, 0x36, 0x1c, 0x90, 0x1a, 0xa7, 0x1c, 0x5d, 0x85, 0x61, 0xa3, 0x65, 0x31, 0x45, 0xaf,
+ 0xac, 0x2a, 0x9f, 0x5f, 0xab, 0xb2, 0x32, 0x1c, 0x41, 0x95, 0x54, 0xcf, 0xa5, 0x03, 0x53, 0x3d,
+ 0xbf, 0x46, 0x4a, 0x5e, 0x3d, 0x10, 0xcb, 0x2e, 0x11, 0x61, 0x6e, 0x0c, 0xa9, 0xbf, 0x05, 0x46,
+ 0x6a, 0xb5, 0x5b, 0x7c, 0x49, 0x0f, 0xf1, 0xe2, 0xa3, 0x7f, 0xb4, 0x0f, 0xc6, 0x45, 0xc2, 0x05,
+ 0x8b, 0xa9, 0x80, 0x4e, 0xe0, 0x9c, 0x5b, 0x87, 0x11, 0x3f, 0x7a, 0xc3, 0x28, 0xe5, 0xf3, 0xa9,
+ 0xe8, 0x59, 0x22, 0x99, 0x35, 0x2f, 0x7e, 0xbe, 0x88, 0x11, 0xa1, 0xdb, 0x30, 0xf8, 0x22, 0xe5,
+ 0xb9, 0xe1, 0xb7, 0xda, 0x15, 0xeb, 0x8b, 0x3e, 0x44, 0xc6, 0xae, 0x7d, 0x2c, 0x50, 0x20, 0x9f,
+ 0xf9, 0x02, 0x32, 0x21, 0xb0, 0x97, 0xd0, 0x9b, 0xca, 0xcc, 0x46, 0xa9, 0xeb, 0xc7, 0x84, 0x4b,
+ 0x21, 0xfb, 0x85, 0x23, 0x42, 0x2c, 0xe5, 0xa7, 0xd2, 0xe2, 0x15, 0x92, 0xf2, 0x53, 0xe9, 0x73,
+ 0xce, 0x71, 0xfd, 0x36, 0x38, 0x93, 0x39, 0x19, 0x07, 0x8b, 0xd8, 0xfa, 0x3f, 0x2b, 0x41, 0x7f,
+ 0x8d, 0x90, 0xfa, 0x09, 0xec, 0xcc, 0xe7, 0x15, 0x09, 0xec, 0x9b, 0x0b, 0x27, 0x1d, 0xcd, 0xd3,
+ 0xf4, 0x6d, 0x26, 0x34, 0x7d, 0xef, 0x28, 0x4c, 0xa1, 0xb3, 0x9a, 0x6f, 0x07, 0x86, 0x68, 0xad,
+ 0xc5, 0xd5, 0x1a, 0x6a, 0x4a, 0x3b, 0xb9, 0x54, 0x5c, 0x7a, 0x16, 0xe8, 0x0e, 0xdc, 0xc3, 0x1f,
+ 0xd5, 0xe0, 0x54, 0xa2, 0x6e, 0x17, 0xb7, 0xa8, 0x63, 0xe1, 0x08, 0xfa, 0xaf, 0x6a, 0x30, 0x4c,
+ 0xfb, 0x72, 0x02, 0x9f, 0xd1, 0xb7, 0xa9, 0x9f, 0xd1, 0x5b, 0x8b, 0x4e, 0x71, 0xce, 0xd7, 0xf3,
+ 0xe7, 0x25, 0x60, 0xb9, 0x6b, 0x85, 0x25, 0x8a, 0x64, 0x63, 0xa2, 0xe5, 0x58, 0xc7, 0x5c, 0x11,
+ 0x26, 0x2a, 0x09, 0xf5, 0xa5, 0x64, 0xa6, 0xf2, 0x3a, 0xc5, 0x0a, 0x45, 0x39, 0x86, 0x32, 0x2c,
+ 0x51, 0x5e, 0x82, 0x71, 0x7f, 0xcb, 0x75, 0x83, 0x28, 0x08, 0x62, 0x7f, 0x71, 0x55, 0x35, 0x73,
+ 0x7f, 0x0d, 0x87, 0xc2, 0x1f, 0xfd, 0x6a, 0x32, 0x6e, 0xac, 0x92, 0x42, 0x73, 0x00, 0x1b, 0xb6,
+ 0x6b, 0xde, 0xe7, 0x46, 0x30, 0xdc, 0xdd, 0x91, 0x3d, 0xb3, 0x2f, 0x44, 0xa5, 0x58, 0xaa, 0xd1,
+ 0x93, 0xbd, 0xcf, 0x9f, 0x6a, 0x7c, 0xa6, 0x0f, 0xb1, 0x79, 0x4f, 0xd0, 0x64, 0xea, 0xb5, 0x30,
+ 0xe8, 0x31, 0x69, 0x52, 0xac, 0x58, 0xf4, 0xfd, 0x73, 0x19, 0x13, 0x0b, 0x28, 0xdd, 0x1e, 0x5c,
+ 0x44, 0xee, 0x8f, 0x55, 0xd3, 0xb2, 0x60, 0xab, 0xff, 0xa2, 0x18, 0x66, 0x94, 0xfe, 0xb8, 0x05,
+ 0xe3, 0x4c, 0x06, 0x4d, 0xe4, 0x5d, 0x7e, 0x63, 0x97, 0xdf, 0x88, 0xdc, 0x34, 0x36, 0xe0, 0x54,
+ 0x8a, 0xb1, 0x4a, 0x00, 0x3d, 0x01, 0xe3, 0xe1, 0xe8, 0xb8, 0x1d, 0x65, 0x29, 0xf6, 0xdb, 0x5b,
+ 0x93, 0x01, 0x58, 0xad, 0xa7, 0x7f, 0xaa, 0x04, 0x97, 0x78, 0xdf, 0xd9, 0x1d, 0x7d, 0x91, 0xb4,
+ 0x88, 0x53, 0x27, 0x8e, 0xb9, 0xcb, 0x24, 0xb2, 0xba, 0xdb, 0x40, 0x2f, 0xc3, 0xe0, 0x03, 0x42,
+ 0xea, 0x91, 0xb2, 0xfb, 0x5e, 0xf1, 0xec, 0xd1, 0x39, 0x24, 0xee, 0x31, 0xf4, 0xfc, 0xdd, 0x90,
+ 0xff, 0x8f, 0x05, 0x49, 0x4a, 0xbc, 0xe5, 0xb9, 0x1b, 0x91, 0xe0, 0x70, 0xf4, 0xc4, 0xd7, 0x18,
+ 0x7a, 0x4e, 0x9c, 0xff, 0x8f, 0x05, 0x49, 0x7d, 0x0d, 0x1e, 0xe9, 0xa2, 0xe9, 0x61, 0x04, 0xc4,
+ 0x83, 0x30, 0xf2, 0xd1, 0x1f, 0x06, 0xe3, 0x1f, 0x68, 0xf0, 0xa8, 0x84, 0x72, 0x69, 0x87, 0xca,
+ 0xac, 0x15, 0xa3, 0x65, 0x98, 0xf4, 0x56, 0xc8, 0xa2, 0x93, 0x1d, 0x2a, 0x5f, 0xeb, 0x47, 0x35,
+ 0x18, 0xe2, 0xb6, 0x5b, 0x21, 0xfb, 0x7d, 0xbe, 0xc7, 0x29, 0xcf, 0xed, 0x52, 0x98, 0xc7, 0x2a,
+ 0x1c, 0x1b, 0xff, 0xed, 0xe3, 0x90, 0xbe, 0xfe, 0xef, 0x06, 0xe0, 0x1b, 0xbb, 0x47, 0x84, 0xfe,
+ 0x54, 0x93, 0xf3, 0x4c, 0x73, 0x6d, 0x6a, 0xf3, 0x78, 0x3b, 0x1f, 0xe9, 0x0d, 0xc4, 0x55, 0xf4,
+ 0x5e, 0x2a, 0x15, 0xf5, 0x11, 0xa9, 0x24, 0xe2, 0x81, 0xa1, 0x7f, 0xac, 0xc1, 0x18, 0x3d, 0x96,
+ 0x22, 0xe6, 0xc2, 0x97, 0xa9, 0x75, 0xcc, 0x23, 0x5d, 0x95, 0x48, 0x26, 0xc2, 0x0d, 0xc9, 0x20,
+ 0xac, 0xf4, 0x0d, 0xdd, 0x55, 0x1f, 0x8a, 0xf8, 0x65, 0xe2, 0x72, 0x96, 0x34, 0x72, 0x98, 0x44,
+ 0xef, 0xb3, 0x36, 0x4c, 0xa8, 0x33, 0x7f, 0x9c, 0x0a, 0x95, 0xd9, 0xa7, 0x61, 0x2a, 0x35, 0xfa,
+ 0x43, 0x5d, 0xdd, 0x7f, 0x68, 0x00, 0xca, 0xd2, 0x54, 0x67, 0x05, 0xdc, 0x40, 0x9f, 0xd1, 0x60,
+ 0xd4, 0x70, 0x1c, 0x61, 0x02, 0x13, 0xee, 0xdf, 0x7a, 0x8f, 0xab, 0x9a, 0x45, 0x6a, 0x6e, 0x3e,
+ 0x26, 0x93, 0xb0, 0xf1, 0x90, 0x20, 0x58, 0xee, 0x4d, 0x07, 0x3b, 0xce, 0xd2, 0x89, 0xd9, 0x71,
+ 0xa2, 0xf7, 0x87, 0x07, 0x31, 0xdf, 0x46, 0xcf, 0x1e, 0xc3, 0xdc, 0xb0, 0x73, 0x3d, 0x47, 0x7f,
+ 0xf5, 0x09, 0x8d, 0x1d, 0xb2, 0x71, 0x5c, 0x14, 0x71, 0x26, 0x15, 0x32, 0xc7, 0x3b, 0x30, 0xe8,
+ 0x4a, 0x74, 0x76, 0xc7, 0x45, 0x58, 0x25, 0x3f, 0xfb, 0x0e, 0x98, 0x4c, 0x2e, 0xe5, 0xa1, 0xb6,
+ 0xe5, 0xbf, 0xed, 0x57, 0xce, 0x8e, 0xdc, 0xf9, 0xe8, 0x42, 0x8d, 0xf8, 0xb9, 0xc4, 0xee, 0xe5,
+ 0x3c, 0xc9, 0x3a, 0xae, 0x15, 0x3a, 0xda, 0x2d, 0xdc, 0x77, 0x72, 0x5b, 0xf8, 0x6f, 0xdc, 0x1e,
+ 0x5a, 0x80, 0x33, 0xd2, 0x82, 0xc5, 0x79, 0x69, 0x58, 0x4c, 0x42, 0xcb, 0xb7, 0xc2, 0xc8, 0xba,
+ 0x92, 0x0c, 0xf3, 0x0c, 0x2f, 0xc6, 0x21, 0x5c, 0x5f, 0x56, 0xb8, 0xe3, 0xba, 0xdb, 0x72, 0x6d,
+ 0xb7, 0xb1, 0x3b, 0xff, 0xc0, 0xf0, 0x08, 0x76, 0xdb, 0x81, 0xc0, 0xd6, 0xad, 0x44, 0xb4, 0x02,
+ 0x57, 0x24, 0x6c, 0x99, 0xf1, 0x07, 0x0f, 0x83, 0xee, 0x37, 0x87, 0x42, 0xe1, 0x5e, 0x04, 0xfc,
+ 0xf9, 0x79, 0x0d, 0xce, 0x93, 0xbc, 0xc3, 0x52, 0x48, 0xfa, 0xcf, 0x1e, 0xd7, 0x61, 0x2c, 0xd2,
+ 0xc4, 0xe4, 0x81, 0x71, 0x7e, 0xcf, 0xd0, 0x2e, 0x80, 0x1f, 0x2d, 0x4f, 0x2f, 0xde, 0xcd, 0x99,
+ 0xeb, 0x2d, 0x72, 0x8b, 0x47, 0xbf, 0xb1, 0x44, 0x0c, 0x7d, 0x5e, 0x83, 0x69, 0x3b, 0x63, 0xb3,
+ 0x8a, 0xcd, 0x5f, 0x3b, 0x06, 0x36, 0xc1, 0xdf, 0x61, 0xb3, 0x20, 0x38, 0xb3, 0x2b, 0xe8, 0x27,
+ 0x73, 0x03, 0x63, 0xf2, 0x67, 0xd2, 0xf5, 0x1e, 0x3b, 0x79, 0x54, 0x31, 0x32, 0x3f, 0xa5, 0x01,
+ 0xaa, 0xa7, 0x2e, 0x0e, 0xc2, 0x04, 0xe7, 0xdd, 0x47, 0x7e, 0x3d, 0xe2, 0x0f, 0xe9, 0xe9, 0x72,
+ 0x9c, 0xd1, 0x09, 0xb6, 0xce, 0x41, 0xc6, 0xe7, 0x2b, 0x1c, 0xdd, 0x7a, 0x5d, 0xe7, 0x2c, 0xce,
+ 0xc0, 0xd7, 0x39, 0x0b, 0x82, 0x33, 0xbb, 0xa2, 0xff, 0xca, 0x08, 0xd7, 0x63, 0xb1, 0x97, 0xce,
+ 0xe7, 0x61, 0x70, 0xc3, 0x30, 0xef, 0x8b, 0x57, 0x86, 0x82, 0x6f, 0xef, 0x0b, 0x0c, 0x03, 0xbf,
+ 0x41, 0xf2, 0xff, 0xb1, 0xc0, 0x8a, 0x9e, 0x83, 0xbe, 0xba, 0x13, 0xfa, 0x91, 0xbe, 0xbd, 0x07,
+ 0x55, 0x61, 0xec, 0xcd, 0xbe, 0xb8, 0x5a, 0xc3, 0x14, 0x29, 0x72, 0x60, 0xd8, 0x11, 0x6a, 0x1f,
+ 0x71, 0x33, 0x7f, 0x67, 0x51, 0x02, 0x91, 0xfa, 0x28, 0x52, 0x5a, 0x85, 0x25, 0x38, 0xa2, 0x41,
+ 0xe9, 0x25, 0xb4, 0xf8, 0x85, 0xe9, 0x45, 0x8a, 0x4f, 0x39, 0x26, 0x60, 0x42, 0xf9, 0x89, 0x08,
+ 0x0c, 0x06, 0x86, 0xe5, 0x44, 0xe1, 0x76, 0x9e, 0x2a, 0x4a, 0x6d, 0x9d, 0x62, 0x89, 0xb5, 0x3b,
+ 0xec, 0xa7, 0x8f, 0x05, 0x72, 0xb4, 0x01, 0x83, 0xdc, 0x2f, 0x54, 0x7c, 0x42, 0x85, 0xb5, 0xc8,
+ 0xdc, 0xd5, 0x94, 0x6f, 0x03, 0xfe, 0x3f, 0x16, 0x98, 0xd1, 0x0b, 0x30, 0xec, 0x87, 0x46, 0x17,
+ 0xc3, 0xbd, 0x4d, 0x5d, 0x64, 0x71, 0x21, 0xbc, 0xdc, 0x84, 0xa9, 0x45, 0x84, 0x1f, 0x6d, 0xc0,
+ 0x90, 0xc5, 0x1d, 0xb4, 0x84, 0xef, 0xe7, 0xdb, 0x8b, 0xc5, 0x49, 0x62, 0x28, 0xb8, 0x92, 0x40,
+ 0xfc, 0xc0, 0x21, 0xe2, 0xbc, 0x97, 0x55, 0xf8, 0x1a, 0xbe, 0xac, 0xa2, 0x17, 0x01, 0x48, 0xa8,
+ 0xfe, 0xf3, 0x67, 0x46, 0x8b, 0x6f, 0x19, 0x49, 0x89, 0x18, 0x3e, 0x6f, 0x44, 0x45, 0x3e, 0x96,
+ 0x88, 0xa0, 0x97, 0x65, 0x7d, 0xc3, 0x58, 0x6f, 0xae, 0xee, 0xe9, 0xe0, 0x0d, 0xb1, 0x3e, 0x3e,
+ 0xba, 0xea, 0x4a, 0x6a, 0x00, 0xfd, 0x37, 0x01, 0x20, 0x7e, 0xbc, 0x40, 0x9b, 0x30, 0x1c, 0x52,
+ 0xe9, 0x25, 0xd8, 0xc4, 0x4d, 0x01, 0xe6, 0xdb, 0x2b, 0xfc, 0x85, 0x23, 0xdc, 0xa8, 0x92, 0x15,
+ 0x34, 0x24, 0xce, 0xeb, 0xd8, 0x5d, 0xc0, 0x90, 0x17, 0x01, 0xcc, 0x38, 0xe4, 0x5e, 0x5f, 0xf1,
+ 0xb5, 0x8a, 0xc2, 0xf1, 0xc5, 0x6b, 0x25, 0x45, 0xec, 0x93, 0x88, 0xe4, 0xd8, 0x5e, 0xf6, 0x17,
+ 0xb2, 0xbd, 0x7c, 0x0a, 0x4e, 0x09, 0x5b, 0x97, 0x6a, 0x9d, 0x30, 0x6d, 0x81, 0x70, 0x4f, 0x62,
+ 0x56, 0x50, 0x15, 0x15, 0x84, 0x93, 0x75, 0xd1, 0xbf, 0xd1, 0x60, 0xd8, 0x14, 0x02, 0x9a, 0xe0,
+ 0x6d, 0xcb, 0xbd, 0x3d, 0x5d, 0xcd, 0x85, 0xf2, 0x1e, 0xbf, 0x0b, 0x3d, 0x13, 0x72, 0xd5, 0xb0,
+ 0xf8, 0x88, 0x94, 0x50, 0x51, 0xaf, 0xd1, 0x6f, 0xd0, 0xeb, 0x9e, 0x6d, 0xbb, 0xa6, 0x11, 0xb0,
+ 0x20, 0x52, 0xdc, 0x6f, 0xea, 0x4e, 0x8f, 0xa3, 0x98, 0x8f, 0x31, 0xf2, 0x81, 0x7c, 0x4b, 0x74,
+ 0xa9, 0x8b, 0x21, 0x47, 0x34, 0x16, 0xb9, 0xfb, 0xe8, 0x1f, 0x6a, 0xf0, 0x28, 0x77, 0x56, 0xab,
+ 0x50, 0x99, 0x8b, 0x05, 0x6e, 0x25, 0x3c, 0xd8, 0x59, 0xe8, 0x28, 0xc1, 0x2d, 0x45, 0x87, 0x0f,
+ 0x6d, 0x29, 0x7a, 0x75, 0x7f, 0xaf, 0xfc, 0x68, 0xa5, 0x0b, 0xdc, 0xb8, 0xab, 0x1e, 0xa0, 0x97,
+ 0x60, 0xdc, 0x96, 0x43, 0xda, 0x0a, 0x26, 0x5f, 0xe8, 0xe9, 0x48, 0x89, 0x8d, 0xcb, 0xef, 0x8a,
+ 0x4a, 0x11, 0x56, 0x49, 0xcd, 0xde, 0x87, 0x71, 0x65, 0xa3, 0x1d, 0xab, 0xd2, 0xcd, 0x81, 0xc9,
+ 0xe4, 0x7e, 0x38, 0x56, 0xab, 0xa9, 0xdb, 0x30, 0x12, 0x09, 0x0b, 0xe8, 0x92, 0x44, 0x28, 0x16,
+ 0xbd, 0x6e, 0x93, 0x5d, 0x4e, 0xb5, 0xac, 0x5c, 0x87, 0xf9, 0x8b, 0x10, 0x8b, 0xf1, 0x25, 0x10,
+ 0xea, 0xbf, 0x2d, 0x5e, 0x84, 0xd6, 0x49, 0xb3, 0x65, 0x1b, 0x01, 0x79, 0xe5, 0xbf, 0xb6, 0xeb,
+ 0xff, 0x55, 0xe3, 0xe7, 0x0d, 0x17, 0x6d, 0x90, 0x01, 0xa3, 0x4d, 0x9e, 0xb2, 0x89, 0x45, 0x04,
+ 0xd3, 0x8a, 0xc7, 0x22, 0x5b, 0x89, 0xd1, 0x60, 0x19, 0x27, 0x7a, 0x00, 0x23, 0xa1, 0x30, 0x18,
+ 0x2a, 0x94, 0x6e, 0xf4, 0x26, 0x9c, 0x45, 0x72, 0x67, 0x74, 0xb4, 0x86, 0x25, 0x3e, 0x8e, 0x69,
+ 0xe9, 0x06, 0xa0, 0x74, 0x1b, 0xf4, 0x58, 0xec, 0xb5, 0xa1, 0xa9, 0x49, 0x16, 0x52, 0x9e, 0x1b,
+ 0xa1, 0xbe, 0xac, 0x94, 0xa7, 0x2f, 0xd3, 0xbf, 0x58, 0x82, 0x69, 0x71, 0xf5, 0x9c, 0x37, 0x4d,
+ 0xb7, 0xed, 0x04, 0xb1, 0x33, 0x1d, 0xf7, 0x50, 0x15, 0x44, 0x98, 0x38, 0xc9, 0xdd, 0x57, 0xb1,
+ 0x80, 0xa0, 0x3b, 0x5c, 0x91, 0xe5, 0xd4, 0x59, 0x72, 0x83, 0x98, 0x4b, 0xc8, 0xae, 0xe0, 0x4b,
+ 0x59, 0x15, 0x70, 0x76, 0x3b, 0xb4, 0x0d, 0xa8, 0x69, 0xec, 0x24, 0xb1, 0xf5, 0x90, 0x3d, 0x7b,
+ 0x25, 0x85, 0x0d, 0x67, 0x50, 0xa0, 0x07, 0x29, 0x95, 0xe4, 0x5a, 0x01, 0xa9, 0xf3, 0x21, 0x86,
+ 0x0f, 0xd2, 0xec, 0x20, 0x9d, 0x57, 0x41, 0x38, 0x59, 0x57, 0xff, 0xf0, 0x20, 0x9c, 0x57, 0x27,
+ 0x91, 0x7e, 0xa1, 0xa1, 0x13, 0xe9, 0xd3, 0xa1, 0x87, 0x04, 0x9f, 0xc8, 0xc7, 0x92, 0x1e, 0x12,
+ 0x33, 0x15, 0x8f, 0xb0, 0x23, 0xd9, 0xb0, 0xfd, 0xb0, 0x91, 0xe2, 0x2d, 0xf1, 0x35, 0xf0, 0x08,
+ 0xcd, 0x71, 0x01, 0xec, 0x3b, 0x56, 0xcf, 0xd7, 0x8f, 0x69, 0x30, 0xab, 0x16, 0xdf, 0xb0, 0x1c,
+ 0xcb, 0xdf, 0x12, 0xa1, 0xf4, 0x0f, 0xef, 0xa0, 0xc1, 0xf2, 0x7d, 0x2e, 0xe7, 0x62, 0xc4, 0x1d,
+ 0xa8, 0xa1, 0xef, 0xd3, 0xe0, 0x42, 0x62, 0x5e, 0x94, 0xc0, 0xfe, 0x87, 0xf7, 0xd5, 0x60, 0x21,
+ 0x0c, 0x96, 0xf3, 0x51, 0xe2, 0x4e, 0xf4, 0xd0, 0xe7, 0x35, 0x38, 0xdb, 0xca, 0xf2, 0xe7, 0x0c,
+ 0xaf, 0xa5, 0x85, 0x54, 0x68, 0x99, 0x1e, 0xa2, 0x0b, 0x97, 0xc5, 0x16, 0x3d, 0x9b, 0x09, 0xf6,
+ 0x71, 0x4e, 0x47, 0xf4, 0x7f, 0x5e, 0x82, 0x01, 0x66, 0xf3, 0xf1, 0xca, 0x30, 0xab, 0x67, 0x5d,
+ 0xcd, 0xb5, 0xea, 0x6a, 0x24, 0xac, 0xba, 0x9e, 0x2e, 0x4e, 0xa2, 0xb3, 0x59, 0xd7, 0xb7, 0xc0,
+ 0x59, 0x56, 0x6d, 0xbe, 0xce, 0x14, 0x6d, 0x3e, 0xa9, 0xcf, 0xd7, 0xeb, 0xec, 0x7a, 0x7b, 0xf0,
+ 0x73, 0xc7, 0x25, 0xe8, 0x6b, 0x7b, 0x76, 0x32, 0xd0, 0xe0, 0x5d, 0xbc, 0x8c, 0x69, 0xb9, 0xfe,
+ 0x31, 0x0d, 0x26, 0x19, 0x6e, 0x89, 0xc5, 0xa0, 0x6d, 0x18, 0xf6, 0x04, 0x9b, 0x11, 0x6b, 0xb3,
+ 0x5c, 0x78, 0x68, 0x19, 0xac, 0x8b, 0xdf, 0xd8, 0xc2, 0x5f, 0x38, 0xa2, 0xa5, 0x7f, 0x79, 0x10,
+ 0x66, 0xf2, 0x1a, 0xa1, 0x1f, 0xd4, 0xe0, 0xac, 0x19, 0x4b, 0x9c, 0xf3, 0xed, 0x60, 0xcb, 0xf5,
+ 0x78, 0xdc, 0x56, 0xad, 0xb8, 0x3a, 0xa4, 0x32, 0x1f, 0xf5, 0x8a, 0x05, 0x75, 0xaf, 0x64, 0x52,
+ 0xc0, 0x39, 0x94, 0xd1, 0xcb, 0x3c, 0x08, 0x9b, 0x29, 0xdb, 0xff, 0xdc, 0x2e, 0x3c, 0x57, 0x52,
+ 0x66, 0xa0, 0xb0, 0x53, 0x51, 0x24, 0x36, 0x51, 0x2e, 0x91, 0xa3, 0xc4, 0x7d, 0x7f, 0xeb, 0x36,
+ 0xd9, 0x6d, 0x19, 0x56, 0x68, 0xf2, 0x52, 0x9c, 0x78, 0xad, 0x76, 0x4b, 0xa0, 0x52, 0x89, 0x4b,
+ 0xe5, 0x12, 0x39, 0xf4, 0x21, 0x0d, 0xc6, 0x5d, 0x39, 0x24, 0x42, 0x2f, 0xf6, 0xb2, 0x99, 0xb1,
+ 0x15, 0xb8, 0x98, 0xaf, 0x82, 0x54, 0x92, 0x74, 0x4f, 0x4c, 0xf9, 0xc9, 0x63, 0x55, 0x30, 0xde,
+ 0x95, 0x62, 0x02, 0x58, 0xce, 0x19, 0xcd, 0x55, 0x06, 0x69, 0x70, 0x9a, 0x3c, 0xeb, 0x14, 0x09,
+ 0xcc, 0xfa, 0x92, 0x63, 0x7a, 0xbb, 0xcc, 0x09, 0x97, 0x76, 0x6a, 0xb0, 0x78, 0xa7, 0x96, 0xd6,
+ 0x2b, 0x8b, 0x0a, 0x32, 0xb5, 0x53, 0x69, 0x70, 0x9a, 0xbc, 0xfe, 0xc1, 0x12, 0x9c, 0xcb, 0xd9,
+ 0x63, 0x7f, 0x6b, 0x62, 0x58, 0xfc, 0x9a, 0x06, 0x23, 0x6c, 0x0e, 0x5e, 0x21, 0x6e, 0x50, 0xac,
+ 0xaf, 0x39, 0x96, 0xa1, 0xbf, 0xaa, 0xc1, 0x54, 0x2a, 0x9d, 0x48, 0x57, 0x4e, 0x34, 0x27, 0x66,
+ 0xb4, 0xf8, 0x9a, 0x38, 0xd5, 0x5b, 0x5f, 0xec, 0x3b, 0x9e, 0x4c, 0xf3, 0xa6, 0xdf, 0x83, 0x71,
+ 0xc5, 0x30, 0x54, 0x8a, 0xb2, 0x96, 0x15, 0x1f, 0x4e, 0x0e, 0xa2, 0x56, 0xea, 0x14, 0xfe, 0x2d,
+ 0xde, 0xf2, 0x69, 0xce, 0xf6, 0xb7, 0x67, 0xcb, 0x23, 0xb1, 0xe5, 0xc3, 0x37, 0x24, 0x16, 0xbb,
+ 0xcd, 0xef, 0xe5, 0x0d, 0x89, 0x05, 0x81, 0x13, 0xb1, 0x16, 0xf9, 0xff, 0x58, 0x60, 0x45, 0xef,
+ 0x54, 0x23, 0x29, 0xae, 0xc6, 0x17, 0xcb, 0xe9, 0x64, 0xfc, 0x43, 0xb6, 0x25, 0x53, 0xb5, 0x11,
+ 0xe6, 0xaf, 0x50, 0xfc, 0x2c, 0x2b, 0x94, 0x2c, 0x62, 0x71, 0xb5, 0xc6, 0x43, 0x6c, 0x45, 0xaf,
+ 0x4f, 0xaa, 0xba, 0xbd, 0xff, 0x24, 0xd4, 0xed, 0x1e, 0x8c, 0x6e, 0x59, 0x1b, 0xc4, 0x73, 0xb8,
+ 0x0c, 0x35, 0x50, 0x5c, 0x3c, 0xbc, 0x15, 0xa3, 0xe1, 0x3a, 0x08, 0xa9, 0x00, 0xcb, 0x44, 0x90,
+ 0xa7, 0xc4, 0x83, 0x1d, 0x2c, 0x2e, 0x12, 0xc5, 0x7a, 0xf1, 0x78, 0x9c, 0x39, 0xb1, 0x60, 0x1d,
+ 0x00, 0x27, 0x0a, 0x92, 0xd8, 0xcb, 0xab, 0x54, 0x1c, 0x6a, 0x91, 0x0b, 0x1d, 0xf1, 0x6f, 0x2c,
+ 0x51, 0xa0, 0xf3, 0xda, 0x8c, 0x63, 0x6e, 0x0b, 0x1d, 0xe7, 0xd3, 0x3d, 0xc6, 0x3d, 0x17, 0xba,
+ 0x9d, 0xb8, 0x00, 0xcb, 0x44, 0xe8, 0x18, 0x9b, 0x51, 0xa4, 0x6c, 0xa1, 0xc3, 0x2c, 0x34, 0xc6,
+ 0x38, 0xde, 0xb6, 0xc8, 0x89, 0x1f, 0xfd, 0xc6, 0x12, 0x05, 0xf4, 0x82, 0xf4, 0x78, 0x09, 0xc5,
+ 0x35, 0x64, 0x5d, 0x3d, 0x5c, 0xbe, 0x39, 0x56, 0x14, 0x8d, 0xb2, 0xef, 0xf4, 0x82, 0xa4, 0x24,
+ 0x62, 0x11, 0xc4, 0x29, 0xef, 0x48, 0x29, 0x8d, 0x62, 0x73, 0xf4, 0xb1, 0x8e, 0xe6, 0xe8, 0x15,
+ 0x2a, 0x9d, 0x49, 0xce, 0x3f, 0x8c, 0x21, 0x8c, 0xc7, 0x2f, 0x30, 0xb5, 0x24, 0x10, 0xa7, 0xeb,
+ 0x73, 0x86, 0x4f, 0xea, 0xac, 0xed, 0x84, 0xcc, 0xf0, 0x79, 0x19, 0x8e, 0xa0, 0x68, 0x1b, 0xc6,
+ 0x7c, 0xc9, 0xb6, 0x7d, 0xe6, 0x54, 0xaf, 0xef, 0x97, 0xc2, 0xae, 0x9d, 0x85, 0x72, 0x93, 0x4b,
+ 0xb0, 0x42, 0x47, 0x7d, 0x5c, 0x9b, 0x3c, 0xd9, 0xc7, 0x35, 0xd4, 0x56, 0xcd, 0x56, 0xa7, 0x8e,
+ 0x24, 0x54, 0xc2, 0x81, 0x66, 0xad, 0x74, 0x69, 0xc9, 0x4e, 0xcb, 0xf5, 0xdb, 0x1e, 0x61, 0x19,
+ 0x1f, 0xd8, 0xf2, 0xa0, 0x78, 0x69, 0x97, 0x92, 0x40, 0x9c, 0xae, 0x8f, 0xbe, 0x47, 0x83, 0x49,
+ 0x7f, 0xd7, 0x0f, 0x48, 0x93, 0x1e, 0x5b, 0xae, 0x43, 0x9c, 0xc0, 0x9f, 0x39, 0x5d, 0x3c, 0xf4,
+ 0x6e, 0x2d, 0x81, 0x8b, 0x1f, 0x3b, 0xc9, 0x52, 0x9c, 0xa2, 0x49, 0x77, 0x8e, 0x1c, 0x6c, 0x61,
+ 0x66, 0xba, 0xf8, 0xce, 0x91, 0x03, 0x39, 0xf0, 0x9d, 0x23, 0x97, 0x60, 0x85, 0x0e, 0x7a, 0x02,
+ 0xc6, 0xfd, 0x30, 0xed, 0x2f, 0x9b, 0xc1, 0x33, 0x71, 0x3c, 0xbc, 0x9a, 0x0c, 0xc0, 0x6a, 0x3d,
+ 0xf4, 0x01, 0x18, 0x93, 0xcf, 0xce, 0x99, 0xb3, 0x47, 0x1d, 0x19, 0x9a, 0xf7, 0x5c, 0x06, 0x29,
+ 0x04, 0x11, 0x86, 0xb3, 0x66, 0x7c, 0x49, 0x97, 0xbf, 0xef, 0x73, 0x6c, 0x08, 0xfc, 0x32, 0x9d,
+ 0x59, 0x03, 0xe7, 0xb4, 0x44, 0x9f, 0xcd, 0x7e, 0xab, 0x9f, 0x61, 0x5b, 0x7a, 0xed, 0x48, 0xde,
+ 0xea, 0xef, 0x59, 0xc1, 0xd6, 0x9d, 0x16, 0x0f, 0xde, 0x73, 0xc8, 0x67, 0x7b, 0xfd, 0xf7, 0x34,
+ 0x80, 0x48, 0x5b, 0x73, 0x12, 0xef, 0x24, 0x75, 0x45, 0x81, 0xb5, 0xd0, 0x93, 0x76, 0x29, 0x37,
+ 0xf0, 0xbf, 0xfe, 0xbb, 0x1a, 0x4c, 0xc4, 0xd5, 0x4e, 0xe0, 0x6a, 0x64, 0xaa, 0x57, 0xa3, 0x77,
+ 0xf4, 0x36, 0xae, 0x9c, 0xfb, 0xd1, 0xff, 0x2d, 0xc9, 0xa3, 0x62, 0xd2, 0xef, 0xb6, 0x62, 0x77,
+ 0x40, 0x49, 0xdf, 0xea, 0xc5, 0xee, 0x40, 0x76, 0x70, 0x8f, 0xc7, 0x9b, 0x61, 0x87, 0xf0, 0x1d,
+ 0x8a, 0xfc, 0xd9, 0x53, 0x4e, 0x2b, 0x81, 0x25, 0x24, 0xcd, 0x27, 0xe0, 0x20, 0x61, 0xf4, 0x45,
+ 0xf9, 0x78, 0xea, 0x21, 0x58, 0xbf, 0x32, 0xe0, 0xce, 0x16, 0x1f, 0x9f, 0x98, 0x84, 0x51, 0x49,
+ 0xb1, 0x99, 0xb0, 0xa2, 0xd0, 0x4e, 0xc2, 0x8a, 0x22, 0x80, 0x51, 0x33, 0xca, 0xcc, 0x16, 0x4e,
+ 0x7b, 0x8f, 0x34, 0xa3, 0x63, 0x31, 0xce, 0xf9, 0xe6, 0x63, 0x99, 0x0c, 0x15, 0xde, 0xa2, 0x3d,
+ 0xd6, 0x77, 0x04, 0xb6, 0x2d, 0x9d, 0xf6, 0xd5, 0x9b, 0x00, 0x42, 0xf9, 0x9f, 0xd4, 0x45, 0x10,
+ 0xe4, 0xc8, 0xd1, 0xa5, 0xea, 0xdf, 0x8a, 0x60, 0x58, 0xaa, 0x97, 0x7e, 0x95, 0x1f, 0x38, 0xb1,
+ 0x57, 0x79, 0xba, 0x0d, 0xec, 0x30, 0x89, 0x74, 0x4f, 0xb6, 0x72, 0x51, 0x2a, 0xea, 0x78, 0x1b,
+ 0x44, 0x45, 0x3e, 0x96, 0x88, 0xe4, 0x18, 0xd3, 0x0c, 0x15, 0x32, 0xa6, 0x69, 0xc3, 0x69, 0x8f,
+ 0x04, 0xde, 0x6e, 0x45, 0x24, 0xe2, 0x15, 0x69, 0x72, 0x87, 0x8b, 0xc5, 0x24, 0xc3, 0x69, 0x54,
+ 0x38, 0x0b, 0xbf, 0x22, 0x00, 0x8f, 0x74, 0x14, 0x80, 0xdf, 0x0c, 0xa3, 0x01, 0x31, 0xb7, 0x1c,
+ 0xcb, 0x34, 0xec, 0xea, 0xa2, 0x08, 0x91, 0x1b, 0xcb, 0x72, 0x31, 0x08, 0xcb, 0xf5, 0xd0, 0x02,
+ 0xf4, 0xb5, 0xad, 0xba, 0xb8, 0x01, 0x7c, 0x53, 0xf4, 0x44, 0x50, 0x5d, 0x7c, 0xb8, 0x57, 0x7e,
+ 0x75, 0x6c, 0x9d, 0x12, 0x8d, 0xea, 0x5a, 0xeb, 0x7e, 0xe3, 0x5a, 0xb0, 0xdb, 0x22, 0xfe, 0xdc,
+ 0xdd, 0xea, 0x22, 0xa6, 0x8d, 0xb3, 0x0c, 0x8d, 0xc6, 0x0e, 0x61, 0x68, 0xf4, 0x29, 0x0d, 0x4e,
+ 0x1b, 0xc9, 0xd7, 0x0d, 0xe2, 0xcf, 0x8c, 0x17, 0xe7, 0x96, 0xd9, 0x2f, 0x26, 0x0b, 0x17, 0xc4,
+ 0xf8, 0x4e, 0xcf, 0xa7, 0xc9, 0xe1, 0xac, 0x3e, 0x20, 0x0f, 0x50, 0xd3, 0x6a, 0x44, 0xf9, 0x9c,
+ 0xc5, 0xaa, 0x4f, 0x14, 0xd3, 0xdb, 0xac, 0xa4, 0x30, 0xe1, 0x0c, 0xec, 0xe8, 0x01, 0x8c, 0x4a,
+ 0x42, 0x92, 0xb8, 0xc9, 0x2c, 0x1e, 0xc5, 0x23, 0x0c, 0xbf, 0xed, 0xca, 0x0f, 0x2c, 0x32, 0xa5,
+ 0xe8, 0x85, 0x55, 0x52, 0x33, 0x88, 0x57, 0x46, 0x36, 0xea, 0xc9, 0xe2, 0x2f, 0xac, 0xd9, 0x18,
+ 0x71, 0x07, 0x6a, 0x2c, 0x12, 0x98, 0xad, 0xa6, 0x5d, 0x9f, 0x99, 0x2a, 0x1e, 0xcb, 0x20, 0x91,
+ 0xc1, 0x9d, 0x6f, 0xcd, 0x44, 0x21, 0x4e, 0x12, 0x44, 0x37, 0x00, 0x11, 0xae, 0x4a, 0x8f, 0x2f,
+ 0x67, 0xfe, 0x0c, 0x8a, 0xd2, 0xd3, 0xa3, 0xa5, 0x14, 0x14, 0x67, 0xb4, 0x40, 0x81, 0xa2, 0x2b,
+ 0xe9, 0xe1, 0x96, 0x93, 0x4c, 0x4b, 0xd1, 0x51, 0x63, 0xf2, 0xdd, 0x5a, 0x2a, 0x27, 0x29, 0xbf,
+ 0xdc, 0xdc, 0xea, 0x3d, 0x27, 0xa9, 0x20, 0xdf, 0x45, 0x66, 0x52, 0xfd, 0x77, 0x34, 0xa1, 0xe5,
+ 0x3d, 0x41, 0x33, 0xa3, 0xe3, 0x7e, 0xff, 0xd5, 0xef, 0xc1, 0x4c, 0x2d, 0x0c, 0x91, 0x57, 0x4f,
+ 0x44, 0xc2, 0x7e, 0x3b, 0x8c, 0xf3, 0x57, 0x96, 0x15, 0xa3, 0xb5, 0x1a, 0xab, 0xe4, 0x23, 0x17,
+ 0xf9, 0x8a, 0x0c, 0xc4, 0x6a, 0x5d, 0xfd, 0x2b, 0x1a, 0x9c, 0x53, 0x31, 0xbb, 0x9e, 0xf5, 0x52,
+ 0xef, 0x88, 0xd1, 0x47, 0x34, 0x18, 0x8d, 0x1f, 0x10, 0x43, 0xa9, 0xa8, 0x90, 0x2b, 0x46, 0xd8,
+ 0x2b, 0xe2, 0x49, 0x2f, 0x4a, 0xe9, 0xf4, 0x6a, 0x31, 0xd0, 0xc7, 0x32, 0x69, 0xfd, 0x7f, 0x6a,
+ 0x90, 0xba, 0x99, 0xa3, 0x0d, 0x18, 0xa2, 0x44, 0x16, 0x57, 0x6b, 0x62, 0x4f, 0xbc, 0xbd, 0x98,
+ 0xc0, 0xc6, 0x50, 0xf0, 0xf7, 0x06, 0xf1, 0x03, 0x87, 0x88, 0xe9, 0x5d, 0xdf, 0x91, 0xd2, 0x64,
+ 0x88, 0xed, 0x51, 0x48, 0x22, 0x96, 0xd3, 0x6d, 0xf0, 0x1b, 0xb3, 0x5c, 0x82, 0x15, 0x3a, 0xfa,
+ 0x32, 0x40, 0xac, 0x4d, 0xe9, 0xd9, 0x6c, 0xef, 0x5f, 0x9e, 0x82, 0x33, 0xbd, 0x3a, 0x8c, 0xb1,
+ 0xbc, 0xe8, 0x64, 0xdb, 0x32, 0x83, 0xf9, 0xcd, 0x80, 0x78, 0x77, 0xee, 0xac, 0xac, 0x6f, 0x79,
+ 0xc4, 0xdf, 0x72, 0xed, 0x7a, 0xc1, 0xc4, 0xec, 0xec, 0xd6, 0xbf, 0x94, 0x89, 0x11, 0xe7, 0x50,
+ 0x62, 0x9a, 0xa4, 0x6d, 0x7e, 0xc7, 0xc6, 0xf4, 0x3a, 0xd3, 0xf6, 0xfc, 0x40, 0x44, 0xbd, 0xe2,
+ 0x9a, 0xa4, 0x24, 0x10, 0xa7, 0xeb, 0x27, 0x91, 0xb0, 0x1c, 0x50, 0x4c, 0x24, 0xd6, 0xd2, 0x48,
+ 0x18, 0x10, 0xa7, 0xeb, 0xcb, 0x48, 0xf8, 0x4a, 0xd1, 0xf3, 0x66, 0x20, 0x8d, 0x24, 0x02, 0xe2,
+ 0x74, 0x7d, 0x54, 0x87, 0x8b, 0x1e, 0x31, 0xdd, 0x66, 0x93, 0x38, 0x75, 0x36, 0x29, 0x2b, 0x86,
+ 0xd7, 0xb0, 0x9c, 0x1b, 0x9e, 0xc1, 0x2a, 0x32, 0xc5, 0xbc, 0xc6, 0xd2, 0x35, 0x5e, 0xc4, 0x1d,
+ 0xea, 0xe1, 0x8e, 0x58, 0x50, 0x13, 0x4e, 0xf1, 0x5c, 0xe0, 0x5e, 0xd5, 0x09, 0x88, 0xb7, 0x6d,
+ 0xd8, 0x42, 0xfb, 0x7e, 0xd8, 0x15, 0x63, 0x67, 0xe0, 0x5d, 0x15, 0x15, 0x4e, 0xe2, 0x46, 0xbb,
+ 0x54, 0xf2, 0x15, 0xdd, 0x91, 0x48, 0x0e, 0x17, 0x22, 0x29, 0xa4, 0xdf, 0x14, 0x3a, 0x9c, 0x45,
+ 0x03, 0x55, 0xe1, 0x74, 0x60, 0x78, 0x0d, 0x12, 0x54, 0xd6, 0xee, 0xae, 0x11, 0xcf, 0xa4, 0x3c,
+ 0xd6, 0xe6, 0x82, 0xb0, 0xc6, 0x51, 0xad, 0xa7, 0xc1, 0x38, 0xab, 0x0d, 0xfa, 0x00, 0xbc, 0x46,
+ 0x9d, 0xd4, 0x65, 0xf7, 0x01, 0xf1, 0x16, 0xdc, 0xb6, 0x53, 0x57, 0x91, 0x03, 0x43, 0xfe, 0xd8,
+ 0xfe, 0x5e, 0xf9, 0x35, 0xb8, 0x9b, 0x06, 0xb8, 0x3b, 0xbc, 0xe9, 0x0e, 0xdc, 0x6d, 0xb5, 0x32,
+ 0x3b, 0x30, 0x9a, 0xd7, 0x81, 0x9c, 0x06, 0xb8, 0x3b, 0xbc, 0x08, 0xc3, 0x59, 0x3e, 0x31, 0x3c,
+ 0xb9, 0xa8, 0x44, 0x71, 0x8c, 0x51, 0x64, 0xdf, 0xef, 0x7a, 0x66, 0x0d, 0x9c, 0xd3, 0x92, 0x9e,
+ 0x29, 0x57, 0xf3, 0x86, 0x9f, 0x22, 0x33, 0xce, 0xc8, 0xbc, 0x6e, 0x7f, 0xaf, 0x7c, 0x15, 0x77,
+ 0xd9, 0x06, 0x77, 0x8d, 0x3d, 0xa3, 0x2b, 0xf1, 0x44, 0xa4, 0xba, 0x32, 0x91, 0xd7, 0x95, 0xfc,
+ 0x36, 0xb8, 0x6b, 0xec, 0xe8, 0x7b, 0x35, 0x38, 0x6f, 0xb6, 0xda, 0xb7, 0x2c, 0x3f, 0x70, 0x1b,
+ 0x9e, 0xd1, 0x5c, 0x24, 0xa6, 0xb1, 0x7b, 0xcb, 0xb0, 0x37, 0x97, 0xad, 0x4d, 0x22, 0xe4, 0xf9,
+ 0xc3, 0x7e, 0x38, 0xcc, 0xa1, 0xb6, 0xb2, 0x76, 0x37, 0x1b, 0x29, 0xce, 0xa7, 0x87, 0x7e, 0x48,
+ 0x83, 0x8b, 0x3c, 0xbf, 0x77, 0x4e, 0x87, 0x26, 0x0b, 0x75, 0x88, 0x71, 0xb1, 0x95, 0x0e, 0x78,
+ 0x71, 0x47, 0xaa, 0x6c, 0x92, 0x78, 0x85, 0xf9, 0x46, 0xc3, 0x23, 0x0d, 0x86, 0x35, 0xe2, 0x2e,
+ 0x53, 0xc5, 0x27, 0x69, 0x25, 0x0f, 0x29, 0xce, 0xa7, 0x87, 0x5e, 0x80, 0xcb, 0xb9, 0xc0, 0x8a,
+ 0xdb, 0x76, 0x02, 0xf6, 0xbe, 0xd1, 0xb7, 0xa0, 0xef, 0xef, 0x95, 0x2f, 0xaf, 0x74, 0xac, 0x89,
+ 0x0f, 0xc0, 0xa4, 0x7f, 0x4a, 0x03, 0xe1, 0x79, 0x87, 0x2e, 0x2a, 0x36, 0x1b, 0xc3, 0x09, 0x7b,
+ 0x8d, 0x30, 0x6b, 0x5f, 0x29, 0x33, 0x6b, 0xdf, 0x6b, 0xa5, 0x20, 0x91, 0x23, 0xb1, 0x38, 0xcc,
+ 0x31, 0x4b, 0x29, 0xb3, 0x1f, 0x87, 0x91, 0xe8, 0x46, 0x22, 0x34, 0x45, 0x2c, 0x62, 0x7e, 0x7c,
+ 0x75, 0x89, 0xe1, 0xfa, 0x6f, 0x69, 0x00, 0x71, 0x32, 0xca, 0xee, 0x12, 0x7d, 0x1f, 0x68, 0x46,
+ 0x2e, 0xa5, 0x71, 0xef, 0xcb, 0x4d, 0xe3, 0x7e, 0x4c, 0x79, 0xbb, 0x7f, 0x5e, 0x83, 0x53, 0x6a,
+ 0xd4, 0x4e, 0x1f, 0xbd, 0x06, 0x86, 0x44, 0xac, 0x71, 0x11, 0x2c, 0x98, 0x35, 0x15, 0xa1, 0xc7,
+ 0x70, 0x08, 0x53, 0x9f, 0xf6, 0x7a, 0x50, 0xdd, 0x66, 0x07, 0x0f, 0x3d, 0x40, 0x8b, 0xfa, 0x23,
+ 0xa7, 0x61, 0x90, 0x1b, 0xd0, 0x52, 0x49, 0x2d, 0x23, 0xe4, 0xca, 0xed, 0xe2, 0xf1, 0xb0, 0x8b,
+ 0x84, 0xa5, 0x90, 0xb3, 0x82, 0x95, 0x3a, 0x66, 0x05, 0xc3, 0xd0, 0x67, 0x7a, 0x56, 0x2f, 0x66,
+ 0x1c, 0x15, 0x5c, 0xe5, 0x66, 0x1c, 0x15, 0x5c, 0xc5, 0x14, 0x19, 0xbd, 0x3f, 0x4b, 0xf6, 0x0d,
+ 0xfd, 0xc5, 0xef, 0xcf, 0x7c, 0x02, 0x24, 0x2b, 0x87, 0x89, 0x8e, 0x16, 0x0e, 0x61, 0x24, 0xe0,
+ 0x81, 0xe2, 0x6e, 0x1d, 0x62, 0xca, 0xbb, 0x89, 0x04, 0x1c, 0x7e, 0x48, 0x83, 0xb9, 0x1f, 0xd2,
+ 0x26, 0x0c, 0x89, 0x4f, 0x41, 0x88, 0x7c, 0x6f, 0xef, 0x21, 0xf7, 0xad, 0x94, 0x65, 0x83, 0x17,
+ 0xe0, 0x10, 0x39, 0xbd, 0x47, 0x34, 0x8d, 0x1d, 0xab, 0xd9, 0x6e, 0x32, 0x39, 0x6f, 0x40, 0xae,
+ 0xca, 0x8a, 0x71, 0x08, 0x67, 0x55, 0xb9, 0x37, 0x0c, 0x93, 0xcb, 0xe4, 0xaa, 0xbc, 0x18, 0x87,
+ 0x70, 0xf4, 0x1c, 0x0c, 0x37, 0x8d, 0x9d, 0x5a, 0xdb, 0x6b, 0x10, 0x61, 0xdd, 0x90, 0x7f, 0xed,
+ 0x6f, 0x07, 0x96, 0x3d, 0x67, 0x39, 0x81, 0x1f, 0x78, 0x73, 0x55, 0x27, 0xb8, 0xe3, 0xd5, 0x02,
+ 0x2f, 0xca, 0x2e, 0xbe, 0x22, 0xb0, 0xe0, 0x08, 0x1f, 0xb2, 0x61, 0xa2, 0x69, 0xec, 0xdc, 0x75,
+ 0x0c, 0x1e, 0xe4, 0x59, 0xc8, 0x51, 0x45, 0x28, 0x30, 0x95, 0xc6, 0x8a, 0x82, 0x0b, 0x27, 0x70,
+ 0x67, 0x58, 0xd2, 0x8d, 0x1d, 0x97, 0x25, 0xdd, 0x7c, 0xe4, 0x5f, 0xce, 0xf5, 0xa1, 0xe7, 0x33,
+ 0xa3, 0x52, 0x75, 0xf4, 0x1d, 0x7f, 0x3e, 0xf2, 0x1d, 0x9f, 0x28, 0x6e, 0xfa, 0xd5, 0xc1, 0x6f,
+ 0xbc, 0x0d, 0xa3, 0x75, 0x23, 0x30, 0x78, 0xa9, 0x3f, 0x73, 0xaa, 0xf8, 0xd3, 0xde, 0x62, 0x84,
+ 0x26, 0x66, 0x49, 0x71, 0x99, 0x8f, 0x65, 0x3a, 0xe8, 0x0e, 0x9c, 0xa1, 0x1f, 0xab, 0x4d, 0x82,
+ 0xb8, 0x0a, 0xd3, 0x8a, 0x4c, 0xb2, 0xef, 0x87, 0xf9, 0x17, 0xdd, 0xce, 0xaa, 0x80, 0xb3, 0xdb,
+ 0xc5, 0x11, 0x14, 0xa7, 0xb2, 0x23, 0x28, 0xa2, 0x8f, 0x67, 0xd9, 0x2c, 0x20, 0x36, 0xa7, 0xef,
+ 0x2a, 0xce, 0x1b, 0x0a, 0x5b, 0x2e, 0xfc, 0x0b, 0x0d, 0x66, 0xc4, 0x2e, 0x13, 0x76, 0x06, 0x36,
+ 0xf1, 0x56, 0x0c, 0xc7, 0x68, 0x10, 0x4f, 0x28, 0x19, 0xd7, 0x7b, 0xe0, 0x0f, 0x29, 0x9c, 0x91,
+ 0x53, 0xff, 0xa3, 0xfb, 0x7b, 0xe5, 0x2b, 0x07, 0xd5, 0xc2, 0xb9, 0x7d, 0x43, 0x1e, 0x0c, 0xf9,
+ 0xbb, 0xbe, 0x19, 0xd8, 0xfe, 0xcc, 0x34, 0xdb, 0x2c, 0x37, 0x7b, 0xe0, 0xac, 0x35, 0x8e, 0x89,
+ 0xb3, 0xd6, 0x38, 0xb7, 0x13, 0x2f, 0xc5, 0x21, 0x21, 0xf4, 0x03, 0x1a, 0x4c, 0x89, 0x97, 0x07,
+ 0x29, 0x68, 0xca, 0x99, 0xe2, 0x1e, 0x0e, 0x95, 0x24, 0xb2, 0xd0, 0xb6, 0x80, 0xe9, 0x0b, 0x52,
+ 0x50, 0x9c, 0xa6, 0x4e, 0x0f, 0xd5, 0x96, 0x67, 0xb9, 0x9e, 0x15, 0xec, 0x32, 0x2b, 0x8e, 0x81,
+ 0x30, 0xc4, 0x2e, 0x2f, 0xc3, 0x11, 0x14, 0xd5, 0x60, 0x82, 0xdf, 0xcb, 0x6b, 0x81, 0x67, 0x04,
+ 0xa4, 0xb1, 0x2b, 0x4c, 0x2d, 0x1e, 0x67, 0x39, 0x10, 0x15, 0xc8, 0xc3, 0xbd, 0xf2, 0x19, 0xb1,
+ 0x36, 0x2a, 0x00, 0x27, 0x50, 0xa0, 0xf7, 0x25, 0x2c, 0x5f, 0x66, 0x8a, 0xe7, 0x47, 0xe2, 0x6b,
+ 0x71, 0x18, 0xfb, 0x97, 0x5e, 0x43, 0x3a, 0xf5, 0x10, 0xa3, 0x7e, 0xf6, 0x49, 0x18, 0x93, 0x77,
+ 0xcd, 0xa1, 0x22, 0x49, 0x05, 0x80, 0xd2, 0x83, 0x3d, 0xee, 0x08, 0x2d, 0xfa, 0x4f, 0x68, 0x30,
+ 0x99, 0x94, 0x5d, 0xd0, 0x16, 0x0c, 0x09, 0x46, 0x26, 0xa8, 0xce, 0x17, 0x35, 0xf9, 0xb4, 0x89,
+ 0x70, 0xec, 0xe4, 0xa2, 0xb0, 0x28, 0xc2, 0x21, 0x7a, 0xd9, 0x9c, 0xbb, 0xd4, 0xc1, 0x9c, 0xfb,
+ 0x29, 0x38, 0x9b, 0xcd, 0xd2, 0xe8, 0x45, 0xc2, 0xb0, 0x6d, 0xf7, 0x81, 0x50, 0x4b, 0xc6, 0x59,
+ 0xa5, 0x69, 0x21, 0xe6, 0x30, 0xfd, 0xfd, 0x90, 0xcc, 0xcd, 0x82, 0x5e, 0x80, 0x11, 0xdf, 0xdf,
+ 0xe2, 0x46, 0x3a, 0x62, 0x90, 0xc5, 0x94, 0xf9, 0x61, 0x9c, 0x7c, 0x7e, 0xf7, 0x89, 0x7e, 0xe2,
+ 0x18, 0xfd, 0xc2, 0xb3, 0x5f, 0xfa, 0xca, 0xe5, 0x57, 0xfd, 0xf6, 0x57, 0x2e, 0xbf, 0xea, 0xcb,
+ 0x5f, 0xb9, 0xfc, 0xaa, 0xef, 0xdc, 0xbf, 0xac, 0x7d, 0x69, 0xff, 0xb2, 0xf6, 0xdb, 0xfb, 0x97,
+ 0xb5, 0x2f, 0xef, 0x5f, 0xd6, 0xfe, 0x64, 0xff, 0xb2, 0xf6, 0xfd, 0xff, 0xf9, 0xf2, 0xab, 0x9e,
+ 0xbb, 0x1e, 0x53, 0xbf, 0x16, 0x12, 0x8d, 0xff, 0x69, 0xdd, 0x6f, 0x5c, 0xa3, 0xd4, 0x43, 0x6f,
+ 0x7e, 0x46, 0xfd, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xd9, 0x79, 0x96, 0x5c, 0x22, 0x01,
+ 0x00,
}
func (m *APIServerLogging) Marshal() (dAtA []byte, err error) {
@@ -8188,6 +8315,16 @@ func (m *CloudProfile) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ {
+ size, err := m.Status.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
{
size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@@ -8454,6 +8591,57 @@ func (m *CloudProfileSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *CloudProfileStatus) 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 *CloudProfileStatus) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *CloudProfileStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.MachineImageVersions) > 0 {
+ for iNdEx := len(m.MachineImageVersions) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.MachineImageVersions[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ }
+ if len(m.KubernetesVersions) > 0 {
+ for iNdEx := len(m.KubernetesVersions) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.KubernetesVersions[iNdEx].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 *ClusterAutoscaler) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -10164,6 +10352,20 @@ func (m *ExpirableVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ if len(m.Lifecycle) > 0 {
+ for iNdEx := len(m.Lifecycle) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.Lifecycle[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x22
+ }
+ }
if m.Classification != nil {
i -= len(*m.Classification)
copy(dAtA[i:], *m.Classification)
@@ -10191,6 +10393,39 @@ func (m *ExpirableVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *ExpirableVersionStatus) 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 *ExpirableVersionStatus) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ExpirableVersionStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ i -= len(m.Classification)
+ copy(dAtA[i:], m.Classification)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Classification)))
+ i--
+ dAtA[i] = 0x12
+ i -= len(m.Version)
+ copy(dAtA[i:], m.Version)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Version)))
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
func (m *ExposureClass) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -12573,6 +12808,46 @@ func (m *LastOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *LifecycleStage) 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 *LifecycleStage) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *LifecycleStage) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.StartTime != nil {
+ {
+ size, err := m.StartTime.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ i -= len(m.Classification)
+ copy(dAtA[i:], m.Classification)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Classification)))
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
func (m *Limits) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -12912,6 +13187,48 @@ func (m *MachineImageVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *MachineImageVersionStatus) 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 *MachineImageVersionStatus) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MachineImageVersionStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Versions) > 0 {
+ for iNdEx := len(m.Versions) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.Versions[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ }
+ i -= len(m.Name)
+ copy(dAtA[i:], m.Name)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name)))
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
func (m *MachineType) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -19329,6 +19646,8 @@ func (m *CloudProfile) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
l = m.Spec.Size()
n += 1 + l + sovGenerated(uint64(l))
+ l = m.Status.Size()
+ n += 1 + l + sovGenerated(uint64(l))
return n
}
@@ -19425,6 +19744,27 @@ func (m *CloudProfileSpec) Size() (n int) {
return n
}
+func (m *CloudProfileStatus) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if len(m.KubernetesVersions) > 0 {
+ for _, e := range m.KubernetesVersions {
+ l = e.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ if len(m.MachineImageVersions) > 0 {
+ for _, e := range m.MachineImageVersions {
+ l = e.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ return n
+}
+
func (m *ClusterAutoscaler) Size() (n int) {
if m == nil {
return 0
@@ -20089,6 +20429,25 @@ func (m *ExpirableVersion) Size() (n int) {
l = len(*m.Classification)
n += 1 + l + sovGenerated(uint64(l))
}
+ if len(m.Lifecycle) > 0 {
+ for _, e := range m.Lifecycle {
+ l = e.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ return n
+}
+
+func (m *ExpirableVersionStatus) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Version)
+ n += 1 + l + sovGenerated(uint64(l))
+ l = len(m.Classification)
+ n += 1 + l + sovGenerated(uint64(l))
return n
}
@@ -20967,6 +21326,21 @@ func (m *LastOperation) Size() (n int) {
return n
}
+func (m *LifecycleStage) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Classification)
+ n += 1 + l + sovGenerated(uint64(l))
+ if m.StartTime != nil {
+ l = m.StartTime.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ return n
+}
+
func (m *Limits) Size() (n int) {
if m == nil {
return 0
@@ -21103,6 +21477,23 @@ func (m *MachineImageVersion) Size() (n int) {
return n
}
+func (m *MachineImageVersionStatus) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Name)
+ n += 1 + l + sovGenerated(uint64(l))
+ if len(m.Versions) > 0 {
+ for _, e := range m.Versions {
+ l = e.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ return n
+}
+
func (m *MachineType) Size() (n int) {
if m == nil {
return 0
@@ -23683,6 +24074,7 @@ func (this *CloudProfile) String() string {
s := strings.Join([]string{`&CloudProfile{`,
`ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`,
`Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CloudProfileSpec", "CloudProfileSpec", 1), `&`, ``, 1) + `,`,
+ `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CloudProfileStatus", "CloudProfileStatus", 1), `&`, ``, 1) + `,`,
`}`,
}, "")
return s
@@ -23760,6 +24152,27 @@ func (this *CloudProfileSpec) String() string {
}, "")
return s
}
+func (this *CloudProfileStatus) String() string {
+ if this == nil {
+ return "nil"
+ }
+ repeatedStringForKubernetesVersions := "[]ExpirableVersionStatus{"
+ for _, f := range this.KubernetesVersions {
+ repeatedStringForKubernetesVersions += strings.Replace(strings.Replace(f.String(), "ExpirableVersionStatus", "ExpirableVersionStatus", 1), `&`, ``, 1) + ","
+ }
+ repeatedStringForKubernetesVersions += "}"
+ repeatedStringForMachineImageVersions := "[]MachineImageVersionStatus{"
+ for _, f := range this.MachineImageVersions {
+ repeatedStringForMachineImageVersions += strings.Replace(strings.Replace(f.String(), "MachineImageVersionStatus", "MachineImageVersionStatus", 1), `&`, ``, 1) + ","
+ }
+ repeatedStringForMachineImageVersions += "}"
+ s := strings.Join([]string{`&CloudProfileStatus{`,
+ `KubernetesVersions:` + repeatedStringForKubernetesVersions + `,`,
+ `MachineImageVersions:` + repeatedStringForMachineImageVersions + `,`,
+ `}`,
+ }, "")
+ return s
+}
func (this *ClusterAutoscaler) String() string {
if this == nil {
return "nil"
@@ -24189,10 +24602,27 @@ func (this *ExpirableVersion) String() string {
if this == nil {
return "nil"
}
+ repeatedStringForLifecycle := "[]LifecycleStage{"
+ for _, f := range this.Lifecycle {
+ repeatedStringForLifecycle += strings.Replace(strings.Replace(f.String(), "LifecycleStage", "LifecycleStage", 1), `&`, ``, 1) + ","
+ }
+ repeatedStringForLifecycle += "}"
s := strings.Join([]string{`&ExpirableVersion{`,
`Version:` + fmt.Sprintf("%v", this.Version) + `,`,
`ExpirationDate:` + strings.Replace(fmt.Sprintf("%v", this.ExpirationDate), "Time", "v11.Time", 1) + `,`,
`Classification:` + valueToStringGenerated(this.Classification) + `,`,
+ `Lifecycle:` + repeatedStringForLifecycle + `,`,
+ `}`,
+ }, "")
+ return s
+}
+func (this *ExpirableVersionStatus) String() string {
+ if this == nil {
+ return "nil"
+ }
+ s := strings.Join([]string{`&ExpirableVersionStatus{`,
+ `Version:` + fmt.Sprintf("%v", this.Version) + `,`,
+ `Classification:` + fmt.Sprintf("%v", this.Classification) + `,`,
`}`,
}, "")
return s
@@ -24751,6 +25181,17 @@ func (this *LastOperation) String() string {
}, "")
return s
}
+func (this *LifecycleStage) String() string {
+ if this == nil {
+ return "nil"
+ }
+ s := strings.Join([]string{`&LifecycleStage{`,
+ `Classification:` + fmt.Sprintf("%v", this.Classification) + `,`,
+ `StartTime:` + strings.Replace(fmt.Sprintf("%v", this.StartTime), "Time", "v11.Time", 1) + `,`,
+ `}`,
+ }, "")
+ return s
+}
func (this *Limits) String() string {
if this == nil {
return "nil"
@@ -24841,6 +25282,22 @@ func (this *MachineImageVersion) String() string {
}, "")
return s
}
+func (this *MachineImageVersionStatus) String() string {
+ if this == nil {
+ return "nil"
+ }
+ repeatedStringForVersions := "[]ExpirableVersionStatus{"
+ for _, f := range this.Versions {
+ repeatedStringForVersions += strings.Replace(strings.Replace(f.String(), "ExpirableVersionStatus", "ExpirableVersionStatus", 1), `&`, ``, 1) + ","
+ }
+ repeatedStringForVersions += "}"
+ s := strings.Join([]string{`&MachineImageVersionStatus{`,
+ `Name:` + fmt.Sprintf("%v", this.Name) + `,`,
+ `Versions:` + repeatedStringForVersions + `,`,
+ `}`,
+ }, "")
+ return s
+}
func (this *MachineType) String() string {
if this == nil {
return "nil"
@@ -30550,6 +31007,39 @@ func (m *CloudProfile) Unmarshal(dAtA []byte) error {
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 err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -31264,7 +31754,7 @@ func (m *CloudProfileSpec) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error {
+func (m *CloudProfileStatus) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -31287,15 +31777,15 @@ func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: ClusterAutoscaler: wiretype end group for non-group")
+ return fmt.Errorf("proto: CloudProfileStatus: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: ClusterAutoscaler: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: CloudProfileStatus: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterAdd", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field KubernetesVersions", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -31322,16 +31812,14 @@ func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if m.ScaleDownDelayAfterAdd == nil {
- m.ScaleDownDelayAfterAdd = &v11.Duration{}
- }
- if err := m.ScaleDownDelayAfterAdd.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ m.KubernetesVersions = append(m.KubernetesVersions, ExpirableVersionStatus{})
+ if err := m.KubernetesVersions[len(m.KubernetesVersions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterDelete", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field MachineImageVersions", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -31358,52 +31846,172 @@ func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if m.ScaleDownDelayAfterDelete == nil {
- m.ScaleDownDelayAfterDelete = &v11.Duration{}
- }
- if err := m.ScaleDownDelayAfterDelete.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ m.MachineImageVersions = append(m.MachineImageVersions, MachineImageVersionStatus{})
+ if err := m.MachineImageVersions[len(m.MachineImageVersions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
- case 3:
- if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterFailure", 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
+ 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 m.ScaleDownDelayAfterFailure == nil {
- m.ScaleDownDelayAfterFailure = &v11.Duration{}
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *ClusterAutoscaler) 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 err := m.ScaleDownDelayAfterFailure.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
- return err
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
}
- iNdEx = postIndex
- case 4:
+ 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: ClusterAutoscaler: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ClusterAutoscaler: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownUnneededTime", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterAdd", 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.ScaleDownDelayAfterAdd == nil {
+ m.ScaleDownDelayAfterAdd = &v11.Duration{}
+ }
+ if err := m.ScaleDownDelayAfterAdd.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterDelete", 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.ScaleDownDelayAfterDelete == nil {
+ m.ScaleDownDelayAfterDelete = &v11.Duration{}
+ }
+ if err := m.ScaleDownDelayAfterDelete.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownDelayAfterFailure", 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.ScaleDownDelayAfterFailure == nil {
+ m.ScaleDownDelayAfterFailure = &v11.Duration{}
+ }
+ if err := m.ScaleDownDelayAfterFailure.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ScaleDownUnneededTime", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -36219,6 +36827,154 @@ func (m *ExpirableVersion) Unmarshal(dAtA []byte) error {
s := VersionClassification(dAtA[iNdEx:postIndex])
m.Classification = &s
iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Lifecycle", 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.Lifecycle = append(m.Lifecycle, LifecycleStage{})
+ if err := m.Lifecycle[len(m.Lifecycle)-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 *ExpirableVersionStatus) 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: ExpirableVersionStatus: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ExpirableVersionStatus: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ 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
+ }
+ m.Version = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Classification", 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.Classification = VersionClassification(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -43353,6 +44109,124 @@ func (m *LastOperation) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *LifecycleStage) 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: LifecycleStage: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: LifecycleStage: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Classification", 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.Classification = VersionClassification(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field StartTime", 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.StartTime == nil {
+ m.StartTime = &v11.Time{}
+ }
+ if err := m.StartTime.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 *Limits) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -44312,6 +45186,122 @@ func (m *MachineImageVersion) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *MachineImageVersionStatus) 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: MachineImageVersionStatus: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: MachineImageVersionStatus: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Name", 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.Name = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Versions", 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.Versions = append(m.Versions, ExpirableVersionStatus{})
+ if err := m.Versions[len(m.Versions)-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 *MachineType) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
diff --git a/pkg/apis/core/v1beta1/generated.proto b/pkg/apis/core/v1beta1/generated.proto
index e356bd711d3..4fa958980a4 100644
--- a/pkg/apis/core/v1beta1/generated.proto
+++ b/pkg/apis/core/v1beta1/generated.proto
@@ -411,6 +411,9 @@ message CloudProfile {
// Spec defines the provider environment properties.
// +optional
optional CloudProfileSpec spec = 2;
+
+ // Status contains the current status of the cloud profile.
+ optional CloudProfileStatus status = 3;
}
// CloudProfileList is a collection of CloudProfiles.
@@ -495,6 +498,15 @@ message CloudProfileSpec {
repeated CapabilityDefinition capabilities = 12;
}
+// CloudProfileStatus contains the status of the cloud profile.
+message CloudProfileStatus {
+ // KubernetesVersions contains the statuses of the kubernetes versions.
+ repeated ExpirableVersionStatus kubernetesVersions = 1;
+
+ // MachineImageVersions contains the statuses of the machine image versions.
+ repeated MachineImageVersionStatus machineImageVersions = 2;
+}
+
// ClusterAutoscaler contains the configuration flags for the Kubernetes cluster autoscaler.
message ClusterAutoscaler {
// ScaleDownDelayAfterAdd defines how long after scale up that scale down evaluation resumes (default: 1 hour).
@@ -1026,13 +1038,27 @@ message ExpirableVersion {
// Version is the version identifier.
optional string version = 1;
- // ExpirationDate defines the time at which this version expires.
+ // Deprecated: Is replaced by Lifecycle.
// +optional
optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time expirationDate = 2;
- // Classification defines the state of a version (preview, supported, deprecated)
+ // Classification defines the state of a version (preview, supported, deprecated).
+ // Deprecated: Is replaced by Lifecycle.
// +optional
optional string classification = 3;
+
+ // Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with Classification and ExpirationDate.
+ // +optional
+ repeated LifecycleStage lifecycle = 4;
+}
+
+// ExpirableVersionStatus defines the current status of an expirable version.
+message ExpirableVersionStatus {
+ // Version is the version identifier.
+ optional string version = 1;
+
+ // Classification reflects the current state in the classification lifecycle.
+ optional string classification = 2;
}
// ExposureClass represents a control plane endpoint exposure strategy.
@@ -1850,6 +1876,15 @@ message LastOperation {
optional string type = 5;
}
+message LifecycleStage {
+ // Classification is the category of this lifecycle stage (unavailable, preview, supported, deprecated, expired).
+ optional string classification = 1;
+
+ // StartTime defines when this lifecycle stage becomes active.
+ // +optional
+ optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time startTime = 2;
+}
+
// Limits configures operational limits for Shoot clusters using this CloudProfile.
// See https://github.com/gardener/gardener/blob/master/docs/usage/shoot/shoot_limits.md.
message Limits {
@@ -1963,6 +1998,14 @@ message MachineImageVersion {
repeated CapabilitySet capabilitySets = 6;
}
+message MachineImageVersionStatus {
+ // Name matches the name of the MachineImage the status is represented of.
+ optional string name = 1;
+
+ // Versions contains the statuses of the machine image versions.
+ repeated ExpirableVersionStatus versions = 2;
+}
+
// MachineType contains certain properties of a machine type.
message MachineType {
// CPU is the number of CPUs for this machine type.
diff --git a/pkg/apis/core/v1beta1/helper/cloudprofile.go b/pkg/apis/core/v1beta1/helper/cloudprofile.go
index a9252d7f095..0248251f409 100644
--- a/pkg/apis/core/v1beta1/helper/cloudprofile.go
+++ b/pkg/apis/core/v1beta1/helper/cloudprofile.go
@@ -13,11 +13,119 @@ import (
"github.com/Masterminds/semver/v3"
"k8s.io/apimachinery/pkg/util/sets"
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1"
gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1"
"github.com/gardener/gardener/pkg/apis/core/v1beta1/constants"
versionutils "github.com/gardener/gardener/pkg/utils/version"
)
+func CurrentLifecycleClassification(version v1beta1.ExpirableVersion) v1beta1.VersionClassification {
+ var (
+ currentClassification = v1beta1.ClassificationUnavailable
+ currentTime = time.Now()
+ )
+
+ if version.Classification != nil || version.ExpirationDate != nil {
+ // old cloud profile definition, convert to lifecycle
+ // this can be removed as soon as we remove the old classification and expiration date fields
+
+ if version.Classification != nil {
+ version.Lifecycle = append(version.Lifecycle, v1beta1.LifecycleStage{
+ Classification: *version.Classification,
+ })
+ }
+
+ if version.ExpirationDate != nil {
+ if version.Classification == nil {
+ version.Lifecycle = append(version.Lifecycle, v1beta1.LifecycleStage{
+ Classification: v1beta1.ClassificationSupported,
+ })
+ }
+
+ version.Lifecycle = append(version.Lifecycle, v1beta1.LifecycleStage{
+ Classification: v1beta1.ClassificationExpired,
+ StartTime: version.ExpirationDate,
+ })
+ }
+ }
+
+ if len(version.Lifecycle) == 0 {
+ // when there is no classification lifecycle defined then default to supported
+ version.Lifecycle = append(version.Lifecycle, v1beta1.LifecycleStage{
+ Classification: v1beta1.ClassificationSupported,
+ })
+ }
+
+ for _, stage := range version.Lifecycle {
+ startTime := time.Time{}
+ if stage.StartTime != nil {
+ startTime = stage.StartTime.Time
+ }
+
+ if startTime.Before(currentTime) {
+ currentClassification = stage.Classification
+ }
+ }
+
+ return currentClassification
+}
+
+func VersionIsExpired(version v1beta1.ExpirableVersion) bool {
+ return CurrentLifecycleClassification(version) == v1beta1.ClassificationExpired
+}
+
+func VersionIsActive(version v1beta1.ExpirableVersion) bool {
+ curr := CurrentLifecycleClassification(version)
+ return curr != v1beta1.ClassificationExpired && curr != v1beta1.ClassificationUnavailable
+}
+
+func VersionIsSupported(version v1beta1.ExpirableVersion) bool {
+ return CurrentLifecycleClassification(version) == v1beta1.ClassificationSupported
+}
+
+func VersionIsPreview(version v1beta1.ExpirableVersion) bool {
+ return CurrentLifecycleClassification(version) == v1beta1.ClassificationPreview
+}
+
+func DurationUntilNextVersionLifecycleStage(cloudProfile *v1beta1.CloudProfileSpec) time.Duration {
+ var (
+ next time.Time
+ now = time.Now()
+ )
+
+ for _, version := range cloudProfile.Kubernetes.Versions {
+ for _, stage := range version.Lifecycle {
+ if stage.StartTime == nil {
+ continue
+ }
+ time := stage.StartTime.Time
+ if now.Before(time) && next.IsZero() || next.After(time) {
+ next = time
+ }
+ }
+ }
+
+ for _, image := range cloudProfile.MachineImages {
+ for _, version := range image.Versions {
+
+ for _, stage := range version.Lifecycle {
+ if stage.StartTime == nil {
+ continue
+ }
+ time := stage.StartTime.Time
+ if now.Before(time) && next.After(time) {
+ next = time
+ }
+ }
+ }
+ }
+
+ if next.IsZero() {
+ return 0
+ }
+ return next.Sub(now)
+}
+
// 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.
@@ -505,7 +613,7 @@ func FilterLowerVersion(currentSemVerVersion semver.Version) VersionPredicate {
// returns true if it is expired
func FilterExpiredVersion() func(expirableVersion gardencorev1beta1.ExpirableVersion, version *semver.Version) (bool, error) {
return func(expirableVersion gardencorev1beta1.ExpirableVersion, _ *semver.Version) (bool, error) {
- return expirableVersion.ExpirationDate != nil && (time.Now().UTC().After(expirableVersion.ExpirationDate.UTC()) || time.Now().UTC().Equal(expirableVersion.ExpirationDate.UTC())), nil
+ return VersionIsExpired(expirableVersion), nil
}
}
diff --git a/pkg/apis/core/v1beta1/helper/cloudprofile_test.go b/pkg/apis/core/v1beta1/helper/cloudprofile_test.go
index cf64ccc46cf..acae478f3e3 100644
--- a/pkg/apis/core/v1beta1/helper/cloudprofile_test.go
+++ b/pkg/apis/core/v1beta1/helper/cloudprofile_test.go
@@ -17,12 +17,148 @@ import (
. "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper"
)
-var _ = Describe("Helper", func() {
+var _ = Describe("CloudProfile Helper", func() {
var (
trueVar = true
expirationDateInThePast = metav1.Time{Time: time.Now().AddDate(0, 0, -1)}
+ now = time.Now()
)
+ Context("calculate the current lifecycle classification", func() {
+ It("only version is given", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationSupported))
+ })
+
+ It("unavailable classification due to scheduled lifecycle start in the future", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationUnavailable))
+ })
+
+ It("version is in preview stage", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationPreview))
+ })
+
+ It("full version lifecycle with version currently in supported stage", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-3 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(5 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(8 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationSupported))
+ })
+
+ It("version is expired", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-4 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-3 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationExpired))
+ })
+
+ It("first lifecycle start time field is optional", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Version: "1.28.5",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationPreview,
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.NewTime(now.Add(4 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: ptr.To(metav1.NewTime(now.Add(5 * time.Hour))),
+ },
+ },
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationPreview))
+ })
+
+ It("determining supported for deprecated classification field", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Classification: ptr.To(gardencorev1beta1.ClassificationSupported),
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationSupported))
+ })
+
+ It("determining expired for deprecated expiration date field", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ ExpirationDate: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ Version: "1.28.0",
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationExpired))
+ })
+
+ It("determining preview for deprecated classification and expiration date field", func() {
+ classification := CurrentLifecycleClassification(gardencorev1beta1.ExpirableVersion{
+ Classification: ptr.To(gardencorev1beta1.ClassificationPreview),
+ Version: "1.28.0",
+ ExpirationDate: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ })
+ Expect(classification).To(Equal(gardencorev1beta1.ClassificationPreview))
+ })
+
+ })
+
Describe("#FindMachineImageVersion", func() {
var machineImages []gardencorev1beta1.MachineImage
diff --git a/pkg/apis/core/v1beta1/types_cloudprofile.go b/pkg/apis/core/v1beta1/types_cloudprofile.go
index c67ec808afc..b1b711d8c24 100644
--- a/pkg/apis/core/v1beta1/types_cloudprofile.go
+++ b/pkg/apis/core/v1beta1/types_cloudprofile.go
@@ -29,6 +29,8 @@ type CloudProfile struct {
// Spec defines the provider environment properties.
// +optional
Spec CloudProfileSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
+ // Status contains the current status of the cloud profile.
+ Status CloudProfileStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
@@ -160,11 +162,24 @@ type ExpirableVersion struct {
// Version is the version identifier.
Version string `json:"version" protobuf:"bytes,1,opt,name=version"`
// ExpirationDate defines the time at which this version expires.
+ // Deprecated: Is replaced by Lifecycle.
// +optional
ExpirationDate *metav1.Time `json:"expirationDate,omitempty" protobuf:"bytes,2,opt,name=expirationDate"`
- // Classification defines the state of a version (preview, supported, deprecated)
+ // Classification defines the state of a version (preview, supported, deprecated).
+ // Deprecated: Is replaced by Lifecycle.
// +optional
Classification *VersionClassification `json:"classification,omitempty" protobuf:"bytes,3,opt,name=classification,casttype=VersionClassification"`
+ // Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with Classification and ExpirationDate.
+ // +optional
+ Lifecycle []LifecycleStage `json:"lifecycle,omitempty" protobuf:"bytes,4,opt,name=lifecycle"`
+}
+
+type LifecycleStage struct {
+ // Classification is the category of this lifecycle stage (unavailable, preview, supported, deprecated, expired).
+ Classification VersionClassification `json:"classification" protobuf:"bytes,1,opt,name=classification,casttype=VersionClassification"`
+ // StartTime defines when this lifecycle stage becomes active.
+ // +optional
+ StartTime *metav1.Time `json:"startTime,omitempty" protobuf:"bytes,2,opt,name=startTime"`
}
// MachineType contains certain properties of a machine type.
@@ -292,6 +307,29 @@ type Limits struct {
MaxNodesTotal *int32 `json:"maxNodesTotal,omitempty" protobuf:"varint,1,opt,name=maxNodesTotal"`
}
+// CloudProfileStatus contains the status of the cloud profile.
+type CloudProfileStatus struct {
+ // KubernetesVersions contains the statuses of the kubernetes versions.
+ KubernetesVersions []ExpirableVersionStatus `json:"kubernetesVersions,omitempty" protobuf:"bytes,1,name=kubernetesVersions"`
+ // MachineImageVersions contains the statuses of the machine image versions.
+ MachineImageVersions []MachineImageVersionStatus `json:"machineImageVersions,omitempty" protobuf:"bytes,2,name=machineImageVersions"`
+}
+
+type MachineImageVersionStatus struct {
+ // Name matches the name of the MachineImage the status is represented of.
+ Name string `json:"name,omitempty" protobuf:"bytes,1,name=name"`
+ // Versions contains the statuses of the machine image versions.
+ Versions []ExpirableVersionStatus `json:"versions,omitempty" protobuf:"bytes,2,name=versions"`
+}
+
+// ExpirableVersionStatus defines the current status of an expirable version.
+type ExpirableVersionStatus struct {
+ // Version is the version identifier.
+ Version string `json:"version" protobuf:"bytes,1,opt,name=version"`
+ // Classification reflects the current state in the classification lifecycle.
+ Classification VersionClassification `json:"classification,omitempty" protobuf:"bytes,2,opt,name=classification,casttype=VersionClassification"`
+}
+
const (
// VolumeClassStandard is a constant for the standard volume class.
VolumeClassStandard string = "standard"
@@ -303,6 +341,8 @@ const (
type VersionClassification string
const (
+ // ClassificationUnavailable indicates that a version is currently not available and is planned to become available depending on the classification lifecycle.
+ ClassificationUnavailable VersionClassification = "unavailable"
// ClassificationPreview indicates that a version has recently been added and not promoted to "Supported" yet.
// ClassificationPreview versions will not be considered for automatic Kubernetes and Machine Image patch version updates.
ClassificationPreview VersionClassification = "preview"
@@ -313,6 +353,9 @@ const (
// ClassificationDeprecated indicates that a patch version should not be used anymore, should be updated to a new version
// and will eventually expire.
ClassificationDeprecated VersionClassification = "deprecated"
+ // ClassificationExpired indicates that a version has expired.
+ // New entities with that version cannot be created and existing entities are forcefully migrated to a higher version during the maintenance time.
+ ClassificationExpired VersionClassification = "expired"
)
// MachineImageUpdateStrategy is the update strategy to use for a machine image
diff --git a/pkg/apis/core/v1beta1/zz_generated.conversion.go b/pkg/apis/core/v1beta1/zz_generated.conversion.go
index 3e15354abec..ab6575267ad 100644
--- a/pkg/apis/core/v1beta1/zz_generated.conversion.go
+++ b/pkg/apis/core/v1beta1/zz_generated.conversion.go
@@ -361,6 +361,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
+ if err := s.AddGeneratedConversionFunc((*CloudProfileStatus)(nil), (*core.CloudProfileStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus(a.(*CloudProfileStatus), b.(*core.CloudProfileStatus), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddGeneratedConversionFunc((*core.CloudProfileStatus)(nil), (*CloudProfileStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus(a.(*core.CloudProfileStatus), b.(*CloudProfileStatus), scope)
+ }); err != nil {
+ return err
+ }
if err := s.AddGeneratedConversionFunc((*ClusterAutoscaler)(nil), (*core.ClusterAutoscaler)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_ClusterAutoscaler_To_core_ClusterAutoscaler(a.(*ClusterAutoscaler), b.(*core.ClusterAutoscaler), scope)
}); err != nil {
@@ -671,6 +681,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
+ if err := s.AddGeneratedConversionFunc((*ExpirableVersionStatus)(nil), (*core.ExpirableVersionStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_v1beta1_ExpirableVersionStatus_To_core_ExpirableVersionStatus(a.(*ExpirableVersionStatus), b.(*core.ExpirableVersionStatus), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddGeneratedConversionFunc((*core.ExpirableVersionStatus)(nil), (*ExpirableVersionStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_core_ExpirableVersionStatus_To_v1beta1_ExpirableVersionStatus(a.(*core.ExpirableVersionStatus), b.(*ExpirableVersionStatus), scope)
+ }); err != nil {
+ return err
+ }
if err := s.AddGeneratedConversionFunc((*ExposureClass)(nil), (*core.ExposureClass)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_ExposureClass_To_core_ExposureClass(a.(*ExposureClass), b.(*core.ExposureClass), scope)
}); err != nil {
@@ -1006,6 +1026,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
+ if err := s.AddGeneratedConversionFunc((*LifecycleStage)(nil), (*core.LifecycleStage)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_v1beta1_LifecycleStage_To_core_LifecycleStage(a.(*LifecycleStage), b.(*core.LifecycleStage), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddGeneratedConversionFunc((*core.LifecycleStage)(nil), (*LifecycleStage)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_core_LifecycleStage_To_v1beta1_LifecycleStage(a.(*core.LifecycleStage), b.(*LifecycleStage), scope)
+ }); err != nil {
+ return err
+ }
if err := s.AddGeneratedConversionFunc((*Limits)(nil), (*core.Limits)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_Limits_To_core_Limits(a.(*Limits), b.(*core.Limits), scope)
}); err != nil {
@@ -1066,6 +1096,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
+ if err := s.AddGeneratedConversionFunc((*MachineImageVersionStatus)(nil), (*core.MachineImageVersionStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_v1beta1_MachineImageVersionStatus_To_core_MachineImageVersionStatus(a.(*MachineImageVersionStatus), b.(*core.MachineImageVersionStatus), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddGeneratedConversionFunc((*core.MachineImageVersionStatus)(nil), (*MachineImageVersionStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_core_MachineImageVersionStatus_To_v1beta1_MachineImageVersionStatus(a.(*core.MachineImageVersionStatus), b.(*MachineImageVersionStatus), scope)
+ }); err != nil {
+ return err
+ }
if err := s.AddGeneratedConversionFunc((*MachineType)(nil), (*core.MachineType)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_MachineType_To_core_MachineType(a.(*MachineType), b.(*core.MachineType), scope)
}); err != nil {
@@ -2719,6 +2759,9 @@ func autoConvert_v1beta1_CloudProfile_To_core_CloudProfile(in *CloudProfile, out
if err := Convert_v1beta1_CloudProfileSpec_To_core_CloudProfileSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
+ if err := Convert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
return nil
}
@@ -2732,6 +2775,9 @@ func autoConvert_core_CloudProfile_To_v1beta1_CloudProfile(in *core.CloudProfile
if err := Convert_core_CloudProfileSpec_To_v1beta1_CloudProfileSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
+ if err := Convert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
return nil
}
@@ -2830,6 +2876,28 @@ func Convert_core_CloudProfileSpec_To_v1beta1_CloudProfileSpec(in *core.CloudPro
return autoConvert_core_CloudProfileSpec_To_v1beta1_CloudProfileSpec(in, out, s)
}
+func autoConvert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus(in *CloudProfileStatus, out *core.CloudProfileStatus, s conversion.Scope) error {
+ out.KubernetesVersions = *(*[]core.ExpirableVersionStatus)(unsafe.Pointer(&in.KubernetesVersions))
+ out.MachineImageVersions = *(*[]core.MachineImageVersionStatus)(unsafe.Pointer(&in.MachineImageVersions))
+ return nil
+}
+
+// Convert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus is an autogenerated conversion function.
+func Convert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus(in *CloudProfileStatus, out *core.CloudProfileStatus, s conversion.Scope) error {
+ return autoConvert_v1beta1_CloudProfileStatus_To_core_CloudProfileStatus(in, out, s)
+}
+
+func autoConvert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus(in *core.CloudProfileStatus, out *CloudProfileStatus, s conversion.Scope) error {
+ out.KubernetesVersions = *(*[]ExpirableVersionStatus)(unsafe.Pointer(&in.KubernetesVersions))
+ out.MachineImageVersions = *(*[]MachineImageVersionStatus)(unsafe.Pointer(&in.MachineImageVersions))
+ return nil
+}
+
+// Convert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus is an autogenerated conversion function.
+func Convert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus(in *core.CloudProfileStatus, out *CloudProfileStatus, s conversion.Scope) error {
+ return autoConvert_core_CloudProfileStatus_To_v1beta1_CloudProfileStatus(in, out, s)
+}
+
func autoConvert_v1beta1_ClusterAutoscaler_To_core_ClusterAutoscaler(in *ClusterAutoscaler, out *core.ClusterAutoscaler, s conversion.Scope) error {
out.ScaleDownDelayAfterAdd = (*metav1.Duration)(unsafe.Pointer(in.ScaleDownDelayAfterAdd))
out.ScaleDownDelayAfterDelete = (*metav1.Duration)(unsafe.Pointer(in.ScaleDownDelayAfterDelete))
@@ -3621,6 +3689,7 @@ func autoConvert_v1beta1_ExpirableVersion_To_core_ExpirableVersion(in *Expirable
out.Version = in.Version
out.ExpirationDate = (*metav1.Time)(unsafe.Pointer(in.ExpirationDate))
out.Classification = (*core.VersionClassification)(unsafe.Pointer(in.Classification))
+ out.Lifecycle = *(*[]core.LifecycleStage)(unsafe.Pointer(&in.Lifecycle))
return nil
}
@@ -3633,6 +3702,7 @@ func autoConvert_core_ExpirableVersion_To_v1beta1_ExpirableVersion(in *core.Expi
out.Version = in.Version
out.ExpirationDate = (*metav1.Time)(unsafe.Pointer(in.ExpirationDate))
out.Classification = (*VersionClassification)(unsafe.Pointer(in.Classification))
+ out.Lifecycle = *(*[]LifecycleStage)(unsafe.Pointer(&in.Lifecycle))
return nil
}
@@ -3641,6 +3711,28 @@ func Convert_core_ExpirableVersion_To_v1beta1_ExpirableVersion(in *core.Expirabl
return autoConvert_core_ExpirableVersion_To_v1beta1_ExpirableVersion(in, out, s)
}
+func autoConvert_v1beta1_ExpirableVersionStatus_To_core_ExpirableVersionStatus(in *ExpirableVersionStatus, out *core.ExpirableVersionStatus, s conversion.Scope) error {
+ out.Version = in.Version
+ out.Classification = core.VersionClassification(in.Classification)
+ return nil
+}
+
+// Convert_v1beta1_ExpirableVersionStatus_To_core_ExpirableVersionStatus is an autogenerated conversion function.
+func Convert_v1beta1_ExpirableVersionStatus_To_core_ExpirableVersionStatus(in *ExpirableVersionStatus, out *core.ExpirableVersionStatus, s conversion.Scope) error {
+ return autoConvert_v1beta1_ExpirableVersionStatus_To_core_ExpirableVersionStatus(in, out, s)
+}
+
+func autoConvert_core_ExpirableVersionStatus_To_v1beta1_ExpirableVersionStatus(in *core.ExpirableVersionStatus, out *ExpirableVersionStatus, s conversion.Scope) error {
+ out.Version = in.Version
+ out.Classification = VersionClassification(in.Classification)
+ return nil
+}
+
+// Convert_core_ExpirableVersionStatus_To_v1beta1_ExpirableVersionStatus is an autogenerated conversion function.
+func Convert_core_ExpirableVersionStatus_To_v1beta1_ExpirableVersionStatus(in *core.ExpirableVersionStatus, out *ExpirableVersionStatus, s conversion.Scope) error {
+ return autoConvert_core_ExpirableVersionStatus_To_v1beta1_ExpirableVersionStatus(in, out, s)
+}
+
func autoConvert_v1beta1_ExposureClass_To_core_ExposureClass(in *ExposureClass, out *core.ExposureClass, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
out.Handler = in.Handler
@@ -4683,6 +4775,28 @@ func Convert_core_LastOperation_To_v1beta1_LastOperation(in *core.LastOperation,
return autoConvert_core_LastOperation_To_v1beta1_LastOperation(in, out, s)
}
+func autoConvert_v1beta1_LifecycleStage_To_core_LifecycleStage(in *LifecycleStage, out *core.LifecycleStage, s conversion.Scope) error {
+ out.Classification = core.VersionClassification(in.Classification)
+ out.StartTime = (*metav1.Time)(unsafe.Pointer(in.StartTime))
+ return nil
+}
+
+// Convert_v1beta1_LifecycleStage_To_core_LifecycleStage is an autogenerated conversion function.
+func Convert_v1beta1_LifecycleStage_To_core_LifecycleStage(in *LifecycleStage, out *core.LifecycleStage, s conversion.Scope) error {
+ return autoConvert_v1beta1_LifecycleStage_To_core_LifecycleStage(in, out, s)
+}
+
+func autoConvert_core_LifecycleStage_To_v1beta1_LifecycleStage(in *core.LifecycleStage, out *LifecycleStage, s conversion.Scope) error {
+ out.Classification = VersionClassification(in.Classification)
+ out.StartTime = (*metav1.Time)(unsafe.Pointer(in.StartTime))
+ return nil
+}
+
+// Convert_core_LifecycleStage_To_v1beta1_LifecycleStage is an autogenerated conversion function.
+func Convert_core_LifecycleStage_To_v1beta1_LifecycleStage(in *core.LifecycleStage, out *LifecycleStage, s conversion.Scope) error {
+ return autoConvert_core_LifecycleStage_To_v1beta1_LifecycleStage(in, out, s)
+}
+
func autoConvert_v1beta1_Limits_To_core_Limits(in *Limits, out *core.Limits, s conversion.Scope) error {
out.MaxNodesTotal = (*int32)(unsafe.Pointer(in.MaxNodesTotal))
return nil
@@ -4853,6 +4967,28 @@ func Convert_core_MachineImageVersion_To_v1beta1_MachineImageVersion(in *core.Ma
return autoConvert_core_MachineImageVersion_To_v1beta1_MachineImageVersion(in, out, s)
}
+func autoConvert_v1beta1_MachineImageVersionStatus_To_core_MachineImageVersionStatus(in *MachineImageVersionStatus, out *core.MachineImageVersionStatus, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Versions = *(*[]core.ExpirableVersionStatus)(unsafe.Pointer(&in.Versions))
+ return nil
+}
+
+// Convert_v1beta1_MachineImageVersionStatus_To_core_MachineImageVersionStatus is an autogenerated conversion function.
+func Convert_v1beta1_MachineImageVersionStatus_To_core_MachineImageVersionStatus(in *MachineImageVersionStatus, out *core.MachineImageVersionStatus, s conversion.Scope) error {
+ return autoConvert_v1beta1_MachineImageVersionStatus_To_core_MachineImageVersionStatus(in, out, s)
+}
+
+func autoConvert_core_MachineImageVersionStatus_To_v1beta1_MachineImageVersionStatus(in *core.MachineImageVersionStatus, out *MachineImageVersionStatus, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Versions = *(*[]ExpirableVersionStatus)(unsafe.Pointer(&in.Versions))
+ return nil
+}
+
+// Convert_core_MachineImageVersionStatus_To_v1beta1_MachineImageVersionStatus is an autogenerated conversion function.
+func Convert_core_MachineImageVersionStatus_To_v1beta1_MachineImageVersionStatus(in *core.MachineImageVersionStatus, out *MachineImageVersionStatus, s conversion.Scope) error {
+ return autoConvert_core_MachineImageVersionStatus_To_v1beta1_MachineImageVersionStatus(in, out, s)
+}
+
func autoConvert_v1beta1_MachineType_To_core_MachineType(in *MachineType, out *core.MachineType, s conversion.Scope) error {
out.CPU = in.CPU
out.GPU = in.GPU
diff --git a/pkg/apis/core/v1beta1/zz_generated.deepcopy.go b/pkg/apis/core/v1beta1/zz_generated.deepcopy.go
index ac9a0319f9f..f204e02d510 100644
--- a/pkg/apis/core/v1beta1/zz_generated.deepcopy.go
+++ b/pkg/apis/core/v1beta1/zz_generated.deepcopy.go
@@ -816,6 +816,7 @@ func (in *CloudProfile) DeepCopyInto(out *CloudProfile) {
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
return
}
@@ -963,6 +964,34 @@ func (in *CloudProfileSpec) DeepCopy() *CloudProfileSpec {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CloudProfileStatus) DeepCopyInto(out *CloudProfileStatus) {
+ *out = *in
+ if in.KubernetesVersions != nil {
+ in, out := &in.KubernetesVersions, &out.KubernetesVersions
+ *out = make([]ExpirableVersionStatus, len(*in))
+ copy(*out, *in)
+ }
+ if in.MachineImageVersions != nil {
+ in, out := &in.MachineImageVersions, &out.MachineImageVersions
+ *out = make([]MachineImageVersionStatus, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudProfileStatus.
+func (in *CloudProfileStatus) DeepCopy() *CloudProfileStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(CloudProfileStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterAutoscaler) DeepCopyInto(out *ClusterAutoscaler) {
*out = *in
@@ -1910,6 +1939,13 @@ func (in *ExpirableVersion) DeepCopyInto(out *ExpirableVersion) {
*out = new(VersionClassification)
**out = **in
}
+ if in.Lifecycle != nil {
+ in, out := &in.Lifecycle, &out.Lifecycle
+ *out = make([]LifecycleStage, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
return
}
@@ -1923,6 +1959,22 @@ func (in *ExpirableVersion) DeepCopy() *ExpirableVersion {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ExpirableVersionStatus) DeepCopyInto(out *ExpirableVersionStatus) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExpirableVersionStatus.
+func (in *ExpirableVersionStatus) DeepCopy() *ExpirableVersionStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ExpirableVersionStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ExposureClass) DeepCopyInto(out *ExposureClass) {
*out = *in
@@ -3153,6 +3205,26 @@ func (in *LastOperation) DeepCopy() *LastOperation {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LifecycleStage) DeepCopyInto(out *LifecycleStage) {
+ *out = *in
+ if in.StartTime != nil {
+ in, out := &in.StartTime, &out.StartTime
+ *out = (*in).DeepCopy()
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LifecycleStage.
+func (in *LifecycleStage) DeepCopy() *LifecycleStage {
+ if in == nil {
+ return nil
+ }
+ out := new(LifecycleStage)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Limits) DeepCopyInto(out *Limits) {
*out = *in
@@ -3341,6 +3413,27 @@ func (in *MachineImageVersion) DeepCopy() *MachineImageVersion {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MachineImageVersionStatus) DeepCopyInto(out *MachineImageVersionStatus) {
+ *out = *in
+ if in.Versions != nil {
+ in, out := &in.Versions, &out.Versions
+ *out = make([]ExpirableVersionStatus, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineImageVersionStatus.
+func (in *MachineImageVersionStatus) DeepCopy() *MachineImageVersionStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(MachineImageVersionStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachineType) DeepCopyInto(out *MachineType) {
*out = *in
diff --git a/pkg/apis/core/validation/cloudprofile.go b/pkg/apis/core/validation/cloudprofile.go
index f59c8a1817d..efc98b6a7b5 100644
--- a/pkg/apis/core/validation/cloudprofile.go
+++ b/pkg/apis/core/validation/cloudprofile.go
@@ -47,8 +47,74 @@ func ValidateCloudProfileUpdate(newProfile, oldProfile *core.CloudProfile) field
allErrs := field.ErrorList{}
allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&newProfile.ObjectMeta, &oldProfile.ObjectMeta, field.NewPath("metadata"))...)
- allErrs = append(allErrs, ValidateCloudProfile(newProfile)...)
allErrs = append(allErrs, ValidateCloudProfileSpecUpdate(&newProfile.Spec, &oldProfile.Spec, field.NewPath("spec"))...)
+ allErrs = append(allErrs, ValidateCloudProfile(newProfile)...)
+
+ return allErrs
+}
+
+// ValidateCloudProfileStatusUpdate validates the status of a CloudProfile object before an update.
+func ValidateCloudProfileStatusUpdate(_, _ *core.CloudProfile) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ return allErrs
+}
+
+// ValidateCloudProfileSpecUpdate validates the spec update of a CloudProfile
+func ValidateCloudProfileSpecUpdate(new, old *core.CloudProfileSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ allErrs = append(allErrs, validateCloudProfileLimitsUpdate(new.Limits, old.Limits, fldPath.Child("limits"))...)
+ allErrs = append(allErrs, ValidateCloudProfileExpirableVersionsUpdate(new.Kubernetes.Versions, old.Kubernetes.Versions, fldPath.Child("kubernetes").Child("versions"))...)
+
+ oldMachineImageVersions := map[string]core.MachineImage{}
+ for _, version := range old.MachineImages {
+ oldMachineImageVersions[version.Name] = version
+ }
+
+ for i, newMachineImage := range new.MachineImages {
+ oldMachineImage, ok := oldMachineImageVersions[newMachineImage.Name]
+ if !ok {
+ continue
+ }
+
+ var (
+ oldVersions, newVersions []core.ExpirableVersion
+ )
+
+ for _, oldVersion := range oldMachineImage.Versions {
+ oldVersions = append(oldVersions, oldVersion.ExpirableVersion)
+ }
+ for _, newVersion := range newMachineImage.Versions {
+ newVersions = append(newVersions, newVersion.ExpirableVersion)
+ }
+
+ allErrs = append(allErrs, ValidateCloudProfileExpirableVersionsUpdate(newVersions, oldVersions, fldPath.Child("machineImages").Index(i).Child("versions"))...)
+ }
+
+ return allErrs
+}
+
+// ValidateCloudProfileExpirableVersionsUpdate validates the expirable versions update of a CloudProfile expirable version
+func ValidateCloudProfileExpirableVersionsUpdate(new, old []core.ExpirableVersion, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ oldVersions := map[string]core.ExpirableVersion{}
+ for _, version := range old {
+ oldVersions[version.Version] = version
+ }
+
+ for i, newVersion := range new {
+ oldVersion, ok := oldVersions[newVersion.Version]
+ if !ok {
+ continue
+ }
+
+ if helper.CurrentLifecycleClassification(oldVersion) != core.ClassificationUnavailable &&
+ helper.CurrentLifecycleClassification(newVersion) == core.ClassificationUnavailable {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Index(i), "a version cannot be turned unavailable if it was already moved into a later lifecycle stage"))
+ }
+ }
return allErrs
}
@@ -86,12 +152,14 @@ func ValidateCloudProfileSpec(spec *core.CloudProfileSpec, fldPath *field.Path)
return allErrs
}
-// ValidateCloudProfileSpecUpdate validates a CloudProfileSpec before an update.
-func ValidateCloudProfileSpecUpdate(newSpec, oldSpec *core.CloudProfileSpec, fldPath *field.Path) field.ErrorList {
+func validateCloudProfileKubernetesClassificationLifecycleStartTimesOrder(kubernetes *core.KubernetesSettings, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
-
- allErrs = append(allErrs, validateCloudProfileLimitsUpdate(newSpec.Limits, oldSpec.Limits, fldPath.Child("limits"))...)
-
+ if kubernetes == nil {
+ return allErrs
+ }
+ for i, version := range kubernetes.Versions {
+ allErrs = append(allErrs, validateLifecycleStartTimes(version.Lifecycle, fldPath.Child("versions").Index(i))...)
+ }
return allErrs
}
@@ -108,6 +176,12 @@ func validateCloudProfileKubernetesSettings(kubernetes core.KubernetesSettings,
allErrs = append(allErrs, field.Invalid(fldPath.Child("versions[]").Child("expirationDate"), latestKubernetesVersion.ExpirationDate, fmt.Sprintf("expiration date of latest kubernetes version ('%s') must not be set", latestKubernetesVersion.Version)))
}
+ if len(latestKubernetesVersion.Lifecycle) > 0 {
+ if latestKubernetesVersion.Lifecycle[len(latestKubernetesVersion.Lifecycle)-1].Classification == core.ClassificationExpired {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("versions[]").Child("lifecycle"), latestKubernetesVersion.ExpirationDate, fmt.Sprintf("expiration date of latest kubernetes version ('%s') must not be set", latestKubernetesVersion.Version)))
+ }
+ }
+
allErrs = append(allErrs, validateKubernetesVersions(kubernetes.Versions, fldPath)...)
for i, version := range kubernetes.Versions {
@@ -121,7 +195,7 @@ func validateCloudProfileKubernetesSettings(kubernetes core.KubernetesSettings,
func validateSupportedVersionsConfiguration(version core.ExpirableVersion, allVersions []core.ExpirableVersion, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
- if version.Classification != nil && *version.Classification == core.ClassificationSupported {
+ if helper.VersionIsSupported(version) {
currentSemVer, err := semver.NewVersion(version.Version)
if err != nil {
// check is already performed by caller, avoid duplicate error
@@ -134,15 +208,51 @@ func validateSupportedVersionsConfiguration(version core.ExpirableVersion, allVe
return allErrs
}
- // do not allow adding multiple supported versions per minor version
+ // do not allow adding multiple overlapping supported versions per minor version
if len(filteredVersions) > 0 {
- allErrs = append(allErrs, field.Forbidden(fldPath, fmt.Sprintf("unable to add version %q with classification %q. Only one %q version is allowed per minor version", version.Version, core.ClassificationSupported, core.ClassificationSupported)))
+ for _, possibleOverlap := range filteredVersions {
+ if supportedVersionsOverlapping(version, possibleOverlap) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, fmt.Sprintf("unable to add version %q with classification %q. %q lifecycle stages must not overlap per minor version", version.Version, core.ClassificationSupported, core.ClassificationSupported)))
+ }
+ }
}
}
return allErrs
}
+// supportedVersionsOverlapping checks whether supported classifications do overlap. Start time equality is not deemed an overlap in this context.
+func supportedVersionsOverlapping(v1, v2 core.ExpirableVersion) bool {
+ if len(v1.Lifecycle) == 0 || len(v2.Lifecycle) == 0 {
+ return true
+ }
+
+ supportedStage := helper.SupportedLifecycleClassification(v1)
+ nextStage := findLifecycleStageAbove(v1, supportedStage.Classification)
+ supportedStage2 := helper.SupportedLifecycleClassification(v2)
+ nextStage2 := findLifecycleStageAbove(v2, supportedStage2.Classification)
+
+ if supportedStage.Classification != core.ClassificationSupported ||
+ supportedStage.Classification != supportedStage2.Classification {
+ return false
+ }
+ if nextStage == nil && nextStage2 == nil || // Eventually both supported classifications will be supported simultaneously
+ nextStage == nil && (supportedStage.StartTime == nil || supportedStage.StartTime.Before(nextStage2.StartTime)) || // supportedStage has no subsequent classification and starts before nextStage2
+ nextStage2 == nil && (supportedStage2.StartTime == nil || supportedStage2.StartTime.Before(nextStage.StartTime)) { // supportedStage2 has no subsequent classification and starts before nextStage
+ return true
+ }
+ return false
+}
+
+func findLifecycleStageAbove(version core.ExpirableVersion, classification core.VersionClassification) *core.LifecycleStage {
+ for _, stage := range version.Lifecycle {
+ if stage.Classification.Compare(classification) > 0 {
+ return &stage
+ }
+ }
+ return nil
+}
+
func validateCloudProfileMachineTypes(machineTypes []core.MachineType, capabilities core.Capabilities, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
@@ -183,6 +293,7 @@ func ValidateCloudProfileMachineImages(machineImages []core.MachineImage, capabi
for index, machineVersion := range image.Versions {
versionsPath := idxPath.Child("versions").Index(index)
allErrs = append(allErrs, validateContainerRuntimesInterfaces(machineVersion.CRI, versionsPath.Child("cri"))...)
+ allErrs = append(allErrs, validateExpirableVersion(machineVersion.ExpirableVersion, versionsPath)...)
allErrs = append(allErrs, validateSupportedVersionsConfiguration(machineVersion.ExpirableVersion, helper.ToExpirableVersions(image.Versions), versionsPath)...)
if len(capabilities) == 0 {
diff --git a/pkg/apis/core/validation/cloudprofile_test.go b/pkg/apis/core/validation/cloudprofile_test.go
index 6142cbde13c..b547def71c5 100644
--- a/pkg/apis/core/validation/cloudprofile_test.go
+++ b/pkg/apis/core/validation/cloudprofile_test.go
@@ -107,6 +107,7 @@ var (
supportedClassification = core.ClassificationSupported
previewClassification = core.ClassificationPreview
deprecatedClassification = core.ClassificationDeprecated
+ expiredClassification = core.ClassificationExpired
updateStrategyMajor = core.MachineImageUpdateStrategy("major")
)
@@ -176,6 +177,31 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
},
},
}
+ duplicatedMachineImage = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
)
BeforeEach(func() {
@@ -312,7 +338,7 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
}))))
})
- It("should forbid expiration date on latest kubernetes version", func() {
+ It("should forbid (deprecated) expiration date on latest kubernetes version", func() {
expirationDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
{
@@ -334,6 +360,232 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
}))))
})
+ It("should forbid expired lifecycle stage on latest kubernetes version", func() {
+ expirationDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: deprecatedClassification},
+ {Classification: expiredClassification, StartTime: expirationDate},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.kubernetes.versions[].lifecycle"),
+ }))))
+ })
+
+ It("should forbid specifying lifecycle and classification at the same time", func() {
+ deprecatedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Classification: &supportedClassification,
+ Lifecycle: []core.LifecycleStage{
+ {Classification: deprecatedClassification, StartTime: deprecatedDate},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeForbidden),
+ "Field": Equal("spec.kubernetes.versions[0]"),
+ }))))
+ })
+
+ It("should allow multiple directly following lifecycle stages with same start time", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification, StartTime: supportedDate},
+ {Classification: deprecatedClassification, StartTime: supportedDate},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(BeEmpty())
+ })
+
+ It("should forbid multiple lifecycle stages with same classification", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ {Classification: supportedClassification, StartTime: supportedDate},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.kubernetes.versions[0].lifecycle"),
+ "Detail": Equal("duplicate classification stage in lifecycle"),
+ }))))
+ })
+
+ It("should forbid unordered lifecycle stages", func() {
+ now := time.Now()
+
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: deprecatedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(1 * time.Hour)))},
+ {Classification: supportedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour)))},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.kubernetes.versions[0].lifecycle"),
+ "Detail": Equal("lifecycle classifications not in order, must be preview -> supported -> deprecated -> expired"),
+ }))))
+ })
+
+ It("should forbid missing start time for subsequent lifecycle stages", func() {
+ previewDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ deprecatedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 3)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification, StartTime: previewDate},
+ {Classification: supportedClassification},
+ {Classification: deprecatedClassification, StartTime: deprecatedDate},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.kubernetes.versions[0].lifecycle[1]"),
+ "Detail": Equal("only the leading lifecycle elements can have the start time optional"),
+ }))))
+ })
+
+ It("should forbid lifecycle start times that are not monotonically increasing", func() {
+ now := time.Now()
+
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification, StartTime: ptr.To(metav1.NewTime(now.Add(0 * time.Hour)))},
+ {Classification: supportedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(2 * time.Hour)))},
+ {Classification: deprecatedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(1 * time.Hour)))},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.kubernetes.versions[0].lifecycle[2]"),
+ "Detail": Equal("lifecycle start times must be monotonically increasing"),
+ }))))
+ })
+
+ It("should allow multiple missing start times for leading lifecycle stages", func() {
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: supportedClassification},
+ {Classification: deprecatedClassification},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(BeEmpty())
+ })
+
+ It("should allow missing start time for first lifecycle stage", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ deprecatedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 2)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: supportedClassification, StartTime: supportedDate},
+ {Classification: deprecatedClassification, StartTime: deprecatedDate},
+ },
+ },
+ {
+ Version: "1.2.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(BeEmpty())
+ })
+
It("should forbid duplicated kubernetes versions", func() {
cloudProfile.Spec.Kubernetes = duplicatedKubernetes
@@ -361,6 +613,7 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
"Type": Equal(field.ErrorTypeNotSupported),
"Field": Equal("spec.kubernetes.versions[0].classification"),
"BadValue": Equal(classification),
+ "Detail": Equal(`supported values: "deprecated", "expired", "preview", "supported", "unavailable"`),
}))))
})
@@ -385,9 +638,302 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
"Field": Equal("spec.kubernetes.versions[0]"),
}))))
})
+
+ It("only allow one supported version per minor version using Lifecycle", func() {
+ time1 := metav1.Now()
+ time2 := metav1.Time{Time: metav1.Now().Add(time.Hour)}
+ time3 := metav1.Time{Time: metav1.Now().Add(2 * time.Hour)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: supportedClassification, StartTime: &time1},
+ {Classification: deprecatedClassification, StartTime: &time3},
+ },
+ },
+ {
+ Version: "1.1.1",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification, StartTime: &time2},
+ },
+ },
+ }
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeForbidden),
+ "Field": Equal("spec.kubernetes.versions[0]"),
+ "Detail": ContainSubstring("\"supported\" lifecycle stages must not overlap per minor version"),
+ }))))
+ })
+
+ It("allow multiple supported version per minor version if their lifecycle start times do not overlap", func() {
+ time1 := metav1.Now()
+ time3 := metav1.Time{Time: metav1.Now().Add(2 * time.Hour)}
+ cloudProfile.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: supportedClassification, StartTime: &time1},
+ {Classification: deprecatedClassification, StartTime: &time3},
+ },
+ },
+ {
+ Version: "1.1.1",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification, StartTime: &time3},
+ },
+ },
+ }
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(BeEmpty())
+ })
})
Context("machine image validation", func() {
+ It("should forbid specifying lifecycle and classification at the same time", func() {
+ deprecatedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Classification: &supportedClassification,
+ Lifecycle: []core.LifecycleStage{
+ {Classification: deprecatedClassification, StartTime: deprecatedDate},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeForbidden),
+ "Field": Equal("spec.machineImages[0].versions[0]"),
+ "Detail": Equal("cannot specify `classification` or `expirationDate` in combination with `lifecycle`"),
+ }))))
+ })
+
+ It("should allow multiple lifecycle stages with same start time", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification, StartTime: supportedDate},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "4.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification, StartTime: supportedDate},
+ {Classification: deprecatedClassification, StartTime: supportedDate},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(BeEmpty())
+ })
+
+ It("should forbid multiple lifecycle stages with same classification", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "4.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ {Classification: supportedClassification, StartTime: supportedDate},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.machineImages[0].versions[1].lifecycle"),
+ "Detail": Equal("duplicate classification stage in lifecycle"),
+ }))))
+ })
+
+ It("should forbid unordered lifecycle stages", func() {
+ now := time.Now()
+
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: deprecatedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(1 * time.Hour)))},
+ {Classification: supportedClassification, StartTime: ptr.To(metav1.NewTime(now.Add(2 * time.Hour)))},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "4.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.machineImages[0].versions[0].lifecycle"),
+ "Detail": Equal("lifecycle classifications not in order, must be preview -> supported -> deprecated -> expired"),
+ }))))
+ })
+
+ It("should forbid missing start time for subsequent lifecycle stages", func() {
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: previewClassification},
+ {Classification: supportedClassification, StartTime: supportedDate},
+ {Classification: deprecatedClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "4.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: supportedClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeInvalid),
+ "Field": Equal("spec.machineImages[0].versions[0].lifecycle[2]"),
+ "Detail": Equal("only the leading lifecycle elements can have the start time optional"),
+ }))))
+ })
+
+ It("should forbid duplicated machineImage versions", func() {
+ cloudProfile.Spec.MachineImages = duplicatedMachineImage
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(
+ PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeDuplicate),
+ "Field": Equal(fmt.Sprintf("spec.machineImages[0].versions[%d]", len(duplicatedMachineImage[0].Versions)-1)),
+ }))))
+ })
+
+ It("should forbid invalid classification for machineImage versions", func() {
+ invalidClassification := core.VersionClassification("dummy")
+
+ cloudProfile.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ Versions: []core.MachineImageVersion{
+ {
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "3.4.6",
+ Lifecycle: []core.LifecycleStage{
+ {Classification: invalidClassification},
+ },
+ },
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
+ },
+ UpdateStrategy: &updateStrategyMajor,
+ },
+ }
+
+ errorList := ValidateCloudProfile(cloudProfile)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeNotSupported),
+ "Field": Equal("spec.machineImages[0].versions[0].lifecycle[0].classification"),
+ "BadValue": Equal(invalidClassification),
+ "Detail": Equal(`supported values: "deprecated", "expired", "preview", "supported", "unavailable"`),
+ }))))
+ })
+
It("should forbid an empty list of machine images", func() {
cloudProfile.Spec.MachineImages = []core.MachineImage{}
@@ -1756,6 +2302,92 @@ var _ = Describe("CloudProfile Validation Tests ", func() {
})
})
+ Context("Update version from supported to unavailable", func() {
+ It("should prevent a kubernetes version update to unavailable when it was already active", func() {
+ now := time.Now()
+
+ cloudProfileNew.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.17.2",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(1 * time.Hour))),
+ },
+ },
+ },
+ }
+ cloudProfileOld.Spec.Kubernetes.Versions = []core.ExpirableVersion{
+ {
+ Version: "1.17.2",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationSupported,
+ },
+ },
+ },
+ }
+ errorList := ValidateCloudProfileUpdate(cloudProfileNew, cloudProfileOld)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeForbidden),
+ "Field": Equal("spec.kubernetes.versions[0]"),
+ "Detail": Equal("a version cannot be turned unavailable if it was already moved into a later lifecycle stage"),
+ }))))
+ })
+
+ It("should prevent a machine image update to unavailable when it was already active", func() {
+ cloudProfileNew.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ UpdateStrategy: &updateStrategyMajor,
+ Versions: []core.MachineImageVersion{
+ {
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "2135.6.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationUnavailable,
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+ cloudProfileOld.Spec.MachineImages = []core.MachineImage{
+ {
+ Name: "ubuntu",
+ UpdateStrategy: &updateStrategyMajor,
+ Versions: []core.MachineImageVersion{
+ {
+ CRI: []core.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ ExpirableVersion: core.ExpirableVersion{
+ Version: "2135.6.0",
+ Lifecycle: []core.LifecycleStage{
+ {
+ Classification: core.ClassificationPreview,
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ errorList := ValidateCloudProfileUpdate(cloudProfileNew, cloudProfileOld)
+
+ Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
+ "Type": Equal(field.ErrorTypeForbidden),
+ "Field": Equal("spec.machineImages[0].versions[0]"),
+ "Detail": Equal("a version cannot be turned unavailable if it was already moved into a later lifecycle stage"),
+ }))))
+ })
+ })
+
Context("limits validation", func() {
It("should allow adding limits", func() {
cloudProfileNew.Spec.Limits = &core.Limits{
diff --git a/pkg/apis/core/validation/namespacedcloudprofile.go b/pkg/apis/core/validation/namespacedcloudprofile.go
index e670432868f..fd6d3ac17a0 100644
--- a/pkg/apis/core/validation/namespacedcloudprofile.go
+++ b/pkg/apis/core/validation/namespacedcloudprofile.go
@@ -21,6 +21,7 @@ func ValidateNamespacedCloudProfile(namespacedCloudProfile *core.NamespacedCloud
allErrs = append(allErrs, validateNamespacedCloudProfileParent(namespacedCloudProfile.Spec.Parent, field.NewPath("spec.parent"))...)
allErrs = append(allErrs, validateNamespacedCloudProfileKubernetesVersions(namespacedCloudProfile.Spec.Kubernetes, field.NewPath("spec.kubernetes"))...)
+ allErrs = append(allErrs, validateCloudProfileKubernetesClassificationLifecycleStartTimesOrder(namespacedCloudProfile.Spec.Kubernetes, field.NewPath("spec.kubernetes"))...)
allErrs = append(allErrs, ValidateMachineImages(namespacedCloudProfile.Spec.MachineImages, nil, field.NewPath("spec.machineImages"), true)...)
allErrs = append(allErrs, validateVolumeTypes(namespacedCloudProfile.Spec.VolumeTypes, field.NewPath("spec.volumeTypes"))...)
allErrs = append(allErrs, validateMachineTypes(namespacedCloudProfile.Spec.MachineTypes, nil, field.NewPath("spec.machineTypes"))...)
diff --git a/pkg/apis/core/validation/utils.go b/pkg/apis/core/validation/utils.go
index 01af6527656..f50f03cfb09 100644
--- a/pkg/apis/core/validation/utils.go
+++ b/pkg/apis/core/validation/utils.go
@@ -11,11 +11,13 @@ import (
"slices"
"strconv"
"strings"
+ "time"
"github.com/Masterminds/semver/v3"
autoscalingv1 "k8s.io/api/autoscaling/v1"
corev1 "k8s.io/api/core/v1"
apivalidation "k8s.io/apimachinery/pkg/api/validation"
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/validation"
@@ -154,7 +156,7 @@ func ValidateIPFamilies(ipFamilies []core.IPFamily, fldPath *field.Path) field.E
// k8sVersionCPRegex is used to validate kubernetes versions in a cloud profile.
var k8sVersionCPRegex = regexp.MustCompile(`^([0-9]+\.){2}[0-9]+$`)
-var supportedVersionClassifications = sets.New(string(core.ClassificationPreview), string(core.ClassificationSupported), string(core.ClassificationDeprecated))
+var supportedVersionClassifications = sets.New(string(core.ClassificationPreview), string(core.ClassificationSupported), string(core.ClassificationDeprecated), string(core.ClassificationExpired), string(core.ClassificationUnavailable))
// validateKubernetesVersions validates the given list of ExpirableVersions for valid Kubernetes versions.
func validateKubernetesVersions(versions []core.ExpirableVersion, fldPath *field.Path) field.ErrorList {
@@ -177,6 +179,124 @@ func validateKubernetesVersions(versions []core.ExpirableVersion, fldPath *field
if version.Classification != nil && !supportedVersionClassifications.Has(string(*version.Classification)) {
allErrs = append(allErrs, field.NotSupported(idxPath.Child("classification"), *version.Classification, sets.List(supportedVersionClassifications)))
}
+
+ allErrs = append(allErrs, validateExpirableVersion(version, idxPath)...)
+ }
+
+ return allErrs
+}
+
+// validateExpirableVersion validates the ExpirableVersions.
+func validateExpirableVersion(version core.ExpirableVersion, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if (version.Classification != nil || version.ExpirationDate != nil) && len(version.Lifecycle) > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "cannot specify `classification` or `expirationDate` in combination with `lifecycle`"))
+ }
+
+ lifecyclePath := fldPath.Child("lifecycle")
+
+ allErrs = append(allErrs, validateLifecycleClassificationsValid(version.Lifecycle, lifecyclePath)...)
+ allErrs = append(allErrs, validateLifecycleNoDuplicates(version.Lifecycle, lifecyclePath)...)
+ allErrs = append(allErrs, validateLifecycleInOrder(version.Lifecycle, lifecyclePath)...)
+ allErrs = append(allErrs, validateLifecycleStartTimes(version.Lifecycle, lifecyclePath)...)
+
+ return allErrs
+}
+
+// validateLifecycleClassificationsValid checks if the given classification in the lifecycle are in the list of supported version classifications.
+func validateLifecycleClassificationsValid(lifecycle []core.LifecycleStage, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ for i, l := range lifecycle {
+ if !supportedVersionClassifications.Has(string(l.Classification)) {
+ validValues := supportedVersionClassifications.UnsortedList()
+ slices.Sort(validValues)
+ allErrs = append(allErrs, field.NotSupported(fldPath.Index(i).Child("classification"), l.Classification, validValues))
+ }
+ }
+
+ return allErrs
+}
+
+// validateLifecycleNoDuplicates checks if there are any duplicate entries in the provided lifecycle slice
+func validateLifecycleNoDuplicates(lifecycle []core.LifecycleStage, fldPath *field.Path) field.ErrorList {
+ var (
+ allErrs = field.ErrorList{}
+ duplicates = sets.NewString()
+ seen = make(map[core.VersionClassification]bool)
+ )
+
+ for _, value := range lifecycle {
+ classification := value.Classification
+
+ if seen[classification] {
+ duplicates.Insert(string(classification))
+ }
+
+ seen[classification] = true
+ }
+
+ for _, duplicate := range duplicates.List() {
+ allErrs = append(allErrs, field.Invalid(fldPath, duplicate, "duplicate classification stage in lifecycle"))
+ }
+
+ return allErrs
+}
+
+// validateLifecycleInOrder checks if the provided lifecycle slice is in the expected order.
+// The order is not required for functionality but should ensure better readability.
+func validateLifecycleInOrder(lifecycle []core.LifecycleStage, fldPath *field.Path) field.ErrorList {
+ var allErrs = field.ErrorList{}
+
+ var misplacedElement core.VersionClassification
+ isSorted := slices.IsSortedFunc(lifecycle, func(a, b core.LifecycleStage) int {
+ orderResult := a.Classification.Compare(b.Classification)
+ if orderResult > 0 {
+ misplacedElement = a.Classification
+ }
+ return orderResult
+ })
+ if !isSorted {
+ allErrs = append(allErrs, field.Invalid(fldPath, misplacedElement, "lifecycle classifications not in order, must be preview -> supported -> deprecated -> expired"))
+ }
+
+ return allErrs
+}
+
+// validateLifecycleStartTimes checks if the given slice of lifecycles has start times in order.
+// and that only the leading lifecycle classification has no startTime.
+// As soon as one lifecycle classification did contain a startTime, all following must have a startTime, too.
+// It does not ensure the correct order of the classifications but if the elements in the
+// list have dates after each other. The order must be tested via `validateLifecycleInOrder`.
+func validateLifecycleStartTimes(lifecycle []core.LifecycleStage, fldPath *field.Path) field.ErrorList {
+ var (
+ allErrs = field.ErrorList{}
+ previousStartTime *time.Time
+ )
+
+ for i, l := range lifecycle {
+ if previousStartTime == nil {
+ if l.StartTime == nil {
+ l.StartTime = &v1.Time{}
+ } else {
+ previousStartTime = &l.StartTime.Time
+ }
+ continue
+ }
+
+ if l.StartTime == nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(i), l.Classification, "only the leading lifecycle elements can have the start time optional"))
+ continue
+ }
+
+ currentStartTime := l.StartTime.Time
+
+ if currentStartTime.Before(*previousStartTime) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(i), l.StartTime.String(), "lifecycle start times must be monotonically increasing"))
+ }
+
+ previousStartTime = ¤tStartTime
}
return allErrs
diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go
index 75368a4c191..ff71e97b549 100644
--- a/pkg/apis/core/zz_generated.deepcopy.go
+++ b/pkg/apis/core/zz_generated.deepcopy.go
@@ -816,6 +816,7 @@ func (in *CloudProfile) DeepCopyInto(out *CloudProfile) {
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
return
}
@@ -963,6 +964,34 @@ func (in *CloudProfileSpec) DeepCopy() *CloudProfileSpec {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CloudProfileStatus) DeepCopyInto(out *CloudProfileStatus) {
+ *out = *in
+ if in.KubernetesVersions != nil {
+ in, out := &in.KubernetesVersions, &out.KubernetesVersions
+ *out = make([]ExpirableVersionStatus, len(*in))
+ copy(*out, *in)
+ }
+ if in.MachineImageVersions != nil {
+ in, out := &in.MachineImageVersions, &out.MachineImageVersions
+ *out = make([]MachineImageVersionStatus, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudProfileStatus.
+func (in *CloudProfileStatus) DeepCopy() *CloudProfileStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(CloudProfileStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterAutoscaler) DeepCopyInto(out *ClusterAutoscaler) {
*out = *in
@@ -1917,6 +1946,13 @@ func (in *ExpirableVersion) DeepCopyInto(out *ExpirableVersion) {
*out = new(VersionClassification)
**out = **in
}
+ if in.Lifecycle != nil {
+ in, out := &in.Lifecycle, &out.Lifecycle
+ *out = make([]LifecycleStage, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
return
}
@@ -1930,6 +1966,22 @@ func (in *ExpirableVersion) DeepCopy() *ExpirableVersion {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ExpirableVersionStatus) DeepCopyInto(out *ExpirableVersionStatus) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExpirableVersionStatus.
+func (in *ExpirableVersionStatus) DeepCopy() *ExpirableVersionStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ExpirableVersionStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ExposureClass) DeepCopyInto(out *ExposureClass) {
*out = *in
@@ -3153,6 +3205,26 @@ func (in *LastOperation) DeepCopy() *LastOperation {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LifecycleStage) DeepCopyInto(out *LifecycleStage) {
+ *out = *in
+ if in.StartTime != nil {
+ in, out := &in.StartTime, &out.StartTime
+ *out = (*in).DeepCopy()
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LifecycleStage.
+func (in *LifecycleStage) DeepCopy() *LifecycleStage {
+ if in == nil {
+ return nil
+ }
+ out := new(LifecycleStage)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Limits) DeepCopyInto(out *Limits) {
*out = *in
@@ -3341,6 +3413,27 @@ func (in *MachineImageVersion) DeepCopy() *MachineImageVersion {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MachineImageVersionStatus) DeepCopyInto(out *MachineImageVersionStatus) {
+ *out = *in
+ if in.Versions != nil {
+ in, out := &in.Versions, &out.Versions
+ *out = make([]ExpirableVersionStatus, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineImageVersionStatus.
+func (in *MachineImageVersionStatus) DeepCopy() *MachineImageVersionStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(MachineImageVersionStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachineType) DeepCopyInto(out *MachineType) {
*out = *in
diff --git a/pkg/apiserver/openapi/api_violations.report b/pkg/apiserver/openapi/api_violations.report
index f6ed7ff8e35..d23b3a05143 100644
--- a/pkg/apiserver/openapi/api_violations.report
+++ b/pkg/apiserver/openapi/api_violations.report
@@ -8,6 +8,8 @@ API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,CloudProfileSpec,MachineTypes
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,CloudProfileSpec,Regions
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,CloudProfileSpec,VolumeTypes
+API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,CloudProfileStatus,KubernetesVersions
+API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,CloudProfileStatus,MachineImageVersions
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ClusterAutoscaler,IgnoreTaints
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ClusterAutoscaler,StartupTaints
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ClusterAutoscaler,StatusTaints
@@ -22,6 +24,7 @@ API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,DNSIncludeExclude,Exclude
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,DNSIncludeExclude,Include
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,EncryptionConfig,Resources
+API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ExpirableVersion,Lifecycle
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ExposureClassScheduling,Tolerations
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,ExtensionResourceState,Resources
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,Hibernation,Schedules
@@ -34,6 +37,7 @@ API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,MachineImageVersion,Architectures
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,MachineImageVersion,CRI
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,MachineImageVersion,CapabilitySets
+API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,MachineImageVersionStatus,Versions
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,NamespacedCloudProfileSpec,MachineImages
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,NamespacedCloudProfileSpec,MachineTypes
API rule violation: list_type_missing,github.com/gardener/gardener/pkg/apis/core/v1beta1,NamespacedCloudProfileSpec,VolumeTypes
diff --git a/pkg/apiserver/openapi/openapi_generated.go b/pkg/apiserver/openapi/openapi_generated.go
index 6ef613e6f74..97b8e0f8ee4 100644
--- a/pkg/apiserver/openapi/openapi_generated.go
+++ b/pkg/apiserver/openapi/openapi_generated.go
@@ -64,6 +64,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileList": schema_pkg_apis_core_v1beta1_CloudProfileList(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileReference": schema_pkg_apis_core_v1beta1_CloudProfileReference(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileSpec": schema_pkg_apis_core_v1beta1_CloudProfileSpec(ref),
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileStatus": schema_pkg_apis_core_v1beta1_CloudProfileStatus(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ClusterAutoscaler": schema_pkg_apis_core_v1beta1_ClusterAutoscaler(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ClusterAutoscalerOptions": schema_pkg_apis_core_v1beta1_ClusterAutoscalerOptions(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.Condition": schema_pkg_apis_core_v1beta1_Condition(ref),
@@ -96,6 +97,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ETCDEncryptionKeyRotation": schema_pkg_apis_core_v1beta1_ETCDEncryptionKeyRotation(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.EncryptionConfig": schema_pkg_apis_core_v1beta1_EncryptionConfig(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersion": schema_pkg_apis_core_v1beta1_ExpirableVersion(ref),
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersionStatus": schema_pkg_apis_core_v1beta1_ExpirableVersionStatus(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ExposureClass": schema_pkg_apis_core_v1beta1_ExposureClass(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ExposureClassList": schema_pkg_apis_core_v1beta1_ExposureClassList(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.ExposureClassScheduling": schema_pkg_apis_core_v1beta1_ExposureClassScheduling(ref),
@@ -131,12 +133,14 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/gardener/gardener/pkg/apis/core/v1beta1.LastError": schema_pkg_apis_core_v1beta1_LastError(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.LastMaintenance": schema_pkg_apis_core_v1beta1_LastMaintenance(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.LastOperation": schema_pkg_apis_core_v1beta1_LastOperation(ref),
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.LifecycleStage": schema_pkg_apis_core_v1beta1_LifecycleStage(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.Limits": schema_pkg_apis_core_v1beta1_Limits(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.LoadBalancerServicesProxyProtocol": schema_pkg_apis_core_v1beta1_LoadBalancerServicesProxyProtocol(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.Machine": schema_pkg_apis_core_v1beta1_Machine(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineControllerManagerSettings": schema_pkg_apis_core_v1beta1_MachineControllerManagerSettings(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineImage": schema_pkg_apis_core_v1beta1_MachineImage(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineImageVersion": schema_pkg_apis_core_v1beta1_MachineImageVersion(ref),
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineImageVersionStatus": schema_pkg_apis_core_v1beta1_MachineImageVersionStatus(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineType": schema_pkg_apis_core_v1beta1_MachineType(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineTypeStorage": schema_pkg_apis_core_v1beta1_MachineTypeStorage(ref),
"github.com/gardener/gardener/pkg/apis/core/v1beta1.Maintenance": schema_pkg_apis_core_v1beta1_Maintenance(ref),
@@ -2108,11 +2112,18 @@ func schema_pkg_apis_core_v1beta1_CloudProfile(ref common.ReferenceCallback) com
Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileSpec"),
},
},
+ "status": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Status contains the current status of the cloud profile.",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileStatus"),
+ },
+ },
},
},
},
Dependencies: []string{
- "github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileSpec", "github.com/gardener/gardener/pkg/apis/core/v1beta1.CloudProfileStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -2353,6 +2364,49 @@ func schema_pkg_apis_core_v1beta1_CloudProfileSpec(ref common.ReferenceCallback)
}
}
+func schema_pkg_apis_core_v1beta1_CloudProfileStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "CloudProfileStatus contains the status of the cloud profile.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kubernetesVersions": {
+ SchemaProps: spec.SchemaProps{
+ Description: "KubernetesVersions contains the statuses of the kubernetes versions.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersionStatus"),
+ },
+ },
+ },
+ },
+ },
+ "machineImageVersions": {
+ SchemaProps: spec.SchemaProps{
+ Description: "MachineImageVersions contains the statuses of the machine image versions.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineImageVersionStatus"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersionStatus", "github.com/gardener/gardener/pkg/apis/core/v1beta1.MachineImageVersionStatus"},
+ }
+}
+
func schema_pkg_apis_core_v1beta1_ClusterAutoscaler(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -3757,23 +3811,66 @@ func schema_pkg_apis_core_v1beta1_ExpirableVersion(ref common.ReferenceCallback)
},
"expirationDate": {
SchemaProps: spec.SchemaProps{
- Description: "ExpirationDate defines the time at which this version expires.",
+ Description: "ExpirationDate defines the time at which this version expires. Deprecated: Is replaced by Lifecycle.",
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
},
},
"classification": {
SchemaProps: spec.SchemaProps{
- Description: "Classification defines the state of a version (preview, supported, deprecated)",
+ Description: "Classification defines the state of a version (preview, supported, deprecated). Deprecated: Is replaced by Lifecycle.",
Type: []string{"string"},
Format: "",
},
},
+ "lifecycle": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with Classification and ExpirationDate.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.LifecycleStage"),
+ },
+ },
+ },
+ },
+ },
},
Required: []string{"version"},
},
},
Dependencies: []string{
- "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.LifecycleStage", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+ }
+}
+
+func schema_pkg_apis_core_v1beta1_ExpirableVersionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ExpirableVersionStatus defines the current status of an expirable version.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "version": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Version is the version identifier.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "classification": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Classification reflects the current state in the classification lifecycle.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"version"},
+ },
+ },
}
}
@@ -5562,6 +5659,35 @@ func schema_pkg_apis_core_v1beta1_LastOperation(ref common.ReferenceCallback) co
}
}
+func schema_pkg_apis_core_v1beta1_LifecycleStage(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "classification": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Classification is the category of this lifecycle stage (unavailable, preview, supported, deprecated, expired).",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "startTime": {
+ SchemaProps: spec.SchemaProps{
+ Description: "StartTime defines when this lifecycle stage becomes active.",
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
+ },
+ },
+ },
+ Required: []string{"classification"},
+ },
+ },
+ Dependencies: []string{
+ "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+ }
+}
+
func schema_pkg_apis_core_v1beta1_Limits(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -5777,17 +5903,31 @@ func schema_pkg_apis_core_v1beta1_MachineImageVersion(ref common.ReferenceCallba
},
"expirationDate": {
SchemaProps: spec.SchemaProps{
- Description: "ExpirationDate defines the time at which this version expires.",
+ Description: "ExpirationDate defines the time at which this version expires. Deprecated: Is replaced by Lifecycle.",
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
},
},
"classification": {
SchemaProps: spec.SchemaProps{
- Description: "Classification defines the state of a version (preview, supported, deprecated)",
+ Description: "Classification defines the state of a version (preview, supported, deprecated). Deprecated: Is replaced by Lifecycle.",
Type: []string{"string"},
Format: "",
},
},
+ "lifecycle": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Lifecycle defines the lifecycle stages for this version. Cannot be used in combination with Classification and ExpirationDate.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.LifecycleStage"),
+ },
+ },
+ },
+ },
+ },
"cri": {
SchemaProps: spec.SchemaProps{
Description: "CRI list of supported container runtime and interfaces supported by this version",
@@ -5848,7 +5988,42 @@ func schema_pkg_apis_core_v1beta1_MachineImageVersion(ref common.ReferenceCallba
},
},
Dependencies: []string{
- "github.com/gardener/gardener/pkg/apis/core/v1beta1.CRI", "github.com/gardener/gardener/pkg/apis/core/v1beta1.CapabilitySet", "github.com/gardener/gardener/pkg/apis/core/v1beta1.InPlaceUpdates", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.CRI", "github.com/gardener/gardener/pkg/apis/core/v1beta1.CapabilitySet", "github.com/gardener/gardener/pkg/apis/core/v1beta1.InPlaceUpdates", "github.com/gardener/gardener/pkg/apis/core/v1beta1.LifecycleStage", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+ }
+}
+
+func schema_pkg_apis_core_v1beta1_MachineImageVersionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Name matches the name of the MachineImage the status is represented of.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "versions": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Versions contains the statuses of the machine image versions.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersionStatus"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/gardener/gardener/pkg/apis/core/v1beta1.ExpirableVersionStatus"},
}
}
diff --git a/pkg/apiserver/registry/core/cloudprofile/storage/storage.go b/pkg/apiserver/registry/core/cloudprofile/storage/storage.go
index 0e54e000043..7710ae6ae07 100644
--- a/pkg/apiserver/registry/core/cloudprofile/storage/storage.go
+++ b/pkg/apiserver/registry/core/cloudprofile/storage/storage.go
@@ -5,6 +5,9 @@
package storage
import (
+ "context"
+
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/registry/generic"
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
@@ -22,19 +25,21 @@ type REST struct {
// CloudProfileStorage implements the storage for CloudProfiles.
type CloudProfileStorage struct {
CloudProfile *REST
+ Status *StatusREST
}
// NewStorage creates a new CloudProfileStorage object.
func NewStorage(optsGetter generic.RESTOptionsGetter) CloudProfileStorage {
- cloudProfileRest := NewREST(optsGetter)
+ cloudProfileRest, cloudProfileStatusRest := NewREST(optsGetter)
return CloudProfileStorage{
CloudProfile: cloudProfileRest,
+ Status: cloudProfileStatusRest,
}
}
// NewREST returns a RESTStorage object that will work with CloudProfile objects.
-func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
+func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
store := &genericregistry.Store{
NewFunc: func() runtime.Object { return &core.CloudProfile{} },
NewListFunc: func() runtime.Object { return &core.CloudProfileList{} },
@@ -52,7 +57,42 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
if err := store.CompleteWithOptions(options); err != nil {
panic(err)
}
- return &REST{store}
+
+ statusStore := *store
+ statusStore.UpdateStrategy = cloudprofile.StatusStrategy
+ return &REST{store}, &StatusREST{store: &statusStore}
+}
+
+// StatusREST implements the REST endpoint for changing the status of a CloudProfile.
+type StatusREST struct {
+ store *genericregistry.Store
+}
+
+var (
+ _ rest.Storage = &StatusREST{}
+ _ rest.Getter = &StatusREST{}
+ _ rest.Updater = &StatusREST{}
+)
+
+// New creates a new (empty) internal CloudProfile object.
+func (r *StatusREST) New() runtime.Object {
+ return &core.CloudProfile{}
+}
+
+// Destroy cleans up its resources on shutdown.
+func (r *StatusREST) Destroy() {
+ // Given that underlying store is shared with REST,
+ // we don't destroy it here explicitly.
+}
+
+// Get retrieves the object from the storage. It is required to support Patch.
+func (r *StatusREST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
+ return r.store.Get(ctx, name, options)
+}
+
+// Update alters the status subset of an object.
+func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) {
+ return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, forceAllowCreate, options)
}
// Implement ShortNamesProvider
diff --git a/pkg/apiserver/registry/core/cloudprofile/strategy.go b/pkg/apiserver/registry/core/cloudprofile/strategy.go
index 067aaf77786..feda29b8666 100644
--- a/pkg/apiserver/registry/core/cloudprofile/strategy.go
+++ b/pkg/apiserver/registry/core/cloudprofile/strategy.go
@@ -33,6 +33,8 @@ func (cloudProfileStrategy) NamespaceScoped() bool {
func (cloudProfileStrategy) PrepareForCreate(_ context.Context, obj runtime.Object) {
cloudProfile := obj.(*core.CloudProfile)
+ cloudProfile.Status = core.CloudProfileStatus{}
+
dropExpiredVersions(cloudProfile)
}
@@ -54,6 +56,7 @@ func (cloudProfileStrategy) AllowCreateOnUpdate() bool {
func (cloudProfileStrategy) PrepareForUpdate(_ context.Context, newObj, oldObj runtime.Object) {
oldCloudProfile := oldObj.(*core.CloudProfile)
newCloudProfile := newObj.(*core.CloudProfile)
+ newCloudProfile.Status = oldCloudProfile.Status
gardenerutils.SyncArchitectureCapabilityFields(newCloudProfile.Spec, oldCloudProfile.Spec)
}
@@ -77,6 +80,23 @@ func (cloudProfileStrategy) WarningsOnUpdate(_ context.Context, _, _ runtime.Obj
return nil
}
+type cloudProfileStatusStrategy struct {
+ cloudProfileStrategy
+}
+
+// StatusStrategy defines the storage strategy for the status subresource of CloudProfiles.
+var StatusStrategy = cloudProfileStatusStrategy{Strategy}
+
+func (cloudProfileStatusStrategy) PrepareForUpdate(_ context.Context, obj, old runtime.Object) {
+ newCloudProfile := obj.(*core.CloudProfile)
+ oldCloudProfile := old.(*core.CloudProfile)
+ newCloudProfile.Spec = oldCloudProfile.Spec
+}
+
+func (cloudProfileStatusStrategy) ValidateUpdate(_ context.Context, obj, old runtime.Object) field.ErrorList {
+ return validation.ValidateCloudProfileStatusUpdate(obj.(*core.CloudProfile), old.(*core.CloudProfile))
+}
+
func dropExpiredVersions(cloudProfile *core.CloudProfile) {
var validKubernetesVersions []core.ExpirableVersion
diff --git a/pkg/apiserver/registry/core/rest/storage_core.go b/pkg/apiserver/registry/core/rest/storage_core.go
index e0031f333a9..311efdfa38d 100644
--- a/pkg/apiserver/registry/core/rest/storage_core.go
+++ b/pkg/apiserver/registry/core/rest/storage_core.go
@@ -79,6 +79,7 @@ func (p StorageProvider) v1beta1Storage(restOptionsGetter generic.RESTOptionsGet
cloudprofileStorage := cloudprofilestore.NewStorage(restOptionsGetter)
storage["cloudprofiles"] = cloudprofileStorage.CloudProfile
+ storage["cloudprofiles/status"] = cloudprofileStorage.Status
namespacedcloudprofileStorage := namespacedcloudprofilestore.NewStorage(restOptionsGetter)
storage["namespacedcloudprofiles"] = namespacedcloudprofileStorage.NamespacedCloudProfile
diff --git a/pkg/client/core/clientset/versioned/typed/core/v1beta1/cloudprofile.go b/pkg/client/core/clientset/versioned/typed/core/v1beta1/cloudprofile.go
index 740cfe06566..12fe09c9c56 100644
--- a/pkg/client/core/clientset/versioned/typed/core/v1beta1/cloudprofile.go
+++ b/pkg/client/core/clientset/versioned/typed/core/v1beta1/cloudprofile.go
@@ -27,6 +27,8 @@ type CloudProfilesGetter interface {
type CloudProfileInterface interface {
Create(ctx context.Context, cloudProfile *corev1beta1.CloudProfile, opts v1.CreateOptions) (*corev1beta1.CloudProfile, error)
Update(ctx context.Context, cloudProfile *corev1beta1.CloudProfile, opts v1.UpdateOptions) (*corev1beta1.CloudProfile, error)
+ // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+ UpdateStatus(ctx context.Context, cloudProfile *corev1beta1.CloudProfile, opts v1.UpdateOptions) (*corev1beta1.CloudProfile, error)
Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
Get(ctx context.Context, name string, opts v1.GetOptions) (*corev1beta1.CloudProfile, error)
diff --git a/pkg/controllermanager/controller/cloudprofile/reconciler.go b/pkg/controllermanager/controller/cloudprofile/reconciler.go
index 51ca7507265..973fa56c8de 100644
--- a/pkg/controllermanager/controller/cloudprofile/reconciler.go
+++ b/pkg/controllermanager/controller/cloudprofile/reconciler.go
@@ -20,6 +20,7 @@ import (
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"
controllermanagerconfigv1alpha1 "github.com/gardener/gardener/pkg/controllermanager/apis/config/v1alpha1"
"github.com/gardener/gardener/pkg/controllerutils"
)
@@ -100,5 +101,41 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
}
}
- return reconcile.Result{}, nil
+ cloudProfile.Status = status(cloudProfile)
+
+ if err := r.Client.Status().Update(ctx, cloudProfile); err != nil {
+ return reconcile.Result{}, err
+ }
+
+ return reconcile.Result{
+ RequeueAfter: v1beta1helper.DurationUntilNextVersionLifecycleStage(&cloudProfile.Spec),
+ }, nil
+}
+
+func status(cloudProfile *gardencorev1beta1.CloudProfile) gardencorev1beta1.CloudProfileStatus {
+ var result gardencorev1beta1.CloudProfileStatus
+
+ for _, version := range cloudProfile.Spec.Kubernetes.Versions {
+ result.KubernetesVersions = append(result.KubernetesVersions, gardencorev1beta1.ExpirableVersionStatus{
+ Version: version.Version,
+ Classification: v1beta1helper.CurrentLifecycleClassification(version),
+ })
+ }
+
+ for _, machineImage := range cloudProfile.Spec.MachineImages {
+ status := gardencorev1beta1.MachineImageVersionStatus{
+ Name: machineImage.Name,
+ }
+
+ for _, version := range machineImage.Versions {
+ status.Versions = append(status.Versions, gardencorev1beta1.ExpirableVersionStatus{
+ Version: version.Version,
+ Classification: v1beta1helper.CurrentLifecycleClassification(version.ExpirableVersion),
+ })
+ }
+
+ result.MachineImageVersions = append(result.MachineImageVersions, status)
+ }
+
+ return result
}
diff --git a/pkg/controllermanager/controller/cloudprofile/reconciler_test.go b/pkg/controllermanager/controller/cloudprofile/reconciler_test.go
index d45e2f48e2a..9e0c8dbccad 100644
--- a/pkg/controllermanager/controller/cloudprofile/reconciler_test.go
+++ b/pkg/controllermanager/controller/cloudprofile/reconciler_test.go
@@ -8,6 +8,7 @@ import (
"context"
"errors"
"fmt"
+ "time"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
@@ -17,6 +18,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record"
+ "k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -29,9 +31,10 @@ var _ = Describe("Reconciler", func() {
const finalizerName = "gardener"
var (
- ctx = context.TODO()
- ctrl *gomock.Controller
- c *mockclient.MockClient
+ ctx = context.TODO()
+ ctrl *gomock.Controller
+ c *mockclient.MockClient
+ status *mockclient.MockStatusWriter
cloudProfileName string
fakeErr error
@@ -42,6 +45,7 @@ var _ = Describe("Reconciler", func() {
BeforeEach(func() {
ctrl = gomock.NewController(GinkgoT())
c = mockclient.NewMockClient(ctrl)
+ status = mockclient.NewMockStatusWriter(ctrl)
cloudProfileName = "test-cloudprofile"
fakeErr = errors.New("fake err")
@@ -101,6 +105,12 @@ var _ = Describe("Reconciler", func() {
return nil
})
+ c.EXPECT().Status().Return(status)
+ expect := cloudProfile.DeepCopy()
+ expect.Finalizers = []string{finalizerName}
+
+ status.EXPECT().Update(gomock.Any(), expect).Return(nil)
+
result, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: types.NamespacedName{Name: cloudProfileName}})
Expect(result).To(Equal(reconcile.Result{}))
Expect(err).NotTo(HaveOccurred())
@@ -210,4 +220,108 @@ var _ = Describe("Reconciler", func() {
Expect(err).NotTo(HaveOccurred())
})
})
+
+ Context("status reconciliation", func() {
+ BeforeEach(func() {
+ cloudProfile.Finalizers = []string{finalizerName}
+ })
+
+ var (
+ testStatus = func(spec gardencorev1beta1.CloudProfileSpec, wantStatus gardencorev1beta1.CloudProfileStatus) reconcile.Result {
+ cloudProfile.Spec = spec
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: cloudProfileName}, gomock.AssignableToTypeOf(&gardencorev1beta1.CloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.CloudProfile, _ ...client.GetOption) error {
+ *obj = *cloudProfile
+ return nil
+ })
+
+ want := cloudProfile.DeepCopy()
+ want.Status = wantStatus
+
+ c.EXPECT().Status().Return(status)
+ status.EXPECT().Update(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.CloudProfile{})).Do(func(_ context.Context, obj client.Object, _ ...client.UpdateOption) {
+ Expect(obj).To(Equal(want))
+ })
+
+ result, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: types.NamespacedName{Name: cloudProfileName}})
+ Expect(err).NotTo(HaveOccurred())
+
+ return result
+ }
+ )
+
+ It("should reconcile status of lifecycle classifications and requeue due to upcoming stage", func() {
+ var (
+ now = time.Now()
+
+ spec = gardencorev1beta1.CloudProfileSpec{
+ Kubernetes: gardencorev1beta1.KubernetesSettings{
+ Versions: []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.28.2",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ StartTime: ptr.To(metav1.NewTime(now.Add(3 * time.Hour))),
+ },
+ },
+ },
+ },
+ },
+ }
+
+ wantStatus = gardencorev1beta1.CloudProfileStatus{
+ KubernetesVersions: []gardencorev1beta1.ExpirableVersionStatus{
+ {
+ Version: "1.28.2",
+ Classification: gardencorev1beta1.ClassificationPreview,
+ },
+ },
+ }
+ )
+
+ result := testStatus(spec, wantStatus)
+ Expect(result.Requeue).To(BeFalse())
+ Expect(result.RequeueAfter).To(BeNumerically("~", 3*time.Hour, time.Second))
+ })
+
+ It("should reconcile status of lifecycle classifications but not requeue without upcoming stages", func() {
+ var (
+ now = time.Now()
+
+ spec = gardencorev1beta1.CloudProfileSpec{
+ Kubernetes: gardencorev1beta1.KubernetesSettings{
+ Versions: []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.28.2",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationPreview,
+ StartTime: ptr.To(metav1.NewTime(now.Add(-1 * time.Hour))),
+ },
+ },
+ },
+ },
+ },
+ }
+
+ wantStatus = gardencorev1beta1.CloudProfileStatus{
+ KubernetesVersions: []gardencorev1beta1.ExpirableVersionStatus{
+ {
+ Version: "1.28.2",
+ Classification: gardencorev1beta1.ClassificationPreview,
+ },
+ },
+ }
+ )
+
+ result := testStatus(spec, wantStatus)
+ Expect(result.Requeue).To(BeFalse())
+ Expect(result.RequeueAfter).To(BeZero())
+ })
+ })
})
diff --git a/pkg/controllermanager/controller/namespacedcloudprofile/reconciler.go b/pkg/controllermanager/controller/namespacedcloudprofile/reconciler.go
index 0ed7aef51cd..757da7cf5ba 100644
--- a/pkg/controllermanager/controller/namespacedcloudprofile/reconciler.go
+++ b/pkg/controllermanager/controller/namespacedcloudprofile/reconciler.go
@@ -7,6 +7,7 @@ package namespacedcloudprofile
import (
"context"
"fmt"
+ "slices"
"golang.org/x/exp/maps"
corev1 "k8s.io/api/core/v1"
@@ -23,6 +24,7 @@ import (
gardencore "github.com/gardener/gardener/pkg/apis/core"
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"
controllermanagerconfigv1alpha1 "github.com/gardener/gardener/pkg/controllermanager/apis/config/v1alpha1"
"github.com/gardener/gardener/pkg/controllerutils"
"github.com/gardener/gardener/pkg/utils"
@@ -103,7 +105,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
return reconcile.Result{}, err
}
- return reconcile.Result{}, nil
+ return reconcile.Result{
+ RequeueAfter: v1beta1helper.DurationUntilNextVersionLifecycleStage(&namespacedCloudProfile.Status.CloudProfileSpec),
+ }, nil
}
func mergeAndPatchCloudProfile(ctx context.Context, c client.Client, namespacedCloudProfile *gardencorev1beta1.NamespacedCloudProfile, parentCloudProfile *gardencorev1beta1.CloudProfile) error {
@@ -119,7 +123,7 @@ func MergeCloudProfiles(namespacedCloudProfile *gardencorev1beta1.NamespacedClou
namespacedCloudProfile.Status.CloudProfileSpec = cloudProfile.Spec
if namespacedCloudProfile.Spec.Kubernetes != nil {
- namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions = mergeDeep(namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions, namespacedCloudProfile.Spec.Kubernetes.Versions, expirableVersionKeyFunc, mergeExpirationDates, false)
+ namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions = mergeDeep(namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions, namespacedCloudProfile.Spec.Kubernetes.Versions, expirableVersionKeyFunc, mergeExpirableVersions, false)
}
namespacedCloudProfile.Status.CloudProfileSpec.MachineImages = mergeDeep(namespacedCloudProfile.Status.CloudProfileSpec.MachineImages, namespacedCloudProfile.Spec.MachineImages, machineImageKeyFunc, mergeMachineImages, true)
namespacedCloudProfile.Status.CloudProfileSpec.MachineTypes = mergeDeep(namespacedCloudProfile.Status.CloudProfileSpec.MachineTypes, namespacedCloudProfile.Spec.MachineTypes, machineTypeKeyFunc, nil, true)
@@ -159,18 +163,95 @@ func defaultMachineTypeArchitectures(cloudProfile gardencore.CloudProfileSpec) {
}
var (
- expirableVersionKeyFunc = func(v gardencorev1beta1.ExpirableVersion) string { return v.Version }
- machineImageKeyFunc = func(i gardencorev1beta1.MachineImage) string { return i.Name }
- machineImageVersionKeyFunc = func(v gardencorev1beta1.MachineImageVersion) string { return v.Version }
- machineTypeKeyFunc = func(t gardencorev1beta1.MachineType) string { return t.Name }
- volumeTypeKeyFunc = func(t gardencorev1beta1.VolumeType) string { return t.Name }
+ expirableVersionKeyFunc = func(v gardencorev1beta1.ExpirableVersion) string { return v.Version }
+ classificationLifecycleKeyFunc = func(c gardencorev1beta1.LifecycleStage) string { return string(c.Classification) }
+ machineImageKeyFunc = func(i gardencorev1beta1.MachineImage) string { return i.Name }
+ machineImageVersionKeyFunc = func(v gardencorev1beta1.MachineImageVersion) string { return v.Version }
+ machineTypeKeyFunc = func(t gardencorev1beta1.MachineType) string { return t.Name }
+ volumeTypeKeyFunc = func(t gardencorev1beta1.VolumeType) string { return t.Name }
)
-func mergeExpirationDates(base, override gardencorev1beta1.ExpirableVersion) gardencorev1beta1.ExpirableVersion {
- base.ExpirationDate = override.ExpirationDate
+func mergeExpirableVersions(base, override gardencorev1beta1.ExpirableVersion) gardencorev1beta1.ExpirableVersion {
+ migratedBase := migrateExpirableVersionToLifecycle(base)
+ migratedOverride := migrateExpirableVersionToLifecycle(override)
+
+ migratedBase.Lifecycle = mergeDeep(migratedBase.Lifecycle, migratedOverride.Lifecycle, classificationLifecycleKeyFunc, mergeClassificationLifecycles, false)
+
+ order := map[gardencorev1beta1.VersionClassification]int{
+ gardencorev1beta1.ClassificationUnavailable: 0,
+ gardencorev1beta1.ClassificationPreview: 1,
+ gardencorev1beta1.ClassificationSupported: 2,
+ gardencorev1beta1.ClassificationDeprecated: 3,
+ gardencorev1beta1.ClassificationExpired: 4,
+ }
+ stageCompareFunc := func(a, b gardencorev1beta1.LifecycleStage) int {
+ return order[a.Classification] - order[b.Classification]
+ }
+ slices.SortFunc(migratedBase.Lifecycle, stageCompareFunc)
+
+ for _, overrideStage := range migratedOverride.Lifecycle {
+ // Push startTimes of all subsequent classifications after last custom version
+ for i, baseStage := range migratedBase.Lifecycle {
+ if stageCompareFunc(baseStage, overrideStage) < 0 &&
+ (baseStage.StartTime != nil && overrideStage.StartTime.Before(baseStage.StartTime)) {
+ migratedBase.Lifecycle[i].StartTime = overrideStage.StartTime
+ }
+
+ if stageCompareFunc(baseStage, overrideStage) > 0 &&
+ (baseStage.StartTime == nil || baseStage.StartTime.Before(overrideStage.StartTime)) {
+ migratedBase.Lifecycle[i].StartTime = overrideStage.StartTime
+ }
+ }
+ }
+
+ return migratedBase
+}
+
+func mergeClassificationLifecycles(base, override gardencorev1beta1.LifecycleStage) gardencorev1beta1.LifecycleStage {
+ base.StartTime = override.StartTime
return base
}
+func migrateExpirableVersionToLifecycle(version gardencorev1beta1.ExpirableVersion) gardencorev1beta1.ExpirableVersion {
+ var result = version.DeepCopy()
+
+ if result.Classification != nil || result.ExpirationDate != nil {
+ // old cloud profile definition, convert to lifecycle
+ // this can be removed as soon as we remove the old classification and expiration date fields
+
+ if result.Classification != nil {
+ result.Lifecycle = append(result.Lifecycle, gardencorev1beta1.LifecycleStage{
+ Classification: *result.Classification,
+ })
+ }
+
+ if result.ExpirationDate != nil {
+ if result.Classification == nil {
+ result.Lifecycle = append(result.Lifecycle, gardencorev1beta1.LifecycleStage{
+ Classification: gardencorev1beta1.ClassificationSupported,
+ })
+ }
+
+ result.Lifecycle = append(result.Lifecycle, gardencorev1beta1.LifecycleStage{
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: result.ExpirationDate,
+ })
+ }
+ }
+
+ if len(result.Lifecycle) == 0 {
+ // when there is no classification lifecycle defined then default to supported
+ result.Lifecycle = append(result.Lifecycle, gardencorev1beta1.LifecycleStage{
+ Classification: gardencorev1beta1.ClassificationSupported,
+ })
+ }
+
+ result.Classification = nil
+ result.ExpirationDate = nil
+
+ return *result
+}
+
func mergeMachineImages(base, override gardencorev1beta1.MachineImage) gardencorev1beta1.MachineImage {
if ptr.Deref(override.UpdateStrategy, "") != "" {
base.UpdateStrategy = override.UpdateStrategy
@@ -188,7 +269,7 @@ func mergeMachineImageVersions(base, override gardencorev1beta1.MachineImageVers
// If the NamespacedCloudProfile machine image version has been there before, do not merge it with the parent CloudProfile machine image version.
return override
}
- base.ExpirableVersion = mergeExpirationDates(base.ExpirableVersion, override.ExpirableVersion)
+ base.ExpirableVersion = mergeExpirableVersions(base.ExpirableVersion, override.ExpirableVersion)
return base
}
diff --git a/pkg/controllermanager/controller/namespacedcloudprofile/reconciler_test.go b/pkg/controllermanager/controller/namespacedcloudprofile/reconciler_test.go
index 1118e9b04ee..e2675b422ca 100644
--- a/pkg/controllermanager/controller/namespacedcloudprofile/reconciler_test.go
+++ b/pkg/controllermanager/controller/namespacedcloudprofile/reconciler_test.go
@@ -261,7 +261,7 @@ var _ = Describe("NamespacedCloudProfile Reconciler", func() {
Expect(err).ToNot(HaveOccurred())
})
- It("should merge Kubernetes versions correctly", func() {
+ It("should ignore ExpirationDate set only in NamespacedCloudProfile", func() {
namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
{Version: "1.0.0", ExpirationDate: &newExpiryDate},
}
@@ -281,7 +281,7 @@ var _ = Describe("NamespacedCloudProfile Reconciler", func() {
gomock.InOrder(
c.EXPECT().Status().Return(sw),
sw.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any()).DoAndReturn(func(_ context.Context, o client.Object, patch client.Patch, _ ...client.PatchOption) error {
- Expect(patch.Data(o)).To(BeEquivalentTo(fmt.Sprintf(`{"status":{"cloudProfileSpec":{"kubernetes":{"versions":[{"expirationDate":"%s","version":"1.0.0"}]},"machineImages":[],"machineTypes":[]}}}`, newExpiryDate.UTC().Format(time.RFC3339))))
+ Expect(patch.Data(o)).To(BeEquivalentTo(`{"status":{"cloudProfileSpec":{"kubernetes":{"versions":[{"lifecycle":[{"classification":"supported"}],"version":"1.0.0"}]},"machineImages":[],"machineTypes":[]}}}`))
return nil
}),
)
@@ -291,6 +291,161 @@ var _ = Describe("NamespacedCloudProfile Reconciler", func() {
Expect(err).ToNot(HaveOccurred())
})
+ It("should merge Kubernetes versions ExpirationDates correctly", func() {
+ cloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.0.0", ExpirationDate: ptr.To(metav1.Time{Time: newExpiryDate.Add(24 * time.Hour)})},
+ }
+ namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.0.0", ExpirationDate: &newExpiryDate},
+ }
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: namespacedCloudProfileName, Namespace: namespaceName}, gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.NamespacedCloudProfile, _ ...client.GetOption) error {
+ namespacedCloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: cloudProfileName}, gomock.AssignableToTypeOf(&gardencorev1beta1.CloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.CloudProfile, _ ...client.GetOption) error {
+ cloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any())
+
+ gomock.InOrder(
+ c.EXPECT().Status().Return(sw),
+ sw.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any()).DoAndReturn(func(_ context.Context, o client.Object, patch client.Patch, _ ...client.PatchOption) error {
+ Expect(patch.Data(o)).To(BeEquivalentTo(fmt.Sprintf(`{"status":{"cloudProfileSpec":{"kubernetes":{"versions":[{"lifecycle":[{"classification":"supported"},{"classification":"expired","startTime":"%s"}],"version":"1.0.0"}]},"machineImages":[],"machineTypes":[]}}}`, newExpiryDate.UTC().Format(time.RFC3339))))
+ return nil
+ }),
+ )
+
+ result, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: types.NamespacedName{Name: namespacedCloudProfileName, Namespace: namespaceName}})
+ Expect(result).To(Equal(reconcile.Result{}))
+ Expect(err).ToNot(HaveOccurred())
+ })
+
+ It("should ignore Lifecycles expired classification set only in NamespacedCloudProfile", func() {
+ namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.0.0", Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: &newExpiryDate,
+ },
+ }},
+ }
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: namespacedCloudProfileName, Namespace: namespaceName}, gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.NamespacedCloudProfile, _ ...client.GetOption) error {
+ namespacedCloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: cloudProfileName}, gomock.AssignableToTypeOf(&gardencorev1beta1.CloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.CloudProfile, _ ...client.GetOption) error {
+ cloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any())
+
+ gomock.InOrder(
+ c.EXPECT().Status().Return(sw),
+ sw.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any()).DoAndReturn(func(_ context.Context, o client.Object, patch client.Patch, _ ...client.PatchOption) error {
+ Expect(patch.Data(o)).To(BeEquivalentTo(`{"status":{"cloudProfileSpec":{"kubernetes":{"versions":[{"lifecycle":[{"classification":"supported"}],"version":"1.0.0"}]},"machineImages":[],"machineTypes":[]}}}`))
+ return nil
+ }),
+ )
+
+ result, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: types.NamespacedName{Name: namespacedCloudProfileName, Namespace: namespaceName}})
+ Expect(result).To(Equal(reconcile.Result{}))
+ Expect(err).ToNot(HaveOccurred())
+ })
+
+ It("should adjust supported startTime to deprecrated startTime when before", func() {
+ overriddenDeprecatedDate := &metav1.Time{Time: time.Now()}
+ supportedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 1)}
+ deprecatedDate := &metav1.Time{Time: time.Now().AddDate(0, 0, 2)}
+ cloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationPreview},
+ {Classification: gardencorev1beta1.ClassificationSupported, StartTime: supportedDate},
+ {Classification: gardencorev1beta1.ClassificationDeprecated, StartTime: deprecatedDate},
+ },
+ },
+ }
+ namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.1.0",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationDeprecated, StartTime: overriddenDeprecatedDate},
+ },
+ },
+ }
+
+ namespacedcloudprofilecontroller.MergeCloudProfiles(namespacedCloudProfile, cloudProfile)
+
+ Expect(namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions[0].Lifecycle).To(Equal([]gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationPreview},
+ {Classification: gardencorev1beta1.ClassificationSupported, StartTime: overriddenDeprecatedDate},
+ {Classification: gardencorev1beta1.ClassificationDeprecated, StartTime: overriddenDeprecatedDate},
+ }))
+ })
+
+ It("should merge Kubernetes version Lifecycles classification startTimes correctly", func() {
+ cloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.0.0", Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationSupported,
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.Time{Time: newExpiryDate.Add(12 * time.Hour)}),
+ },
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: ptr.To(metav1.Time{Time: newExpiryDate.Add(24 * time.Hour)}),
+ },
+ }},
+ }
+ namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.0.0", Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {
+ Classification: gardencorev1beta1.ClassificationDeprecated,
+ StartTime: ptr.To(metav1.Time{Time: newExpiryDate.Add(48 * time.Hour)}),
+ },
+ }},
+ }
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: namespacedCloudProfileName, Namespace: namespaceName}, gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.NamespacedCloudProfile, _ ...client.GetOption) error {
+ namespacedCloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Get(gomock.Any(), client.ObjectKey{Name: cloudProfileName}, gomock.AssignableToTypeOf(&gardencorev1beta1.CloudProfile{})).DoAndReturn(func(_ context.Context, _ client.ObjectKey, obj *gardencorev1beta1.CloudProfile, _ ...client.GetOption) error {
+ cloudProfile.DeepCopyInto(obj)
+ return nil
+ })
+
+ c.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any())
+
+ gomock.InOrder(
+ c.EXPECT().Status().Return(sw),
+ sw.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any()).DoAndReturn(func(_ context.Context, o client.Object, patch client.Patch, _ ...client.PatchOption) error {
+ Expect(patch.Data(o)).To(BeEquivalentTo(fmt.Sprintf(
+ `{"status":{"cloudProfileSpec":{"kubernetes":{"versions":[{"lifecycle":[{"classification":"supported"},{"classification":"deprecated","startTime":"%s"},{"classification":"expired","startTime":"%s"}],"version":"1.0.0"}]},"machineImages":[],"machineTypes":[]}}}`,
+ newExpiryDate.UTC().Add(48*time.Hour).Format(time.RFC3339), // deprecated: taken from NamespacedCloudProfile Spec
+ newExpiryDate.UTC().Add(48*time.Hour).Format(time.RFC3339), // expired: is postponed to the deprecated date
+ )))
+ return nil
+ }),
+ )
+
+ result, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: types.NamespacedName{Name: namespacedCloudProfileName, Namespace: namespaceName}})
+ Expect(err).ToNot(HaveOccurred())
+ Expect(result.Requeue).To(BeFalse())
+ Expect(result.RequeueAfter).To(BeNumerically("~", 48*time.Hour, time.Second))
+ })
+
It("should set observedGeneration correctly", func() {
namespacedCloudProfile.Generation = 7
@@ -501,7 +656,9 @@ var _ = Describe("NamespacedCloudProfile Reconciler", func() {
Expect(err).ToNot(HaveOccurred())
})
- It("should merge MachineImages correctly", func() {
+ // TODO: Add the following test also with classification lifecycle set:
+
+ It("should merge MachineImages correctly and ignore an additional ExpirationDate set", func() {
newExpiryDate := metav1.Now()
namespacedCloudProfile.Spec.MachineImages = []gardencorev1beta1.MachineImage{
{
@@ -530,7 +687,7 @@ var _ = Describe("NamespacedCloudProfile Reconciler", func() {
gomock.InOrder(
c.EXPECT().Status().Return(sw),
sw.EXPECT().Patch(gomock.Any(), gomock.AssignableToTypeOf(&gardencorev1beta1.NamespacedCloudProfile{}), gomock.Any()).DoAndReturn(func(_ context.Context, o client.Object, patch client.Patch, _ ...client.PatchOption) error {
- versionOverride := fmt.Sprintf(`{"architectures":["amd64"],"cri":[{"name":"containerd"}],"expirationDate":"%s","kubeletVersionConstraint":"==1.30.0","version":"1.0.0"}`, newExpiryDate.UTC().Format(time.RFC3339))
+ versionOverride := `{"architectures":["amd64"],"cri":[{"name":"containerd"}],"kubeletVersionConstraint":"==1.30.0","lifecycle":[{"classification":"supported"}],"version":"1.0.0"}`
versionAdded := `{"version":"1.1.2"}`
Expect(patch.Data(o)).To(And(
// The order is (currently) indeterministic.
diff --git a/pkg/controllermanager/controller/shoot/maintenance/reconciler.go b/pkg/controllermanager/controller/shoot/maintenance/reconciler.go
index 7352357afd5..17d49444945 100644
--- a/pkg/controllermanager/controller/shoot/maintenance/reconciler.go
+++ b/pkg/controllermanager/controller/shoot/maintenance/reconciler.go
@@ -626,7 +626,7 @@ func shouldKubernetesVersionBeUpdated(kubernetesVersion string, autoUpdate bool,
return true, updateReason, true, nil
}
- if ExpirationDateExpired(version.ExpirationDate) {
+ if v1beta1helper.VersionIsExpired(version) {
updateReason = "Kubernetes version expired - force update required"
return true, updateReason, true, nil
}
@@ -784,7 +784,7 @@ func shouldMachineImageVersionBeUpdated(shootMachineImage *gardencorev1beta1.Sho
return true, updateReason, true
}
- if ExpirationDateExpired(machineImage.Versions[versionIndex].ExpirationDate) {
+ if v1beta1helper.VersionIsExpired(machineImage.Versions[versionIndex].ExpirableVersion) {
updateReason = fmt.Sprintf("Machine image version expired - force update required (image update strategy: %s)", *machineImage.UpdateStrategy)
return true, updateReason, true
}
@@ -871,14 +871,6 @@ func determineVersionForStrategy(expirableVersions []gardencorev1beta1.Expirable
return versionForForceUpdate, nil
}
-// ExpirationDateExpired returns if now is equal or after the given expirationDate
-func ExpirationDateExpired(timestamp *metav1.Time) bool {
- if timestamp == nil {
- return false
- }
- return time.Now().UTC().After(timestamp.Time) || time.Now().UTC().Equal(timestamp.Time)
-}
-
// setLimitedSwap sets the swap behavior to `LimitedSwap` if it's currently set to `UnlimitedSwap`
func setLimitedSwap(kubelet *gardencorev1beta1.KubeletConfig, reason string) []string {
var reasonsForUpdate []string
diff --git a/pkg/controllermanager/controller/shoot/maintenance/reconciler_test.go b/pkg/controllermanager/controller/shoot/maintenance/reconciler_test.go
index 5814ff7f1b0..666a330d648 100644
--- a/pkg/controllermanager/controller/shoot/maintenance/reconciler_test.go
+++ b/pkg/controllermanager/controller/shoot/maintenance/reconciler_test.go
@@ -36,20 +36,6 @@ var _ = Describe("Shoot Maintenance", func() {
expirationDateInThePast = metav1.Time{Time: now.AddDate(0, 0, -1)}
})
- Context("Shoot Maintenance", func() {
- Describe("#ExpirationDateExpired", func() {
- It("should determine that expirationDate applies", func() {
- applies := ExpirationDateExpired(&expirationDateInThePast)
- Expect(applies).To(BeTrue())
- })
-
- It("should determine that expirationDate not applies", func() {
- applies := ExpirationDateExpired(&expirationDateInTheFuture)
- Expect(applies).To(BeFalse())
- })
- })
- })
-
Describe("#maintainMachineImages", func() {
var (
shootCurrentImage *gardencorev1beta1.ShootMachineImage
diff --git a/pkg/utils/gardener/cloudprofile.go b/pkg/utils/gardener/cloudprofile.go
index 6d500d0ce9e..5b7f2973aba 100644
--- a/pkg/utils/gardener/cloudprofile.go
+++ b/pkg/utils/gardener/cloudprofile.go
@@ -163,13 +163,13 @@ func ValidateCloudProfileChanges(cloudProfileLister gardencorev1beta1listers.Clo
// Check that the target cloud profile still supports the currently used machine types, machine images and volume types.
// No need to check for Kubernetes versions, as the NamespacedCloudProfile could have only extended a version so with the next maintenance the Shoot will be updated to a supported version.
- _, removedMachineImageVersions, _, _ := gardencorehelper.GetMachineImageDiff(oldCloudProfileSpecCore.MachineImages, newCloudProfileSpecCore.MachineImages)
+ diff := gardencorehelper.GetMachineImageDiff(oldCloudProfileSpecCore.MachineImages, newCloudProfileSpecCore.MachineImages)
machineTypes := utils.CreateMapFromSlice(newCloudProfileSpec.MachineTypes, func(mt gardencorev1beta1.MachineType) string { return mt.Name })
volumeTypes := utils.CreateMapFromSlice(newCloudProfileSpec.VolumeTypes, func(vt gardencorev1beta1.VolumeType) string { return vt.Name })
for _, w := range newShoot.Spec.Provider.Workers {
- if len(removedMachineImageVersions) > 0 && w.Machine.Image != nil {
- if removedVersions, exists := removedMachineImageVersions[w.Machine.Image.Name]; exists {
+ if len(diff.RemovedVersions) > 0 && w.Machine.Image != nil {
+ if removedVersions, exists := diff.RemovedVersions[w.Machine.Image.Name]; exists {
if removedVersions.Has(w.Machine.Image.Version) {
return fmt.Errorf("newly referenced cloud profile does not contain the machine image version \"%s@%s\" currently in use by worker \"%s\"", w.Machine.Image.Name, w.Machine.Image.Version, w.Name)
}
diff --git a/pkg/utils/gardener/cloudprofile_test.go b/pkg/utils/gardener/cloudprofile_test.go
index a2aa5f1b0ba..78c26bd5e32 100644
--- a/pkg/utils/gardener/cloudprofile_test.go
+++ b/pkg/utils/gardener/cloudprofile_test.go
@@ -404,7 +404,7 @@ var _ = Describe("CloudProfile", func() {
})
})
- Describe("#BuildCloudProfileReference", func() {
+ Describe("#BuildCoreCloudProfileReference", func() {
It("should return nil for nil shoot", func() {
Expect(gardenerutils.BuildCoreCloudProfileReference(nil)).To(BeNil())
})
diff --git a/plugin/pkg/global/resourcereferencemanager/admission.go b/plugin/pkg/global/resourcereferencemanager/admission.go
index 7d155548a16..f376613fdc3 100644
--- a/plugin/pkg/global/resourcereferencemanager/admission.go
+++ b/plugin/pkg/global/resourcereferencemanager/admission.go
@@ -39,6 +39,7 @@ import (
"github.com/gardener/gardener/pkg/apis/core/helper"
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"
"github.com/gardener/gardener/pkg/apis/security"
securityv1alpha1 "github.com/gardener/gardener/pkg/apis/security/v1alpha1"
"github.com/gardener/gardener/pkg/apis/seedmanagement"
@@ -478,15 +479,33 @@ func (r *ReferenceManager) Validate(ctx context.Context, a admission.Attributes,
return apierrors.NewBadRequest("could not convert old resource into CloudProfile object")
}
+ kubernetesKeyFunc := func(v core.ExpirableVersion) string { return v.Version }
+ newKubernetesVersions := utils.CreateMapFromSlice(cloudProfile.Spec.Kubernetes.Versions, kubernetesKeyFunc)
+
// getting Kubernetes versions that have been removed from the CloudProfile
removedKubernetesVersions := sets.StringKeySet(helper.GetRemovedVersions(oldCloudProfile.Spec.Kubernetes.Versions, cloudProfile.Spec.Kubernetes.Versions))
+ removedKubernetesClassificationLifecycles := make(map[string][]core.VersionClassification)
+
+ for _, existingVersion := range oldCloudProfile.Spec.Kubernetes.Versions {
+ if removedKubernetesVersions.Has(existingVersion.Version) {
+ continue
+ }
+ for _, existingLifecycleClass := range existingVersion.Lifecycle {
+ if slices.ContainsFunc(newKubernetesVersions[existingVersion.Version].Lifecycle, func(newLifecycle core.LifecycleStage) bool {
+ return newLifecycle.Classification == existingLifecycleClass.Classification
+ }) {
+ continue
+ }
+ removedKubernetesClassificationLifecycles[existingVersion.Version] = append(removedKubernetesClassificationLifecycles[existingVersion.Version], existingLifecycleClass.Classification)
+ }
+ }
// getting Machine image versions that have been removed from or added to the CloudProfile
- removedMachineImages, removedMachineImageVersions, addedMachineImages, addedMachineImageVersions := helper.GetMachineImageDiff(oldCloudProfile.Spec.MachineImages, cloudProfile.Spec.MachineImages)
+ diff := helper.GetMachineImageDiff(oldCloudProfile.Spec.MachineImages, cloudProfile.Spec.MachineImages)
wasLimitAdded := !apiequality.Semantic.DeepEqual(cloudProfile.Spec.Limits, oldCloudProfile.Spec.Limits)
- if len(removedKubernetesVersions) > 0 || len(removedMachineImageVersions) > 0 || len(addedMachineImageVersions) > 0 || wasLimitAdded {
+ if len(removedKubernetesVersions) > 0 || len(diff.RemovedVersions) > 0 || len(diff.AddedVersions) > 0 || len(diff.RemovedVersionClassifications) > 0 || len(removedKubernetesClassificationLifecycles) > 0 || wasLimitAdded {
shootList, err1 := r.shootLister.List(labels.Everything())
if err1 != nil {
return apierrors.NewInternalError(fmt.Errorf("could not list shoots to verify that Kubernetes and/or Machine image version can be removed: %v", err1))
@@ -517,6 +536,12 @@ func (r *ReferenceManager) Validate(ctx context.Context, a admission.Attributes,
ncpNamespacedName := types.NamespacedName{Name: ncp.Name, Namespace: ncp.Namespace}
relevantNamespacedCloudProfiles[ncpNamespacedName.String()] = ncp
+ matchesClassification := func(classification core.VersionClassification) func(stage gardencorev1beta1.LifecycleStage) bool {
+ return func(stage gardencorev1beta1.LifecycleStage) bool {
+ return core.VersionClassification(stage.Classification) == classification
+ }
+ }
+
go func(nscpfl *gardencorev1beta1.NamespacedCloudProfile) {
defer wg.Done()
@@ -525,21 +550,37 @@ func (r *ReferenceManager) Validate(ctx context.Context, a admission.Attributes,
if removedKubernetesVersions.Has(kubernetesVersion.Version) {
channel <- fmt.Errorf("unable to delete Kubernetes version %q from CloudProfile %q - version is still in use by NamespacedCloudProfile '%s/%s'", kubernetesVersion.Version, cloudProfile.Name, nscpfl.Namespace, nscpfl.Name)
}
+ if removedClassifications, exists := removedKubernetesClassificationLifecycles[kubernetesVersion.Version]; exists {
+ for _, c := range removedClassifications {
+ if slices.ContainsFunc(kubernetesVersion.Lifecycle, matchesClassification(c)) {
+ channel <- fmt.Errorf("unable to delete Kubernetes classification lifecycle %q from version %q from CloudProfile %q still in use by NamespacedCloudProfile '%s/%s'", c, kubernetesVersion.Version, cloudProfile.Name, nscpfl.Namespace, nscpfl.Name)
+ }
+ }
+ }
}
}
for _, machineImage := range nscpfl.Spec.MachineImages {
- if removedMachineImages.Has(machineImage.Name) {
+ if diff.RemovedImages.Has(machineImage.Name) {
channel <- fmt.Errorf("unable to delete MachineImage %q from CloudProfile %q - MachineImage is still in use by NamespacedCloudProfile %q", machineImage.Name, cloudProfile.Name, ncpNamespacedName.String())
}
- if addedMachineImages.Has(machineImage.Name) {
+ if diff.AddedImages.Has(machineImage.Name) {
channel <- fmt.Errorf("unable to add MachineImage %q to CloudProfile %q - MachineImage is already defined by NamespacedCloudProfile %q", machineImage.Name, cloudProfile.Name, ncpNamespacedName.String())
}
- if removedVersions, exists := removedMachineImageVersions[machineImage.Name]; exists {
- for _, imageVersion := range machineImage.Versions {
+ for _, imageVersion := range machineImage.Versions {
+ if removedVersions, exists := diff.RemovedVersions[machineImage.Name]; exists {
if removedVersions.Has(imageVersion.Version) {
channel <- fmt.Errorf("unable to delete MachineImage version '%s/%s' from CloudProfile %q - version is still in use by NamespacedCloudProfile '%s/%s'", machineImage.Name, imageVersion.Version, cloudProfile.Name, nscpfl.Namespace, nscpfl.Name)
}
+
+ }
+ if removedClassifications, exists := diff.RemovedVersionClassifications[machineImage.Name]; exists {
+ for _, c := range removedClassifications[imageVersion.Version] {
+ if slices.ContainsFunc(imageVersion.Lifecycle, matchesClassification(c)) {
+ channel <- fmt.Errorf("unable to delete classification lifecycle %q from MachineImage version '%s/%s' from CloudProfile %q still in use by NamespacedCloudProfile '%s/%s'", c, machineImage.Name, imageVersion.Version, cloudProfile.Name, nscpfl.Namespace, nscpfl.Name)
+ }
+
+ }
}
}
}
@@ -565,11 +606,11 @@ func (r *ReferenceManager) Validate(ctx context.Context, a admission.Attributes,
continue
}
// happens if Shoot runs an image that does not exist in the old CloudProfile - in this case: ignore
- if _, ok := removedMachineImageVersions[worker.Machine.Image.Name]; !ok {
+ if _, ok := diff.RemovedVersions[worker.Machine.Image.Name]; !ok {
continue
}
- if removedMachineImageVersions[worker.Machine.Image.Name].Has(*worker.Machine.Image.Version) {
+ if diff.RemovedVersions[worker.Machine.Image.Name].Has(*worker.Machine.Image.Version) {
channel <- fmt.Errorf("unable to delete Machine image version '%s/%s' from CloudProfile %q - version is still in use by shoot '%s/%s' by worker %q", worker.Machine.Image.Name, *worker.Machine.Image.Version, cloudProfile.Name, shoot.Namespace, shoot.Name, worker.Name)
}
}
@@ -1156,7 +1197,7 @@ func getRemovedMachineImageVersions(namespacedCloudProfile, oldNamespacedCloudPr
func validateShootForRemovedKubernetesVersions(channel chan error, shoot *gardencorev1beta1.Shoot, removedKubernetesVersions sets.Set[string], parentCloudProfileKubernetesVersions map[string]gardencorev1beta1.ExpirableVersion, namespacedCloudProfile *core.NamespacedCloudProfile) {
shootKubernetesVersion := shoot.Spec.Kubernetes.Version
if removedKubernetesVersions.Has(shootKubernetesVersion) {
- if parentCloudProfileKubernetesVersions[shootKubernetesVersion].ExpirationDate != nil && parentCloudProfileKubernetesVersions[shootKubernetesVersion].ExpirationDate.Before(&metav1.Time{Time: time.Now()}) {
+ if v1beta1helper.VersionIsExpired(parentCloudProfileKubernetesVersions[shootKubernetesVersion]) {
channel <- fmt.Errorf("unable to delete Kubernetes version %q from NamespacedCloudProfile '%s/%s' - version with extended expiration date is still in use by shoot '%s/%s'", shootKubernetesVersion, namespacedCloudProfile.Namespace, namespacedCloudProfile.Name, shoot.Namespace, shoot.Name)
}
}
@@ -1175,7 +1216,7 @@ func validateShootWorkersForRemovedMachineImageVersions(channel chan error, shoo
if removedMachineImageVersions[worker.Machine.Image.Name].Has(*worker.Machine.Image.Version) {
parentVersion, exists := parentCloudProfileMachineImageVersions[worker.Machine.Image.Name][*worker.Machine.Image.Version]
- if !exists || parentVersion.ExpirationDate != nil && parentVersion.ExpirationDate.Before(&metav1.Time{Time: time.Now()}) {
+ if !exists || v1beta1helper.VersionIsExpired(parentVersion.ExpirableVersion) {
channel <- fmt.Errorf("unable to delete Machine image version '%s/%s' from NamespacedCloudProfile '%s/%s' - version is still in use by shoot '%s/%s' by worker %q", worker.Machine.Image.Name, *worker.Machine.Image.Version, namespacedCloudProfile.Namespace, namespacedCloudProfile.Name, shoot.Namespace, shoot.Name, worker.Name)
}
}
diff --git a/plugin/pkg/global/resourcereferencemanager/admission_test.go b/plugin/pkg/global/resourcereferencemanager/admission_test.go
index 500c44eb182..075ecc98c8c 100644
--- a/plugin/pkg/global/resourcereferencemanager/admission_test.go
+++ b/plugin/pkg/global/resourcereferencemanager/admission_test.go
@@ -55,7 +55,7 @@ func (fakeAuthorizerType) Authorize(_ context.Context, a authorizer.Attributes)
}
var _ = Describe("resourcereferencemanager", func() {
- Describe("#Admit", func() {
+ Describe("#Validate", func() {
var (
admissionHandler *ReferenceManager
kubeInformerFactory kubeinformers.SharedInformerFactory
@@ -1988,6 +1988,40 @@ var _ = Describe("resourcereferencemanager", func() {
)))
})
+ It("should reject removal of kubernetes version classification lifecycle that are still in use by a NamespacedCloudProfile", func() {
+ namespacedCloudProfile := &gardencorev1beta1.NamespacedCloudProfile{
+ Spec: gardencorev1beta1.NamespacedCloudProfileSpec{
+ Parent: gardencorev1beta1.CloudProfileReference{Kind: "CloudProfile", Name: cloudProfile.Name},
+ Kubernetes: &gardencorev1beta1.KubernetesSettings{Versions: []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.24.1", Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationExpired, StartTime: ptr.To(metav1.Now())},
+ }},
+ }},
+ },
+ }
+ Expect(gardenCoreInformerFactory.Core().V1beta1().NamespacedCloudProfiles().Informer().GetStore().Add(namespacedCloudProfile)).To(Succeed())
+
+ cloudProfile.Spec.Kubernetes.Versions[1].Lifecycle = []core.LifecycleStage{
+ {Classification: core.ClassificationSupported},
+ {Classification: core.ClassificationExpired, StartTime: ptr.To(metav1.Now())},
+ }
+ cloudProfileNew := cloudProfile.DeepCopy()
+ cloudProfileNew.Spec = core.CloudProfileSpec{
+ Kubernetes: core.KubernetesSettings{
+ Versions: []core.ExpirableVersion{
+ {Version: "1.24.1", Lifecycle: []core.LifecycleStage{{Classification: core.ClassificationSupported}}},
+ },
+ },
+ }
+
+ attrs := admission.NewAttributesRecord(cloudProfileNew, &cloudProfile, core.Kind("CloudProfile").WithVersion("version"), "", cloudProfile.Name, core.Resource("CloudProfile").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, defaultUserInfo)
+
+ Expect(admissionHandler.Validate(context.TODO(), attrs, nil)).To(MatchError(And(
+ ContainSubstring("unable to delete Kubernetes classification lifecycle \"expired\" from version \"1.24.1\""),
+ ContainSubstring("still in use by NamespacedCloudProfile"),
+ )))
+ })
+
It("should reject removal of kubernetes versions that are still in use by a Shoot referencing a NamespacedCloudProfile", func() {
namespacedCloudProfile := &gardencorev1beta1.NamespacedCloudProfile{
Spec: gardencorev1beta1.NamespacedCloudProfileSpec{
diff --git a/plugin/pkg/namespacedcloudprofile/validator/admission_test.go b/plugin/pkg/namespacedcloudprofile/validator/admission_test.go
index 22616d55b1d..d539c2896ef 100644
--- a/plugin/pkg/namespacedcloudprofile/validator/admission_test.go
+++ b/plugin/pkg/namespacedcloudprofile/validator/admission_test.go
@@ -237,6 +237,7 @@ var _ = Describe("Admission", func() {
})
It("should fail if the latest Kubernetes version has an expiration date", func() {
+ parentCloudProfile.Spec.Kubernetes.Versions[0] = gardencorev1beta1.ExpirableVersion{Version: "1.30.0", Classification: ptr.To(gardencorev1beta1.ClassificationExpired)}
Expect(coreInformerFactory.Core().V1beta1().CloudProfiles().Informer().GetStore().Add(parentCloudProfile)).To(Succeed())
namespacedCloudProfile.Spec.Kubernetes = &gardencore.KubernetesSettings{Versions: []gardencore.ExpirableVersion{
@@ -318,27 +319,6 @@ var _ = Describe("Admission", func() {
Expect(admissionHandler.Validate(ctx, attrs, nil)).To(Succeed())
})
-
- It("should fail for updating a expiration date to a still invalid value", func() {
- Expect(coreInformerFactory.Core().V1beta1().CloudProfiles().Informer().GetStore().Add(parentCloudProfile)).To(Succeed())
-
- namespacedCloudProfile.Spec.Kubernetes = &gardencore.KubernetesSettings{Versions: []gardencore.ExpirableVersion{
- {Version: "1.28.0", ExpirationDate: expiredExpirationDate},
- }}
- updatedNamespacedCloudProfile := namespacedCloudProfile.DeepCopy()
-
- namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions = []gardencore.ExpirableVersion{
- {Version: "1.28.0", ExpirationDate: expiredExpirationDate}, {Version: "1.29.0"}, {Version: "1.30.0"},
- }
- stillExpiredDate := &metav1.Time{Time: time.Now().Add(-30 * time.Minute)}
- updatedNamespacedCloudProfile.Spec.Kubernetes = &gardencore.KubernetesSettings{Versions: []gardencore.ExpirableVersion{
- {Version: "1.28.0", ExpirationDate: stillExpiredDate},
- }}
-
- attrs := admission.NewAttributesRecord(updatedNamespacedCloudProfile, namespacedCloudProfile, gardencorev1beta1.Kind("NamespacedCloudProfile").WithVersion("version"), "", namespacedCloudProfile.Name, gardencorev1beta1.Resource("namespacedcloudprofile").WithVersion("version"), "", admission.Update, &metav1.CreateOptions{}, false, nil)
-
- Expect(admissionHandler.Validate(ctx, attrs, nil)).To(MatchError(ContainSubstring("expiration date for version \"1.28.0\" is in the past")))
- })
})
Describe("machineType", func() {
@@ -496,45 +476,6 @@ var _ = Describe("Admission", func() {
Expect(admissionHandler.Validate(ctx, attrs, nil)).To(Succeed())
})
- It("should fail for creating a NamespacedCloudProfile that overrides an existing MachineImage version without specifying an expiration date", func() {
- parentCloudProfile.Spec.MachineImages = []gardencorev1beta1.MachineImage{
- {Name: "test-image", Versions: []gardencorev1beta1.MachineImageVersion{
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.2.0"}, CRI: []gardencorev1beta1.CRI{{Name: "containerd"}}},
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.0.0"}, CRI: []gardencorev1beta1.CRI{{Name: "containerd"}}},
- }},
- }
- Expect(coreInformerFactory.Core().V1beta1().CloudProfiles().Informer().GetStore().Add(parentCloudProfile)).To(Succeed())
-
- namespacedCloudProfile.Spec.MachineImages = []gardencore.MachineImage{
- {Name: "test-image", Versions: []gardencore.MachineImageVersion{{ExpirableVersion: gardencore.ExpirableVersion{Version: "1.0.0"}}}},
- }
-
- attrs := admission.NewAttributesRecord(namespacedCloudProfile, nil, gardencorev1beta1.Kind("NamespacedCloudProfile").WithVersion("version"), "", namespacedCloudProfile.Name, gardencorev1beta1.Resource("namespacedcloudprofile").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil)
-
- Expect(admissionHandler.Validate(ctx, attrs, nil)).To(MatchError(ContainSubstring("expiration date for version \"1.0.0\" must be set")))
- })
-
- It("should fail for updating a NamespacedCloudProfile that specifies an already expired MachineImage version", func() {
- parentCloudProfile.Spec.MachineImages = []gardencorev1beta1.MachineImage{
- {Name: "test-image", Versions: []gardencorev1beta1.MachineImageVersion{
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.1.0"}, CRI: []gardencorev1beta1.CRI{{Name: "containerd"}}},
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.2.0"}, CRI: []gardencorev1beta1.CRI{{Name: "containerd"}}},
- }},
- }
- Expect(coreInformerFactory.Core().V1beta1().CloudProfiles().Informer().GetStore().Add(parentCloudProfile)).To(Succeed())
-
- oldNamespacedCloudProfile := namespacedCloudProfile.DeepCopy()
- namespacedCloudProfile.Spec.MachineImages = []gardencore.MachineImage{
- {Name: "test-image", Versions: []gardencore.MachineImageVersion{
- {ExpirableVersion: gardencore.ExpirableVersion{Version: "1.1.0", ExpirationDate: expiredExpirationDate}},
- }},
- }
-
- attrs := admission.NewAttributesRecord(namespacedCloudProfile, oldNamespacedCloudProfile, gardencorev1beta1.Kind("NamespacedCloudProfile").WithVersion("version"), "", namespacedCloudProfile.Name, gardencorev1beta1.Resource("namespacedcloudprofile").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil)
-
- Expect(admissionHandler.Validate(ctx, attrs, nil)).To(MatchError(ContainSubstring("expiration date for version \"1.1.0\" is in the past")))
- })
-
It("should allow creating a NamespacedCloudProfile that specifies an already expired MachineImage version", func() {
parentCloudProfile.Spec.MachineImages = []gardencorev1beta1.MachineImage{
{Name: "test-image", Versions: []gardencorev1beta1.MachineImageVersion{
@@ -689,9 +630,9 @@ var _ = Describe("Admission", func() {
machineTypesConstraint []gardencorev1beta1.MachineType
volumeTypesConstraint []gardencorev1beta1.VolumeType
- supportedClassification = gardencorev1beta1.ClassificationSupported
- previewClassification = gardencorev1beta1.ClassificationPreview
- deprecatedClassification = gardencorev1beta1.ClassificationDeprecated
+ supportedClassification = gardencorev1beta1.ClassificationSupported
+ previewClassification = gardencorev1beta1.ClassificationPreview
+ expiredClassification = gardencorev1beta1.ClassificationExpired
)
BeforeEach(func() {
@@ -801,7 +742,7 @@ var _ = Describe("Admission", func() {
},
{
Version: "1.2.0",
- Classification: &deprecatedClassification,
+ Classification: &expiredClassification,
},
}
namespacedCloudProfile.Spec.Kubernetes.Versions = []gardencorev1beta1.ExpirableVersion{
@@ -811,7 +752,7 @@ var _ = Describe("Admission", func() {
},
{
Version: "1.2.0",
- Classification: &deprecatedClassification,
+ Classification: &expiredClassification,
ExpirationDate: expirationDate,
},
}
@@ -820,7 +761,7 @@ var _ = Describe("Admission", func() {
Expect(errorList).To(ConsistOf(PointTo(MatchFields(IgnoreExtras, Fields{
"Type": Equal(field.ErrorTypeInvalid),
- "Field": Equal("status.cloudProfileSpec.kubernetes.versions[].expirationDate"),
+ "Field": Equal("status.cloudProfileSpec.kubernetes.versions[].lifecycle"),
}))))
})
diff --git a/plugin/pkg/shoot/validator/admission.go b/plugin/pkg/shoot/validator/admission.go
index 547af7309ef..ca444da891f 100644
--- a/plugin/pkg/shoot/validator/admission.go
+++ b/plugin/pkg/shoot/validator/admission.go
@@ -14,7 +14,6 @@ import (
"slices"
"strconv"
"strings"
- "time"
"github.com/Masterminds/semver/v3"
corev1 "k8s.io/api/core/v1"
@@ -1403,12 +1402,12 @@ func findLatestVersion(constraints []gardencorev1beta1.ExpirableVersion, major,
var latestVersion *semver.Version
for _, versionConstraint := range constraints {
// ignore expired versions
- if versionConstraint.ExpirationDate != nil && versionConstraint.ExpirationDate.Time.UTC().Before(time.Now().UTC()) {
+ if !v1beta1helper.VersionIsActive(versionConstraint) {
continue
}
// filter preview versions for defaulting
- if ptr.Deref(versionConstraint.Classification, "") == gardencorev1beta1.ClassificationPreview {
+ if v1beta1helper.VersionIsPreview(versionConstraint) {
continue
}
@@ -1444,7 +1443,7 @@ func validateKubernetesVersionConstraints(a admission.Attributes, constraints []
// Disallow usage of an expired Kubernetes version on Shoot creation and new worker pool creation
// Updating an existing worker to a higher (ensured by validation) expired Kubernetes version is necessary for consecutive maintenance force updates
if a.GetOperation() == admission.Create || isNewWorkerPool {
- if versionConstraint.ExpirationDate != nil && versionConstraint.ExpirationDate.Time.UTC().Before(time.Now().UTC()) {
+ if !v1beta1helper.VersionIsActive(versionConstraint) {
continue
}
}
@@ -1454,7 +1453,7 @@ func validateKubernetesVersionConstraints(a admission.Attributes, constraints []
}
versionStr := versionConstraint.Version
- if ptr.Deref(versionConstraint.Classification, "") == gardencorev1beta1.ClassificationPreview {
+ if v1beta1helper.VersionIsPreview(versionConstraint) {
versionStr += " (preview)"
}
validValues = append(validValues, versionStr)
@@ -1853,9 +1852,9 @@ func validateMachineImagesConstraints(a admission.Attributes, constraints []gard
for _, machineVersion := range machineImage.Versions {
machineImageVersion := fmt.Sprintf("%s:%s", machineImage.Name, machineVersion.Version)
- if machineVersion.ExpirationDate == nil || machineVersion.ExpirationDate.Time.UTC().After(time.Now().UTC()) {
+ if v1beta1helper.VersionIsActive(machineVersion.ExpirableVersion) {
activeMachineImageVersions.Insert(machineImageVersion)
- } else if machineVersion.ExpirationDate != nil && machineVersion.ExpirationDate.Time.UTC().Before(time.Now().UTC()) && a.GetOperation() == admission.Update && !isNewWorkerPool {
+ } else if v1beta1helper.VersionIsExpired(machineVersion.ExpirableVersion) && a.GetOperation() == admission.Update && !isNewWorkerPool {
// An already expired machine image version is a viable machine image version for the worker pool if-and-only-if:
// - this is an update call (no new Shoot creation)
// - updates an existing worker pool (not for a new worker pool)
diff --git a/test/integration/controllermanager/namespacedcloudprofile/namespacedcloudprofile_test.go b/test/integration/controllermanager/namespacedcloudprofile/namespacedcloudprofile_test.go
index 95a5f7829b3..456fdcd35c1 100644
--- a/test/integration/controllermanager/namespacedcloudprofile/namespacedcloudprofile_test.go
+++ b/test/integration/controllermanager/namespacedcloudprofile/namespacedcloudprofile_test.go
@@ -28,11 +28,13 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
mergedCloudProfileSpec *gardencorev1beta1.CloudProfileSpec
- expirationDateFuture metav1.Time
+ expirationDateNearFuture metav1.Time
+ expirationDateFuture metav1.Time
)
BeforeEach(func() {
dateNow, _ := time.Parse(time.DateOnly, time.Now().Format(time.DateOnly))
+ expirationDateNearFuture = metav1.Time{Time: dateNow.Local().Add(24 * time.Hour)}
expirationDateFuture = metav1.Time{Time: dateNow.Local().Add(48 * time.Hour)}
updateStrategy := gardencorev1beta1.MachineImageUpdateStrategy("major")
@@ -44,13 +46,44 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
Spec: gardencorev1beta1.CloudProfileSpec{
Type: "some-type",
Kubernetes: gardencorev1beta1.KubernetesSettings{
- Versions: []gardencorev1beta1.ExpirableVersion{{Version: "1.3.0"}, {Version: "1.2.3"}},
+ Versions: []gardencorev1beta1.ExpirableVersion{
+ {Version: "1.3.0"},
+ {Version: "1.2.3",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: &expirationDateNearFuture,
+ },
+ },
+ },
+ },
},
MachineImages: []gardencorev1beta1.MachineImage{
{
- Name: "some-image",
+ Name: "some-image",
+ UpdateStrategy: &updateStrategy,
Versions: []gardencorev1beta1.MachineImageVersion{
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "4.5.6"}},
+ {
+ ExpirableVersion: gardencorev1beta1.ExpirableVersion{
+ Version: "4.5.6",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: &expirationDateNearFuture,
+ },
+ },
+ },
+ CRI: []gardencorev1beta1.CRI{
+ {
+ Name: "containerd",
+ ContainerRuntimes: nil},
+ },
+ Architectures: []string{
+ "amd64",
+ },
+ },
},
},
},
@@ -87,7 +120,11 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
{
Name: "custom-image",
Versions: []gardencorev1beta1.MachineImageVersion{
- {ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.1.2"}, CRI: []gardencorev1beta1.CRI{{Name: "containerd"}}, Architectures: []string{"amd64"}},
+ {
+ ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.1.2"},
+ CRI: []gardencorev1beta1.CRI{{Name: "containerd"}},
+ Architectures: []string{"amd64"},
+ },
},
UpdateStrategy: &updateStrategy,
},
@@ -109,8 +146,13 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
Versions: []gardencorev1beta1.ExpirableVersion{
{Version: "1.3.0"},
{
- Version: "1.2.3",
- ExpirationDate: &expirationDateFuture,
+ Version: "1.2.3", Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: &expirationDateFuture,
+ },
+ },
},
},
},
@@ -124,12 +166,20 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
Architectures: []string{"amd64"},
},
{
- ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "4.5.6", ExpirationDate: &expirationDateFuture},
+ ExpirableVersion: gardencorev1beta1.ExpirableVersion{
+ Version: "4.5.6",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {
+ Classification: gardencorev1beta1.ClassificationExpired,
+ StartTime: &expirationDateFuture,
+ },
+ },
+ },
CRI: []gardencorev1beta1.CRI{
{
Name: "containerd",
- ContainerRuntimes: nil,
- },
+ ContainerRuntimes: nil},
},
Architectures: []string{
"amd64",
@@ -144,7 +194,8 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
{
ExpirableVersion: gardencorev1beta1.ExpirableVersion{Version: "1.1.2"},
CRI: []gardencorev1beta1.CRI{{Name: "containerd"}},
- Architectures: []string{"amd64"}},
+ Architectures: []string{"amd64"},
+ },
},
UpdateStrategy: &updateStrategy,
},
@@ -340,9 +391,21 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
}).Should(Succeed())
waitForNamespacedCloudProfileToBeReconciled(ctx, namespacedCloudProfile)
+ expectedKubernetesVersions := gardencorev1beta1.KubernetesSettings{
+ Versions: []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.2.3",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {Classification: gardencorev1beta1.ClassificationExpired, StartTime: &expirationDateNearFuture},
+ },
+ },
+ {Version: "1.3.0"},
+ },
+ }
+
Expect(namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions).To(ContainElements(
- gardencorev1beta1.ExpirableVersion{Version: "1.2.3"},
- gardencorev1beta1.ExpirableVersion{Version: "1.3.0"},
+ expectedKubernetesVersions.Versions,
))
})
@@ -353,12 +416,24 @@ var _ = Describe("NamespacedCloudProfile controller tests", func() {
return testClient.Patch(ctx, parentCloudProfile, cloudProfilePatch)
}).Should(Succeed())
+ expectedKubernetesVersions := gardencorev1beta1.KubernetesSettings{
+ Versions: []gardencorev1beta1.ExpirableVersion{
+ {
+ Version: "1.2.3",
+ Lifecycle: []gardencorev1beta1.LifecycleStage{
+ {Classification: gardencorev1beta1.ClassificationSupported},
+ {Classification: gardencorev1beta1.ClassificationExpired, StartTime: &expirationDateFuture},
+ },
+ },
+ {Version: "1.3.0"},
+ {Version: "1.4.0"},
+ },
+ }
+
Eventually(func(g Gomega) {
g.Expect(testClient.Get(ctx, client.ObjectKeyFromObject(namespacedCloudProfile), namespacedCloudProfile)).To(Succeed())
g.Expect(namespacedCloudProfile.Status.CloudProfileSpec.Kubernetes.Versions).To(ContainElements(
- gardencorev1beta1.ExpirableVersion{Version: "1.2.3", ExpirationDate: &expirationDateFuture},
- gardencorev1beta1.ExpirableVersion{Version: "1.3.0"},
- gardencorev1beta1.ExpirableVersion{Version: "1.4.0"},
+ expectedKubernetesVersions.Versions,
))
}).Should(Succeed())
})