From 8fb1b71c6670b13669c365058546c9671c81b0c9 Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Thu, 10 Nov 2016 17:33:06 -0500 Subject: [PATCH 1/2] Implements projected volume driver Proposal: kubernetes/kubernetes#35313 --- cmd/kubelet/app/plugins.go | 2 + hack/.linted_packages | 1 + hack/verify-flags/exceptions.txt | 8 + pkg/api/testing/fuzzer.go | 10 + pkg/api/types.go | 83 +- pkg/api/v1/defaults.go | 7 + pkg/api/v1/defaults_test.go | 22 + pkg/api/v1/types.go | 85 + pkg/api/validation/validation.go | 132 +- pkg/apis/extensions/types.go | 1 + pkg/kubelet/secret/secret_manager.go | 6 + pkg/security/podsecuritypolicy/util/util.go | 6 +- pkg/volume/configmap/configmap.go | 5 +- pkg/volume/configmap/configmap_test.go | 2 +- pkg/volume/downwardapi/downwardapi.go | 16 +- pkg/volume/projected/projected.go | 325 ++++ pkg/volume/projected/projected_test.go | 1046 +++++++++++++ pkg/volume/secret/secret.go | 5 +- pkg/volume/secret/secret_test.go | 2 +- test/e2e/common/projected.go | 1534 +++++++++++++++++++ 20 files changed, 3269 insertions(+), 29 deletions(-) create mode 100644 pkg/volume/projected/projected.go create mode 100644 pkg/volume/projected/projected_test.go create mode 100644 test/e2e/common/projected.go diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go index 4dfc81724f9..417193ec528 100644 --- a/cmd/kubelet/app/plugins.go +++ b/cmd/kubelet/app/plugins.go @@ -46,6 +46,7 @@ import ( "k8s.io/kubernetes/pkg/volume/iscsi" "k8s.io/kubernetes/pkg/volume/nfs" "k8s.io/kubernetes/pkg/volume/photon_pd" + "k8s.io/kubernetes/pkg/volume/projected" "k8s.io/kubernetes/pkg/volume/quobyte" "k8s.io/kubernetes/pkg/volume/rbd" "k8s.io/kubernetes/pkg/volume/secret" @@ -88,6 +89,7 @@ func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...) allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...) allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, projected.ProbeVolumePlugins()...) return allPlugins } diff --git a/hack/.linted_packages b/hack/.linted_packages index a6f14cfdba5..c499b966618 100644 --- a/hack/.linted_packages +++ b/hack/.linted_packages @@ -243,6 +243,7 @@ pkg/util/yaml pkg/version/prometheus pkg/volume pkg/volume/downwardapi +pkg/volume/projected pkg/volume/quobyte pkg/volume/util/nestedpendingoperations pkg/volume/util/operationexecutor diff --git a/hack/verify-flags/exceptions.txt b/hack/verify-flags/exceptions.txt index 8f0c861e9fd..608f1b61b58 100644 --- a/hack/verify-flags/exceptions.txt +++ b/hack/verify-flags/exceptions.txt @@ -147,6 +147,14 @@ test/e2e/common/host_path.go: fmt.Sprintf("--file_content_in_loop=%v", filePat test/e2e/common/host_path.go: fmt.Sprintf("--file_content_in_loop=%v", filePathInReader), test/e2e/common/host_path.go: fmt.Sprintf("--retry_time=%d", retryDuration), test/e2e/common/host_path.go: fmt.Sprintf("--retry_time=%d", retryDuration), +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volume/data-1"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/create/data-1"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/delete/data-1"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/update/data-3"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/create/data-1"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/delete/data-1"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/update/data-3"}, +test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=" + filePath}, test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/create/data-1"}, test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/delete/data-1"}, test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/update/data-3"}, diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index 1a6a204f8ee..4e922e3e6f9 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -267,6 +267,16 @@ func coreFuncs(t apitesting.TestingCommon) []interface{} { mode &= 0777 d.DefaultMode = &mode }, + func(s *api.ProjectedVolumeSource, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + + // DefaultMode should always be set, it has a default + // value and it is expected to be between 0 and 0777 + var mode int32 + c.Fuzz(&mode) + mode &= 0777 + s.DefaultMode = &mode + }, func(k *api.KeyToPath, c fuzz.Continue) { c.FuzzNoCustom(k) // fuzz self without calling this function again k.Key = c.RandString() diff --git a/pkg/api/types.go b/pkg/api/types.go index e5ccc248ac6..cdaa735aa20 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -294,6 +294,8 @@ type VolumeSource struct { AzureDisk *AzureDiskVolumeSource // PhotonPersistentDisk represents a Photon Controller persistent disk attached and mounted on kubelets host machine PhotonPersistentDisk *PhotonPersistentDiskVolumeSource + // Items for all in one resources secrets, configmaps, and downward API + Projected *ProjectedVolumeSource } // Similar to VolumeSource but meant for the administrator who creates PVs. @@ -746,7 +748,29 @@ type SecretVolumeSource struct { // mode, like fsGroup, and the result can be other mode bits set. // +optional DefaultMode *int32 - // Specify whether the Secret or it's key must be defined + // Specify whether the Secret or its key must be defined + // +optional + Optional *bool +} + +// Adapts a secret into a projected volume. +// +// The contents of the target Secret's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names. +// Note that this is identical to a secret volume source without the default +// mode. +type SecretProjection struct { + LocalObjectReference + // If unspecified, each key-value pair in the Data field of the referenced + // Secret will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the Secret, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + Items []KeyToPath + // Specify whether the Secret or its key must be defined // +optional Optional *bool } @@ -927,6 +951,15 @@ type DownwardAPIVolumeFile struct { Mode *int32 } +// Represents downward API info for projecting into a projected volume. +// Note that this is identical to a downwardAPI volume source without the default +// mode. +type DownwardAPIProjection struct { + // Items is a list of DownwardAPIVolume file + // +optional + Items []DownwardAPIVolumeFile +} + // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. type AzureFileVolumeSource struct { // the name of secret that contains Azure Storage Account Name and Key @@ -1017,6 +1050,54 @@ type ConfigMapVolumeSource struct { Optional *bool } +// Adapts a ConfigMap into a projected volume. +// +// The contents of the target ConfigMap's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names, +// unless the items element is populated with specific mappings of keys to paths. +// Note that this is identical to a configmap volume source without the default +// mode. +type ConfigMapProjection struct { + LocalObjectReference + // If unspecified, each key-value pair in the Data field of the referenced + // ConfigMap will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the ConfigMap, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + Items []KeyToPath + // Specify whether the ConfigMap or it's keys must be defined + // +optional + Optional *bool +} + +// Represents a projected volume source +type ProjectedVolumeSource struct { + // list of volume projections + Sources []VolumeProjection + // Mode bits to use on created files by default. Must be a value between + // 0 and 0777. + // Directories within the path are not affected by this setting. + // This might be in conflict with other options that affect the file + // mode, like fsGroup, and the result can be other mode bits set. + // +optional + DefaultMode *int32 +} + +// Projection that may be projected along with other supported volume types +type VolumeProjection struct { + // all types below are the supported types for projection into the same volume + + // information about the secret data to project + Secret *SecretProjection + // information about the downwardAPI data to project + DownwardAPI *DownwardAPIProjection + // information about the configMap data to project + ConfigMap *ConfigMapProjection +} + // Maps a string key to a path within a volume. type KeyToPath struct { // The key to project. diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index 6d620bfbf1e..632430fcd7e 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -39,6 +39,7 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { SetDefaults_SecretVolumeSource, SetDefaults_ConfigMapVolumeSource, SetDefaults_DownwardAPIVolumeSource, + SetDefaults_ProjectedVolumeSource, SetDefaults_Secret, SetDefaults_PersistentVolume, SetDefaults_PersistentVolumeClaim, @@ -218,6 +219,12 @@ func SetDefaults_Secret(obj *Secret) { obj.Type = SecretTypeOpaque } } +func SetDefaults_ProjectedVolumeSource(obj *ProjectedVolumeSource) { + if obj.DefaultMode == nil { + perm := int32(ProjectedVolumeSourceDefaultMode) + obj.DefaultMode = &perm + } +} func SetDefaults_PersistentVolume(obj *PersistentVolume) { if obj.Status.Phase == "" { obj.Status.Phase = VolumePending diff --git a/pkg/api/v1/defaults_test.go b/pkg/api/v1/defaults_test.go index 4deeb377c0f..da2933f227f 100644 --- a/pkg/api/v1/defaults_test.go +++ b/pkg/api/v1/defaults_test.go @@ -376,6 +376,28 @@ func TestSetDefaultDownwardAPIVolumeSource(t *testing.T) { } } +func TestSetDefaultProjectedVolumeSource(t *testing.T) { + s := v1.PodSpec{} + s.Volumes = []v1.Volume{ + { + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{}, + }, + }, + } + pod := &v1.Pod{ + Spec: s, + } + output := roundTrip(t, runtime.Object(pod)) + pod2 := output.(*v1.Pod) + defaultMode := pod2.Spec.Volumes[0].VolumeSource.Projected.DefaultMode + expectedMode := v1.ProjectedVolumeSourceDefaultMode + + if defaultMode == nil || *defaultMode != expectedMode { + t.Errorf("Expected ProjectedVolumeSource DefaultMode %v, got %v", expectedMode, defaultMode) + } +} + func TestSetDefaultSecret(t *testing.T) { s := &v1.Secret{} obj2 := roundTrip(t, runtime.Object(s)) diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index 529b5de79c3..11f722ca6ed 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -326,6 +326,8 @@ type VolumeSource struct { AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,22,opt,name=azureDisk"` // PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine PhotonPersistentDisk *PhotonPersistentDiskVolumeSource `json:"photonPersistentDisk,omitempty" protobuf:"bytes,23,opt,name=photonPersistentDisk"` + // Items for all in one resources secrets, configmaps, and downward API + Projected *ProjectedVolumeSource `json:"projected,omitempty"` } // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. @@ -944,6 +946,28 @@ const ( SecretVolumeSourceDefaultMode int32 = 0644 ) +// Adapts a secret into a projected volume. +// +// The contents of the target Secret's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names. +// Note that this is identical to a secret volume source without the default +// mode. +type SecretProjection struct { + LocalObjectReference `json:",inline" protobuf:"bytes,1,opt,name=localObjectReference"` + // If unspecified, each key-value pair in the Data field of the referenced + // Secret will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the Secret, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + Items []KeyToPath `json:"items,omitempty" protobuf:"bytes,2,rep,name=items"` + // Specify whether the Secret or its key must be defined + // +optional + Optional *bool `json:"optional,omitempty" protobuf:"varint,4,opt,name=optional"` +} + // Represents an NFS mount that lasts the lifetime of a pod. // NFS volumes do not support ownership management or SELinux relabeling. type NFSVolumeSource struct { @@ -1108,6 +1132,58 @@ const ( ConfigMapVolumeSourceDefaultMode int32 = 0644 ) +// Adapts a ConfigMap into a projected volume. +// +// The contents of the target ConfigMap's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names, +// unless the items element is populated with specific mappings of keys to paths. +// Note that this is identical to a configmap volume source without the default +// mode. +type ConfigMapProjection struct { + LocalObjectReference `json:",inline" protobuf:"bytes,1,opt,name=localObjectReference"` + // If unspecified, each key-value pair in the Data field of the referenced + // ConfigMap will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the ConfigMap, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + Items []KeyToPath `json:"items,omitempty" protobuf:"bytes,2,rep,name=items"` + // Specify whether the ConfigMap or it's keys must be defined + // +optional + Optional *bool `json:"optional,omitempty" protobuf:"varint,4,opt,name=optional"` +} + +// Represents a projected volume source +type ProjectedVolumeSource struct { + // list of volume projections + Sources []VolumeProjection `json:"sources"` + // Mode bits to use on created files by default. Must be a value between + // 0 and 0777. + // Directories within the path are not affected by this setting. + // This might be in conflict with other options that affect the file + // mode, like fsGroup, and the result can be other mode bits set. + // +optional + DefaultMode *int32 `json:"defaultMode,omitempty"` +} + +// Projection that may be projected along with other supported volume types +type VolumeProjection struct { + // all types below are the supported types for projection into the same volume + + // information about the secret data to project + Secret *SecretProjection `json:"secret,omitempty"` + // information about the downwardAPI data to project + DownwardAPI *DownwardAPIProjection `json:"downwardAPI,omitempty"` + // information about the configMap data to project + ConfigMap *ConfigMapProjection `json:"configMap,omitempty"` +} + +const ( + ProjectedVolumeSourceDefaultMode int32 = 0644 +) + // Maps a string key to a path within a volume. type KeyToPath struct { // The key to project. @@ -4095,6 +4171,15 @@ type DownwardAPIVolumeFile struct { Mode *int32 `json:"mode,omitempty" protobuf:"varint,4,opt,name=mode"` } +// Represents downward API info for projecting into a projected volume. +// Note that this is identical to a downwardAPI volume source without the default +// mode. +type DownwardAPIProjection struct { + // Items is a list of DownwardAPIVolume file + // +optional + Items []DownwardAPIVolumeFile `json:"items,omitempty" protobuf:"bytes,1,rep,name=items"` +} + // SecurityContext holds security configuration that will be applied to a container. // Some fields are present in both SecurityContext and PodSecurityContext. When both // are set, the values in SecurityContext take precedence. diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index ded6d80def5..01474a2e80f 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -518,6 +518,14 @@ func validateVolumeSource(source *api.VolumeSource, fldPath *field.Path) field.E numVolumes++ allErrs = append(allErrs, validateAzureDisk(source.AzureDisk, fldPath.Child("azureDisk"))...) } + if source.Projected != nil { + if numVolumes > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("projected"), "may not specify more than 1 volume type")) + } else { + numVolumes++ + allErrs = append(allErrs, validateProjectedVolumeSource(source.Projected, fldPath.Child("projected"))...) + } + } if numVolumes == 0 { allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type")) @@ -723,6 +731,30 @@ var validDownwardAPIFieldPathExpressions = sets.NewString( "metadata.labels", "metadata.annotations") +func validateDownwardAPIVolumeFile(file *api.DownwardAPIVolumeFile, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if len(file.Path) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("path"), "")) + } + allErrs = append(allErrs, validateLocalNonReservedPath(file.Path, fldPath.Child("path"))...) + if file.FieldRef != nil { + allErrs = append(allErrs, validateObjectFieldSelector(file.FieldRef, &validDownwardAPIFieldPathExpressions, fldPath.Child("fieldRef"))...) + if file.ResourceFieldRef != nil { + allErrs = append(allErrs, field.Invalid(fldPath, "resource", "fieldRef and resourceFieldRef can not be specified simultaneously")) + } + } else if file.ResourceFieldRef != nil { + allErrs = append(allErrs, validateContainerResourceFieldSelector(file.ResourceFieldRef, &validContainerResourceFieldPathExpressions, fldPath.Child("resourceFieldRef"), true)...) + } else { + allErrs = append(allErrs, field.Required(fldPath, "one of fieldRef and resourceFieldRef is required")) + } + if file.Mode != nil && (*file.Mode > 0777 || *file.Mode < 0) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *file.Mode, volumeModeErrorMsg)) + } + + return allErrs +} + func validateDownwardAPIVolumeSource(downwardAPIVolume *api.DownwardAPIVolumeSource, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -732,27 +764,99 @@ func validateDownwardAPIVolumeSource(downwardAPIVolume *api.DownwardAPIVolumeSou } for _, file := range downwardAPIVolume.Items { - if len(file.Path) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("path"), "")) - } - allErrs = append(allErrs, validateLocalNonReservedPath(file.Path, fldPath.Child("path"))...) - if file.FieldRef != nil { - allErrs = append(allErrs, validateObjectFieldSelector(file.FieldRef, &validDownwardAPIFieldPathExpressions, fldPath.Child("fieldRef"))...) - if file.ResourceFieldRef != nil { - allErrs = append(allErrs, field.Invalid(fldPath, "resource", "fieldRef and resourceFieldRef can not be specified simultaneously")) + allErrs = append(allErrs, validateDownwardAPIVolumeFile(&file, fldPath)...) + } + return allErrs +} + +func validateProjectionSources(projection *api.ProjectedVolumeSource, projectionMode *int32, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + allPaths := sets.String{} + + for _, source := range projection.Sources { + numSources := 0 + if source.Secret != nil { + if numSources > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("secret"), "may not specify more than 1 volume type")) + } else { + numSources++ + if len(source.Secret.Name) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) + } + itemsPath := fldPath.Child("items") + for i, kp := range source.Secret.Items { + itemPath := itemsPath.Index(i) + allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...) + if len(kp.Path) > 0 { + curPath := kp.Path + if !allPaths.Has(curPath) { + allPaths.Insert(curPath) + } else { + allErrs = append(allErrs, field.Invalid(fldPath, source.Secret.Name, "conflicting duplicate paths")) + } + } + } } - } else if file.ResourceFieldRef != nil { - allErrs = append(allErrs, validateContainerResourceFieldSelector(file.ResourceFieldRef, &validContainerResourceFieldPathExpressions, fldPath.Child("resourceFieldRef"), true)...) - } else { - allErrs = append(allErrs, field.Required(fldPath, "one of fieldRef and resourceFieldRef is required")) } - if file.Mode != nil && (*file.Mode > 0777 || *file.Mode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *file.Mode, volumeModeErrorMsg)) + if source.ConfigMap != nil { + if numSources > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("configMap"), "may not specify more than 1 volume type")) + } else { + numSources++ + if len(source.ConfigMap.Name) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) + } + itemsPath := fldPath.Child("items") + for i, kp := range source.ConfigMap.Items { + itemPath := itemsPath.Index(i) + allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...) + if len(kp.Path) > 0 { + curPath := kp.Path + if !allPaths.Has(curPath) { + allPaths.Insert(curPath) + } else { + allErrs = append(allErrs, field.Invalid(fldPath, source.ConfigMap.Name, "conflicting duplicate paths")) + } + + } + } + } + } + if source.DownwardAPI != nil { + if numSources > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("downwardAPI"), "may not specify more than 1 volume type")) + } else { + numSources++ + for _, file := range source.DownwardAPI.Items { + allErrs = append(allErrs, validateDownwardAPIVolumeFile(&file, fldPath.Child("downwardAPI"))...) + if len(file.Path) > 0 { + curPath := file.Path + if !allPaths.Has(curPath) { + allPaths.Insert(curPath) + } else { + allErrs = append(allErrs, field.Invalid(fldPath, curPath, "conflicting duplicate paths")) + } + + } + } + } } } return allErrs } +func validateProjectedVolumeSource(projection *api.ProjectedVolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + projectionMode := projection.DefaultMode + if projectionMode != nil && (*projectionMode > 0777 || *projectionMode < 0) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *projectionMode, volumeModeErrorMsg)) + } + + allErrs = append(allErrs, validateProjectionSources(projection, projectionMode, fldPath)...) + return allErrs +} + // This validate will make sure targetPath: // 1. is not abs path // 2. does not have any element which is ".." diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 0c0a03d99a0..f2aa644f7c7 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -905,6 +905,7 @@ var ( Quobyte FSType = "quobyte" AzureDisk FSType = "azureDisk" PhotonPersistentDisk FSType = "photonPersistentDisk" + Projected FSType = "projected" All FSType = "*" ) diff --git a/pkg/kubelet/secret/secret_manager.go b/pkg/kubelet/secret/secret_manager.go index a2145e83ce4..bb7cae93f09 100644 --- a/pkg/kubelet/secret/secret_manager.go +++ b/pkg/kubelet/secret/secret_manager.go @@ -279,6 +279,12 @@ func getSecretNames(pod *v1.Pod) sets.String { for i := range pod.Spec.Volumes { if source := pod.Spec.Volumes[i].Secret; source != nil { result.Insert(source.SecretName) + } else if source := pod.Spec.Volumes[i].Projected; source != nil { + for j := range source.Sources { + if secretVolumeSource := source.Sources[j].Secret; secretVolumeSource != nil { + result.Insert(secretVolumeSource.Name) + } + } } } return result diff --git a/pkg/security/podsecuritypolicy/util/util.go b/pkg/security/podsecuritypolicy/util/util.go index 95408ee8f94..1d34bba71e5 100644 --- a/pkg/security/podsecuritypolicy/util/util.go +++ b/pkg/security/podsecuritypolicy/util/util.go @@ -61,7 +61,9 @@ func GetAllFSTypesAsSet() sets.String { string(extensions.VsphereVolume), string(extensions.Quobyte), string(extensions.AzureDisk), - string(extensions.PhotonPersistentDisk)) + string(extensions.PhotonPersistentDisk), + string(extensions.Projected), + ) return fstypes } @@ -114,6 +116,8 @@ func GetVolumeFSType(v api.Volume) (extensions.FSType, error) { return extensions.AzureDisk, nil case v.PhotonPersistentDisk != nil: return extensions.PhotonPersistentDisk, nil + case v.Projected != nil: + return extensions.Projected, nil } return "", fmt.Errorf("unknown volume type for volume: %#v", v) diff --git a/pkg/volume/configmap/configmap.go b/pkg/volume/configmap/configmap.go index b6b231a2e32..8b90863060b 100644 --- a/pkg/volume/configmap/configmap.go +++ b/pkg/volume/configmap/configmap.go @@ -193,7 +193,7 @@ func (b *configMapVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { len(configMap.Data), totalBytes) - payload, err := makePayload(b.source.Items, configMap, b.source.DefaultMode, optional) + payload, err := MakePayload(b.source.Items, configMap, b.source.DefaultMode, optional) if err != nil { return err } @@ -220,7 +220,8 @@ func (b *configMapVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { return nil } -func makePayload(mappings []v1.KeyToPath, configMap *v1.ConfigMap, defaultMode *int32, optional bool) (map[string]volumeutil.FileProjection, error) { +// Note: this function is exported so that it can be called from the projection volume driver +func MakePayload(mappings []v1.KeyToPath, configMap *v1.ConfigMap, defaultMode *int32, optional bool) (map[string]volumeutil.FileProjection, error) { if defaultMode == nil { return nil, fmt.Errorf("No defaultMode used, not even the default value for it") } diff --git a/pkg/volume/configmap/configmap_test.go b/pkg/volume/configmap/configmap_test.go index 80fa9b1109e..60682b751c1 100644 --- a/pkg/volume/configmap/configmap_test.go +++ b/pkg/volume/configmap/configmap_test.go @@ -238,7 +238,7 @@ func TestMakePayload(t *testing.T) { } for _, tc := range cases { - actualPayload, err := makePayload(tc.mappings, tc.configMap, &tc.mode, tc.optional) + actualPayload, err := MakePayload(tc.mappings, tc.configMap, &tc.mode, tc.optional) if err != nil && tc.success { t.Errorf("%v: unexpected failure making payload: %v", tc.name, err) continue diff --git a/pkg/volume/downwardapi/downwardapi.go b/pkg/volume/downwardapi/downwardapi.go index 96548490b5e..fa2dace72c5 100644 --- a/pkg/volume/downwardapi/downwardapi.go +++ b/pkg/volume/downwardapi/downwardapi.go @@ -175,7 +175,7 @@ func (b *downwardAPIVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { return err } - data, err := b.collectData(b.source.DefaultMode) + data, err := CollectData(b.source.Items, b.pod, b.plugin.host, b.source.DefaultMode) if err != nil { glog.Errorf("Error preparing data for downwardAPI volume %v for pod %v/%v: %s", b.volName, b.pod.Namespace, b.pod.Name, err.Error()) return err @@ -203,17 +203,19 @@ func (b *downwardAPIVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { return nil } -// collectData collects requested downwardAPI in data map. +// CollectData collects requested downwardAPI in data map. // Map's key is the requested name of file to dump // Map's value is the (sorted) content of the field to be dumped in the file. -func (d *downwardAPIVolume) collectData(defaultMode *int32) (map[string]volumeutil.FileProjection, error) { +// +// Note: this function is exported so that it can be called from the projection volume driver +func CollectData(items []v1.DownwardAPIVolumeFile, pod *v1.Pod, host volume.VolumeHost, defaultMode *int32) (map[string]volumeutil.FileProjection, error) { if defaultMode == nil { return nil, fmt.Errorf("No defaultMode used, not even the default value for it") } errlist := []error{} data := make(map[string]volumeutil.FileProjection) - for _, fileInfo := range d.items { + for _, fileInfo := range items { var fileProjection volumeutil.FileProjection fPath := path.Clean(fileInfo.Path) if fileInfo.Mode != nil { @@ -223,7 +225,7 @@ func (d *downwardAPIVolume) collectData(defaultMode *int32) (map[string]volumeut } if fileInfo.FieldRef != nil { // TODO: unify with Kubelet.podFieldSelectorRuntimeValue - if values, err := fieldpath.ExtractFieldPathAsString(d.pod, fileInfo.FieldRef.FieldPath); err != nil { + if values, err := fieldpath.ExtractFieldPathAsString(pod, fileInfo.FieldRef.FieldPath); err != nil { glog.Errorf("Unable to extract field %s: %s", fileInfo.FieldRef.FieldPath, err.Error()) errlist = append(errlist, err) } else { @@ -231,10 +233,10 @@ func (d *downwardAPIVolume) collectData(defaultMode *int32) (map[string]volumeut } } else if fileInfo.ResourceFieldRef != nil { containerName := fileInfo.ResourceFieldRef.ContainerName - nodeAllocatable, err := d.plugin.host.GetNodeAllocatable() + nodeAllocatable, err := host.GetNodeAllocatable() if err != nil { errlist = append(errlist, err) - } else if values, err := fieldpath.ExtractResourceValueByContainerNameAndNodeAllocatable(fileInfo.ResourceFieldRef, d.pod, containerName, nodeAllocatable); err != nil { + } else if values, err := fieldpath.ExtractResourceValueByContainerNameAndNodeAllocatable(fileInfo.ResourceFieldRef, pod, containerName, nodeAllocatable); err != nil { glog.Errorf("Unable to extract field %s: %s", fileInfo.ResourceFieldRef.Resource, err.Error()) errlist = append(errlist, err) } else { diff --git a/pkg/volume/projected/projected.go b/pkg/volume/projected/projected.go new file mode 100644 index 00000000000..de39d12aa1f --- /dev/null +++ b/pkg/volume/projected/projected.go @@ -0,0 +1,325 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package projected + +import ( + "fmt" + "sort" + "strings" + + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/kubernetes/pkg/api/v1" + utilstrings "k8s.io/kubernetes/pkg/util/strings" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/configmap" + "k8s.io/kubernetes/pkg/volume/downwardapi" + "k8s.io/kubernetes/pkg/volume/secret" + volumeutil "k8s.io/kubernetes/pkg/volume/util" +) + +// ProbeVolumePlugins is the entry point for plugin detection in a package. +func ProbeVolumePlugins() []volume.VolumePlugin { + return []volume.VolumePlugin{&projectedPlugin{}} +} + +const ( + projectedPluginName = "kubernetes.io/projected" +) + +type projectedPlugin struct { + host volume.VolumeHost + getSecret func(namespace, name string) (*v1.Secret, error) +} + +var _ volume.VolumePlugin = &projectedPlugin{} + +func wrappedVolumeSpec() volume.Spec { + return volume.Spec{ + Volume: &v1.Volume{ + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{Medium: v1.StorageMediumMemory}, + }, + }, + } +} + +func getPath(uid types.UID, volName string, host volume.VolumeHost) string { + return host.GetPodVolumeDir(uid, utilstrings.EscapeQualifiedNameForDisk(projectedPluginName), volName) +} + +func (plugin *projectedPlugin) Init(host volume.VolumeHost) error { + plugin.host = host + plugin.getSecret = host.GetSecretFunc() + return nil +} + +func (plugin *projectedPlugin) GetPluginName() string { + return projectedPluginName +} + +func (plugin *projectedPlugin) GetVolumeName(spec *volume.Spec) (string, error) { + _, _, err := getVolumeSource(spec) + if err != nil { + return "", err + } + + return spec.Name(), nil +} + +func (plugin *projectedPlugin) CanSupport(spec *volume.Spec) bool { + return spec.Volume != nil && spec.Volume.Projected != nil +} + +func (plugin *projectedPlugin) RequiresRemount() bool { + return true +} + +func (plugin *projectedPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { + return &projectedVolumeMounter{ + projectedVolume: &projectedVolume{ + volName: spec.Name(), + sources: spec.Volume.Projected.Sources, + podUID: pod.UID, + plugin: plugin, + }, + source: *spec.Volume.Projected, + pod: pod, + opts: &opts, + }, nil +} + +func (plugin *projectedPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { + return &projectedVolumeUnmounter{ + &projectedVolume{ + volName: volName, + podUID: podUID, + plugin: plugin, + }, + }, nil +} + +func (plugin *projectedPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { + projectedVolume := &v1.Volume{ + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{}, + }, + } + + return volume.NewSpecFromVolume(projectedVolume), nil +} + +type projectedVolume struct { + volName string + sources []v1.VolumeProjection + podUID types.UID + plugin *projectedPlugin + volume.MetricsNil +} + +var _ volume.Volume = &projectedVolume{} + +func (sv *projectedVolume) GetPath() string { + return getPath(sv.podUID, sv.volName, sv.plugin.host) +} + +type projectedVolumeMounter struct { + *projectedVolume + + source v1.ProjectedVolumeSource + pod *v1.Pod + opts *volume.VolumeOptions +} + +var _ volume.Mounter = &projectedVolumeMounter{} + +func (sv *projectedVolume) GetAttributes() volume.Attributes { + return volume.Attributes{ + ReadOnly: true, + Managed: true, + SupportsSELinux: true, + } + +} + +// Checks prior to mount operations to verify that the required components (binaries, etc.) +// to mount the volume are available on the underlying node. +// If not, it returns an error +func (s *projectedVolumeMounter) CanMount() error { + return nil +} + +func (s *projectedVolumeMounter) SetUp(fsGroup *int64) error { + return s.SetUpAt(s.GetPath(), fsGroup) +} + +func (s *projectedVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { + glog.V(3).Infof("Setting up volume %v for pod %v at %v", s.volName, s.pod.UID, dir) + + wrapped, err := s.plugin.host.NewWrapperMounter(s.volName, wrappedVolumeSpec(), s.pod, *s.opts) + if err != nil { + return err + } + if err := wrapped.SetUpAt(dir, fsGroup); err != nil { + return err + } + + data, err := s.collectData() + if err != nil { + glog.Errorf("Error preparing data for projected volume %v for pod %v/%v: %s", s.volName, s.pod.Namespace, s.pod.Name, err.Error()) + } + + writerContext := fmt.Sprintf("pod %v/%v volume %v", s.pod.Namespace, s.pod.Name, s.volName) + writer, err := volumeutil.NewAtomicWriter(dir, writerContext) + if err != nil { + glog.Errorf("Error creating atomic writer: %v", err) + return err + } + + err = writer.Write(data) + if err != nil { + glog.Errorf("Error writing payload to dir: %v", err) + return err + } + + err = volume.SetVolumeOwnership(s, fsGroup) + if err != nil { + glog.Errorf("Error applying volume ownership settings for group: %v", fsGroup) + return err + } + + return nil +} + +func (s *projectedVolumeMounter) collectData() (map[string]volumeutil.FileProjection, error) { + if s.source.DefaultMode == nil { + return nil, fmt.Errorf("No defaultMode used, not even the default value for it") + } + + kubeClient := s.plugin.host.GetKubeClient() + if kubeClient == nil { + return nil, fmt.Errorf("Cannot setup projected volume %v because kube client is not configured", s.volName) + } + + errlist := []error{} + payload := make(map[string]volumeutil.FileProjection) + for _, source := range s.source.Sources { + if source.Secret != nil { + optional := source.Secret.Optional != nil && *source.Secret.Optional + secretapi, err := s.plugin.getSecret(s.pod.Namespace, source.Secret.Name) + if err != nil { + if !(errors.IsNotFound(err) && optional) { + glog.Errorf("Couldn't get secret %v/%v", s.pod.Namespace, source.Secret.Name) + errlist = append(errlist, err) + } + + secretapi = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: s.pod.Namespace, + Name: source.Secret.Name, + }, + } + } + secretPayload, err := secret.MakePayload(source.Secret.Items, secretapi, s.source.DefaultMode, optional) + if err != nil { + glog.Errorf("Couldn't get secret %v/%v: %v", s.pod.Namespace, source.Secret.Name, err) + errlist = append(errlist, err) + continue + } + + for k, v := range secretPayload { + payload[k] = v + } + } else if source.ConfigMap != nil { + optional := source.ConfigMap.Optional != nil && *source.ConfigMap.Optional + configMap, err := kubeClient.Core().ConfigMaps(s.pod.Namespace).Get(source.ConfigMap.Name, metav1.GetOptions{}) + if err != nil { + if !(errors.IsNotFound(err) && optional) { + glog.Errorf("Couldn't get configMap %v/%v: %v", s.pod.Namespace, source.ConfigMap.Name, err) + errlist = append(errlist, err) + continue + } + configMap = &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: s.pod.Namespace, + Name: source.ConfigMap.Name, + }, + } + } + configMapPayload, err := configmap.MakePayload(source.ConfigMap.Items, configMap, s.source.DefaultMode, optional) + if err != nil { + errlist = append(errlist, err) + continue + } + for k, v := range configMapPayload { + payload[k] = v + } + } else if source.DownwardAPI != nil { + downwardAPIPayload, err := downwardapi.CollectData(source.DownwardAPI.Items, s.pod, s.plugin.host, s.source.DefaultMode) + if err != nil { + errlist = append(errlist, err) + continue + } + for k, v := range downwardAPIPayload { + payload[k] = v + } + } + } + return payload, utilerrors.NewAggregate(errlist) +} + +func sortLines(values string) string { + splitted := strings.Split(values, "\n") + sort.Strings(splitted) + return strings.Join(splitted, "\n") +} + +type projectedVolumeUnmounter struct { + *projectedVolume +} + +var _ volume.Unmounter = &projectedVolumeUnmounter{} + +func (c *projectedVolumeUnmounter) TearDown() error { + return c.TearDownAt(c.GetPath()) +} + +func (c *projectedVolumeUnmounter) TearDownAt(dir string) error { + glog.V(3).Infof("Tearing down volume %v for pod %v at %v", c.volName, c.podUID, dir) + + wrapped, err := c.plugin.host.NewWrapperUnmounter(c.volName, wrappedVolumeSpec(), c.podUID) + if err != nil { + return err + } + return wrapped.TearDownAt(dir) +} + +func getVolumeSource(spec *volume.Spec) (*v1.ProjectedVolumeSource, bool, error) { + var readOnly bool + var volumeSource *v1.ProjectedVolumeSource + + if spec.Volume != nil && spec.Volume.Projected != nil { + volumeSource = spec.Volume.Projected + readOnly = spec.ReadOnly + } + + return volumeSource, readOnly, fmt.Errorf("Spec does not reference a projected volume type") +} diff --git a/pkg/volume/projected/projected_test.go b/pkg/volume/projected/projected_test.go new file mode 100644 index 00000000000..a8d1f4a8377 --- /dev/null +++ b/pkg/volume/projected/projected_test.go @@ -0,0 +1,1046 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package projected + +import ( + "fmt" + "io/ioutil" + "os" + "path" + "reflect" + "strings" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" + "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/empty_dir" + volumetest "k8s.io/kubernetes/pkg/volume/testing" + "k8s.io/kubernetes/pkg/volume/util" +) + +func TestCollectDataWithSecret(t *testing.T) { + caseMappingMode := int32(0400) + cases := []struct { + name string + mappings []v1.KeyToPath + secret *v1.Secret + mode int32 + optional bool + payload map[string]util.FileProjection + success bool + }{ + { + name: "no overrides", + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo": {Data: []byte("foo"), Mode: 0644}, + "bar": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "basic 1", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/foo.txt", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs 2", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs 3", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + { + Key: "bar", + Path: "another/path/to/the/esteemed/bar.bin", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + "another/path/to/the/esteemed/bar.bin": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "non existent key", + mappings: []v1.KeyToPath{ + { + Key: "zab", + Path: "path/to/foo.txt", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + success: false, + }, + { + name: "mapping with Mode", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "foo.txt", + Mode: &caseMappingMode, + }, + { + Key: "bar", + Path: "bar.bin", + Mode: &caseMappingMode, + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo.txt": {Data: []byte("foo"), Mode: caseMappingMode}, + "bar.bin": {Data: []byte("bar"), Mode: caseMappingMode}, + }, + success: true, + }, + { + name: "mapping with defaultMode", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "foo.txt", + }, + { + Key: "bar", + Path: "bar.bin", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo.txt": {Data: []byte("foo"), Mode: 0644}, + "bar.bin": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "optional non existent key", + mappings: []v1.KeyToPath{ + { + Key: "zab", + Path: "path/to/foo.txt", + }, + }, + secret: &v1.Secret{ + Data: map[string][]byte{ + "foo": []byte("foo"), + "bar": []byte("bar"), + }, + }, + mode: 0644, + optional: true, + payload: map[string]util.FileProjection{}, + success: true, + }, + } + + for _, tc := range cases { + testNamespace := "test_projected_namespace" + tc.secret.ObjectMeta = metav1.ObjectMeta{ + Namespace: testNamespace, + Name: tc.name, + } + + source := makeProjection(tc.name, tc.mode, "secret") + source.Sources[0].Secret.Items = tc.mappings + source.Sources[0].Secret.Optional = &tc.optional + + testPodUID := types.UID("test_pod_uid") + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + client := fake.NewSimpleClientset(tc.secret) + _, host := newTestHost(t, client) + + var myVolumeMounter = projectedVolumeMounter{ + projectedVolume: &projectedVolume{ + sources: source.Sources, + podUID: pod.UID, + plugin: &projectedPlugin{ + host: host, + getSecret: host.GetSecretFunc(), + }, + }, + source: *source, + pod: pod, + } + + actualPayload, err := myVolumeMounter.collectData() + if err != nil && tc.success { + t.Errorf("%v: unexpected failure making payload: %v", tc.name, err) + continue + } + if err == nil && !tc.success { + t.Errorf("%v: unexpected success making payload", tc.name) + continue + } + if !tc.success { + continue + } + if e, a := tc.payload, actualPayload; !reflect.DeepEqual(e, a) { + t.Errorf("%v: expected and actual payload do not match", tc.name) + } + } +} + +func TestCollectDataWithConfigMap(t *testing.T) { + caseMappingMode := int32(0400) + cases := []struct { + name string + mappings []v1.KeyToPath + configMap *v1.ConfigMap + mode int32 + optional bool + payload map[string]util.FileProjection + success bool + }{ + { + name: "no overrides", + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo": {Data: []byte("foo"), Mode: 0644}, + "bar": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "basic 1", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/foo.txt", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs 2", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + }, + success: true, + }, + { + name: "subdirs 3", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "path/to/1/2/3/foo.txt", + }, + { + Key: "bar", + Path: "another/path/to/the/esteemed/bar.bin", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "path/to/1/2/3/foo.txt": {Data: []byte("foo"), Mode: 0644}, + "another/path/to/the/esteemed/bar.bin": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "non existent key", + mappings: []v1.KeyToPath{ + { + Key: "zab", + Path: "path/to/foo.txt", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + success: false, + }, + { + name: "mapping with Mode", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "foo.txt", + Mode: &caseMappingMode, + }, + { + Key: "bar", + Path: "bar.bin", + Mode: &caseMappingMode, + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo.txt": {Data: []byte("foo"), Mode: caseMappingMode}, + "bar.bin": {Data: []byte("bar"), Mode: caseMappingMode}, + }, + success: true, + }, + { + name: "mapping with defaultMode", + mappings: []v1.KeyToPath{ + { + Key: "foo", + Path: "foo.txt", + }, + { + Key: "bar", + Path: "bar.bin", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "foo.txt": {Data: []byte("foo"), Mode: 0644}, + "bar.bin": {Data: []byte("bar"), Mode: 0644}, + }, + success: true, + }, + { + name: "optional non existent key", + mappings: []v1.KeyToPath{ + { + Key: "zab", + Path: "path/to/foo.txt", + }, + }, + configMap: &v1.ConfigMap{ + Data: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + }, + mode: 0644, + optional: true, + payload: map[string]util.FileProjection{}, + success: true, + }, + } + for _, tc := range cases { + testNamespace := "test_projected_namespace" + tc.configMap.ObjectMeta = metav1.ObjectMeta{ + Namespace: testNamespace, + Name: tc.name, + } + + source := makeProjection(tc.name, tc.mode, "configMap") + source.Sources[0].ConfigMap.Items = tc.mappings + source.Sources[0].ConfigMap.Optional = &tc.optional + + testPodUID := types.UID("test_pod_uid") + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + client := fake.NewSimpleClientset(tc.configMap) + _, host := newTestHost(t, client) + + var myVolumeMounter = projectedVolumeMounter{ + projectedVolume: &projectedVolume{ + sources: source.Sources, + podUID: pod.UID, + plugin: &projectedPlugin{ + host: host, + }, + }, + source: *source, + pod: pod, + } + + actualPayload, err := myVolumeMounter.collectData() + if err != nil && tc.success { + t.Errorf("%v: unexpected failure making payload: %v", tc.name, err) + continue + } + if err == nil && !tc.success { + t.Errorf("%v: unexpected success making payload", tc.name) + continue + } + if !tc.success { + continue + } + if e, a := tc.payload, actualPayload; !reflect.DeepEqual(e, a) { + t.Errorf("%v: expected and actual payload do not match", tc.name) + } + } +} + +func TestCollectDataWithDownwardAPI(t *testing.T) { + testNamespace := "test_projected_namespace" + testPodUID := types.UID("test_pod_uid") + testPodName := "podName" + + cases := []struct { + name string + volumeFile []v1.DownwardAPIVolumeFile + pod *v1.Pod + mode int32 + payload map[string]util.FileProjection + success bool + }{ + { + name: "labels", + volumeFile: []v1.DownwardAPIVolumeFile{ + {Path: "labels", FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "metadata.labels"}}}, + pod: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: testPodName, + Namespace: testNamespace, + Labels: map[string]string{ + "key1": "value1", + "key2": "value2"}, + UID: testPodUID}, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "labels": {Data: []byte("key1=\"value1\"\nkey2=\"value2\""), Mode: 0644}, + }, + success: true, + }, + { + name: "annotations", + volumeFile: []v1.DownwardAPIVolumeFile{ + {Path: "annotations", FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "metadata.annotations"}}}, + pod: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: testPodName, + Namespace: testNamespace, + Annotations: map[string]string{ + "a1": "value1", + "a2": "value2"}, + UID: testPodUID}, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "annotations": {Data: []byte("a1=\"value1\"\na2=\"value2\""), Mode: 0644}, + }, + success: true, + }, + { + name: "name", + volumeFile: []v1.DownwardAPIVolumeFile{ + {Path: "name_file_name", FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "metadata.name"}}}, + pod: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: testPodName, + Namespace: testNamespace, + UID: testPodUID}, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "name_file_name": {Data: []byte(testPodName), Mode: 0644}, + }, + success: true, + }, + { + name: "namespace", + volumeFile: []v1.DownwardAPIVolumeFile{ + {Path: "namespace_file_name", FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "metadata.namespace"}}}, + pod: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: testPodName, + Namespace: testNamespace, + UID: testPodUID}, + }, + mode: 0644, + payload: map[string]util.FileProjection{ + "namespace_file_name": {Data: []byte(testNamespace), Mode: 0644}, + }, + success: true, + }, + } + + for _, tc := range cases { + source := makeProjection("", tc.mode, "downwardAPI") + source.Sources[0].DownwardAPI.Items = tc.volumeFile + + client := fake.NewSimpleClientset(tc.pod) + _, host := newTestHost(t, client) + + var myVolumeMounter = projectedVolumeMounter{ + projectedVolume: &projectedVolume{ + sources: source.Sources, + podUID: tc.pod.UID, + plugin: &projectedPlugin{ + host: host, + }, + }, + source: *source, + pod: tc.pod, + } + + actualPayload, err := myVolumeMounter.collectData() + if err != nil && tc.success { + t.Errorf("%v: unexpected failure making payload: %v", tc.name, err) + continue + } + if err == nil && !tc.success { + t.Errorf("%v: unexpected success making payload", tc.name) + continue + } + if !tc.success { + continue + } + if e, a := tc.payload, actualPayload; !reflect.DeepEqual(e, a) { + t.Errorf("%v: expected and actual payload do not match", tc.name) + } + } +} + +func newTestHost(t *testing.T, clientset clientset.Interface) (string, volume.VolumeHost) { + tempDir, err := ioutil.TempDir("/tmp", "projected_volume_test.") + if err != nil { + t.Fatalf("can't make a temp rootdir: %v", err) + } + + return tempDir, volumetest.NewFakeVolumeHost(tempDir, clientset, empty_dir.ProbeVolumePlugins()) +} + +func TestCanSupport(t *testing.T) { + pluginMgr := volume.VolumePluginMgr{} + tempDir, host := newTestHost(t, nil) + defer os.RemoveAll(tempDir) + pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + + plugin, err := pluginMgr.FindPluginByName(projectedPluginName) + if err != nil { + t.Errorf("Can't find the plugin by name") + } + if plugin.GetPluginName() != projectedPluginName { + t.Errorf("Wrong name: %s", plugin.GetPluginName()) + } + if !plugin.CanSupport(&volume.Spec{Volume: &v1.Volume{VolumeSource: v1.VolumeSource{Projected: &v1.ProjectedVolumeSource{}}}}) { + t.Errorf("Expected true") + } + if plugin.CanSupport(&volume.Spec{}) { + t.Errorf("Expected false") + } +} + +func TestPlugin(t *testing.T) { + var ( + testPodUID = types.UID("test_pod_uid") + testVolumeName = "test_volume_name" + testNamespace = "test_projected_namespace" + testName = "test_projected_name" + + volumeSpec = makeVolumeSpec(testVolumeName, testName, 0644) + secret = makeSecret(testNamespace, testName) + client = fake.NewSimpleClientset(&secret) + pluginMgr = volume.VolumePluginMgr{} + rootDir, host = newTestHost(t, client) + ) + defer os.RemoveAll(rootDir) + pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + + plugin, err := pluginMgr.FindPluginByName(projectedPluginName) + if err != nil { + t.Errorf("Can't find the plugin by name") + } + + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + mounter, err := plugin.NewMounter(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + if mounter == nil { + t.Errorf("Got a nil Mounter") + } + + volumePath := mounter.GetPath() + if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid/volumes/kubernetes.io~projected/%s", testVolumeName)) { + t.Errorf("Got unexpected path: %s", volumePath) + } + + err = mounter.SetUp(nil) + if err != nil { + t.Errorf("Failed to setup volume: %v", err) + } + if _, err := os.Stat(volumePath); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, volume path not created: %s", volumePath) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + // secret volume should create its own empty wrapper path + podWrapperMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid/plugins/kubernetes.io~empty-dir/wrapped_test_volume_name", rootDir) + + if _, err := os.Stat(podWrapperMetadataDir); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, empty-dir wrapper path is not created: %s", podWrapperMetadataDir) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + doTestSecretDataInVolume(volumePath, secret, t) + defer doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) +} + +// Test the case where the plugin's ready file exists, but the volume dir is not a +// mountpoint, which is the state the system will be in after reboot. The dir +// should be mounter and the secret data written to it. +func TestPluginReboot(t *testing.T) { + var ( + testPodUID = types.UID("test_pod_uid3") + testVolumeName = "test_volume_name" + testNamespace = "test_secret_namespace" + testName = "test_secret_name" + + volumeSpec = makeVolumeSpec(testVolumeName, testName, 0644) + secret = makeSecret(testNamespace, testName) + client = fake.NewSimpleClientset(&secret) + pluginMgr = volume.VolumePluginMgr{} + rootDir, host = newTestHost(t, client) + ) + defer os.RemoveAll(rootDir) + pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + + plugin, err := pluginMgr.FindPluginByName(projectedPluginName) + if err != nil { + t.Errorf("Can't find the plugin by name") + } + + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + mounter, err := plugin.NewMounter(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + if mounter == nil { + t.Errorf("Got a nil Mounter") + } + + podMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid3/plugins/kubernetes.io~projected/test_volume_name", rootDir) + util.SetReady(podMetadataDir) + volumePath := mounter.GetPath() + if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid3/volumes/kubernetes.io~projected/test_volume_name")) { + t.Errorf("Got unexpected path: %s", volumePath) + } + + err = mounter.SetUp(nil) + if err != nil { + t.Errorf("Failed to setup volume: %v", err) + } + if _, err := os.Stat(volumePath); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, volume path not created: %s", volumePath) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + doTestSecretDataInVolume(volumePath, secret, t) + doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) +} + +func TestPluginOptional(t *testing.T) { + var ( + testPodUID = types.UID("test_pod_uid") + testVolumeName = "test_volume_name" + testNamespace = "test_secret_namespace" + testName = "test_secret_name" + trueVal = true + + volumeSpec = makeVolumeSpec(testVolumeName, testName, 0644) + client = fake.NewSimpleClientset() + pluginMgr = volume.VolumePluginMgr{} + rootDir, host = newTestHost(t, client) + ) + volumeSpec.VolumeSource.Projected.Sources[0].Secret.Optional = &trueVal + defer os.RemoveAll(rootDir) + pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + + plugin, err := pluginMgr.FindPluginByName(projectedPluginName) + if err != nil { + t.Errorf("Can't find the plugin by name") + } + + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + mounter, err := plugin.NewMounter(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + if mounter == nil { + t.Errorf("Got a nil Mounter") + } + + volumePath := mounter.GetPath() + if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid/volumes/kubernetes.io~projected/test_volume_name")) { + t.Errorf("Got unexpected path: %s", volumePath) + } + + err = mounter.SetUp(nil) + if err != nil { + t.Errorf("Failed to setup volume: %v", err) + } + if _, err := os.Stat(volumePath); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, volume path not created: %s", volumePath) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + // secret volume should create its own empty wrapper path + podWrapperMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid/plugins/kubernetes.io~empty-dir/wrapped_test_volume_name", rootDir) + + if _, err := os.Stat(podWrapperMetadataDir); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, empty-dir wrapper path is not created: %s", podWrapperMetadataDir) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + infos, err := ioutil.ReadDir(volumePath) + if err != nil { + t.Fatalf("couldn't find volume path, %s", volumePath) + } + if len(infos) != 0 { + t.Errorf("empty directory, %s, not found", volumePath) + } + + defer doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) +} + +func TestPluginOptionalKeys(t *testing.T) { + var ( + testPodUID = types.UID("test_pod_uid") + testVolumeName = "test_volume_name" + testNamespace = "test_secret_namespace" + testName = "test_secret_name" + trueVal = true + + volumeSpec = makeVolumeSpec(testVolumeName, testName, 0644) + secret = makeSecret(testNamespace, testName) + client = fake.NewSimpleClientset(&secret) + pluginMgr = volume.VolumePluginMgr{} + rootDir, host = newTestHost(t, client) + ) + volumeSpec.VolumeSource.Projected.Sources[0].Secret.Items = []v1.KeyToPath{ + {Key: "data-1", Path: "data-1"}, + {Key: "data-2", Path: "data-2"}, + {Key: "data-3", Path: "data-3"}, + {Key: "missing", Path: "missing"}, + } + volumeSpec.VolumeSource.Projected.Sources[0].Secret.Optional = &trueVal + defer os.RemoveAll(rootDir) + pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + + plugin, err := pluginMgr.FindPluginByName(projectedPluginName) + if err != nil { + t.Errorf("Can't find the plugin by name") + } + + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: testNamespace, UID: testPodUID}} + mounter, err := plugin.NewMounter(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + if mounter == nil { + t.Errorf("Got a nil Mounter") + } + + volumePath := mounter.GetPath() + if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid/volumes/kubernetes.io~projected/test_volume_name")) { + t.Errorf("Got unexpected path: %s", volumePath) + } + + err = mounter.SetUp(nil) + if err != nil { + t.Errorf("Failed to setup volume: %v", err) + } + if _, err := os.Stat(volumePath); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, volume path not created: %s", volumePath) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + + // secret volume should create its own empty wrapper path + podWrapperMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid/plugins/kubernetes.io~empty-dir/wrapped_test_volume_name", rootDir) + + if _, err := os.Stat(podWrapperMetadataDir); err != nil { + if os.IsNotExist(err) { + t.Errorf("SetUp() failed, empty-dir wrapper path is not created: %s", podWrapperMetadataDir) + } else { + t.Errorf("SetUp() failed: %v", err) + } + } + doTestSecretDataInVolume(volumePath, secret, t) + defer doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) +} + +func makeVolumeSpec(volumeName, name string, defaultMode int32) *v1.Volume { + return &v1.Volume{ + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: makeProjection(name, defaultMode, "secret"), + }, + } +} + +func makeSecret(namespace, name string) v1.Secret { + return v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: name, + }, + Data: map[string][]byte{ + "data-1": []byte("value-1"), + "data-2": []byte("value-2"), + "data-3": []byte("value-3"), + }, + } +} + +func configMap(namespace, name string) v1.ConfigMap { + return v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: name, + }, + Data: map[string]string{ + "data-1": "value-1", + "data-2": "value-2", + "data-3": "value-3", + }, + } +} + +func makeProjection(name string, defaultMode int32, kind string) *v1.ProjectedVolumeSource { + var item v1.VolumeProjection + + switch kind { + case "configMap": + item = v1.VolumeProjection{ + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{Name: name}, + }, + } + case "secret": + item = v1.VolumeProjection{ + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{Name: name}, + }, + } + case "downwardAPI": + item = v1.VolumeProjection{ + DownwardAPI: &v1.DownwardAPIProjection{}, + } + } + + return &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{item}, + DefaultMode: &defaultMode, + } +} + +func doTestSecretDataInVolume(volumePath string, secret v1.Secret, t *testing.T) { + for key, value := range secret.Data { + secretDataHostPath := path.Join(volumePath, key) + if _, err := os.Stat(secretDataHostPath); err != nil { + t.Fatalf("SetUp() failed, couldn't find secret data on disk: %v", secretDataHostPath) + } else { + actualSecretBytes, err := ioutil.ReadFile(secretDataHostPath) + if err != nil { + t.Fatalf("Couldn't read secret data from: %v", secretDataHostPath) + } + + actualSecretValue := string(actualSecretBytes) + if string(value) != actualSecretValue { + t.Errorf("Unexpected value; expected %q, got %q", value, actualSecretValue) + } + } + } +} + +func doTestCleanAndTeardown(plugin volume.VolumePlugin, podUID types.UID, testVolumeName, volumePath string, t *testing.T) { + unmounter, err := plugin.NewUnmounter(testVolumeName, podUID) + if err != nil { + t.Errorf("Failed to make a new Unmounter: %v", err) + } + if unmounter == nil { + t.Errorf("Got a nil Unmounter") + } + + if err := unmounter.TearDown(); err != nil { + t.Errorf("Expected success, got: %v", err) + } + if _, err := os.Stat(volumePath); err == nil { + t.Errorf("TearDown() failed, volume path still exists: %s", volumePath) + } else if !os.IsNotExist(err) { + t.Errorf("SetUp() failed: %v", err) + } +} diff --git a/pkg/volume/secret/secret.go b/pkg/volume/secret/secret.go index 983daba6f60..12e0141e177 100644 --- a/pkg/volume/secret/secret.go +++ b/pkg/volume/secret/secret.go @@ -208,7 +208,7 @@ func (b *secretVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { len(secret.Data), totalBytes) - payload, err := makePayload(b.source.Items, secret, b.source.DefaultMode, optional) + payload, err := MakePayload(b.source.Items, secret, b.source.DefaultMode, optional) if err != nil { return err } @@ -235,7 +235,8 @@ func (b *secretVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { return nil } -func makePayload(mappings []v1.KeyToPath, secret *v1.Secret, defaultMode *int32, optional bool) (map[string]volumeutil.FileProjection, error) { +// Note: this function is exported so that it can be called from the projection volume driver +func MakePayload(mappings []v1.KeyToPath, secret *v1.Secret, defaultMode *int32, optional bool) (map[string]volumeutil.FileProjection, error) { if defaultMode == nil { return nil, fmt.Errorf("No defaultMode used, not even the default value for it") } diff --git a/pkg/volume/secret/secret_test.go b/pkg/volume/secret/secret_test.go index ee7e83fd75e..e7e3bb95026 100644 --- a/pkg/volume/secret/secret_test.go +++ b/pkg/volume/secret/secret_test.go @@ -241,7 +241,7 @@ func TestMakePayload(t *testing.T) { } for _, tc := range cases { - actualPayload, err := makePayload(tc.mappings, tc.secret, &tc.mode, tc.optional) + actualPayload, err := MakePayload(tc.mappings, tc.secret, &tc.mode, tc.optional) if err != nil && tc.success { t.Errorf("%v: unexpected failure making payload: %v", tc.name, err) continue diff --git a/test/e2e/common/projected.go b/test/e2e/common/projected.go new file mode 100644 index 00000000000..b46f650f5d6 --- /dev/null +++ b/test/e2e/common/projected.go @@ -0,0 +1,1534 @@ +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import ( + "fmt" + "os" + "path" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/test/e2e/framework" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = framework.KubeDescribe("Projected", func() { + // Part 1/3 - Secrets + f := framework.NewDefaultFramework("projected") + + It("should be consumable from pods in volume [Conformance] [Volume]", func() { + doProjectedSecretE2EWithoutMapping(f, nil /* default mode */, "projected-secret-test-"+string(uuid.NewUUID()), nil, nil) + }) + + It("should be consumable from pods in volume with defaultMode set [Conformance] [Volume]", func() { + defaultMode := int32(0400) + doProjectedSecretE2EWithoutMapping(f, &defaultMode, "projected-secret-test-"+string(uuid.NewUUID()), nil, nil) + }) + + It("should be consumable from pods in volume as non-root with defaultMode and fsGroup set [Conformance] [Volume]", func() { + defaultMode := int32(0440) /* setting fsGroup sets mode to at least 440 */ + fsGroup := int64(1001) + uid := int64(1000) + doProjectedSecretE2EWithoutMapping(f, &defaultMode, "projected-secret-test-"+string(uuid.NewUUID()), &fsGroup, &uid) + }) + + It("should be consumable from pods in volume with mappings [Conformance] [Volume]", func() { + doProjectedSecretE2EWithMapping(f, nil) + }) + + It("should be consumable from pods in volume with mappings and Item Mode set [Conformance] [Volume]", func() { + mode := int32(0400) + doProjectedSecretE2EWithMapping(f, &mode) + }) + + It("should be able to mount in a volume regardless of a different secret existing with same name in different namespace [Volume]", func() { + var ( + namespace2 *v1.Namespace + err error + secret2Name = "projected-secret-test-" + string(uuid.NewUUID()) + ) + + if namespace2, err = f.CreateNamespace("secret-namespace", nil); err != nil { + framework.Failf("unable to create new namespace %s: %v", namespace2.Name, err) + } + + secret2 := secretForTest(namespace2.Name, secret2Name) + secret2.Data = map[string][]byte{ + "this_should_not_match_content_of_other_secret": []byte("similarly_this_should_not_match_content_of_other_secret\n"), + } + if secret2, err = f.ClientSet.Core().Secrets(namespace2.Name).Create(secret2); err != nil { + framework.Failf("unable to create test secret %s: %v", secret2.Name, err) + } + doProjectedSecretE2EWithoutMapping(f, nil /* default mode */, secret2.Name, nil, nil) + }) + + It("should be consumable in multiple volumes in a pod [Conformance] [Volume]", func() { + // This test ensures that the same secret can be mounted in multiple + // volumes in the same pod. This test case exists to prevent + // regressions that break this use-case. + var ( + name = "projected-secret-test-" + string(uuid.NewUUID()) + volumeName = "projected-secret-volume" + volumeMountPath = "/etc/projected-secret-volume" + volumeName2 = "projected-secret-volume-2" + volumeMountPath2 = "/etc/projected-secret-volume-2" + secret = secretForTest(f.Namespace.Name, name) + ) + + By(fmt.Sprintf("Creating secret with name %s", secret.Name)) + var err error + if secret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(secret); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-secrets-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + { + Name: volumeName2, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "secret-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{ + "--file_content=/etc/projected-secret-volume/data-1", + "--file_mode=/etc/projected-secret-volume/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + ReadOnly: true, + }, + { + Name: volumeName2, + MountPath: volumeMountPath2, + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume secrets", pod, 0, []string{ + "content of file \"/etc/projected-secret-volume/data-1\": value-1", + "mode of file \"/etc/projected-secret-volume/data-1\": -rw-r--r--", + }) + }) + + It("optional updates should be reflected in volume [Conformance] [Volume]", func() { + + // We may have to wait or a full sync period to elapse before the + // Kubelet projects the update into the volume and the container picks + // it up. This timeout is based on the default Kubelet sync period (1 + // minute) plus additional time for fudge factor. + const podLogTimeout = 300 * time.Second + trueVal := true + + volumeMountPath := "/etc/projected-secret-volumes" + + deleteName := "s-test-opt-del-" + string(uuid.NewUUID()) + deleteContainerName := "dels-volume-test" + deleteVolumeName := "deletes-volume" + deleteSecret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: deleteName, + }, + Data: map[string][]byte{ + "data-1": []byte("value-1"), + }, + } + + updateName := "s-test-opt-upd-" + string(uuid.NewUUID()) + updateContainerName := "upds-volume-test" + updateVolumeName := "updates-volume" + updateSecret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: updateName, + }, + Data: map[string][]byte{ + "data-1": []byte("value-1"), + }, + } + + createName := "s-test-opt-create-" + string(uuid.NewUUID()) + createContainerName := "creates-volume-test" + createVolumeName := "creates-volume" + createSecret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: createName, + }, + Data: map[string][]byte{ + "data-1": []byte("value-1"), + }, + } + + By(fmt.Sprintf("Creating secret with name %s", deleteSecret.Name)) + var err error + if deleteSecret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(deleteSecret); err != nil { + framework.Failf("unable to create test secret %s: %v", deleteSecret.Name, err) + } + + By(fmt.Sprintf("Creating secret with name %s", updateSecret.Name)) + if updateSecret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(updateSecret); err != nil { + framework.Failf("unable to create test secret %s: %v", updateSecret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-secrets-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: deleteVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: deleteName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + { + Name: updateVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: updateName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + { + Name: createVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: createName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: deleteContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/delete/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: deleteVolumeName, + MountPath: path.Join(volumeMountPath, "delete"), + ReadOnly: true, + }, + }, + }, + { + Name: updateContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/update/data-3"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: updateVolumeName, + MountPath: path.Join(volumeMountPath, "update"), + ReadOnly: true, + }, + }, + }, + { + Name: createContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/create/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: createVolumeName, + MountPath: path.Join(volumeMountPath, "create"), + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + By("Creating the pod") + f.PodClient().CreateSync(pod) + + pollCreateLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, createContainerName) + } + Eventually(pollCreateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-secret-volumes/create/data-1")) + + pollUpdateLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, updateContainerName) + } + Eventually(pollUpdateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-secret-volumes/update/data-3")) + + pollDeleteLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, deleteContainerName) + } + Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-1")) + + By(fmt.Sprintf("Deleting secret %v", deleteSecret.Name)) + err = f.ClientSet.Core().Secrets(f.Namespace.Name).Delete(deleteSecret.Name, &metav1.DeleteOptions{}) + Expect(err).NotTo(HaveOccurred(), "Failed to delete secret %q in namespace %q", deleteSecret.Name, f.Namespace.Name) + + By(fmt.Sprintf("Updating secret %v", updateSecret.Name)) + updateSecret.ResourceVersion = "" // to force update + delete(updateSecret.Data, "data-1") + updateSecret.Data["data-3"] = []byte("value-3") + _, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Update(updateSecret) + Expect(err).NotTo(HaveOccurred(), "Failed to update secret %q in namespace %q", updateSecret.Name, f.Namespace.Name) + + By(fmt.Sprintf("Creating secret with name %s", createSecret.Name)) + if createSecret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(createSecret); err != nil { + framework.Failf("unable to create test secret %s: %v", createSecret.Name, err) + } + + By("waiting to observe update in volume") + + Eventually(pollCreateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-1")) + Eventually(pollUpdateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-3")) + Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-secret-volumes/delete/data-1")) + }) + + // Part 2/3 - ConfigMaps + It("should be consumable from pods in volume [Conformance] [Volume]", func() { + doProjectedConfigMapE2EWithoutMappings(f, 0, 0, nil) + }) + + It("should be consumable from pods in volume with defaultMode set [Conformance] [Volume]", func() { + defaultMode := int32(0400) + doProjectedConfigMapE2EWithoutMappings(f, 0, 0, &defaultMode) + }) + + It("should be consumable from pods in volume as non-root with defaultMode and fsGroup set [Feature:FSGroup] [Volume]", func() { + defaultMode := int32(0440) /* setting fsGroup sets mode to at least 440 */ + doProjectedConfigMapE2EWithoutMappings(f, 1000, 1001, &defaultMode) + }) + + It("should be consumable from pods in volume as non-root [Conformance] [Volume]", func() { + doProjectedConfigMapE2EWithoutMappings(f, 1000, 0, nil) + }) + + It("should be consumable from pods in volume as non-root with FSGroup [Feature:FSGroup] [Volume]", func() { + doProjectedConfigMapE2EWithoutMappings(f, 1000, 1001, nil) + }) + + It("should be consumable from pods in volume with mappings [Conformance] [Volume]", func() { + doProjectedConfigMapE2EWithMappings(f, 0, 0, nil) + }) + + It("should be consumable from pods in volume with mappings and Item mode set[Conformance] [Volume]", func() { + mode := int32(0400) + doProjectedConfigMapE2EWithMappings(f, 0, 0, &mode) + }) + + It("should be consumable from pods in volume with mappings as non-root [Conformance] [Volume]", func() { + doProjectedConfigMapE2EWithMappings(f, 1000, 0, nil) + }) + + It("should be consumable from pods in volume with mappings as non-root with FSGroup [Feature:FSGroup] [Volume]", func() { + doProjectedConfigMapE2EWithMappings(f, 1000, 1001, nil) + }) + + It("updates should be reflected in volume [Conformance] [Volume]", func() { + + // We may have to wait or a full sync period to elapse before the + // Kubelet projects the update into the volume and the container picks + // it up. This timeout is based on the default Kubelet sync period (1 + // minute) plus additional time for fudge factor. + const podLogTimeout = 300 * time.Second + + name := "projected-configmap-test-upd-" + string(uuid.NewUUID()) + volumeName := "projected-configmap-volume" + volumeMountPath := "/etc/projected-configmap-volume" + containerName := "projected-configmap-volume-test" + configMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: name, + }, + Data: map[string]string{ + "data-1": "value-1", + }, + } + + By(fmt.Sprintf("Creating projection with configMap that has name %s", configMap.Name)) + var err error + if configMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(configMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: containerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volume/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + By("Creating the pod") + f.PodClient().CreateSync(pod) + + pollLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, containerName) + } + + Eventually(pollLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-1")) + + By(fmt.Sprintf("Updating configmap %v", configMap.Name)) + configMap.ResourceVersion = "" // to force update + configMap.Data["data-1"] = "value-2" + _, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Update(configMap) + Expect(err).NotTo(HaveOccurred(), "Failed to update configmap %q in namespace %q", configMap.Name, f.Namespace.Name) + + By("waiting to observe update in volume") + Eventually(pollLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-2")) + }) + + It("optional updates should be reflected in volume [Conformance] [Volume]", func() { + + // We may have to wait or a full sync period to elapse before the + // Kubelet projects the update into the volume and the container picks + // it up. This timeout is based on the default Kubelet sync period (1 + // minute) plus additional time for fudge factor. + const podLogTimeout = 300 * time.Second + trueVal := true + + volumeMountPath := "/etc/projected-configmap-volumes" + + deleteName := "cm-test-opt-del-" + string(uuid.NewUUID()) + deleteContainerName := "delcm-volume-test" + deleteVolumeName := "deletecm-volume" + deleteConfigMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: deleteName, + }, + Data: map[string]string{ + "data-1": "value-1", + }, + } + + updateName := "cm-test-opt-upd-" + string(uuid.NewUUID()) + updateContainerName := "updcm-volume-test" + updateVolumeName := "updatecm-volume" + updateConfigMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: updateName, + }, + Data: map[string]string{ + "data-1": "value-1", + }, + } + + createName := "cm-test-opt-create-" + string(uuid.NewUUID()) + createContainerName := "createcm-volume-test" + createVolumeName := "createcm-volume" + createConfigMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: createName, + }, + Data: map[string]string{ + "data-1": "value-1", + }, + } + + By(fmt.Sprintf("Creating configMap with name %s", deleteConfigMap.Name)) + var err error + if deleteConfigMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(deleteConfigMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", deleteConfigMap.Name, err) + } + + By(fmt.Sprintf("Creating configMap with name %s", updateConfigMap.Name)) + if updateConfigMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(updateConfigMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", updateConfigMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: deleteVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: deleteName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + { + Name: updateVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: updateName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + { + Name: createVolumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: createName, + }, + Optional: &trueVal, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: deleteContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/delete/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: deleteVolumeName, + MountPath: path.Join(volumeMountPath, "delete"), + ReadOnly: true, + }, + }, + }, + { + Name: updateContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/update/data-3"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: updateVolumeName, + MountPath: path.Join(volumeMountPath, "update"), + ReadOnly: true, + }, + }, + }, + { + Name: createContainerName, + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/create/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: createVolumeName, + MountPath: path.Join(volumeMountPath, "create"), + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + By("Creating the pod") + f.PodClient().CreateSync(pod) + + pollCreateLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, createContainerName) + } + Eventually(pollCreateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-configmap-volumes/create/data-1")) + + pollUpdateLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, updateContainerName) + } + Eventually(pollUpdateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-configmap-volumes/update/data-3")) + + pollDeleteLogs := func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, deleteContainerName) + } + Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-1")) + + By(fmt.Sprintf("Deleting configmap %v", deleteConfigMap.Name)) + err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Delete(deleteConfigMap.Name, &metav1.DeleteOptions{}) + Expect(err).NotTo(HaveOccurred(), "Failed to delete configmap %q in namespace %q", deleteConfigMap.Name, f.Namespace.Name) + + By(fmt.Sprintf("Updating configmap %v", updateConfigMap.Name)) + updateConfigMap.ResourceVersion = "" // to force update + delete(updateConfigMap.Data, "data-1") + updateConfigMap.Data["data-3"] = "value-3" + _, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Update(updateConfigMap) + Expect(err).NotTo(HaveOccurred(), "Failed to update configmap %q in namespace %q", updateConfigMap.Name, f.Namespace.Name) + + By(fmt.Sprintf("Creating configMap with name %s", createConfigMap.Name)) + if createConfigMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(createConfigMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", createConfigMap.Name, err) + } + + By("waiting to observe update in volume") + + Eventually(pollCreateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-1")) + Eventually(pollUpdateLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("value-3")) + Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(ContainSubstring("Error reading file /etc/projected-configmap-volumes/delete/data-1")) + }) + + It("should be consumable in multiple volumes in the same pod [Conformance] [Volume]", func() { + var ( + name = "projected-configmap-test-volume-" + string(uuid.NewUUID()) + volumeName = "projected-configmap-volume" + volumeMountPath = "/etc/projected-configmap-volume" + volumeName2 = "projected-configmap-volume-2" + volumeMountPath2 = "/etc/projected-configmap-volume-2" + configMap = newConfigMap(f, name) + ) + + By(fmt.Sprintf("Creating configMap with name %s", configMap.Name)) + var err error + if configMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(configMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + { + Name: volumeName2, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "projected-configmap-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{"--file_content=/etc/projected-configmap-volume/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + ReadOnly: true, + }, + { + Name: volumeName2, + MountPath: volumeMountPath2, + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume configMaps", pod, 0, []string{ + "content of file \"/etc/projected-configmap-volume/data-1\": value-1", + }) + + }) + + // Part 3/3 - DownwardAPI + // How long to wait for a log pod to be displayed + const podLogTimeout = 2 * time.Minute + var podClient *framework.PodClient + BeforeEach(func() { + podClient = f.PodClient() + }) + + It("should provide podname only [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumePodForSimpleTest(podName, "/etc/podname") + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("%s\n", podName), + }) + }) + + It("should set DefaultMode on files [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + defaultMode := int32(0400) + pod := projectedDownwardAPIVolumePodForModeTest(podName, "/etc/podname", nil, &defaultMode) + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + "mode of file \"/etc/podname\": -r--------", + }) + }) + + It("should set mode on item file [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + mode := int32(0400) + pod := projectedDownwardAPIVolumePodForModeTest(podName, "/etc/podname", &mode, nil) + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + "mode of file \"/etc/podname\": -r--------", + }) + }) + + It("should provide podname as non-root with fsgroup [Feature:FSGroup] [Volume]", func() { + podName := "metadata-volume-" + string(uuid.NewUUID()) + uid := int64(1001) + gid := int64(1234) + pod := downwardAPIVolumePodForSimpleTest(podName, "/etc/podname") + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + RunAsUser: &uid, + FSGroup: &gid, + } + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("%s\n", podName), + }) + }) + + It("should provide podname as non-root with fsgroup and defaultMode [Feature:FSGroup] [Volume]", func() { + podName := "metadata-volume-" + string(uuid.NewUUID()) + uid := int64(1001) + gid := int64(1234) + mode := int32(0440) /* setting fsGroup sets mode to at least 440 */ + pod := projectedDownwardAPIVolumePodForModeTest(podName, "/etc/podname", &mode, nil) + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + RunAsUser: &uid, + FSGroup: &gid, + } + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + "mode of file \"/etc/podname\": -r--r-----", + }) + }) + + It("should update labels on modification [Conformance] [Volume]", func() { + labels := map[string]string{} + labels["key1"] = "value1" + labels["key2"] = "value2" + + podName := "labelsupdate" + string(uuid.NewUUID()) + pod := projectedDownwardAPIVolumePodForUpdateTest(podName, labels, map[string]string{}, "/etc/labels") + containerName := "client-container" + By("Creating the pod") + podClient.CreateSync(pod) + + Eventually(func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, podName, containerName) + }, + podLogTimeout, framework.Poll).Should(ContainSubstring("key1=\"value1\"\n")) + + //modify labels + podClient.Update(podName, func(pod *v1.Pod) { + pod.Labels["key3"] = "value3" + }) + + Eventually(func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, containerName) + }, + podLogTimeout, framework.Poll).Should(ContainSubstring("key3=\"value3\"\n")) + }) + + It("should update annotations on modification [Conformance] [Volume]", func() { + annotations := map[string]string{} + annotations["builder"] = "bar" + podName := "annotationupdate" + string(uuid.NewUUID()) + pod := projectedDownwardAPIVolumePodForUpdateTest(podName, map[string]string{}, annotations, "/etc/annotations") + + containerName := "client-container" + By("Creating the pod") + podClient.CreateSync(pod) + + pod, err := podClient.Get(pod.Name, metav1.GetOptions{}) + Expect(err).NotTo(HaveOccurred(), "Failed to get pod %q", pod.Name) + + Eventually(func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, containerName) + }, + podLogTimeout, framework.Poll).Should(ContainSubstring("builder=\"bar\"\n")) + + //modify annotations + podClient.Update(podName, func(pod *v1.Pod) { + pod.Annotations["builder"] = "foo" + }) + + Eventually(func() (string, error) { + return framework.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, containerName) + }, + podLogTimeout, framework.Poll).Should(ContainSubstring("builder=\"foo\"\n")) + }) + + It("should provide container's cpu limit [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForContainerResources(podName, "/etc/cpu_limit") + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("2\n"), + }) + }) + + It("should provide container's memory limit [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForContainerResources(podName, "/etc/memory_limit") + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("67108864\n"), + }) + }) + + It("should provide container's cpu request [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForContainerResources(podName, "/etc/cpu_request") + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("1\n"), + }) + }) + + It("should provide container's memory request [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForContainerResources(podName, "/etc/memory_request") + + f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ + fmt.Sprintf("33554432\n"), + }) + }) + + It("should provide node allocatable (cpu) as default cpu limit if the limit is not set [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForDefaultContainerResources(podName, "/etc/cpu_limit") + + f.TestContainerOutputRegexp("downward API volume plugin", pod, 0, []string{"[1-9]"}) + }) + + It("should provide node allocatable (memory) as default memory limit if the limit is not set [Conformance] [Volume]", func() { + podName := "downwardapi-volume-" + string(uuid.NewUUID()) + pod := downwardAPIVolumeForDefaultContainerResources(podName, "/etc/memory_limit") + + f.TestContainerOutputRegexp("downward API volume plugin", pod, 0, []string{"[1-9]"}) + }) + + // Test multiple projections + It("should project all components that make up the projection API [Conformance] [Volume] [Projection]", func() { + var err error + podName := "projected-volume-" + string(uuid.NewUUID()) + secretName := "secret-projected-all-test-volume-" + string(uuid.NewUUID()) + configMapName := "configmap-projected-all-test-volume-" + string(uuid.NewUUID()) + configMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: configMapName, + }, + Data: map[string]string{ + "configmap-data": "configmap-value-1", + }, + } + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: secretName, + }, + Data: map[string][]byte{ + "secret-data": []byte("secret-value-1"), + }, + } + + By(fmt.Sprintf("Creating configMap with name %s", configMap.Name)) + if configMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(configMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + By(fmt.Sprintf("Creating secret with name %s", secret.Name)) + if secret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(secret); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := projectedAllVolumeBasePod(podName, secretName, configMapName, nil, nil) + pod.Spec.Containers = []v1.Container{ + { + Name: "projected-all-volume-test", + Image: "gcr.io/google_containers/busybox:1.24", + Command: []string{"sh", "-c", "cat /all/podname && cat /all/secret-data && cat /all/configmap-data"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: "podinfo", + MountPath: "/all", + ReadOnly: false, + }, + }, + }, + } + f.TestContainerOutput("Check all projections for projected volume plugin", pod, 0, []string{ + fmt.Sprintf("%s", podName), + "secret-value-1", + "configmap-value-1", + }) + }) +}) + +func doProjectedSecretE2EWithoutMapping(f *framework.Framework, defaultMode *int32, secretName string, fsGroup *int64, uid *int64) { + var ( + volumeName = "projected-secret-volume" + volumeMountPath = "/etc/projected-secret-volume" + secret = secretForTest(f.Namespace.Name, secretName) + ) + + By(fmt.Sprintf("Creating projection with secret that has name %s", secret.Name)) + var err error + if secret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(secret); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-secrets-" + string(uuid.NewUUID()), + Namespace: f.Namespace.Name, + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: secretName, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "projected-secret-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{ + "--file_content=/etc/projected-secret-volume/data-1", + "--file_mode=/etc/projected-secret-volume/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + if defaultMode != nil { + //pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].Secret.DefaultMode = defaultMode + pod.Spec.Volumes[0].VolumeSource.Projected.DefaultMode = defaultMode + } else { + mode := int32(0644) + defaultMode = &mode + } + + if fsGroup != nil || uid != nil { + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + FSGroup: fsGroup, + RunAsUser: uid, + } + } + + modeString := fmt.Sprintf("%v", os.FileMode(*defaultMode)) + expectedOutput := []string{ + "content of file \"/etc/projected-secret-volume/data-1\": value-1", + "mode of file \"/etc/projected-secret-volume/data-1\": " + modeString, + } + + f.TestContainerOutput("consume secrets", pod, 0, expectedOutput) +} + +func doProjectedSecretE2EWithMapping(f *framework.Framework, mode *int32) { + var ( + name = "projected-secret-test-map-" + string(uuid.NewUUID()) + volumeName = "projected-secret-volume" + volumeMountPath = "/etc/projected-secret-volume" + secret = secretForTest(f.Namespace.Name, name) + ) + + By(fmt.Sprintf("Creating projection with secret that has name %s", secret.Name)) + var err error + if secret, err = f.ClientSet.Core().Secrets(f.Namespace.Name).Create(secret); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-secrets-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + Items: []v1.KeyToPath{ + { + Key: "data-1", + Path: "new-path-data-1", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "projected-secret-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{ + "--file_content=/etc/projected-secret-volume/new-path-data-1", + "--file_mode=/etc/projected-secret-volume/new-path-data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + if mode != nil { + //pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].Secret.Items[0].Mode = mode + pod.Spec.Volumes[0].VolumeSource.Projected.DefaultMode = mode + } else { + defaultItemMode := int32(0644) + mode = &defaultItemMode + } + + modeString := fmt.Sprintf("%v", os.FileMode(*mode)) + expectedOutput := []string{ + "content of file \"/etc/projected-secret-volume/new-path-data-1\": value-1", + "mode of file \"/etc/projected-secret-volume/new-path-data-1\": " + modeString, + } + + f.TestContainerOutput("consume secrets", pod, 0, expectedOutput) +} + +func doProjectedConfigMapE2EWithoutMappings(f *framework.Framework, uid, fsGroup int64, defaultMode *int32) { + var ( + name = "projected-configmap-test-volume-" + string(uuid.NewUUID()) + volumeName = "projected-configmap-volume" + volumeMountPath = "/etc/projected-configmap-volume" + configMap = newConfigMap(f, name) + ) + + By(fmt.Sprintf("Creating configMap with name %s", configMap.Name)) + var err error + if configMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(configMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + SecurityContext: &v1.PodSecurityContext{}, + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "projected-configmap-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{ + "--file_content=/etc/projected-configmap-volume/data-1", + "--file_mode=/etc/projected-configmap-volume/data-1"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + if uid != 0 { + pod.Spec.SecurityContext.RunAsUser = &uid + } + + if fsGroup != 0 { + pod.Spec.SecurityContext.FSGroup = &fsGroup + } + if defaultMode != nil { + //pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].ConfigMap.DefaultMode = defaultMode + pod.Spec.Volumes[0].VolumeSource.Projected.DefaultMode = defaultMode + } else { + mode := int32(0644) + defaultMode = &mode + } + + modeString := fmt.Sprintf("%v", os.FileMode(*defaultMode)) + output := []string{ + "content of file \"/etc/projected-configmap-volume/data-1\": value-1", + "mode of file \"/etc/projected-configmap-volume/data-1\": " + modeString, + } + f.TestContainerOutput("consume configMaps", pod, 0, output) +} + +func doProjectedConfigMapE2EWithMappings(f *framework.Framework, uid, fsGroup int64, itemMode *int32) { + var ( + name = "projected-configmap-test-volume-map-" + string(uuid.NewUUID()) + volumeName = "projected-configmap-volume" + volumeMountPath = "/etc/projected-configmap-volume" + configMap = newConfigMap(f, name) + ) + + By(fmt.Sprintf("Creating configMap with name %s", configMap.Name)) + + var err error + if configMap, err = f.ClientSet.Core().ConfigMaps(f.Namespace.Name).Create(configMap); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-projected-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + SecurityContext: &v1.PodSecurityContext{}, + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + Items: []v1.KeyToPath{ + { + Key: "data-2", + Path: "path/to/data-2", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "projected-configmap-volume-test", + Image: "gcr.io/google_containers/mounttest:0.8", + Args: []string{"--file_content=/etc/projected-configmap-volume/path/to/data-2", + "--file_mode=/etc/projected-configmap-volume/path/to/data-2"}, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + ReadOnly: true, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + if uid != 0 { + pod.Spec.SecurityContext.RunAsUser = &uid + } + + if fsGroup != 0 { + pod.Spec.SecurityContext.FSGroup = &fsGroup + } + if itemMode != nil { + //pod.Spec.Volumes[0].VolumeSource.ConfigMap.Items[0].Mode = itemMode + pod.Spec.Volumes[0].VolumeSource.Projected.DefaultMode = itemMode + } else { + mode := int32(0644) + itemMode = &mode + } + + // Just check file mode if fsGroup is not set. If fsGroup is set, the + // final mode is adjusted and we are not testing that case. + output := []string{ + "content of file \"/etc/projected-configmap-volume/path/to/data-2\": value-2", + } + if fsGroup == 0 { + modeString := fmt.Sprintf("%v", os.FileMode(*itemMode)) + output = append(output, "mode of file \"/etc/projected-configmap-volume/path/to/data-2\": "+modeString) + } + f.TestContainerOutput("consume configMaps", pod, 0, output) +} + +func projectedDownwardAPIVolumePodForModeTest(name, filePath string, itemMode, defaultMode *int32) *v1.Pod { + pod := projectedDownwardAPIVolumeBasePod(name, nil, nil) + + pod.Spec.Containers = []v1.Container{ + { + Name: "client-container", + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--file_mode=" + filePath}, + VolumeMounts: []v1.VolumeMount{ + { + Name: "podinfo", + MountPath: "/etc", + }, + }, + }, + } + if itemMode != nil { + pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].DownwardAPI.Items[0].Mode = itemMode + } + if defaultMode != nil { + pod.Spec.Volumes[0].VolumeSource.Projected.DefaultMode = defaultMode + } + + return pod +} + +func projectedDownwardAPIVolumePodForUpdateTest(name string, labels, annotations map[string]string, filePath string) *v1.Pod { + pod := projectedDownwardAPIVolumeBasePod(name, labels, annotations) + + pod.Spec.Containers = []v1.Container{ + { + Name: "client-container", + Image: "gcr.io/google_containers/mounttest:0.8", + Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=" + filePath}, + VolumeMounts: []v1.VolumeMount{ + { + Name: "podinfo", + MountPath: "/etc", + ReadOnly: false, + }, + }, + }, + } + + applyLabelsAndAnnotationsToProjectedDownwardAPIPod(labels, annotations, pod) + return pod +} + +func projectedDownwardAPIVolumeBasePod(name string, labels, annotations map[string]string) *v1.Pod { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Labels: labels, + Annotations: annotations, + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: "podinfo", + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + DownwardAPI: &v1.DownwardAPIProjection{ + Items: []v1.DownwardAPIVolumeFile{ + { + Path: "podname", + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }, + { + Path: "cpu_limit", + ResourceFieldRef: &v1.ResourceFieldSelector{ + ContainerName: "client-container", + Resource: "limits.cpu", + }, + }, + { + Path: "cpu_request", + ResourceFieldRef: &v1.ResourceFieldSelector{ + ContainerName: "client-container", + Resource: "requests.cpu", + }, + }, + { + Path: "memory_limit", + ResourceFieldRef: &v1.ResourceFieldSelector{ + ContainerName: "client-container", + Resource: "limits.memory", + }, + }, + { + Path: "memory_request", + ResourceFieldRef: &v1.ResourceFieldSelector{ + ContainerName: "client-container", + Resource: "requests.memory", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + return pod +} + +func applyLabelsAndAnnotationsToProjectedDownwardAPIPod(labels, annotations map[string]string, pod *v1.Pod) { + if len(labels) > 0 { + pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].DownwardAPI.Items = append(pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].DownwardAPI.Items, v1.DownwardAPIVolumeFile{ + Path: "labels", + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.labels", + }, + }) + } + + if len(annotations) > 0 { + pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].DownwardAPI.Items = append(pod.Spec.Volumes[0].VolumeSource.Projected.Sources[0].DownwardAPI.Items, v1.DownwardAPIVolumeFile{ + Path: "annotations", + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.annotations", + }, + }) + } +} + +func projectedAllVolumeBasePod(podName string, secretName string, configMapName string, labels, annotations map[string]string) *v1.Pod { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: labels, + Annotations: annotations, + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: "podinfo", + VolumeSource: v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + DownwardAPI: &v1.DownwardAPIProjection{ + Items: []v1.DownwardAPIVolumeFile{ + { + Path: "podname", + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }, + }, + }, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: secretName, + }, + }, + }, + { + ConfigMap: &v1.ConfigMapProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: configMapName, + }, + }, + }, + }, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + return pod +} From ec701a65e80f2767708060027c4a4664d8ec46a0 Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Mon, 20 Feb 2017 13:09:41 -0500 Subject: [PATCH 2/2] Generated files for projected volume driver --- api/openapi-spec/swagger.json | 93 + api/swagger-spec/apps_v1beta1.json | 98 + api/swagger-spec/batch_v1.json | 98 + api/swagger-spec/extensions_v1beta1.json | 98 + api/swagger-spec/v1.json | 98 + cmd/kubelet/app/BUILD | 1 + .../apps/v1beta1/definitions.html | 440 +- docs/api-reference/batch/v1/definitions.html | 440 +- .../extensions/v1beta1/definitions.html | 508 ++- docs/api-reference/v1/definitions.html | 358 +- federation/apis/openapi-spec/swagger.json | 93 + pkg/api/v1/generated.pb.go | 3843 +++++++++++------ pkg/api/v1/generated.proto | 87 + pkg/api/v1/types.generated.go | 2175 ++++++++-- pkg/api/v1/types_swagger_doc_generated.go | 51 + pkg/api/v1/zz_generated.conversion.go | 124 + pkg/api/v1/zz_generated.deepcopy.go | 129 + pkg/api/v1/zz_generated.defaults.go | 42 + pkg/api/zz_generated.deepcopy.go | 129 + .../apps/v1beta1/zz_generated.defaults.go | 14 + pkg/apis/batch/v1/zz_generated.defaults.go | 14 + .../batch/v2alpha1/zz_generated.defaults.go | 42 + .../v1beta1/zz_generated.defaults.go | 42 + pkg/generated/openapi/zz_generated.openapi.go | 177 +- pkg/volume/BUILD | 1 + pkg/volume/projected/BUILD | 60 + test/e2e/common/BUILD | 1 + 27 files changed, 7172 insertions(+), 2084 deletions(-) create mode 100644 pkg/volume/projected/BUILD diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 0d1edb0732b..275234f093b 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -35729,6 +35729,26 @@ } ] }, + "io.k8s.kubernetes.pkg.api.v1.ConfigMapProjection": { + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.KeyToPath" + } + }, + "name": { + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or it's keys must be defined", + "type": "boolean" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.ConfigMapVolumeSource": { "description": "Adapts a ConfigMap into a volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.", "properties": { @@ -36045,6 +36065,18 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.DownwardAPIProjection": { + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "description": "Items is a list of DownwardAPIVolume file", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeFile" + } + } + } + }, "io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeFile": { "description": "DownwardAPIVolumeFile represents information to create the file containing the pod field", "required": [ @@ -38169,6 +38201,26 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.ProjectedVolumeSource": { + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "defaultMode": { + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "type": "integer", + "format": "int32" + }, + "sources": { + "description": "list of volume projections", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.VolumeProjection" + } + } + } + }, "io.k8s.kubernetes.pkg.api.v1.QuobyteVolumeSource": { "description": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", "required": [ @@ -38677,6 +38729,26 @@ } ] }, + "io.k8s.kubernetes.pkg.api.v1.SecretProjection": { + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.KeyToPath" + } + }, + "name": { + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.SecretVolumeSource": { "description": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", "properties": { @@ -39071,6 +39143,10 @@ "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.PhotonPersistentDiskVolumeSource" }, + "projected": { + "description": "Items for all in one resources secrets, configmaps, and downward API", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ProjectedVolumeSource" + }, "quobyte": { "description": "Quobyte represents a Quobyte mount on the host that shares a pod's lifetime", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.QuobyteVolumeSource" @@ -39114,6 +39190,23 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.VolumeProjection": { + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "configMap": { + "description": "information about the configMap data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapProjection" + }, + "downwardAPI": { + "description": "information about the downwardAPI data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.DownwardAPIProjection" + }, + "secret": { + "description": "information about the secret data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.SecretProjection" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.VsphereVirtualDiskVolumeSource": { "description": "Represents a vSphere volume resource.", "required": [ diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 60c571fb815..184aa5d2686 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -1473,6 +1473,10 @@ "photonPersistentDisk": { "$ref": "v1.PhotonPersistentDiskVolumeSource", "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "projected": { + "$ref": "v1.ProjectedVolumeSource", + "description": "Items for all in one resources secrets, configmaps, and downward API" } } }, @@ -2139,6 +2143,100 @@ } } }, + "v1.ProjectedVolumeSource": { + "id": "v1.ProjectedVolumeSource", + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "v1.VolumeProjection" + }, + "description": "list of volume projections" + }, + "defaultMode": { + "type": "integer", + "format": "int32", + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set." + } + } + }, + "v1.VolumeProjection": { + "id": "v1.VolumeProjection", + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "secret": { + "$ref": "v1.SecretProjection", + "description": "information about the secret data to project" + }, + "downwardAPI": { + "$ref": "v1.DownwardAPIProjection", + "description": "information about the downwardAPI data to project" + }, + "configMap": { + "$ref": "v1.ConfigMapProjection", + "description": "information about the configMap data to project" + } + } + }, + "v1.SecretProjection": { + "id": "v1.SecretProjection", + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the Secret or its key must be defined" + } + } + }, + "v1.DownwardAPIProjection": { + "id": "v1.DownwardAPIProjection", + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "v1.DownwardAPIVolumeFile" + }, + "description": "Items is a list of DownwardAPIVolume file" + } + } + }, + "v1.ConfigMapProjection": { + "id": "v1.ConfigMapProjection", + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the ConfigMap or it's keys must be defined" + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 7986c92b3fd..4fba3a57036 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -1478,6 +1478,10 @@ "photonPersistentDisk": { "$ref": "v1.PhotonPersistentDiskVolumeSource", "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "projected": { + "$ref": "v1.ProjectedVolumeSource", + "description": "Items for all in one resources secrets, configmaps, and downward API" } } }, @@ -2144,6 +2148,100 @@ } } }, + "v1.ProjectedVolumeSource": { + "id": "v1.ProjectedVolumeSource", + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "v1.VolumeProjection" + }, + "description": "list of volume projections" + }, + "defaultMode": { + "type": "integer", + "format": "int32", + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set." + } + } + }, + "v1.VolumeProjection": { + "id": "v1.VolumeProjection", + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "secret": { + "$ref": "v1.SecretProjection", + "description": "information about the secret data to project" + }, + "downwardAPI": { + "$ref": "v1.DownwardAPIProjection", + "description": "information about the downwardAPI data to project" + }, + "configMap": { + "$ref": "v1.ConfigMapProjection", + "description": "information about the configMap data to project" + } + } + }, + "v1.SecretProjection": { + "id": "v1.SecretProjection", + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the Secret or its key must be defined" + } + } + }, + "v1.DownwardAPIProjection": { + "id": "v1.DownwardAPIProjection", + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "v1.DownwardAPIVolumeFile" + }, + "description": "Items is a list of DownwardAPIVolume file" + } + } + }, + "v1.ConfigMapProjection": { + "id": "v1.ConfigMapProjection", + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the ConfigMap or it's keys must be defined" + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 7a8d4fa0967..3d9a6ca315c 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -6880,6 +6880,10 @@ "photonPersistentDisk": { "$ref": "v1.PhotonPersistentDiskVolumeSource", "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "projected": { + "$ref": "v1.ProjectedVolumeSource", + "description": "Items for all in one resources secrets, configmaps, and downward API" } } }, @@ -7546,6 +7550,100 @@ } } }, + "v1.ProjectedVolumeSource": { + "id": "v1.ProjectedVolumeSource", + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "v1.VolumeProjection" + }, + "description": "list of volume projections" + }, + "defaultMode": { + "type": "integer", + "format": "int32", + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set." + } + } + }, + "v1.VolumeProjection": { + "id": "v1.VolumeProjection", + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "secret": { + "$ref": "v1.SecretProjection", + "description": "information about the secret data to project" + }, + "downwardAPI": { + "$ref": "v1.DownwardAPIProjection", + "description": "information about the downwardAPI data to project" + }, + "configMap": { + "$ref": "v1.ConfigMapProjection", + "description": "information about the configMap data to project" + } + } + }, + "v1.SecretProjection": { + "id": "v1.SecretProjection", + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the Secret or its key must be defined" + } + } + }, + "v1.DownwardAPIProjection": { + "id": "v1.DownwardAPIProjection", + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "v1.DownwardAPIVolumeFile" + }, + "description": "Items is a list of DownwardAPIVolume file" + } + } + }, + "v1.ConfigMapProjection": { + "id": "v1.ConfigMapProjection", + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the ConfigMap or it's keys must be defined" + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 3ad39277d3a..b1afed29dba 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18416,6 +18416,10 @@ "photonPersistentDisk": { "$ref": "v1.PhotonPersistentDiskVolumeSource", "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "projected": { + "$ref": "v1.ProjectedVolumeSource", + "description": "Items for all in one resources secrets, configmaps, and downward API" } } }, @@ -18624,6 +18628,100 @@ } } }, + "v1.ProjectedVolumeSource": { + "id": "v1.ProjectedVolumeSource", + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "v1.VolumeProjection" + }, + "description": "list of volume projections" + }, + "defaultMode": { + "type": "integer", + "format": "int32", + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set." + } + } + }, + "v1.VolumeProjection": { + "id": "v1.VolumeProjection", + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "secret": { + "$ref": "v1.SecretProjection", + "description": "information about the secret data to project" + }, + "downwardAPI": { + "$ref": "v1.DownwardAPIProjection", + "description": "information about the downwardAPI data to project" + }, + "configMap": { + "$ref": "v1.ConfigMapProjection", + "description": "information about the configMap data to project" + } + } + }, + "v1.SecretProjection": { + "id": "v1.SecretProjection", + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the Secret or its key must be defined" + } + } + }, + "v1.DownwardAPIProjection": { + "id": "v1.DownwardAPIProjection", + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "v1.DownwardAPIVolumeFile" + }, + "description": "Items is a list of DownwardAPIVolume file" + } + } + }, + "v1.ConfigMapProjection": { + "id": "v1.ConfigMapProjection", + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.KeyToPath" + }, + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'." + }, + "optional": { + "type": "boolean", + "description": "Specify whether the ConfigMap or it's keys must be defined" + } + } + }, "v1.Container": { "id": "v1.Container", "description": "A single application container that you want to run within a pod.", diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD index d65a2d1f660..066d3fa1d2a 100644 --- a/cmd/kubelet/app/BUILD +++ b/cmd/kubelet/app/BUILD @@ -89,6 +89,7 @@ go_library( "//pkg/volume/iscsi:go_default_library", "//pkg/volume/nfs:go_default_library", "//pkg/volume/photon_pd:go_default_library", + "//pkg/volume/projected:go_default_library", "//pkg/volume/quobyte:go_default_library", "//pkg/volume/rbd:go_default_library", "//pkg/volume/secret:go_default_library", diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 12da6f5682e..b848168c9e2 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -484,6 +484,57 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.ConfigMapProjection

+
+

Adapts a ConfigMap into a projected volume.

+
+
+

The contents of the target ConfigMap’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the ConfigMap or it’s keys must be defined

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -875,6 +926,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.DownwardAPIProjection

+
+

Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

items

Items is a list of DownwardAPIVolume file

false

v1.DownwardAPIVolumeFile array

+

v1.LabelSelector

@@ -1700,6 +1785,47 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.ProjectedVolumeSource

+
+

Represents a projected volume source

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

sources

list of volume projections

true

v1.VolumeProjection array

defaultMode

Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.

false

integer (int32)

+

v1.Container

@@ -2507,6 +2633,57 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.SecretProjection

+
+

Adapts a secret into a projected volume.

+
+
+

The contents of the target Secret’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the Secret or its key must be defined

false

boolean

false

+

v1.EmptyDirVolumeSource

@@ -3186,6 +3363,54 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EnvVar

+
+

EnvVar represents an environment variable present in a Container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

+

v1.SecretVolumeSource

@@ -3292,54 +3517,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EnvVar

-
-

EnvVar represents an environment variable present in a Container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

-

v1.PersistentVolumeAccessMode

@@ -3385,6 +3562,61 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EnvVarSource

+
+

EnvVarSource represents a source for the value of an EnvVar.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

+

v1.FlexVolumeSource

@@ -3447,61 +3679,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EnvVarSource

-
-

EnvVarSource represents a source for the value of an EnvVar.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

-

v1.PodTemplateSpec

@@ -4053,6 +4230,13 @@ The StatefulSet guarantees that a given network identity will always map to the

v1.PhotonPersistentDiskVolumeSource

+ +

projected

+

Items for all in one resources secrets, configmaps, and downward API

+

false

+

v1.ProjectedVolumeSource

+ + @@ -4148,6 +4332,54 @@ The StatefulSet guarantees that a given network identity will always map to the +
+
+

v1.VolumeProjection

+
+

Projection that may be projected along with other supported volume types

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

secret

information about the secret data to project

false

v1.SecretProjection

downwardAPI

information about the downwardAPI data to project

false

v1.DownwardAPIProjection

configMap

information about the configMap data to project

false

v1.ConfigMapProjection

+

v1.WeightedPodAffinityTerm

@@ -5088,7 +5320,7 @@ Examples:
diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 2f494d4bbe3..93d85e84922 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -484,6 +484,57 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.ConfigMapProjection

+
+

Adapts a ConfigMap into a projected volume.

+
+
+

The contents of the target ConfigMap’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the ConfigMap or it’s keys must be defined

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -875,6 +926,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.DownwardAPIProjection

+
+

Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

items

Items is a list of DownwardAPIVolume file

false

v1.DownwardAPIVolumeFile array

+

v1.LabelSelector

@@ -1604,6 +1689,47 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.ProjectedVolumeSource

+
+

Represents a projected volume source

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

sources

list of volume projections

true

v1.VolumeProjection array

defaultMode

Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.

false

integer (int32)

+

v1.Container

@@ -2418,6 +2544,57 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.SecretProjection

+
+

Adapts a secret into a projected volume.

+
+
+

The contents of the target Secret’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the Secret or its key must be defined

false

boolean

false

+

v1.EmptyDirVolumeSource

@@ -3173,6 +3350,54 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EnvVar

+
+

EnvVar represents an environment variable present in a Container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

+

v1.SecretVolumeSource

@@ -3279,54 +3504,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EnvVar

-
-

EnvVar represents an environment variable present in a Container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

-

v1.ResourceRequirements

@@ -3368,6 +3545,61 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EnvVarSource

+
+

EnvVarSource represents a source for the value of an EnvVar.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

+

v1.FlexVolumeSource

@@ -3430,61 +3662,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EnvVarSource

-
-

EnvVarSource represents a source for the value of an EnvVar.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

-

v1.PodTemplateSpec

@@ -4040,6 +4217,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

v1.PhotonPersistentDiskVolumeSource

+ +

projected

+

Items for all in one resources secrets, configmaps, and downward API

+

false

+

v1.ProjectedVolumeSource

+ + @@ -4135,6 +4319,54 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.VolumeProjection

+
+

Projection that may be projected along with other supported volume types

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

secret

information about the secret data to project

false

v1.SecretProjection

downwardAPI

information about the downwardAPI data to project

false

v1.DownwardAPIProjection

configMap

information about the configMap data to project

false

v1.ConfigMapProjection

+

v1.WeightedPodAffinityTerm

@@ -5020,7 +5252,7 @@ Examples:
diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index cb0a8ce88cc..badcae75888 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -931,6 +931,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.DownwardAPIProjection

+
+

Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

items

Items is a list of DownwardAPIVolume file

false

v1.DownwardAPIVolumeFile array

+

v1.LabelSelector

@@ -1783,6 +1817,47 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.ProjectedVolumeSource

+
+

Represents a projected volume source

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

sources

list of volume projections

true

v1.VolumeProjection array

defaultMode

Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.

false

integer (int32)

+

v1.ExecAction

@@ -2249,40 +2324,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EmptyDirVolumeSource

-
-

Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.

-
- ------- - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

medium

What type of storage medium should back this directory. The default is "" which means to use the node’s default medium. Must be an empty string (default) or Memory. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir

false

string

-

v1beta1.IngressList

@@ -2338,6 +2379,40 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EmptyDirVolumeSource

+
+

Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

medium

What type of storage medium should back this directory. The default is "" which means to use the node’s default medium. Must be an empty string (default) or Memory. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir

false

string

+

v1beta1.ScaleSpec

@@ -2803,61 +2878,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.EnvVarSource

-
-

EnvVarSource represents a source for the value of an EnvVar.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

-

v1.FlexVolumeSource

@@ -2920,6 +2940,61 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.EnvVarSource

+
+

EnvVarSource represents a source for the value of an EnvVar.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.

false

v1.ObjectFieldSelector

resourceFieldRef

Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.

false

v1.ResourceFieldSelector

configMapKeyRef

Selects a key of a ConfigMap.

false

v1.ConfigMapKeySelector

secretKeyRef

Selects a key of a secret in the pod’s namespace

false

v1.SecretKeySelector

+

v1.LoadBalancerIngress

@@ -3441,6 +3516,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

v1.PhotonPersistentDiskVolumeSource

+ +

projected

+

Items for all in one resources secrets, configmaps, and downward API

+

false

+

v1.ProjectedVolumeSource

+ + @@ -3547,6 +3629,54 @@ Populated by the system when a graceful deletion is requested. Read-only. More i +
+
+

v1.VolumeProjection

+
+

Projection that may be projected along with other supported volume types

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

secret

information about the secret data to project

false

v1.SecretProjection

downwardAPI

information about the downwardAPI data to project

false

v1.DownwardAPIProjection

configMap

information about the configMap data to project

false

v1.ConfigMapProjection

+

v1.Probe

@@ -4534,6 +4664,57 @@ Examples:
+
+
+

v1.ConfigMapProjection

+
+

Adapts a ConfigMap into a projected volume.

+
+
+

The contents of the target ConfigMap’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the ConfigMap or it’s keys must be defined

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -6090,6 +6271,57 @@ Both these may change in the future. Incoming requests are matched against the h +
+
+

v1.SecretProjection

+
+

Adapts a secret into a projected volume.

+
+
+

The contents of the target Secret’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the Secret or its key must be defined

false

boolean

false

+

v1beta1.DaemonSet

@@ -6472,54 +6704,6 @@ Both these may change in the future. Incoming requests are matched against the h -
-
-

v1.EnvVar

-
-

EnvVar represents an environment variable present in a Container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

-

v1.LabelSelectorRequirement

@@ -6568,6 +6752,54 @@ Both these may change in the future. Incoming requests are matched against the h +
+
+

v1.EnvVar

+
+

EnvVar represents an environment variable present in a Container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the environment variable. Must be a C_IDENTIFIER.

true

string

value

Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".

false

string

valueFrom

Source for the environment variable’s value. Cannot be used if value is not empty.

false

v1.EnvVarSource

+

v1.ResourceRequirements

@@ -7311,7 +7543,7 @@ Both these may change in the future. Incoming requests are matched against the h
diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 0b1e5e15dda..ced7c83fcc3 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -947,6 +947,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.DownwardAPIProjection

+
+

Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

items

Items is a list of DownwardAPIVolume file

false

v1.DownwardAPIVolumeFile array

+

v1.LabelSelector

@@ -2088,6 +2122,47 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.ProjectedVolumeSource

+
+

Represents a projected volume source

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

sources

list of volume projections

true

v1.VolumeProjection array

defaultMode

Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.

false

integer (int32)

+

v1.ExecAction

@@ -4206,6 +4281,13 @@ The resulting set of endpoints can be viewed as:

v1.PhotonPersistentDiskVolumeSource

+ +

projected

+

Items for all in one resources secrets, configmaps, and downward API

+

false

+

v1.ProjectedVolumeSource

+ + @@ -4257,6 +4339,54 @@ The resulting set of endpoints can be viewed as:
+
+
+

v1.VolumeProjection

+
+

Projection that may be projected along with other supported volume types

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

secret

information about the secret data to project

false

v1.SecretProjection

downwardAPI

information about the downwardAPI data to project

false

v1.DownwardAPIProjection

configMap

information about the configMap data to project

false

v1.ConfigMapProjection

+

v1.WeightedPodAffinityTerm

@@ -4702,6 +4832,68 @@ The resulting set of endpoints can be viewed as:
+
+
+

v1.ContainerPort

+
+

ContainerPort represents a network port in a single container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

+

v1.PodSpec

@@ -4876,68 +5068,6 @@ The resulting set of endpoints can be viewed as:
-
-
-

v1.ContainerPort

-
-

ContainerPort represents a network port in a single container.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.

false

string

hostPort

Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.

false

integer (int32)

containerPort

Number of port to expose on the pod’s IP address. This must be a valid port number, 0 < x < 65536.

true

integer (int32)

protocol

Protocol for port. Must be UDP or TCP. Defaults to "TCP".

false

string

hostIP

What host IP to bind the external port to.

false

string

-

v1.ResourceQuota

@@ -5630,6 +5760,57 @@ Examples:
+
+
+

v1.ConfigMapProjection

+
+

Adapts a ConfigMap into a projected volume.

+
+
+

The contents of the target ConfigMap’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the ConfigMap or it’s keys must be defined

false

boolean

false

+

v1.PhotonPersistentDiskVolumeSource

@@ -7213,6 +7394,57 @@ Examples:
+
+
+

v1.SecretProjection

+
+

Adapts a secret into a projected volume.

+
+
+

The contents of the target Secret’s Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

false

string

items

If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the .. path or start with ...

false

v1.KeyToPath array

optional

Specify whether the Secret or its key must be defined

false

boolean

false

+

v1.ContainerStateTerminated

@@ -9275,7 +9507,7 @@ Examples:
diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 9356499890d..0f2df82c9ad 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -11407,6 +11407,26 @@ } ] }, + "io.k8s.kubernetes.pkg.api.v1.ConfigMapProjection": { + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.KeyToPath" + } + }, + "name": { + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or it's keys must be defined", + "type": "boolean" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.ConfigMapVolumeSource": { "description": "Adapts a ConfigMap into a volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.", "properties": { @@ -11568,6 +11588,18 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.DownwardAPIProjection": { + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "description": "Items is a list of DownwardAPIVolume file", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeFile" + } + } + } + }, "io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeFile": { "description": "DownwardAPIVolumeFile represents information to create the file containing the pod field", "required": [ @@ -12657,6 +12689,26 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.ProjectedVolumeSource": { + "description": "Represents a projected volume source", + "required": [ + "sources" + ], + "properties": { + "defaultMode": { + "description": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "type": "integer", + "format": "int32" + }, + "sources": { + "description": "list of volume projections", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.VolumeProjection" + } + } + } + }, "io.k8s.kubernetes.pkg.api.v1.QuobyteVolumeSource": { "description": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", "required": [ @@ -12900,6 +12952,26 @@ } ] }, + "io.k8s.kubernetes.pkg.api.v1.SecretProjection": { + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.KeyToPath" + } + }, + "name": { + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.SecretVolumeSource": { "description": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", "properties": { @@ -13218,6 +13290,10 @@ "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.PhotonPersistentDiskVolumeSource" }, + "projected": { + "description": "Items for all in one resources secrets, configmaps, and downward API", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ProjectedVolumeSource" + }, "quobyte": { "description": "Quobyte represents a Quobyte mount on the host that shares a pod's lifetime", "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.QuobyteVolumeSource" @@ -13261,6 +13337,23 @@ } } }, + "io.k8s.kubernetes.pkg.api.v1.VolumeProjection": { + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "configMap": { + "description": "information about the configMap data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapProjection" + }, + "downwardAPI": { + "description": "information about the downwardAPI data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.DownwardAPIProjection" + }, + "secret": { + "description": "information about the secret data to project", + "$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.SecretProjection" + } + } + }, "io.k8s.kubernetes.pkg.api.v1.VsphereVirtualDiskVolumeSource": { "description": "Represents a vSphere volume resource.", "required": [ diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index efc0f180ff9..1c6cec9a37b 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -42,6 +42,7 @@ limitations under the License. ConfigMapEnvSource ConfigMapKeySelector ConfigMapList + ConfigMapProjection ConfigMapVolumeSource Container ContainerImage @@ -53,6 +54,7 @@ limitations under the License. ContainerStatus DaemonEndpoint DeleteOptions + DownwardAPIProjection DownwardAPIVolumeFile DownwardAPIVolumeSource EmptyDirVolumeSource @@ -146,6 +148,7 @@ limitations under the License. PreferAvoidPodsEntry PreferredSchedulingTerm Probe + ProjectedVolumeSource QuobyteVolumeSource RBDVolumeSource RangeAllocation @@ -165,6 +168,7 @@ limitations under the License. SecretEnvSource SecretKeySelector SecretList + SecretProjection SecretVolumeSource SecurityContext SerializedReference @@ -182,6 +186,7 @@ limitations under the License. Toleration Volume VolumeMount + VolumeProjection VolumeSource VsphereVirtualDiskVolumeSource WeightedPodAffinityTerm @@ -283,608 +288,628 @@ func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } +func (*ConfigMapProjection) ProtoMessage() {} +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } + func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{23} + return fileDescriptorGenerated, []int{24} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } + +func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } +func (*DownwardAPIProjection) ProtoMessage() {} +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{29} + return fileDescriptorGenerated, []int{31} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{46} + return fileDescriptorGenerated, []int{48} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} -func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} -func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} -func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} -func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} -func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} -func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } +func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} -func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } +func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} -func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } +func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{79} + return fileDescriptorGenerated, []int{81} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{89} + return fileDescriptorGenerated, []int{91} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{90} + return fileDescriptorGenerated, []int{92} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{91} + return fileDescriptorGenerated, []int{93} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{92} + return fileDescriptorGenerated, []int{94} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} -func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } +func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} -func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } +func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{99} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{119} + return fileDescriptorGenerated, []int{121} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } + +func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } +func (*ProjectedVolumeSource) ProtoMessage() {} +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{125} + return fileDescriptorGenerated, []int{128} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{126} + return fileDescriptorGenerated, []int{129} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{127} + return fileDescriptorGenerated, []int{130} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{128} + return fileDescriptorGenerated, []int{131} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } + +func (m *SecretProjection) Reset() { *m = SecretProjection{} } +func (*SecretProjection) ProtoMessage() {} +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } + +func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } +func (*VolumeProjection) ProtoMessage() {} +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{158} + return fileDescriptorGenerated, []int{163} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{159} + return fileDescriptorGenerated, []int{164} } func init() { @@ -905,6 +930,7 @@ func init() { proto.RegisterType((*ConfigMapEnvSource)(nil), "k8s.io.kubernetes.pkg.api.v1.ConfigMapEnvSource") proto.RegisterType((*ConfigMapKeySelector)(nil), "k8s.io.kubernetes.pkg.api.v1.ConfigMapKeySelector") proto.RegisterType((*ConfigMapList)(nil), "k8s.io.kubernetes.pkg.api.v1.ConfigMapList") + proto.RegisterType((*ConfigMapProjection)(nil), "k8s.io.kubernetes.pkg.api.v1.ConfigMapProjection") proto.RegisterType((*ConfigMapVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.ConfigMapVolumeSource") proto.RegisterType((*Container)(nil), "k8s.io.kubernetes.pkg.api.v1.Container") proto.RegisterType((*ContainerImage)(nil), "k8s.io.kubernetes.pkg.api.v1.ContainerImage") @@ -916,6 +942,7 @@ func init() { proto.RegisterType((*ContainerStatus)(nil), "k8s.io.kubernetes.pkg.api.v1.ContainerStatus") proto.RegisterType((*DaemonEndpoint)(nil), "k8s.io.kubernetes.pkg.api.v1.DaemonEndpoint") proto.RegisterType((*DeleteOptions)(nil), "k8s.io.kubernetes.pkg.api.v1.DeleteOptions") + proto.RegisterType((*DownwardAPIProjection)(nil), "k8s.io.kubernetes.pkg.api.v1.DownwardAPIProjection") proto.RegisterType((*DownwardAPIVolumeFile)(nil), "k8s.io.kubernetes.pkg.api.v1.DownwardAPIVolumeFile") proto.RegisterType((*DownwardAPIVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.DownwardAPIVolumeSource") proto.RegisterType((*EmptyDirVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.EmptyDirVolumeSource") @@ -1009,6 +1036,7 @@ func init() { proto.RegisterType((*PreferAvoidPodsEntry)(nil), "k8s.io.kubernetes.pkg.api.v1.PreferAvoidPodsEntry") proto.RegisterType((*PreferredSchedulingTerm)(nil), "k8s.io.kubernetes.pkg.api.v1.PreferredSchedulingTerm") proto.RegisterType((*Probe)(nil), "k8s.io.kubernetes.pkg.api.v1.Probe") + proto.RegisterType((*ProjectedVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.ProjectedVolumeSource") proto.RegisterType((*QuobyteVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.QuobyteVolumeSource") proto.RegisterType((*RBDVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.RBDVolumeSource") proto.RegisterType((*RangeAllocation)(nil), "k8s.io.kubernetes.pkg.api.v1.RangeAllocation") @@ -1028,6 +1056,7 @@ func init() { proto.RegisterType((*SecretEnvSource)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretEnvSource") proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretKeySelector") proto.RegisterType((*SecretList)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretList") + proto.RegisterType((*SecretProjection)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretProjection") proto.RegisterType((*SecretVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.SecretVolumeSource") proto.RegisterType((*SecurityContext)(nil), "k8s.io.kubernetes.pkg.api.v1.SecurityContext") proto.RegisterType((*SerializedReference)(nil), "k8s.io.kubernetes.pkg.api.v1.SerializedReference") @@ -1045,6 +1074,7 @@ func init() { proto.RegisterType((*Toleration)(nil), "k8s.io.kubernetes.pkg.api.v1.Toleration") proto.RegisterType((*Volume)(nil), "k8s.io.kubernetes.pkg.api.v1.Volume") proto.RegisterType((*VolumeMount)(nil), "k8s.io.kubernetes.pkg.api.v1.VolumeMount") + proto.RegisterType((*VolumeProjection)(nil), "k8s.io.kubernetes.pkg.api.v1.VolumeProjection") proto.RegisterType((*VolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.VolumeSource") proto.RegisterType((*VsphereVirtualDiskVolumeSource)(nil), "k8s.io.kubernetes.pkg.api.v1.VsphereVirtualDiskVolumeSource") proto.RegisterType((*WeightedPodAffinityTerm)(nil), "k8s.io.kubernetes.pkg.api.v1.WeightedPodAffinityTerm") @@ -1718,6 +1748,54 @@ func (m *ConfigMapList) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *ConfigMapProjection) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *ConfigMapProjection) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) + n13, err := m.LocalObjectReference.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n13 + if len(m.Items) > 0 { + for _, msg := range m.Items { + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Optional != nil { + data[i] = 0x20 + i++ + if *m.Optional { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } + return i, nil +} + func (m *ConfigMapVolumeSource) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -1736,11 +1814,11 @@ func (m *ConfigMapVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n13, err := m.LocalObjectReference.MarshalTo(data[i:]) + n14, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n13 + i += n14 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -1855,11 +1933,11 @@ func (m *Container) MarshalTo(data []byte) (int, error) { data[i] = 0x42 i++ i = encodeVarintGenerated(data, i, uint64(m.Resources.Size())) - n14, err := m.Resources.MarshalTo(data[i:]) + n15, err := m.Resources.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n14 + i += n15 if len(m.VolumeMounts) > 0 { for _, msg := range m.VolumeMounts { data[i] = 0x4a @@ -1876,32 +1954,32 @@ func (m *Container) MarshalTo(data []byte) (int, error) { data[i] = 0x52 i++ i = encodeVarintGenerated(data, i, uint64(m.LivenessProbe.Size())) - n15, err := m.LivenessProbe.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n15 - } - if m.ReadinessProbe != nil { - data[i] = 0x5a - i++ - i = encodeVarintGenerated(data, i, uint64(m.ReadinessProbe.Size())) - n16, err := m.ReadinessProbe.MarshalTo(data[i:]) + n16, err := m.LivenessProbe.MarshalTo(data[i:]) if err != nil { return 0, err } i += n16 } - if m.Lifecycle != nil { - data[i] = 0x62 + if m.ReadinessProbe != nil { + data[i] = 0x5a i++ - i = encodeVarintGenerated(data, i, uint64(m.Lifecycle.Size())) - n17, err := m.Lifecycle.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ReadinessProbe.Size())) + n17, err := m.ReadinessProbe.MarshalTo(data[i:]) if err != nil { return 0, err } i += n17 } + if m.Lifecycle != nil { + data[i] = 0x62 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Lifecycle.Size())) + n18, err := m.Lifecycle.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n18 + } data[i] = 0x6a i++ i = encodeVarintGenerated(data, i, uint64(len(m.TerminationMessagePath))) @@ -1914,11 +1992,11 @@ func (m *Container) MarshalTo(data []byte) (int, error) { data[i] = 0x7a i++ i = encodeVarintGenerated(data, i, uint64(m.SecurityContext.Size())) - n18, err := m.SecurityContext.MarshalTo(data[i:]) + n19, err := m.SecurityContext.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } data[i] = 0x80 i++ @@ -2064,32 +2142,32 @@ func (m *ContainerState) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Waiting.Size())) - n19, err := m.Waiting.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n19 - } - if m.Running != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Running.Size())) - n20, err := m.Running.MarshalTo(data[i:]) + n20, err := m.Waiting.MarshalTo(data[i:]) if err != nil { return 0, err } i += n20 } - if m.Terminated != nil { - data[i] = 0x1a + if m.Running != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Terminated.Size())) - n21, err := m.Terminated.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Running.Size())) + n21, err := m.Running.MarshalTo(data[i:]) if err != nil { return 0, err } i += n21 } + if m.Terminated != nil { + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Terminated.Size())) + n22, err := m.Terminated.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n22 + } return i, nil } @@ -2111,11 +2189,11 @@ func (m *ContainerStateRunning) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.StartedAt.Size())) - n22, err := m.StartedAt.MarshalTo(data[i:]) + n23, err := m.StartedAt.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n22 + i += n23 return i, nil } @@ -2151,19 +2229,19 @@ func (m *ContainerStateTerminated) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.StartedAt.Size())) - n23, err := m.StartedAt.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n23 - data[i] = 0x32 - i++ - i = encodeVarintGenerated(data, i, uint64(m.FinishedAt.Size())) - n24, err := m.FinishedAt.MarshalTo(data[i:]) + n24, err := m.StartedAt.MarshalTo(data[i:]) if err != nil { return 0, err } i += n24 + data[i] = 0x32 + i++ + i = encodeVarintGenerated(data, i, uint64(m.FinishedAt.Size())) + n25, err := m.FinishedAt.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n25 data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(len(m.ContainerID))) @@ -2219,19 +2297,19 @@ func (m *ContainerStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.State.Size())) - n25, err := m.State.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n25 - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTerminationState.Size())) - n26, err := m.LastTerminationState.MarshalTo(data[i:]) + n26, err := m.State.MarshalTo(data[i:]) if err != nil { return 0, err } i += n26 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTerminationState.Size())) + n27, err := m.LastTerminationState.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n27 data[i] = 0x20 i++ if m.Ready { @@ -2303,11 +2381,11 @@ func (m *DeleteOptions) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Preconditions.Size())) - n27, err := m.Preconditions.MarshalTo(data[i:]) + n28, err := m.Preconditions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n27 + i += n28 } if m.OrphanDependents != nil { data[i] = 0x18 @@ -2322,6 +2400,36 @@ func (m *DeleteOptions) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *DownwardAPIProjection) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *DownwardAPIProjection) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for _, msg := range m.Items { + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + func (m *DownwardAPIVolumeFile) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -2345,21 +2453,21 @@ func (m *DownwardAPIVolumeFile) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.FieldRef.Size())) - n28, err := m.FieldRef.MarshalTo(data[i:]) + n29, err := m.FieldRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n28 + i += n29 } if m.ResourceFieldRef != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.ResourceFieldRef.Size())) - n29, err := m.ResourceFieldRef.MarshalTo(data[i:]) + n30, err := m.ResourceFieldRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n29 + i += n30 } if m.Mode != nil { data[i] = 0x20 @@ -2449,11 +2557,11 @@ func (m *EndpointAddress) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.TargetRef.Size())) - n30, err := m.TargetRef.MarshalTo(data[i:]) + n31, err := m.TargetRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n30 + i += n31 } data[i] = 0x1a i++ @@ -2569,11 +2677,11 @@ func (m *Endpoints) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n31, err := m.ObjectMeta.MarshalTo(data[i:]) + n32, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n31 + i += n32 if len(m.Subsets) > 0 { for _, msg := range m.Subsets { data[i] = 0x12 @@ -2607,11 +2715,11 @@ func (m *EndpointsList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n32, err := m.ListMeta.MarshalTo(data[i:]) + n33, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n32 + i += n33 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -2650,21 +2758,21 @@ func (m *EnvFromSource) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMapRef.Size())) - n33, err := m.ConfigMapRef.MarshalTo(data[i:]) + n34, err := m.ConfigMapRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n33 + i += n34 } if m.SecretRef != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) - n34, err := m.SecretRef.MarshalTo(data[i:]) + n35, err := m.SecretRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n34 + i += n35 } return i, nil } @@ -2696,11 +2804,11 @@ func (m *EnvVar) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.ValueFrom.Size())) - n35, err := m.ValueFrom.MarshalTo(data[i:]) + n36, err := m.ValueFrom.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } return i, nil } @@ -2724,42 +2832,42 @@ func (m *EnvVarSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.FieldRef.Size())) - n36, err := m.FieldRef.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n36 - } - if m.ResourceFieldRef != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.ResourceFieldRef.Size())) - n37, err := m.ResourceFieldRef.MarshalTo(data[i:]) + n37, err := m.FieldRef.MarshalTo(data[i:]) if err != nil { return 0, err } i += n37 } - if m.ConfigMapKeyRef != nil { - data[i] = 0x1a + if m.ResourceFieldRef != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.ConfigMapKeyRef.Size())) - n38, err := m.ConfigMapKeyRef.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ResourceFieldRef.Size())) + n38, err := m.ResourceFieldRef.MarshalTo(data[i:]) if err != nil { return 0, err } i += n38 } - if m.SecretKeyRef != nil { - data[i] = 0x22 + if m.ConfigMapKeyRef != nil { + data[i] = 0x1a i++ - i = encodeVarintGenerated(data, i, uint64(m.SecretKeyRef.Size())) - n39, err := m.SecretKeyRef.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ConfigMapKeyRef.Size())) + n39, err := m.ConfigMapKeyRef.MarshalTo(data[i:]) if err != nil { return 0, err } i += n39 } + if m.SecretKeyRef != nil { + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(m.SecretKeyRef.Size())) + n40, err := m.SecretKeyRef.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n40 + } return i, nil } @@ -2781,19 +2889,19 @@ func (m *Event) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n40, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n40 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.InvolvedObject.Size())) - n41, err := m.InvolvedObject.MarshalTo(data[i:]) + n41, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n41 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.InvolvedObject.Size())) + n42, err := m.InvolvedObject.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n42 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -2805,27 +2913,27 @@ func (m *Event) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.Source.Size())) - n42, err := m.Source.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n42 - data[i] = 0x32 - i++ - i = encodeVarintGenerated(data, i, uint64(m.FirstTimestamp.Size())) - n43, err := m.FirstTimestamp.MarshalTo(data[i:]) + n43, err := m.Source.MarshalTo(data[i:]) if err != nil { return 0, err } i += n43 - data[i] = 0x3a + data[i] = 0x32 i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTimestamp.Size())) - n44, err := m.LastTimestamp.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.FirstTimestamp.Size())) + n44, err := m.FirstTimestamp.MarshalTo(data[i:]) if err != nil { return 0, err } i += n44 + data[i] = 0x3a + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTimestamp.Size())) + n45, err := m.LastTimestamp.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n45 data[i] = 0x40 i++ i = encodeVarintGenerated(data, i, uint64(m.Count)) @@ -2854,11 +2962,11 @@ func (m *EventList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n45, err := m.ListMeta.MarshalTo(data[i:]) + n46, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n45 + i += n46 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -3010,11 +3118,11 @@ func (m *FlexVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) - n46, err := m.SecretRef.MarshalTo(data[i:]) + n47, err := m.SecretRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } data[i] = 0x20 i++ @@ -3193,11 +3301,11 @@ func (m *HTTPGetAction) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Port.Size())) - n47, err := m.Port.MarshalTo(data[i:]) + n48, err := m.Port.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n47 + i += n48 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Host))) @@ -3266,32 +3374,32 @@ func (m *Handler) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Exec.Size())) - n48, err := m.Exec.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n48 - } - if m.HTTPGet != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.HTTPGet.Size())) - n49, err := m.HTTPGet.MarshalTo(data[i:]) + n49, err := m.Exec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n49 } - if m.TCPSocket != nil { - data[i] = 0x1a + if m.HTTPGet != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.TCPSocket.Size())) - n50, err := m.TCPSocket.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.HTTPGet.Size())) + n50, err := m.HTTPGet.MarshalTo(data[i:]) if err != nil { return 0, err } i += n50 } + if m.TCPSocket != nil { + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.TCPSocket.Size())) + n51, err := m.TCPSocket.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n51 + } return i, nil } @@ -3427,21 +3535,21 @@ func (m *Lifecycle) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PostStart.Size())) - n51, err := m.PostStart.MarshalTo(data[i:]) + n52, err := m.PostStart.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } if m.PreStop != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PreStop.Size())) - n52, err := m.PreStop.MarshalTo(data[i:]) + n53, err := m.PreStop.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } return i, nil } @@ -3464,19 +3572,19 @@ func (m *LimitRange) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n53, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n53 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n54, err := m.Spec.MarshalTo(data[i:]) + n54, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n54 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n55, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n55 return i, nil } @@ -3514,11 +3622,11 @@ func (m *LimitRangeItem) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n55, err := (&v).MarshalTo(data[i:]) + n56, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } } if len(m.Min) > 0 { @@ -3536,11 +3644,11 @@ func (m *LimitRangeItem) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n56, err := (&v).MarshalTo(data[i:]) + n57, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } } if len(m.Default) > 0 { @@ -3558,11 +3666,11 @@ func (m *LimitRangeItem) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n57, err := (&v).MarshalTo(data[i:]) + n58, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } } if len(m.DefaultRequest) > 0 { @@ -3580,11 +3688,11 @@ func (m *LimitRangeItem) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n58, err := (&v).MarshalTo(data[i:]) + n59, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n58 + i += n59 } } if len(m.MaxLimitRequestRatio) > 0 { @@ -3602,11 +3710,11 @@ func (m *LimitRangeItem) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n59, err := (&v).MarshalTo(data[i:]) + n60, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n59 + i += n60 } } return i, nil @@ -3630,11 +3738,11 @@ func (m *LimitRangeList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n60, err := m.ListMeta.MarshalTo(data[i:]) + n61, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n60 + i += n61 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -3698,11 +3806,11 @@ func (m *List) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n61, err := m.ListMeta.MarshalTo(data[i:]) + n62, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n61 + i += n62 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -3891,27 +3999,27 @@ func (m *Namespace) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n62, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n62 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n63, err := m.Spec.MarshalTo(data[i:]) + n63, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n63 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n64, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n64, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n64 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n65, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n65 return i, nil } @@ -3933,11 +4041,11 @@ func (m *NamespaceList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n65, err := m.ListMeta.MarshalTo(data[i:]) + n66, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n65 + i += n66 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -4026,27 +4134,27 @@ func (m *Node) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n66, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n66 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n67, err := m.Spec.MarshalTo(data[i:]) + n67, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n67 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n68, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n68, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n68 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n69, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n69 return i, nil } @@ -4095,11 +4203,11 @@ func (m *NodeAffinity) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.RequiredDuringSchedulingIgnoredDuringExecution.Size())) - n69, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(data[i:]) + n70, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n69 + i += n70 } if len(m.PreferredDuringSchedulingIgnoredDuringExecution) > 0 { for _, msg := range m.PreferredDuringSchedulingIgnoredDuringExecution { @@ -4142,19 +4250,19 @@ func (m *NodeCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastHeartbeatTime.Size())) - n70, err := m.LastHeartbeatTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n70 - data[i] = 0x22 - i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n71, err := m.LastTransitionTime.MarshalTo(data[i:]) + n71, err := m.LastHeartbeatTime.MarshalTo(data[i:]) if err != nil { return 0, err } i += n71 + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) + n72, err := m.LastTransitionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n72 data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -4184,11 +4292,11 @@ func (m *NodeDaemonEndpoints) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.KubeletEndpoint.Size())) - n72, err := m.KubeletEndpoint.MarshalTo(data[i:]) + n73, err := m.KubeletEndpoint.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n72 + i += n73 return i, nil } @@ -4210,11 +4318,11 @@ func (m *NodeList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n73, err := m.ListMeta.MarshalTo(data[i:]) + n74, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n73 + i += n74 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -4282,11 +4390,11 @@ func (m *NodeResources) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n74, err := (&v).MarshalTo(data[i:]) + n75, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n74 + i += n75 } } return i, nil @@ -4461,11 +4569,11 @@ func (m *NodeStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n75, err := (&v).MarshalTo(data[i:]) + n76, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n75 + i += n76 } } if len(m.Allocatable) > 0 { @@ -4483,11 +4591,11 @@ func (m *NodeStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n76, err := (&v).MarshalTo(data[i:]) + n77, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n76 + i += n77 } } data[i] = 0x1a @@ -4521,19 +4629,19 @@ func (m *NodeStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x32 i++ i = encodeVarintGenerated(data, i, uint64(m.DaemonEndpoints.Size())) - n77, err := m.DaemonEndpoints.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n77 - data[i] = 0x3a - i++ - i = encodeVarintGenerated(data, i, uint64(m.NodeInfo.Size())) - n78, err := m.NodeInfo.MarshalTo(data[i:]) + n78, err := m.DaemonEndpoints.MarshalTo(data[i:]) if err != nil { return 0, err } i += n78 + data[i] = 0x3a + i++ + i = encodeVarintGenerated(data, i, uint64(m.NodeInfo.Size())) + n79, err := m.NodeInfo.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n79 if len(m.Images) > 0 { for _, msg := range m.Images { data[i] = 0x42 @@ -4705,20 +4813,20 @@ func (m *ObjectMeta) MarshalTo(data []byte) (int, error) { data[i] = 0x42 i++ i = encodeVarintGenerated(data, i, uint64(m.CreationTimestamp.Size())) - n79, err := m.CreationTimestamp.MarshalTo(data[i:]) + n80, err := m.CreationTimestamp.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n79 + i += n80 if m.DeletionTimestamp != nil { data[i] = 0x4a i++ i = encodeVarintGenerated(data, i, uint64(m.DeletionTimestamp.Size())) - n80, err := m.DeletionTimestamp.MarshalTo(data[i:]) + n81, err := m.DeletionTimestamp.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n80 + i += n81 } if m.DeletionGracePeriodSeconds != nil { data[i] = 0x50 @@ -4857,27 +4965,27 @@ func (m *PersistentVolume) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n81, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n81 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n82, err := m.Spec.MarshalTo(data[i:]) + n82, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n82 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n83, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n83, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n83 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n84, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n84 return i, nil } @@ -4899,27 +5007,27 @@ func (m *PersistentVolumeClaim) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n84, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n84 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n85, err := m.Spec.MarshalTo(data[i:]) + n85, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n85 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n86, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n86, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n86 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n87, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n87 return i, nil } @@ -4941,11 +5049,11 @@ func (m *PersistentVolumeClaimList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n87, err := m.ListMeta.MarshalTo(data[i:]) + n88, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n87 + i += n88 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -4994,11 +5102,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Resources.Size())) - n88, err := m.Resources.MarshalTo(data[i:]) + n89, err := m.Resources.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n88 + i += n89 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.VolumeName))) @@ -5007,11 +5115,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.Selector.Size())) - n89, err := m.Selector.MarshalTo(data[i:]) + n90, err := m.Selector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n89 + i += n90 } return i, nil } @@ -5065,11 +5173,11 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n90, err := (&v).MarshalTo(data[i:]) + n91, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n90 + i += n91 } } return i, nil @@ -5123,11 +5231,11 @@ func (m *PersistentVolumeList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n91, err := m.ListMeta.MarshalTo(data[i:]) + n92, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n91 + i += n92 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -5162,163 +5270,163 @@ func (m *PersistentVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) - n92, err := m.GCEPersistentDisk.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n92 - } - if m.AWSElasticBlockStore != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) - n93, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) + n93, err := m.GCEPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } i += n93 } - if m.HostPath != nil { - data[i] = 0x1a + if m.AWSElasticBlockStore != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.HostPath.Size())) - n94, err := m.HostPath.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) + n94, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) if err != nil { return 0, err } i += n94 } - if m.Glusterfs != nil { - data[i] = 0x22 + if m.HostPath != nil { + data[i] = 0x1a i++ - i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) - n95, err := m.Glusterfs.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.HostPath.Size())) + n95, err := m.HostPath.MarshalTo(data[i:]) if err != nil { return 0, err } i += n95 } - if m.NFS != nil { - data[i] = 0x2a + if m.Glusterfs != nil { + data[i] = 0x22 i++ - i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) - n96, err := m.NFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) + n96, err := m.Glusterfs.MarshalTo(data[i:]) if err != nil { return 0, err } i += n96 } - if m.RBD != nil { - data[i] = 0x32 + if m.NFS != nil { + data[i] = 0x2a i++ - i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) - n97, err := m.RBD.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) + n97, err := m.NFS.MarshalTo(data[i:]) if err != nil { return 0, err } i += n97 } - if m.ISCSI != nil { - data[i] = 0x3a + if m.RBD != nil { + data[i] = 0x32 i++ - i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) - n98, err := m.ISCSI.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) + n98, err := m.RBD.MarshalTo(data[i:]) if err != nil { return 0, err } i += n98 } - if m.Cinder != nil { - data[i] = 0x42 + if m.ISCSI != nil { + data[i] = 0x3a i++ - i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) - n99, err := m.Cinder.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) + n99, err := m.ISCSI.MarshalTo(data[i:]) if err != nil { return 0, err } i += n99 } - if m.CephFS != nil { - data[i] = 0x4a + if m.Cinder != nil { + data[i] = 0x42 i++ - i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) - n100, err := m.CephFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) + n100, err := m.Cinder.MarshalTo(data[i:]) if err != nil { return 0, err } i += n100 } - if m.FC != nil { - data[i] = 0x52 + if m.CephFS != nil { + data[i] = 0x4a i++ - i = encodeVarintGenerated(data, i, uint64(m.FC.Size())) - n101, err := m.FC.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) + n101, err := m.CephFS.MarshalTo(data[i:]) if err != nil { return 0, err } i += n101 } - if m.Flocker != nil { - data[i] = 0x5a + if m.FC != nil { + data[i] = 0x52 i++ - i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) - n102, err := m.Flocker.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.FC.Size())) + n102, err := m.FC.MarshalTo(data[i:]) if err != nil { return 0, err } i += n102 } - if m.FlexVolume != nil { - data[i] = 0x62 + if m.Flocker != nil { + data[i] = 0x5a i++ - i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) - n103, err := m.FlexVolume.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) + n103, err := m.Flocker.MarshalTo(data[i:]) if err != nil { return 0, err } i += n103 } - if m.AzureFile != nil { - data[i] = 0x6a + if m.FlexVolume != nil { + data[i] = 0x62 i++ - i = encodeVarintGenerated(data, i, uint64(m.AzureFile.Size())) - n104, err := m.AzureFile.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) + n104, err := m.FlexVolume.MarshalTo(data[i:]) if err != nil { return 0, err } i += n104 } - if m.VsphereVolume != nil { - data[i] = 0x72 + if m.AzureFile != nil { + data[i] = 0x6a i++ - i = encodeVarintGenerated(data, i, uint64(m.VsphereVolume.Size())) - n105, err := m.VsphereVolume.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.AzureFile.Size())) + n105, err := m.AzureFile.MarshalTo(data[i:]) if err != nil { return 0, err } i += n105 } - if m.Quobyte != nil { - data[i] = 0x7a + if m.VsphereVolume != nil { + data[i] = 0x72 i++ - i = encodeVarintGenerated(data, i, uint64(m.Quobyte.Size())) - n106, err := m.Quobyte.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.VsphereVolume.Size())) + n106, err := m.VsphereVolume.MarshalTo(data[i:]) if err != nil { return 0, err } i += n106 } + if m.Quobyte != nil { + data[i] = 0x7a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Quobyte.Size())) + n107, err := m.Quobyte.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n107 + } if m.AzureDisk != nil { data[i] = 0x82 i++ data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureDisk.Size())) - n107, err := m.AzureDisk.MarshalTo(data[i:]) + n108, err := m.AzureDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n107 + i += n108 } if m.PhotonPersistentDisk != nil { data[i] = 0x8a @@ -5326,11 +5434,11 @@ func (m *PersistentVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PhotonPersistentDisk.Size())) - n108, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) + n109, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n108 + i += n109 } return i, nil } @@ -5365,21 +5473,21 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n109, err := (&v).MarshalTo(data[i:]) + n110, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n109 + i += n110 } } data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeSource.Size())) - n110, err := m.PersistentVolumeSource.MarshalTo(data[i:]) + n111, err := m.PersistentVolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n110 + i += n111 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { data[i] = 0x1a @@ -5399,11 +5507,11 @@ func (m *PersistentVolumeSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.ClaimRef.Size())) - n111, err := m.ClaimRef.MarshalTo(data[i:]) + n112, err := m.ClaimRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n111 + i += n112 } data[i] = 0x2a i++ @@ -5486,27 +5594,27 @@ func (m *Pod) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n112, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n112 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n113, err := m.Spec.MarshalTo(data[i:]) + n113, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n113 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n114, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n114, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n114 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n115, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n115 return i, nil } @@ -5571,11 +5679,11 @@ func (m *PodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LabelSelector.Size())) - n115, err := m.LabelSelector.MarshalTo(data[i:]) + n116, err := m.LabelSelector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n115 + i += n116 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -5721,19 +5829,19 @@ func (m *PodCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastProbeTime.Size())) - n116, err := m.LastProbeTime.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n116 - data[i] = 0x22 - i++ - i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n117, err := m.LastTransitionTime.MarshalTo(data[i:]) + n117, err := m.LastProbeTime.MarshalTo(data[i:]) if err != nil { return 0, err } i += n117 + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) + n118, err := m.LastTransitionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n118 data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -5832,11 +5940,11 @@ func (m *PodList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n118, err := m.ListMeta.MarshalTo(data[i:]) + n119, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n118 + i += n119 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -5896,11 +6004,11 @@ func (m *PodLogOptions) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.SinceTime.Size())) - n119, err := m.SinceTime.MarshalTo(data[i:]) + n120, err := m.SinceTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n119 + i += n120 } data[i] = 0x30 i++ @@ -5989,11 +6097,11 @@ func (m *PodSecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n120, err := m.SELinuxOptions.MarshalTo(data[i:]) + n121, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n120 + i += n121 } if m.RunAsUser != nil { data[i] = 0x10 @@ -6044,11 +6152,11 @@ func (m *PodSignature) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodController.Size())) - n121, err := m.PodController.MarshalTo(data[i:]) + n122, err := m.PodController.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n121 + i += n122 } return i, nil } @@ -6167,11 +6275,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x72 i++ i = encodeVarintGenerated(data, i, uint64(m.SecurityContext.Size())) - n122, err := m.SecurityContext.MarshalTo(data[i:]) + n123, err := m.SecurityContext.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n122 + i += n123 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6203,11 +6311,11 @@ func (m *PodSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Affinity.Size())) - n123, err := m.Affinity.MarshalTo(data[i:]) + n124, err := m.Affinity.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n123 + i += n124 } data[i] = 0x9a i++ @@ -6295,11 +6403,11 @@ func (m *PodStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.StartTime.Size())) - n124, err := m.StartTime.MarshalTo(data[i:]) + n125, err := m.StartTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n124 + i += n125 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -6350,19 +6458,19 @@ func (m *PodStatusResult) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n125, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n125 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n126, err := m.Status.MarshalTo(data[i:]) + n126, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n126 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n127, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n127 return i, nil } @@ -6384,19 +6492,19 @@ func (m *PodTemplate) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n127, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n127 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n128, err := m.Template.MarshalTo(data[i:]) + n128, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n128 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) + n129, err := m.Template.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n129 return i, nil } @@ -6418,11 +6526,11 @@ func (m *PodTemplateList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n129, err := m.ListMeta.MarshalTo(data[i:]) + n130, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n129 + i += n130 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6456,19 +6564,19 @@ func (m *PodTemplateSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n130, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n130 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n131, err := m.Spec.MarshalTo(data[i:]) + n131, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n131 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n132, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n132 return i, nil } @@ -6514,19 +6622,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.PodSignature.Size())) - n132, err := m.PodSignature.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n132 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) - n133, err := m.EvictionTime.MarshalTo(data[i:]) + n133, err := m.PodSignature.MarshalTo(data[i:]) if err != nil { return 0, err } i += n133 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.EvictionTime.Size())) + n134, err := m.EvictionTime.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n134 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -6559,11 +6667,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Preference.Size())) - n134, err := m.Preference.MarshalTo(data[i:]) + n135, err := m.Preference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n134 + i += n135 return i, nil } @@ -6585,11 +6693,11 @@ func (m *Probe) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Handler.Size())) - n135, err := m.Handler.MarshalTo(data[i:]) + n136, err := m.Handler.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n135 + i += n136 data[i] = 0x10 i++ i = encodeVarintGenerated(data, i, uint64(m.InitialDelaySeconds)) @@ -6608,6 +6716,41 @@ func (m *Probe) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *ProjectedVolumeSource) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *ProjectedVolumeSource) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Sources) > 0 { + for _, msg := range m.Sources { + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.DefaultMode != nil { + data[i] = 0x10 + i++ + i = encodeVarintGenerated(data, i, uint64(*m.DefaultMode)) + } + return i, nil +} + func (m *QuobyteVolumeSource) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -6704,11 +6847,11 @@ func (m *RBDVolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.SecretRef.Size())) - n136, err := m.SecretRef.MarshalTo(data[i:]) + n137, err := m.SecretRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n136 + i += n137 } data[i] = 0x40 i++ @@ -6739,11 +6882,11 @@ func (m *RangeAllocation) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n137, err := m.ObjectMeta.MarshalTo(data[i:]) + n138, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n137 + i += n138 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Range))) @@ -6775,27 +6918,27 @@ func (m *ReplicationController) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n138, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n138 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n139, err := m.Spec.MarshalTo(data[i:]) + n139, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n139 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n140, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n140, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n140 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n141, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n141 return i, nil } @@ -6825,11 +6968,11 @@ func (m *ReplicationControllerCondition) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.LastTransitionTime.Size())) - n141, err := m.LastTransitionTime.MarshalTo(data[i:]) + n142, err := m.LastTransitionTime.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n141 + i += n142 data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Reason))) @@ -6859,11 +7002,11 @@ func (m *ReplicationControllerList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n142, err := m.ListMeta.MarshalTo(data[i:]) + n143, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n142 + i += n143 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -6920,11 +7063,11 @@ func (m *ReplicationControllerSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Template.Size())) - n143, err := m.Template.MarshalTo(data[i:]) + n144, err := m.Template.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n143 + i += n144 } data[i] = 0x20 i++ @@ -7003,11 +7146,11 @@ func (m *ResourceFieldSelector) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Divisor.Size())) - n144, err := m.Divisor.MarshalTo(data[i:]) + n145, err := m.Divisor.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n144 + i += n145 return i, nil } @@ -7029,27 +7172,27 @@ func (m *ResourceQuota) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n145, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n145 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n146, err := m.Spec.MarshalTo(data[i:]) + n146, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n146 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n147, err := m.Status.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n147, err := m.Spec.MarshalTo(data[i:]) if err != nil { return 0, err } i += n147 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n148, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n148 return i, nil } @@ -7071,11 +7214,11 @@ func (m *ResourceQuotaList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n148, err := m.ListMeta.MarshalTo(data[i:]) + n149, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n148 + i += n149 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7121,11 +7264,11 @@ func (m *ResourceQuotaSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n149, err := (&v).MarshalTo(data[i:]) + n150, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n149 + i += n150 } } if len(m.Scopes) > 0 { @@ -7176,11 +7319,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n150, err := (&v).MarshalTo(data[i:]) + n151, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n150 + i += n151 } } if len(m.Used) > 0 { @@ -7198,11 +7341,11 @@ func (m *ResourceQuotaStatus) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n151, err := (&v).MarshalTo(data[i:]) + n152, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n151 + i += n152 } } return i, nil @@ -7238,11 +7381,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n152, err := (&v).MarshalTo(data[i:]) + n153, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n152 + i += n153 } } if len(m.Requests) > 0 { @@ -7260,11 +7403,11 @@ func (m *ResourceRequirements) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64((&v).Size())) - n153, err := (&v).MarshalTo(data[i:]) + n154, err := (&v).MarshalTo(data[i:]) if err != nil { return 0, err } - i += n153 + i += n154 } } return i, nil @@ -7322,11 +7465,11 @@ func (m *Secret) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n154, err := m.ObjectMeta.MarshalTo(data[i:]) + n155, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n154 + i += n155 if len(m.Data) > 0 { for k := range m.Data { data[i] = 0x12 @@ -7386,11 +7529,11 @@ func (m *SecretEnvSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n155, err := m.LocalObjectReference.MarshalTo(data[i:]) + n156, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n155 + i += n156 if m.Optional != nil { data[i] = 0x10 i++ @@ -7422,11 +7565,11 @@ func (m *SecretKeySelector) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) - n156, err := m.LocalObjectReference.MarshalTo(data[i:]) + n157, err := m.LocalObjectReference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n156 + i += n157 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Key))) @@ -7462,11 +7605,11 @@ func (m *SecretList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n157, err := m.ListMeta.MarshalTo(data[i:]) + n158, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n157 + i += n158 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7482,6 +7625,54 @@ func (m *SecretList) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *SecretProjection) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *SecretProjection) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(m.LocalObjectReference.Size())) + n159, err := m.LocalObjectReference.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n159 + if len(m.Items) > 0 { + for _, msg := range m.Items { + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Optional != nil { + data[i] = 0x20 + i++ + if *m.Optional { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } + return i, nil +} + func (m *SecretVolumeSource) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -7550,11 +7741,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Capabilities.Size())) - n158, err := m.Capabilities.MarshalTo(data[i:]) + n160, err := m.Capabilities.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n158 + i += n160 } if m.Privileged != nil { data[i] = 0x10 @@ -7570,11 +7761,11 @@ func (m *SecurityContext) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SELinuxOptions.Size())) - n159, err := m.SELinuxOptions.MarshalTo(data[i:]) + n161, err := m.SELinuxOptions.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n159 + i += n161 } if m.RunAsUser != nil { data[i] = 0x20 @@ -7622,11 +7813,11 @@ func (m *SerializedReference) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Reference.Size())) - n160, err := m.Reference.MarshalTo(data[i:]) + n162, err := m.Reference.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n160 + i += n162 return i, nil } @@ -7648,27 +7839,27 @@ func (m *Service) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n161, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n161 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n162, err := m.Spec.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n162 - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n163, err := m.Status.MarshalTo(data[i:]) + n163, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n163 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n164, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n164 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n165, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n165 return i, nil } @@ -7690,11 +7881,11 @@ func (m *ServiceAccount) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n164, err := m.ObjectMeta.MarshalTo(data[i:]) + n166, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n164 + i += n166 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { data[i] = 0x12 @@ -7750,11 +7941,11 @@ func (m *ServiceAccountList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n165, err := m.ListMeta.MarshalTo(data[i:]) + n167, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n165 + i += n167 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7788,11 +7979,11 @@ func (m *ServiceList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n166, err := m.ListMeta.MarshalTo(data[i:]) + n168, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n166 + i += n168 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -7837,11 +8028,11 @@ func (m *ServicePort) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TargetPort.Size())) - n167, err := m.TargetPort.MarshalTo(data[i:]) + n169, err := m.TargetPort.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n167 + i += n169 data[i] = 0x28 i++ i = encodeVarintGenerated(data, i, uint64(m.NodePort)) @@ -8000,11 +8191,11 @@ func (m *ServiceStatus) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.LoadBalancer.Size())) - n168, err := m.LoadBalancer.MarshalTo(data[i:]) + n170, err := m.LoadBalancer.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n168 + i += n170 return i, nil } @@ -8052,11 +8243,11 @@ func (m *TCPSocketAction) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Port.Size())) - n169, err := m.Port.MarshalTo(data[i:]) + n171, err := m.Port.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n169 + i += n171 return i, nil } @@ -8090,11 +8281,11 @@ func (m *Taint) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.TimeAdded.Size())) - n170, err := m.TimeAdded.MarshalTo(data[i:]) + n172, err := m.TimeAdded.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n170 + i += n172 return i, nil } @@ -8159,11 +8350,11 @@ func (m *Volume) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.VolumeSource.Size())) - n171, err := m.VolumeSource.MarshalTo(data[i:]) + n173, err := m.VolumeSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n171 + i += n173 return i, nil } @@ -8205,6 +8396,54 @@ func (m *VolumeMount) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *VolumeProjection) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *VolumeProjection) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Secret != nil { + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) + n174, err := m.Secret.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n174 + } + if m.DownwardAPI != nil { + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) + n175, err := m.DownwardAPI.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n175 + } + if m.ConfigMap != nil { + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) + n176, err := m.ConfigMap.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n176 + } + return i, nil +} + func (m *VolumeSource) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -8224,163 +8463,163 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.HostPath.Size())) - n172, err := m.HostPath.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n172 - } - if m.EmptyDir != nil { - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) - n173, err := m.EmptyDir.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n173 - } - if m.GCEPersistentDisk != nil { - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) - n174, err := m.GCEPersistentDisk.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n174 - } - if m.AWSElasticBlockStore != nil { - data[i] = 0x22 - i++ - i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) - n175, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n175 - } - if m.GitRepo != nil { - data[i] = 0x2a - i++ - i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) - n176, err := m.GitRepo.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n176 - } - if m.Secret != nil { - data[i] = 0x32 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n177, err := m.Secret.MarshalTo(data[i:]) + n177, err := m.HostPath.MarshalTo(data[i:]) if err != nil { return 0, err } i += n177 } - if m.NFS != nil { - data[i] = 0x3a + if m.EmptyDir != nil { + data[i] = 0x12 i++ - i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) - n178, err := m.NFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.EmptyDir.Size())) + n178, err := m.EmptyDir.MarshalTo(data[i:]) if err != nil { return 0, err } i += n178 } - if m.ISCSI != nil { - data[i] = 0x42 + if m.GCEPersistentDisk != nil { + data[i] = 0x1a i++ - i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) - n179, err := m.ISCSI.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GCEPersistentDisk.Size())) + n179, err := m.GCEPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } i += n179 } - if m.Glusterfs != nil { - data[i] = 0x4a + if m.AWSElasticBlockStore != nil { + data[i] = 0x22 i++ - i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) - n180, err := m.Glusterfs.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.AWSElasticBlockStore.Size())) + n180, err := m.AWSElasticBlockStore.MarshalTo(data[i:]) if err != nil { return 0, err } i += n180 } - if m.PersistentVolumeClaim != nil { - data[i] = 0x52 + if m.GitRepo != nil { + data[i] = 0x2a i++ - i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) - n181, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.GitRepo.Size())) + n181, err := m.GitRepo.MarshalTo(data[i:]) if err != nil { return 0, err } i += n181 } - if m.RBD != nil { - data[i] = 0x5a + if m.Secret != nil { + data[i] = 0x32 i++ - i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) - n182, err := m.RBD.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) + n182, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } i += n182 } - if m.FlexVolume != nil { - data[i] = 0x62 + if m.NFS != nil { + data[i] = 0x3a i++ - i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) - n183, err := m.FlexVolume.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.NFS.Size())) + n183, err := m.NFS.MarshalTo(data[i:]) if err != nil { return 0, err } i += n183 } - if m.Cinder != nil { - data[i] = 0x6a + if m.ISCSI != nil { + data[i] = 0x42 i++ - i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) - n184, err := m.Cinder.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.ISCSI.Size())) + n184, err := m.ISCSI.MarshalTo(data[i:]) if err != nil { return 0, err } i += n184 } - if m.CephFS != nil { - data[i] = 0x72 + if m.Glusterfs != nil { + data[i] = 0x4a i++ - i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) - n185, err := m.CephFS.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.Glusterfs.Size())) + n185, err := m.Glusterfs.MarshalTo(data[i:]) if err != nil { return 0, err } i += n185 } - if m.Flocker != nil { - data[i] = 0x7a + if m.PersistentVolumeClaim != nil { + data[i] = 0x52 i++ - i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) - n186, err := m.Flocker.MarshalTo(data[i:]) + i = encodeVarintGenerated(data, i, uint64(m.PersistentVolumeClaim.Size())) + n186, err := m.PersistentVolumeClaim.MarshalTo(data[i:]) if err != nil { return 0, err } i += n186 } + if m.RBD != nil { + data[i] = 0x5a + i++ + i = encodeVarintGenerated(data, i, uint64(m.RBD.Size())) + n187, err := m.RBD.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n187 + } + if m.FlexVolume != nil { + data[i] = 0x62 + i++ + i = encodeVarintGenerated(data, i, uint64(m.FlexVolume.Size())) + n188, err := m.FlexVolume.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n188 + } + if m.Cinder != nil { + data[i] = 0x6a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Cinder.Size())) + n189, err := m.Cinder.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n189 + } + if m.CephFS != nil { + data[i] = 0x72 + i++ + i = encodeVarintGenerated(data, i, uint64(m.CephFS.Size())) + n190, err := m.CephFS.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n190 + } + if m.Flocker != nil { + data[i] = 0x7a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Flocker.Size())) + n191, err := m.Flocker.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n191 + } if m.DownwardAPI != nil { data[i] = 0x82 i++ data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.DownwardAPI.Size())) - n187, err := m.DownwardAPI.MarshalTo(data[i:]) + n192, err := m.DownwardAPI.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n187 + i += n192 } if m.FC != nil { data[i] = 0x8a @@ -8388,11 +8627,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.FC.Size())) - n188, err := m.FC.MarshalTo(data[i:]) + n193, err := m.FC.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n188 + i += n193 } if m.AzureFile != nil { data[i] = 0x92 @@ -8400,11 +8639,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureFile.Size())) - n189, err := m.AzureFile.MarshalTo(data[i:]) + n194, err := m.AzureFile.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n189 + i += n194 } if m.ConfigMap != nil { data[i] = 0x9a @@ -8412,11 +8651,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.ConfigMap.Size())) - n190, err := m.ConfigMap.MarshalTo(data[i:]) + n195, err := m.ConfigMap.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n190 + i += n195 } if m.VsphereVolume != nil { data[i] = 0xa2 @@ -8424,11 +8663,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.VsphereVolume.Size())) - n191, err := m.VsphereVolume.MarshalTo(data[i:]) + n196, err := m.VsphereVolume.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n191 + i += n196 } if m.Quobyte != nil { data[i] = 0xaa @@ -8436,11 +8675,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.Quobyte.Size())) - n192, err := m.Quobyte.MarshalTo(data[i:]) + n197, err := m.Quobyte.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n192 + i += n197 } if m.AzureDisk != nil { data[i] = 0xb2 @@ -8448,11 +8687,11 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.AzureDisk.Size())) - n193, err := m.AzureDisk.MarshalTo(data[i:]) + n198, err := m.AzureDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n193 + i += n198 } if m.PhotonPersistentDisk != nil { data[i] = 0xba @@ -8460,11 +8699,23 @@ func (m *VolumeSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1 i++ i = encodeVarintGenerated(data, i, uint64(m.PhotonPersistentDisk.Size())) - n194, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) + n199, err := m.PhotonPersistentDisk.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n194 + i += n199 + } + if m.Projected != nil { + data[i] = 0xc2 + i++ + data[i] = 0x1 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Projected.Size())) + n200, err := m.Projected.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n200 } return i, nil } @@ -8516,11 +8767,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PodAffinityTerm.Size())) - n195, err := m.PodAffinityTerm.MarshalTo(data[i:]) + n201, err := m.PodAffinityTerm.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n195 + i += n201 return i, nil } @@ -8793,6 +9044,23 @@ func (m *ConfigMapList) Size() (n int) { return n } +func (m *ConfigMapProjection) Size() (n int) { + var l int + _ = l + l = m.LocalObjectReference.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Optional != nil { + n += 2 + } + return n +} + func (m *ConfigMapVolumeSource) Size() (n int) { var l int _ = l @@ -9012,6 +9280,18 @@ func (m *DeleteOptions) Size() (n int) { return n } +func (m *DownwardAPIProjection) Size() (n int) { + var l int + _ = l + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *DownwardAPIVolumeFile) Size() (n int) { var l int _ = l @@ -10609,6 +10889,21 @@ func (m *Probe) Size() (n int) { return n } +func (m *ProjectedVolumeSource) Size() (n int) { + var l int + _ = l + if len(m.Sources) > 0 { + for _, e := range m.Sources { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.DefaultMode != nil { + n += 1 + sovGenerated(uint64(*m.DefaultMode)) + } + return n +} + func (m *QuobyteVolumeSource) Size() (n int) { var l int _ = l @@ -10931,6 +11226,23 @@ func (m *SecretList) Size() (n int) { return n } +func (m *SecretProjection) Size() (n int) { + var l int + _ = l + l = m.LocalObjectReference.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Optional != nil { + n += 2 + } + return n +} + func (m *SecretVolumeSource) Size() (n int) { var l int _ = l @@ -11198,6 +11510,24 @@ func (m *VolumeMount) Size() (n int) { return n } +func (m *VolumeProjection) Size() (n int) { + var l int + _ = l + if m.Secret != nil { + l = m.Secret.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.DownwardAPI != nil { + l = m.DownwardAPI.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ConfigMap != nil { + l = m.ConfigMap.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *VolumeSource) Size() (n int) { var l int _ = l @@ -11293,6 +11623,10 @@ func (m *VolumeSource) Size() (n int) { l = m.PhotonPersistentDisk.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.Projected != nil { + l = m.Projected.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -11539,6 +11873,18 @@ func (this *ConfigMapList) String() string { }, "") return s } +func (this *ConfigMapProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ConfigMapProjection{`, + `LocalObjectReference:` + strings.Replace(strings.Replace(this.LocalObjectReference.String(), "LocalObjectReference", "LocalObjectReference", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "KeyToPath", "KeyToPath", 1), `&`, ``, 1) + `,`, + `Optional:` + valueToStringGenerated(this.Optional) + `,`, + `}`, + }, "") + return s +} func (this *ConfigMapVolumeSource) String() string { if this == nil { return "nil" @@ -11694,6 +12040,16 @@ func (this *DeleteOptions) String() string { }, "") return s } +func (this *DownwardAPIProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DownwardAPIProjection{`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "DownwardAPIVolumeFile", "DownwardAPIVolumeFile", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *DownwardAPIVolumeFile) String() string { if this == nil { return "nil" @@ -13006,6 +13362,17 @@ func (this *Probe) String() string { }, "") return s } +func (this *ProjectedVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ProjectedVolumeSource{`, + `Sources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Sources), "VolumeProjection", "VolumeProjection", 1), `&`, ``, 1) + `,`, + `DefaultMode:` + valueToStringGenerated(this.DefaultMode) + `,`, + `}`, + }, "") + return s +} func (this *QuobyteVolumeSource) String() string { if this == nil { return "nil" @@ -13322,6 +13689,18 @@ func (this *SecretList) String() string { }, "") return s } +func (this *SecretProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretProjection{`, + `LocalObjectReference:` + strings.Replace(strings.Replace(this.LocalObjectReference.String(), "LocalObjectReference", "LocalObjectReference", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "KeyToPath", "KeyToPath", 1), `&`, ``, 1) + `,`, + `Optional:` + valueToStringGenerated(this.Optional) + `,`, + `}`, + }, "") + return s +} func (this *SecretVolumeSource) String() string { if this == nil { return "nil" @@ -13542,6 +13921,18 @@ func (this *VolumeMount) String() string { }, "") return s } +func (this *VolumeProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VolumeProjection{`, + `Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "SecretProjection", "SecretProjection", 1) + `,`, + `DownwardAPI:` + strings.Replace(fmt.Sprintf("%v", this.DownwardAPI), "DownwardAPIProjection", "DownwardAPIProjection", 1) + `,`, + `ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapProjection", "ConfigMapProjection", 1) + `,`, + `}`, + }, "") + return s +} func (this *VolumeSource) String() string { if this == nil { return "nil" @@ -13570,6 +13961,7 @@ func (this *VolumeSource) String() string { `Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`, `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, `PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`, + `Projected:` + strings.Replace(fmt.Sprintf("%v", this.Projected), "ProjectedVolumeSource", "ProjectedVolumeSource", 1) + `,`, `}`, }, "") return s @@ -15892,6 +16284,138 @@ func (m *ConfigMapList) Unmarshal(data []byte) error { } return nil } +func (m *ConfigMapProjection) 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: ConfigMapProjection: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigMapProjection: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.LocalObjectReference.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, KeyToPath{}) + if err := m.Items[len(m.Items)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Optional = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ConfigMapVolumeSource) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -17975,6 +18499,87 @@ func (m *DeleteOptions) Unmarshal(data []byte) error { } return nil } +func (m *DownwardAPIProjection) 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: DownwardAPIProjection: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DownwardAPIProjection: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, DownwardAPIVolumeFile{}) + if err := m.Items[len(m.Items)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *DownwardAPIVolumeFile) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -33376,6 +33981,107 @@ func (m *Probe) Unmarshal(data []byte) error { } return nil } +func (m *ProjectedVolumeSource) 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: ProjectedVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProjectedVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sources", 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 > l { + return io.ErrUnexpectedEOF + } + m.Sources = append(m.Sources, VolumeProjection{}) + if err := m.Sources[len(m.Sources)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultMode", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DefaultMode = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QuobyteVolumeSource) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -36823,6 +37529,138 @@ func (m *SecretList) Unmarshal(data []byte) error { } return nil } +func (m *SecretProjection) 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: SecretProjection: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretProjection: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.LocalObjectReference.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, KeyToPath{}) + if err := m.Items[len(m.Items)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Optional = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SecretVolumeSource) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -39344,6 +40182,155 @@ func (m *VolumeMount) Unmarshal(data []byte) error { } return nil } +func (m *VolumeProjection) 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: VolumeProjection: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VolumeProjection: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Secret", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Secret == nil { + m.Secret = &SecretProjection{} + } + if err := m.Secret.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DownwardAPI", 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 > l { + return io.ErrUnexpectedEOF + } + if m.DownwardAPI == nil { + m.DownwardAPI = &DownwardAPIProjection{} + } + if err := m.DownwardAPI.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ConfigMap == nil { + m.ConfigMap = &ConfigMapProjection{} + } + if err := m.ConfigMap.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 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *VolumeSource) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -40132,6 +41119,39 @@ func (m *VolumeSource) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Projected", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Projected == nil { + m.Projected = &ProjectedVolumeSource{} + } + if err := m.Projected.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -40466,661 +41486,670 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10482 bytes of a gzipped FileDescriptorProto + // 10633 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x6c, 0x24, 0xc7, - 0x95, 0x18, 0xee, 0x9e, 0xe1, 0xd7, 0x3c, 0x7e, 0x6e, 0xed, 0xae, 0x44, 0xd1, 0xd2, 0x72, 0xd5, - 0xb2, 0xe4, 0x95, 0xb4, 0x22, 0xbd, 0x2b, 0xc9, 0x5a, 0x5b, 0xfe, 0xc9, 0x26, 0x39, 0xe4, 0x2e, - 0xbd, 0xcb, 0xdd, 0x51, 0x0d, 0x77, 0x57, 0xb6, 0xf5, 0xb3, 0xd4, 0x9c, 0x2e, 0x92, 0xad, 0xed, - 0xe9, 0x1e, 0x75, 0xf7, 0x70, 0x97, 0x76, 0x0c, 0xdc, 0xf9, 0x0c, 0x5f, 0x82, 0x38, 0x89, 0x83, - 0x83, 0x81, 0x20, 0x09, 0xe0, 0x43, 0x80, 0x04, 0xce, 0x5d, 0x82, 0xc4, 0x31, 0xce, 0xf6, 0x21, - 0xbe, 0x04, 0xb9, 0x9c, 0x2f, 0x3e, 0x20, 0xb9, 0x18, 0x38, 0x24, 0x77, 0xf9, 0xe2, 0x9d, 0xe9, - 0xe4, 0xfe, 0xcc, 0x1f, 0xb9, 0xff, 0x98, 0x20, 0x09, 0xea, 0xb3, 0xab, 0x7a, 0x66, 0xd8, 0x3d, - 0xd4, 0x92, 0x96, 0x0f, 0xf9, 0x6f, 0xe6, 0xbd, 0x57, 0xaf, 0x3e, 0xba, 0xea, 0xd5, 0x7b, 0xaf, - 0x5e, 0xbd, 0x82, 0x8b, 0xf7, 0xae, 0xc4, 0x73, 0x5e, 0x38, 0x7f, 0xaf, 0xbd, 0x41, 0xa2, 0x80, - 0x24, 0x24, 0x9e, 0x6f, 0xdd, 0xdb, 0x9a, 0x77, 0x5a, 0xde, 0xfc, 0xce, 0xa5, 0xf9, 0x2d, 0x12, - 0x90, 0xc8, 0x49, 0x88, 0x3b, 0xd7, 0x8a, 0xc2, 0x24, 0x44, 0x8f, 0x73, 0xea, 0xb9, 0x94, 0x7a, - 0xae, 0x75, 0x6f, 0x6b, 0xce, 0x69, 0x79, 0x73, 0x3b, 0x97, 0x66, 0x5e, 0xd8, 0xf2, 0x92, 0xed, - 0xf6, 0xc6, 0x5c, 0x23, 0x6c, 0xce, 0x6f, 0x85, 0x5b, 0xe1, 0x3c, 0x2b, 0xb4, 0xd1, 0xde, 0x64, - 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x33, 0x9b, 0x79, 0x49, 0x54, 0xed, 0xb4, 0xbc, 0xa6, 0xd3, 0xd8, - 0xf6, 0x02, 0x12, 0xed, 0xaa, 0xca, 0x23, 0x12, 0x87, 0xed, 0xa8, 0x41, 0xb2, 0x4d, 0x38, 0xb4, - 0x54, 0x3c, 0xdf, 0x24, 0x89, 0xd3, 0xa5, 0xe1, 0x33, 0xf3, 0xbd, 0x4a, 0x45, 0xed, 0x20, 0xf1, - 0x9a, 0x9d, 0xd5, 0x7c, 0x34, 0xaf, 0x40, 0xdc, 0xd8, 0x26, 0x4d, 0xa7, 0xa3, 0xdc, 0x8b, 0xbd, - 0xca, 0xb5, 0x13, 0xcf, 0x9f, 0xf7, 0x82, 0x24, 0x4e, 0xa2, 0xc3, 0xfa, 0x14, 0x93, 0x68, 0x87, - 0x44, 0x69, 0x87, 0xc8, 0x03, 0xa7, 0xd9, 0xf2, 0x49, 0x97, 0x3e, 0xd9, 0x7f, 0x68, 0xc1, 0xf9, - 0x85, 0xbb, 0xf5, 0x65, 0xdf, 0x89, 0x13, 0xaf, 0xb1, 0xe8, 0x87, 0x8d, 0x7b, 0xf5, 0x24, 0x8c, - 0xc8, 0x9d, 0xd0, 0x6f, 0x37, 0x49, 0x9d, 0x0d, 0x1f, 0xba, 0x08, 0x23, 0x3b, 0xec, 0xff, 0x6a, - 0x75, 0xda, 0x3a, 0x6f, 0x5d, 0xa8, 0x2c, 0x4e, 0xfd, 0x68, 0x6f, 0xf6, 0x03, 0xfb, 0x7b, 0xb3, - 0x23, 0x77, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0x0c, 0x0c, 0x6d, 0xc6, 0xeb, 0xbb, 0x2d, 0x32, 0x5d, - 0x62, 0xb4, 0x13, 0x82, 0x76, 0x68, 0xa5, 0x4e, 0xa1, 0x58, 0x60, 0xd1, 0x3c, 0x54, 0x5a, 0x4e, - 0x94, 0x78, 0x89, 0x17, 0x06, 0xd3, 0xe5, 0xf3, 0xd6, 0x85, 0xc1, 0xc5, 0x53, 0x82, 0xb4, 0x52, - 0x93, 0x08, 0x9c, 0xd2, 0xd0, 0x66, 0x44, 0xc4, 0x71, 0x6f, 0x05, 0xfe, 0xee, 0xf4, 0xc0, 0x79, - 0xeb, 0xc2, 0x48, 0xda, 0x0c, 0x2c, 0xe0, 0x58, 0x51, 0xd8, 0xdf, 0x2f, 0xc1, 0xc8, 0xc2, 0xe6, - 0xa6, 0x17, 0x78, 0xc9, 0x2e, 0x7a, 0x1b, 0xc6, 0x82, 0xd0, 0x25, 0xf2, 0x3f, 0xeb, 0xc5, 0xe8, - 0xe5, 0xe7, 0xe6, 0x0e, 0x9b, 0x8a, 0x73, 0x37, 0xb5, 0x12, 0x8b, 0x53, 0xfb, 0x7b, 0xb3, 0x63, - 0x3a, 0x04, 0x1b, 0x1c, 0xd1, 0x9b, 0x30, 0xda, 0x0a, 0x5d, 0x55, 0x41, 0x89, 0x55, 0xf0, 0xec, - 0xe1, 0x15, 0xd4, 0xd2, 0x02, 0x8b, 0x93, 0xfb, 0x7b, 0xb3, 0xa3, 0x1a, 0x00, 0xeb, 0xec, 0x90, - 0x0f, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0xaa, 0x86, 0x32, 0xab, 0xe1, 0x85, 0xfc, 0x1a, 0xb4, 0x42, - 0x8b, 0xa7, 0xf7, 0xf7, 0x66, 0x27, 0x33, 0x40, 0x9c, 0x65, 0x6d, 0x7f, 0x01, 0x26, 0x16, 0x92, - 0xc4, 0x69, 0x6c, 0x13, 0x97, 0x7f, 0x5f, 0xf4, 0x12, 0x0c, 0x04, 0x4e, 0x93, 0x88, 0xaf, 0x7f, - 0x5e, 0x0c, 0xfb, 0xc0, 0x4d, 0xa7, 0x49, 0x0e, 0xf6, 0x66, 0xa7, 0x6e, 0x07, 0xde, 0xbb, 0x6d, - 0x31, 0x67, 0x28, 0x0c, 0x33, 0x6a, 0x74, 0x19, 0xc0, 0x25, 0x3b, 0x5e, 0x83, 0xd4, 0x9c, 0x64, - 0x5b, 0xcc, 0x06, 0x24, 0xca, 0x42, 0x55, 0x61, 0xb0, 0x46, 0x65, 0x7f, 0xd9, 0x82, 0xca, 0xc2, - 0x4e, 0xe8, 0xb9, 0xb5, 0xd0, 0x8d, 0x51, 0x1b, 0x26, 0x5b, 0x11, 0xd9, 0x24, 0x91, 0x02, 0x4d, - 0x5b, 0xe7, 0xcb, 0x17, 0x46, 0x2f, 0x5f, 0xce, 0xe9, 0xb7, 0x59, 0x68, 0x39, 0x48, 0xa2, 0xdd, - 0xc5, 0x47, 0x45, 0xd5, 0x93, 0x19, 0x2c, 0xce, 0xd6, 0x61, 0xff, 0xf5, 0x12, 0x9c, 0x5d, 0xf8, - 0x42, 0x3b, 0x22, 0x55, 0x2f, 0xbe, 0x97, 0x5d, 0x0a, 0xae, 0x17, 0xdf, 0xbb, 0x99, 0x0e, 0x86, - 0x9a, 0x83, 0x55, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x00, 0xc3, 0xf4, 0xf7, 0x6d, 0xbc, 0x2a, 0x7a, - 0x7f, 0x5a, 0x10, 0x8f, 0x56, 0x9d, 0xc4, 0xa9, 0x72, 0x14, 0x96, 0x34, 0x68, 0x0d, 0x46, 0x1b, - 0x6c, 0xbd, 0x6f, 0xad, 0x85, 0x2e, 0x61, 0x5f, 0xb8, 0xb2, 0xf8, 0x3c, 0x25, 0x5f, 0x4a, 0xc1, - 0x07, 0x7b, 0xb3, 0xd3, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0x85, 0x38, - 0xc0, 0x38, 0x41, 0x97, 0x45, 0x78, 0x41, 0x5b, 0x53, 0x83, 0x6c, 0x4d, 0x8d, 0xf5, 0x58, 0x4f, - 0xbf, 0x66, 0x89, 0x31, 0x59, 0xf1, 0x7c, 0x53, 0x3c, 0x5c, 0x06, 0x88, 0x49, 0x23, 0x22, 0x89, - 0x36, 0x2a, 0xea, 0x33, 0xd7, 0x15, 0x06, 0x6b, 0x54, 0x74, 0xf1, 0xc7, 0xdb, 0x4e, 0xc4, 0x66, - 0x8b, 0x18, 0x1b, 0xb5, 0xf8, 0xeb, 0x12, 0x81, 0x53, 0x1a, 0x63, 0xf1, 0x97, 0x73, 0x17, 0xff, - 0x6f, 0x5b, 0x30, 0xbc, 0xe8, 0x05, 0xae, 0x17, 0x6c, 0xa1, 0xb7, 0x61, 0x84, 0x4a, 0x74, 0xd7, - 0x49, 0x1c, 0xb1, 0xee, 0x3f, 0x22, 0x27, 0x8f, 0x2e, 0x60, 0xe5, 0xf4, 0x89, 0xe7, 0x28, 0x35, - 0x9d, 0x44, 0xb7, 0x36, 0xde, 0x21, 0x8d, 0x64, 0x8d, 0x24, 0x4e, 0xda, 0x9d, 0x14, 0x86, 0x15, - 0x57, 0x74, 0x1b, 0x86, 0x12, 0x27, 0xda, 0x22, 0x89, 0x58, 0xf6, 0x39, 0x8b, 0x92, 0xf3, 0xc0, - 0x74, 0xca, 0x91, 0xa0, 0x41, 0x52, 0x01, 0xb9, 0xce, 0x98, 0x60, 0xc1, 0xcc, 0x6e, 0xc0, 0xd8, - 0x92, 0xd3, 0x72, 0x36, 0x3c, 0xdf, 0x4b, 0x3c, 0x12, 0xa3, 0x0f, 0x43, 0xd9, 0x71, 0x5d, 0xb6, - 0x00, 0x2a, 0x8b, 0x67, 0xf7, 0xf7, 0x66, 0xcb, 0x0b, 0xae, 0x7b, 0xb0, 0x37, 0x0b, 0x8a, 0x6a, - 0x17, 0x53, 0x0a, 0xf4, 0x1c, 0x0c, 0xb8, 0x51, 0xd8, 0x9a, 0x2e, 0x31, 0xca, 0x47, 0xe8, 0x4a, - 0xad, 0x46, 0x61, 0x2b, 0x43, 0xca, 0x68, 0xec, 0x1f, 0x96, 0x00, 0x2d, 0x91, 0xd6, 0xf6, 0x4a, - 0xdd, 0xf8, 0xa6, 0x17, 0x60, 0xa4, 0x19, 0x06, 0x5e, 0x12, 0x46, 0xb1, 0xa8, 0x90, 0xcd, 0x8b, - 0x35, 0x01, 0xc3, 0x0a, 0x8b, 0xce, 0xc3, 0x40, 0x2b, 0x5d, 0xde, 0x63, 0x52, 0x34, 0xb0, 0x85, - 0xcd, 0x30, 0x94, 0xa2, 0x1d, 0x93, 0x48, 0xcc, 0x67, 0x45, 0x71, 0x3b, 0x26, 0x11, 0x66, 0x98, - 0x74, 0x06, 0xd1, 0xb9, 0x25, 0x66, 0x6b, 0x66, 0x06, 0x51, 0x0c, 0xd6, 0xa8, 0xd0, 0x5b, 0x50, - 0xe1, 0xff, 0x30, 0xd9, 0x64, 0x53, 0x37, 0x57, 0x28, 0xdc, 0x08, 0x1b, 0x8e, 0x9f, 0x1d, 0xfc, - 0x71, 0x36, 0xe3, 0x24, 0x23, 0x9c, 0xf2, 0x34, 0x66, 0xdc, 0x50, 0xee, 0x8c, 0xfb, 0x1b, 0x16, - 0xa0, 0x25, 0x2f, 0x70, 0x49, 0x74, 0x02, 0x5b, 0x67, 0x7f, 0x8b, 0xe1, 0x3f, 0xd1, 0xa6, 0x85, - 0xcd, 0x56, 0x18, 0x90, 0x20, 0x59, 0x0a, 0x03, 0x97, 0x6f, 0xa7, 0x1f, 0x87, 0x81, 0x84, 0x56, - 0xc5, 0x9b, 0xf5, 0x8c, 0xfc, 0x2c, 0xb4, 0x82, 0x83, 0xbd, 0xd9, 0x47, 0x3a, 0x4b, 0xb0, 0x26, - 0xb0, 0x32, 0xe8, 0x63, 0x30, 0x14, 0x27, 0x4e, 0xd2, 0x8e, 0x45, 0x43, 0x9f, 0x94, 0x0d, 0xad, - 0x33, 0xe8, 0xc1, 0xde, 0xec, 0xa4, 0x2a, 0xc6, 0x41, 0x58, 0x14, 0x40, 0xcf, 0xc2, 0x70, 0x93, - 0xc4, 0xb1, 0xb3, 0x25, 0x05, 0xdc, 0xa4, 0x28, 0x3b, 0xbc, 0xc6, 0xc1, 0x58, 0xe2, 0xd1, 0x53, - 0x30, 0x48, 0xa2, 0x28, 0x8c, 0xc4, 0x8c, 0x18, 0x17, 0x84, 0x83, 0xcb, 0x14, 0x88, 0x39, 0xce, - 0xfe, 0x0f, 0x16, 0x4c, 0xaa, 0xb6, 0xf2, 0xba, 0x4e, 0x60, 0xc9, 0xbb, 0x00, 0x0d, 0xd9, 0xc1, - 0x98, 0x2d, 0x34, 0xad, 0x8e, 0xee, 0xd3, 0xaf, 0x73, 0x40, 0xd3, 0x3a, 0x14, 0x28, 0xc6, 0x1a, - 0x5f, 0xfb, 0x5f, 0x59, 0x70, 0x3a, 0xd3, 0xb7, 0x1b, 0x5e, 0x9c, 0xa0, 0x37, 0x3b, 0xfa, 0x37, - 0x57, 0xac, 0x7f, 0xb4, 0x34, 0xeb, 0x9d, 0x9a, 0x2f, 0x12, 0xa2, 0xf5, 0x0d, 0xc3, 0xa0, 0x97, - 0x90, 0xa6, 0xec, 0xd6, 0x0b, 0x05, 0xbb, 0xc5, 0xdb, 0x97, 0x7e, 0xa5, 0x55, 0xca, 0x03, 0x73, - 0x56, 0xf6, 0xff, 0xb4, 0xa0, 0xb2, 0x14, 0x06, 0x9b, 0xde, 0xd6, 0x9a, 0xd3, 0x3a, 0x81, 0xef, - 0x53, 0x87, 0x01, 0xc6, 0x9d, 0x77, 0xe1, 0x52, 0x5e, 0x17, 0x44, 0xc3, 0xe6, 0xe8, 0x9e, 0xca, - 0x95, 0x05, 0x25, 0xa6, 0x28, 0x08, 0x33, 0x66, 0x33, 0xaf, 0x40, 0x45, 0x11, 0xa0, 0x29, 0x28, - 0xdf, 0x23, 0x5c, 0x93, 0xac, 0x60, 0xfa, 0x13, 0x9d, 0x81, 0xc1, 0x1d, 0xc7, 0x6f, 0x8b, 0xc5, - 0x8b, 0xf9, 0x9f, 0x8f, 0x97, 0xae, 0x58, 0xf6, 0x0f, 0xd9, 0x0a, 0x14, 0x95, 0x2c, 0x07, 0x3b, - 0x42, 0x38, 0x7c, 0xc5, 0x82, 0x33, 0x7e, 0x17, 0xa1, 0x24, 0xc6, 0xe4, 0x28, 0xe2, 0xec, 0x71, - 0xd1, 0xec, 0x33, 0xdd, 0xb0, 0xb8, 0x6b, 0x6d, 0x54, 0xd6, 0x87, 0x2d, 0x3a, 0xe1, 0x1c, 0x9f, - 0x35, 0x5d, 0xe8, 0x00, 0xb7, 0x04, 0x0c, 0x2b, 0xac, 0xfd, 0xa7, 0x16, 0x9c, 0x51, 0xfd, 0xb8, - 0x4e, 0x76, 0xeb, 0xc4, 0x27, 0x8d, 0x24, 0x8c, 0xde, 0x2f, 0x3d, 0x79, 0x82, 0x7f, 0x13, 0x2e, - 0x93, 0x46, 0x05, 0x83, 0xf2, 0x75, 0xb2, 0xcb, 0x3f, 0x90, 0xde, 0xd1, 0xf2, 0xa1, 0x1d, 0xfd, - 0xa7, 0x16, 0x8c, 0xab, 0x8e, 0x9e, 0xc0, 0x92, 0xbb, 0x61, 0x2e, 0xb9, 0x0f, 0x17, 0x9c, 0xaf, - 0x3d, 0x16, 0xdb, 0xef, 0x95, 0xe0, 0xac, 0xa2, 0x31, 0xb6, 0xa3, 0xf7, 0xc9, 0x77, 0xea, 0xaf, - 0xbb, 0xd7, 0xc9, 0xee, 0x7a, 0x48, 0xf5, 0x89, 0xee, 0xdd, 0x45, 0x97, 0x60, 0xd4, 0x25, 0x9b, - 0x4e, 0xdb, 0x4f, 0x94, 0xda, 0x3c, 0xc8, 0xed, 0xa9, 0x6a, 0x0a, 0xc6, 0x3a, 0x8d, 0x31, 0x13, - 0x06, 0x0e, 0x9d, 0x09, 0xdf, 0x1c, 0x65, 0x82, 0x2b, 0x71, 0xe8, 0xe7, 0xa5, 0xaa, 0x8c, 0x66, - 0x07, 0x8d, 0xe9, 0x76, 0x90, 0xb0, 0x79, 0x9e, 0x82, 0x41, 0xaf, 0x49, 0x37, 0xb7, 0x92, 0xb9, - 0x67, 0xad, 0x52, 0x20, 0xe6, 0x38, 0xf4, 0x34, 0x0c, 0x37, 0xc2, 0x66, 0xd3, 0x09, 0xdc, 0xe9, - 0x32, 0x53, 0xae, 0x46, 0xe9, 0xfe, 0xb7, 0xc4, 0x41, 0x58, 0xe2, 0xd0, 0xe3, 0x30, 0xe0, 0x44, - 0x5b, 0xf1, 0xf4, 0x00, 0xa3, 0x19, 0xa1, 0x35, 0x2d, 0x44, 0x5b, 0x31, 0x66, 0x50, 0xaa, 0x34, - 0xdd, 0x0f, 0xa3, 0x7b, 0x5e, 0xb0, 0x55, 0xf5, 0x22, 0xa6, 0x01, 0x69, 0x4a, 0xd3, 0x5d, 0x85, - 0xc1, 0x1a, 0x15, 0xaa, 0xc1, 0x60, 0x2b, 0x8c, 0x92, 0x78, 0x7a, 0x88, 0x0d, 0xfc, 0xf3, 0xb9, - 0xf3, 0x8c, 0xf7, 0xbb, 0x16, 0x46, 0x49, 0xda, 0x15, 0xfa, 0x2f, 0xc6, 0x9c, 0x11, 0x5a, 0x82, - 0x32, 0x09, 0x76, 0xa6, 0x87, 0x19, 0xbf, 0x0f, 0x1d, 0xce, 0x6f, 0x39, 0xd8, 0xb9, 0xe3, 0x44, - 0xe9, 0xc2, 0x5c, 0x0e, 0x76, 0x30, 0x2d, 0x8d, 0x1a, 0x50, 0x91, 0xbe, 0x9a, 0x78, 0x7a, 0xa4, - 0xc8, 0x54, 0xc4, 0x82, 0x1c, 0x93, 0x77, 0xdb, 0x5e, 0x44, 0x9a, 0x24, 0x48, 0xe2, 0xd4, 0x82, - 0x90, 0xd8, 0x18, 0xa7, 0x7c, 0x51, 0x03, 0xc6, 0xb8, 0xa2, 0xb5, 0x16, 0xb6, 0x83, 0x24, 0x9e, - 0xae, 0xb0, 0x26, 0xe7, 0x98, 0xe8, 0x77, 0xd2, 0x12, 0x8b, 0x67, 0x04, 0xfb, 0x31, 0x0d, 0x18, - 0x63, 0x83, 0x29, 0x7a, 0x13, 0xc6, 0x7d, 0x6f, 0x87, 0x04, 0x24, 0x8e, 0x6b, 0x51, 0xb8, 0x41, - 0xa6, 0x81, 0xf5, 0xe6, 0xa9, 0x3c, 0x73, 0x35, 0xdc, 0x20, 0x8b, 0xa7, 0xf6, 0xf7, 0x66, 0xc7, - 0x6f, 0xe8, 0xa5, 0xb1, 0xc9, 0x0c, 0xbd, 0x05, 0x13, 0x54, 0xab, 0xf3, 0x52, 0xf6, 0xa3, 0xc5, - 0xd9, 0xa3, 0xfd, 0xbd, 0xd9, 0x09, 0x6c, 0x14, 0xc7, 0x19, 0x76, 0x68, 0x1d, 0x2a, 0xbe, 0xb7, - 0x49, 0x1a, 0xbb, 0x0d, 0x9f, 0x4c, 0x8f, 0x31, 0xde, 0x39, 0x8b, 0xf3, 0x86, 0x24, 0xe7, 0x9a, - 0xb4, 0xfa, 0x8b, 0x53, 0x46, 0xe8, 0x0e, 0x3c, 0x92, 0x90, 0xa8, 0xe9, 0x05, 0x0e, 0x5d, 0x54, - 0x42, 0xcd, 0x63, 0x3e, 0x81, 0x71, 0x36, 0x6b, 0xcf, 0x89, 0x81, 0x7d, 0x64, 0xbd, 0x2b, 0x15, - 0xee, 0x51, 0x1a, 0xdd, 0x82, 0x49, 0xb6, 0x9e, 0x6a, 0x6d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, - 0x9d, 0x9e, 0x60, 0x0c, 0x9f, 0x96, 0x96, 0xfe, 0xaa, 0x89, 0xa6, 0x16, 0x50, 0xfa, 0x0f, 0x67, - 0x4b, 0x23, 0x1f, 0x26, 0x63, 0xd2, 0x68, 0x47, 0x5e, 0xb2, 0x4b, 0xe7, 0x3e, 0x79, 0x90, 0x4c, - 0x4f, 0x16, 0xb1, 0xe8, 0xea, 0x66, 0x21, 0xee, 0x66, 0xc9, 0x00, 0x71, 0x96, 0x35, 0x15, 0x15, - 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x14, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, 0x1c, 0x33, - 0x94, 0xe9, 0x8f, 0x5b, 0x54, 0x4a, 0x9f, 0x62, 0x84, 0xa9, 0xa1, 0x2c, 0x11, 0x38, 0xa5, 0xa1, - 0x7b, 0x60, 0x92, 0xec, 0x4e, 0x23, 0x46, 0xaa, 0x96, 0xda, 0xfa, 0xfa, 0x67, 0x30, 0x85, 0xa3, - 0x3b, 0x30, 0x4c, 0x82, 0x9d, 0x95, 0x28, 0x6c, 0x4e, 0x9f, 0x2e, 0x22, 0x03, 0x96, 0x39, 0x31, - 0xdf, 0x3f, 0x52, 0x5d, 0x5d, 0x80, 0xb1, 0x64, 0x86, 0x1e, 0xc0, 0x74, 0x97, 0xaf, 0xc4, 0x3f, - 0xca, 0x19, 0xf6, 0x51, 0x3e, 0x21, 0xca, 0x4e, 0xaf, 0xf7, 0xa0, 0x3b, 0x38, 0x04, 0x87, 0x7b, - 0x72, 0xb7, 0x37, 0x60, 0x42, 0x09, 0x2a, 0xf6, 0xbd, 0xd1, 0x2c, 0x0c, 0x52, 0x59, 0x2c, 0x2d, - 0xd7, 0x0a, 0x1d, 0x54, 0x2a, 0xa2, 0x63, 0xcc, 0xe1, 0x6c, 0x50, 0xbd, 0x2f, 0x90, 0xc5, 0xdd, - 0x84, 0x70, 0x0b, 0xa6, 0xac, 0x0d, 0xaa, 0x44, 0xe0, 0x94, 0xc6, 0xfe, 0xdf, 0x5c, 0x1f, 0x48, - 0xa5, 0x61, 0x81, 0x9d, 0xe0, 0x22, 0x8c, 0x6c, 0x87, 0x71, 0x42, 0xa9, 0x59, 0x1d, 0x83, 0xa9, - 0x06, 0x70, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0xaf, 0xc2, 0x78, 0x43, 0xaf, 0x40, 0x6c, 0x63, 0x67, - 0x45, 0x11, 0xb3, 0x76, 0x6c, 0xd2, 0xa2, 0x2b, 0x30, 0xc2, 0xdc, 0xb9, 0x8d, 0xd0, 0x17, 0xb6, - 0x92, 0xdc, 0x95, 0x47, 0x6a, 0x02, 0x7e, 0xa0, 0xfd, 0xc6, 0x8a, 0x9a, 0x5a, 0x9c, 0xb4, 0x09, - 0xab, 0x35, 0xb1, 0x81, 0x28, 0x8b, 0xf3, 0x1a, 0x83, 0x62, 0x81, 0xb5, 0xff, 0x71, 0x49, 0x1b, - 0x65, 0xaa, 0xe9, 0x13, 0xf4, 0x59, 0x18, 0xbe, 0xef, 0x78, 0x89, 0x17, 0x6c, 0x09, 0xed, 0xe1, - 0xc5, 0x82, 0xbb, 0x09, 0x2b, 0x7e, 0x97, 0x17, 0xe5, 0x3b, 0x9f, 0xf8, 0x83, 0x25, 0x43, 0xca, - 0x3b, 0x6a, 0x07, 0x01, 0xe5, 0x5d, 0xea, 0x9f, 0x37, 0xe6, 0x45, 0x39, 0x6f, 0xf1, 0x07, 0x4b, - 0x86, 0x68, 0x13, 0x40, 0xce, 0x25, 0xe2, 0x0a, 0x37, 0xea, 0x47, 0xfb, 0x61, 0xbf, 0xae, 0x4a, - 0x2f, 0x4e, 0xd0, 0xbd, 0x36, 0xfd, 0x8f, 0x35, 0xce, 0x76, 0xc2, 0x94, 0xb0, 0xce, 0x66, 0xa1, - 0xcf, 0xd1, 0x25, 0xed, 0x44, 0x09, 0x71, 0x17, 0x92, 0xac, 0x27, 0xfa, 0x70, 0x5d, 0x72, 0xdd, - 0x6b, 0x12, 0x7d, 0xf9, 0x0b, 0x26, 0x38, 0xe5, 0x67, 0x7f, 0xaf, 0x0c, 0xd3, 0xbd, 0x9a, 0x4b, - 0xa7, 0x24, 0x79, 0xe0, 0x25, 0x4b, 0x54, 0x4d, 0xb2, 0xcc, 0x29, 0xb9, 0x2c, 0xe0, 0x58, 0x51, - 0xd0, 0xb9, 0x11, 0x7b, 0x5b, 0xd2, 0x2a, 0x18, 0x4c, 0xe7, 0x46, 0x9d, 0x41, 0xb1, 0xc0, 0x52, - 0xba, 0x88, 0x38, 0xb1, 0xf0, 0xe2, 0x6b, 0x73, 0x08, 0x33, 0x28, 0x16, 0x58, 0xdd, 0xf2, 0x1f, - 0xc8, 0xb1, 0xfc, 0x8d, 0x21, 0x1a, 0x7c, 0xb8, 0x43, 0x84, 0x3e, 0x0f, 0xb0, 0xe9, 0x05, 0x5e, - 0xbc, 0xcd, 0xb8, 0x0f, 0xf5, 0xcd, 0x5d, 0x29, 0x59, 0x2b, 0x8a, 0x0b, 0xd6, 0x38, 0xa2, 0x97, - 0x61, 0x54, 0x2d, 0xcf, 0xd5, 0xea, 0xf4, 0xb0, 0xe9, 0xf9, 0x4d, 0x65, 0x55, 0x15, 0xeb, 0x74, - 0xf6, 0x3b, 0xd9, 0xf9, 0x22, 0x56, 0x85, 0x36, 0xbe, 0x56, 0xd1, 0xf1, 0x2d, 0x1d, 0x3e, 0xbe, - 0xf6, 0xbf, 0x2f, 0xc3, 0xa4, 0x51, 0x59, 0x3b, 0x2e, 0x20, 0xd1, 0x5e, 0xa7, 0x1b, 0x96, 0x93, - 0x10, 0xb1, 0x26, 0x2f, 0xf6, 0xb3, 0x68, 0xf4, 0xed, 0x8d, 0xae, 0x05, 0xce, 0x09, 0x6d, 0x43, - 0xc5, 0x77, 0x62, 0xe6, 0x3b, 0x20, 0x62, 0x2d, 0xf6, 0xc7, 0x36, 0x35, 0x3f, 0x9c, 0x38, 0xd1, - 0x76, 0x0f, 0x5e, 0x4b, 0xca, 0x9c, 0xee, 0xb6, 0x54, 0xd9, 0x91, 0x47, 0x47, 0xaa, 0x39, 0x54, - 0x23, 0xda, 0xc5, 0x1c, 0x87, 0xae, 0xc0, 0x58, 0x44, 0xd8, 0x4c, 0x59, 0xa2, 0xfa, 0x1c, 0x9b, - 0x7a, 0x83, 0xa9, 0xe2, 0x87, 0x35, 0x1c, 0x36, 0x28, 0x53, 0xbd, 0x7f, 0xe8, 0x10, 0xbd, 0xff, - 0x59, 0x18, 0x66, 0x3f, 0xd4, 0xac, 0x50, 0x5f, 0x68, 0x95, 0x83, 0xb1, 0xc4, 0x67, 0x27, 0xd1, - 0x48, 0xc1, 0x49, 0xf4, 0x1c, 0x4c, 0x54, 0x1d, 0xd2, 0x0c, 0x83, 0xe5, 0xc0, 0x6d, 0x85, 0x5e, - 0x90, 0xa0, 0x69, 0x18, 0x60, 0xfb, 0x09, 0x5f, 0xef, 0x03, 0x94, 0x03, 0x1e, 0xa0, 0xba, 0xbb, - 0xfd, 0x7f, 0x2c, 0x18, 0xaf, 0x12, 0x9f, 0x24, 0x84, 0xdb, 0x3d, 0x31, 0x5a, 0x01, 0xb4, 0x15, - 0x39, 0x0d, 0x52, 0x23, 0x91, 0x17, 0xba, 0x75, 0xd2, 0x08, 0x03, 0x76, 0xe2, 0x42, 0x37, 0xc8, - 0x47, 0xf6, 0xf7, 0x66, 0xd1, 0xd5, 0x0e, 0x2c, 0xee, 0x52, 0x02, 0xb9, 0x30, 0xde, 0x8a, 0x88, - 0xe1, 0x20, 0xb3, 0xf2, 0x55, 0x8d, 0x9a, 0x5e, 0x84, 0x6b, 0xc3, 0x06, 0x08, 0x9b, 0x4c, 0xd1, - 0xa7, 0x60, 0x2a, 0x8c, 0x5a, 0xdb, 0x4e, 0x50, 0x25, 0x2d, 0x12, 0xb8, 0xd4, 0x04, 0x10, 0x66, - 0xfd, 0x99, 0xfd, 0xbd, 0xd9, 0xa9, 0x5b, 0x19, 0x1c, 0xee, 0xa0, 0xb6, 0x7f, 0xbd, 0x04, 0x67, - 0xab, 0xe1, 0xfd, 0xe0, 0xbe, 0x13, 0xb9, 0x0b, 0xb5, 0x55, 0xae, 0xd7, 0x33, 0xef, 0xb2, 0xf4, - 0x6a, 0x5b, 0x3d, 0xbd, 0xda, 0x9f, 0x83, 0x91, 0x4d, 0x8f, 0xf8, 0x2e, 0x26, 0x9b, 0xa2, 0x7b, - 0x97, 0x8a, 0xb8, 0xfd, 0x57, 0x68, 0x19, 0xe9, 0x37, 0xe1, 0x56, 0xe7, 0x8a, 0x60, 0x83, 0x15, - 0x43, 0xd4, 0x86, 0x29, 0x69, 0xb8, 0x48, 0xac, 0x58, 0x1d, 0x2f, 0x16, 0xb3, 0x8b, 0xcc, 0x6a, - 0xd8, 0x78, 0xe0, 0x0c, 0x43, 0xdc, 0x51, 0x05, 0x35, 0x38, 0x9b, 0x74, 0x6f, 0x18, 0x60, 0x73, - 0x85, 0x19, 0x9c, 0xcc, 0x76, 0x66, 0x50, 0xfb, 0xef, 0x59, 0xf0, 0x68, 0xc7, 0x68, 0x09, 0xc7, - 0xc2, 0x1b, 0xd2, 0xa2, 0xe7, 0xc7, 0x73, 0x39, 0xad, 0xec, 0x3a, 0xe6, 0xc5, 0xac, 0xfb, 0x52, - 0xbe, 0x75, 0x6f, 0xdf, 0x82, 0x33, 0xcb, 0xcd, 0x56, 0xb2, 0x5b, 0xf5, 0x4c, 0x67, 0xfc, 0x2b, - 0x30, 0xd4, 0x24, 0xae, 0xd7, 0x6e, 0x8a, 0xcf, 0x3a, 0x2b, 0x05, 0xe9, 0x1a, 0x83, 0x1e, 0xec, - 0xcd, 0x8e, 0xd7, 0x93, 0x30, 0x72, 0xb6, 0x08, 0x07, 0x60, 0x41, 0x6e, 0xff, 0xc4, 0x82, 0x49, - 0xb9, 0xa0, 0x16, 0x5c, 0x37, 0x22, 0x71, 0x8c, 0x66, 0xa0, 0xe4, 0xb5, 0x04, 0x23, 0x10, 0x8c, - 0x4a, 0xab, 0x35, 0x5c, 0xf2, 0x5a, 0xe8, 0xb3, 0x50, 0xe1, 0x67, 0x38, 0xe9, 0xe4, 0xe8, 0xf3, - 0x4c, 0x88, 0x19, 0x53, 0xeb, 0x92, 0x07, 0x4e, 0xd9, 0x49, 0xb5, 0x92, 0x89, 0xea, 0xb2, 0x79, - 0xa2, 0x70, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0x17, 0x60, 0x24, 0x08, 0x5d, 0x7e, 0xcc, 0xc6, 0x37, - 0x5d, 0x36, 0xe5, 0x6e, 0x0a, 0x18, 0x56, 0x58, 0xfb, 0x6b, 0x16, 0x8c, 0xc9, 0x3e, 0x16, 0xd4, - 0x70, 0xe9, 0x22, 0x49, 0xb5, 0xdb, 0x74, 0x91, 0x50, 0x0d, 0x95, 0x61, 0x0c, 0xc5, 0xb4, 0xdc, - 0x8f, 0x62, 0x6a, 0xff, 0x66, 0x09, 0x26, 0x64, 0x73, 0xea, 0xed, 0x8d, 0x98, 0xd0, 0x7d, 0xbb, - 0xe2, 0xf0, 0xc1, 0x27, 0x72, 0x9e, 0xbd, 0x90, 0x67, 0xbc, 0x18, 0xdf, 0x2c, 0xd5, 0x0b, 0x16, - 0x24, 0x1f, 0x9c, 0xb2, 0x44, 0x3b, 0x70, 0x2a, 0x08, 0x13, 0xb6, 0x1f, 0x28, 0x7c, 0x31, 0x1f, - 0x78, 0xb6, 0x9e, 0xc7, 0x44, 0x3d, 0xa7, 0x6e, 0x66, 0xf9, 0xe1, 0xce, 0x2a, 0xd0, 0x2d, 0xe9, - 0x94, 0x29, 0xb3, 0xba, 0x9e, 0x2b, 0x56, 0x57, 0x6f, 0x9f, 0x8c, 0xfd, 0xbb, 0x16, 0x54, 0x24, - 0xd9, 0x49, 0x1c, 0x86, 0xdc, 0x85, 0xe1, 0x98, 0x7d, 0x22, 0x39, 0x5c, 0x17, 0x8b, 0x75, 0x81, - 0x7f, 0xd7, 0x74, 0x13, 0xe4, 0xff, 0x63, 0x2c, 0xb9, 0x31, 0x37, 0xac, 0xea, 0xc8, 0xfb, 0xce, - 0x0d, 0xab, 0x5a, 0xd6, 0xfb, 0xcc, 0x63, 0xdc, 0x30, 0x9f, 0xa9, 0x26, 0xd7, 0x8a, 0xc8, 0xa6, - 0xf7, 0x20, 0xab, 0xc9, 0xd5, 0x18, 0x14, 0x0b, 0x2c, 0xda, 0x84, 0xb1, 0x86, 0xf4, 0xdf, 0xa6, - 0x22, 0xe4, 0x23, 0x05, 0xbd, 0xc2, 0xea, 0x80, 0x81, 0x07, 0xad, 0x2c, 0x69, 0x9c, 0xb0, 0xc1, - 0x97, 0xca, 0xa9, 0xf4, 0x0c, 0xb5, 0x5c, 0xd0, 0xd3, 0x11, 0x91, 0x24, 0xad, 0xa1, 0xe7, 0xf1, - 0xa9, 0xfd, 0x2d, 0x0b, 0x86, 0xb8, 0xc3, 0xaf, 0x98, 0xd7, 0x54, 0x3b, 0x3a, 0x49, 0xc7, 0xf3, - 0x0e, 0x05, 0x8a, 0x93, 0x14, 0x74, 0x17, 0x2a, 0xec, 0x07, 0x73, 0x5e, 0x94, 0x8b, 0x44, 0xf0, - 0xf0, 0xfa, 0xf5, 0xa6, 0xde, 0x91, 0x0c, 0x70, 0xca, 0xcb, 0xfe, 0x41, 0x99, 0x8a, 0xbe, 0x94, - 0xd4, 0xd8, 0xdb, 0xad, 0x93, 0xd8, 0xdb, 0x4b, 0xc7, 0xbf, 0xb7, 0xbf, 0x0b, 0x93, 0x0d, 0xed, - 0xe8, 0x26, 0xfd, 0xe2, 0x97, 0x0b, 0x4e, 0x2b, 0xed, 0xbc, 0x87, 0x3b, 0xb8, 0x96, 0x4c, 0x76, - 0x38, 0xcb, 0x1f, 0x11, 0x18, 0xe3, 0xf3, 0x41, 0xd4, 0x37, 0xc0, 0xea, 0x9b, 0x2f, 0x32, 0xc3, - 0xf4, 0xca, 0xd8, 0x2c, 0xae, 0x6b, 0x8c, 0xb0, 0xc1, 0xd6, 0xfe, 0x9b, 0x83, 0x30, 0xb8, 0xbc, - 0x43, 0x82, 0xe4, 0x04, 0x44, 0x5d, 0x13, 0x26, 0xbc, 0x60, 0x27, 0xf4, 0x77, 0x88, 0xcb, 0xf1, - 0x47, 0xdb, 0xde, 0x1f, 0x11, 0x95, 0x4c, 0xac, 0x1a, 0xcc, 0x70, 0x86, 0xf9, 0x71, 0x98, 0xd6, - 0xaf, 0xc3, 0x10, 0x9f, 0x19, 0xc2, 0xae, 0xce, 0x71, 0x80, 0xb3, 0x81, 0x15, 0x2b, 0x28, 0x75, - 0x00, 0x70, 0xdf, 0xbb, 0x60, 0x84, 0xde, 0x81, 0x89, 0x4d, 0x2f, 0x8a, 0x13, 0x6a, 0x1d, 0xc7, - 0x89, 0xd3, 0x6c, 0x1d, 0xc1, 0xa8, 0x56, 0x23, 0xb2, 0x62, 0x70, 0xc2, 0x19, 0xce, 0x68, 0x0b, - 0xc6, 0xa9, 0x4d, 0x97, 0x56, 0x35, 0xdc, 0x77, 0x55, 0xca, 0xa7, 0x76, 0x43, 0x67, 0x84, 0x4d, - 0xbe, 0x54, 0x24, 0x35, 0x98, 0x0d, 0x38, 0xc2, 0xb4, 0x1b, 0x25, 0x92, 0xb8, 0xf1, 0xc7, 0x71, - 0x54, 0xb2, 0xb1, 0x18, 0x8a, 0x8a, 0x29, 0xd9, 0xd2, 0x48, 0x09, 0xfb, 0x3b, 0x74, 0x2f, 0xa6, - 0x63, 0x78, 0x02, 0xdb, 0xd7, 0x35, 0x73, 0xfb, 0x7a, 0xaa, 0xc0, 0x97, 0xed, 0xb1, 0x75, 0xbd, - 0x0d, 0xa3, 0xda, 0x87, 0x47, 0xf3, 0x50, 0x69, 0xc8, 0x63, 0x7e, 0x21, 0xc5, 0x95, 0x2a, 0xa5, - 0xce, 0xff, 0x71, 0x4a, 0x43, 0xc7, 0x85, 0xaa, 0xa0, 0xd9, 0xa0, 0x20, 0xaa, 0xa0, 0x62, 0x86, - 0xb1, 0x5f, 0x04, 0x58, 0x7e, 0x40, 0x1a, 0x0b, 0x0d, 0x16, 0x8b, 0xa2, 0x1d, 0x88, 0x59, 0xbd, - 0x0f, 0xc4, 0xec, 0x6f, 0x5b, 0x30, 0xb1, 0xb2, 0x64, 0xe8, 0xf4, 0x73, 0x00, 0x5c, 0x37, 0xbe, - 0x7b, 0xf7, 0xa6, 0x74, 0xf8, 0x72, 0xaf, 0x9c, 0x82, 0x62, 0x8d, 0x02, 0x3d, 0x06, 0x65, 0xbf, - 0x1d, 0x08, 0x95, 0x75, 0x78, 0x7f, 0x6f, 0xb6, 0x7c, 0xa3, 0x1d, 0x60, 0x0a, 0xd3, 0xa2, 0x6f, - 0xca, 0x85, 0xa3, 0x6f, 0xf2, 0xe3, 0x50, 0xbf, 0x51, 0x86, 0xa9, 0x15, 0x9f, 0x3c, 0x30, 0x5a, - 0xfd, 0x0c, 0x0c, 0xb9, 0x91, 0xb7, 0x43, 0xa2, 0xac, 0x22, 0x50, 0x65, 0x50, 0x2c, 0xb0, 0x85, - 0x03, 0x82, 0xde, 0xea, 0xdc, 0xc8, 0x8f, 0x2f, 0x18, 0x2a, 0xb7, 0xcf, 0x68, 0x13, 0x86, 0xf9, - 0x01, 0x6a, 0x3c, 0x3d, 0xc8, 0xa6, 0xe2, 0xab, 0x87, 0x37, 0x26, 0x3b, 0x3e, 0x73, 0xc2, 0x21, - 0xc1, 0x43, 0x31, 0x94, 0x2c, 0x13, 0x50, 0x2c, 0x99, 0xcf, 0x7c, 0x1c, 0xc6, 0x74, 0xca, 0xbe, - 0x62, 0x32, 0x7e, 0xc9, 0x82, 0xd3, 0x2b, 0x7e, 0xd8, 0xb8, 0x97, 0x89, 0xd8, 0x7a, 0x19, 0x46, - 0xe9, 0x62, 0x8a, 0x8d, 0x70, 0x46, 0x23, 0x6e, 0x53, 0xa0, 0xb0, 0x4e, 0xa7, 0x15, 0xbb, 0x7d, - 0x7b, 0xb5, 0xda, 0x2d, 0xdc, 0x53, 0xa0, 0xb0, 0x4e, 0x67, 0xff, 0xbe, 0x05, 0x4f, 0x5c, 0x5d, - 0x5a, 0xae, 0x91, 0x28, 0xf6, 0xe2, 0x84, 0x04, 0x49, 0x47, 0xc4, 0x29, 0xd5, 0x19, 0x5d, 0xad, - 0x29, 0xa9, 0xce, 0x58, 0x65, 0xad, 0x10, 0xd8, 0xf7, 0x4b, 0xd8, 0xf5, 0xb7, 0x2c, 0x38, 0x7d, - 0xd5, 0x4b, 0x30, 0x69, 0x85, 0xd9, 0x20, 0xd1, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x37, - 0x1b, 0x24, 0x8a, 0x15, 0x06, 0x6b, 0x54, 0xbc, 0xe6, 0x1d, 0x2f, 0xa6, 0x2d, 0x2d, 0x99, 0xa6, - 0x2e, 0x16, 0x70, 0xac, 0x28, 0x68, 0xc7, 0x5c, 0x2f, 0x62, 0x2a, 0xc3, 0xae, 0x58, 0xc1, 0xaa, - 0x63, 0x55, 0x89, 0xc0, 0x29, 0x8d, 0xfd, 0xb7, 0x2d, 0x38, 0x7b, 0xd5, 0x6f, 0xc7, 0x09, 0x89, - 0x36, 0x63, 0xa3, 0xb1, 0x2f, 0x42, 0x85, 0x48, 0xe5, 0x5e, 0xb4, 0x55, 0x6d, 0x1a, 0x4a, 0xeb, - 0xe7, 0x11, 0xaa, 0x8a, 0xae, 0x40, 0x20, 0x64, 0x7f, 0x61, 0x7b, 0xbf, 0x55, 0x82, 0xf1, 0x6b, - 0xeb, 0xeb, 0xb5, 0xab, 0x24, 0x11, 0x52, 0x32, 0xdf, 0x29, 0x85, 0x35, 0x8b, 0xfc, 0x30, 0xe5, - 0xa7, 0x9d, 0x78, 0xfe, 0x1c, 0xbf, 0x48, 0x30, 0xb7, 0x1a, 0x24, 0xb7, 0xa2, 0x7a, 0x12, 0x79, - 0xc1, 0x56, 0x57, 0x1b, 0x5e, 0xca, 0xf2, 0x72, 0x2f, 0x59, 0x8e, 0x5e, 0x84, 0x21, 0x76, 0x93, - 0x41, 0x2a, 0x1f, 0x1f, 0x54, 0x7a, 0x02, 0x83, 0x1e, 0xec, 0xcd, 0x56, 0x6e, 0xe3, 0x55, 0xfe, - 0x07, 0x0b, 0x52, 0xf4, 0x16, 0x8c, 0x6e, 0x27, 0x49, 0xeb, 0x1a, 0x71, 0x5c, 0x12, 0x49, 0x39, - 0x71, 0xe1, 0x70, 0x39, 0x41, 0x87, 0x83, 0x17, 0x48, 0x97, 0x56, 0x0a, 0x8b, 0xb1, 0xce, 0xd1, - 0xae, 0x03, 0xa4, 0xb8, 0x87, 0x64, 0x83, 0xd8, 0xbf, 0x58, 0x82, 0xe1, 0x6b, 0x4e, 0xe0, 0xfa, - 0x24, 0x42, 0x2b, 0x30, 0x40, 0x1e, 0x90, 0x86, 0xd8, 0xc8, 0x73, 0x9a, 0x9e, 0x6e, 0x76, 0xdc, - 0xaf, 0x46, 0xff, 0x63, 0x56, 0x1e, 0x61, 0x18, 0xa6, 0xed, 0xbe, 0xaa, 0xe2, 0x87, 0x9f, 0xcf, - 0x1f, 0x05, 0x35, 0x29, 0xf8, 0x4e, 0x29, 0x40, 0x58, 0x32, 0x62, 0x1e, 0xa8, 0x46, 0xab, 0x4e, - 0xc5, 0x5b, 0x52, 0xcc, 0xb2, 0x5b, 0x5f, 0xaa, 0x71, 0x72, 0xc1, 0x97, 0x7b, 0xa0, 0x24, 0x10, - 0xa7, 0xec, 0xec, 0x2b, 0x70, 0x86, 0x1d, 0x60, 0x3a, 0xc9, 0xb6, 0xb1, 0x6a, 0x72, 0xa7, 0xa7, - 0xfd, 0xa3, 0x12, 0x9c, 0x5a, 0xad, 0x2f, 0xd5, 0x4d, 0xdf, 0xe1, 0x15, 0x18, 0xe3, 0x1b, 0x34, - 0x9d, 0x74, 0x8e, 0x2f, 0xca, 0x2b, 0xa7, 0xfb, 0xba, 0x86, 0xc3, 0x06, 0x25, 0x7a, 0x02, 0xca, - 0xde, 0xbb, 0x41, 0x36, 0xde, 0x6b, 0xf5, 0xf5, 0x9b, 0x98, 0xc2, 0x29, 0x9a, 0xee, 0xf5, 0x5c, - 0xc8, 0x29, 0xb4, 0xda, 0xef, 0x5f, 0x83, 0x09, 0x2f, 0x6e, 0xc4, 0xde, 0x6a, 0x40, 0x25, 0x80, - 0xd3, 0x90, 0xd3, 0x37, 0x55, 0xce, 0x69, 0x53, 0x15, 0x16, 0x67, 0xa8, 0x35, 0x89, 0x3b, 0x58, - 0x58, 0x5f, 0xc8, 0x0d, 0x24, 0xa6, 0xaa, 0x50, 0x8b, 0xf5, 0x2e, 0x66, 0x41, 0x35, 0x42, 0x15, - 0xe2, 0x1d, 0x8e, 0xb1, 0xc4, 0xd9, 0xef, 0x40, 0x45, 0xc5, 0x45, 0xc9, 0xb8, 0x37, 0xab, 0x47, - 0xdc, 0x5b, 0xbe, 0x64, 0x92, 0x8e, 0xdf, 0x72, 0x57, 0xc7, 0xef, 0x3f, 0xb4, 0x20, 0x0d, 0xec, - 0x40, 0x18, 0x2a, 0xad, 0x90, 0x9d, 0xaa, 0x44, 0xf2, 0xf8, 0xf2, 0xe9, 0x9c, 0x09, 0xcb, 0x17, - 0x0c, 0x9f, 0x52, 0x35, 0x59, 0x16, 0xa7, 0x6c, 0xd0, 0x0d, 0x18, 0x6e, 0x45, 0xa4, 0x9e, 0xb0, - 0xa0, 0xf5, 0x3e, 0x38, 0xf2, 0xb1, 0xe1, 0x25, 0xb1, 0x64, 0x61, 0xff, 0x33, 0x0b, 0xe0, 0x86, - 0xd7, 0xf4, 0x12, 0xec, 0x04, 0x5b, 0xe4, 0x04, 0xac, 0xc2, 0x9b, 0x30, 0x10, 0xb7, 0x48, 0xa3, - 0xd8, 0xb9, 0x58, 0xda, 0xb2, 0x7a, 0x8b, 0x34, 0xd2, 0xcf, 0x41, 0xff, 0x61, 0xc6, 0xc7, 0xfe, - 0x3e, 0xc0, 0x44, 0x4a, 0x46, 0x35, 0x73, 0xf4, 0x82, 0x11, 0xad, 0xfd, 0x58, 0x26, 0x5a, 0xbb, - 0xc2, 0xa8, 0xb5, 0x00, 0xed, 0x04, 0xca, 0x4d, 0xe7, 0x81, 0x30, 0x04, 0x5e, 0x2e, 0xda, 0x20, - 0x5a, 0xd3, 0xdc, 0x9a, 0xf3, 0x80, 0xeb, 0x5d, 0xcf, 0xcb, 0x89, 0xb4, 0xe6, 0x3c, 0x38, 0xe0, - 0xa7, 0x5f, 0x6c, 0xc1, 0x52, 0xcb, 0xe3, 0xcb, 0x7f, 0x9c, 0xfe, 0x67, 0x32, 0x94, 0x56, 0xc7, - 0x6a, 0xf5, 0x02, 0xe1, 0xc7, 0xec, 0xb3, 0x56, 0x2f, 0xc8, 0xd6, 0xea, 0x05, 0x05, 0x6a, 0xf5, - 0x02, 0xf4, 0x15, 0x0b, 0x86, 0x85, 0xfb, 0x9f, 0x85, 0xca, 0x8d, 0x5e, 0xfe, 0x58, 0x5f, 0x55, - 0x8b, 0x73, 0x04, 0x5e, 0xfd, 0xbc, 0x54, 0x36, 0x05, 0x34, 0xb7, 0x09, 0xb2, 0x6a, 0xf4, 0xab, - 0x16, 0x4c, 0x88, 0xdf, 0x98, 0xbc, 0xdb, 0x26, 0x71, 0x22, 0x36, 0xb5, 0x4f, 0x1d, 0xa5, 0x35, - 0x82, 0x05, 0x6f, 0xd4, 0x47, 0xa5, 0x44, 0x32, 0x91, 0xb9, 0x6d, 0xcb, 0xb4, 0x07, 0x7d, 0xdf, - 0x82, 0x33, 0x4d, 0xe7, 0x01, 0xaf, 0x91, 0xc3, 0xb0, 0x93, 0x78, 0xa1, 0x08, 0x07, 0x5c, 0xe9, - 0x77, 0x9e, 0x74, 0x30, 0xe2, 0xcd, 0x95, 0x91, 0x3e, 0x67, 0xba, 0x91, 0xe4, 0x36, 0xba, 0x6b, - 0x0b, 0x67, 0x36, 0x61, 0x44, 0x4e, 0xcc, 0x2e, 0x6a, 0x7e, 0x55, 0xdf, 0xbb, 0x73, 0x8c, 0xea, - 0x39, 0xe9, 0x1a, 0x9b, 0x7b, 0xbd, 0xed, 0x04, 0x89, 0x97, 0xec, 0x6a, 0x66, 0x01, 0xab, 0x47, - 0x4c, 0xc5, 0x63, 0xad, 0xe7, 0x1d, 0x18, 0xd3, 0xe7, 0xdd, 0xb1, 0xd6, 0xf5, 0x2e, 0x9c, 0xee, - 0x32, 0xab, 0x8e, 0xb5, 0xca, 0xfb, 0xf0, 0x58, 0xcf, 0xf9, 0x71, 0x9c, 0x15, 0xdb, 0xbf, 0x65, - 0xe9, 0xa2, 0xf3, 0x04, 0x9c, 0x2e, 0x6b, 0xa6, 0xd3, 0xe5, 0x42, 0xd1, 0x35, 0xd4, 0xc3, 0xf3, - 0xb2, 0xa9, 0x37, 0x9f, 0x6e, 0x09, 0x68, 0x1d, 0x86, 0x7c, 0x0a, 0x91, 0x67, 0x5e, 0x17, 0xfb, - 0x59, 0xa5, 0xa9, 0x52, 0xc2, 0xe0, 0x31, 0x16, 0xbc, 0xec, 0xef, 0x5b, 0x30, 0xf0, 0x33, 0xbc, - 0x4b, 0xd2, 0xc1, 0x5a, 0x5c, 0x89, 0x9e, 0xc3, 0xce, 0xfd, 0xe5, 0x07, 0x09, 0x09, 0x62, 0xa6, - 0x83, 0x76, 0x1d, 0xa2, 0x5f, 0x2f, 0xc1, 0x28, 0xad, 0x4a, 0x46, 0x2d, 0xbc, 0x0a, 0xe3, 0xbe, - 0xb3, 0x41, 0x7c, 0xe9, 0x30, 0xce, 0x5a, 0x6c, 0x37, 0x74, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x4d, - 0xdd, 0x9f, 0x2e, 0x94, 0x24, 0x55, 0xd8, 0x70, 0xb6, 0x63, 0x93, 0x96, 0x9a, 0x0c, 0xf7, 0x9d, - 0xa4, 0xb1, 0x2d, 0xac, 0x39, 0xd5, 0xdc, 0xbb, 0x14, 0x88, 0x39, 0x0e, 0x2d, 0xc0, 0xa4, 0x9c, - 0xb1, 0x77, 0xa8, 0x99, 0x1f, 0x06, 0x42, 0xcf, 0x54, 0xf7, 0x51, 0xb1, 0x89, 0xc6, 0x59, 0x7a, - 0xf4, 0x71, 0x98, 0xa0, 0x83, 0x13, 0xb6, 0x13, 0x19, 0x93, 0x31, 0xc8, 0x62, 0x32, 0x58, 0x48, - 0xef, 0xba, 0x81, 0xc1, 0x19, 0x4a, 0xfb, 0x2d, 0x38, 0x7d, 0x23, 0x74, 0xdc, 0x45, 0xc7, 0x77, - 0x82, 0x06, 0x89, 0x56, 0x83, 0xad, 0xdc, 0xe3, 0x6b, 0xfd, 0x88, 0xb9, 0x94, 0x77, 0xc4, 0x6c, - 0x47, 0x80, 0xf4, 0x0a, 0x44, 0x34, 0xd1, 0x9b, 0x30, 0xec, 0xf1, 0xaa, 0xc4, 0xb4, 0xbd, 0x94, - 0xe7, 0x8f, 0xea, 0x68, 0xa3, 0x16, 0x1d, 0xc3, 0x01, 0x58, 0xb2, 0xa4, 0x26, 0x48, 0x37, 0x07, - 0x56, 0xbe, 0x95, 0x67, 0xff, 0x25, 0x0b, 0x26, 0x6f, 0x66, 0x2e, 0x3b, 0x3e, 0x03, 0x43, 0xfc, - 0xca, 0x7c, 0xd6, 0xc5, 0x52, 0x67, 0x50, 0x2c, 0xb0, 0x0f, 0xdd, 0xc2, 0xff, 0x95, 0x12, 0x54, - 0x58, 0x5c, 0x6a, 0x8b, 0x9a, 0x13, 0xc7, 0xaf, 0xa6, 0xae, 0x19, 0x6a, 0x6a, 0x8e, 0x95, 0xa9, - 0x1a, 0xd6, 0x4b, 0x4b, 0x45, 0xb7, 0xd5, 0x25, 0xc0, 0x42, 0x06, 0x66, 0xca, 0x90, 0x5f, 0x14, - 0x9b, 0x30, 0xef, 0x0c, 0xca, 0x0b, 0x82, 0xec, 0xd0, 0x57, 0xd1, 0xbe, 0xef, 0x0e, 0x7d, 0x55, - 0xcb, 0x7a, 0x08, 0xa7, 0x9a, 0xd6, 0x78, 0x26, 0xbe, 0x3f, 0xc9, 0xa2, 0x0d, 0x1d, 0xdf, 0xfb, - 0x02, 0x51, 0x77, 0x69, 0x67, 0x45, 0xf4, 0xa0, 0x80, 0x1e, 0x30, 0x39, 0x23, 0xfe, 0xf1, 0xab, - 0xd2, 0x69, 0x11, 0xfb, 0x1a, 0x4c, 0x66, 0x86, 0x0e, 0xbd, 0x0c, 0x83, 0xad, 0x6d, 0x27, 0x26, - 0x99, 0x38, 0x96, 0xc1, 0x1a, 0x05, 0x1e, 0xec, 0xcd, 0x4e, 0xa8, 0x02, 0x0c, 0x82, 0x39, 0xb5, - 0xfd, 0x95, 0x12, 0x0c, 0xdc, 0x0c, 0xdd, 0x93, 0x98, 0x6a, 0xd7, 0x8c, 0xa9, 0xf6, 0x4c, 0x7e, - 0xa2, 0x85, 0x9e, 0xb3, 0xac, 0x96, 0x99, 0x65, 0x17, 0x0a, 0xf0, 0x3a, 0x7c, 0x82, 0x35, 0x61, - 0x94, 0x25, 0x72, 0x10, 0x81, 0x3c, 0x2f, 0x1a, 0x96, 0xd5, 0x6c, 0xc6, 0xb2, 0x9a, 0xd4, 0x48, - 0x35, 0xfb, 0xea, 0x59, 0x18, 0x16, 0x81, 0x23, 0xd9, 0x58, 0x4b, 0x41, 0x8b, 0x25, 0xde, 0xfe, - 0x27, 0x65, 0x30, 0x12, 0x47, 0xa0, 0xdf, 0xb5, 0x60, 0x2e, 0xe2, 0xf7, 0x56, 0xdc, 0x6a, 0x3b, - 0xf2, 0x82, 0xad, 0x7a, 0x63, 0x9b, 0xb8, 0x6d, 0xdf, 0x0b, 0xb6, 0x56, 0xb7, 0x82, 0x50, 0x81, - 0x97, 0x1f, 0x90, 0x46, 0x9b, 0xf9, 0x69, 0x0b, 0xe7, 0xab, 0x50, 0x87, 0xa6, 0x97, 0xf7, 0xf7, - 0x66, 0xe7, 0x70, 0x5f, 0xb5, 0xe0, 0x3e, 0x5b, 0x85, 0xfe, 0xc8, 0x82, 0x79, 0x9e, 0x3a, 0xa1, - 0x78, 0x4f, 0x0a, 0x59, 0xa4, 0x35, 0xc9, 0x34, 0x65, 0xb7, 0x4e, 0xa2, 0xe6, 0xe2, 0x2b, 0x62, - 0x90, 0xe7, 0x6b, 0xfd, 0xd5, 0x8a, 0xfb, 0x6d, 0xa6, 0xfd, 0x2f, 0xca, 0x30, 0x4e, 0xc7, 0x33, - 0xbd, 0x2e, 0xfd, 0xb2, 0x31, 0x4d, 0x9e, 0xcc, 0x4c, 0x93, 0x53, 0x06, 0xf1, 0xc3, 0xb9, 0x29, - 0x1d, 0xc3, 0x29, 0xdf, 0x89, 0x93, 0x6b, 0xc4, 0x89, 0x92, 0x0d, 0xe2, 0xb0, 0xb3, 0xc9, 0x6c, - 0xdc, 0x43, 0x81, 0xe3, 0x4e, 0x15, 0x8c, 0x74, 0x23, 0xcb, 0x0c, 0x77, 0xf2, 0x47, 0x3b, 0x80, - 0xd8, 0x39, 0x68, 0xe4, 0x04, 0x31, 0xef, 0x8b, 0x27, 0xfc, 0xba, 0xfd, 0xd5, 0x3a, 0x23, 0x6a, - 0x45, 0x37, 0x3a, 0xb8, 0xe1, 0x2e, 0x35, 0x68, 0x27, 0xdd, 0x83, 0x45, 0x4f, 0xba, 0x87, 0x72, - 0x82, 0x9c, 0xbf, 0x6a, 0xc1, 0x69, 0xfa, 0x59, 0xcc, 0x80, 0xd8, 0x18, 0x85, 0x30, 0x49, 0xa7, - 0x9d, 0x4f, 0x12, 0x09, 0x13, 0xeb, 0x2b, 0x47, 0xb3, 0x36, 0xf9, 0xa4, 0xea, 0xdb, 0x75, 0x93, - 0x19, 0xce, 0x72, 0xb7, 0xbf, 0x6d, 0x01, 0x8b, 0xb8, 0x3b, 0x81, 0xcd, 0xec, 0xaa, 0xb9, 0x99, - 0xd9, 0xf9, 0x12, 0xa3, 0xc7, 0x3e, 0xf6, 0x12, 0x4c, 0x51, 0x6c, 0x2d, 0x0a, 0x1f, 0xec, 0x4a, - 0x45, 0x3b, 0xdf, 0xc1, 0xfb, 0xd5, 0x12, 0x5f, 0x36, 0xea, 0x02, 0x1e, 0xfa, 0x65, 0x0b, 0x46, - 0x1a, 0x4e, 0xcb, 0x69, 0xf0, 0xb4, 0x3b, 0x05, 0xbc, 0x33, 0x46, 0xf9, 0xb9, 0x25, 0x51, 0x96, - 0x7b, 0x16, 0x3e, 0x22, 0xbb, 0x2e, 0xc1, 0xb9, 0xde, 0x04, 0x55, 0xf9, 0xcc, 0x3d, 0x18, 0x37, - 0x98, 0x1d, 0xab, 0x19, 0xfa, 0xcb, 0x16, 0x17, 0xfa, 0xca, 0x54, 0xb8, 0x0f, 0xa7, 0x02, 0xed, - 0x3f, 0x15, 0x67, 0x52, 0x33, 0x9e, 0x2b, 0x2e, 0xd6, 0x99, 0x14, 0xd4, 0xa2, 0x0b, 0x33, 0x0c, - 0x71, 0x67, 0x1d, 0xf6, 0xdf, 0xb1, 0xe0, 0x51, 0x9d, 0x50, 0xbb, 0x31, 0x99, 0xe7, 0x37, 0xae, - 0xc2, 0x48, 0xd8, 0x22, 0x91, 0x93, 0x9a, 0x45, 0x17, 0xe4, 0xf8, 0xdf, 0x12, 0xf0, 0x83, 0xbd, - 0xd9, 0x33, 0x3a, 0x77, 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x88, 0x8d, 0x4b, 0x2c, 0xee, 0xba, - 0xb2, 0x34, 0x34, 0xec, 0x50, 0x25, 0xc6, 0x02, 0x63, 0xff, 0x35, 0x8b, 0x4f, 0x37, 0xbd, 0xe9, - 0xe8, 0x8b, 0x30, 0xd5, 0xa4, 0x16, 0xd4, 0xf2, 0x83, 0x16, 0xdd, 0x48, 0xd9, 0x71, 0xb2, 0x55, - 0x64, 0xfb, 0xe8, 0xd1, 0xdd, 0xc5, 0x69, 0xd1, 0xfa, 0xa9, 0xb5, 0x0c, 0x5b, 0xdc, 0x51, 0x91, - 0xfd, 0x1f, 0xc5, 0x9a, 0x65, 0x3a, 0xdc, 0xb3, 0x30, 0xdc, 0x0a, 0xdd, 0xa5, 0xd5, 0x2a, 0x16, - 0x63, 0xa5, 0x84, 0x4e, 0x8d, 0x83, 0xb1, 0xc4, 0xa3, 0xcb, 0x00, 0xe4, 0x41, 0x42, 0xa2, 0xc0, - 0xf1, 0xd5, 0x31, 0xb0, 0x52, 0x95, 0x96, 0x15, 0x06, 0x6b, 0x54, 0xb4, 0x4c, 0x2b, 0x0a, 0x77, - 0x3c, 0x97, 0x85, 0xfa, 0x97, 0xcd, 0x32, 0x35, 0x85, 0xc1, 0x1a, 0x15, 0xb5, 0x5b, 0xdb, 0x41, - 0xcc, 0xb7, 0x31, 0x67, 0x43, 0x64, 0x4d, 0x19, 0x49, 0xed, 0xd6, 0xdb, 0x3a, 0x12, 0x9b, 0xb4, - 0xf6, 0xbf, 0xab, 0x00, 0xa4, 0x8a, 0x12, 0xfa, 0x4a, 0xe7, 0x1a, 0xfd, 0x68, 0x51, 0x2d, 0xeb, - 0xe1, 0x2d, 0x50, 0xf4, 0x75, 0x0b, 0x46, 0x1d, 0xdf, 0x0f, 0x1b, 0x4e, 0xc2, 0x7a, 0x54, 0x2a, - 0x2a, 0x2d, 0x44, 0x4b, 0x16, 0xd2, 0xb2, 0xbc, 0x31, 0x2f, 0xca, 0x33, 0x42, 0x0d, 0x93, 0xdb, - 0x1e, 0xbd, 0x09, 0xe8, 0x23, 0x52, 0xd1, 0xe6, 0x1f, 0x65, 0x26, 0xab, 0x68, 0x57, 0x98, 0x8c, - 0xd4, 0x74, 0x6c, 0xf4, 0x96, 0x91, 0x18, 0x64, 0xa0, 0xc8, 0x15, 0x4b, 0x43, 0x75, 0xc8, 0xcb, - 0x09, 0x82, 0x3e, 0xab, 0x47, 0x41, 0x0f, 0x16, 0xb9, 0xc3, 0xac, 0x69, 0xb0, 0x39, 0x11, 0xd0, - 0x09, 0x4c, 0xba, 0xe6, 0x66, 0x29, 0x22, 0xb9, 0x2e, 0xe5, 0xd7, 0x90, 0xd9, 0x65, 0xd3, 0xed, - 0x31, 0x83, 0xc0, 0xd9, 0x2a, 0xd0, 0x67, 0x79, 0x8c, 0xfa, 0x6a, 0xb0, 0x19, 0x8a, 0x68, 0xae, - 0x8b, 0x05, 0xbe, 0xf9, 0x6e, 0x9c, 0x90, 0x26, 0x2d, 0x93, 0xee, 0x87, 0x37, 0x05, 0x17, 0xac, - 0xf8, 0xa1, 0x75, 0x18, 0x62, 0x37, 0x6a, 0xe2, 0xe9, 0x91, 0x22, 0xce, 0x33, 0xf3, 0x22, 0x69, - 0xaa, 0x84, 0xb0, 0xbf, 0x31, 0x16, 0xbc, 0xd0, 0x35, 0x79, 0x95, 0x3c, 0x5e, 0x0d, 0x6e, 0xc7, - 0x84, 0x5d, 0x25, 0xaf, 0x2c, 0x7e, 0x28, 0xbd, 0x1b, 0xce, 0xe1, 0x5d, 0x53, 0xa3, 0x19, 0x25, - 0xa9, 0x2e, 0x22, 0xfe, 0xcb, 0x8c, 0x6b, 0xd3, 0x50, 0xa4, 0xa1, 0x66, 0x7e, 0xb6, 0x74, 0xb0, - 0xef, 0x98, 0xcc, 0x70, 0x96, 0xfb, 0x89, 0xee, 0x82, 0x33, 0x01, 0x4c, 0x65, 0x17, 0xe5, 0xb1, - 0xee, 0xba, 0x3f, 0x1d, 0x80, 0x09, 0x73, 0x72, 0xa0, 0x79, 0xa8, 0x08, 0x26, 0x2a, 0x03, 0x93, - 0x5a, 0x03, 0x6b, 0x12, 0x81, 0x53, 0x1a, 0x96, 0x8b, 0x8a, 0x15, 0xd7, 0xe2, 0x78, 0xd2, 0x5c, - 0x54, 0x0a, 0x83, 0x35, 0x2a, 0xaa, 0xbc, 0x6e, 0x84, 0x61, 0xa2, 0x84, 0xb7, 0x9a, 0x37, 0x8b, - 0x0c, 0x8a, 0x05, 0x96, 0x0a, 0xed, 0x7b, 0xf4, 0x63, 0xfa, 0xa6, 0x23, 0x50, 0x09, 0xed, 0xeb, - 0x3a, 0x12, 0x9b, 0xb4, 0x74, 0x13, 0x0a, 0x63, 0x36, 0x11, 0x85, 0x8a, 0x9c, 0xc6, 0x45, 0xd5, - 0xf9, 0x2d, 0x33, 0x89, 0x47, 0x9f, 0x81, 0x47, 0xd5, 0xa5, 0x30, 0xcc, 0x1d, 0xab, 0xb2, 0xc6, - 0x21, 0xc3, 0xca, 0x7d, 0x74, 0xa9, 0x3b, 0x19, 0xee, 0x55, 0x1e, 0xbd, 0x06, 0x13, 0x42, 0xbd, - 0x95, 0x1c, 0x87, 0xcd, 0x43, 0xf3, 0xeb, 0x06, 0x16, 0x67, 0xa8, 0x51, 0x15, 0xa6, 0x28, 0x84, - 0xe9, 0x95, 0x92, 0x03, 0xbf, 0xdc, 0xa6, 0x76, 0xe7, 0xeb, 0x19, 0x3c, 0xee, 0x28, 0x81, 0x16, - 0x60, 0x92, 0xeb, 0x17, 0xd4, 0x96, 0x63, 0xdf, 0x41, 0x84, 0x60, 0xaa, 0x85, 0x70, 0xcb, 0x44, - 0xe3, 0x2c, 0x3d, 0xba, 0x02, 0x63, 0x4e, 0xd4, 0xd8, 0xf6, 0x12, 0xd2, 0x48, 0xda, 0x11, 0x4f, - 0xd4, 0xa0, 0x45, 0x1d, 0x2c, 0x68, 0x38, 0x6c, 0x50, 0xda, 0x5f, 0x80, 0xd3, 0x5d, 0xe2, 0xbd, - 0xe9, 0xc4, 0x71, 0x5a, 0x9e, 0xec, 0x53, 0x26, 0xc2, 0x69, 0xa1, 0xb6, 0x2a, 0x7b, 0xa3, 0x51, - 0xd1, 0xd9, 0xc9, 0x3c, 0xca, 0x5a, 0x82, 0x44, 0x35, 0x3b, 0x57, 0x24, 0x02, 0xa7, 0x34, 0xf6, - 0x9f, 0x55, 0x40, 0x73, 0xb8, 0x14, 0x88, 0x6a, 0xb9, 0x02, 0x63, 0x32, 0xe7, 0xa7, 0x96, 0x6b, - 0x4f, 0x75, 0xf3, 0xaa, 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0x20, 0xdd, 0x48, 0xd9, 0x78, 0x2a, - 0xe5, 0x5f, 0xc2, 0x29, 0x0d, 0xba, 0x08, 0x23, 0x31, 0xf1, 0x37, 0x6f, 0x78, 0xc1, 0x3d, 0x31, - 0xb1, 0x95, 0x64, 0xae, 0x0b, 0x38, 0x56, 0x14, 0x68, 0x11, 0xca, 0x6d, 0xcf, 0x15, 0x53, 0x59, - 0xaa, 0x0d, 0xe5, 0xdb, 0xab, 0xd5, 0x83, 0xbd, 0xd9, 0x27, 0x7b, 0x25, 0x40, 0xa5, 0x26, 0x75, - 0x3c, 0x47, 0x97, 0x1f, 0x2d, 0xdc, 0xcd, 0xb5, 0x3e, 0xd4, 0xa7, 0x6b, 0xfd, 0x32, 0x80, 0xe8, - 0xb5, 0x9c, 0xcb, 0xe5, 0xf4, 0xab, 0x5d, 0x55, 0x18, 0xac, 0x51, 0x51, 0xc3, 0xbc, 0x11, 0x11, - 0x47, 0xda, 0xae, 0x3c, 0x0e, 0x79, 0xe4, 0xe8, 0x86, 0xf9, 0x52, 0x96, 0x19, 0xee, 0xe4, 0x8f, - 0x42, 0x38, 0xe5, 0xd2, 0x85, 0x64, 0x54, 0x5a, 0xe9, 0x3f, 0xf8, 0x99, 0x56, 0x58, 0xcd, 0x32, - 0xc2, 0x9d, 0xbc, 0xd1, 0xe7, 0x61, 0x46, 0x02, 0x3b, 0xaf, 0x7d, 0xb2, 0xe5, 0x52, 0x5e, 0x3c, - 0xb7, 0xbf, 0x37, 0x3b, 0x53, 0xed, 0x49, 0x85, 0x0f, 0xe1, 0x80, 0xde, 0x84, 0x21, 0x76, 0x14, - 0x13, 0x4f, 0x8f, 0xb2, 0x1d, 0xef, 0xa5, 0x22, 0x21, 0xf4, 0x74, 0xd6, 0xcf, 0xb1, 0x03, 0x1d, - 0x11, 0x1c, 0x9a, 0x9e, 0x6f, 0x31, 0x20, 0x16, 0x3c, 0x51, 0x0b, 0x46, 0x9d, 0x20, 0x08, 0x13, - 0x87, 0x2b, 0x62, 0x63, 0x45, 0x74, 0x49, 0xad, 0x8a, 0x85, 0xb4, 0x2c, 0xaf, 0x47, 0xc5, 0x9b, - 0x69, 0x18, 0xac, 0x57, 0x81, 0xee, 0xc3, 0x64, 0x78, 0x9f, 0x0a, 0x4c, 0x79, 0x1a, 0x11, 0x4f, - 0x8f, 0x9b, 0x1d, 0xcb, 0xf1, 0xad, 0x1a, 0x85, 0x35, 0x49, 0x66, 0x32, 0xc5, 0xd9, 0x5a, 0xd0, - 0x9c, 0xe1, 0x61, 0x9e, 0x48, 0x43, 0xa0, 0x53, 0x0f, 0xb3, 0xee, 0x50, 0x66, 0x57, 0x8b, 0x79, - 0xd8, 0x23, 0x93, 0x08, 0x93, 0x99, 0xab, 0xc5, 0x29, 0x0a, 0xeb, 0x74, 0x33, 0x1f, 0x83, 0x51, - 0x6d, 0xe0, 0xfb, 0x89, 0xb5, 0x9d, 0x79, 0x0d, 0xa6, 0xb2, 0x03, 0xda, 0x57, 0xac, 0xee, 0xff, - 0x28, 0xc1, 0x64, 0x97, 0xa3, 0x9e, 0x7b, 0x1e, 0x8b, 0x17, 0x37, 0x44, 0xdf, 0x75, 0x2f, 0x70, - 0x31, 0xc3, 0x98, 0x02, 0xac, 0x54, 0x40, 0x80, 0x49, 0x69, 0x5a, 0xee, 0x29, 0x4d, 0x85, 0xd0, - 0x1a, 0x78, 0x2f, 0x42, 0xcb, 0xdc, 0x27, 0x06, 0x0b, 0xed, 0x13, 0x0f, 0x41, 0xd0, 0x19, 0x5b, - 0xcd, 0x70, 0x81, 0xad, 0xe6, 0x5b, 0x25, 0x98, 0x4a, 0xe3, 0x92, 0x45, 0x22, 0xe0, 0xe3, 0x3f, - 0x39, 0x58, 0x37, 0x4e, 0x0e, 0xf2, 0xf2, 0xfc, 0x66, 0xda, 0xd7, 0xf3, 0x14, 0xe1, 0xcd, 0xcc, - 0x29, 0xc2, 0x4b, 0x7d, 0xf2, 0x3d, 0xfc, 0x44, 0xe1, 0x7b, 0x25, 0x38, 0x9b, 0x2d, 0xb2, 0xe4, - 0x3b, 0x5e, 0xf3, 0x04, 0xc6, 0xeb, 0x33, 0xc6, 0x78, 0xbd, 0xd2, 0x5f, 0xbf, 0x58, 0x23, 0x7b, - 0x0e, 0x9a, 0x93, 0x19, 0xb4, 0x8f, 0x1d, 0x85, 0xf9, 0xe1, 0x23, 0xf7, 0x07, 0x16, 0x3c, 0xd6, - 0xb5, 0xdc, 0x09, 0xf8, 0x4a, 0xdf, 0x30, 0x7d, 0xa5, 0x2f, 0x1e, 0xa1, 0x77, 0x3d, 0x9c, 0xa7, - 0xff, 0xb5, 0xd4, 0xa3, 0x57, 0xcc, 0x9b, 0x74, 0x0b, 0x46, 0x9d, 0x46, 0x83, 0xc4, 0xf1, 0x5a, - 0xe8, 0xaa, 0x24, 0x45, 0x2f, 0xb0, 0xbd, 0x25, 0x05, 0x1f, 0xec, 0xcd, 0xce, 0x64, 0x59, 0xa4, - 0x68, 0xac, 0x73, 0x30, 0xd3, 0xa7, 0x95, 0x8e, 0x29, 0x7d, 0xda, 0x65, 0x80, 0x1d, 0x65, 0xc5, - 0x66, 0x9d, 0x54, 0x9a, 0x7d, 0xab, 0x51, 0xa1, 0xff, 0x9f, 0x69, 0x84, 0x3c, 0xae, 0x62, 0xc0, - 0xbc, 0xe2, 0x98, 0xf3, 0xfd, 0xf4, 0x18, 0x0d, 0x7e, 0x93, 0x52, 0x39, 0xf4, 0x14, 0x4b, 0xfb, - 0xbb, 0x65, 0xf8, 0xe0, 0x21, 0x93, 0x0e, 0x2d, 0x98, 0xc7, 0xa4, 0xcf, 0x67, 0xbd, 0x37, 0x33, - 0x5d, 0x0b, 0x1b, 0xee, 0x9c, 0xcc, 0xb7, 0x2a, 0xbd, 0xe7, 0x6f, 0xf5, 0x0d, 0xdd, 0xd7, 0xc6, - 0x03, 0x25, 0xaf, 0x1e, 0x79, 0x59, 0xfd, 0xbc, 0x7a, 0xc7, 0xbf, 0x6c, 0xc1, 0x93, 0x5d, 0xbb, - 0x65, 0x84, 0x65, 0xcc, 0x43, 0xa5, 0x41, 0x81, 0xda, 0xe5, 0x97, 0xf4, 0xd6, 0x99, 0x44, 0xe0, - 0x94, 0xc6, 0x88, 0xbe, 0x28, 0xe5, 0x46, 0x5f, 0xfc, 0x9e, 0x05, 0x67, 0xb2, 0x8d, 0x38, 0x01, - 0xa9, 0x53, 0x37, 0xa5, 0xce, 0x5c, 0x7f, 0x1f, 0xbf, 0x87, 0xc0, 0xf9, 0xd5, 0x71, 0x78, 0xa4, - 0x63, 0xcf, 0xe2, 0xa3, 0xf8, 0x0b, 0x16, 0x9c, 0xda, 0x62, 0xba, 0xb7, 0x76, 0xc3, 0x48, 0xf4, - 0x2b, 0xe7, 0x5a, 0xd6, 0xa1, 0x17, 0x93, 0xb8, 0x25, 0xd1, 0x41, 0x82, 0x3b, 0x2b, 0x43, 0x5f, - 0xb3, 0xe0, 0x8c, 0x73, 0x3f, 0xee, 0x78, 0x64, 0x42, 0x4c, 0xa4, 0xd7, 0x72, 0x5c, 0x5d, 0x39, - 0xcf, 0x53, 0x2c, 0x4e, 0xef, 0xef, 0xcd, 0x9e, 0xe9, 0x46, 0x85, 0xbb, 0xd6, 0x4a, 0xbf, 0xef, - 0xb6, 0xb8, 0xbf, 0x50, 0xec, 0xae, 0x5c, 0xb7, 0xdb, 0x0e, 0x5c, 0x28, 0x49, 0x0c, 0x56, 0x1c, - 0xd1, 0xdb, 0x50, 0xd9, 0x92, 0x97, 0x8a, 0xb2, 0x42, 0xaf, 0xc7, 0x30, 0x77, 0xbb, 0x83, 0xc4, - 0x83, 0xe5, 0x15, 0x0a, 0xa7, 0x4c, 0xd1, 0x35, 0x28, 0x07, 0x9b, 0xb1, 0xb8, 0xbe, 0x9b, 0x17, - 0x74, 0x63, 0x86, 0x3a, 0xf1, 0x1b, 0x8f, 0x37, 0x57, 0xea, 0x98, 0xb2, 0xa0, 0x9c, 0xa2, 0x0d, - 0x57, 0xf8, 0x78, 0x73, 0x38, 0xe1, 0xc5, 0x6a, 0x27, 0x27, 0xbc, 0x58, 0xc5, 0x94, 0x05, 0xaa, - 0xc1, 0x20, 0xbb, 0x1d, 0x21, 0x1c, 0xb8, 0x39, 0x77, 0xbc, 0x3b, 0xee, 0x80, 0xf0, 0x1c, 0x7d, - 0x0c, 0x8c, 0x39, 0x23, 0xb4, 0x0e, 0x43, 0x0d, 0x96, 0x4f, 0x5d, 0x58, 0xd6, 0x79, 0xd9, 0x0f, - 0x3a, 0x72, 0xaf, 0xf3, 0x83, 0x26, 0x0e, 0xc7, 0x82, 0x17, 0xe3, 0x4a, 0x5a, 0xdb, 0x9b, 0xb1, - 0x30, 0x9d, 0xf3, 0xb8, 0x76, 0x64, 0xc6, 0x17, 0x5c, 0x19, 0x1c, 0x0b, 0x5e, 0xa8, 0x0a, 0xa5, - 0xcd, 0x86, 0x48, 0xf5, 0x99, 0xe3, 0xb8, 0x35, 0xaf, 0xaf, 0x2e, 0x0e, 0xed, 0xef, 0xcd, 0x96, - 0x56, 0x96, 0x70, 0x69, 0xb3, 0x81, 0xde, 0x80, 0xe1, 0x4d, 0x7e, 0x21, 0x51, 0xa4, 0xf5, 0xbc, - 0x94, 0x77, 0x6b, 0xb2, 0xe3, 0xf6, 0x22, 0xbf, 0x10, 0x21, 0x10, 0x58, 0xb2, 0x63, 0x19, 0xcf, - 0xd4, 0x15, 0x4b, 0x91, 0xd7, 0x73, 0xae, 0xbf, 0x2b, 0x99, 0xc2, 0xa2, 0x54, 0x50, 0xac, 0x71, - 0xa4, 0x73, 0xde, 0x91, 0x4f, 0x43, 0xb0, 0x9c, 0x9e, 0xb9, 0x73, 0xbe, 0xeb, 0x4b, 0x12, 0x7c, - 0xce, 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0x36, 0x8c, 0xef, 0xc4, 0xad, 0x6d, 0x22, 0x97, 0x3e, 0x4b, - 0xf4, 0x39, 0x7a, 0xf9, 0x13, 0x39, 0xd9, 0x5b, 0x45, 0x11, 0x2f, 0x4a, 0xda, 0x8e, 0xdf, 0x21, - 0xc1, 0x58, 0x8a, 0xa9, 0x3b, 0x3a, 0x5b, 0x6c, 0xd6, 0x42, 0x3f, 0xc9, 0xbb, 0xed, 0x70, 0x63, - 0x37, 0x21, 0x22, 0x11, 0x68, 0xce, 0x27, 0x79, 0x9d, 0x13, 0x77, 0x7e, 0x12, 0x81, 0xc0, 0x92, - 0x9d, 0x1a, 0x32, 0x26, 0x8d, 0xa7, 0x0a, 0x0f, 0x59, 0x47, 0x1f, 0xd2, 0x21, 0x63, 0xd2, 0x37, - 0x65, 0xca, 0xa4, 0x6e, 0x6b, 0x3b, 0x4c, 0xc2, 0x20, 0x23, 0xfb, 0x4f, 0x15, 0x91, 0xba, 0xb5, - 0x2e, 0x25, 0x3b, 0xa5, 0x6e, 0x37, 0x2a, 0xdc, 0xb5, 0x56, 0xfb, 0x3f, 0x0f, 0x76, 0x6e, 0xb7, - 0x4c, 0x1d, 0xfe, 0xab, 0x9d, 0xa7, 0x8f, 0x9f, 0xea, 0xdf, 0xea, 0x7b, 0x88, 0xe7, 0x90, 0x5f, - 0xb3, 0xe0, 0x91, 0x56, 0xd7, 0xcd, 0x54, 0x6c, 0x58, 0xfd, 0x1a, 0x8f, 0x7c, 0xc0, 0x54, 0x96, - 0xdb, 0xee, 0x78, 0xdc, 0xa3, 0xce, 0xac, 0x0a, 0x5a, 0x7e, 0xcf, 0x2a, 0xe8, 0x5d, 0x18, 0x61, - 0x3a, 0x53, 0x9a, 0x92, 0xa3, 0xcf, 0xec, 0x15, 0x6c, 0xeb, 0x5b, 0x12, 0x2c, 0xb0, 0x62, 0x46, - 0x07, 0xee, 0x89, 0x6c, 0x27, 0x30, 0x61, 0x68, 0x91, 0x09, 0x96, 0x7b, 0x3b, 0x56, 0xc4, 0x48, - 0x3c, 0x51, 0x3b, 0x8c, 0xf8, 0x20, 0x8f, 0x00, 0x1f, 0x5e, 0xd9, 0xc9, 0xaa, 0xb4, 0x7f, 0xdf, - 0xea, 0xa2, 0x81, 0x71, 0x33, 0xe4, 0x13, 0xa6, 0x19, 0xf2, 0x4c, 0xd6, 0x0c, 0xe9, 0x70, 0x1d, - 0x18, 0x16, 0x48, 0xf1, 0xac, 0x8e, 0x45, 0xb3, 0x85, 0xd8, 0x3e, 0x9c, 0xcf, 0x5b, 0xde, 0x2c, - 0xd6, 0xc7, 0x55, 0x47, 0x66, 0x69, 0xac, 0x8f, 0xbb, 0x5a, 0xc5, 0x0c, 0x53, 0xf4, 0xc2, 0xb9, - 0xfd, 0x8b, 0x25, 0x28, 0xd7, 0x42, 0xf7, 0x04, 0x5c, 0x21, 0x57, 0x0d, 0x57, 0xc8, 0xd3, 0xb9, - 0x4f, 0x63, 0xf5, 0x74, 0x7c, 0xdc, 0xca, 0x38, 0x3e, 0x3e, 0x9c, 0xcf, 0xea, 0x70, 0x37, 0xc7, - 0xf7, 0xcb, 0xa0, 0x3f, 0xee, 0x85, 0xfe, 0xcd, 0x51, 0x42, 0x40, 0xcb, 0xc5, 0xde, 0xfb, 0x12, - 0x75, 0xb0, 0x50, 0x21, 0x79, 0x71, 0xec, 0xe7, 0x36, 0x12, 0xf4, 0x2e, 0xf1, 0xb6, 0xb6, 0x13, - 0xe2, 0x66, 0x3b, 0x76, 0x72, 0x91, 0xa0, 0x7f, 0x6a, 0xc1, 0x64, 0xa6, 0x76, 0xe4, 0x77, 0xbb, - 0x71, 0x72, 0x44, 0xe7, 0xc6, 0xa9, 0xdc, 0x2b, 0x2a, 0x73, 0x00, 0xca, 0x47, 0x2d, 0x5d, 0x10, - 0x4c, 0x1b, 0x53, 0x4e, 0xec, 0x18, 0x6b, 0x14, 0xe8, 0x65, 0x18, 0x4d, 0xc2, 0x56, 0xe8, 0x87, - 0x5b, 0xbb, 0xd7, 0x89, 0x4c, 0x85, 0xa0, 0xfc, 0xfb, 0xeb, 0x29, 0x0a, 0xeb, 0x74, 0xf6, 0x0f, - 0xca, 0x90, 0x7d, 0x1a, 0xee, 0xff, 0xcd, 0xd3, 0x9f, 0x9f, 0x79, 0xfa, 0x87, 0x16, 0x4c, 0xd1, - 0xda, 0x59, 0xa0, 0x87, 0x8c, 0xd8, 0x54, 0x29, 0xe6, 0xad, 0x43, 0x52, 0xcc, 0x3f, 0x43, 0xa5, - 0x9d, 0x1b, 0xb6, 0x13, 0xe1, 0x34, 0xd1, 0x84, 0x18, 0x85, 0x62, 0x81, 0x15, 0x74, 0x24, 0x8a, - 0xc4, 0xd5, 0x16, 0x9d, 0x8e, 0x44, 0x11, 0x16, 0x58, 0x99, 0x81, 0x7e, 0xa0, 0x47, 0x06, 0x7a, - 0x96, 0x4c, 0x48, 0x04, 0x17, 0x08, 0x85, 0x40, 0x4b, 0x26, 0x24, 0xa3, 0x0e, 0x52, 0x1a, 0xfb, - 0x3b, 0x65, 0x18, 0xab, 0x85, 0x6e, 0x1a, 0x8a, 0xfd, 0x92, 0x11, 0x8a, 0x7d, 0x3e, 0x13, 0x8a, - 0x3d, 0xa5, 0xd3, 0x3e, 0x9c, 0x48, 0x6c, 0x91, 0x74, 0x8a, 0xbd, 0x91, 0x70, 0xc4, 0x28, 0x6c, - 0x23, 0xe9, 0x94, 0x62, 0x84, 0x4d, 0xbe, 0x7f, 0x9e, 0xa2, 0xaf, 0xff, 0x97, 0x05, 0x13, 0xb5, - 0xd0, 0xa5, 0x13, 0xf4, 0xcf, 0xd3, 0x6c, 0xd4, 0x53, 0x55, 0x0d, 0x1d, 0x92, 0xaa, 0xea, 0x1f, - 0x59, 0x30, 0x5c, 0x0b, 0xdd, 0x13, 0x70, 0x28, 0xae, 0x98, 0x0e, 0xc5, 0x27, 0x73, 0x25, 0x6f, - 0x0f, 0x1f, 0xe2, 0x77, 0xcb, 0x30, 0x4e, 0x5b, 0x1c, 0x6e, 0xc9, 0xef, 0x65, 0x8c, 0x8d, 0x55, - 0x60, 0x6c, 0xa8, 0x4a, 0x18, 0xfa, 0x7e, 0x78, 0x3f, 0xfb, 0xed, 0x56, 0x18, 0x14, 0x0b, 0x2c, - 0xba, 0x08, 0x23, 0xad, 0x88, 0xec, 0x78, 0x61, 0x3b, 0xce, 0x5e, 0x93, 0xab, 0x09, 0x38, 0x56, - 0x14, 0xe8, 0x25, 0x18, 0x8b, 0xbd, 0xa0, 0x41, 0x64, 0xe8, 0xc1, 0x00, 0x0b, 0x3d, 0xe0, 0x59, - 0x01, 0x35, 0x38, 0x36, 0xa8, 0xd0, 0x5d, 0xa8, 0xb0, 0xff, 0x6c, 0x05, 0xf5, 0x9f, 0x42, 0x9e, - 0xa7, 0xc2, 0x92, 0x0c, 0x70, 0xca, 0x0b, 0x5d, 0x06, 0x48, 0x64, 0x90, 0x44, 0x2c, 0x12, 0x7a, - 0x28, 0xbd, 0x54, 0x85, 0x4f, 0xc4, 0x58, 0xa3, 0x42, 0xcf, 0x43, 0x25, 0x71, 0x3c, 0xff, 0x86, - 0x17, 0x90, 0x58, 0x04, 0x99, 0x88, 0x0c, 0xbf, 0x02, 0x88, 0x53, 0x3c, 0xdd, 0xef, 0xd9, 0x25, - 0x5d, 0xfe, 0x3c, 0xc5, 0x08, 0xa3, 0x66, 0xfb, 0xfd, 0x0d, 0x05, 0xc5, 0x1a, 0x85, 0x7d, 0x05, - 0xce, 0xd6, 0x42, 0xb7, 0x16, 0x46, 0xc9, 0x4a, 0x18, 0xdd, 0x77, 0x22, 0x57, 0x7e, 0xbf, 0x59, - 0x99, 0x58, 0x96, 0xee, 0xc9, 0x83, 0xdc, 0xc7, 0x66, 0x24, 0x8a, 0x7d, 0x91, 0xed, 0xf8, 0x7d, - 0xc6, 0xf8, 0xff, 0xb8, 0x04, 0xa8, 0xc6, 0xc2, 0x38, 0x8c, 0xd7, 0x4c, 0xb6, 0x61, 0x22, 0x26, - 0x37, 0xbc, 0xa0, 0xfd, 0x40, 0xb0, 0x2a, 0x76, 0xa9, 0xa2, 0xbe, 0xac, 0x97, 0xe1, 0x37, 0x5a, - 0x4d, 0x18, 0xce, 0xf0, 0xa5, 0x83, 0x19, 0xb5, 0x83, 0x85, 0xf8, 0x76, 0x4c, 0x22, 0xf1, 0x7a, - 0x07, 0x1b, 0x4c, 0x2c, 0x81, 0x38, 0xc5, 0xd3, 0xc9, 0xc3, 0xfe, 0xdc, 0x0c, 0x03, 0x1c, 0x86, - 0x89, 0x9c, 0x6e, 0x2c, 0x9b, 0xbb, 0x06, 0xc7, 0x06, 0x15, 0x5a, 0x01, 0x14, 0xb7, 0x5b, 0x2d, - 0x9f, 0x9d, 0x8c, 0x39, 0xfe, 0xd5, 0x28, 0x6c, 0xb7, 0x78, 0x34, 0xaf, 0x48, 0x84, 0x5e, 0xef, - 0xc0, 0xe2, 0x2e, 0x25, 0xa8, 0xb0, 0xd8, 0x8c, 0xd9, 0x6f, 0x71, 0x63, 0x97, 0xfb, 0xe7, 0xea, - 0x0c, 0x84, 0x25, 0xce, 0xfe, 0x12, 0xdb, 0xe0, 0xd8, 0xb3, 0x0a, 0x49, 0x3b, 0x22, 0xa8, 0x09, - 0xe3, 0x2d, 0xb6, 0x89, 0x25, 0x51, 0xe8, 0xfb, 0x44, 0xea, 0x97, 0x47, 0x0b, 0x24, 0xe1, 0x89, - 0xd4, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0xff, 0xda, 0x38, 0x93, 0x55, 0xe2, 0x70, 0x72, 0x58, 0x84, - 0x8c, 0x0a, 0x4d, 0xee, 0x43, 0x45, 0x1e, 0x48, 0x4a, 0xf7, 0x01, 0x11, 0x80, 0x8a, 0x25, 0x17, - 0xf4, 0x39, 0x16, 0x10, 0xcd, 0x05, 0x44, 0xf1, 0xf7, 0xcd, 0x38, 0xbd, 0x11, 0x0c, 0x2d, 0x58, - 0x60, 0x8d, 0x1d, 0xba, 0x01, 0xe3, 0x22, 0x0b, 0xbf, 0x70, 0x30, 0x94, 0x0d, 0x13, 0x7b, 0x1c, - 0xeb, 0xc8, 0x83, 0x2c, 0x00, 0x9b, 0x85, 0xd1, 0x16, 0x3c, 0xa1, 0xbd, 0x32, 0xd3, 0x25, 0xe8, - 0x89, 0x4b, 0x9e, 0x27, 0xf7, 0xf7, 0x66, 0x9f, 0x58, 0x3f, 0x8c, 0x10, 0x1f, 0xce, 0x07, 0xdd, - 0x82, 0xb3, 0x4e, 0x23, 0xf1, 0x76, 0x48, 0x95, 0x38, 0xae, 0xef, 0x05, 0xc4, 0xbc, 0xd6, 0xfd, - 0xd8, 0xfe, 0xde, 0xec, 0xd9, 0x85, 0x6e, 0x04, 0xb8, 0x7b, 0x39, 0xf4, 0x09, 0xa8, 0xb8, 0x41, - 0x2c, 0xc6, 0x60, 0xc8, 0x78, 0x54, 0xa9, 0x52, 0xbd, 0x59, 0x57, 0xfd, 0x4f, 0xff, 0xe0, 0xb4, - 0x00, 0x7a, 0x97, 0xbf, 0x8e, 0xad, 0xac, 0x19, 0xfe, 0x98, 0xd7, 0x2b, 0x85, 0xec, 0x67, 0xe3, - 0xb2, 0x05, 0xf7, 0xbd, 0xa9, 0xe0, 0x42, 0xe3, 0x1e, 0x86, 0x51, 0x05, 0xfa, 0x34, 0xa0, 0x98, - 0x44, 0x3b, 0x5e, 0x83, 0x2c, 0x34, 0x58, 0x2a, 0x4d, 0x76, 0xc8, 0x37, 0x62, 0x44, 0xd9, 0xa3, - 0x7a, 0x07, 0x05, 0xee, 0x52, 0x0a, 0x5d, 0xa3, 0x92, 0x47, 0x87, 0x8a, 0x58, 0x50, 0xa9, 0x18, - 0x4e, 0x57, 0x49, 0x2b, 0x22, 0x0d, 0x27, 0x21, 0xae, 0xc9, 0x11, 0x67, 0xca, 0xd1, 0x7d, 0x49, - 0x65, 0x4b, 0x07, 0x33, 0x82, 0xb1, 0x33, 0x63, 0x3a, 0xb5, 0xb3, 0xb6, 0xc3, 0x38, 0xb9, 0x49, - 0x92, 0xfb, 0x61, 0x74, 0x8f, 0xf9, 0xec, 0x47, 0xb4, 0xbc, 0x64, 0x29, 0x0a, 0xeb, 0x74, 0x54, - 0x87, 0x62, 0x87, 0x45, 0xab, 0x55, 0xe6, 0x89, 0x1f, 0x49, 0xd7, 0xce, 0x35, 0x0e, 0xc6, 0x12, - 0x2f, 0x49, 0x57, 0x6b, 0x4b, 0xcc, 0xab, 0x9e, 0x21, 0x5d, 0xad, 0x2d, 0x61, 0x89, 0x47, 0x61, - 0xe7, 0xd3, 0x55, 0x13, 0x45, 0x4e, 0x38, 0x3a, 0x25, 0x79, 0xc1, 0xd7, 0xab, 0x1e, 0xc0, 0x94, - 0x7a, 0x3e, 0x8b, 0xa7, 0x8c, 0x8c, 0xa7, 0x27, 0x8b, 0xbc, 0xcd, 0xdd, 0x35, 0xf3, 0xa4, 0x0a, - 0xfe, 0x5d, 0xcd, 0xf0, 0xc4, 0x1d, 0xb5, 0x18, 0xe9, 0x09, 0xa6, 0x72, 0x33, 0xe0, 0xcf, 0x43, - 0x25, 0x6e, 0x6f, 0xb8, 0x61, 0xd3, 0xf1, 0x02, 0xe6, 0xfa, 0xd6, 0x5f, 0x9a, 0x96, 0x08, 0x9c, - 0xd2, 0xa0, 0x1a, 0x8c, 0x38, 0xf2, 0x91, 0x75, 0x54, 0xe4, 0xfa, 0xb2, 0x7a, 0x5d, 0x9d, 0xf9, - 0x45, 0xd5, 0xb3, 0xea, 0x8a, 0x0b, 0x7a, 0x15, 0xc6, 0xc5, 0xed, 0x1b, 0x12, 0xb1, 0x56, 0x9f, - 0x36, 0xc3, 0xbe, 0xeb, 0x12, 0xc9, 0x26, 0x98, 0x49, 0x8b, 0xb6, 0x60, 0x82, 0x72, 0x49, 0x05, - 0xe0, 0xf4, 0x99, 0xfe, 0x64, 0xa8, 0x96, 0x6b, 0x58, 0x67, 0x83, 0x33, 0x6c, 0x91, 0x0b, 0x8f, - 0x3b, 0xed, 0x24, 0x6c, 0xd2, 0x95, 0x60, 0xae, 0x93, 0xf5, 0xf0, 0x1e, 0x09, 0xa6, 0xcf, 0xb2, - 0x19, 0x78, 0x7e, 0x7f, 0x6f, 0xf6, 0xf1, 0x85, 0x43, 0xe8, 0xf0, 0xa1, 0x5c, 0x66, 0x3e, 0x09, - 0xa7, 0x3a, 0x24, 0x46, 0x5f, 0xb1, 0x80, 0xff, 0x76, 0x10, 0x2a, 0xca, 0xe1, 0x86, 0xe6, 0x4d, - 0xdf, 0xea, 0x63, 0x59, 0xdf, 0xea, 0x08, 0xd5, 0x6f, 0x74, 0x77, 0xea, 0xe7, 0xbb, 0x3c, 0xdc, - 0xfb, 0x5c, 0xee, 0x12, 0x29, 0x7e, 0x3d, 0xa7, 0x8f, 0xe7, 0x8d, 0x53, 0xa3, 0x6b, 0xe0, 0x50, - 0xa3, 0xab, 0xe0, 0x1b, 0x5d, 0xd4, 0xbc, 0x6a, 0x85, 0xee, 0x6a, 0x2d, 0xfb, 0x04, 0x4d, 0x8d, - 0x02, 0x31, 0xc7, 0x31, 0xb5, 0x98, 0x6e, 0x79, 0x4c, 0x2d, 0x1e, 0x3e, 0xa2, 0x5a, 0x2c, 0x19, - 0xe0, 0x94, 0x17, 0xda, 0x81, 0x53, 0x0d, 0xf3, 0x45, 0x21, 0x75, 0xe9, 0xe6, 0x85, 0x3e, 0x5e, - 0xf4, 0x69, 0x6b, 0xaf, 0x27, 0x2c, 0x65, 0xf9, 0xe1, 0xce, 0x2a, 0xd0, 0xab, 0x30, 0xf2, 0x6e, - 0x18, 0x2f, 0xf9, 0x4e, 0x1c, 0x0b, 0xb9, 0x2f, 0x2f, 0x37, 0x8c, 0xbc, 0x7e, 0xab, 0xce, 0xe0, - 0x07, 0x7b, 0xb3, 0xa3, 0xb5, 0xd0, 0x95, 0x7f, 0xb1, 0x2a, 0x80, 0xbe, 0x6c, 0xc1, 0x59, 0x63, - 0x19, 0xa8, 0x96, 0xc3, 0x51, 0x5a, 0xfe, 0x84, 0xa8, 0xf9, 0xec, 0x6a, 0x37, 0x9e, 0xb8, 0x7b, - 0x55, 0xf6, 0xef, 0x70, 0x0f, 0xa3, 0xf0, 0x39, 0x90, 0xb8, 0xed, 0x9f, 0x44, 0x26, 0xf3, 0x5b, - 0x86, 0x3b, 0xe4, 0x21, 0xf8, 0xb8, 0xff, 0xb5, 0xc5, 0x7c, 0xdc, 0xeb, 0xa4, 0xd9, 0xf2, 0x9d, - 0xe4, 0x24, 0x42, 0x45, 0x3f, 0x07, 0x23, 0x89, 0xa8, 0xad, 0x58, 0x1a, 0x76, 0xad, 0x79, 0xcc, - 0xf7, 0xaf, 0xf6, 0x0d, 0x09, 0xc5, 0x8a, 0xa1, 0xfd, 0xcf, 0xf9, 0x57, 0x91, 0x98, 0x13, 0x30, - 0xe4, 0x6f, 0x9a, 0x86, 0xfc, 0xb3, 0x85, 0xfb, 0xd2, 0xc3, 0xa0, 0xff, 0x81, 0xd9, 0x03, 0xa6, - 0xde, 0xff, 0xfc, 0x1c, 0xc2, 0xd8, 0xb7, 0xc0, 0x7c, 0xfe, 0x09, 0xbd, 0xc6, 0x83, 0xaf, 0xb9, - 0xa4, 0xbf, 0xd8, 0x77, 0xe0, 0xb5, 0xfd, 0x1b, 0x25, 0x38, 0xc3, 0xdd, 0xb0, 0x0b, 0x3b, 0xa1, - 0xe7, 0xd6, 0x42, 0x57, 0x84, 0xa2, 0xbb, 0x30, 0xd6, 0xd2, 0xcc, 0xaf, 0x62, 0xd9, 0x36, 0x74, - 0x83, 0x2d, 0x55, 0x79, 0x75, 0x28, 0x36, 0xb8, 0xd2, 0x5a, 0xc8, 0x8e, 0xd7, 0x50, 0x5e, 0xbd, - 0x52, 0xdf, 0xc2, 0x57, 0xd5, 0xb2, 0xac, 0xf1, 0xc1, 0x06, 0xd7, 0x63, 0x78, 0x31, 0xc0, 0xfe, - 0xbb, 0x16, 0x3c, 0xda, 0x23, 0x23, 0x07, 0xad, 0xee, 0x3e, 0x73, 0x7d, 0x8b, 0xf7, 0xc5, 0x54, - 0x75, 0xdc, 0x21, 0x8e, 0x05, 0x16, 0x6d, 0x00, 0x70, 0x87, 0x36, 0x7b, 0x6d, 0xba, 0x54, 0x24, - 0x02, 0xa5, 0xe3, 0xde, 0xbb, 0x76, 0x25, 0x5a, 0xbd, 0x2f, 0xad, 0x71, 0xb5, 0xbf, 0x5d, 0x86, - 0x41, 0xfe, 0x8c, 0x6d, 0x0d, 0x86, 0xb7, 0x79, 0x86, 0xd0, 0xfe, 0x12, 0x94, 0xa6, 0xea, 0x35, - 0x07, 0x60, 0xc9, 0x06, 0xad, 0xc1, 0x69, 0x2a, 0xbc, 0x3d, 0xc7, 0xaf, 0x12, 0xdf, 0xd9, 0x95, - 0xf6, 0x1a, 0x4f, 0x23, 0x2f, 0xf3, 0x1d, 0x9f, 0x5e, 0xed, 0x24, 0xc1, 0xdd, 0xca, 0xa1, 0xd7, - 0x3a, 0x12, 0x7a, 0xf1, 0xcc, 0xab, 0x4a, 0x57, 0x3b, 0x3c, 0xa9, 0x17, 0xd5, 0x28, 0x5b, 0x1d, - 0x96, 0xa9, 0xf6, 0x5a, 0xa8, 0x69, 0x8d, 0x9a, 0xb4, 0xa8, 0x0a, 0x53, 0x71, 0x9b, 0xc5, 0x03, - 0xac, 0x6f, 0x47, 0x24, 0xde, 0x0e, 0x7d, 0x57, 0x3c, 0x74, 0xa7, 0xb4, 0xf0, 0x7a, 0x06, 0x8f, - 0x3b, 0x4a, 0x50, 0x2e, 0x9b, 0x8e, 0xe7, 0xb7, 0x23, 0x92, 0x72, 0x19, 0x32, 0xb9, 0xac, 0x64, - 0xf0, 0xb8, 0xa3, 0x84, 0xfd, 0x27, 0x16, 0x9c, 0xee, 0x12, 0x34, 0xc3, 0x43, 0x39, 0xb7, 0xbc, - 0x38, 0x51, 0xc9, 0xc2, 0xb5, 0x50, 0x4e, 0x0e, 0xc7, 0x8a, 0x82, 0xce, 0x42, 0xee, 0x6e, 0xc8, - 0x1e, 0x45, 0x8b, 0xb0, 0x00, 0x81, 0xed, 0x2f, 0x3d, 0x17, 0x3a, 0x0f, 0x03, 0xed, 0x98, 0x44, - 0xf2, 0xdd, 0x2c, 0x29, 0xa2, 0x98, 0x87, 0x89, 0x61, 0xa8, 0xc6, 0xb5, 0xa5, 0x9c, 0x3b, 0x9a, - 0xc6, 0xc5, 0xdd, 0x3b, 0x1c, 0x67, 0x7f, 0xa3, 0x0c, 0x93, 0x99, 0xe0, 0x39, 0xda, 0x90, 0x66, - 0x18, 0x78, 0x49, 0xa8, 0x52, 0x42, 0xf1, 0xa7, 0x7a, 0x48, 0x6b, 0x7b, 0x4d, 0xc0, 0xb1, 0xa2, - 0x40, 0xcf, 0x98, 0x6f, 0x8a, 0xa7, 0x6d, 0x5e, 0xac, 0x1a, 0xcf, 0x0b, 0x16, 0x7d, 0xc0, 0xe0, - 0x29, 0x18, 0x68, 0x85, 0xea, 0xa9, 0x58, 0x35, 0xe9, 0xf1, 0x62, 0xb5, 0x16, 0x86, 0x3e, 0x66, - 0x48, 0xf4, 0xb4, 0xe8, 0x7d, 0xc6, 0x27, 0x8e, 0x1d, 0x37, 0x8c, 0xb5, 0x21, 0x78, 0x16, 0x86, - 0xef, 0x91, 0xdd, 0xc8, 0x0b, 0xb6, 0xb2, 0x27, 0x02, 0xd7, 0x39, 0x18, 0x4b, 0xbc, 0xf9, 0x48, - 0xc1, 0xf0, 0x31, 0x3f, 0x52, 0x30, 0x92, 0x1b, 0xff, 0xfb, 0x5d, 0x0b, 0x26, 0x59, 0x9e, 0x44, - 0x71, 0x45, 0xd9, 0x0b, 0x83, 0x13, 0xd8, 0x1e, 0x9f, 0x82, 0xc1, 0x88, 0x56, 0x9a, 0xcd, 0x32, - 0xce, 0x5a, 0x82, 0x39, 0x0e, 0x3d, 0x0e, 0x03, 0xac, 0x09, 0xf4, 0x33, 0x8e, 0xf1, 0x74, 0xcc, - 0x55, 0x27, 0x71, 0x30, 0x83, 0xb2, 0xdb, 0x26, 0x98, 0xb4, 0x7c, 0x8f, 0x37, 0x3a, 0x75, 0xe4, - 0xbd, 0xdf, 0x6e, 0x9b, 0x74, 0x6d, 0xe4, 0xc3, 0xba, 0x6d, 0xd2, 0x9d, 0xf9, 0xe1, 0x2a, 0xea, - 0x7f, 0x2f, 0xc1, 0xb9, 0xae, 0xe5, 0xd2, 0xb3, 0xc5, 0x15, 0xe3, 0x6c, 0xf1, 0x72, 0xe6, 0x6c, - 0xd1, 0x3e, 0xbc, 0xf4, 0xc3, 0x39, 0x6d, 0xec, 0x7e, 0x08, 0x58, 0x3e, 0xc1, 0x43, 0xc0, 0x81, - 0xa2, 0xaa, 0xc3, 0x60, 0x8e, 0xea, 0xf0, 0x07, 0x16, 0x3c, 0xd6, 0x75, 0xc8, 0xde, 0x77, 0xd7, - 0x7b, 0xba, 0xb6, 0xb2, 0x87, 0x62, 0xfd, 0x2b, 0xe5, 0x1e, 0xbd, 0x62, 0x2a, 0xf6, 0x05, 0x2a, - 0x85, 0x18, 0x32, 0x16, 0x4a, 0xd1, 0x18, 0x97, 0x40, 0x1c, 0x86, 0x15, 0x16, 0xc5, 0xda, 0xf5, - 0x18, 0xde, 0xc8, 0xe5, 0x23, 0x2e, 0xa8, 0x39, 0xd3, 0x03, 0xab, 0xdf, 0xbb, 0xce, 0x5c, 0x9a, - 0x41, 0x77, 0x35, 0xa3, 0xa9, 0x7c, 0x14, 0xa3, 0x69, 0xac, 0xbb, 0xc1, 0x84, 0x16, 0x60, 0xb2, - 0xe9, 0x05, 0xec, 0x6d, 0x43, 0x53, 0x2b, 0x51, 0x77, 0x14, 0xd7, 0x4c, 0x34, 0xce, 0xd2, 0xcf, - 0xbc, 0x0a, 0xe3, 0x47, 0x77, 0x0c, 0xfd, 0xa4, 0x0c, 0x1f, 0x3c, 0x44, 0x28, 0xf0, 0xdd, 0xc1, - 0xf8, 0x2e, 0xda, 0xee, 0xd0, 0xf1, 0x6d, 0x6a, 0x70, 0x66, 0xb3, 0xed, 0xfb, 0xbb, 0x2c, 0x32, - 0x87, 0xb8, 0x92, 0x42, 0x68, 0x7c, 0xea, 0xd5, 0xe1, 0x95, 0x2e, 0x34, 0xb8, 0x6b, 0x49, 0xf4, - 0x69, 0x40, 0xe1, 0x06, 0xcb, 0x24, 0xea, 0xa6, 0xf7, 0xca, 0xd9, 0x27, 0x28, 0xa7, 0x4b, 0xf5, - 0x56, 0x07, 0x05, 0xee, 0x52, 0x8a, 0xea, 0x7f, 0xec, 0xc1, 0x62, 0xd5, 0xac, 0x8c, 0xfe, 0x87, - 0x75, 0x24, 0x36, 0x69, 0xd1, 0x55, 0x38, 0xe5, 0xec, 0x38, 0x1e, 0xcf, 0x0c, 0x24, 0x19, 0x70, - 0x05, 0x50, 0xb9, 0x5e, 0x16, 0xb2, 0x04, 0xb8, 0xb3, 0x0c, 0x6a, 0x19, 0xbe, 0x34, 0x9e, 0x43, - 0xfc, 0x13, 0x47, 0x98, 0xc1, 0x85, 0xbd, 0x6b, 0xf6, 0x7f, 0xb1, 0xe8, 0xd6, 0xd7, 0xe5, 0x19, - 0x3c, 0xe3, 0xfd, 0x7c, 0xed, 0xc2, 0x50, 0xe7, 0xfb, 0xf9, 0xdc, 0xc7, 0x6a, 0xd0, 0xf2, 0xa9, - 0x11, 0xa7, 0x21, 0xbe, 0x86, 0xb6, 0x29, 0x6e, 0xca, 0x29, 0x0a, 0xf4, 0x19, 0x18, 0x76, 0xbd, - 0x1d, 0x2f, 0x0e, 0x23, 0xb1, 0x80, 0xfa, 0x0c, 0x1b, 0x4d, 0xe5, 0x65, 0x95, 0xb3, 0xc1, 0x92, - 0x9f, 0xfd, 0xcd, 0x12, 0x8c, 0xcb, 0x1a, 0x5f, 0x6f, 0x87, 0x89, 0x73, 0x02, 0x5b, 0xfa, 0xeb, - 0xc6, 0x96, 0x3e, 0x5f, 0xec, 0xe2, 0x20, 0x6b, 0x5c, 0xcf, 0xad, 0xfc, 0x33, 0x99, 0xad, 0xfc, - 0x52, 0x3f, 0x4c, 0x0f, 0xdf, 0xc2, 0xff, 0xa5, 0x05, 0xa7, 0x0c, 0xfa, 0x13, 0xd8, 0x49, 0x6a, - 0xe6, 0x4e, 0xf2, 0x7c, 0x1f, 0xbd, 0xe9, 0xb1, 0x83, 0x7c, 0xa7, 0x94, 0xe9, 0x05, 0xdb, 0x39, - 0xbe, 0x08, 0x03, 0xdb, 0x4e, 0xe4, 0x16, 0x4b, 0x93, 0xd7, 0x51, 0x7c, 0xee, 0x9a, 0x13, 0xb9, - 0x5c, 0xfe, 0x5f, 0x54, 0x8f, 0xf4, 0x38, 0x91, 0x9b, 0x1b, 0xf9, 0xce, 0x2a, 0x45, 0x57, 0x60, - 0x28, 0x6e, 0x84, 0x2d, 0x15, 0x61, 0x78, 0x9e, 0x3f, 0xe0, 0x43, 0x21, 0x07, 0x7b, 0xb3, 0xc8, - 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x9f, 0xd9, 0x82, 0x8a, 0xaa, 0xfa, 0x58, 0x63, 0xac, 0xff, 0x5b, - 0x19, 0x4e, 0x77, 0x99, 0x2b, 0xe8, 0x4b, 0xc6, 0xb8, 0xbd, 0xda, 0xf7, 0x64, 0x7b, 0x8f, 0x23, - 0xf7, 0x25, 0x66, 0x29, 0xb9, 0x62, 0x76, 0x1c, 0xa1, 0xfa, 0xdb, 0x31, 0xc9, 0x56, 0x4f, 0x41, - 0xf9, 0xd5, 0xd3, 0x6a, 0x4f, 0x6c, 0xf8, 0x69, 0x45, 0xaa, 0xa5, 0xc7, 0xfa, 0x9d, 0xff, 0xe2, - 0x00, 0x9c, 0xe9, 0x76, 0x43, 0x19, 0x7d, 0xd5, 0xca, 0xe4, 0xc2, 0x7f, 0xad, 0xff, 0x6b, 0xce, - 0x3c, 0x41, 0xbe, 0xc8, 0xea, 0x31, 0x67, 0x66, 0xc7, 0xcf, 0x1d, 0x71, 0x51, 0x3b, 0xbb, 0xb3, - 0x12, 0xf1, 0x77, 0x0d, 0xa4, 0x54, 0xf8, 0xd4, 0x11, 0x9a, 0x22, 0x9e, 0x46, 0x88, 0x33, 0x77, - 0x56, 0x24, 0x38, 0xff, 0xce, 0x8a, 0x6c, 0xc3, 0x8c, 0x07, 0xa3, 0x5a, 0xbf, 0x8e, 0x75, 0x1a, - 0xdc, 0xa3, 0x5b, 0x94, 0xd6, 0xee, 0x63, 0x9d, 0x0a, 0x7f, 0xcb, 0x82, 0x4c, 0x38, 0x90, 0x72, - 0xcb, 0x58, 0x3d, 0xdd, 0x32, 0xe7, 0x61, 0x20, 0x0a, 0x7d, 0x92, 0xcd, 0xd3, 0x8e, 0x43, 0x9f, - 0x60, 0x86, 0x51, 0xef, 0x76, 0x96, 0x7b, 0xbd, 0xdb, 0x49, 0xed, 0x74, 0x9f, 0xec, 0x10, 0xe9, - 0x24, 0x51, 0x62, 0xfc, 0x06, 0x05, 0x62, 0x8e, 0xb3, 0x7f, 0xbf, 0x0c, 0x43, 0xdc, 0x13, 0x71, - 0x02, 0xfb, 0x74, 0x4d, 0x38, 0x05, 0x0a, 0xdd, 0x1b, 0xe6, 0xad, 0x9a, 0xab, 0x3a, 0x89, 0xc3, - 0x27, 0x97, 0xea, 0x63, 0xea, 0x48, 0x40, 0x73, 0xc6, 0x28, 0xcc, 0x64, 0x6c, 0x5d, 0xe0, 0x3c, - 0xb4, 0x31, 0xd9, 0x06, 0x88, 0xd9, 0x3b, 0x71, 0x94, 0x87, 0xc8, 0x6d, 0xf8, 0x52, 0xa1, 0x76, - 0xd4, 0x55, 0x31, 0xde, 0x9a, 0x34, 0xa1, 0x9a, 0x42, 0x60, 0x8d, 0xf7, 0xcc, 0x2b, 0x50, 0x51, - 0xc4, 0x79, 0x46, 0xc0, 0x98, 0x3e, 0x39, 0xff, 0x3f, 0x98, 0xcc, 0xd4, 0xd5, 0x97, 0x0d, 0xf1, - 0xdb, 0x16, 0x4c, 0x66, 0x9e, 0xb8, 0x46, 0x5f, 0xb1, 0xe0, 0x8c, 0xdf, 0xc5, 0x11, 0x25, 0x3e, - 0xf3, 0x51, 0x5c, 0x58, 0xca, 0x7c, 0xe8, 0x86, 0xc5, 0x5d, 0x6b, 0xa3, 0x66, 0x25, 0x7f, 0xf6, - 0xd2, 0xf1, 0x45, 0x74, 0xe5, 0x18, 0x4f, 0xc4, 0xca, 0x61, 0x58, 0x61, 0xed, 0x9f, 0x5a, 0x70, - 0xaa, 0xe3, 0x15, 0xe5, 0xf7, 0x4b, 0x37, 0x44, 0xca, 0xd9, 0x52, 0x8f, 0x94, 0xb3, 0x7a, 0x2f, - 0xcb, 0x87, 0xf6, 0xf2, 0x37, 0x2c, 0x10, 0x33, 0xf4, 0x04, 0x34, 0xc0, 0x55, 0x53, 0x03, 0xfc, - 0x50, 0x91, 0x49, 0xdf, 0x43, 0xf5, 0xfb, 0x33, 0x0b, 0x10, 0x27, 0xc8, 0xbe, 0x8f, 0xc9, 0x1d, - 0x99, 0x9a, 0xf1, 0x92, 0xae, 0x12, 0x85, 0xc1, 0x1a, 0x55, 0x9f, 0x2f, 0x17, 0xa8, 0xe7, 0xe2, - 0xba, 0x37, 0x0c, 0x5d, 0x82, 0x51, 0xf1, 0x5c, 0xd4, 0x5a, 0xfa, 0x14, 0xdc, 0x24, 0x7b, 0xbd, - 0x34, 0x05, 0x63, 0x9d, 0xc6, 0xf8, 0x5a, 0x03, 0x87, 0x7e, 0xad, 0xdf, 0x29, 0x43, 0x36, 0xa4, - 0x08, 0xbd, 0x0d, 0x63, 0x0d, 0xa7, 0xe5, 0x6c, 0x78, 0xbe, 0x97, 0x78, 0x24, 0x2e, 0x76, 0xec, - 0xb6, 0xa4, 0x95, 0x10, 0x4e, 0x73, 0x0d, 0x82, 0x0d, 0x8e, 0x68, 0x0e, 0xa0, 0x15, 0x79, 0x3b, - 0x9e, 0x4f, 0xb6, 0x98, 0x7e, 0xc6, 0x62, 0x92, 0xf9, 0x09, 0x92, 0x84, 0x62, 0x8d, 0xa2, 0x4b, - 0x0c, 0x6b, 0xf9, 0x24, 0x62, 0x58, 0x07, 0xfa, 0x8c, 0x61, 0x1d, 0x2c, 0x14, 0xc3, 0x8a, 0xe1, - 0x11, 0xe9, 0xeb, 0xa6, 0xff, 0x57, 0x3c, 0x9f, 0xf0, 0x94, 0x95, 0x22, 0x66, 0x79, 0x66, 0x7f, - 0x6f, 0xf6, 0x11, 0xdc, 0x95, 0x02, 0xf7, 0x28, 0x69, 0xb7, 0xe1, 0x74, 0x9d, 0x44, 0x1e, 0xcb, - 0x24, 0xe6, 0xa6, 0x8b, 0xfa, 0xf3, 0x50, 0x89, 0x32, 0xf2, 0xa4, 0xcf, 0x2b, 0xa5, 0x5a, 0xee, - 0x19, 0x29, 0x3f, 0x52, 0x96, 0xf6, 0x5f, 0x29, 0xc1, 0xb0, 0x08, 0x26, 0x3a, 0x81, 0x8d, 0xf6, - 0xba, 0x61, 0x10, 0x3f, 0x9b, 0xb7, 0xd6, 0x59, 0xb3, 0x7a, 0x9a, 0xc2, 0xf5, 0x8c, 0x29, 0xfc, - 0x7c, 0x31, 0x76, 0x87, 0x1b, 0xc1, 0xff, 0xa0, 0x0c, 0x13, 0x66, 0x70, 0xd5, 0x09, 0x0c, 0xcb, - 0x1b, 0x30, 0x1c, 0x8b, 0x38, 0xbf, 0x52, 0x91, 0xe0, 0x98, 0xec, 0x27, 0x56, 0x5e, 0x0f, 0x19, - 0xd9, 0x27, 0xd9, 0x75, 0x0d, 0x25, 0x2c, 0x9f, 0x48, 0x28, 0x61, 0x5e, 0xcc, 0xdb, 0xc0, 0xc3, - 0x88, 0x79, 0xb3, 0x7f, 0xc8, 0x44, 0xbe, 0x0e, 0x3f, 0x81, 0x2d, 0xeb, 0x75, 0x73, 0x73, 0xb8, - 0x58, 0x68, 0xde, 0x89, 0xe6, 0xf5, 0xd8, 0xba, 0xbe, 0x67, 0xc1, 0xa8, 0x20, 0x3c, 0x81, 0x0e, - 0x7c, 0xda, 0xec, 0xc0, 0xd3, 0x85, 0x3a, 0xd0, 0xa3, 0xe5, 0xdf, 0x2c, 0xa9, 0x96, 0xd7, 0xc4, - 0x9b, 0xc6, 0xb9, 0x79, 0x53, 0x47, 0x5a, 0x51, 0x98, 0x84, 0x8d, 0xd0, 0x17, 0xca, 0xca, 0xe3, - 0xe9, 0x15, 0x15, 0x0e, 0x3f, 0xd0, 0x7e, 0x63, 0x45, 0xcd, 0x6e, 0x50, 0x84, 0x51, 0x22, 0x36, - 0xd0, 0x6e, 0x2f, 0x2a, 0xbb, 0xf2, 0xcd, 0x7a, 0x0a, 0x13, 0xb7, 0xbb, 0xfa, 0x7f, 0xab, 0x39, - 0xbd, 0x73, 0xa2, 0x78, 0x61, 0x8d, 0xaf, 0x0c, 0x66, 0x66, 0x75, 0x0c, 0x9a, 0xfe, 0xee, 0x9b, - 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x0a, 0x93, 0xec, 0x6c, 0x80, 0xfa, 0xbb, 0x0e, 0xf2, 0x97, 0x87, - 0xd4, 0xd0, 0x32, 0x27, 0xd6, 0x4d, 0xfd, 0xd2, 0x49, 0x51, 0xf1, 0x49, 0x9b, 0xa0, 0x07, 0x2c, - 0xa6, 0x77, 0x54, 0x10, 0xe9, 0x38, 0x24, 0x79, 0xa5, 0xb0, 0x44, 0xee, 0xe3, 0x58, 0x84, 0x25, - 0x9b, 0x62, 0x19, 0x76, 0x56, 0x6b, 0xd9, 0x6c, 0xb7, 0x4b, 0x12, 0x81, 0x53, 0x1a, 0x34, 0x2f, - 0x8c, 0x27, 0xf3, 0xc9, 0x6b, 0x69, 0x3c, 0xc9, 0x21, 0xd1, 0xac, 0xa7, 0x4b, 0x30, 0xaa, 0x72, - 0xfe, 0xd7, 0x78, 0xea, 0xf6, 0x0a, 0xd7, 0xaf, 0x96, 0x53, 0x30, 0xd6, 0x69, 0xd0, 0x2a, 0x9c, - 0x76, 0x55, 0xec, 0x7a, 0xad, 0xbd, 0xe1, 0x7b, 0x0d, 0x5a, 0x94, 0xdf, 0x3b, 0x7b, 0x74, 0x7f, - 0x6f, 0xf6, 0x74, 0xb5, 0x13, 0x8d, 0xbb, 0x95, 0x41, 0xeb, 0x30, 0x19, 0xf3, 0xb7, 0x0d, 0x64, - 0x80, 0xb2, 0x48, 0x02, 0xf9, 0x9c, 0x3c, 0x9d, 0xa9, 0x9b, 0xe8, 0x03, 0x06, 0xe2, 0x52, 0x41, - 0x86, 0x34, 0x67, 0x59, 0xa0, 0xd7, 0x60, 0xc2, 0xd7, 0x1f, 0x6e, 0xab, 0x89, 0x10, 0x7e, 0x15, - 0xc7, 0x62, 0x3c, 0xeb, 0x56, 0xc3, 0x19, 0x6a, 0xf4, 0x06, 0x4c, 0xeb, 0x10, 0x91, 0x09, 0xc3, - 0x09, 0xb6, 0x48, 0x2c, 0x92, 0xaa, 0x3f, 0xbe, 0xbf, 0x37, 0x3b, 0x7d, 0xa3, 0x07, 0x0d, 0xee, - 0x59, 0x1a, 0x5d, 0x81, 0x31, 0x39, 0x92, 0x5a, 0x38, 0x7f, 0x1a, 0x41, 0xa5, 0xe1, 0xb0, 0x41, - 0xf9, 0xde, 0x0e, 0xa1, 0xbe, 0x48, 0x0b, 0x6b, 0x5b, 0x38, 0x7a, 0x07, 0xc6, 0xf4, 0x36, 0x66, - 0xf7, 0xe6, 0xfc, 0xc7, 0xf0, 0x84, 0x2a, 0xa0, 0x5a, 0xae, 0xe3, 0xb0, 0xc1, 0xdb, 0xbe, 0x05, - 0x43, 0xf5, 0xdd, 0xb8, 0x91, 0xf8, 0x0f, 0xeb, 0xb5, 0x73, 0x02, 0x93, 0x99, 0x67, 0xc1, 0xd5, - 0x0b, 0xf3, 0xd6, 0xc3, 0x7b, 0x61, 0xde, 0xfe, 0x63, 0x0b, 0x06, 0xd7, 0x1d, 0x2f, 0xff, 0x41, - 0x92, 0x22, 0x8d, 0x46, 0x2f, 0xc3, 0x10, 0xd9, 0xdc, 0x24, 0x0d, 0xf9, 0x62, 0xbd, 0x0c, 0xca, - 0x1d, 0x5a, 0x66, 0x50, 0xba, 0x38, 0x59, 0x65, 0xfc, 0x2f, 0x16, 0xc4, 0xe8, 0x73, 0x50, 0x49, - 0xbc, 0x26, 0x59, 0x70, 0x5d, 0xe2, 0x1e, 0xe1, 0xc6, 0xad, 0x12, 0x16, 0xeb, 0x92, 0x09, 0x4e, - 0xf9, 0xd9, 0x5f, 0x2f, 0x01, 0xac, 0x87, 0xbe, 0x3c, 0xbe, 0xcb, 0xe9, 0xe6, 0x62, 0xc7, 0xbb, - 0x2b, 0xcf, 0x74, 0x79, 0x77, 0x05, 0xa5, 0x0c, 0xbb, 0xbc, 0xba, 0xa2, 0x86, 0xaa, 0x5c, 0x68, - 0xa8, 0x06, 0xfa, 0x19, 0xaa, 0x25, 0x38, 0x95, 0xa8, 0xba, 0xcd, 0xab, 0x4b, 0x2c, 0x29, 0xdc, - 0x7a, 0x16, 0x89, 0x3b, 0xe9, 0xed, 0xaf, 0x5b, 0x20, 0xc2, 0xb3, 0x0a, 0xcc, 0x56, 0x57, 0x3e, - 0xb8, 0x60, 0xe4, 0xe1, 0x79, 0xae, 0xc8, 0xd5, 0x34, 0x91, 0x7d, 0x47, 0xad, 0x1f, 0x23, 0xe7, - 0x8e, 0xc1, 0xd5, 0xfe, 0x4d, 0x0b, 0x46, 0x39, 0x7a, 0x8d, 0xe9, 0xd4, 0xf9, 0xed, 0xea, 0x2b, - 0xe3, 0x20, 0x7b, 0x8b, 0x80, 0x32, 0x56, 0x99, 0xe7, 0xf4, 0xb7, 0x08, 0x24, 0x02, 0xa7, 0x34, - 0xe8, 0x59, 0x18, 0x8e, 0xdb, 0x1b, 0x8c, 0x3c, 0x13, 0xab, 0x55, 0xe7, 0x60, 0x2c, 0xf1, 0xf6, - 0x2f, 0x21, 0x30, 0xba, 0x66, 0x64, 0xb9, 0xb3, 0x1e, 0x7a, 0x96, 0xbb, 0x37, 0x61, 0x84, 0x34, - 0x5b, 0xc9, 0x6e, 0xd5, 0x8b, 0x8a, 0x65, 0x1c, 0x5d, 0x16, 0xd4, 0x9d, 0xdc, 0x25, 0x06, 0x2b, - 0x8e, 0x3d, 0x72, 0x16, 0x96, 0xdf, 0x17, 0x39, 0x0b, 0x07, 0x7e, 0x26, 0x39, 0x0b, 0xdf, 0x80, - 0xe1, 0x2d, 0x2f, 0xc1, 0xa4, 0x15, 0x8a, 0xbb, 0xcc, 0x39, 0x47, 0xaa, 0x57, 0x39, 0x71, 0x67, - 0x22, 0x32, 0x81, 0xc0, 0x92, 0x1d, 0x5a, 0x87, 0x21, 0x6e, 0x87, 0x89, 0x34, 0x80, 0x1f, 0x29, - 0xe2, 0xdb, 0xea, 0xcc, 0x88, 0x27, 0x02, 0xf2, 0x04, 0x2f, 0x99, 0xa3, 0x70, 0xf8, 0xbd, 0xe7, - 0x28, 0x54, 0x99, 0x05, 0x47, 0x1e, 0x56, 0x66, 0x41, 0x23, 0x43, 0x63, 0xe5, 0x38, 0x32, 0x34, - 0x7e, 0xdd, 0x82, 0xb3, 0xad, 0x6e, 0xf9, 0x4d, 0x45, 0x8e, 0xc0, 0x4f, 0x1e, 0x21, 0xe3, 0xab, - 0x51, 0x35, 0xbb, 0x21, 0xda, 0x95, 0x0c, 0x77, 0xaf, 0x58, 0xa6, 0x7a, 0x1c, 0x7d, 0xef, 0xa9, - 0x1e, 0x8f, 0x3b, 0x99, 0x60, 0x9a, 0xf8, 0x71, 0xfc, 0x58, 0x12, 0x3f, 0x4e, 0x3c, 0xc4, 0xc4, - 0x8f, 0x5a, 0xca, 0xc6, 0xc9, 0x87, 0x9b, 0xb2, 0x71, 0x1b, 0x46, 0xdd, 0xf0, 0x7e, 0x70, 0xdf, - 0x89, 0xdc, 0x85, 0xda, 0xaa, 0xc8, 0x10, 0x98, 0x93, 0x84, 0xa6, 0x9a, 0x16, 0x30, 0x6a, 0xe0, - 0x4e, 0xdc, 0x14, 0x89, 0x75, 0xd6, 0x22, 0x79, 0xe5, 0xa9, 0xf7, 0x98, 0xbc, 0xd2, 0x48, 0x01, - 0x89, 0x8e, 0x23, 0x05, 0xe4, 0xdb, 0x2c, 0x1b, 0xc5, 0xa6, 0xb7, 0xb5, 0xe6, 0xb4, 0xd8, 0x0d, - 0xca, 0xdc, 0x1a, 0x96, 0x24, 0x79, 0x67, 0x0d, 0x0a, 0x85, 0x53, 0xa6, 0x9d, 0x49, 0x26, 0xcf, - 0x9c, 0x74, 0x92, 0xc9, 0xb3, 0xc7, 0x98, 0x64, 0xf2, 0x91, 0x13, 0x4d, 0x32, 0xf9, 0xe8, 0xcf, - 0x24, 0xc9, 0xe4, 0x5f, 0x80, 0x73, 0x87, 0x7f, 0x8e, 0x34, 0x8d, 0x79, 0x2d, 0x75, 0x6b, 0x64, - 0xd2, 0x98, 0x33, 0x55, 0x47, 0xa3, 0x2a, 0x9c, 0xe9, 0xee, 0x3b, 0x16, 0x3c, 0xda, 0x23, 0x11, - 0x54, 0xe1, 0x8b, 0x32, 0x2d, 0x98, 0x6c, 0x99, 0x45, 0x0b, 0x5f, 0x6d, 0x33, 0x12, 0x4f, 0xa9, - 0xa0, 0xcb, 0x0c, 0x02, 0x67, 0xd9, 0x2f, 0x7e, 0xe8, 0x47, 0x3f, 0x39, 0xf7, 0x81, 0x1f, 0xff, - 0xe4, 0xdc, 0x07, 0xfe, 0xe8, 0x27, 0xe7, 0x3e, 0xf0, 0x0b, 0xfb, 0xe7, 0xac, 0x1f, 0xed, 0x9f, - 0xb3, 0x7e, 0xbc, 0x7f, 0xce, 0xfa, 0x93, 0xfd, 0x73, 0xd6, 0xd7, 0x7f, 0x7a, 0xee, 0x03, 0x9f, - 0x2d, 0xed, 0x5c, 0xfa, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x58, 0x88, 0x8c, 0xe4, 0xbd, - 0x00, 0x00, + 0x95, 0x18, 0xee, 0x9e, 0xe1, 0xd7, 0x3c, 0x7e, 0x6e, 0xed, 0x87, 0x28, 0x5a, 0x5a, 0xae, 0x5a, + 0x96, 0xbc, 0x92, 0x56, 0xa4, 0x77, 0x25, 0x59, 0x6b, 0xcb, 0x3f, 0xd9, 0x24, 0x87, 0xdc, 0xa5, + 0xf7, 0x6b, 0x54, 0xc3, 0xdd, 0x95, 0x6d, 0xfd, 0x2c, 0x35, 0xa7, 0x8b, 0x64, 0x6b, 0x7b, 0xba, + 0x47, 0xdd, 0x3d, 0xdc, 0xa5, 0x1d, 0x03, 0x77, 0x8e, 0xe1, 0x4b, 0x10, 0x27, 0xf1, 0xe1, 0x62, + 0x20, 0x48, 0x02, 0xf8, 0x10, 0x20, 0x81, 0x73, 0xf9, 0x74, 0x8c, 0xb3, 0x7d, 0x88, 0x2f, 0x41, + 0x2e, 0xe7, 0x8b, 0x0f, 0x48, 0x2e, 0x06, 0x0e, 0xc9, 0x5d, 0xbe, 0x78, 0x27, 0x3a, 0x77, 0x7f, + 0xe6, 0x8f, 0xdc, 0x7f, 0x4c, 0x90, 0x04, 0xf5, 0xd9, 0x55, 0x3d, 0x33, 0xec, 0x1e, 0x6a, 0x49, + 0xcb, 0x46, 0xfe, 0x9b, 0x79, 0xef, 0xd5, 0xab, 0x8f, 0xae, 0x7a, 0xf5, 0xde, 0xab, 0x57, 0xaf, + 0xe0, 0xc2, 0xbd, 0xcb, 0xf1, 0x9c, 0x17, 0xce, 0xdf, 0x6b, 0xaf, 0x93, 0x28, 0x20, 0x09, 0x89, + 0xe7, 0x5b, 0xf7, 0x36, 0xe7, 0x9d, 0x96, 0x37, 0xbf, 0x7d, 0x71, 0x7e, 0x93, 0x04, 0x24, 0x72, + 0x12, 0xe2, 0xce, 0xb5, 0xa2, 0x30, 0x09, 0xd1, 0x63, 0x9c, 0x7a, 0x2e, 0xa5, 0x9e, 0x6b, 0xdd, + 0xdb, 0x9c, 0x73, 0x5a, 0xde, 0xdc, 0xf6, 0xc5, 0x99, 0xe7, 0x37, 0xbd, 0x64, 0xab, 0xbd, 0x3e, + 0xd7, 0x08, 0x9b, 0xf3, 0x9b, 0xe1, 0x66, 0x38, 0xcf, 0x0a, 0xad, 0xb7, 0x37, 0xd8, 0x3f, 0xf6, + 0x87, 0xfd, 0xe2, 0xcc, 0x66, 0x5e, 0x14, 0x55, 0x3b, 0x2d, 0xaf, 0xe9, 0x34, 0xb6, 0xbc, 0x80, + 0x44, 0x3b, 0xaa, 0xf2, 0x88, 0xc4, 0x61, 0x3b, 0x6a, 0x90, 0x6c, 0x13, 0x0e, 0x2c, 0x15, 0xcf, + 0x37, 0x49, 0xe2, 0x74, 0x69, 0xf8, 0xcc, 0x7c, 0xaf, 0x52, 0x51, 0x3b, 0x48, 0xbc, 0x66, 0x67, + 0x35, 0x1f, 0xcd, 0x2b, 0x10, 0x37, 0xb6, 0x48, 0xd3, 0xe9, 0x28, 0xf7, 0x42, 0xaf, 0x72, 0xed, + 0xc4, 0xf3, 0xe7, 0xbd, 0x20, 0x89, 0x93, 0xe8, 0xa0, 0x3e, 0xc5, 0x24, 0xda, 0x26, 0x51, 0xda, + 0x21, 0xf2, 0xc0, 0x69, 0xb6, 0x7c, 0xd2, 0xa5, 0x4f, 0xf6, 0x1f, 0x58, 0x70, 0x6e, 0xe1, 0x6e, + 0x7d, 0xd9, 0x77, 0xe2, 0xc4, 0x6b, 0x2c, 0xfa, 0x61, 0xe3, 0x5e, 0x3d, 0x09, 0x23, 0x72, 0x27, + 0xf4, 0xdb, 0x4d, 0x52, 0x67, 0xc3, 0x87, 0x2e, 0xc0, 0xc8, 0x36, 0xfb, 0xbf, 0x5a, 0x9d, 0xb6, + 0xce, 0x59, 0xe7, 0x2b, 0x8b, 0x53, 0x3f, 0xda, 0x9d, 0xfd, 0xc0, 0xde, 0xee, 0xec, 0xc8, 0x1d, + 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x0d, 0x43, 0x1b, 0xf1, 0xda, 0x4e, 0x8b, 0x4c, 0x97, 0x18, 0xed, + 0x84, 0xa0, 0x1d, 0x5a, 0xa9, 0x53, 0x28, 0x16, 0x58, 0x34, 0x0f, 0x95, 0x96, 0x13, 0x25, 0x5e, + 0xe2, 0x85, 0xc1, 0x74, 0xf9, 0x9c, 0x75, 0x7e, 0x70, 0xf1, 0x84, 0x20, 0xad, 0xd4, 0x24, 0x02, + 0xa7, 0x34, 0xb4, 0x19, 0x11, 0x71, 0xdc, 0x5b, 0x81, 0xbf, 0x33, 0x3d, 0x70, 0xce, 0x3a, 0x3f, + 0x92, 0x36, 0x03, 0x0b, 0x38, 0x56, 0x14, 0xf6, 0xf7, 0x4b, 0x30, 0xb2, 0xb0, 0xb1, 0xe1, 0x05, + 0x5e, 0xb2, 0x83, 0xde, 0x82, 0xb1, 0x20, 0x74, 0x89, 0xfc, 0xcf, 0x7a, 0x31, 0x7a, 0xe9, 0xd9, + 0xb9, 0x83, 0xa6, 0xe2, 0xdc, 0x4d, 0xad, 0xc4, 0xe2, 0xd4, 0xde, 0xee, 0xec, 0x98, 0x0e, 0xc1, + 0x06, 0x47, 0xf4, 0x06, 0x8c, 0xb6, 0x42, 0x57, 0x55, 0x50, 0x62, 0x15, 0x3c, 0x73, 0x70, 0x05, + 0xb5, 0xb4, 0xc0, 0xe2, 0xe4, 0xde, 0xee, 0xec, 0xa8, 0x06, 0xc0, 0x3a, 0x3b, 0xe4, 0xc3, 0x24, + 0xfd, 0x1b, 0x24, 0x9e, 0xaa, 0xa1, 0xcc, 0x6a, 0x78, 0x3e, 0xbf, 0x06, 0xad, 0xd0, 0xe2, 0xc9, + 0xbd, 0xdd, 0xd9, 0xc9, 0x0c, 0x10, 0x67, 0x59, 0xdb, 0x5f, 0x80, 0x89, 0x85, 0x24, 0x71, 0x1a, + 0x5b, 0xc4, 0xe5, 0xdf, 0x17, 0xbd, 0x08, 0x03, 0x81, 0xd3, 0x24, 0xe2, 0xeb, 0x9f, 0x13, 0xc3, + 0x3e, 0x70, 0xd3, 0x69, 0x92, 0xfd, 0xdd, 0xd9, 0xa9, 0xdb, 0x81, 0xf7, 0x4e, 0x5b, 0xcc, 0x19, + 0x0a, 0xc3, 0x8c, 0x1a, 0x5d, 0x02, 0x70, 0xc9, 0xb6, 0xd7, 0x20, 0x35, 0x27, 0xd9, 0x12, 0xb3, + 0x01, 0x89, 0xb2, 0x50, 0x55, 0x18, 0xac, 0x51, 0xd9, 0x5f, 0xb6, 0xa0, 0xb2, 0xb0, 0x1d, 0x7a, + 0x6e, 0x2d, 0x74, 0x63, 0xd4, 0x86, 0xc9, 0x56, 0x44, 0x36, 0x48, 0xa4, 0x40, 0xd3, 0xd6, 0xb9, + 0xf2, 0xf9, 0xd1, 0x4b, 0x97, 0x72, 0xfa, 0x6d, 0x16, 0x5a, 0x0e, 0x92, 0x68, 0x67, 0xf1, 0x11, + 0x51, 0xf5, 0x64, 0x06, 0x8b, 0xb3, 0x75, 0xd8, 0xbf, 0x5c, 0x82, 0xd3, 0x0b, 0x5f, 0x68, 0x47, + 0xa4, 0xea, 0xc5, 0xf7, 0xb2, 0x4b, 0xc1, 0xf5, 0xe2, 0x7b, 0x37, 0xd3, 0xc1, 0x50, 0x73, 0xb0, + 0x2a, 0xe0, 0x58, 0x51, 0xa0, 0xe7, 0x61, 0x98, 0xfe, 0xbe, 0x8d, 0x57, 0x45, 0xef, 0x4f, 0x0a, + 0xe2, 0xd1, 0xaa, 0x93, 0x38, 0x55, 0x8e, 0xc2, 0x92, 0x06, 0xdd, 0x80, 0xd1, 0x06, 0x5b, 0xef, + 0x9b, 0x37, 0x42, 0x97, 0xb0, 0x2f, 0x5c, 0x59, 0x7c, 0x8e, 0x92, 0x2f, 0xa5, 0xe0, 0xfd, 0xdd, + 0xd9, 0x69, 0xde, 0x36, 0xc1, 0x42, 0xc3, 0x61, 0xbd, 0x3c, 0xb2, 0xd5, 0x42, 0x1c, 0x60, 0x9c, + 0xa0, 0xcb, 0x22, 0x3c, 0xaf, 0xad, 0xa9, 0x41, 0xb6, 0xa6, 0xc6, 0x7a, 0xac, 0xa7, 0x5f, 0xb3, + 0xc4, 0x98, 0xac, 0x78, 0xbe, 0x29, 0x1e, 0x2e, 0x01, 0xc4, 0xa4, 0x11, 0x91, 0x44, 0x1b, 0x15, + 0xf5, 0x99, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xba, 0xf8, 0xe3, 0x2d, 0x27, 0x62, 0xb3, 0x45, 0x8c, + 0x8d, 0x5a, 0xfc, 0x75, 0x89, 0xc0, 0x29, 0x8d, 0xb1, 0xf8, 0xcb, 0xb9, 0x8b, 0xff, 0xb7, 0x2c, + 0x18, 0x5e, 0xf4, 0x02, 0xd7, 0x0b, 0x36, 0xd1, 0x5b, 0x30, 0x42, 0x25, 0xba, 0xeb, 0x24, 0x8e, + 0x58, 0xf7, 0x1f, 0x91, 0x93, 0x47, 0x17, 0xb0, 0x72, 0xfa, 0xc4, 0x73, 0x94, 0x9a, 0x4e, 0xa2, + 0x5b, 0xeb, 0x6f, 0x93, 0x46, 0x72, 0x83, 0x24, 0x4e, 0xda, 0x9d, 0x14, 0x86, 0x15, 0x57, 0x74, + 0x1b, 0x86, 0x12, 0x27, 0xda, 0x24, 0x89, 0x58, 0xf6, 0x39, 0x8b, 0x92, 0xf3, 0xc0, 0x74, 0xca, + 0x91, 0xa0, 0x41, 0x52, 0x01, 0xb9, 0xc6, 0x98, 0x60, 0xc1, 0xcc, 0x6e, 0xc0, 0xd8, 0x92, 0xd3, + 0x72, 0xd6, 0x3d, 0xdf, 0x4b, 0x3c, 0x12, 0xa3, 0x0f, 0x43, 0xd9, 0x71, 0x5d, 0xb6, 0x00, 0x2a, + 0x8b, 0xa7, 0xf7, 0x76, 0x67, 0xcb, 0x0b, 0xae, 0xbb, 0xbf, 0x3b, 0x0b, 0x8a, 0x6a, 0x07, 0x53, + 0x0a, 0xf4, 0x2c, 0x0c, 0xb8, 0x51, 0xd8, 0x9a, 0x2e, 0x31, 0xca, 0x33, 0x74, 0xa5, 0x56, 0xa3, + 0xb0, 0x95, 0x21, 0x65, 0x34, 0xf6, 0x0f, 0x4b, 0x80, 0x96, 0x48, 0x6b, 0x6b, 0xa5, 0x6e, 0x7c, + 0xd3, 0xf3, 0x30, 0xd2, 0x0c, 0x03, 0x2f, 0x09, 0xa3, 0x58, 0x54, 0xc8, 0xe6, 0xc5, 0x0d, 0x01, + 0xc3, 0x0a, 0x8b, 0xce, 0xc1, 0x40, 0x2b, 0x5d, 0xde, 0x63, 0x52, 0x34, 0xb0, 0x85, 0xcd, 0x30, + 0x94, 0xa2, 0x1d, 0x93, 0x48, 0xcc, 0x67, 0x45, 0x71, 0x3b, 0x26, 0x11, 0x66, 0x98, 0x74, 0x06, + 0xd1, 0xb9, 0x25, 0x66, 0x6b, 0x66, 0x06, 0x51, 0x0c, 0xd6, 0xa8, 0xd0, 0x9b, 0x50, 0xe1, 0xff, + 0x30, 0xd9, 0x60, 0x53, 0x37, 0x57, 0x28, 0x5c, 0x0f, 0x1b, 0x8e, 0x9f, 0x1d, 0xfc, 0x71, 0x36, + 0xe3, 0x24, 0x23, 0x9c, 0xf2, 0x34, 0x66, 0xdc, 0x50, 0xee, 0x8c, 0xfb, 0xeb, 0x16, 0xa0, 0x25, + 0x2f, 0x70, 0x49, 0x74, 0x0c, 0x5b, 0x67, 0x7f, 0x8b, 0xe1, 0x3f, 0xd3, 0xa6, 0x85, 0xcd, 0x56, + 0x18, 0x90, 0x20, 0x59, 0x0a, 0x03, 0x97, 0x6f, 0xa7, 0x1f, 0x87, 0x81, 0x84, 0x56, 0xc5, 0x9b, + 0xf5, 0xb4, 0xfc, 0x2c, 0xb4, 0x82, 0xfd, 0xdd, 0xd9, 0x33, 0x9d, 0x25, 0x58, 0x13, 0x58, 0x19, + 0xf4, 0x31, 0x18, 0x8a, 0x13, 0x27, 0x69, 0xc7, 0xa2, 0xa1, 0x4f, 0xc8, 0x86, 0xd6, 0x19, 0x74, + 0x7f, 0x77, 0x76, 0x52, 0x15, 0xe3, 0x20, 0x2c, 0x0a, 0xa0, 0x67, 0x60, 0xb8, 0x49, 0xe2, 0xd8, + 0xd9, 0x94, 0x02, 0x6e, 0x52, 0x94, 0x1d, 0xbe, 0xc1, 0xc1, 0x58, 0xe2, 0xd1, 0x93, 0x30, 0x48, + 0xa2, 0x28, 0x8c, 0xc4, 0x8c, 0x18, 0x17, 0x84, 0x83, 0xcb, 0x14, 0x88, 0x39, 0xce, 0xfe, 0x8f, + 0x16, 0x4c, 0xaa, 0xb6, 0xf2, 0xba, 0x8e, 0x61, 0xc9, 0xbb, 0x00, 0x0d, 0xd9, 0xc1, 0x98, 0x2d, + 0x34, 0xad, 0x8e, 0xee, 0xd3, 0xaf, 0x73, 0x40, 0xd3, 0x3a, 0x14, 0x28, 0xc6, 0x1a, 0x5f, 0xfb, + 0x5f, 0x5b, 0x70, 0x32, 0xd3, 0xb7, 0xeb, 0x5e, 0x9c, 0xa0, 0x37, 0x3a, 0xfa, 0x37, 0x57, 0xac, + 0x7f, 0xb4, 0x34, 0xeb, 0x9d, 0x9a, 0x2f, 0x12, 0xa2, 0xf5, 0x0d, 0xc3, 0xa0, 0x97, 0x90, 0xa6, + 0xec, 0xd6, 0xf3, 0x05, 0xbb, 0xc5, 0xdb, 0x97, 0x7e, 0xa5, 0x55, 0xca, 0x03, 0x73, 0x56, 0xf6, + 0xff, 0xb4, 0xa0, 0xb2, 0x14, 0x06, 0x1b, 0xde, 0xe6, 0x0d, 0xa7, 0x75, 0x0c, 0xdf, 0xa7, 0x0e, + 0x03, 0x8c, 0x3b, 0xef, 0xc2, 0xc5, 0xbc, 0x2e, 0x88, 0x86, 0xcd, 0xd1, 0x3d, 0x95, 0x2b, 0x0b, + 0x4a, 0x4c, 0x51, 0x10, 0x66, 0xcc, 0x66, 0x5e, 0x86, 0x8a, 0x22, 0x40, 0x53, 0x50, 0xbe, 0x47, + 0xb8, 0x26, 0x59, 0xc1, 0xf4, 0x27, 0x3a, 0x05, 0x83, 0xdb, 0x8e, 0xdf, 0x16, 0x8b, 0x17, 0xf3, + 0x3f, 0x1f, 0x2f, 0x5d, 0xb6, 0xec, 0x1f, 0xb2, 0x15, 0x28, 0x2a, 0x59, 0x0e, 0xb6, 0x85, 0x70, + 0xf8, 0x8a, 0x05, 0xa7, 0xfc, 0x2e, 0x42, 0x49, 0x8c, 0xc9, 0x61, 0xc4, 0xd9, 0x63, 0xa2, 0xd9, + 0xa7, 0xba, 0x61, 0x71, 0xd7, 0xda, 0xa8, 0xac, 0x0f, 0x5b, 0x74, 0xc2, 0x39, 0x3e, 0x6b, 0xba, + 0xd0, 0x01, 0x6e, 0x09, 0x18, 0x56, 0x58, 0xfb, 0x4f, 0x2d, 0x38, 0xa5, 0xfa, 0x71, 0x8d, 0xec, + 0xd4, 0x89, 0x4f, 0x1a, 0x49, 0x18, 0xbd, 0x5f, 0x7a, 0xf2, 0x38, 0xff, 0x26, 0x5c, 0x26, 0x8d, + 0x0a, 0x06, 0xe5, 0x6b, 0x64, 0x87, 0x7f, 0x20, 0xbd, 0xa3, 0xe5, 0x03, 0x3b, 0xfa, 0xcf, 0x2c, + 0x18, 0x57, 0x1d, 0x3d, 0x86, 0x25, 0x77, 0xdd, 0x5c, 0x72, 0x1f, 0x2e, 0x38, 0x5f, 0x7b, 0x2c, + 0xb6, 0xbf, 0x56, 0xa2, 0x62, 0x43, 0xd0, 0xd4, 0xa2, 0x90, 0x0e, 0x12, 0x95, 0xf8, 0xef, 0x93, + 0xaf, 0xd4, 0x5f, 0x67, 0xaf, 0x91, 0x9d, 0xb5, 0x90, 0x6a, 0x13, 0xdd, 0x3b, 0x6b, 0x7c, 0xd4, + 0x81, 0x03, 0x3f, 0xea, 0xef, 0x96, 0xe0, 0xb4, 0x1a, 0x16, 0x63, 0x97, 0xfe, 0xb9, 0x1c, 0x98, + 0x8b, 0x30, 0xea, 0x92, 0x0d, 0xa7, 0xed, 0x27, 0xca, 0x9a, 0x18, 0xe4, 0x66, 0x66, 0x35, 0x05, + 0x63, 0x9d, 0xa6, 0x8f, 0xb1, 0xfc, 0xe6, 0x28, 0x93, 0xe7, 0x89, 0x43, 0x67, 0x3d, 0xd5, 0xf0, + 0x34, 0xf3, 0x70, 0x4c, 0x37, 0x0f, 0x85, 0x29, 0xf8, 0x24, 0x0c, 0x7a, 0x4d, 0xba, 0xe7, 0x97, + 0xcc, 0xad, 0x7c, 0x95, 0x02, 0x31, 0xc7, 0xa1, 0xa7, 0x60, 0xb8, 0x11, 0x36, 0x9b, 0x4e, 0xe0, + 0x4e, 0x97, 0x99, 0xce, 0x39, 0x4a, 0xd5, 0x82, 0x25, 0x0e, 0xc2, 0x12, 0x87, 0x1e, 0x83, 0x01, + 0x27, 0xda, 0x8c, 0xa7, 0x07, 0x18, 0xcd, 0x08, 0xad, 0x69, 0x21, 0xda, 0x8c, 0x31, 0x83, 0x52, + 0x5d, 0xf2, 0x7e, 0x18, 0xdd, 0xf3, 0x82, 0xcd, 0xaa, 0x17, 0x31, 0xc5, 0x50, 0xd3, 0x25, 0xef, + 0x2a, 0x0c, 0xd6, 0xa8, 0x50, 0x0d, 0x06, 0x5b, 0x61, 0x94, 0xc4, 0xd3, 0x43, 0x6c, 0xe0, 0x9f, + 0xcb, 0x5d, 0x7e, 0xbc, 0xdf, 0xb5, 0x30, 0x4a, 0xd2, 0xae, 0xd0, 0x7f, 0x31, 0xe6, 0x8c, 0xd0, + 0x12, 0x94, 0x49, 0xb0, 0x3d, 0x3d, 0xcc, 0xf8, 0x7d, 0xe8, 0x60, 0x7e, 0xcb, 0xc1, 0xf6, 0x1d, + 0x27, 0x4a, 0xe5, 0xd5, 0x72, 0xb0, 0x8d, 0x69, 0x69, 0xd4, 0x80, 0x8a, 0x74, 0x61, 0xc5, 0xd3, + 0x23, 0x45, 0xa6, 0x22, 0x16, 0xe4, 0x98, 0xbc, 0xd3, 0xf6, 0x22, 0xd2, 0x24, 0x41, 0x12, 0xa7, + 0x86, 0x95, 0xc4, 0xc6, 0x38, 0xe5, 0x8b, 0x1a, 0x30, 0xc6, 0xf5, 0xcf, 0x1b, 0x61, 0x3b, 0x48, + 0xe2, 0xe9, 0x0a, 0x6b, 0x72, 0x8e, 0xe7, 0xe2, 0x4e, 0x5a, 0x62, 0xf1, 0x94, 0x60, 0x3f, 0xa6, + 0x01, 0x63, 0x6c, 0x30, 0x45, 0x6f, 0xc0, 0xb8, 0xef, 0x6d, 0x93, 0x80, 0xc4, 0x71, 0x2d, 0x0a, + 0xd7, 0xc9, 0x34, 0xb0, 0xde, 0x3c, 0x99, 0x67, 0xc5, 0x87, 0xeb, 0x64, 0xf1, 0xc4, 0xde, 0xee, + 0xec, 0xf8, 0x75, 0xbd, 0x34, 0x36, 0x99, 0xa1, 0x37, 0x61, 0x82, 0x2a, 0xbb, 0x5e, 0xca, 0x7e, + 0xb4, 0x38, 0x7b, 0xb4, 0xb7, 0x3b, 0x3b, 0x81, 0x8d, 0xe2, 0x38, 0xc3, 0x0e, 0xad, 0x41, 0xc5, + 0xf7, 0x36, 0x48, 0x63, 0xa7, 0xe1, 0x93, 0xe9, 0x31, 0xc6, 0x3b, 0x67, 0x71, 0x5e, 0x97, 0xe4, + 0xdc, 0xc0, 0x50, 0x7f, 0x71, 0xca, 0x08, 0xdd, 0x81, 0x33, 0x09, 0x89, 0x9a, 0x5e, 0xe0, 0xd0, + 0x45, 0x25, 0xb4, 0x5f, 0xe6, 0x2a, 0x19, 0x67, 0xb3, 0xf6, 0xac, 0x18, 0xd8, 0x33, 0x6b, 0x5d, + 0xa9, 0x70, 0x8f, 0xd2, 0xe8, 0x16, 0x4c, 0xb2, 0xf5, 0x54, 0x6b, 0xfb, 0x7e, 0x2d, 0xf4, 0xbd, + 0xc6, 0xce, 0xf4, 0x04, 0x63, 0xf8, 0x94, 0x74, 0x80, 0xac, 0x9a, 0x68, 0x6a, 0x18, 0xa6, 0xff, + 0x70, 0xb6, 0x34, 0xf2, 0x61, 0x32, 0x26, 0x8d, 0x76, 0xe4, 0x25, 0x3b, 0x74, 0xee, 0x93, 0x07, + 0xc9, 0xf4, 0x64, 0x11, 0x43, 0xb7, 0x6e, 0x16, 0xe2, 0xde, 0xa7, 0x0c, 0x10, 0x67, 0x59, 0x53, + 0x51, 0x11, 0x27, 0xae, 0x17, 0x4c, 0x4f, 0x31, 0x09, 0xa4, 0xd6, 0x57, 0x9d, 0x02, 0x31, 0xc7, + 0x31, 0xff, 0x01, 0xfd, 0x71, 0x8b, 0x4a, 0xe9, 0x13, 0x8c, 0x30, 0xf5, 0x1f, 0x48, 0x04, 0x4e, + 0x69, 0xa8, 0x6a, 0x90, 0x24, 0x3b, 0xd3, 0x88, 0x91, 0xaa, 0xa5, 0xb6, 0xb6, 0xf6, 0x19, 0x4c, + 0xe1, 0xe8, 0x0e, 0x0c, 0x93, 0x60, 0x7b, 0x25, 0x0a, 0x9b, 0xd3, 0x27, 0x8b, 0xc8, 0x80, 0x65, + 0x4e, 0xcc, 0xf7, 0x8f, 0xd4, 0x84, 0x11, 0x60, 0x2c, 0x99, 0xa1, 0x07, 0x30, 0xdd, 0xe5, 0x2b, + 0xf1, 0x8f, 0x72, 0x8a, 0x7d, 0x94, 0x4f, 0x88, 0xb2, 0xd3, 0x6b, 0x3d, 0xe8, 0xf6, 0x0f, 0xc0, + 0xe1, 0x9e, 0xdc, 0xed, 0x75, 0x98, 0x50, 0x82, 0x8a, 0x7d, 0x6f, 0x34, 0x0b, 0x83, 0x54, 0x16, + 0x4b, 0x83, 0xbe, 0x42, 0x07, 0x95, 0x8a, 0xe8, 0x18, 0x73, 0x38, 0x1b, 0x54, 0xef, 0x0b, 0x64, + 0x71, 0x27, 0x21, 0xdc, 0xb0, 0x2b, 0x6b, 0x83, 0x2a, 0x11, 0x38, 0xa5, 0xb1, 0xff, 0x37, 0x57, + 0x93, 0x52, 0x69, 0x58, 0x60, 0x27, 0xb8, 0x00, 0x23, 0x5b, 0x61, 0x9c, 0x50, 0x6a, 0x56, 0xc7, + 0x60, 0xaa, 0x18, 0x5d, 0x15, 0x70, 0xac, 0x28, 0xd0, 0x2b, 0x30, 0xde, 0xd0, 0x2b, 0x10, 0xdb, + 0xd8, 0x69, 0x51, 0xc4, 0xac, 0x1d, 0x9b, 0xb4, 0xe8, 0x32, 0x8c, 0x30, 0x2f, 0x77, 0x23, 0xf4, + 0x85, 0x09, 0x29, 0x77, 0xe5, 0x91, 0x9a, 0x80, 0xef, 0x6b, 0xbf, 0xb1, 0xa2, 0xa6, 0x86, 0x38, + 0x6d, 0xc2, 0x6a, 0x4d, 0x6c, 0x20, 0xca, 0x10, 0xbf, 0xca, 0xa0, 0x58, 0x60, 0xed, 0x7f, 0x52, + 0xd2, 0x46, 0x99, 0x1a, 0x40, 0x04, 0x7d, 0x16, 0x86, 0xef, 0x3b, 0x5e, 0xe2, 0x05, 0x9b, 0x42, + 0x7b, 0x78, 0xa1, 0xe0, 0x6e, 0xc2, 0x8a, 0xdf, 0xe5, 0x45, 0xf9, 0xce, 0x27, 0xfe, 0x60, 0xc9, + 0x90, 0xf2, 0x8e, 0xda, 0x41, 0x40, 0x79, 0x97, 0xfa, 0xe7, 0x8d, 0x79, 0x51, 0xce, 0x5b, 0xfc, + 0xc1, 0x92, 0x21, 0xda, 0x00, 0x90, 0x73, 0x89, 0xb8, 0xc2, 0xbb, 0xfc, 0xd1, 0x7e, 0xd8, 0xaf, + 0xa9, 0xd2, 0x8b, 0x13, 0x74, 0xaf, 0x4d, 0xff, 0x63, 0x8d, 0xb3, 0x9d, 0x30, 0x25, 0xac, 0xb3, + 0x59, 0xe8, 0x73, 0x74, 0x49, 0x3b, 0x51, 0x42, 0xdc, 0x85, 0x24, 0xeb, 0xa0, 0x3f, 0x58, 0xc5, + 0x5e, 0xf3, 0x9a, 0x44, 0x5f, 0xfe, 0x82, 0x09, 0x4e, 0xf9, 0xd9, 0xdf, 0x2b, 0xc3, 0x74, 0xaf, + 0xe6, 0xd2, 0x29, 0x49, 0x1e, 0x78, 0xc9, 0x12, 0x55, 0x93, 0x2c, 0x73, 0x4a, 0x2e, 0x0b, 0x38, + 0x56, 0x14, 0x74, 0x6e, 0xc4, 0xde, 0xa6, 0x34, 0x96, 0x06, 0xd3, 0xb9, 0x51, 0x67, 0x50, 0x2c, + 0xb0, 0x94, 0x2e, 0x22, 0x4e, 0x2c, 0x0e, 0x37, 0xb4, 0x39, 0x84, 0x19, 0x14, 0x0b, 0xac, 0xee, + 0x10, 0x19, 0xc8, 0x71, 0x88, 0x18, 0x43, 0x34, 0xf8, 0x70, 0x87, 0x08, 0x7d, 0x1e, 0x60, 0xc3, + 0x0b, 0xbc, 0x78, 0x8b, 0x71, 0x1f, 0xea, 0x9b, 0xbb, 0x52, 0xb2, 0x56, 0x14, 0x17, 0xac, 0x71, + 0x44, 0x2f, 0xc1, 0xa8, 0x5a, 0x9e, 0xab, 0xd5, 0xe9, 0x61, 0xd3, 0x21, 0x9e, 0xca, 0xaa, 0x2a, + 0xd6, 0xe9, 0xec, 0xb7, 0xb3, 0xf3, 0x45, 0xac, 0x0a, 0x6d, 0x7c, 0xad, 0xa2, 0xe3, 0x5b, 0x3a, + 0x78, 0x7c, 0xed, 0xff, 0x50, 0x86, 0x49, 0xa3, 0xb2, 0x76, 0x5c, 0x40, 0xa2, 0xbd, 0x46, 0x37, + 0x2c, 0x27, 0x21, 0x62, 0x4d, 0x5e, 0xe8, 0x67, 0xd1, 0xe8, 0xdb, 0x1b, 0x5d, 0x0b, 0x9c, 0x13, + 0xda, 0x82, 0x8a, 0xef, 0xc4, 0xcc, 0xa5, 0x42, 0xc4, 0x5a, 0xec, 0x8f, 0x6d, 0x6a, 0x7e, 0x38, + 0x71, 0xa2, 0xed, 0x1e, 0xbc, 0x96, 0x94, 0x39, 0xdd, 0x6d, 0xa9, 0xb2, 0x23, 0x4f, 0xd4, 0x54, + 0x73, 0xa8, 0x46, 0xb4, 0x83, 0x39, 0x0e, 0x5d, 0x86, 0xb1, 0x88, 0xb0, 0x99, 0xb2, 0x44, 0xf5, + 0x39, 0x36, 0xf5, 0x06, 0x53, 0xc5, 0x0f, 0x6b, 0x38, 0x6c, 0x50, 0xa6, 0x7a, 0xff, 0xd0, 0x01, + 0x7a, 0xff, 0x33, 0x30, 0xcc, 0x7e, 0xa8, 0x59, 0xa1, 0xbe, 0xd0, 0x2a, 0x07, 0x63, 0x89, 0xcf, + 0x4e, 0xa2, 0x91, 0x82, 0x93, 0xe8, 0x59, 0x98, 0xa8, 0x3a, 0xa4, 0x19, 0x06, 0xcb, 0x81, 0xdb, + 0x0a, 0xbd, 0x20, 0x41, 0xd3, 0x30, 0xc0, 0xf6, 0x13, 0xbe, 0xde, 0x07, 0x28, 0x07, 0x3c, 0x40, + 0x75, 0x77, 0xfb, 0xff, 0x58, 0x30, 0x5e, 0x25, 0x3e, 0x49, 0x08, 0xb7, 0x7b, 0x62, 0xb4, 0x02, + 0x68, 0x33, 0x72, 0x1a, 0xa4, 0x46, 0x22, 0x2f, 0x74, 0xeb, 0xa4, 0x11, 0x06, 0xec, 0x20, 0x8a, + 0x6e, 0x90, 0x67, 0xf6, 0x76, 0x67, 0xd1, 0x95, 0x0e, 0x2c, 0xee, 0x52, 0x02, 0xb9, 0x30, 0xde, + 0x8a, 0x88, 0xe1, 0x37, 0xb4, 0xf2, 0x55, 0x8d, 0x9a, 0x5e, 0x84, 0x6b, 0xc3, 0x06, 0x08, 0x9b, + 0x4c, 0xd1, 0xa7, 0x60, 0x2a, 0x8c, 0x5a, 0x5b, 0x4e, 0x50, 0x25, 0x2d, 0x12, 0xb8, 0xd4, 0x04, + 0x10, 0xde, 0x8e, 0x53, 0x7b, 0xbb, 0xb3, 0x53, 0xb7, 0x32, 0x38, 0xdc, 0x41, 0x6d, 0xbf, 0x03, + 0xa7, 0xab, 0xe1, 0xfd, 0xe0, 0xbe, 0x13, 0xb9, 0x0b, 0xb5, 0x55, 0xcd, 0x81, 0xf0, 0xba, 0x34, + 0x50, 0xf9, 0x21, 0x5c, 0xce, 0xee, 0xa3, 0xf1, 0xe0, 0xa6, 0xc1, 0x8a, 0xe7, 0x93, 0x1e, 0x2e, + 0x8b, 0xbf, 0x5f, 0x32, 0xea, 0x4c, 0xe9, 0xd5, 0xf9, 0x82, 0xd5, 0xf3, 0x7c, 0xe1, 0x73, 0x30, + 0xb2, 0xe1, 0x11, 0xdf, 0xc5, 0x64, 0x43, 0x8c, 0xe8, 0xc5, 0x22, 0x07, 0x30, 0x2b, 0xb4, 0x8c, + 0xf4, 0x60, 0x71, 0x43, 0x77, 0x45, 0xb0, 0xc1, 0x8a, 0x21, 0x6a, 0xc3, 0x94, 0xb4, 0x95, 0x24, + 0x56, 0x2c, 0xc8, 0x17, 0x8a, 0x99, 0x62, 0x66, 0x35, 0xec, 0x13, 0xe0, 0x0c, 0x43, 0xdc, 0x51, + 0x05, 0xb5, 0x71, 0x9b, 0x74, 0x3b, 0x1a, 0x60, 0xd3, 0x93, 0xd9, 0xb8, 0xcc, 0x5c, 0x67, 0x50, + 0xfb, 0xef, 0x5a, 0xf0, 0x48, 0xc7, 0x68, 0x09, 0x5f, 0xc6, 0x91, 0x7d, 0xa3, 0xac, 0x43, 0xa1, + 0x94, 0xef, 0x50, 0xb0, 0x6f, 0xc1, 0xa9, 0xe5, 0x66, 0x2b, 0xd9, 0xa9, 0x7a, 0xe6, 0xb1, 0xc8, + 0xcb, 0x30, 0xd4, 0x24, 0xae, 0xd7, 0x6e, 0x8a, 0xcf, 0x3a, 0x2b, 0x65, 0xf7, 0x0d, 0x06, 0xdd, + 0xdf, 0x9d, 0x1d, 0xaf, 0x27, 0x61, 0xe4, 0x6c, 0x12, 0x0e, 0xc0, 0x82, 0xdc, 0x7e, 0xd7, 0x82, + 0x49, 0xb9, 0x86, 0x17, 0x5c, 0x37, 0x22, 0x71, 0x8c, 0x66, 0xa0, 0xe4, 0xb5, 0x04, 0x23, 0x10, + 0x8c, 0x4a, 0xab, 0x35, 0x5c, 0xf2, 0x5a, 0xe8, 0xb3, 0x50, 0xe1, 0xa7, 0x69, 0xe9, 0xe4, 0xe8, + 0xf3, 0x74, 0x8e, 0xd9, 0x6f, 0x6b, 0x92, 0x07, 0x4e, 0xd9, 0x49, 0x4d, 0x96, 0xed, 0x0e, 0x65, + 0xf3, 0x6c, 0xe7, 0xaa, 0x80, 0x63, 0x45, 0x81, 0xce, 0xc3, 0x48, 0x10, 0xba, 0xfc, 0xc0, 0x93, + 0xef, 0xf3, 0x6c, 0xca, 0xdd, 0x14, 0x30, 0xac, 0xb0, 0xf6, 0xd7, 0x2c, 0x18, 0x93, 0x7d, 0x2c, + 0xa8, 0x54, 0xd3, 0x45, 0x92, 0x2a, 0xd4, 0xe9, 0x22, 0xa1, 0x4a, 0x31, 0xc3, 0x18, 0xba, 0x70, + 0xb9, 0x1f, 0x5d, 0xd8, 0xfe, 0x8d, 0x12, 0x4c, 0xc8, 0xe6, 0xd4, 0xdb, 0xeb, 0x31, 0xa1, 0xaa, + 0x42, 0xc5, 0xe1, 0x83, 0x4f, 0xe4, 0x3c, 0x7b, 0x3e, 0xcf, 0x5e, 0x32, 0xbe, 0x59, 0xaa, 0x8a, + 0x2c, 0x48, 0x3e, 0x38, 0x65, 0x89, 0xb6, 0xe1, 0x44, 0x10, 0x26, 0x6c, 0x0b, 0x52, 0xf8, 0x62, + 0xa7, 0x11, 0xd9, 0x7a, 0x1e, 0x15, 0xf5, 0x9c, 0xb8, 0x99, 0xe5, 0x87, 0x3b, 0xab, 0x40, 0xb7, + 0xa4, 0x1f, 0xa8, 0xcc, 0xea, 0x7a, 0xb6, 0x58, 0x5d, 0xbd, 0xdd, 0x40, 0xf6, 0xef, 0x58, 0x50, + 0x91, 0x64, 0xc7, 0x71, 0x2c, 0x75, 0x17, 0x86, 0x63, 0xf6, 0x89, 0xe4, 0x70, 0x5d, 0x28, 0xd6, + 0x05, 0xfe, 0x5d, 0xd3, 0x7d, 0x97, 0xff, 0x8f, 0xb1, 0xe4, 0xc6, 0x1c, 0xe2, 0xaa, 0x23, 0xef, + 0x3b, 0x87, 0xb8, 0x6a, 0x59, 0xef, 0xd3, 0xa7, 0x71, 0xc3, 0x62, 0xa7, 0xca, 0x63, 0x2b, 0x22, + 0x1b, 0xde, 0x83, 0xac, 0xf2, 0x58, 0x63, 0x50, 0x2c, 0xb0, 0x68, 0x03, 0xc6, 0x1a, 0xd2, 0x65, + 0x9c, 0x8a, 0x90, 0x8f, 0x14, 0xf4, 0xcf, 0xab, 0xa3, 0x1e, 0x1e, 0x3e, 0xb4, 0xa4, 0x71, 0xc2, + 0x06, 0x5f, 0x2a, 0xa7, 0xd2, 0xd3, 0xec, 0x72, 0x41, 0xe7, 0x4a, 0x44, 0x92, 0xb4, 0x86, 0x9e, + 0x07, 0xd9, 0xf6, 0xb7, 0x2c, 0x18, 0xe2, 0x3e, 0xc6, 0x62, 0x8e, 0x5a, 0xed, 0x10, 0x2b, 0x1d, + 0xcf, 0x3b, 0x14, 0x28, 0xce, 0xb4, 0xd0, 0x5d, 0xa8, 0xb0, 0x1f, 0xcc, 0x5f, 0x52, 0x2e, 0x12, + 0x4b, 0xc5, 0xeb, 0xd7, 0x9b, 0x7a, 0x47, 0x32, 0xc0, 0x29, 0x2f, 0xfb, 0x07, 0x65, 0x2a, 0xfa, + 0x52, 0x52, 0x63, 0x6f, 0xb7, 0x8e, 0x63, 0x6f, 0x2f, 0x1d, 0xfd, 0xde, 0xfe, 0x0e, 0x4c, 0x36, + 0xb4, 0x43, 0xb4, 0xf4, 0x8b, 0x5f, 0x2a, 0x38, 0xad, 0xb4, 0x93, 0x37, 0xee, 0x53, 0x5b, 0x32, + 0xd9, 0xe1, 0x2c, 0x7f, 0x44, 0x60, 0x8c, 0xcf, 0x07, 0x51, 0xdf, 0x00, 0xab, 0x6f, 0xbe, 0xc8, + 0x0c, 0xd3, 0x2b, 0x63, 0xb3, 0xb8, 0xae, 0x31, 0xc2, 0x06, 0x5b, 0xfb, 0x6f, 0x0c, 0xc2, 0xe0, + 0xf2, 0x36, 0x09, 0x92, 0x63, 0x10, 0x75, 0x4d, 0x98, 0xf0, 0x82, 0xed, 0xd0, 0xdf, 0x26, 0x2e, + 0xc7, 0x1f, 0x6e, 0x7b, 0x3f, 0x23, 0x2a, 0x99, 0x58, 0x35, 0x98, 0xe1, 0x0c, 0xf3, 0xa3, 0xb0, + 0xe6, 0x5f, 0x83, 0x21, 0x3e, 0x33, 0x84, 0x29, 0x9f, 0xe3, 0x73, 0x67, 0x03, 0x2b, 0x56, 0x50, + 0xea, 0x73, 0xe0, 0xee, 0x7e, 0xc1, 0x08, 0xbd, 0x0d, 0x13, 0x1b, 0x5e, 0x14, 0x27, 0xd4, 0x20, + 0x8f, 0x13, 0xa7, 0xd9, 0x3a, 0x84, 0x1d, 0xaf, 0x46, 0x64, 0xc5, 0xe0, 0x84, 0x33, 0x9c, 0xd1, + 0x26, 0x8c, 0x53, 0x33, 0x32, 0xad, 0x6a, 0xb8, 0xef, 0xaa, 0x94, 0x1b, 0xef, 0xba, 0xce, 0x08, + 0x9b, 0x7c, 0xa9, 0x48, 0x6a, 0x30, 0xb3, 0x73, 0x84, 0x69, 0x37, 0x4a, 0x24, 0x71, 0x7b, 0x93, + 0xe3, 0xa8, 0x64, 0x63, 0xd1, 0x2c, 0x15, 0x53, 0xb2, 0xa5, 0x31, 0x2b, 0xf6, 0x77, 0xe8, 0x5e, + 0x4c, 0xc7, 0xf0, 0x18, 0xb6, 0xaf, 0xab, 0xe6, 0xf6, 0xf5, 0x64, 0x81, 0x2f, 0xdb, 0x63, 0xeb, + 0x7a, 0x0b, 0x46, 0xb5, 0x0f, 0x8f, 0xe6, 0xa1, 0xd2, 0x90, 0x01, 0x17, 0x42, 0x8a, 0x2b, 0x55, + 0x4a, 0x45, 0x62, 0xe0, 0x94, 0x86, 0x8e, 0x0b, 0x55, 0x41, 0xb3, 0xe1, 0x59, 0x54, 0x41, 0xc5, + 0x0c, 0x63, 0xbf, 0x00, 0xb0, 0xfc, 0x80, 0x34, 0x16, 0xb8, 0x89, 0xa7, 0x9d, 0xc1, 0x59, 0xbd, + 0xcf, 0xe0, 0xec, 0x6f, 0x5b, 0x30, 0xb1, 0xb2, 0x64, 0xe8, 0xf4, 0x73, 0x00, 0x5c, 0x37, 0xbe, + 0x7b, 0xf7, 0xa6, 0xf4, 0x31, 0x73, 0x47, 0xa0, 0x82, 0x62, 0x8d, 0x02, 0x3d, 0x0a, 0x65, 0xbf, + 0x1d, 0x08, 0x95, 0x75, 0x78, 0x6f, 0x77, 0xb6, 0x7c, 0xbd, 0x1d, 0x60, 0x0a, 0xd3, 0xe2, 0xa0, + 0xca, 0x85, 0xe3, 0xa0, 0xf2, 0x23, 0x82, 0xbf, 0x51, 0x86, 0xa9, 0x15, 0x9f, 0x3c, 0x30, 0x5a, + 0xfd, 0x34, 0x0c, 0xb9, 0x91, 0xb7, 0x4d, 0xa2, 0xac, 0x22, 0x50, 0x65, 0x50, 0x2c, 0xb0, 0x85, + 0x43, 0xb3, 0xde, 0xec, 0xdc, 0xc8, 0x8f, 0x2e, 0x2c, 0x2d, 0xb7, 0xcf, 0x68, 0x03, 0x86, 0xf9, + 0x99, 0x6d, 0x3c, 0x3d, 0xc8, 0xa6, 0xe2, 0x2b, 0x07, 0x37, 0x26, 0x3b, 0x3e, 0x73, 0xc2, 0x07, + 0xc2, 0x83, 0x62, 0x94, 0x2c, 0x13, 0x50, 0x2c, 0x99, 0xcf, 0x7c, 0x1c, 0xc6, 0x74, 0xca, 0xbe, + 0xa2, 0x63, 0xfe, 0xbc, 0x05, 0x27, 0x57, 0xfc, 0xb0, 0x71, 0x2f, 0x13, 0x3b, 0xf7, 0x12, 0x8c, + 0xd2, 0xc5, 0x14, 0x1b, 0x81, 0xa5, 0x46, 0x04, 0xad, 0x40, 0x61, 0x9d, 0x4e, 0x2b, 0x76, 0xfb, + 0xf6, 0x6a, 0xb5, 0x5b, 0xe0, 0xad, 0x40, 0x61, 0x9d, 0xce, 0xfe, 0x3d, 0x0b, 0x1e, 0xbf, 0xb2, + 0xb4, 0x5c, 0x23, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x92, 0x8e, 0xd8, 0x5f, 0xaa, 0x33, 0xba, 0x5a, + 0x53, 0x52, 0x9d, 0xb1, 0xca, 0x5a, 0x21, 0xb0, 0xef, 0x97, 0x00, 0xf8, 0x6f, 0x59, 0x70, 0xf2, + 0x8a, 0x97, 0x60, 0xd2, 0x0a, 0xb3, 0xe1, 0xba, 0x11, 0x69, 0x85, 0xb1, 0x97, 0x84, 0xd1, 0x4e, + 0x36, 0x5c, 0x17, 0x2b, 0x0c, 0xd6, 0xa8, 0x78, 0xcd, 0xdb, 0x5e, 0x4c, 0x5b, 0x5a, 0x32, 0x4d, + 0x5d, 0x2c, 0xe0, 0x58, 0x51, 0xd0, 0x8e, 0xb9, 0x5e, 0xc4, 0x54, 0x86, 0x1d, 0xb1, 0x82, 0x55, + 0xc7, 0xaa, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0x6f, 0x59, 0x70, 0xfa, 0x8a, 0xdf, 0x8e, 0x13, 0x12, + 0x6d, 0xc4, 0x46, 0x63, 0x5f, 0x80, 0x0a, 0x91, 0xca, 0xbd, 0x68, 0xab, 0xda, 0x34, 0x94, 0xd6, + 0xcf, 0x63, 0x85, 0x15, 0x5d, 0x81, 0x90, 0xd4, 0xfe, 0x02, 0x28, 0x7f, 0xb3, 0x04, 0xe3, 0x57, + 0xd7, 0xd6, 0x6a, 0x57, 0x48, 0x22, 0xa4, 0x64, 0xbe, 0x53, 0x0a, 0x6b, 0x16, 0xf9, 0x41, 0xca, + 0x4f, 0x3b, 0xf1, 0xfc, 0x39, 0x7e, 0xa5, 0x63, 0x6e, 0x35, 0x48, 0x6e, 0x45, 0xf5, 0x24, 0xf2, + 0x82, 0xcd, 0xae, 0x36, 0xbc, 0x94, 0xe5, 0xe5, 0x5e, 0xb2, 0x1c, 0xbd, 0x00, 0x43, 0xec, 0x4e, + 0x89, 0x54, 0x3e, 0x3e, 0xa8, 0xf4, 0x04, 0x06, 0xdd, 0xdf, 0x9d, 0xad, 0xdc, 0xc6, 0xab, 0xfc, + 0x0f, 0x16, 0xa4, 0xe8, 0x4d, 0x18, 0xdd, 0x4a, 0x92, 0xd6, 0x55, 0xe2, 0xb8, 0x24, 0x92, 0x72, + 0xe2, 0xfc, 0xc1, 0x72, 0x82, 0x0e, 0x07, 0x2f, 0x90, 0x2e, 0xad, 0x14, 0x16, 0x63, 0x9d, 0xa3, + 0x5d, 0x07, 0x48, 0x71, 0x0f, 0xc9, 0x06, 0xb1, 0x7f, 0xb1, 0x04, 0xc3, 0x57, 0x9d, 0xc0, 0xf5, + 0x49, 0x84, 0x56, 0x60, 0x80, 0x3c, 0x20, 0x0d, 0xb1, 0x91, 0xe7, 0x34, 0x3d, 0xdd, 0xec, 0xb8, + 0x5f, 0x8d, 0xfe, 0xc7, 0xac, 0x3c, 0xc2, 0x30, 0x4c, 0xdb, 0x7d, 0x45, 0x45, 0x72, 0x3f, 0x97, + 0x3f, 0x0a, 0x6a, 0x52, 0xf0, 0x9d, 0x52, 0x80, 0xb0, 0x64, 0xc4, 0x3c, 0x50, 0x8d, 0x56, 0x9d, + 0x8a, 0xb7, 0xa4, 0x98, 0x65, 0xb7, 0xb6, 0x54, 0xe3, 0xe4, 0x82, 0x2f, 0xf7, 0x40, 0x49, 0x20, + 0x4e, 0xd9, 0xd9, 0x97, 0xe1, 0x14, 0x3b, 0x33, 0x75, 0x92, 0x2d, 0x63, 0xd5, 0xe4, 0x4e, 0x4f, + 0xfb, 0x47, 0x25, 0x38, 0xb1, 0x5a, 0x5f, 0xaa, 0x9b, 0xbe, 0xc3, 0xcb, 0x30, 0xc6, 0x37, 0x68, + 0x3a, 0xe9, 0x1c, 0x5f, 0x94, 0x57, 0x7e, 0xfe, 0x35, 0x0d, 0x87, 0x0d, 0x4a, 0xf4, 0x38, 0x94, + 0xbd, 0x77, 0x82, 0x6c, 0xe4, 0xdd, 0xea, 0x6b, 0x37, 0x31, 0x85, 0x53, 0x34, 0xdd, 0xeb, 0xb9, + 0x90, 0x53, 0x68, 0xb5, 0xdf, 0xbf, 0x0a, 0x13, 0x5e, 0xdc, 0x88, 0xbd, 0xd5, 0x80, 0x4a, 0x00, + 0xa7, 0x21, 0xa7, 0x6f, 0xaa, 0x9c, 0xd3, 0xa6, 0x2a, 0x2c, 0xce, 0x50, 0x6b, 0x12, 0x77, 0xb0, + 0xb0, 0xbe, 0x90, 0x1b, 0xd2, 0x4d, 0x55, 0xa1, 0x16, 0xeb, 0x5d, 0xcc, 0xe2, 0x78, 0x84, 0x2a, + 0xc4, 0x3b, 0x1c, 0x63, 0x89, 0xb3, 0xdf, 0x86, 0x8a, 0x0a, 0xc5, 0x92, 0x11, 0x88, 0x56, 0x8f, + 0x08, 0xc4, 0x7c, 0xc9, 0x24, 0x1d, 0xbf, 0xe5, 0xae, 0x8e, 0xdf, 0x7f, 0x68, 0x41, 0x1a, 0x4b, + 0x82, 0x30, 0x54, 0x5a, 0x21, 0x3b, 0xc8, 0x89, 0xe4, 0x89, 0xe9, 0x53, 0x39, 0x13, 0x96, 0x2f, + 0x18, 0x3e, 0xa5, 0x6a, 0xb2, 0x2c, 0x4e, 0xd9, 0xa0, 0xeb, 0x30, 0xdc, 0x8a, 0x48, 0x3d, 0x61, + 0xd7, 0x07, 0xfa, 0xe0, 0xc8, 0xc7, 0x86, 0x97, 0xc4, 0x92, 0x85, 0xfd, 0xcf, 0x2d, 0x80, 0xeb, + 0x5e, 0xd3, 0x4b, 0xb0, 0x13, 0x6c, 0x92, 0x63, 0xb0, 0x0a, 0x6f, 0xc2, 0x40, 0xdc, 0x22, 0x8d, + 0x62, 0x47, 0x71, 0x69, 0xcb, 0xea, 0x2d, 0xd2, 0x48, 0x3f, 0x07, 0xfd, 0x87, 0x19, 0x1f, 0xfb, + 0xfb, 0x00, 0x13, 0x29, 0x19, 0xd5, 0xcc, 0xd1, 0xf3, 0x46, 0xdc, 0xfc, 0xa3, 0x99, 0xb8, 0xf9, + 0x0a, 0xa3, 0xd6, 0x42, 0xe5, 0x13, 0x28, 0x37, 0x9d, 0x07, 0xc2, 0x10, 0x78, 0xa9, 0x68, 0x83, + 0x68, 0x4d, 0x73, 0x37, 0x9c, 0x07, 0x5c, 0xef, 0x7a, 0x4e, 0x4e, 0xa4, 0x1b, 0xce, 0x83, 0x7d, + 0x7e, 0xe0, 0xc6, 0x16, 0x2c, 0xb5, 0x3c, 0xbe, 0xfc, 0x47, 0xe9, 0x7f, 0x26, 0x43, 0x69, 0x75, + 0xac, 0x56, 0x2f, 0x10, 0x7e, 0xcc, 0x3e, 0x6b, 0xf5, 0x82, 0x6c, 0xad, 0x5e, 0x50, 0xa0, 0x56, + 0x8f, 0x05, 0x98, 0x0e, 0x0b, 0xf7, 0x3f, 0x8b, 0xce, 0x1b, 0xbd, 0xf4, 0xb1, 0xbe, 0xaa, 0x16, + 0xe7, 0x08, 0xbc, 0xfa, 0x79, 0xa9, 0x6c, 0x0a, 0x68, 0x6e, 0x13, 0x64, 0xd5, 0xe8, 0x57, 0x2d, + 0x98, 0x10, 0xbf, 0x31, 0x79, 0xa7, 0x4d, 0xe2, 0x44, 0x6c, 0x6a, 0x9f, 0x3a, 0x4c, 0x6b, 0x04, + 0x0b, 0xde, 0xa8, 0x8f, 0x4a, 0x89, 0x64, 0x22, 0x73, 0xdb, 0x96, 0x69, 0x0f, 0xfa, 0xbe, 0x05, + 0xa7, 0x9a, 0xce, 0x03, 0x5e, 0x23, 0x87, 0x61, 0x27, 0xf1, 0x42, 0x11, 0x81, 0xb8, 0xd2, 0xef, + 0x3c, 0xe9, 0x60, 0xc4, 0x9b, 0x2b, 0x83, 0x8b, 0x4e, 0x75, 0x23, 0xc9, 0x6d, 0x74, 0xd7, 0x16, + 0xce, 0x6c, 0xc0, 0x88, 0x9c, 0x98, 0x5d, 0xd4, 0xfc, 0xaa, 0xbe, 0x77, 0xe7, 0x18, 0xd5, 0x73, + 0xd2, 0x35, 0x36, 0xf7, 0x5a, 0xdb, 0x09, 0x12, 0x2f, 0xd9, 0xd1, 0xcc, 0x02, 0x56, 0x8f, 0x98, + 0x8a, 0x47, 0x5a, 0xcf, 0xdb, 0x30, 0xa6, 0xcf, 0xbb, 0x23, 0xad, 0xeb, 0x1d, 0x38, 0xd9, 0x65, + 0x56, 0x1d, 0x69, 0x95, 0xf7, 0xe1, 0xd1, 0x9e, 0xf3, 0xe3, 0x28, 0x2b, 0xb6, 0x7f, 0xd3, 0xd2, + 0x45, 0xe7, 0x31, 0x38, 0x5d, 0x6e, 0x98, 0x4e, 0x97, 0xf3, 0x45, 0xd7, 0x50, 0x0f, 0xcf, 0xcb, + 0x86, 0xde, 0x7c, 0xba, 0x25, 0xa0, 0x35, 0x18, 0xf2, 0x29, 0x44, 0x9e, 0x79, 0x5d, 0xe8, 0x67, + 0x95, 0xa6, 0x4a, 0x09, 0x83, 0xc7, 0x58, 0xf0, 0xb2, 0xbf, 0x6f, 0xc1, 0xc0, 0x4f, 0xf1, 0x56, + 0x4f, 0x07, 0x6b, 0x71, 0x39, 0x7d, 0x0e, 0x3b, 0xf7, 0x97, 0x1f, 0x24, 0x24, 0x88, 0x99, 0x0e, + 0xda, 0xeb, 0xd4, 0x7e, 0x94, 0x56, 0x25, 0x03, 0x25, 0x5e, 0x81, 0x71, 0xdf, 0x59, 0x27, 0xbe, + 0x74, 0x18, 0x67, 0x2d, 0xb6, 0xeb, 0x3a, 0x12, 0x9b, 0xb4, 0xb4, 0xf0, 0x86, 0xee, 0x4f, 0x17, + 0x4a, 0x92, 0x2a, 0x6c, 0x38, 0xdb, 0xb1, 0x49, 0x4b, 0x4d, 0x86, 0xfb, 0x4e, 0xd2, 0xd8, 0x12, + 0xd6, 0x9c, 0x6a, 0xee, 0x5d, 0x0a, 0xc4, 0x1c, 0x87, 0x16, 0x60, 0x52, 0xce, 0xd8, 0x3b, 0xd4, + 0xcc, 0x0f, 0x03, 0xa1, 0x67, 0xaa, 0x9b, 0xc1, 0xd8, 0x44, 0xe3, 0x2c, 0x3d, 0xfa, 0x38, 0x4c, + 0xd0, 0xc1, 0x09, 0xdb, 0x89, 0x0c, 0x03, 0x19, 0x64, 0x61, 0x20, 0x2c, 0x8a, 0x78, 0xcd, 0xc0, + 0xe0, 0x0c, 0xa5, 0xfd, 0x26, 0x9c, 0xbc, 0x1e, 0x3a, 0xee, 0xa2, 0xe3, 0x3b, 0x41, 0x83, 0x44, + 0xab, 0xc1, 0x66, 0xee, 0xf1, 0xb5, 0x7e, 0xc4, 0x5c, 0xca, 0x3b, 0x62, 0xb6, 0x23, 0x40, 0x7a, + 0x05, 0x22, 0x80, 0xe9, 0x0d, 0x18, 0xf6, 0x78, 0x55, 0x62, 0xda, 0x5e, 0xcc, 0xf3, 0x47, 0x75, + 0xb4, 0x51, 0x0b, 0xc8, 0xe1, 0x00, 0x2c, 0x59, 0x52, 0x13, 0xa4, 0x9b, 0x03, 0x2b, 0xdf, 0xca, + 0xb3, 0xff, 0xa2, 0x05, 0x93, 0x37, 0x33, 0xd7, 0x4e, 0x9f, 0x86, 0x21, 0x9e, 0xbc, 0x20, 0xeb, + 0x62, 0xa9, 0x33, 0x28, 0x16, 0xd8, 0x87, 0x6e, 0xe1, 0xff, 0x4a, 0x09, 0x2a, 0x2c, 0x14, 0xb6, + 0x45, 0xcd, 0x89, 0xa3, 0x57, 0x53, 0x6f, 0x18, 0x6a, 0x6a, 0x8e, 0x95, 0xa9, 0x1a, 0xd6, 0x4b, + 0x4b, 0x45, 0xb7, 0xd5, 0x75, 0xcc, 0x42, 0x06, 0x66, 0xca, 0x90, 0x5f, 0xd9, 0x9b, 0x30, 0x6f, + 0x6f, 0xca, 0xab, 0x9a, 0xec, 0xd0, 0x57, 0xd1, 0xbe, 0xef, 0x0e, 0x7d, 0x55, 0xcb, 0x7a, 0x08, + 0xa7, 0x9a, 0xd6, 0x78, 0x26, 0xbe, 0x3f, 0xc9, 0x02, 0x1c, 0x1d, 0xdf, 0xfb, 0x02, 0x51, 0xb7, + 0x9a, 0x67, 0x45, 0xc0, 0xa2, 0x80, 0xee, 0x33, 0x39, 0x23, 0xfe, 0xf1, 0x4b, 0xeb, 0x69, 0x11, + 0xfb, 0x2a, 0x4c, 0x66, 0x86, 0x0e, 0xbd, 0x04, 0x83, 0xad, 0x2d, 0x27, 0x26, 0x99, 0x38, 0x96, + 0xc1, 0x1a, 0x05, 0xee, 0xef, 0xce, 0x4e, 0xa8, 0x02, 0x0c, 0x82, 0x39, 0xb5, 0xfd, 0x95, 0x12, + 0x0c, 0xdc, 0x0c, 0xdd, 0xe3, 0x98, 0x6a, 0x57, 0x8d, 0xa9, 0xf6, 0x74, 0x7e, 0xca, 0x8b, 0x9e, + 0xb3, 0xac, 0x96, 0x99, 0x65, 0xe7, 0x0b, 0xf0, 0x3a, 0x78, 0x82, 0x35, 0x61, 0x94, 0xa5, 0xd4, + 0x10, 0x81, 0x3c, 0x2f, 0x18, 0x96, 0xd5, 0x6c, 0xc6, 0xb2, 0x9a, 0xd4, 0x48, 0x35, 0xfb, 0xea, + 0x19, 0x18, 0x16, 0x81, 0x23, 0xd9, 0xf0, 0x4e, 0x41, 0x8b, 0x25, 0xde, 0xfe, 0xa7, 0x65, 0x30, + 0x52, 0x78, 0xa0, 0xdf, 0xb1, 0x60, 0x2e, 0xe2, 0x57, 0x65, 0xdc, 0x6a, 0x3b, 0xf2, 0x82, 0xcd, + 0x7a, 0x63, 0x8b, 0xb8, 0x6d, 0xdf, 0x0b, 0x36, 0x57, 0x37, 0x83, 0x50, 0x81, 0x97, 0x1f, 0x90, + 0x46, 0x9b, 0xf9, 0x69, 0x0b, 0x67, 0x0e, 0x51, 0x87, 0xa6, 0x97, 0xf6, 0x76, 0x67, 0xe7, 0x70, + 0x5f, 0xb5, 0xe0, 0x3e, 0x5b, 0x85, 0xfe, 0xd0, 0x82, 0x79, 0x9e, 0xc4, 0xa2, 0x78, 0x4f, 0x0a, + 0x59, 0xa4, 0x35, 0xc9, 0x34, 0x65, 0xb7, 0x46, 0xa2, 0xe6, 0xe2, 0xcb, 0x62, 0x90, 0xe7, 0x6b, + 0xfd, 0xd5, 0x8a, 0xfb, 0x6d, 0xa6, 0xfd, 0x2f, 0xcb, 0x30, 0x4e, 0xc7, 0x33, 0xbd, 0xb8, 0xfe, + 0x92, 0x31, 0x4d, 0x9e, 0xc8, 0x4c, 0x93, 0x13, 0x06, 0xf1, 0xc3, 0xb9, 0xb3, 0x1e, 0xc3, 0x09, + 0xdf, 0x89, 0x93, 0xab, 0xc4, 0x89, 0x92, 0x75, 0xe2, 0xb0, 0xb3, 0xc9, 0x6c, 0xdc, 0x43, 0x81, + 0xe3, 0x4e, 0x15, 0x8c, 0x74, 0x3d, 0xcb, 0x0c, 0x77, 0xf2, 0x47, 0xdb, 0x80, 0xd8, 0x39, 0x68, + 0xe4, 0x04, 0x31, 0xef, 0x8b, 0x27, 0xfc, 0xba, 0xfd, 0xd5, 0x3a, 0x23, 0x6a, 0x45, 0xd7, 0x3b, + 0xb8, 0xe1, 0x2e, 0x35, 0x68, 0x27, 0xdd, 0x83, 0x45, 0x4f, 0xba, 0x87, 0x72, 0xe2, 0xaa, 0xbf, + 0x6a, 0xc1, 0x49, 0xfa, 0x59, 0xcc, 0x18, 0xdc, 0x18, 0x85, 0x30, 0x49, 0xa7, 0x9d, 0x4f, 0x12, + 0x09, 0x13, 0xeb, 0x2b, 0x47, 0xb3, 0x36, 0xf9, 0xa4, 0xea, 0xdb, 0x35, 0x93, 0x19, 0xce, 0x72, + 0xb7, 0xbf, 0x6d, 0x01, 0x8b, 0xb8, 0x3b, 0x86, 0xcd, 0xec, 0x8a, 0xb9, 0x99, 0xd9, 0xf9, 0x12, + 0xa3, 0xc7, 0x3e, 0xf6, 0x22, 0x4c, 0x51, 0x6c, 0x2d, 0x0a, 0x1f, 0xec, 0x48, 0x45, 0x3b, 0xdf, + 0xc1, 0xfb, 0xd5, 0x12, 0x5f, 0x36, 0xea, 0xce, 0x1f, 0xfa, 0x25, 0x0b, 0x46, 0x1a, 0x4e, 0xcb, + 0x69, 0xf0, 0x04, 0x48, 0x05, 0xbc, 0x33, 0x46, 0xf9, 0xb9, 0x25, 0x51, 0x96, 0x7b, 0x16, 0x3e, + 0x22, 0xbb, 0x2e, 0xc1, 0xb9, 0xde, 0x04, 0x55, 0xf9, 0xcc, 0x3d, 0x18, 0x37, 0x98, 0x1d, 0xa9, + 0x19, 0xfa, 0x4b, 0x16, 0x17, 0xfa, 0xca, 0x54, 0xb8, 0x0f, 0x27, 0x02, 0xed, 0x3f, 0x15, 0x67, + 0x52, 0x33, 0x9e, 0x2b, 0x2e, 0xd6, 0x99, 0x14, 0xd4, 0xa2, 0x0b, 0x33, 0x0c, 0x71, 0x67, 0x1d, + 0xf6, 0xdf, 0xb6, 0xe0, 0x11, 0x9d, 0x50, 0xbb, 0xa4, 0x99, 0xe7, 0x37, 0xae, 0xc2, 0x48, 0xd8, + 0x22, 0x91, 0x93, 0x9a, 0x45, 0xe7, 0xe5, 0xf8, 0xdf, 0x12, 0xf0, 0xfd, 0xdd, 0xd9, 0x53, 0x3a, + 0x77, 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x88, 0x8d, 0x4b, 0x2c, 0xae, 0xd7, 0xb2, 0x84, 0x40, + 0xec, 0x50, 0x25, 0xc6, 0x02, 0x63, 0xff, 0x55, 0x8b, 0x4f, 0x37, 0xbd, 0xe9, 0xe8, 0x8b, 0x30, + 0xd5, 0xa4, 0x16, 0xd4, 0xf2, 0x83, 0x16, 0xdd, 0x48, 0xd9, 0x71, 0xb2, 0x55, 0x64, 0xfb, 0xe8, + 0xd1, 0xdd, 0xc5, 0x69, 0xd1, 0xfa, 0xa9, 0x1b, 0x19, 0xb6, 0xb8, 0xa3, 0x22, 0xfb, 0x3f, 0x89, + 0x35, 0xcb, 0x74, 0xb8, 0x67, 0x60, 0xb8, 0x15, 0xba, 0x4b, 0xab, 0x55, 0x2c, 0xc6, 0x4a, 0x09, + 0x9d, 0x1a, 0x07, 0x63, 0x89, 0x47, 0x97, 0x00, 0xc8, 0x83, 0x84, 0x44, 0x81, 0xe3, 0xab, 0x63, + 0x60, 0xa5, 0x2a, 0x2d, 0x2b, 0x0c, 0xd6, 0xa8, 0x68, 0x99, 0x56, 0x14, 0x6e, 0x7b, 0x2e, 0xbb, + 0x5d, 0x50, 0x36, 0xcb, 0xd4, 0x14, 0x06, 0x6b, 0x54, 0xd4, 0x6e, 0x6d, 0x07, 0x31, 0xdf, 0xc6, + 0x9c, 0x75, 0x91, 0xbf, 0x66, 0x24, 0xb5, 0x5b, 0x6f, 0xeb, 0x48, 0x6c, 0xd2, 0xda, 0xff, 0xbe, + 0x02, 0x90, 0x2a, 0x4a, 0xe8, 0x2b, 0x9d, 0x6b, 0xf4, 0xa3, 0x45, 0xb5, 0xac, 0x87, 0xb7, 0x40, + 0xd1, 0xd7, 0x2d, 0x18, 0x75, 0x7c, 0x3f, 0x6c, 0x38, 0x09, 0xeb, 0x51, 0xa9, 0xa8, 0xb4, 0x10, + 0x2d, 0x59, 0x48, 0xcb, 0xf2, 0xc6, 0xbc, 0x20, 0xcf, 0x08, 0x35, 0x4c, 0x6e, 0x7b, 0xf4, 0x26, + 0xa0, 0x8f, 0x48, 0x45, 0x9b, 0x7f, 0x94, 0x99, 0xac, 0xa2, 0x5d, 0x61, 0x32, 0x52, 0xd3, 0xb1, + 0xd1, 0x9b, 0x46, 0x8a, 0x96, 0x81, 0x22, 0xb7, 0x3a, 0x0d, 0xd5, 0x21, 0x2f, 0x3b, 0x0b, 0xfa, + 0xac, 0x1e, 0x05, 0x3d, 0x58, 0xe4, 0xda, 0xb4, 0xa6, 0xc1, 0xe6, 0x44, 0x40, 0x27, 0x30, 0xe9, + 0x9a, 0x9b, 0xa5, 0x88, 0xe4, 0xba, 0x98, 0x5f, 0x43, 0x66, 0x97, 0x4d, 0xb7, 0xc7, 0x0c, 0x02, + 0x67, 0xab, 0x40, 0x9f, 0xe5, 0x31, 0xea, 0xab, 0xc1, 0x46, 0x28, 0xa2, 0xb9, 0x2e, 0x14, 0xf8, + 0xe6, 0x3b, 0x71, 0x42, 0x9a, 0xb4, 0x4c, 0xba, 0x1f, 0xde, 0x14, 0x5c, 0xb0, 0xe2, 0x87, 0xd6, + 0x60, 0x88, 0x5d, 0xe2, 0x89, 0xa7, 0x47, 0x8a, 0x38, 0xcf, 0xcc, 0xbb, 0xab, 0xa9, 0x12, 0xc2, + 0xfe, 0xc6, 0x58, 0xf0, 0x42, 0x57, 0xe5, 0xed, 0xf5, 0x78, 0x35, 0xb8, 0x1d, 0x13, 0x76, 0x7b, + 0xbd, 0xb2, 0xf8, 0xa1, 0xf4, 0x3a, 0x3a, 0x87, 0x77, 0x4d, 0x52, 0x67, 0x94, 0xa4, 0xba, 0x88, + 0xf8, 0x2f, 0x73, 0xdf, 0x4d, 0x43, 0x91, 0x86, 0x9a, 0x99, 0xf2, 0xd2, 0xc1, 0xbe, 0x63, 0x32, + 0xc3, 0x59, 0xee, 0xc7, 0xba, 0x0b, 0xce, 0x04, 0x30, 0x95, 0x5d, 0x94, 0x47, 0xba, 0xeb, 0xfe, + 0x64, 0x00, 0x26, 0xcc, 0xc9, 0x81, 0xe6, 0xa1, 0x22, 0x98, 0xa8, 0x5c, 0x58, 0x6a, 0x0d, 0xdc, + 0x90, 0x08, 0x9c, 0xd2, 0xb0, 0xac, 0x60, 0xac, 0xb8, 0x16, 0xc7, 0x93, 0x66, 0x05, 0x53, 0x18, + 0xac, 0x51, 0x51, 0xe5, 0x75, 0x3d, 0x0c, 0x13, 0x25, 0xbc, 0xd5, 0xbc, 0x59, 0x64, 0x50, 0x2c, + 0xb0, 0x54, 0x68, 0xdf, 0xa3, 0x1f, 0xd3, 0x37, 0x1d, 0x81, 0x4a, 0x68, 0x5f, 0xd3, 0x91, 0xd8, + 0xa4, 0xa5, 0x9b, 0x50, 0x18, 0xb3, 0x89, 0x28, 0x54, 0xe4, 0x34, 0x2e, 0xaa, 0xce, 0x2f, 0xb6, + 0x49, 0x3c, 0xfa, 0x0c, 0x3c, 0xa2, 0xee, 0xa1, 0x61, 0xee, 0x58, 0x95, 0x35, 0x0e, 0x19, 0x56, + 0xee, 0x23, 0x4b, 0xdd, 0xc9, 0x70, 0xaf, 0xf2, 0xe8, 0x55, 0x98, 0x10, 0xea, 0xad, 0xe4, 0x38, + 0x6c, 0x1e, 0x9a, 0x5f, 0x33, 0xb0, 0x38, 0x43, 0x8d, 0xaa, 0x30, 0x45, 0x21, 0x4c, 0xaf, 0x94, + 0x1c, 0xf8, 0x7d, 0x3a, 0xb5, 0x3b, 0x5f, 0xcb, 0xe0, 0x71, 0x47, 0x09, 0xb4, 0x00, 0x93, 0x5c, + 0xbf, 0xa0, 0xb6, 0x1c, 0xfb, 0x0e, 0x22, 0x04, 0x53, 0x2d, 0x84, 0x5b, 0x26, 0x1a, 0x67, 0xe9, + 0xd1, 0x65, 0x18, 0x73, 0xa2, 0xc6, 0x96, 0x97, 0x90, 0x46, 0xd2, 0x8e, 0x78, 0x6e, 0x08, 0x2d, + 0xea, 0x60, 0x41, 0xc3, 0x61, 0x83, 0xd2, 0xfe, 0x02, 0x9c, 0xec, 0x12, 0xef, 0x4d, 0x27, 0x8e, + 0xd3, 0xf2, 0x64, 0x9f, 0x32, 0x11, 0x4e, 0x0b, 0xb5, 0x55, 0xd9, 0x1b, 0x8d, 0x8a, 0xce, 0x4e, + 0xe6, 0x51, 0xd6, 0x52, 0x55, 0xaa, 0xd9, 0xb9, 0x22, 0x11, 0x38, 0xa5, 0xb1, 0xff, 0xac, 0x02, + 0x9a, 0xc3, 0xa5, 0x40, 0x54, 0xcb, 0x65, 0x18, 0x93, 0xd9, 0x57, 0xb5, 0xac, 0x87, 0xaa, 0x9b, + 0x57, 0x34, 0x1c, 0x36, 0x28, 0x69, 0xdb, 0x02, 0xe9, 0x46, 0xca, 0xc6, 0x53, 0x29, 0xff, 0x12, + 0x4e, 0x69, 0xd0, 0x05, 0x18, 0x89, 0x89, 0xbf, 0x71, 0xdd, 0x0b, 0xee, 0x89, 0x89, 0xad, 0x24, + 0x73, 0x5d, 0xc0, 0xb1, 0xa2, 0x40, 0x8b, 0x50, 0x6e, 0x7b, 0xae, 0x98, 0xca, 0x52, 0x6d, 0x28, + 0xdf, 0x5e, 0xad, 0xee, 0xef, 0xce, 0x3e, 0xd1, 0x2b, 0x15, 0x2d, 0x35, 0xa9, 0xe3, 0x39, 0xba, + 0xfc, 0x68, 0xe1, 0x6e, 0xae, 0xf5, 0xa1, 0x3e, 0x5d, 0xeb, 0x97, 0x00, 0x44, 0xaf, 0xe5, 0x5c, + 0x2e, 0xa7, 0x5f, 0xed, 0x8a, 0xc2, 0x60, 0x8d, 0x8a, 0x1a, 0xe6, 0x8d, 0x88, 0x38, 0xd2, 0x76, + 0xe5, 0x71, 0xc8, 0x23, 0x87, 0x37, 0xcc, 0x97, 0xb2, 0xcc, 0x70, 0x27, 0x7f, 0x14, 0xc2, 0x09, + 0x97, 0x2e, 0x24, 0xa3, 0xd2, 0x4a, 0xff, 0xc1, 0xcf, 0xb4, 0xc2, 0x6a, 0x96, 0x11, 0xee, 0xe4, + 0x8d, 0x3e, 0x0f, 0x33, 0x12, 0xd8, 0x79, 0xd3, 0x94, 0x2d, 0x97, 0xf2, 0xe2, 0xd9, 0xbd, 0xdd, + 0xd9, 0x99, 0x6a, 0x4f, 0x2a, 0x7c, 0x00, 0x07, 0xf4, 0x06, 0x0c, 0xb1, 0xa3, 0x98, 0x78, 0x7a, + 0x94, 0xed, 0x78, 0x2f, 0x16, 0x09, 0xa1, 0xa7, 0xb3, 0x7e, 0x8e, 0x1d, 0xe8, 0x88, 0xe0, 0xd0, + 0xf4, 0x7c, 0x8b, 0x01, 0xb1, 0xe0, 0x89, 0x5a, 0x30, 0xea, 0x04, 0x41, 0x98, 0x38, 0x5c, 0x11, + 0x1b, 0x2b, 0xa2, 0x4b, 0x6a, 0x55, 0x2c, 0xa4, 0x65, 0x79, 0x3d, 0x2a, 0xde, 0x4c, 0xc3, 0x60, + 0xbd, 0x0a, 0x74, 0x1f, 0x26, 0xc3, 0xfb, 0x54, 0x60, 0xca, 0xd3, 0x88, 0x78, 0x7a, 0xdc, 0xec, + 0x58, 0x8e, 0x6f, 0xd5, 0x28, 0xac, 0x49, 0x32, 0x93, 0x29, 0xce, 0xd6, 0x82, 0xe6, 0x0c, 0x0f, + 0xf3, 0x44, 0x1a, 0x02, 0x9d, 0x7a, 0x98, 0x75, 0x87, 0x32, 0xbb, 0xcd, 0xcc, 0xc3, 0x1e, 0x99, + 0x44, 0x98, 0xcc, 0xdc, 0x66, 0x4e, 0x51, 0x58, 0xa7, 0x9b, 0xf9, 0x18, 0x8c, 0x6a, 0x03, 0xdf, + 0x4f, 0xac, 0xed, 0xcc, 0xab, 0x30, 0x95, 0x1d, 0xd0, 0xbe, 0x62, 0x75, 0xff, 0x47, 0x09, 0x26, + 0xbb, 0x1c, 0xf5, 0xdc, 0xf3, 0x58, 0xbc, 0xb8, 0x21, 0xfa, 0xae, 0x79, 0x81, 0x8b, 0x19, 0xc6, + 0x14, 0x60, 0xa5, 0x02, 0x02, 0x4c, 0x4a, 0xd3, 0x72, 0x4f, 0x69, 0x2a, 0x84, 0xd6, 0xc0, 0x7b, + 0x11, 0x5a, 0xe6, 0x3e, 0x31, 0x58, 0x68, 0x9f, 0x78, 0x08, 0x82, 0xce, 0xd8, 0x6a, 0x86, 0x0b, + 0x6c, 0x35, 0xdf, 0x2a, 0xc1, 0x54, 0x1a, 0x97, 0x2c, 0x52, 0x32, 0x1f, 0xfd, 0xc9, 0xc1, 0x9a, + 0x71, 0x72, 0x90, 0x97, 0x71, 0x39, 0xd3, 0xbe, 0x9e, 0xa7, 0x08, 0x6f, 0x64, 0x4e, 0x11, 0x5e, + 0xec, 0x93, 0xef, 0xc1, 0x27, 0x0a, 0xdf, 0x2b, 0xc1, 0xe9, 0x6c, 0x91, 0x25, 0xdf, 0xf1, 0x9a, + 0xc7, 0x30, 0x5e, 0x9f, 0x31, 0xc6, 0xeb, 0xe5, 0xfe, 0xfa, 0xc5, 0x1a, 0xd9, 0x73, 0xd0, 0x9c, + 0xcc, 0xa0, 0x7d, 0xec, 0x30, 0xcc, 0x0f, 0x1e, 0xb9, 0xdf, 0xb7, 0xe0, 0xd1, 0xae, 0xe5, 0x8e, + 0xc1, 0x57, 0xfa, 0xba, 0xe9, 0x2b, 0x7d, 0xe1, 0x10, 0xbd, 0xeb, 0xe1, 0x3c, 0xfd, 0x6f, 0xa5, + 0x1e, 0xbd, 0x62, 0xde, 0xa4, 0x5b, 0x30, 0xea, 0x34, 0x1a, 0x24, 0x8e, 0x6f, 0x84, 0xae, 0xca, + 0x8b, 0xf4, 0x3c, 0xdb, 0x5b, 0x52, 0xf0, 0xfe, 0xee, 0xec, 0x4c, 0x96, 0x45, 0x8a, 0xc6, 0x3a, + 0x07, 0x33, 0x63, 0x5b, 0xe9, 0x88, 0x32, 0xb6, 0x5d, 0x02, 0xd8, 0x56, 0x56, 0x6c, 0xd6, 0x49, + 0xa5, 0xd9, 0xb7, 0x1a, 0x15, 0xfa, 0xff, 0x99, 0x46, 0xc8, 0xe3, 0x2a, 0x06, 0xcc, 0x2b, 0x8e, + 0x39, 0xdf, 0x4f, 0x8f, 0xd1, 0xe0, 0x37, 0x29, 0x95, 0x43, 0x4f, 0xb1, 0xb4, 0xbf, 0x5b, 0x86, + 0x0f, 0x1e, 0x30, 0xe9, 0xd0, 0x82, 0x79, 0x4c, 0xfa, 0x5c, 0xd6, 0x7b, 0x33, 0xd3, 0xb5, 0xb0, + 0xe1, 0xce, 0xc9, 0x7c, 0xab, 0xd2, 0x7b, 0xfe, 0x56, 0xdf, 0xd0, 0x7d, 0x6d, 0x3c, 0x50, 0xf2, + 0xca, 0xa1, 0x97, 0xd5, 0xcf, 0xaa, 0x77, 0xfc, 0xcb, 0x16, 0x3c, 0xd1, 0xb5, 0x5b, 0x46, 0x58, + 0xc6, 0x3c, 0x54, 0x1a, 0x14, 0xa8, 0x5d, 0x7e, 0x49, 0x6f, 0x9d, 0x49, 0x04, 0x4e, 0x69, 0x8c, + 0xe8, 0x8b, 0x52, 0x6e, 0xf4, 0xc5, 0xef, 0x5a, 0x70, 0x2a, 0xdb, 0x88, 0x63, 0x90, 0x3a, 0x75, + 0x53, 0xea, 0xcc, 0xf5, 0xf7, 0xf1, 0x7b, 0x08, 0x9c, 0x5f, 0x1d, 0x87, 0x33, 0x1d, 0x7b, 0x16, + 0x1f, 0xc5, 0x5f, 0xb0, 0xe0, 0xc4, 0x26, 0xd3, 0xbd, 0xb5, 0x1b, 0x46, 0xa2, 0x5f, 0x39, 0xd7, + 0xb2, 0x0e, 0xbc, 0x98, 0xc4, 0x2d, 0x89, 0x0e, 0x12, 0xdc, 0x59, 0x19, 0xfa, 0x9a, 0x05, 0xa7, + 0x9c, 0xfb, 0x71, 0xc7, 0x73, 0x1f, 0x62, 0x22, 0xbd, 0x9a, 0xe3, 0xea, 0xca, 0x79, 0x28, 0x64, + 0x71, 0x7a, 0x6f, 0x77, 0xf6, 0x54, 0x37, 0x2a, 0xdc, 0xb5, 0x56, 0xfa, 0x7d, 0xb7, 0xc4, 0xfd, + 0x85, 0x62, 0x77, 0xe5, 0xba, 0xdd, 0x76, 0xe0, 0x42, 0x49, 0x62, 0xb0, 0xe2, 0x88, 0xde, 0x82, + 0xca, 0xa6, 0xbc, 0x54, 0x94, 0x15, 0x7a, 0x3d, 0x86, 0xb9, 0xdb, 0x1d, 0x24, 0x1e, 0x2c, 0xaf, + 0x50, 0x38, 0x65, 0x8a, 0xae, 0x42, 0x39, 0xd8, 0x88, 0xc5, 0xf5, 0xdd, 0xbc, 0xa0, 0x1b, 0x33, + 0xd4, 0x89, 0xdf, 0x78, 0xbc, 0xb9, 0x52, 0xc7, 0x94, 0x05, 0xe5, 0x14, 0xad, 0xbb, 0xc2, 0xc7, + 0x9b, 0xc3, 0x09, 0x2f, 0x56, 0x3b, 0x39, 0xe1, 0xc5, 0x2a, 0xa6, 0x2c, 0x50, 0x0d, 0x06, 0xd9, + 0xed, 0x08, 0xe1, 0xc0, 0xcd, 0xb9, 0xe3, 0xdd, 0x71, 0x07, 0x84, 0xa7, 0x05, 0x64, 0x60, 0xcc, + 0x19, 0xa1, 0x35, 0x18, 0x6a, 0xb0, 0xcc, 0xf6, 0xc2, 0xb2, 0xce, 0xcb, 0x7e, 0xd0, 0x91, 0x05, + 0x9f, 0x1f, 0x34, 0x71, 0x38, 0x16, 0xbc, 0x18, 0x57, 0xd2, 0xda, 0xda, 0x88, 0x85, 0xe9, 0x9c, + 0xc7, 0xb5, 0xe3, 0x8d, 0x02, 0xc1, 0x95, 0xc1, 0xb1, 0xe0, 0x85, 0xaa, 0x50, 0xda, 0x68, 0x88, + 0xec, 0xa2, 0x39, 0x8e, 0x5b, 0xf3, 0xfa, 0xea, 0xe2, 0xd0, 0xde, 0xee, 0x6c, 0x69, 0x65, 0x09, + 0x97, 0x36, 0x1a, 0xe8, 0x75, 0x18, 0xde, 0xe0, 0x17, 0x12, 0x45, 0x26, 0xd1, 0x8b, 0x79, 0xb7, + 0x26, 0x3b, 0x6e, 0x2f, 0xf2, 0x0b, 0x11, 0x02, 0x81, 0x25, 0x3b, 0x96, 0x64, 0x4d, 0x5d, 0xb1, + 0x14, 0xa9, 0x44, 0xe7, 0xfa, 0xbb, 0x92, 0x29, 0x2c, 0x4a, 0x05, 0xc5, 0x1a, 0x47, 0x3a, 0xe7, + 0x1d, 0xf9, 0x48, 0x07, 0x4b, 0x23, 0x9a, 0x3b, 0xe7, 0xbb, 0xbe, 0xe9, 0xc1, 0xe7, 0xbc, 0x42, + 0xe1, 0x94, 0x29, 0x6a, 0xc3, 0xf8, 0x76, 0xdc, 0xda, 0x22, 0x72, 0xe9, 0xb3, 0xdc, 0xa2, 0xa3, + 0x97, 0x3e, 0x91, 0x93, 0x30, 0x56, 0x14, 0xf1, 0xa2, 0xa4, 0xed, 0xf8, 0x1d, 0x12, 0x8c, 0x65, + 0xb5, 0xba, 0xa3, 0xb3, 0xc5, 0x66, 0x2d, 0xf4, 0x93, 0xbc, 0xd3, 0x0e, 0xd7, 0x77, 0x12, 0x22, + 0x72, 0x8f, 0xe6, 0x7c, 0x92, 0xd7, 0x38, 0x71, 0xe7, 0x27, 0x11, 0x08, 0x2c, 0xd9, 0xa9, 0x21, + 0x63, 0xd2, 0x78, 0xaa, 0xf0, 0x90, 0x75, 0xf4, 0x21, 0x1d, 0x32, 0x26, 0x7d, 0x53, 0xa6, 0x4c, + 0xea, 0xb6, 0xb6, 0xc2, 0x24, 0x0c, 0x32, 0xb2, 0xff, 0x44, 0x11, 0xa9, 0x5b, 0xeb, 0x52, 0xb2, + 0x53, 0xea, 0x76, 0xa3, 0xc2, 0x5d, 0x6b, 0xb5, 0xff, 0xcb, 0x60, 0xe7, 0x76, 0xcb, 0xd4, 0xe1, + 0xbf, 0xd2, 0x79, 0xfa, 0xf8, 0xa9, 0xfe, 0xad, 0xbe, 0x87, 0x78, 0x0e, 0xf9, 0x35, 0x0b, 0xce, + 0xb4, 0xba, 0x6e, 0xa6, 0x62, 0xc3, 0xea, 0xd7, 0x78, 0xe4, 0x03, 0xa6, 0x12, 0xeb, 0x76, 0xc7, + 0xe3, 0x1e, 0x75, 0x66, 0x55, 0xd0, 0xf2, 0x7b, 0x56, 0x41, 0xef, 0xc2, 0x08, 0xd3, 0x99, 0xd2, + 0x94, 0x1c, 0x7d, 0x66, 0xaf, 0x60, 0x5b, 0xdf, 0x92, 0x60, 0x81, 0x15, 0x33, 0x3a, 0x70, 0x8f, + 0x67, 0x3b, 0x81, 0x09, 0x43, 0x8b, 0xe4, 0xb3, 0xdc, 0xdb, 0xb1, 0x22, 0x46, 0xe2, 0xf1, 0xda, + 0x41, 0xc4, 0xfb, 0x79, 0x04, 0xf8, 0xe0, 0xca, 0x8e, 0x57, 0xa5, 0xfd, 0x7b, 0x56, 0x17, 0x0d, + 0x8c, 0x9b, 0x21, 0x9f, 0x30, 0xcd, 0x90, 0xa7, 0xb3, 0x66, 0x48, 0x87, 0xeb, 0xc0, 0xb0, 0x40, + 0x8a, 0x27, 0x92, 0x2c, 0x9a, 0x2d, 0xc4, 0xf6, 0xe1, 0x5c, 0xde, 0xf2, 0x66, 0xb1, 0x3e, 0xae, + 0x3a, 0x32, 0x4b, 0x63, 0x7d, 0xdc, 0xd5, 0x2a, 0x66, 0x98, 0xa2, 0x17, 0xce, 0xed, 0x5f, 0x2c, + 0x41, 0xb9, 0x16, 0xba, 0xc7, 0xe0, 0x0a, 0xb9, 0x62, 0xb8, 0x42, 0x9e, 0xca, 0x7d, 0xa4, 0xac, + 0xa7, 0xe3, 0xe3, 0x56, 0xc6, 0xf1, 0xf1, 0xe1, 0x7c, 0x56, 0x07, 0xbb, 0x39, 0xbe, 0x5f, 0x06, + 0xfd, 0x99, 0x35, 0xf4, 0x6f, 0x0f, 0x13, 0x02, 0x5a, 0x2e, 0xf6, 0xf2, 0x9a, 0xa8, 0x83, 0x85, + 0x0a, 0xc9, 0x8b, 0x63, 0x3f, 0xb3, 0x91, 0xa0, 0x77, 0x89, 0xb7, 0xb9, 0x95, 0x10, 0x37, 0xdb, + 0xb1, 0xe3, 0x8b, 0x04, 0xfd, 0x53, 0x0b, 0x26, 0x33, 0xb5, 0x23, 0xbf, 0xdb, 0x8d, 0x93, 0x43, + 0x3a, 0x37, 0x4e, 0xe4, 0x5e, 0x51, 0x99, 0x03, 0x50, 0x3e, 0x6a, 0xe9, 0x82, 0x60, 0xda, 0x98, + 0x72, 0x62, 0xc7, 0x58, 0xa3, 0x40, 0x2f, 0xc1, 0x68, 0x12, 0xb6, 0x42, 0x3f, 0xdc, 0xdc, 0xb9, + 0x46, 0x64, 0x2a, 0x04, 0xe5, 0xdf, 0x5f, 0x4b, 0x51, 0x58, 0xa7, 0xb3, 0x7f, 0x50, 0x86, 0xec, + 0x23, 0x7d, 0xff, 0x6f, 0x9e, 0xfe, 0xec, 0xcc, 0xd3, 0x3f, 0xb0, 0x60, 0x8a, 0xd6, 0xce, 0x02, + 0x3d, 0x64, 0xc4, 0xa6, 0xca, 0x6a, 0x6f, 0x1d, 0x90, 0xd5, 0xfe, 0x69, 0x2a, 0xed, 0xdc, 0xb0, + 0x9d, 0x08, 0xa7, 0x89, 0x26, 0xc4, 0x28, 0x14, 0x0b, 0xac, 0xa0, 0x23, 0x51, 0x24, 0xae, 0xb6, + 0xe8, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0xa4, 0xf7, 0x03, 0x3d, 0x92, 0xde, 0xb3, 0x64, 0x42, + 0x22, 0xb8, 0x40, 0x28, 0x04, 0x5a, 0x32, 0x21, 0x19, 0x75, 0x90, 0xd2, 0xd8, 0xdf, 0x29, 0xc3, + 0x58, 0x2d, 0x74, 0xd3, 0x50, 0xec, 0x17, 0x8d, 0x50, 0xec, 0x73, 0x99, 0x50, 0xec, 0x29, 0x9d, + 0xf6, 0xe1, 0x44, 0x62, 0x8b, 0xa4, 0x53, 0xec, 0x59, 0x86, 0x43, 0x46, 0x61, 0x1b, 0x49, 0xa7, + 0x14, 0x23, 0x6c, 0xf2, 0xfd, 0x79, 0x8a, 0xbe, 0xfe, 0x5f, 0x16, 0x4c, 0xd4, 0x42, 0x97, 0x4e, + 0xd0, 0x9f, 0xa7, 0xd9, 0xa8, 0xa7, 0xaa, 0x1a, 0x3a, 0x20, 0x55, 0xd5, 0x3f, 0xb6, 0x60, 0xb8, + 0x16, 0xba, 0xc7, 0xe0, 0x50, 0x5c, 0x31, 0x1d, 0x8a, 0x4f, 0xe4, 0x4a, 0xde, 0x1e, 0x3e, 0xc4, + 0xef, 0x96, 0x61, 0x9c, 0xb6, 0x38, 0xdc, 0x94, 0xdf, 0xcb, 0x18, 0x1b, 0xab, 0xc0, 0xd8, 0x50, + 0x95, 0x30, 0xf4, 0xfd, 0xf0, 0x7e, 0xf6, 0xdb, 0xad, 0x30, 0x28, 0x16, 0x58, 0x74, 0x01, 0x46, + 0x5a, 0x11, 0xd9, 0xf6, 0xc2, 0x76, 0x9c, 0xbd, 0x26, 0x57, 0x13, 0x70, 0xac, 0x28, 0xd0, 0x8b, + 0x30, 0x16, 0x7b, 0x41, 0x83, 0xc8, 0xd0, 0x83, 0x01, 0x16, 0x7a, 0xc0, 0xb3, 0x02, 0x6a, 0x70, + 0x6c, 0x50, 0xa1, 0xbb, 0x50, 0x61, 0xff, 0xd9, 0x0a, 0xea, 0x3f, 0x6b, 0x3d, 0x4f, 0x85, 0x25, + 0x19, 0xe0, 0x94, 0x17, 0xba, 0x04, 0x90, 0xc8, 0x20, 0x89, 0x58, 0x24, 0xf4, 0x50, 0x7a, 0xa9, + 0x0a, 0x9f, 0x88, 0xb1, 0x46, 0x85, 0x9e, 0x83, 0x4a, 0xe2, 0x78, 0xfe, 0x75, 0x2f, 0x20, 0xb1, + 0x08, 0x32, 0x11, 0x19, 0x7e, 0x05, 0x10, 0xa7, 0x78, 0xba, 0xdf, 0xb3, 0x4b, 0xba, 0xfc, 0x45, + 0x8c, 0x11, 0x46, 0xcd, 0xf6, 0xfb, 0xeb, 0x0a, 0x8a, 0x35, 0x0a, 0xfb, 0x32, 0x9c, 0xae, 0x85, + 0x6e, 0x2d, 0x8c, 0x92, 0x95, 0x30, 0xba, 0xef, 0x44, 0xae, 0xfc, 0x7e, 0xb3, 0x32, 0xb1, 0x2c, + 0xdd, 0x93, 0x07, 0xb9, 0x8f, 0xcd, 0x48, 0x14, 0xfb, 0x02, 0xdb, 0xf1, 0xfb, 0x8c, 0xf1, 0xff, + 0x71, 0x09, 0x50, 0x8d, 0x85, 0x71, 0x18, 0x0f, 0xa8, 0x6c, 0xc1, 0x44, 0x4c, 0xae, 0x7b, 0x41, + 0xfb, 0x81, 0x60, 0x55, 0xec, 0x52, 0x45, 0x7d, 0x59, 0x2f, 0xc3, 0x6f, 0xb4, 0x9a, 0x30, 0x9c, + 0xe1, 0x4b, 0x07, 0x33, 0x6a, 0x07, 0x0b, 0xf1, 0xed, 0x98, 0x44, 0xe2, 0xc1, 0x10, 0x36, 0x98, + 0x58, 0x02, 0x71, 0x8a, 0xa7, 0x93, 0x87, 0xfd, 0xb9, 0x19, 0x06, 0x38, 0x0c, 0x13, 0x39, 0xdd, + 0x58, 0x02, 0x79, 0x0d, 0x8e, 0x0d, 0x2a, 0xb4, 0x02, 0x28, 0x6e, 0xb7, 0x5a, 0x3e, 0x3b, 0x19, + 0x73, 0xfc, 0x2b, 0x51, 0xd8, 0x6e, 0xf1, 0x68, 0x5e, 0x91, 0x7b, 0xbd, 0xde, 0x81, 0xc5, 0x5d, + 0x4a, 0x50, 0x61, 0xb1, 0x11, 0xb3, 0xdf, 0xe2, 0xc6, 0x2e, 0xf7, 0xcf, 0xd5, 0x19, 0x08, 0x4b, + 0x9c, 0xfd, 0x25, 0xb6, 0xc1, 0xb1, 0x97, 0x1c, 0x92, 0x76, 0x44, 0x50, 0x13, 0xc6, 0x5b, 0x6c, + 0x13, 0x4b, 0xa2, 0xd0, 0xf7, 0x89, 0xd4, 0x2f, 0x0f, 0x17, 0x48, 0xc2, 0x73, 0xb7, 0xeb, 0xec, + 0xb0, 0xc9, 0xdd, 0xfe, 0xb5, 0x71, 0x26, 0xab, 0xc4, 0xe1, 0xe4, 0xb0, 0x08, 0x19, 0x15, 0x9a, + 0xdc, 0x87, 0x8a, 0xbc, 0xc9, 0x94, 0xee, 0x03, 0x22, 0x00, 0x15, 0x4b, 0x2e, 0xe8, 0x73, 0x2c, + 0x20, 0x9a, 0x0b, 0x88, 0xe2, 0x2f, 0xcd, 0x71, 0x7a, 0x23, 0x18, 0x5a, 0xb0, 0xc0, 0x1a, 0x3b, + 0x74, 0x1d, 0xc6, 0x45, 0xe2, 0x7f, 0xe1, 0x60, 0x28, 0x1b, 0x26, 0xf6, 0x38, 0xd6, 0x91, 0xfb, + 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x4d, 0x78, 0x5c, 0x7b, 0xd8, 0xa6, 0x4b, 0xd0, 0x13, 0x97, 0x3c, + 0x4f, 0xec, 0xed, 0xce, 0x3e, 0xbe, 0x76, 0x10, 0x21, 0x3e, 0x98, 0x0f, 0xba, 0x05, 0xa7, 0x9d, + 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, 0xad, 0xfb, 0xd1, 0xbd, 0xdd, + 0xd9, 0xd3, 0x0b, 0xdd, 0x08, 0x70, 0xf7, 0x72, 0xe8, 0x13, 0x50, 0x71, 0x83, 0x58, 0x8c, 0xc1, + 0x90, 0xf1, 0x8e, 0x53, 0xa5, 0x7a, 0xb3, 0xae, 0xfa, 0x9f, 0xfe, 0xc1, 0x69, 0x01, 0xf4, 0x0e, + 0x7f, 0xa7, 0x5c, 0x59, 0x33, 0xfc, 0xfd, 0xb0, 0x97, 0x0b, 0xd9, 0xcf, 0xc6, 0x65, 0x0b, 0xee, + 0x7b, 0x53, 0xc1, 0x85, 0xc6, 0x3d, 0x0c, 0xa3, 0x0a, 0xf4, 0x69, 0x40, 0x31, 0x89, 0xb6, 0xbd, + 0x06, 0x59, 0x68, 0xb0, 0x54, 0x9a, 0xec, 0x90, 0x6f, 0xc4, 0x88, 0xb2, 0x47, 0xf5, 0x0e, 0x0a, + 0xdc, 0xa5, 0x14, 0xba, 0x4a, 0x25, 0x8f, 0x0e, 0x15, 0xb1, 0xa0, 0x52, 0x31, 0x9c, 0xae, 0x92, + 0x56, 0x44, 0x1a, 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, 0xfb, 0x92, 0xca, 0x96, 0x0e, + 0x66, 0x04, 0x63, 0x67, 0xc6, 0x74, 0x6a, 0x67, 0x6d, 0x85, 0x71, 0x72, 0x93, 0x24, 0xf7, 0xc3, + 0xe8, 0x1e, 0xf3, 0xd9, 0x8f, 0x68, 0x79, 0xc9, 0x52, 0x14, 0xd6, 0xe9, 0xa8, 0x0e, 0xc5, 0x0e, + 0x8b, 0x56, 0xab, 0xcc, 0x13, 0x3f, 0x92, 0xae, 0x9d, 0xab, 0x1c, 0x8c, 0x25, 0x5e, 0x92, 0xae, + 0xd6, 0x96, 0x98, 0x57, 0x3d, 0x43, 0xba, 0x5a, 0x5b, 0xc2, 0x12, 0x8f, 0xc2, 0xce, 0xd7, 0xb2, + 0x26, 0x8a, 0x9c, 0x70, 0x74, 0x4a, 0xf2, 0x82, 0x0f, 0x66, 0x3d, 0x80, 0x29, 0xf5, 0x62, 0x17, + 0x4f, 0x19, 0x19, 0x4f, 0x4f, 0x16, 0x79, 0x25, 0xbd, 0x6b, 0xe6, 0x49, 0x15, 0xfc, 0xbb, 0x9a, + 0xe1, 0x89, 0x3b, 0x6a, 0x31, 0xd2, 0x13, 0x4c, 0xe5, 0x66, 0xc0, 0x9f, 0x87, 0x4a, 0xdc, 0x5e, + 0x77, 0xc3, 0xa6, 0xe3, 0x05, 0xcc, 0xf5, 0xad, 0xbf, 0xf9, 0x2d, 0x11, 0x38, 0xa5, 0x41, 0x35, + 0x18, 0x71, 0xe4, 0x73, 0xf7, 0xa8, 0xc8, 0xf5, 0x65, 0xf5, 0xce, 0x3d, 0xf3, 0x8b, 0xaa, 0x07, + 0xee, 0x15, 0x17, 0xf4, 0x0a, 0x8c, 0x8b, 0xdb, 0x37, 0x24, 0x62, 0xad, 0x3e, 0x69, 0x86, 0x7d, + 0xd7, 0x25, 0x92, 0x4d, 0x30, 0x93, 0x16, 0x6d, 0xc2, 0x04, 0xe5, 0x92, 0x0a, 0xc0, 0xe9, 0x53, + 0xfd, 0xc9, 0x50, 0x2d, 0xd7, 0xb0, 0xce, 0x06, 0x67, 0xd8, 0x22, 0x17, 0x1e, 0x73, 0xda, 0x49, + 0xd8, 0xa4, 0x2b, 0xc1, 0x5c, 0x27, 0x6b, 0xe1, 0x3d, 0x12, 0x4c, 0x9f, 0x66, 0x33, 0xf0, 0xdc, + 0xde, 0xee, 0xec, 0x63, 0x0b, 0x07, 0xd0, 0xe1, 0x03, 0xb9, 0xcc, 0x7c, 0x12, 0x4e, 0x74, 0x48, + 0x8c, 0xbe, 0x62, 0x01, 0xff, 0xdd, 0x20, 0x54, 0x94, 0xc3, 0x0d, 0xcd, 0x9b, 0xbe, 0xd5, 0x47, + 0xb3, 0xbe, 0xd5, 0x11, 0xaa, 0xdf, 0xe8, 0xee, 0xd4, 0xcf, 0x77, 0x79, 0x42, 0xf9, 0xd9, 0xdc, + 0x25, 0x52, 0xfc, 0x7a, 0x4e, 0x1f, 0x0f, 0x4d, 0xa7, 0x46, 0xd7, 0xc0, 0x81, 0x46, 0x57, 0xc1, + 0x67, 0xc1, 0xa8, 0x79, 0xd5, 0x0a, 0xdd, 0xd5, 0x5a, 0xf6, 0xd5, 0x9b, 0x1a, 0x05, 0x62, 0x8e, + 0x63, 0x6a, 0x31, 0xdd, 0xf2, 0x98, 0x5a, 0x3c, 0x7c, 0x48, 0xb5, 0x58, 0x32, 0xc0, 0x29, 0x2f, + 0xb4, 0x0d, 0x27, 0x1a, 0xe6, 0x23, 0x46, 0xea, 0xd2, 0xcd, 0xf3, 0x7d, 0x3c, 0x22, 0xd4, 0xd6, + 0x5e, 0x4f, 0x58, 0xca, 0xf2, 0xc3, 0x9d, 0x55, 0xa0, 0x57, 0x60, 0xe4, 0x9d, 0x30, 0x5e, 0xf2, + 0x9d, 0x38, 0x16, 0x72, 0x5f, 0x5e, 0x6e, 0x18, 0x79, 0xed, 0x56, 0x9d, 0xc1, 0xf7, 0x77, 0x67, + 0x47, 0x6b, 0xa1, 0x2b, 0xff, 0x62, 0x55, 0x00, 0x7d, 0xd9, 0x82, 0xd3, 0xc6, 0x32, 0x50, 0x2d, + 0x87, 0xc3, 0xb4, 0xfc, 0x71, 0x51, 0xf3, 0xe9, 0xd5, 0x6e, 0x3c, 0x71, 0xf7, 0xaa, 0xec, 0xdf, + 0xe6, 0x1e, 0x46, 0xe1, 0x73, 0x20, 0x71, 0xdb, 0x3f, 0x8e, 0x4c, 0xe6, 0xb7, 0x0c, 0x77, 0xc8, + 0x43, 0xf0, 0x71, 0xff, 0x1b, 0x8b, 0xf9, 0xb8, 0xd7, 0x48, 0xb3, 0xe5, 0x3b, 0xc9, 0x71, 0x84, + 0x8a, 0x7e, 0x0e, 0x46, 0x12, 0x51, 0x5b, 0xb1, 0x34, 0xec, 0x5a, 0xf3, 0x98, 0xef, 0x5f, 0xed, + 0x1b, 0x12, 0x8a, 0x15, 0x43, 0xfb, 0x5f, 0xf0, 0xaf, 0x22, 0x31, 0xc7, 0x60, 0xc8, 0xdf, 0x34, + 0x0d, 0xf9, 0x67, 0x0a, 0xf7, 0xa5, 0x87, 0x41, 0xff, 0x03, 0xb3, 0x07, 0x4c, 0xbd, 0xff, 0xd9, + 0x39, 0x84, 0xb1, 0x6f, 0x81, 0xf9, 0xe2, 0x14, 0x7a, 0x95, 0x07, 0x5f, 0x73, 0x49, 0x7f, 0xa1, + 0xef, 0xc0, 0x6b, 0xfb, 0xd7, 0x4b, 0x70, 0x8a, 0xbb, 0x61, 0x17, 0xb6, 0x43, 0xcf, 0xad, 0x85, + 0xae, 0x08, 0x45, 0x77, 0x61, 0xac, 0xa5, 0x99, 0x5f, 0xc5, 0xb2, 0x6d, 0xe8, 0x06, 0x5b, 0xaa, + 0xf2, 0xea, 0x50, 0x6c, 0x70, 0xa5, 0xb5, 0x90, 0x6d, 0xaf, 0xa1, 0xbc, 0x7a, 0xa5, 0xbe, 0x85, + 0xaf, 0xaa, 0x65, 0x59, 0xe3, 0x83, 0x0d, 0xae, 0x47, 0xf0, 0x62, 0x80, 0xfd, 0x77, 0x2c, 0x78, + 0xa4, 0x47, 0x46, 0x0e, 0x5a, 0xdd, 0x7d, 0xe6, 0xfa, 0x16, 0x4f, 0x9a, 0xa9, 0xea, 0xb8, 0x43, + 0x1c, 0x0b, 0x2c, 0x5a, 0x07, 0xe0, 0x0e, 0x6d, 0xf6, 0xc0, 0x75, 0xa9, 0x48, 0x04, 0x4a, 0xc7, + 0xbd, 0x77, 0xed, 0x4a, 0xb4, 0x7a, 0xd2, 0x5a, 0xe3, 0x6a, 0x7f, 0xbb, 0x0c, 0x83, 0xfc, 0xe5, + 0xdc, 0x1a, 0x0c, 0x6f, 0xf1, 0x0c, 0xa1, 0xfd, 0x25, 0x28, 0x4d, 0xd5, 0x6b, 0x0e, 0xc0, 0x92, + 0x0d, 0xba, 0x01, 0x27, 0xa9, 0xf0, 0xf6, 0x1c, 0xbf, 0x4a, 0x7c, 0x67, 0x47, 0xda, 0x6b, 0x3c, + 0x8d, 0xbc, 0xcc, 0x77, 0x7c, 0x72, 0xb5, 0x93, 0x04, 0x77, 0x2b, 0x87, 0x5e, 0xed, 0x48, 0xe8, + 0xc5, 0x33, 0xaf, 0x2a, 0x5d, 0xed, 0xe0, 0xa4, 0x5e, 0x54, 0xa3, 0x6c, 0x75, 0x58, 0xa6, 0xda, + 0x03, 0xa5, 0xa6, 0x35, 0x6a, 0xd2, 0xa2, 0x2a, 0x4c, 0xc5, 0x6d, 0x16, 0x0f, 0xb0, 0xb6, 0x15, + 0x91, 0x78, 0x2b, 0xf4, 0x5d, 0xf1, 0xb6, 0x9e, 0xd2, 0xc2, 0xeb, 0x19, 0x3c, 0xee, 0x28, 0x41, + 0xb9, 0x6c, 0x38, 0x9e, 0xdf, 0x8e, 0x48, 0xca, 0x65, 0xc8, 0xe4, 0xb2, 0x92, 0xc1, 0xe3, 0x8e, + 0x12, 0x74, 0x6e, 0x9d, 0x16, 0x4f, 0xbd, 0xc9, 0xcb, 0xac, 0xe2, 0x00, 0xfa, 0x33, 0x30, 0x2c, + 0x43, 0x9a, 0x0b, 0xa5, 0x49, 0x10, 0x47, 0xe7, 0xea, 0xd9, 0x38, 0xed, 0x59, 0x21, 0x11, 0xcc, + 0x2c, 0xf9, 0x1d, 0xe6, 0x49, 0xb1, 0x3f, 0xb6, 0xe0, 0x64, 0x97, 0xe0, 0x1e, 0x1e, 0x72, 0xba, + 0xe9, 0xc5, 0x89, 0x4a, 0x6a, 0xae, 0x85, 0x9c, 0x72, 0x38, 0x56, 0x14, 0x74, 0xb5, 0x70, 0xb7, + 0x48, 0xf6, 0xc8, 0x5c, 0x84, 0x2f, 0x08, 0x6c, 0x7f, 0x69, 0xc4, 0xd0, 0x39, 0x18, 0x68, 0xc7, + 0x24, 0x92, 0xef, 0x7b, 0x49, 0x51, 0xca, 0x3c, 0x61, 0x0c, 0x43, 0x35, 0xc3, 0x4d, 0xe5, 0x84, + 0xd2, 0x34, 0x43, 0xee, 0x86, 0xe2, 0x38, 0xfb, 0x1b, 0x65, 0x98, 0xcc, 0x04, 0xf9, 0xd1, 0x86, + 0x34, 0xc3, 0xc0, 0x4b, 0x42, 0x95, 0xba, 0x8a, 0x3f, 0x29, 0x44, 0x5a, 0x5b, 0x37, 0x04, 0x1c, + 0x2b, 0x0a, 0xf4, 0xb4, 0xf9, 0xdc, 0x7a, 0xda, 0xe6, 0xc5, 0xaa, 0xf1, 0xf2, 0x62, 0xd1, 0x87, + 0x16, 0x9e, 0x84, 0x81, 0x56, 0xa8, 0x5e, 0xd1, 0x55, 0xdf, 0x13, 0x2f, 0x56, 0x6b, 0x61, 0xe8, + 0x63, 0x86, 0x44, 0x4f, 0x89, 0xde, 0x67, 0x7c, 0xf7, 0xd8, 0x71, 0xc3, 0x58, 0x1b, 0x82, 0x67, + 0x60, 0xf8, 0x1e, 0xd9, 0x89, 0xbc, 0x60, 0x33, 0x7b, 0x72, 0x71, 0x8d, 0x83, 0xb1, 0xc4, 0x9b, + 0x8f, 0x29, 0x0c, 0x1f, 0xf1, 0x63, 0x0a, 0x23, 0xb9, 0x71, 0xca, 0xdf, 0xb5, 0x60, 0x92, 0xe5, + 0x73, 0x14, 0x57, 0xa9, 0xbd, 0x30, 0x38, 0x86, 0x6d, 0xfc, 0x49, 0x18, 0x8c, 0x68, 0xa5, 0xd9, + 0x6c, 0xe8, 0xac, 0x25, 0x98, 0xe3, 0xd0, 0x63, 0x30, 0xc0, 0x9a, 0x40, 0x3f, 0xe3, 0x18, 0x4f, + 0x1b, 0x5d, 0x75, 0x12, 0x07, 0x33, 0x28, 0xbb, 0x15, 0x83, 0x49, 0xcb, 0xf7, 0x78, 0xa3, 0x53, + 0x87, 0xe3, 0xfb, 0xed, 0x56, 0x4c, 0xd7, 0x46, 0x3e, 0xac, 0x5b, 0x31, 0xdd, 0x99, 0x1f, 0xac, + 0x4a, 0xff, 0xf7, 0x12, 0x9c, 0xed, 0x5a, 0x2e, 0x3d, 0x03, 0x5d, 0x31, 0xce, 0x40, 0x2f, 0x65, + 0xce, 0x40, 0xed, 0x83, 0x4b, 0x3f, 0x9c, 0x53, 0xd1, 0xee, 0x87, 0x95, 0xe5, 0x63, 0x3c, 0xac, + 0x1c, 0x28, 0xaa, 0xe2, 0x0c, 0xe6, 0xa8, 0x38, 0xbf, 0x6f, 0xc1, 0xa3, 0x5d, 0x87, 0xec, 0x7d, + 0x77, 0x0d, 0xa9, 0x6b, 0x2b, 0x7b, 0x18, 0x00, 0xbf, 0x52, 0xee, 0xd1, 0x2b, 0x66, 0x0a, 0x9c, + 0xa7, 0x52, 0x88, 0x21, 0x63, 0xa1, 0xbc, 0x8d, 0x71, 0x09, 0xc4, 0x61, 0x58, 0x61, 0x51, 0xac, + 0x5d, 0xe3, 0xe1, 0x8d, 0x5c, 0x3e, 0xe4, 0x82, 0x9a, 0x33, 0x3d, 0xc5, 0xfa, 0xfd, 0xf0, 0xcc, + 0xe5, 0x1e, 0x74, 0x57, 0x33, 0xee, 0xca, 0x87, 0x31, 0xee, 0xc6, 0xba, 0x1b, 0x76, 0x68, 0x01, + 0x26, 0x9b, 0x5e, 0xc0, 0xde, 0x60, 0x34, 0xb5, 0x27, 0x75, 0x97, 0xf2, 0x86, 0x89, 0xc6, 0x59, + 0xfa, 0x99, 0x57, 0x60, 0xfc, 0xf0, 0x0e, 0xac, 0x77, 0xcb, 0xf0, 0xc1, 0x03, 0x84, 0x02, 0xdf, + 0x1d, 0x8c, 0xef, 0xa2, 0xed, 0x0e, 0x1d, 0xdf, 0xa6, 0x06, 0xa7, 0x36, 0xda, 0xbe, 0xbf, 0xc3, + 0x22, 0x88, 0x88, 0x2b, 0x29, 0x84, 0x52, 0xa3, 0x1e, 0x64, 0x5e, 0xe9, 0x42, 0x83, 0xbb, 0x96, + 0x44, 0x9f, 0x06, 0x14, 0xae, 0xb3, 0x8c, 0xa7, 0x6e, 0x7a, 0xff, 0x9d, 0x7d, 0x82, 0x72, 0xba, + 0x54, 0x6f, 0x75, 0x50, 0xe0, 0x2e, 0xa5, 0xa8, 0x9e, 0xca, 0xde, 0x72, 0x56, 0xcd, 0xca, 0xe8, + 0xa9, 0x58, 0x47, 0x62, 0x93, 0x16, 0x5d, 0x81, 0x13, 0xce, 0xb6, 0xe3, 0xf1, 0x0c, 0x46, 0x92, + 0x01, 0x57, 0x54, 0x95, 0x8b, 0x68, 0x21, 0x4b, 0x80, 0x3b, 0xcb, 0xa0, 0x96, 0xe1, 0xf3, 0xe3, + 0xb9, 0xce, 0x3f, 0x71, 0x88, 0x19, 0x5c, 0xd8, 0x0b, 0x68, 0xff, 0x57, 0x8b, 0x6e, 0x7d, 0x5d, + 0x9e, 0xeb, 0xa3, 0x23, 0xa2, 0x7c, 0x58, 0xda, 0xc5, 0x26, 0x35, 0x22, 0x4b, 0x3a, 0x12, 0x9b, + 0xb4, 0x7c, 0x6a, 0xc4, 0x69, 0x28, 0xb2, 0xa1, 0x6d, 0x8a, 0x1b, 0x7d, 0x8a, 0x82, 0x6a, 0xd0, + 0xae, 0xb7, 0xed, 0xc5, 0x61, 0x24, 0x16, 0x50, 0x9f, 0xe1, 0xad, 0xa9, 0xbc, 0xac, 0x72, 0x36, + 0x58, 0xf2, 0xb3, 0xbf, 0x59, 0x82, 0x71, 0x59, 0xe3, 0x6b, 0xed, 0x30, 0x71, 0x8e, 0x61, 0x4b, + 0x7f, 0xcd, 0xd8, 0xd2, 0xe7, 0x8b, 0x5d, 0x70, 0x64, 0x8d, 0xeb, 0xb9, 0x95, 0x7f, 0x26, 0xb3, + 0x95, 0x5f, 0xec, 0x87, 0xe9, 0xc1, 0x5b, 0xf8, 0xbf, 0xb2, 0xe0, 0x84, 0x41, 0x7f, 0x0c, 0x3b, + 0x49, 0xcd, 0xdc, 0x49, 0x9e, 0xeb, 0xa3, 0x37, 0x3d, 0x76, 0x90, 0xef, 0x94, 0x32, 0xbd, 0x60, + 0x3b, 0xc7, 0x17, 0x61, 0x60, 0xcb, 0x89, 0xdc, 0x62, 0xe9, 0xfc, 0x3a, 0x8a, 0xcf, 0x5d, 0x75, + 0x22, 0x97, 0xcb, 0xff, 0x0b, 0xea, 0x31, 0x21, 0x27, 0x72, 0x73, 0x23, 0xf4, 0x59, 0xa5, 0xe8, + 0x32, 0x0c, 0xc5, 0x8d, 0xb0, 0xa5, 0x22, 0x21, 0xcf, 0xf1, 0x87, 0x86, 0x28, 0x64, 0x7f, 0x77, + 0x16, 0x99, 0xd5, 0x51, 0x30, 0x16, 0xf4, 0x33, 0x9b, 0x50, 0x51, 0x55, 0x1f, 0x69, 0x2c, 0xf8, + 0x9f, 0x94, 0xe1, 0x64, 0x97, 0xb9, 0x82, 0xbe, 0x64, 0x8c, 0xdb, 0x2b, 0x7d, 0x4f, 0xb6, 0xf7, + 0x38, 0x72, 0x5f, 0x62, 0x96, 0x92, 0x2b, 0x66, 0xc7, 0x21, 0xaa, 0xbf, 0x1d, 0x93, 0x6c, 0xf5, + 0x14, 0x94, 0x5f, 0x3d, 0xad, 0xf6, 0xd8, 0x86, 0x9f, 0x56, 0xa4, 0x5a, 0x7a, 0xa4, 0xdf, 0xf9, + 0x2f, 0x0c, 0xc0, 0xa9, 0x6e, 0x37, 0xa9, 0xd1, 0x57, 0xad, 0x4c, 0xce, 0xfe, 0x57, 0xfb, 0xbf, + 0x8e, 0xcd, 0x13, 0xf9, 0x8b, 0xec, 0x23, 0x73, 0x66, 0x16, 0xff, 0xdc, 0x11, 0x17, 0xb5, 0xb3, + 0xbb, 0x35, 0x11, 0x7f, 0x7f, 0x41, 0x4a, 0x85, 0x4f, 0x1d, 0xa2, 0x29, 0xe2, 0x09, 0x87, 0x38, + 0x73, 0xb7, 0x46, 0x82, 0xf3, 0xef, 0xd6, 0xc8, 0x36, 0xcc, 0x78, 0x30, 0xaa, 0xf5, 0xeb, 0x48, + 0xa7, 0xc1, 0x3d, 0xba, 0x45, 0x69, 0xed, 0x3e, 0xd2, 0xa9, 0xf0, 0x37, 0x2d, 0xc8, 0x84, 0x2d, + 0x29, 0xb7, 0x8c, 0xd5, 0xd3, 0x2d, 0x73, 0x0e, 0x06, 0xa2, 0xd0, 0x27, 0xd9, 0x7c, 0xf2, 0x38, + 0xf4, 0x09, 0x66, 0x18, 0xf5, 0xbe, 0x68, 0xb9, 0xd7, 0xfb, 0xa2, 0xd4, 0x4e, 0xf7, 0xc9, 0x36, + 0x91, 0x4e, 0x12, 0x25, 0xc6, 0xaf, 0x53, 0x20, 0xe6, 0x38, 0xfb, 0xf7, 0xca, 0x30, 0xc4, 0x3d, + 0x11, 0xc7, 0xb0, 0x4f, 0xd7, 0x84, 0x53, 0xa0, 0xd0, 0xfd, 0x66, 0xde, 0xaa, 0xb9, 0xaa, 0x93, + 0x38, 0x7c, 0x72, 0xa9, 0x3e, 0xa6, 0x8e, 0x04, 0x34, 0x67, 0x8c, 0xc2, 0x4c, 0xc6, 0xd6, 0x05, + 0xce, 0x43, 0x1b, 0x93, 0x2d, 0x80, 0x98, 0xbd, 0x67, 0x47, 0x79, 0x88, 0x1c, 0x8c, 0x2f, 0x16, + 0x6a, 0x47, 0x5d, 0x15, 0xe3, 0xad, 0x49, 0x13, 0xbf, 0x29, 0x04, 0xd6, 0x78, 0xcf, 0xbc, 0x0c, + 0x15, 0x45, 0x9c, 0x67, 0x04, 0x8c, 0xe9, 0x93, 0xf3, 0xff, 0x83, 0xc9, 0x4c, 0x5d, 0x7d, 0xd9, + 0x10, 0xbf, 0x65, 0xc1, 0x64, 0xe6, 0x29, 0x6e, 0xf4, 0x15, 0x0b, 0x4e, 0xf9, 0x5d, 0x1c, 0x51, + 0xe2, 0x33, 0x1f, 0xc6, 0x85, 0xa5, 0xcc, 0x87, 0x6e, 0x58, 0xdc, 0xb5, 0x36, 0x6a, 0x56, 0xf2, + 0xe7, 0x39, 0x1d, 0x5f, 0x44, 0x81, 0x8e, 0xf1, 0x84, 0xb1, 0x1c, 0x86, 0x15, 0xd6, 0xfe, 0x89, + 0x05, 0x27, 0x3a, 0x5e, 0x7b, 0x7e, 0xbf, 0x74, 0x43, 0xa4, 0xc6, 0x2d, 0xf5, 0x48, 0x8d, 0xab, + 0xf7, 0xb2, 0x7c, 0x60, 0x2f, 0x7f, 0xdd, 0x02, 0x31, 0x43, 0x8f, 0x41, 0x03, 0x5c, 0x35, 0x35, + 0xc0, 0x0f, 0x15, 0x99, 0xf4, 0x3d, 0x54, 0xbf, 0x5f, 0x2e, 0xc1, 0x14, 0x27, 0x48, 0x7d, 0xea, + 0xef, 0x97, 0x8f, 0xd3, 0xdf, 0x93, 0x0d, 0xea, 0x9d, 0xbc, 0xee, 0x3d, 0x35, 0xbe, 0xe5, 0xc0, + 0x81, 0xdf, 0xf2, 0xcf, 0x2c, 0x40, 0x7c, 0x4c, 0xb2, 0x6f, 0x9b, 0x72, 0xe7, 0xae, 0x66, 0xd0, + 0xa5, 0x92, 0x43, 0x61, 0xb0, 0x46, 0xf5, 0x90, 0xbb, 0x90, 0x39, 0xd1, 0x28, 0xe7, 0x9f, 0x68, + 0xf4, 0xd1, 0xeb, 0xdf, 0x2e, 0x43, 0x36, 0x1c, 0x0c, 0xbd, 0x05, 0x63, 0x0d, 0xa7, 0xe5, 0xac, + 0x7b, 0xbe, 0x97, 0x78, 0x24, 0x2e, 0x76, 0x64, 0xba, 0xa4, 0x95, 0x10, 0x07, 0x09, 0x1a, 0x04, + 0x1b, 0x1c, 0xd1, 0x1c, 0x40, 0x2b, 0xf2, 0xb6, 0x3d, 0x9f, 0x6c, 0x32, 0x9d, 0x95, 0xc5, 0x93, + 0xf3, 0xd3, 0x3f, 0x09, 0xc5, 0x1a, 0x45, 0x97, 0xf8, 0xe3, 0xf2, 0x71, 0xc4, 0x1f, 0x0f, 0xf4, + 0x19, 0x7f, 0x3c, 0x58, 0x28, 0xfe, 0x18, 0xc3, 0x19, 0xe9, 0xff, 0xa7, 0xff, 0x57, 0x3c, 0x9f, + 0xf0, 0x74, 0xa3, 0x22, 0xde, 0x7c, 0x66, 0x6f, 0x77, 0xf6, 0x0c, 0xee, 0x4a, 0x81, 0x7b, 0x94, + 0xb4, 0xdb, 0x70, 0xb2, 0x4e, 0x22, 0x8f, 0x65, 0x81, 0x73, 0xd3, 0xb5, 0xf4, 0x79, 0xa8, 0x44, + 0x99, 0x65, 0xdc, 0xe7, 0x75, 0x60, 0x2d, 0x6f, 0x90, 0x5c, 0xb6, 0x29, 0x4b, 0xfb, 0x2f, 0x97, + 0x60, 0x58, 0x04, 0x82, 0x1d, 0x83, 0xf2, 0x71, 0xcd, 0x70, 0x12, 0x3c, 0x93, 0x27, 0xff, 0x58, + 0xb3, 0x7a, 0xba, 0x07, 0xea, 0x19, 0xf7, 0xc0, 0x73, 0xc5, 0xd8, 0x1d, 0xec, 0x18, 0xf8, 0x07, + 0x65, 0x98, 0x30, 0x03, 0xe3, 0x8e, 0x61, 0x58, 0x5e, 0x87, 0xe1, 0x58, 0xc4, 0x68, 0x96, 0x8a, + 0x04, 0x36, 0x65, 0x3f, 0x71, 0x7a, 0x96, 0x2a, 0xa2, 0x32, 0x25, 0xbb, 0xae, 0x61, 0xa0, 0xe5, + 0x63, 0x09, 0x03, 0xcd, 0x8b, 0x57, 0x1c, 0x78, 0x18, 0xf1, 0x8a, 0xf6, 0x0f, 0x99, 0xc8, 0xd7, + 0xe1, 0xc7, 0xb0, 0x8d, 0xbf, 0x66, 0x6e, 0x0e, 0x17, 0x0a, 0xcd, 0x3b, 0xd1, 0xbc, 0x1e, 0xdb, + 0xf9, 0xf7, 0x2c, 0x18, 0x15, 0x84, 0xc7, 0xd0, 0x81, 0x4f, 0x9b, 0x1d, 0x78, 0xaa, 0x50, 0x07, + 0x7a, 0xb4, 0xfc, 0x9b, 0x25, 0xd5, 0xf2, 0x9a, 0x78, 0x8f, 0x3a, 0x37, 0xe7, 0xed, 0x48, 0x2b, + 0x0a, 0x93, 0xb0, 0x11, 0xfa, 0x42, 0x81, 0x7b, 0x2c, 0xbd, 0x5e, 0xc4, 0xe1, 0xfb, 0xda, 0x6f, + 0xac, 0xa8, 0xd9, 0xed, 0x97, 0x30, 0x4a, 0xc4, 0x06, 0xda, 0xed, 0x35, 0x6c, 0x17, 0x20, 0x7d, + 0x82, 0x58, 0xdc, 0xcc, 0xeb, 0xff, 0x9d, 0xed, 0xf4, 0xbe, 0x90, 0xe2, 0x85, 0x35, 0xbe, 0x32, + 0x10, 0x9d, 0xd5, 0x31, 0x68, 0x9e, 0x01, 0xdc, 0x14, 0x70, 0xac, 0x28, 0xec, 0x97, 0x99, 0x64, + 0x67, 0x03, 0xd4, 0xdf, 0x55, 0x9e, 0xbf, 0x34, 0xa4, 0x86, 0x96, 0x39, 0xf6, 0x6e, 0xea, 0x17, + 0x86, 0x8a, 0x8a, 0x4f, 0xda, 0x04, 0x3d, 0xd8, 0x34, 0xbd, 0x5f, 0x84, 0x48, 0xc7, 0xc1, 0xd1, + 0xcb, 0x85, 0x25, 0x72, 0x1f, 0x47, 0x45, 0x2c, 0x51, 0x18, 0xcb, 0x8e, 0xb4, 0x5a, 0xcb, 0x66, + 0x2a, 0x5e, 0x92, 0x08, 0x9c, 0xd2, 0xa0, 0x79, 0x61, 0x50, 0x9a, 0xcf, 0x95, 0x4b, 0x83, 0x52, + 0x0e, 0x89, 0x66, 0x51, 0x5e, 0x84, 0x51, 0xf5, 0x5e, 0x43, 0x8d, 0xa7, 0xdd, 0xaf, 0x70, 0xfd, + 0x6a, 0x39, 0x05, 0x63, 0x9d, 0x06, 0xad, 0xc2, 0x49, 0x57, 0xdd, 0x3b, 0xa8, 0xb5, 0xd7, 0x7d, + 0xaf, 0x41, 0x8b, 0xf2, 0x3b, 0x83, 0x8f, 0xec, 0xed, 0xce, 0x9e, 0xac, 0x76, 0xa2, 0x71, 0xb7, + 0x32, 0x68, 0x0d, 0x26, 0x63, 0xfe, 0x2e, 0x85, 0x0c, 0x2e, 0x17, 0x09, 0x3c, 0x9f, 0x95, 0x27, + 0x56, 0x75, 0x13, 0xbd, 0xcf, 0x40, 0x5c, 0x2a, 0xc8, 0x70, 0xf4, 0x2c, 0x0b, 0xf4, 0x2a, 0x4c, + 0xf8, 0xfa, 0xa3, 0x7b, 0x35, 0x71, 0xfd, 0x42, 0xc5, 0x20, 0x19, 0x4f, 0xf2, 0xd5, 0x70, 0x86, + 0x1a, 0xbd, 0x0e, 0xd3, 0x3a, 0x44, 0x64, 0x31, 0x71, 0x82, 0x4d, 0x12, 0x8b, 0x84, 0xf8, 0x8f, + 0xed, 0xed, 0xce, 0x4e, 0x5f, 0xef, 0x41, 0x83, 0x7b, 0x96, 0x46, 0x97, 0x61, 0x4c, 0x8e, 0xa4, + 0x76, 0x15, 0x23, 0x8d, 0x7e, 0xd3, 0x70, 0xd8, 0xa0, 0x7c, 0x6f, 0x07, 0x73, 0x5f, 0xa4, 0x85, + 0xb5, 0x2d, 0x1c, 0xbd, 0x0d, 0x63, 0x7a, 0x1b, 0xb3, 0x7b, 0x73, 0xfe, 0x43, 0x86, 0x42, 0x15, + 0x50, 0x2d, 0xd7, 0x71, 0xd8, 0xe0, 0x6d, 0xdf, 0x82, 0xa1, 0xfa, 0x4e, 0xdc, 0x48, 0xfc, 0x87, + 0xf5, 0x52, 0x3d, 0x81, 0xc9, 0xcc, 0x93, 0xee, 0x08, 0x0b, 0xe9, 0x66, 0x1d, 0x52, 0x6a, 0x75, + 0x91, 0x87, 0xf6, 0x1f, 0x59, 0x30, 0xb8, 0xe6, 0x78, 0xf9, 0x8f, 0xc9, 0x14, 0x69, 0x34, 0x7a, + 0x09, 0x86, 0xc8, 0xc6, 0x06, 0x69, 0x24, 0x62, 0x19, 0xcb, 0x80, 0xea, 0xa1, 0x65, 0x06, 0xa5, + 0x8b, 0x93, 0x55, 0xc6, 0xff, 0x62, 0x41, 0x8c, 0x3e, 0x07, 0x95, 0xc4, 0x6b, 0x92, 0x05, 0xd7, + 0x25, 0xee, 0x21, 0x6e, 0x4b, 0x2b, 0x61, 0xb1, 0x26, 0x99, 0xe0, 0x94, 0x9f, 0xfd, 0xf5, 0x12, + 0xc0, 0x5a, 0xe8, 0xcb, 0x23, 0xcd, 0x9c, 0x6e, 0x2e, 0x76, 0xbc, 0x99, 0xf3, 0x74, 0x97, 0x37, + 0x73, 0x50, 0xca, 0xb0, 0xcb, 0x8b, 0x39, 0x6a, 0xa8, 0xca, 0x85, 0x86, 0x6a, 0xa0, 0x9f, 0xa1, + 0x5a, 0x82, 0x13, 0x89, 0xaa, 0xdb, 0xbc, 0x76, 0xc6, 0x12, 0xfa, 0xad, 0x65, 0x91, 0xb8, 0x93, + 0xde, 0xfe, 0xba, 0x05, 0x22, 0x64, 0xad, 0xc0, 0x6c, 0x75, 0xe5, 0x63, 0x19, 0x46, 0x0e, 0xa5, + 0x67, 0x8b, 0x44, 0xf3, 0x89, 0xcc, 0x49, 0x6a, 0xfd, 0x18, 0xf9, 0x92, 0x0c, 0xae, 0xf6, 0x6f, + 0x58, 0x30, 0xca, 0xd1, 0x37, 0x98, 0x4e, 0x9d, 0xdf, 0xae, 0xbe, 0xb2, 0x45, 0xb2, 0x77, 0x24, + 0x28, 0x63, 0x95, 0x35, 0x50, 0x7f, 0x47, 0x42, 0x22, 0x70, 0x4a, 0x83, 0x9e, 0x81, 0xe1, 0xb8, + 0xbd, 0xce, 0xc8, 0x33, 0xf1, 0x6b, 0x75, 0x0e, 0xc6, 0x12, 0x6f, 0xff, 0xa3, 0x12, 0x4c, 0x65, + 0xc3, 0x17, 0x11, 0x86, 0x21, 0xae, 0x63, 0x67, 0xd5, 0xb3, 0x83, 0x7c, 0x39, 0x5a, 0xf8, 0x23, + 0xf0, 0x07, 0x4c, 0x59, 0xcc, 0x99, 0xe0, 0x84, 0x36, 0x60, 0xd4, 0x0d, 0xef, 0x07, 0xf7, 0x9d, + 0xc8, 0x5d, 0xa8, 0xad, 0x8a, 0x2f, 0x91, 0x13, 0x70, 0x52, 0x4d, 0x0b, 0xe8, 0xc1, 0x95, 0xcc, + 0xb7, 0x90, 0xa2, 0xb0, 0xce, 0x98, 0xda, 0x94, 0x8d, 0x30, 0xd8, 0xf0, 0x36, 0x6f, 0x38, 0xad, + 0x62, 0x47, 0xab, 0x4b, 0x92, 0x5c, 0xab, 0x63, 0x5c, 0xdc, 0x33, 0xe7, 0x08, 0x9c, 0xb2, 0xb4, + 0xff, 0x04, 0x81, 0x31, 0x17, 0x8c, 0x94, 0x8e, 0xd6, 0x43, 0x4f, 0xe9, 0xf8, 0x06, 0x8c, 0x90, + 0x66, 0x2b, 0xd9, 0xa9, 0x7a, 0x51, 0xb1, 0xf4, 0xba, 0xcb, 0x82, 0xba, 0x93, 0xbb, 0xc4, 0x60, + 0xc5, 0xb1, 0x47, 0x82, 0xce, 0xf2, 0xfb, 0x22, 0x41, 0xe7, 0xc0, 0x4f, 0x25, 0x41, 0xe7, 0xeb, + 0x30, 0xbc, 0xe9, 0x25, 0x98, 0xb4, 0x42, 0x71, 0x71, 0x3f, 0x67, 0xf2, 0x5c, 0xe1, 0xc4, 0x9d, + 0x59, 0xf7, 0x04, 0x02, 0x4b, 0x76, 0x68, 0x4d, 0x2d, 0xaa, 0xa1, 0x22, 0x7b, 0x79, 0xa7, 0xaf, + 0xaf, 0xeb, 0xb2, 0x12, 0x09, 0x39, 0x87, 0xdf, 0x7b, 0x42, 0x4e, 0x95, 0x46, 0x73, 0xe4, 0x61, + 0xa5, 0xd1, 0x34, 0xd2, 0x91, 0x56, 0x8e, 0x22, 0x1d, 0xe9, 0xd7, 0x2d, 0x38, 0xdd, 0xea, 0x96, + 0xcc, 0x57, 0x24, 0xc4, 0xfc, 0xe4, 0x21, 0xd2, 0x1b, 0x1b, 0x55, 0xb3, 0xeb, 0xd0, 0x5d, 0xc9, + 0x70, 0xf7, 0x8a, 0x65, 0x5e, 0xd3, 0xd1, 0xf7, 0x9e, 0xd7, 0xf4, 0xa8, 0x33, 0x67, 0xa6, 0x59, + 0x4e, 0xc7, 0x8f, 0x24, 0xcb, 0xe9, 0xc4, 0x43, 0xcc, 0x72, 0xaa, 0xe5, 0x27, 0x9d, 0x7c, 0xb8, + 0xf9, 0x49, 0xb7, 0xcc, 0x7d, 0x89, 0xa7, 0xc3, 0x7c, 0xa9, 0xf0, 0xbe, 0x64, 0xd4, 0x70, 0xf0, + 0xce, 0xc4, 0x33, 0xb5, 0x9e, 0x78, 0x8f, 0x99, 0x5a, 0x8d, 0x7c, 0xa7, 0xe8, 0x28, 0xf2, 0x9d, + 0xbe, 0xa5, 0xef, 0xa0, 0x27, 0x8b, 0xd4, 0xa0, 0x36, 0xca, 0xce, 0x1a, 0xba, 0xed, 0xa1, 0x9d, + 0x19, 0x55, 0x4f, 0x1d, 0x77, 0x46, 0xd5, 0xd3, 0x47, 0x98, 0x51, 0xf5, 0xcc, 0xb1, 0x66, 0x54, + 0x7d, 0xe4, 0xa7, 0x91, 0x51, 0x95, 0x76, 0xb8, 0x25, 0xaf, 0xce, 0x4c, 0x4f, 0x17, 0xe9, 0x70, + 0xd7, 0x9b, 0x36, 0xbc, 0xc3, 0x0a, 0x85, 0x53, 0xa6, 0xf6, 0x9f, 0x83, 0xb3, 0x07, 0x7f, 0xf0, + 0xf4, 0x55, 0x80, 0x5a, 0xea, 0x69, 0xca, 0xbc, 0x0a, 0xc0, 0x94, 0x29, 0x8d, 0xaa, 0x70, 0xe2, + 0xc8, 0xef, 0x58, 0xf0, 0x48, 0x8f, 0xbc, 0x6a, 0x85, 0xef, 0x9d, 0xb5, 0x60, 0xb2, 0x65, 0x16, + 0x2d, 0x7c, 0x53, 0xd4, 0xc8, 0xe3, 0xa6, 0x62, 0x83, 0x33, 0x08, 0x9c, 0x65, 0xbf, 0xf8, 0xa1, + 0x1f, 0xbd, 0x7b, 0xf6, 0x03, 0x3f, 0x7e, 0xf7, 0xec, 0x07, 0xfe, 0xf0, 0xdd, 0xb3, 0x1f, 0xf8, + 0x85, 0xbd, 0xb3, 0xd6, 0x8f, 0xf6, 0xce, 0x5a, 0x3f, 0xde, 0x3b, 0x6b, 0xfd, 0xf1, 0xde, 0x59, + 0xeb, 0xeb, 0x3f, 0x39, 0xfb, 0x81, 0xcf, 0x96, 0xb6, 0x2f, 0xfe, 0xdf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x67, 0xe3, 0xa3, 0x34, 0xbd, 0xc2, 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index 02f82b5555b..0bb9dbfa36c 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -309,6 +309,31 @@ message ConfigMapList { repeated ConfigMap items = 2; } +// Adapts a ConfigMap into a projected volume. +// +// The contents of the target ConfigMap's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names, +// unless the items element is populated with specific mappings of keys to paths. +// Note that this is identical to a configmap volume source without the default +// mode. +message ConfigMapProjection { + optional LocalObjectReference localObjectReference = 1; + + // If unspecified, each key-value pair in the Data field of the referenced + // ConfigMap will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the ConfigMap, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + repeated KeyToPath items = 2; + + // Specify whether the ConfigMap or it's keys must be defined + // +optional + optional bool optional = 4; +} + // Adapts a ConfigMap into a volume. // // The contents of the target ConfigMap's Data field will be presented in a @@ -661,6 +686,15 @@ message DeleteOptions { optional bool orphanDependents = 3; } +// Represents downward API info for projecting into a projected volume. +// Note that this is identical to a downwardAPI volume source without the default +// mode. +message DownwardAPIProjection { + // Items is a list of DownwardAPIVolume file + // +optional + repeated DownwardAPIVolumeFile items = 1; +} + // DownwardAPIVolumeFile represents information to create the file containing the pod field message DownwardAPIVolumeFile { // Required: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..' @@ -2807,6 +2841,20 @@ message Probe { optional int32 failureThreshold = 6; } +// Represents a projected volume source +message ProjectedVolumeSource { + // list of volume projections + repeated VolumeProjection sources = 1; + + // Mode bits to use on created files by default. Must be a value between + // 0 and 0777. + // Directories within the path are not affected by this setting. + // This might be in conflict with other options that affect the file + // mode, like fsGroup, and the result can be other mode bits set. + // +optional + optional int32 defaultMode = 2; +} + // Represents a Quobyte mount that lasts the lifetime of a pod. // Quobyte volumes do not support ownership management or SELinux relabeling. message QuobyteVolumeSource { @@ -3183,6 +3231,30 @@ message SecretList { repeated Secret items = 2; } +// Adapts a secret into a projected volume. +// +// The contents of the target Secret's Data field will be presented in a +// projected volume as files using the keys in the Data field as the file names. +// Note that this is identical to a secret volume source without the default +// mode. +message SecretProjection { + optional LocalObjectReference localObjectReference = 1; + + // If unspecified, each key-value pair in the Data field of the referenced + // Secret will be projected into the volume as a file whose name is the + // key and content is the value. If specified, the listed keys will be + // projected into the specified paths, and unlisted keys will not be + // present. If a key is specified which is not present in the Secret, + // the volume setup will error unless it is marked optional. Paths must be + // relative and may not contain the '..' path or start with '..'. + // +optional + repeated KeyToPath items = 2; + + // Specify whether the Secret or its key must be defined + // +optional + optional bool optional = 4; +} + // Adapts a Secret into a volume. // // The contents of the target Secret's Data field will be presented in a volume @@ -3591,6 +3663,18 @@ message VolumeMount { optional string subPath = 4; } +// Projection that may be projected along with other supported volume types +message VolumeProjection { + // information about the secret data to project + optional SecretProjection secret = 1; + + // information about the downwardAPI data to project + optional DownwardAPIProjection downwardAPI = 2; + + // information about the configMap data to project + optional ConfigMapProjection configMap = 3; +} + // Represents the source of a volume to mount. // Only one of its members may be specified. message VolumeSource { @@ -3707,6 +3791,9 @@ message VolumeSource { // PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine optional PhotonPersistentDiskVolumeSource photonPersistentDisk = 23; + + // Items for all in one resources secrets, configmaps, and downward API + optional ProjectedVolumeSource projected = 24; } // Represents a vSphere volume resource. diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index ccb5115cf31..675f4b00c3b 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -1222,7 +1222,7 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [24]bool + var yyq2 [25]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[1] = x.VolumeSource.HostPath != nil && x.HostPath != nil @@ -1248,9 +1248,10 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[21] = x.VolumeSource.Quobyte != nil && x.Quobyte != nil yyq2[22] = x.VolumeSource.AzureDisk != nil && x.AzureDisk != nil yyq2[23] = x.VolumeSource.PhotonPersistentDisk != nil && x.PhotonPersistentDisk != nil + yyq2[24] = x.VolumeSource.Projected != nil && x.Projected != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(24) + r.EncodeArrayStart(25) } else { yynn2 = 1 for _, b := range yyq2 { @@ -2131,6 +2132,43 @@ func (x *Volume) CodecEncodeSelf(e *codec1978.Encoder) { } } } + var yyn75 bool + if x.VolumeSource.Projected == nil { + yyn75 = true + goto LABEL75 + } + LABEL75: + if yyr2 || yy2arr2 { + if yyn75 { + r.EncodeNil() + } else { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[24] { + if x.Projected == nil { + r.EncodeNil() + } else { + x.Projected.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } + } else { + if yyq2[24] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("projected")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if yyn75 { + r.EncodeNil() + } else { + if x.Projected == nil { + r.EncodeNil() + } else { + x.Projected.CodecEncodeSelf(e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -2526,6 +2564,20 @@ func (x *Volume) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } + case "projected": + if x.VolumeSource.Projected == nil { + x.VolumeSource.Projected = new(ProjectedVolumeSource) + } + if r.TryDecodeAsNil() { + if x.Projected != nil { + x.Projected = nil + } + } else { + if x.Projected == nil { + x.Projected = new(ProjectedVolumeSource) + } + x.Projected.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -2537,16 +2589,16 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj29 int - var yyb29 bool - var yyhl29 bool = l >= 0 - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + var yyj30 int + var yyb30 bool + var yyhl30 bool = l >= 0 + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2554,24 +2606,24 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Name = "" } else { - yyv30 := &x.Name - yym31 := z.DecBinary() - _ = yym31 + yyv31 := &x.Name + yym32 := z.DecBinary() + _ = yym32 if false { } else { - *((*string)(yyv30)) = r.DecodeString() + *((*string)(yyv31)) = r.DecodeString() } } if x.VolumeSource.HostPath == nil { x.VolumeSource.HostPath = new(HostPathVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2589,13 +2641,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.EmptyDir == nil { x.VolumeSource.EmptyDir = new(EmptyDirVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2613,13 +2665,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GCEPersistentDisk == nil { x.VolumeSource.GCEPersistentDisk = new(GCEPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2637,13 +2689,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AWSElasticBlockStore == nil { x.VolumeSource.AWSElasticBlockStore = new(AWSElasticBlockStoreVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2661,13 +2713,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.GitRepo == nil { x.VolumeSource.GitRepo = new(GitRepoVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2685,13 +2737,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Secret == nil { x.VolumeSource.Secret = new(SecretVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2709,13 +2761,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.NFS == nil { x.VolumeSource.NFS = new(NFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2733,13 +2785,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ISCSI == nil { x.VolumeSource.ISCSI = new(ISCSIVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2757,13 +2809,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Glusterfs == nil { x.VolumeSource.Glusterfs = new(GlusterfsVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2781,13 +2833,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PersistentVolumeClaim == nil { x.VolumeSource.PersistentVolumeClaim = new(PersistentVolumeClaimVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2805,13 +2857,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.RBD == nil { x.VolumeSource.RBD = new(RBDVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2829,13 +2881,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FlexVolume == nil { x.VolumeSource.FlexVolume = new(FlexVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2853,13 +2905,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Cinder == nil { x.VolumeSource.Cinder = new(CinderVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2877,13 +2929,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.CephFS == nil { x.VolumeSource.CephFS = new(CephFSVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2901,13 +2953,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Flocker == nil { x.VolumeSource.Flocker = new(FlockerVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2925,13 +2977,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.DownwardAPI == nil { x.VolumeSource.DownwardAPI = new(DownwardAPIVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2949,13 +3001,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.FC == nil { x.VolumeSource.FC = new(FCVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2973,13 +3025,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureFile == nil { x.VolumeSource.AzureFile = new(AzureFileVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2997,13 +3049,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.ConfigMap == nil { x.VolumeSource.ConfigMap = new(ConfigMapVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3021,13 +3073,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.VsphereVolume == nil { x.VolumeSource.VsphereVolume = new(VsphereVirtualDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3045,13 +3097,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.Quobyte == nil { x.VolumeSource.Quobyte = new(QuobyteVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3069,13 +3121,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.AzureDisk == nil { x.VolumeSource.AzureDisk = new(AzureDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3093,13 +3145,13 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.VolumeSource.PhotonPersistentDisk == nil { x.VolumeSource.PhotonPersistentDisk = new(PhotonPersistentDiskVolumeSource) } - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l } else { - yyb29 = r.CheckBreak() + yyb30 = r.CheckBreak() } - if yyb29 { + if yyb30 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -3114,18 +3166,42 @@ func (x *Volume) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - for { - yyj29++ - if yyhl29 { - yyb29 = yyj29 > l - } else { - yyb29 = r.CheckBreak() + if x.VolumeSource.Projected == nil { + x.VolumeSource.Projected = new(ProjectedVolumeSource) + } + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.Projected != nil { + x.Projected = nil } - if yyb29 { + } else { + if x.Projected == nil { + x.Projected = new(ProjectedVolumeSource) + } + x.Projected.CodecDecodeSelf(d) + } + for { + yyj30++ + if yyhl30 { + yyb30 = yyj30 > l + } else { + yyb30 = r.CheckBreak() + } + if yyb30 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj29-1, "") + z.DecStructFieldNotFound(yyj30-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -3144,7 +3220,7 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [23]bool + var yyq2 [24]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.HostPath != nil @@ -3170,9 +3246,10 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[20] = x.Quobyte != nil yyq2[21] = x.AzureDisk != nil yyq2[22] = x.PhotonPersistentDisk != nil + yyq2[23] = x.Projected != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(23) + r.EncodeArrayStart(24) } else { yynn2 = 0 for _, b := range yyq2 { @@ -3712,6 +3789,29 @@ func (x *VolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[23] { + if x.Projected == nil { + r.EncodeNil() + } else { + x.Projected.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[23] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("projected")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Projected == nil { + r.EncodeNil() + } else { + x.Projected.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -4026,6 +4126,17 @@ func (x *VolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } + case "projected": + if r.TryDecodeAsNil() { + if x.Projected != nil { + x.Projected = nil + } + } else { + if x.Projected == nil { + x.Projected = new(ProjectedVolumeSource) + } + x.Projected.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -4037,16 +4148,16 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj27 int - var yyb27 bool - var yyhl27 bool = l >= 0 - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + var yyj28 int + var yyb28 bool + var yyhl28 bool = l >= 0 + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4061,13 +4172,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.HostPath.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4082,13 +4193,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.EmptyDir.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4103,13 +4214,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GCEPersistentDisk.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4124,13 +4235,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AWSElasticBlockStore.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4145,13 +4256,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.GitRepo.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4166,13 +4277,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Secret.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4187,13 +4298,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.NFS.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4208,13 +4319,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ISCSI.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4229,13 +4340,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Glusterfs.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4250,13 +4361,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PersistentVolumeClaim.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4271,13 +4382,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.RBD.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4292,13 +4403,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FlexVolume.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4313,13 +4424,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Cinder.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4334,13 +4445,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.CephFS.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4355,13 +4466,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Flocker.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4376,13 +4487,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.DownwardAPI.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4397,13 +4508,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.FC.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4418,13 +4529,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureFile.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4439,13 +4550,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.ConfigMap.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4460,13 +4571,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.VsphereVolume.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4481,13 +4592,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Quobyte.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4502,13 +4613,13 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.AzureDisk.CodecDecodeSelf(d) } - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l } else { - yyb27 = r.CheckBreak() + yyb28 = r.CheckBreak() } - if yyb27 { + if yyb28 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -4523,18 +4634,39 @@ func (x *VolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.PhotonPersistentDisk.CodecDecodeSelf(d) } - for { - yyj27++ - if yyhl27 { - yyb27 = yyj27 > l - } else { - yyb27 = r.CheckBreak() + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l + } else { + yyb28 = r.CheckBreak() + } + if yyb28 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.Projected != nil { + x.Projected = nil } - if yyb27 { + } else { + if x.Projected == nil { + x.Projected = new(ProjectedVolumeSource) + } + x.Projected.CodecDecodeSelf(d) + } + for { + yyj28++ + if yyhl28 { + yyb28 = yyj28 > l + } else { + yyb28 = r.CheckBreak() + } + if yyb28 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj27-1, "") + z.DecStructFieldNotFound(yyj28-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -14532,6 +14664,333 @@ func (x *SecretVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decode z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *SecretProjection) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Name != "" + yyq2[1] = len(x.Items) != 0 + yyq2[2] = x.Optional != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.Items == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + h.encSliceKeyToPath(([]KeyToPath)(x.Items), e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + h.encSliceKeyToPath(([]KeyToPath)(x.Items), e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.Optional == nil { + r.EncodeNil() + } else { + yy10 := *x.Optional + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeBool(bool(yy10)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("optional")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Optional == nil { + r.EncodeNil() + } else { + yy12 := *x.Optional + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeBool(bool(yy12)) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *SecretProjection) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *SecretProjection) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv4 := &x.Name + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv6 := &x.Items + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + h.decSliceKeyToPath((*[]KeyToPath)(yyv6), d) + } + } + case "optional": + if r.TryDecodeAsNil() { + if x.Optional != nil { + x.Optional = nil + } + } else { + if x.Optional == nil { + x.Optional = new(bool) + } + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*bool)(x.Optional)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *SecretProjection) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv11 := &x.Name + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv13 := &x.Items + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + h.decSliceKeyToPath((*[]KeyToPath)(yyv13), d) + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.Optional != nil { + x.Optional = nil + } + } else { + if x.Optional == nil { + x.Optional = new(bool) + } + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*bool)(x.Optional)) = r.DecodeBool() + } + } + for { + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj10-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *NFSVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -17340,6 +17799,882 @@ func (x *ConfigMapVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Dec z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *ConfigMapProjection) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Name != "" + yyq2[1] = len(x.Items) != 0 + yyq2[2] = x.Optional != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.Items == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + h.encSliceKeyToPath(([]KeyToPath)(x.Items), e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + h.encSliceKeyToPath(([]KeyToPath)(x.Items), e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.Optional == nil { + r.EncodeNil() + } else { + yy10 := *x.Optional + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeBool(bool(yy10)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("optional")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Optional == nil { + r.EncodeNil() + } else { + yy12 := *x.Optional + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeBool(bool(yy12)) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ConfigMapProjection) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ConfigMapProjection) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv4 := &x.Name + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv6 := &x.Items + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + h.decSliceKeyToPath((*[]KeyToPath)(yyv6), d) + } + } + case "optional": + if r.TryDecodeAsNil() { + if x.Optional != nil { + x.Optional = nil + } + } else { + if x.Optional == nil { + x.Optional = new(bool) + } + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*bool)(x.Optional)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ConfigMapProjection) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv11 := &x.Name + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv13 := &x.Items + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + h.decSliceKeyToPath((*[]KeyToPath)(yyv13), d) + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.Optional != nil { + x.Optional = nil + } + } else { + if x.Optional == nil { + x.Optional = new(bool) + } + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*bool)(x.Optional)) = r.DecodeBool() + } + } + for { + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj10-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ProjectedVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[1] = x.DefaultMode != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Sources == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSliceVolumeProjection(([]VolumeProjection)(x.Sources), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("sources")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Sources == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSliceVolumeProjection(([]VolumeProjection)(x.Sources), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.DefaultMode == nil { + r.EncodeNil() + } else { + yy7 := *x.DefaultMode + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeInt(int64(yy7)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("defaultMode")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.DefaultMode == nil { + r.EncodeNil() + } else { + yy9 := *x.DefaultMode + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeInt(int64(yy9)) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ProjectedVolumeSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ProjectedVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "sources": + if r.TryDecodeAsNil() { + x.Sources = nil + } else { + yyv4 := &x.Sources + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSliceVolumeProjection((*[]VolumeProjection)(yyv4), d) + } + } + case "defaultMode": + if r.TryDecodeAsNil() { + if x.DefaultMode != nil { + x.DefaultMode = nil + } + } else { + if x.DefaultMode == nil { + x.DefaultMode = new(int32) + } + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*int32)(x.DefaultMode)) = int32(r.DecodeInt(32)) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ProjectedVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Sources = nil + } else { + yyv9 := &x.Sources + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + h.decSliceVolumeProjection((*[]VolumeProjection)(yyv9), d) + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.DefaultMode != nil { + x.DefaultMode = nil + } + } else { + if x.DefaultMode == nil { + x.DefaultMode = new(int32) + } + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*int32)(x.DefaultMode)) = int32(r.DecodeInt(32)) + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *VolumeProjection) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Secret != nil + yyq2[1] = x.DownwardAPI != nil + yyq2[2] = x.ConfigMap != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + if x.Secret == nil { + r.EncodeNil() + } else { + x.Secret.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secret")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Secret == nil { + r.EncodeNil() + } else { + x.Secret.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.DownwardAPI == nil { + r.EncodeNil() + } else { + x.DownwardAPI.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("downwardAPI")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.DownwardAPI == nil { + r.EncodeNil() + } else { + x.DownwardAPI.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.ConfigMap == nil { + r.EncodeNil() + } else { + x.ConfigMap.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("configMap")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ConfigMap == nil { + r.EncodeNil() + } else { + x.ConfigMap.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *VolumeProjection) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *VolumeProjection) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "secret": + if r.TryDecodeAsNil() { + if x.Secret != nil { + x.Secret = nil + } + } else { + if x.Secret == nil { + x.Secret = new(SecretProjection) + } + x.Secret.CodecDecodeSelf(d) + } + case "downwardAPI": + if r.TryDecodeAsNil() { + if x.DownwardAPI != nil { + x.DownwardAPI = nil + } + } else { + if x.DownwardAPI == nil { + x.DownwardAPI = new(DownwardAPIProjection) + } + x.DownwardAPI.CodecDecodeSelf(d) + } + case "configMap": + if r.TryDecodeAsNil() { + if x.ConfigMap != nil { + x.ConfigMap = nil + } + } else { + if x.ConfigMap == nil { + x.ConfigMap = new(ConfigMapProjection) + } + x.ConfigMap.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *VolumeProjection) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj7 int + var yyb7 bool + var yyhl7 bool = l >= 0 + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.Secret != nil { + x.Secret = nil + } + } else { + if x.Secret == nil { + x.Secret = new(SecretProjection) + } + x.Secret.CodecDecodeSelf(d) + } + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.DownwardAPI != nil { + x.DownwardAPI = nil + } + } else { + if x.DownwardAPI == nil { + x.DownwardAPI = new(DownwardAPIProjection) + } + x.DownwardAPI.CodecDecodeSelf(d) + } + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ConfigMap != nil { + x.ConfigMap = nil + } + } else { + if x.ConfigMap == nil { + x.ConfigMap = new(ConfigMapProjection) + } + x.ConfigMap.CodecDecodeSelf(d) + } + for { + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj7-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *KeyToPath) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -62001,6 +63336,195 @@ func (x *DownwardAPIVolumeFile) codecDecodeSelfFromArray(l int, d *codec1978.Dec z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *DownwardAPIProjection) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = len(x.Items) != 0 + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + if x.Items == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSliceDownwardAPIVolumeFile(([]DownwardAPIVolumeFile)(x.Items), e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSliceDownwardAPIVolumeFile(([]DownwardAPIVolumeFile)(x.Items), e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *DownwardAPIProjection) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *DownwardAPIProjection) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv4 := &x.Items + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSliceDownwardAPIVolumeFile((*[]DownwardAPIVolumeFile)(yyv4), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *DownwardAPIProjection) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv7 := &x.Items + yym8 := z.DecBinary() + _ = yym8 + if false { + } else { + h.decSliceDownwardAPIVolumeFile((*[]DownwardAPIVolumeFile)(yyv7), d) + } + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *SecurityContext) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -63941,6 +65465,125 @@ func (x codecSelfer1234) decSliceKeyToPath(v *[]KeyToPath, d *codec1978.Decoder) } } +func (x codecSelfer1234) encSliceVolumeProjection(v []VolumeProjection, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceVolumeProjection(v *[]VolumeProjection, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []VolumeProjection{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 24) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]VolumeProjection, yyrl1) + } + } else { + yyv1 = make([]VolumeProjection, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = VolumeProjection{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, VolumeProjection{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = VolumeProjection{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, VolumeProjection{}) // var yyz1 VolumeProjection + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = VolumeProjection{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []VolumeProjection{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + func (x codecSelfer1234) encSliceHTTPHeader(v []HTTPHeader, e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -65283,7 +66926,7 @@ func (x codecSelfer1234) decSliceVolume(v *[]Volume, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 200) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 208) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index 222091727af..e237915f904 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -209,6 +209,16 @@ func (ConfigMapList) SwaggerDoc() map[string]string { return map_ConfigMapList } +var map_ConfigMapProjection = map[string]string{ + "": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "items": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "optional": "Specify whether the ConfigMap or it's keys must be defined", +} + +func (ConfigMapProjection) SwaggerDoc() map[string]string { + return map_ConfigMapProjection +} + var map_ConfigMapVolumeSource = map[string]string{ "": "Adapts a ConfigMap into a volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.", "items": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", @@ -352,6 +362,15 @@ func (DeleteOptions) SwaggerDoc() map[string]string { return map_DeleteOptions } +var map_DownwardAPIProjection = map[string]string{ + "": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "items": "Items is a list of DownwardAPIVolume file", +} + +func (DownwardAPIProjection) SwaggerDoc() map[string]string { + return map_DownwardAPIProjection +} + var map_DownwardAPIVolumeFile = map[string]string{ "": "DownwardAPIVolumeFile represents information to create the file containing the pod field", "path": "Required: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..'", @@ -1420,6 +1439,16 @@ func (Probe) SwaggerDoc() map[string]string { return map_Probe } +var map_ProjectedVolumeSource = map[string]string{ + "": "Represents a projected volume source", + "sources": "list of volume projections", + "defaultMode": "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", +} + +func (ProjectedVolumeSource) SwaggerDoc() map[string]string { + return map_ProjectedVolumeSource +} + var map_QuobyteVolumeSource = map[string]string{ "": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", "registry": "Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes", @@ -1635,6 +1664,16 @@ func (SecretList) SwaggerDoc() map[string]string { return map_SecretList } +var map_SecretProjection = map[string]string{ + "": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "items": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "optional": "Specify whether the Secret or its key must be defined", +} + +func (SecretProjection) SwaggerDoc() map[string]string { + return map_SecretProjection +} + var map_SecretVolumeSource = map[string]string{ "": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", "secretName": "Name of the secret in the pod's namespace to use. More info: http://kubernetes.io/docs/user-guide/volumes#secrets", @@ -1817,6 +1856,17 @@ func (VolumeMount) SwaggerDoc() map[string]string { return map_VolumeMount } +var map_VolumeProjection = map[string]string{ + "": "Projection that may be projected along with other supported volume types", + "secret": "information about the secret data to project", + "downwardAPI": "information about the downwardAPI data to project", + "configMap": "information about the configMap data to project", +} + +func (VolumeProjection) SwaggerDoc() map[string]string { + return map_VolumeProjection +} + var map_VolumeSource = map[string]string{ "": "Represents the source of a volume to mount. Only one of its members may be specified.", "hostPath": "HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: http://kubernetes.io/docs/user-guide/volumes#hostpath", @@ -1842,6 +1892,7 @@ var map_VolumeSource = map[string]string{ "quobyte": "Quobyte represents a Quobyte mount on the host that shares a pod's lifetime", "azureDisk": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.", "photonPersistentDisk": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine", + "projected": "Items for all in one resources secrets, configmaps, and downward API", } func (VolumeSource) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index dc2c4da228b..409514b6877 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -71,6 +71,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_ConfigMapKeySelector_To_v1_ConfigMapKeySelector, Convert_v1_ConfigMapList_To_api_ConfigMapList, Convert_api_ConfigMapList_To_v1_ConfigMapList, + Convert_v1_ConfigMapProjection_To_api_ConfigMapProjection, + Convert_api_ConfigMapProjection_To_v1_ConfigMapProjection, Convert_v1_ConfigMapVolumeSource_To_api_ConfigMapVolumeSource, Convert_api_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource, Convert_v1_Container_To_api_Container, @@ -93,6 +95,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_DaemonEndpoint_To_v1_DaemonEndpoint, Convert_v1_DeleteOptions_To_api_DeleteOptions, Convert_api_DeleteOptions_To_v1_DeleteOptions, + Convert_v1_DownwardAPIProjection_To_api_DownwardAPIProjection, + Convert_api_DownwardAPIProjection_To_v1_DownwardAPIProjection, Convert_v1_DownwardAPIVolumeFile_To_api_DownwardAPIVolumeFile, Convert_api_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile, Convert_v1_DownwardAPIVolumeSource_To_api_DownwardAPIVolumeSource, @@ -279,6 +283,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm, Convert_v1_Probe_To_api_Probe, Convert_api_Probe_To_v1_Probe, + Convert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource, + Convert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource, Convert_v1_QuobyteVolumeSource_To_api_QuobyteVolumeSource, Convert_api_QuobyteVolumeSource_To_v1_QuobyteVolumeSource, Convert_v1_RBDVolumeSource_To_api_RBDVolumeSource, @@ -317,6 +323,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_SecretKeySelector_To_v1_SecretKeySelector, Convert_v1_SecretList_To_api_SecretList, Convert_api_SecretList_To_v1_SecretList, + Convert_v1_SecretProjection_To_api_SecretProjection, + Convert_api_SecretProjection_To_v1_SecretProjection, Convert_v1_SecretVolumeSource_To_api_SecretVolumeSource, Convert_api_SecretVolumeSource_To_v1_SecretVolumeSource, Convert_v1_SecurityContext_To_api_SecurityContext, @@ -351,6 +359,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_Volume_To_v1_Volume, Convert_v1_VolumeMount_To_api_VolumeMount, Convert_api_VolumeMount_To_v1_VolumeMount, + Convert_v1_VolumeProjection_To_api_VolumeProjection, + Convert_api_VolumeProjection_To_v1_VolumeProjection, Convert_v1_VolumeSource_To_api_VolumeSource, Convert_api_VolumeSource_To_v1_VolumeSource, Convert_v1_VsphereVirtualDiskVolumeSource_To_api_VsphereVirtualDiskVolumeSource, @@ -740,6 +750,32 @@ func Convert_api_ConfigMapList_To_v1_ConfigMapList(in *api.ConfigMapList, out *C return autoConvert_api_ConfigMapList_To_v1_ConfigMapList(in, out, s) } +func autoConvert_v1_ConfigMapProjection_To_api_ConfigMapProjection(in *ConfigMapProjection, out *api.ConfigMapProjection, s conversion.Scope) error { + if err := Convert_v1_LocalObjectReference_To_api_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { + return err + } + out.Items = *(*[]api.KeyToPath)(unsafe.Pointer(&in.Items)) + out.Optional = (*bool)(unsafe.Pointer(in.Optional)) + return nil +} + +func Convert_v1_ConfigMapProjection_To_api_ConfigMapProjection(in *ConfigMapProjection, out *api.ConfigMapProjection, s conversion.Scope) error { + return autoConvert_v1_ConfigMapProjection_To_api_ConfigMapProjection(in, out, s) +} + +func autoConvert_api_ConfigMapProjection_To_v1_ConfigMapProjection(in *api.ConfigMapProjection, out *ConfigMapProjection, s conversion.Scope) error { + if err := Convert_api_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { + return err + } + out.Items = *(*[]KeyToPath)(unsafe.Pointer(&in.Items)) + out.Optional = (*bool)(unsafe.Pointer(in.Optional)) + return nil +} + +func Convert_api_ConfigMapProjection_To_v1_ConfigMapProjection(in *api.ConfigMapProjection, out *ConfigMapProjection, s conversion.Scope) error { + return autoConvert_api_ConfigMapProjection_To_v1_ConfigMapProjection(in, out, s) +} + func autoConvert_v1_ConfigMapVolumeSource_To_api_ConfigMapVolumeSource(in *ConfigMapVolumeSource, out *api.ConfigMapVolumeSource, s conversion.Scope) error { if err := Convert_v1_LocalObjectReference_To_api_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { return err @@ -1044,6 +1080,24 @@ func Convert_api_DeleteOptions_To_v1_DeleteOptions(in *api.DeleteOptions, out *D return autoConvert_api_DeleteOptions_To_v1_DeleteOptions(in, out, s) } +func autoConvert_v1_DownwardAPIProjection_To_api_DownwardAPIProjection(in *DownwardAPIProjection, out *api.DownwardAPIProjection, s conversion.Scope) error { + out.Items = *(*[]api.DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items)) + return nil +} + +func Convert_v1_DownwardAPIProjection_To_api_DownwardAPIProjection(in *DownwardAPIProjection, out *api.DownwardAPIProjection, s conversion.Scope) error { + return autoConvert_v1_DownwardAPIProjection_To_api_DownwardAPIProjection(in, out, s) +} + +func autoConvert_api_DownwardAPIProjection_To_v1_DownwardAPIProjection(in *api.DownwardAPIProjection, out *DownwardAPIProjection, s conversion.Scope) error { + out.Items = *(*[]DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items)) + return nil +} + +func Convert_api_DownwardAPIProjection_To_v1_DownwardAPIProjection(in *api.DownwardAPIProjection, out *DownwardAPIProjection, s conversion.Scope) error { + return autoConvert_api_DownwardAPIProjection_To_v1_DownwardAPIProjection(in, out, s) +} + func autoConvert_v1_DownwardAPIVolumeFile_To_api_DownwardAPIVolumeFile(in *DownwardAPIVolumeFile, out *api.DownwardAPIVolumeFile, s conversion.Scope) error { out.Path = in.Path out.FieldRef = (*api.ObjectFieldSelector)(unsafe.Pointer(in.FieldRef)) @@ -3381,6 +3435,26 @@ func Convert_api_Probe_To_v1_Probe(in *api.Probe, out *Probe, s conversion.Scope return autoConvert_api_Probe_To_v1_Probe(in, out, s) } +func autoConvert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource(in *ProjectedVolumeSource, out *api.ProjectedVolumeSource, s conversion.Scope) error { + out.Sources = *(*[]api.VolumeProjection)(unsafe.Pointer(&in.Sources)) + out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode)) + return nil +} + +func Convert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource(in *ProjectedVolumeSource, out *api.ProjectedVolumeSource, s conversion.Scope) error { + return autoConvert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource(in, out, s) +} + +func autoConvert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *api.ProjectedVolumeSource, out *ProjectedVolumeSource, s conversion.Scope) error { + out.Sources = *(*[]VolumeProjection)(unsafe.Pointer(&in.Sources)) + out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode)) + return nil +} + +func Convert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *api.ProjectedVolumeSource, out *ProjectedVolumeSource, s conversion.Scope) error { + return autoConvert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in, out, s) +} + func autoConvert_v1_QuobyteVolumeSource_To_api_QuobyteVolumeSource(in *QuobyteVolumeSource, out *api.QuobyteVolumeSource, s conversion.Scope) error { out.Registry = in.Registry out.Volume = in.Volume @@ -3886,6 +3960,32 @@ func Convert_api_SecretList_To_v1_SecretList(in *api.SecretList, out *SecretList return autoConvert_api_SecretList_To_v1_SecretList(in, out, s) } +func autoConvert_v1_SecretProjection_To_api_SecretProjection(in *SecretProjection, out *api.SecretProjection, s conversion.Scope) error { + if err := Convert_v1_LocalObjectReference_To_api_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { + return err + } + out.Items = *(*[]api.KeyToPath)(unsafe.Pointer(&in.Items)) + out.Optional = (*bool)(unsafe.Pointer(in.Optional)) + return nil +} + +func Convert_v1_SecretProjection_To_api_SecretProjection(in *SecretProjection, out *api.SecretProjection, s conversion.Scope) error { + return autoConvert_v1_SecretProjection_To_api_SecretProjection(in, out, s) +} + +func autoConvert_api_SecretProjection_To_v1_SecretProjection(in *api.SecretProjection, out *SecretProjection, s conversion.Scope) error { + if err := Convert_api_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { + return err + } + out.Items = *(*[]KeyToPath)(unsafe.Pointer(&in.Items)) + out.Optional = (*bool)(unsafe.Pointer(in.Optional)) + return nil +} + +func Convert_api_SecretProjection_To_v1_SecretProjection(in *api.SecretProjection, out *SecretProjection, s conversion.Scope) error { + return autoConvert_api_SecretProjection_To_v1_SecretProjection(in, out, s) +} + func autoConvert_v1_SecretVolumeSource_To_api_SecretVolumeSource(in *SecretVolumeSource, out *api.SecretVolumeSource, s conversion.Scope) error { out.SecretName = in.SecretName out.Items = *(*[]api.KeyToPath)(unsafe.Pointer(&in.Items)) @@ -4303,6 +4403,28 @@ func Convert_api_VolumeMount_To_v1_VolumeMount(in *api.VolumeMount, out *VolumeM return autoConvert_api_VolumeMount_To_v1_VolumeMount(in, out, s) } +func autoConvert_v1_VolumeProjection_To_api_VolumeProjection(in *VolumeProjection, out *api.VolumeProjection, s conversion.Scope) error { + out.Secret = (*api.SecretProjection)(unsafe.Pointer(in.Secret)) + out.DownwardAPI = (*api.DownwardAPIProjection)(unsafe.Pointer(in.DownwardAPI)) + out.ConfigMap = (*api.ConfigMapProjection)(unsafe.Pointer(in.ConfigMap)) + return nil +} + +func Convert_v1_VolumeProjection_To_api_VolumeProjection(in *VolumeProjection, out *api.VolumeProjection, s conversion.Scope) error { + return autoConvert_v1_VolumeProjection_To_api_VolumeProjection(in, out, s) +} + +func autoConvert_api_VolumeProjection_To_v1_VolumeProjection(in *api.VolumeProjection, out *VolumeProjection, s conversion.Scope) error { + out.Secret = (*SecretProjection)(unsafe.Pointer(in.Secret)) + out.DownwardAPI = (*DownwardAPIProjection)(unsafe.Pointer(in.DownwardAPI)) + out.ConfigMap = (*ConfigMapProjection)(unsafe.Pointer(in.ConfigMap)) + return nil +} + +func Convert_api_VolumeProjection_To_v1_VolumeProjection(in *api.VolumeProjection, out *VolumeProjection, s conversion.Scope) error { + return autoConvert_api_VolumeProjection_To_v1_VolumeProjection(in, out, s) +} + func autoConvert_v1_VolumeSource_To_api_VolumeSource(in *VolumeSource, out *api.VolumeSource, s conversion.Scope) error { out.HostPath = (*api.HostPathVolumeSource)(unsafe.Pointer(in.HostPath)) out.EmptyDir = (*api.EmptyDirVolumeSource)(unsafe.Pointer(in.EmptyDir)) @@ -4327,6 +4449,7 @@ func autoConvert_v1_VolumeSource_To_api_VolumeSource(in *VolumeSource, out *api. out.Quobyte = (*api.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte)) out.AzureDisk = (*api.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*api.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) + out.Projected = (*api.ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) return nil } @@ -4358,6 +4481,7 @@ func autoConvert_api_VolumeSource_To_v1_VolumeSource(in *api.VolumeSource, out * out.VsphereVolume = (*VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume)) out.AzureDisk = (*AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) + out.Projected = (*ProjectedVolumeSource)(unsafe.Pointer(in.Projected)) return nil } diff --git a/pkg/api/v1/zz_generated.deepcopy.go b/pkg/api/v1/zz_generated.deepcopy.go index dbf76beb571..4d0a1996cf6 100644 --- a/pkg/api/v1/zz_generated.deepcopy.go +++ b/pkg/api/v1/zz_generated.deepcopy.go @@ -53,6 +53,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ConfigMapEnvSource, InType: reflect.TypeOf(&ConfigMapEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ConfigMapKeySelector, InType: reflect.TypeOf(&ConfigMapKeySelector{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ConfigMapList, InType: reflect.TypeOf(&ConfigMapList{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ConfigMapProjection, InType: reflect.TypeOf(&ConfigMapProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ConfigMapVolumeSource, InType: reflect.TypeOf(&ConfigMapVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Container, InType: reflect.TypeOf(&Container{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ContainerImage, InType: reflect.TypeOf(&ContainerImage{})}, @@ -64,6 +65,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ContainerStatus, InType: reflect.TypeOf(&ContainerStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_DaemonEndpoint, InType: reflect.TypeOf(&DaemonEndpoint{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_DeleteOptions, InType: reflect.TypeOf(&DeleteOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_DownwardAPIProjection, InType: reflect.TypeOf(&DownwardAPIProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_DownwardAPIVolumeFile, InType: reflect.TypeOf(&DownwardAPIVolumeFile{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_DownwardAPIVolumeSource, InType: reflect.TypeOf(&DownwardAPIVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_EmptyDirVolumeSource, InType: reflect.TypeOf(&EmptyDirVolumeSource{})}, @@ -157,6 +159,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_PreferAvoidPodsEntry, InType: reflect.TypeOf(&PreferAvoidPodsEntry{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_PreferredSchedulingTerm, InType: reflect.TypeOf(&PreferredSchedulingTerm{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Probe, InType: reflect.TypeOf(&Probe{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_ProjectedVolumeSource, InType: reflect.TypeOf(&ProjectedVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_QuobyteVolumeSource, InType: reflect.TypeOf(&QuobyteVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_RBDVolumeSource, InType: reflect.TypeOf(&RBDVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_RangeAllocation, InType: reflect.TypeOf(&RangeAllocation{})}, @@ -176,6 +179,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretList, InType: reflect.TypeOf(&SecretList{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretProjection, InType: reflect.TypeOf(&SecretProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecretVolumeSource, InType: reflect.TypeOf(&SecretVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SecurityContext, InType: reflect.TypeOf(&SecurityContext{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_SerializedReference, InType: reflect.TypeOf(&SerializedReference{})}, @@ -193,6 +197,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Toleration, InType: reflect.TypeOf(&Toleration{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_Volume, InType: reflect.TypeOf(&Volume{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_VolumeMount, InType: reflect.TypeOf(&VolumeMount{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_VolumeProjection, InType: reflect.TypeOf(&VolumeProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_VolumeSource, InType: reflect.TypeOf(&VolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_VsphereVirtualDiskVolumeSource, InType: reflect.TypeOf(&VsphereVirtualDiskVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_WeightedPodAffinityTerm, InType: reflect.TypeOf(&WeightedPodAffinityTerm{})}, @@ -472,6 +477,29 @@ func DeepCopy_v1_ConfigMapList(in interface{}, out interface{}, c *conversion.Cl } } +func DeepCopy_v1_ConfigMapProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ConfigMapProjection) + out := out.(*ConfigMapProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]KeyToPath, len(*in)) + for i := range *in { + if err := DeepCopy_v1_KeyToPath(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return nil + } +} + func DeepCopy_v1_ConfigMapVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*ConfigMapVolumeSource) @@ -709,6 +737,24 @@ func DeepCopy_v1_DeleteOptions(in interface{}, out interface{}, c *conversion.Cl } } +func DeepCopy_v1_DownwardAPIProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*DownwardAPIProjection) + out := out.(*DownwardAPIProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DownwardAPIVolumeFile, len(*in)) + for i := range *in { + if err := DeepCopy_v1_DownwardAPIVolumeFile(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + return nil + } +} + func DeepCopy_v1_DownwardAPIVolumeFile(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*DownwardAPIVolumeFile) @@ -2492,6 +2538,29 @@ func DeepCopy_v1_Probe(in interface{}, out interface{}, c *conversion.Cloner) er } } +func DeepCopy_v1_ProjectedVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ProjectedVolumeSource) + out := out.(*ProjectedVolumeSource) + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]VolumeProjection, len(*in)) + for i := range *in { + if err := DeepCopy_v1_VolumeProjection(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.DefaultMode != nil { + in, out := &in.DefaultMode, &out.DefaultMode + *out = new(int32) + **out = **in + } + return nil + } +} + func DeepCopy_v1_QuobyteVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*QuobyteVolumeSource) @@ -2835,6 +2904,29 @@ func DeepCopy_v1_SecretList(in interface{}, out interface{}, c *conversion.Clone } } +func DeepCopy_v1_SecretProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*SecretProjection) + out := out.(*SecretProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]KeyToPath, len(*in)) + for i := range *in { + if err := DeepCopy_v1_KeyToPath(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return nil + } +} + func DeepCopy_v1_SecretVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*SecretVolumeSource) @@ -3127,6 +3219,36 @@ func DeepCopy_v1_VolumeMount(in interface{}, out interface{}, c *conversion.Clon } } +func DeepCopy_v1_VolumeProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*VolumeProjection) + out := out.(*VolumeProjection) + *out = *in + if in.Secret != nil { + in, out := &in.Secret, &out.Secret + *out = new(SecretProjection) + if err := DeepCopy_v1_SecretProjection(*in, *out, c); err != nil { + return err + } + } + if in.DownwardAPI != nil { + in, out := &in.DownwardAPI, &out.DownwardAPI + *out = new(DownwardAPIProjection) + if err := DeepCopy_v1_DownwardAPIProjection(*in, *out, c); err != nil { + return err + } + } + if in.ConfigMap != nil { + in, out := &in.ConfigMap, &out.ConfigMap + *out = new(ConfigMapProjection) + if err := DeepCopy_v1_ConfigMapProjection(*in, *out, c); err != nil { + return err + } + } + return nil + } +} + func DeepCopy_v1_VolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*VolumeSource) @@ -3265,6 +3387,13 @@ func DeepCopy_v1_VolumeSource(in interface{}, out interface{}, c *conversion.Clo *out = new(PhotonPersistentDiskVolumeSource) **out = **in } + if in.Projected != nil { + in, out := &in.Projected, &out.Projected + *out = new(ProjectedVolumeSource) + if err := DeepCopy_v1_ProjectedVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/pkg/api/v1/zz_generated.defaults.go b/pkg/api/v1/zz_generated.defaults.go index 97960127aa7..981734f1902 100644 --- a/pkg/api/v1/zz_generated.defaults.go +++ b/pkg/api/v1/zz_generated.defaults.go @@ -190,6 +190,20 @@ func SetObjectDefaults_Pod(in *Pod) { if a.VolumeSource.AzureDisk != nil { SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.InitContainers { a := &in.Spec.InitContainers[i] @@ -321,6 +335,20 @@ func SetObjectDefaults_PodTemplate(in *PodTemplate) { if a.VolumeSource.AzureDisk != nil { SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Template.Spec.InitContainers { a := &in.Template.Spec.InitContainers[i] @@ -446,6 +474,20 @@ func SetObjectDefaults_ReplicationController(in *ReplicationController) { if a.VolumeSource.AzureDisk != nil { SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index aca03380219..f677111be51 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -55,6 +55,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConfigMapEnvSource, InType: reflect.TypeOf(&ConfigMapEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConfigMapKeySelector, InType: reflect.TypeOf(&ConfigMapKeySelector{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConfigMapList, InType: reflect.TypeOf(&ConfigMapList{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConfigMapProjection, InType: reflect.TypeOf(&ConfigMapProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConfigMapVolumeSource, InType: reflect.TypeOf(&ConfigMapVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Container, InType: reflect.TypeOf(&Container{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ContainerImage, InType: reflect.TypeOf(&ContainerImage{})}, @@ -67,6 +68,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ConversionError, InType: reflect.TypeOf(&ConversionError{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_DaemonEndpoint, InType: reflect.TypeOf(&DaemonEndpoint{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_DeleteOptions, InType: reflect.TypeOf(&DeleteOptions{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_DownwardAPIProjection, InType: reflect.TypeOf(&DownwardAPIProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_DownwardAPIVolumeFile, InType: reflect.TypeOf(&DownwardAPIVolumeFile{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_DownwardAPIVolumeSource, InType: reflect.TypeOf(&DownwardAPIVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_EmptyDirVolumeSource, InType: reflect.TypeOf(&EmptyDirVolumeSource{})}, @@ -160,6 +162,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_PreferAvoidPodsEntry, InType: reflect.TypeOf(&PreferAvoidPodsEntry{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_PreferredSchedulingTerm, InType: reflect.TypeOf(&PreferredSchedulingTerm{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Probe, InType: reflect.TypeOf(&Probe{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_ProjectedVolumeSource, InType: reflect.TypeOf(&ProjectedVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_QuobyteVolumeSource, InType: reflect.TypeOf(&QuobyteVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_RBDVolumeSource, InType: reflect.TypeOf(&RBDVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_RangeAllocation, InType: reflect.TypeOf(&RangeAllocation{})}, @@ -179,6 +182,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretEnvSource, InType: reflect.TypeOf(&SecretEnvSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretKeySelector, InType: reflect.TypeOf(&SecretKeySelector{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretList, InType: reflect.TypeOf(&SecretList{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretProjection, InType: reflect.TypeOf(&SecretProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecretVolumeSource, InType: reflect.TypeOf(&SecretVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SecurityContext, InType: reflect.TypeOf(&SecurityContext{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_SerializedReference, InType: reflect.TypeOf(&SerializedReference{})}, @@ -196,6 +200,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Toleration, InType: reflect.TypeOf(&Toleration{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_Volume, InType: reflect.TypeOf(&Volume{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_VolumeMount, InType: reflect.TypeOf(&VolumeMount{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_VolumeProjection, InType: reflect.TypeOf(&VolumeProjection{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_VolumeSource, InType: reflect.TypeOf(&VolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_VsphereVirtualDiskVolumeSource, InType: reflect.TypeOf(&VsphereVirtualDiskVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_WeightedPodAffinityTerm, InType: reflect.TypeOf(&WeightedPodAffinityTerm{})}, @@ -475,6 +480,29 @@ func DeepCopy_api_ConfigMapList(in interface{}, out interface{}, c *conversion.C } } +func DeepCopy_api_ConfigMapProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ConfigMapProjection) + out := out.(*ConfigMapProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]KeyToPath, len(*in)) + for i := range *in { + if err := DeepCopy_api_KeyToPath(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return nil + } +} + func DeepCopy_api_ConfigMapVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*ConfigMapVolumeSource) @@ -737,6 +765,24 @@ func DeepCopy_api_DeleteOptions(in interface{}, out interface{}, c *conversion.C } } +func DeepCopy_api_DownwardAPIProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*DownwardAPIProjection) + out := out.(*DownwardAPIProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DownwardAPIVolumeFile, len(*in)) + for i := range *in { + if err := DeepCopy_api_DownwardAPIVolumeFile(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + return nil + } +} + func DeepCopy_api_DownwardAPIVolumeFile(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*DownwardAPIVolumeFile) @@ -2536,6 +2582,29 @@ func DeepCopy_api_Probe(in interface{}, out interface{}, c *conversion.Cloner) e } } +func DeepCopy_api_ProjectedVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*ProjectedVolumeSource) + out := out.(*ProjectedVolumeSource) + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]VolumeProjection, len(*in)) + for i := range *in { + if err := DeepCopy_api_VolumeProjection(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.DefaultMode != nil { + in, out := &in.DefaultMode, &out.DefaultMode + *out = new(int32) + **out = **in + } + return nil + } +} + func DeepCopy_api_QuobyteVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*QuobyteVolumeSource) @@ -2867,6 +2936,29 @@ func DeepCopy_api_SecretList(in interface{}, out interface{}, c *conversion.Clon } } +func DeepCopy_api_SecretProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*SecretProjection) + out := out.(*SecretProjection) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]KeyToPath, len(*in)) + for i := range *in { + if err := DeepCopy_api_KeyToPath(&(*in)[i], &(*out)[i], c); err != nil { + return err + } + } + } + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return nil + } +} + func DeepCopy_api_SecretVolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*SecretVolumeSource) @@ -3154,6 +3246,36 @@ func DeepCopy_api_VolumeMount(in interface{}, out interface{}, c *conversion.Clo } } +func DeepCopy_api_VolumeProjection(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*VolumeProjection) + out := out.(*VolumeProjection) + *out = *in + if in.Secret != nil { + in, out := &in.Secret, &out.Secret + *out = new(SecretProjection) + if err := DeepCopy_api_SecretProjection(*in, *out, c); err != nil { + return err + } + } + if in.DownwardAPI != nil { + in, out := &in.DownwardAPI, &out.DownwardAPI + *out = new(DownwardAPIProjection) + if err := DeepCopy_api_DownwardAPIProjection(*in, *out, c); err != nil { + return err + } + } + if in.ConfigMap != nil { + in, out := &in.ConfigMap, &out.ConfigMap + *out = new(ConfigMapProjection) + if err := DeepCopy_api_ConfigMapProjection(*in, *out, c); err != nil { + return err + } + } + return nil + } +} + func DeepCopy_api_VolumeSource(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*VolumeSource) @@ -3292,6 +3414,13 @@ func DeepCopy_api_VolumeSource(in interface{}, out interface{}, c *conversion.Cl *out = new(PhotonPersistentDiskVolumeSource) **out = **in } + if in.Projected != nil { + in, out := &in.Projected, &out.Projected + *out = new(ProjectedVolumeSource) + if err := DeepCopy_api_ProjectedVolumeSource(*in, *out, c); err != nil { + return err + } + } return nil } } diff --git a/pkg/apis/apps/v1beta1/zz_generated.defaults.go b/pkg/apis/apps/v1beta1/zz_generated.defaults.go index b086294795e..83faeb0ab2b 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/apps/v1beta1/zz_generated.defaults.go @@ -64,6 +64,20 @@ func SetObjectDefaults_StatefulSet(in *StatefulSet) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/batch/v1/zz_generated.defaults.go b/pkg/apis/batch/v1/zz_generated.defaults.go index b35b8638c3a..21f1d0aa2df 100644 --- a/pkg/apis/batch/v1/zz_generated.defaults.go +++ b/pkg/apis/batch/v1/zz_generated.defaults.go @@ -64,6 +64,20 @@ func SetObjectDefaults_Job(in *Job) { if a.VolumeSource.AzureDisk != nil { api_v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + api_v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + api_v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/batch/v2alpha1/zz_generated.defaults.go b/pkg/apis/batch/v2alpha1/zz_generated.defaults.go index 82f9546af0a..2a84512fb8e 100644 --- a/pkg/apis/batch/v2alpha1/zz_generated.defaults.go +++ b/pkg/apis/batch/v2alpha1/zz_generated.defaults.go @@ -67,6 +67,20 @@ func SetObjectDefaults_CronJob(in *CronJob) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.JobTemplate.Spec.Template.Spec.InitContainers { a := &in.Spec.JobTemplate.Spec.Template.Spec.InitContainers[i] @@ -191,6 +205,20 @@ func SetObjectDefaults_Job(in *Job) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -314,6 +342,20 @@ func SetObjectDefaults_JobTemplate(in *JobTemplate) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Template.Spec.Template.Spec.InitContainers { a := &in.Template.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go index d1d52f697a0..7eefc9d30b4 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go @@ -70,6 +70,20 @@ func SetObjectDefaults_DaemonSet(in *DaemonSet) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -194,6 +208,20 @@ func SetObjectDefaults_Deployment(in *Deployment) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] @@ -329,6 +357,20 @@ func SetObjectDefaults_ReplicaSet(in *ReplicaSet) { if a.VolumeSource.AzureDisk != nil { v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) } + if a.VolumeSource.Projected != nil { + v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + v1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + } + } } for i := range in.Spec.Template.Spec.InitContainers { a := &in.Spec.Template.Spec.InitContainers[i] diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index 107aa1b039d..bab308674cb 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -1039,6 +1039,44 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Dependencies: []string{ "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "k8s.io/kubernetes/pkg/api/v1.ConfigMap"}, }, + "k8s.io/kubernetes/pkg/api/v1.ConfigMapProjection": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + Type: []string{"string"}, + Format: "", + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/kubernetes/pkg/api/v1.KeyToPath"), + }, + }, + }, + }, + }, + "optional": { + SchemaProps: spec.SchemaProps{ + Description: "Specify whether the ConfigMap or it's keys must be defined", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.KeyToPath"}, + }, "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -1637,6 +1675,30 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Dependencies: []string{ "k8s.io/apimachinery/pkg/apis/meta/v1.Preconditions"}, }, + "k8s.io/kubernetes/pkg/api/v1.DownwardAPIProjection": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + Properties: map[string]spec.Schema{ + "items": { + SchemaProps: spec.SchemaProps{ + Description: "Items is a list of DownwardAPIVolume file", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeFile"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeFile"}, + }, "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeFile": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -6905,6 +6967,38 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Dependencies: []string{ "k8s.io/kubernetes/pkg/api/v1.ExecAction", "k8s.io/kubernetes/pkg/api/v1.HTTPGetAction", "k8s.io/kubernetes/pkg/api/v1.TCPSocketAction"}, }, + "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Represents a projected volume source", + Properties: map[string]spec.Schema{ + "sources": { + SchemaProps: spec.SchemaProps{ + Description: "list of volume projections", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/kubernetes/pkg/api/v1.VolumeProjection"), + }, + }, + }, + }, + }, + "defaultMode": { + SchemaProps: spec.SchemaProps{ + Description: "Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"sources"}, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.VolumeProjection"}, + }, "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -7980,6 +8074,44 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Dependencies: []string{ "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "k8s.io/kubernetes/pkg/api/v1.Secret"}, }, + "k8s.io/kubernetes/pkg/api/v1.SecretProjection": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + Type: []string{"string"}, + Format: "", + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/kubernetes/pkg/api/v1.KeyToPath"), + }, + }, + }, + }, + }, + "optional": { + SchemaProps: spec.SchemaProps{ + Description: "Specify whether the Secret or its key must be defined", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.KeyToPath"}, + }, "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -9453,12 +9585,18 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource"), }, }, + "projected": { + SchemaProps: spec.SchemaProps{ + Description: "Items for all in one resources secrets, configmaps, and downward API", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource"), + }, + }, }, Required: []string{"name"}, }, }, Dependencies: []string{ - "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.VolumeMount": { Schema: spec.Schema{ @@ -9499,6 +9637,35 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope }, Dependencies: []string{}, }, + "k8s.io/kubernetes/pkg/api/v1.VolumeProjection": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Projection that may be projected along with other supported volume types", + Properties: map[string]spec.Schema{ + "secret": { + SchemaProps: spec.SchemaProps{ + Description: "information about the secret data to project", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.SecretProjection"), + }, + }, + "downwardAPI": { + SchemaProps: spec.SchemaProps{ + Description: "information about the downwardAPI data to project", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.DownwardAPIProjection"), + }, + }, + "configMap": { + SchemaProps: spec.SchemaProps{ + Description: "information about the configMap data to project", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ConfigMapProjection"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/kubernetes/pkg/api/v1.ConfigMapProjection", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIProjection", "k8s.io/kubernetes/pkg/api/v1.SecretProjection"}, + }, "k8s.io/kubernetes/pkg/api/v1.VolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -9642,11 +9809,17 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Ref: ref("k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource"), }, }, + "projected": { + SchemaProps: spec.SchemaProps{ + Description: "Items for all in one resources secrets, configmaps, and downward API", + Ref: ref("k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/kubernetes/pkg/api/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.AzureFileVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CephFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.CinderVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ConfigMapVolumeSource", "k8s.io/kubernetes/pkg/api/v1.DownwardAPIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.EmptyDirVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FCVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlexVolumeSource", "k8s.io/kubernetes/pkg/api/v1.FlockerVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GCEPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GitRepoVolumeSource", "k8s.io/kubernetes/pkg/api/v1.GlusterfsVolumeSource", "k8s.io/kubernetes/pkg/api/v1.HostPathVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ISCSIVolumeSource", "k8s.io/kubernetes/pkg/api/v1.NFSVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PersistentVolumeClaimVolumeSource", "k8s.io/kubernetes/pkg/api/v1.PhotonPersistentDiskVolumeSource", "k8s.io/kubernetes/pkg/api/v1.ProjectedVolumeSource", "k8s.io/kubernetes/pkg/api/v1.QuobyteVolumeSource", "k8s.io/kubernetes/pkg/api/v1.RBDVolumeSource", "k8s.io/kubernetes/pkg/api/v1.SecretVolumeSource", "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/kubernetes/pkg/api/v1.VsphereVirtualDiskVolumeSource": { Schema: spec.Schema{ diff --git a/pkg/volume/BUILD b/pkg/volume/BUILD index 9b114c49f19..11fd1df09be 100644 --- a/pkg/volume/BUILD +++ b/pkg/volume/BUILD @@ -107,6 +107,7 @@ filegroup( "//pkg/volume/iscsi:all-srcs", "//pkg/volume/nfs:all-srcs", "//pkg/volume/photon_pd:all-srcs", + "//pkg/volume/projected:all-srcs", "//pkg/volume/quobyte:all-srcs", "//pkg/volume/rbd:all-srcs", "//pkg/volume/secret:all-srcs", diff --git a/pkg/volume/projected/BUILD b/pkg/volume/projected/BUILD new file mode 100644 index 00000000000..ae485d71031 --- /dev/null +++ b/pkg/volume/projected/BUILD @@ -0,0 +1,60 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["projected_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//pkg/api/v1:go_default_library", + "//pkg/client/clientset_generated/clientset:go_default_library", + "//pkg/client/clientset_generated/clientset/fake:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/empty_dir:go_default_library", + "//pkg/volume/testing:go_default_library", + "//pkg/volume/util:go_default_library", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/types", + ], +) + +go_library( + name = "go_default_library", + srcs = ["projected.go"], + tags = ["automanaged"], + deps = [ + "//pkg/api/v1:go_default_library", + "//pkg/util/strings:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/configmap:go_default_library", + "//pkg/volume/downwardapi:go_default_library", + "//pkg/volume/secret:go_default_library", + "//pkg/volume/util:go_default_library", + "//vendor:github.com/golang/glog", + "//vendor:k8s.io/apimachinery/pkg/api/errors", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/types", + "//vendor:k8s.io/apimachinery/pkg/util/errors", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/test/e2e/common/BUILD b/test/e2e/common/BUILD index 113b4c92d3b..6157baf7199 100644 --- a/test/e2e/common/BUILD +++ b/test/e2e/common/BUILD @@ -24,6 +24,7 @@ go_library( "networking.go", "pods.go", "privileged.go", + "projected.go", "secrets.go", "sysctl.go", "util.go",