diff --git a/Makefile b/Makefile index 408b71f8d..40877fb8d 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ endif REPO = github.com/operator-framework/api BUILD_PATH = $(REPO)/cmd/operator-verify PKGS = $(shell go list ./... | grep -v /vendor/) -YQ := go run $(MOD_FLAGS) ./vendor/github.com/mikefarah/yq/v2/ +YQ := go run $(MOD_FLAGS) ./vendor/github.com/mikefarah/yq/v3/ .PHONY: help help: ## Show this help screen @@ -67,6 +67,9 @@ manifests: controller-gen ## Generate manifests e.g. CRD, RBAC etc @# Preserve fields for embedded metadata fields $(Q)$(YQ) w --inplace ./crds/operators.coreos.com_clusterserviceversions.yaml spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.metadata.x-kubernetes-preserve-unknown-fields true + @# Remove OperatorCondition.spec.overrides[*].lastTransitionTime requirement + $(Q)$(YQ) delete --inplace ./crds/operators.coreos.com_operatorconditions.yaml 'spec.versions[*].schema.openAPIV3Schema.properties.spec.properties.overrides.items.required(.==lastTransitionTime)' + @# Remove status subresource from the CRD manifests to ensure server-side apply works $(Q)for f in ./crds/*.yaml ; do $(YQ) d --inplace $$f status; done diff --git a/crds/operators.coreos.com_catalogsources.yaml b/crds/operators.coreos.com_catalogsources.yaml index 49b39f969..06d405041 100644 --- a/crds/operators.coreos.com_catalogsources.yaml +++ b/crds/operators.coreos.com_catalogsources.yaml @@ -9,190 +9,158 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: CatalogSource listKind: CatalogSourceList plural: catalogsources shortNames: - - catsrc + - catsrc singular: catalogsource scope: Namespaced versions: - - additionalPrinterColumns: - - description: The pretty name of the catalog - jsonPath: .spec.displayName - name: Display - type: string - - description: The type of the catalog - jsonPath: .spec.sourceType - name: Type - type: string - - description: The publisher of the catalog - jsonPath: .spec.publisher - name: Publisher - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: CatalogSource is a repository of CSVs, CRDs, and operator packages. - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - sourceType - properties: - address: - description: 'Address is a host that OLM can use to connect to a pre-existing - registry. Format: : Only used when SourceType - = SourceTypeGrpc. Ignored when the Image field is set.' - type: string - configMap: - description: ConfigMap is the name of the ConfigMap to be used to - back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap - or SourceTypeInternal. - type: string - description: - type: string - displayName: - description: Metadata - type: string - icon: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - image: - description: Image is an operator-registry container image to instantiate - a registry-server with. Only used when SourceType = SourceTypeGrpc. - If present, the address field is ignored. - type: string - priority: - description: 'Priority field assigns a weight to the catalog source - to prioritize them so that it can be consumed by the dependency - resolver. Usage: Higher weight indicates that this catalog source - is preferred over lower weighted catalog sources during dependency - resolution. The range of the priority value can go from positive - to negative in the range of int32. The default value to a catalog - source with unassigned priority would be 0. The catalog source with - the same priority values will be ranked lexicographically based - on its name.' - type: integer - publisher: - type: string - secrets: - description: Secrets represent set of secrets that can be used to - access the contents of the catalog. It is best to keep this list - small, since each will need to be tried for every catalog entry. - type: array - items: + - additionalPrinterColumns: + - description: The pretty name of the catalog + jsonPath: .spec.displayName + name: Display + type: string + - description: The type of the catalog + jsonPath: .spec.sourceType + name: Type + type: string + - description: The publisher of the catalog + jsonPath: .spec.publisher + name: Publisher + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: CatalogSource is a repository of CSVs, CRDs, and operator packages. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + type: object + required: + - sourceType + properties: + address: + description: 'Address is a host that OLM can use to connect to a pre-existing registry. Format: : Only used when SourceType = SourceTypeGrpc. Ignored when the Image field is set.' type: string - sourceType: - description: SourceType is the type of source - type: string - updateStrategy: - description: UpdateStrategy defines how updated catalog source images - can be discovered Consists of an interval that defines polling duration - and an embedded strategy type - type: object - properties: - registryPoll: - type: object - properties: - interval: - description: Interval is used to determine the time interval - between checks of the latest catalog source version. The - catalog operator polls to see if a new version of the catalog - source is available. If available, the latest image is pulled - and gRPC traffic is directed to the latest catalog source. - type: string - status: - type: object - properties: - configMapReference: - type: object - required: - - name - - namespace - properties: - lastUpdateTime: - type: string - format: date-time - name: - type: string - namespace: - type: string - resourceVersion: - type: string - uid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - connectionState: - type: object - required: - - lastObservedState - properties: - address: - type: string - lastConnect: - type: string - format: date-time - lastObservedState: - type: string - latestImageRegistryPoll: - description: The last time the CatalogSource image registry has been - polled to ensure the image is up-to-date - type: string - format: date-time - message: - description: A human readable message indicating details about why - the CatalogSource is in this condition. - type: string - reason: - description: Reason is the reason the CatalogSource was transitioned - to its current state. - type: string - registryService: - type: object - properties: - createdAt: - type: string - format: date-time - port: - type: string - protocol: - type: string - serviceName: - type: string - serviceNamespace: + configMap: + description: ConfigMap is the name of the ConfigMap to be used to back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap or SourceTypeInternal. + type: string + description: + type: string + displayName: + description: Metadata + type: string + icon: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + image: + description: Image is an operator-registry container image to instantiate a registry-server with. Only used when SourceType = SourceTypeGrpc. If present, the address field is ignored. + type: string + priority: + description: 'Priority field assigns a weight to the catalog source to prioritize them so that it can be consumed by the dependency resolver. Usage: Higher weight indicates that this catalog source is preferred over lower weighted catalog sources during dependency resolution. The range of the priority value can go from positive to negative in the range of int32. The default value to a catalog source with unassigned priority would be 0. The catalog source with the same priority values will be ranked lexicographically based on its name.' + type: integer + publisher: + type: string + secrets: + description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} + sourceType: + description: SourceType is the type of source + type: string + updateStrategy: + description: UpdateStrategy defines how updated catalog source images can be discovered Consists of an interval that defines polling duration and an embedded strategy type + type: object + properties: + registryPoll: + type: object + properties: + interval: + description: Interval is used to determine the time interval between checks of the latest catalog source version. The catalog operator polls to see if a new version of the catalog source is available. If available, the latest image is pulled and gRPC traffic is directed to the latest catalog source. + type: string + status: + type: object + properties: + configMapReference: + type: object + required: + - name + - namespace + properties: + lastUpdateTime: + type: string + format: date-time + name: + type: string + namespace: + type: string + resourceVersion: + type: string + uid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + connectionState: + type: object + required: + - lastObservedState + properties: + address: + type: string + lastConnect: + type: string + format: date-time + lastObservedState: + type: string + latestImageRegistryPoll: + description: The last time the CatalogSource image registry has been polled to ensure the image is up-to-date + type: string + format: date-time + message: + description: A human readable message indicating details about why the CatalogSource is in this condition. + type: string + reason: + description: Reason is the reason the CatalogSource was transitioned to its current state. + type: string + registryService: + type: object + properties: + createdAt: + type: string + format: date-time + port: + type: string + protocol: + type: string + serviceName: + type: string + serviceNamespace: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/crds/operators.coreos.com_clusterserviceversions.yaml b/crds/operators.coreos.com_clusterserviceversions.yaml index d188238ef..1e5d355ed 100644 --- a/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/crds/operators.coreos.com_clusterserviceversions.yaml @@ -9,9490 +9,4773 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: ClusterServiceVersion listKind: ClusterServiceVersionList plural: clusterserviceversions shortNames: - - csv - - csvs + - csv + - csvs singular: clusterserviceversion scope: Namespaced versions: - - additionalPrinterColumns: - - description: The name of the CSV - jsonPath: .spec.displayName - name: Display - type: string - - description: The version of the CSV - jsonPath: .spec.version - name: Version - type: string - - description: The name of a CSV that this one replaces - jsonPath: .spec.replaces - name: Replaces - type: string - - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterServiceVersionSpec declarations tell OLM how to install - an operator that can manage apps for a given version. - type: object - required: - - displayName - - install - properties: - annotations: - description: Annotations is an unstructured key value map stored with - a resource that may be set by external tools to store and retrieve - arbitrary metadata. - type: object - additionalProperties: + - additionalPrinterColumns: + - description: The name of the CSV + jsonPath: .spec.displayName + name: Display + type: string + - description: The version of the CSV + jsonPath: .spec.version + name: Version + type: string + - description: The name of a CSV that this one replaces + jsonPath: .spec.replaces + name: Replaces + type: string + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: ClusterServiceVersionSpec declarations tell OLM how to install an operator that can manage apps for a given version. + type: object + required: + - displayName + - install + properties: + annotations: + description: Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. + type: object + additionalProperties: + type: string + apiservicedefinitions: + description: APIServiceDefinitions declares all of the extension apis managed or required by an operator being ran by ClusterServiceVersion. + type: object + properties: + owned: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + customresourcedefinitions: + description: "CustomResourceDefinitions declares all of the CRDs managed or required by an operator being ran by ClusterServiceVersion. \n If the CRD is present in the Owned list, it is implicitly required." + type: object + properties: + owned: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + description: type: string - apiservicedefinitions: - description: APIServiceDefinitions declares all of the extension apis - managed or required by an operator being ran by ClusterServiceVersion. - type: object - properties: - owned: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation + displayName: + type: string + icon: + type: array + items: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + install: + description: NamedInstallStrategy represents the block of an ClusterServiceVersion resource where the install strategy is specified. + type: object + required: + - strategy + properties: + spec: + description: StrategyDetailsDeployment represents the parsed details of a Deployment InstallStrategy. type: object required: - - group - - kind - - name - - version + - deployments properties: - actionDescriptors: + clusterPermissions: type: array items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy type: object required: - - path + - rules + - serviceAccountName properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: + rules: type: array items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + deployments: type: array items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource + description: StrategyDeploymentSpec contains the name, spec and labels for the deployment ALM should create type: object required: - - kind - - name - - version + - name + - spec properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: APIServiceDescription provides details to OLM about - apis provided via aggregation - type: object - required: - - group - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - containerPort: - type: integer - format: int32 - deploymentName: - type: string - description: - type: string - displayName: - type: string - group: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - customresourcedefinitions: - description: "CustomResourceDefinitions declares all of the CRDs managed - or required by an operator being ran by ClusterServiceVersion. \n - If the CRD is present in the Owned list, it is implicitly required." - type: object - properties: - owned: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string - name: - type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - required: - type: array - items: - description: CRDDescription provides details to OLM about the - CRDs - type: object - required: - - kind - - name - - version - properties: - actionDescriptors: - type: array - items: - description: ActionDescriptor describes a declarative - action that can be performed on a custom resource instance - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: + label: + description: Set is a map of label:value. It implements Labels. + type: object + additionalProperties: type: string - description: - type: string - displayName: - type: string - kind: - type: string - name: - type: string - resources: - type: array - items: - description: APIResourceReference is a Kubernetes resource - type used by a custom resource - type: object - required: - - kind - - name - - version - properties: - kind: - type: string name: type: string - version: - type: string - specDescriptors: - type: array - items: - description: SpecDescriptor describes a field in a spec - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - statusDescriptors: - type: array - items: - description: StatusDescriptor describes a field in a status - block of a CRD so that OLM can consume it - type: object - required: - - path - properties: - description: - type: string - displayName: - type: string - path: - type: string - value: - description: RawMessage is a raw encoded JSON value. - It implements Marshaler and Unmarshaler and can - be used to delay JSON decoding or precompute a JSON - encoding. - type: string - format: byte - x-descriptors: - type: array - items: - type: string - version: - type: string - description: - type: string - displayName: - type: string - icon: - type: array - items: - type: object - required: - - base64data - - mediatype - properties: - base64data: - type: string - mediatype: - type: string - install: - description: NamedInstallStrategy represents the block of an ClusterServiceVersion - resource where the install strategy is specified. - type: object - required: - - strategy - properties: - spec: - description: StrategyDetailsDeployment represents the parsed details - of a Deployment InstallStrategy. - type: object - required: - - deployments - properties: - clusterPermissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. + spec: + description: DeploymentSpec is the specification of the desired behavior of the Deployment. type: object required: - - verbs + - selector + - template properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - deployments: - type: array - items: - description: StrategyDeploymentSpec contains the name, spec - and labels for the deployment ALM should create - type: object - required: - - name - - spec - properties: - label: - description: Set is a map of label:value. It implements - Labels. - type: object - additionalProperties: - type: string - name: - type: string - spec: - description: DeploymentSpec is the specification of - the desired behavior of the Deployment. - type: object - required: - - selector - - template - properties: - minReadySeconds: - description: Minimum number of seconds for which - a newly created pod should be ready without any - of its container crashing, for it to be considered - available. Defaults to 0 (pod will be considered - available as soon as it is ready) - type: integer - format: int32 - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment - to make progress before it is considered to be - failed. The deployment controller will continue - to process failed deployments and a condition - with a ProgressDeadlineExceeded reason will be - surfaced in the deployment status. Note that progress - will not be estimated during the time a deployment - is paused. Defaults to 600s. - type: integer - format: int32 - replicas: - description: Number of desired pods. This is a pointer - to distinguish between explicit zero and not specified. - Defaults to 1. - type: integer - format: int32 - revisionHistoryLimit: - description: The number of old ReplicaSets to retain - to allow rollback. This is a pointer to distinguish - between explicit zero and not specified. Defaults - to 10. - type: integer - format: int32 - selector: - description: Label selector for pods. Existing ReplicaSets - whose pods are selected by this will be the ones - affected by this deployment. It must match the - pod template's labels. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. + minReadySeconds: + description: Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) + type: integer + format: int32 + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. + type: integer + format: int32 + replicas: + description: Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. + type: integer + format: int32 + revisionHistoryLimit: + description: The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. + type: integer + format: int32 + selector: + description: Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + strategy: + description: The deployment strategy to use to replace existing pods with new ones. + type: object + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate. --- TODO: Update this to follow our convention for oneOf, whatever we decide it to be.' type: object - required: - - key - - operator properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - additionalProperties: + maxSurge: + description: 'The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + description: 'The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: + description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. type: string - strategy: - description: The deployment strategy to use to replace - existing pods with new ones. - type: object - properties: - rollingUpdate: - description: 'Rolling update config params. - Present only if DeploymentStrategyType = RollingUpdate. - --- TODO: Update this to follow our convention - for oneOf, whatever we decide it to be.' - type: object - properties: - maxSurge: - description: 'The maximum number of pods - that can be scheduled above the desired - number of pods. Value can be an absolute - number (ex: 5) or a percentage of desired - pods (ex: 10%). This can not be 0 if MaxUnavailable - is 0. Absolute number is calculated from - percentage by rounding up. Defaults to - 25%. Example: when this is set to 30%, - the new ReplicaSet can be scaled up immediately - when the rolling update starts, such that - the total number of old and new pods do - not exceed 130% of desired pods. Once - old pods have been killed, new ReplicaSet - can be scaled up further, ensuring that - total number of pods running at any time - during the update is at most 130% of desired - pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - maxUnavailable: - description: 'The maximum number of pods - that can be unavailable during the update. - Value can be an absolute number (ex: 5) - or a percentage of desired pods (ex: 10%). - Absolute number is calculated from percentage - by rounding down. This can not be 0 if - MaxSurge is 0. Defaults to 25%. Example: - when this is set to 30%, the old ReplicaSet - can be scaled down to 70% of desired pods - immediately when the rolling update starts. - Once new pods are ready, old ReplicaSet - can be scaled down further, followed by - scaling up the new ReplicaSet, ensuring - that the total number of pods available - at all times during the update is at least - 70% of desired pods.' - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - type: - description: Type of deployment. Can be "Recreate" - or "RollingUpdate". Default is RollingUpdate. - type: string - template: - description: Template describes the pods that will - be created. - type: object - properties: - metadata: - description: 'Standard object''s metadata. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - type: object - x-kubernetes-preserve-unknown-fields: true - spec: - description: 'Specification of the desired behavior - of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - type: object - required: - - containers - properties: - activeDeadlineSeconds: - description: Optional duration in seconds - the pod may be active on the node relative - to StartTime before the system will actively - try to mark it failed and kill associated - containers. Value must be a positive integer. - type: integer - format: int64 - affinity: - description: If specified, the pod's scheduling - constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity - scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node matches - the corresponding matchExpressions; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: An empty preferred - scheduling term matches all - objects with implicit weight - 0 (i.e. it's a no-op). A null - preferred scheduling term matches - no objects (i.e. is also a no-op). + template: + description: Template describes the pods that will be created. + type: object + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: 'Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + type: object + required: + - containers + properties: + activeDeadlineSeconds: + description: Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer. + type: integer + format: int64 + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + type: object + required: + - preference + - weight + properties: + preference: + description: A node selector term, associated with the corresponding weight. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + weight: + description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. type: object required: - - preference - - weight + - nodeSelectorTerms properties: - preference: - description: A node selector - term, associated with the - corresponding weight. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. - type: object - required: - - key - - operator - properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An - array of string - values. If the - operator is In - or NotIn, the - values array must - be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + nodeSelectorTerms: + description: Required. A list of node selector terms. The terms are ORed. + type: array + items: + description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. - type: object - required: - - key - - operator - properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An - array of string - values. If the - operator is In - or NotIn, the - values array must - be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. type: string - weight: - description: Weight associated - with matching the corresponding - nodeSelectorTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to an - update), the system may or may - not try to eventually evict the - pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list - of node selector terms. The - terms are ORed. - type: array - items: - description: A null or empty - node selector term matches - no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset - of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of - node selector requirements - by node's labels. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. - type: object - required: - - key - - operator - properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An - array of string - values. If the - operator is In - or NotIn, the - values array must - be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. - type: array - items: + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. type: string - matchFields: - description: A list of - node selector requirements - by node's fields. - type: array - items: - description: A node - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. type: object - required: - - key - - operator properties: - key: - description: The - label key that - the selector applies - to. - type: string - operator: - description: Represents - a key's relationship - to a set of values. - Valid operators - are In, NotIn, - Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An - array of string - values. If the - operator is In - or NotIn, the - values array must - be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - If the operator - is Gt or Lt, the - values array must - have a single - element, which - will be interpreted - as an integer. - This array is - replaced during - a strategic merge - patch. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: type: string - podAffinity: - description: Describes pod affinity - scheduling rules (e.g. co-locate this - pod in the same node, zone, etc. as - some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the affinity expressions - specified by this field, but it - may choose a node that violates - one or more of the expressions. - The node that is most preferred - is the one with the greatest sum - of weights, i.e. for each node - that meets all of the scheduling - requirements (resource request, - requiredDuringScheduling affinity - expressions, etc.), compute a - sum by iterating through the elements - of this field and adding "weight" - to the sum if the node has pods - which matches the corresponding - podAffinityTerm; the node(s) with - the highest sum are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions - is a list of label - selector requirements. - The requirements - are ANDed. - type: array - items: - description: A label - selector requirement - is a selector - that contains - values, a key, - and an operator - that relates the - key and values. - type: object - required: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: - key - operator - properties: - key: - description: key - is the label - key that the - selector applies - to. - type: string - operator: - description: operator - represents - a key's relationship - to a set of - values. Valid - operators - are In, NotIn, - Exists and - DoesNotExist. + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: type: string - values: - description: values - is an array - of string - values. If - the operator - is In or NotIn, - the values - array must - be non-empty. - If the operator - is Exists - or DoesNotExist, - the values - array must - be empty. - This array - is replaced - during a strategic - merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels - is a map of {key,value} - pairs. A single - {key,value} in the - matchLabels map - is equivalent to - an element of matchExpressions, - whose key field - is "key", the operator - is "In", and the - values array contains - only "value". The - requirements are - ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not - met at scheduling time, the pod - will not be scheduled onto the - node. If the affinity requirements - specified by this field cease - to be met at some point during - pod execution (e.g. due to a pod - label update), the system may - or may not try to eventually evict - the pod from its node. When there - are multiple elements, the lists - of nodes corresponding to each - podAffinityTerm are intersected, - i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions - is a list of label selector - requirements. The requirements - are ANDed. - type: array - items: - description: A label - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. type: object - required: - - key - - operator properties: - key: - description: key - is the label key - that the selector - applies to. - type: string - operator: - description: operator - represents a key's - relationship to - a set of values. - Valid operators - are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values - is an array of - string values. - If the operator - is In or NotIn, - the values array - must be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - This array is - replaced during - a strategic merge - patch. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: type: string - matchLabels: - description: matchLabels - is a map of {key,value} - pairs. A single {key,value} - in the matchLabels map - is equivalent to an - element of matchExpressions, - whose key field is "key", - the operator is "In", - and the values array - contains only "value". - The requirements are - ANDed. - type: object - additionalProperties: + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity - scheduling rules (e.g. avoid putting - this pod in the same node, zone, etc. - as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will - prefer to schedule pods to nodes - that satisfy the anti-affinity - expressions specified by this - field, but it may choose a node - that violates one or more of the - expressions. The node that is - most preferred is the one with - the greatest sum of weights, i.e. - for each node that meets all of - the scheduling requirements (resource - request, requiredDuringScheduling - anti-affinity expressions, etc.), - compute a sum by iterating through - the elements of this field and - adding "weight" to the sum if - the node has pods which matches - the corresponding podAffinityTerm; - the node(s) with the highest sum - are the most preferred. - type: array - items: - description: The weights of all - of the matched WeightedPodAffinityTerm - fields are added per-node to - find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod - affinity term, associated - with the corresponding weight. - type: object - required: + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: - topologyKey - properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions - is a list of label - selector requirements. - The requirements - are ANDed. - type: array - items: - description: A label - selector requirement - is a selector - that contains - values, a key, - and an operator - that relates the - key and values. - type: object - required: + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: - key - operator - properties: - key: - description: key - is the label - key that the - selector applies - to. - type: string - operator: - description: operator - represents - a key's relationship - to a set of - values. Valid - operators - are In, NotIn, - Exists and - DoesNotExist. + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: type: string - values: - description: values - is an array - of string - values. If - the operator - is In or NotIn, - the values - array must - be non-empty. - If the operator - is Exists - or DoesNotExist, - the values - array must - be empty. - This array - is replaced - during a strategic - merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels - is a map of {key,value} - pairs. A single - {key,value} in the - matchLabels map - is equivalent to - an element of matchExpressions, - whose key field - is "key", the operator - is "In", and the - values array contains - only "value". The - requirements are - ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces - specifies which namespaces - the labelSelector applies - to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod - should be co-located - (affinity) or not co-located - (anti-affinity) with - the pods matching the - labelSelector in the - specified namespaces, - where co-located is - defined as running on - a node whose value of - the label with key topologyKey - matches that of any - node on which any of - the selected pods is - running. Empty topologyKey - is not allowed. + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: type: string - weight: - description: weight associated - with matching the corresponding - podAffinityTerm, in the - range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity - requirements specified by this - field are not met at scheduling - time, the pod will not be scheduled - onto the node. If the anti-affinity - requirements specified by this - field cease to be met at some - point during pod execution (e.g. - due to a pod label update), the - system may or may not try to eventually - evict the pod from its node. When - there are multiple elements, the - lists of nodes corresponding to - each podAffinityTerm are intersected, - i.e. all terms must be satisfied. + topologyKey: + description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: string + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether a service account token should be automatically mounted. + type: boolean + containers: + description: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. type: array items: - description: Defines a set of - pods (namely those matching - the labelSelector relative to - the given namespace(s)) that - this pod should be co-located - (affinity) or not co-located - (anti-affinity) with, where - co-located is defined as running - on a node whose value of the - label with key - matches that of any node on - which a pod of the set of pods - is running + description: EnvVar represents an environment variable present in a Container. type: object required: - - topologyKey + - name properties: - labelSelector: - description: A label query - over a set of resources, - in this case pods. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: '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 "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. type: object properties: - matchExpressions: - description: matchExpressions - is a list of label selector - requirements. The requirements - are ANDed. - type: array - items: - description: A label - selector requirement - is a selector that - contains values, a - key, and an operator - that relates the key - and values. - type: object - required: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: - key - - operator - properties: - key: - description: key - is the label key - that the selector - applies to. - type: string - operator: - description: operator - represents a key's - relationship to - a set of values. - Valid operators - are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values - is an array of - string values. - If the operator - is In or NotIn, - the values array - must be non-empty. - If the operator - is Exists or DoesNotExist, - the values array - must be empty. - This array is - replaced during - a strategic merge - patch. - type: array - items: - type: string - matchLabels: - description: matchLabels - is a map of {key,value} - pairs. A single {key,value} - in the matchLabels map - is equivalent to an - element of matchExpressions, - whose key field is "key", - the operator is "In", - and the values array - contains only "value". - The requirements are - ANDed. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means - "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should - be co-located (affinity) - or not co-located (anti-affinity) - with the pods matching the - labelSelector in the specified - namespaces, where co-located - is defined as running on - a node whose value of the - label with key topologyKey - matches that of any node - on which any of the selected - pods is running. Empty topologyKey - is not allowed. + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - automountServiceAccountToken: - description: AutomountServiceAccountToken - indicates whether a service account token - should be automatically mounted. - type: boolean - containers: - description: List of containers belonging - to the pod. Containers cannot currently - be added or removed. There must be at - least one container in a Pod. Cannot be - updated. - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - 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. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. 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. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. type: object - required: - - name properties: - name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. - type: string - value: - description: '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 "".' - type: string - valueFrom: - description: Source for the - environment variable's value. - Cannot be used if value is - not empty. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - fieldRef: - description: 'Selects a - field of the pod: supports - metadata.name, metadata.namespace, - `metadata.labels['''']`, - `metadata.annotations['''']`, - spec.nodeName, spec.serviceAccountName, - status.hostIP, status.podIP, - status.podIPs.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, - requests.cpu, requests.memory - and requests.ephemeral-storage) - are currently supported.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - divisor: - description: Specifies - the output format - of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether - the ConfigMap must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: 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. + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: 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. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: 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. + type: integer + format: int32 + name: + description: 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. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes - the minimum amount of compute - resources required. If Requests - is omitted for a container, - it defaults to Limits if that - is explicitly specified, otherwise - to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: object - properties: - level: - description: Level is SELinux - level label that applies - to the container. - type: string - role: - description: Role is a SELinux - role label that applies - to the container. - type: string - type: - description: Type is a SELinux - type label that applies - to the container. - type: string - user: - description: User is a SELinux - user label that applies - to the container. - type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - dnsConfig: - description: Specifies the DNS parameters - of a pod. Parameters specified here will - be merged to the generated DNS configuration - based on DNSPolicy. - type: object - properties: - nameservers: - description: A list of DNS name server - IP addresses. This will be appended - to the base nameservers generated - from DNSPolicy. Duplicated nameservers - will be removed. - type: array - items: - type: string - options: - description: A list of DNS resolver - options. This will be merged with - the base options generated from DNSPolicy. - Duplicated entries will be removed. - Resolution options given in Options - will override those that appear in - the base DNSPolicy. - type: array - items: - description: PodDNSConfigOption defines - DNS resolver options of a pod. - type: object - properties: - name: - description: Required. - type: string - value: - type: string - searches: - description: A list of DNS search domains - for host-name lookup. This will be - appended to the base search paths - generated from DNSPolicy. Duplicated - search paths will be removed. - type: array - items: - type: string - dnsPolicy: - description: Set DNS policy for the pod. - Defaults to "ClusterFirst". Valid values - are 'ClusterFirstWithHostNet', 'ClusterFirst', - 'Default' or 'None'. DNS parameters given - in DNSConfig will be merged with the policy - selected with DNSPolicy. To have DNS options - set along with hostNetwork, you have to - specify DNS policy explicitly to 'ClusterFirstWithHostNet'. - type: string - enableServiceLinks: - description: 'EnableServiceLinks indicates - whether information about services should - be injected into pod''s environment variables, - matching the syntax of Docker links. Optional: - Defaults to true.' - type: boolean - ephemeralContainers: - description: List of ephemeral containers - run in this pod. Ephemeral containers - may be run in an existing pod to perform - user-initiated actions such as debugging. - This list cannot be specified when creating - a pod, and it cannot be modified by updating - the pod spec. In order to add an ephemeral - container to an existing pod, use the - pod's ephemeralcontainers subresource. - This field is alpha-level and is only - honored by servers that enable the EphemeralContainers - feature. - type: array - items: - description: An EphemeralContainer is - a container that may be added temporarily - to an existing pod for user-initiated - activities such as debugging. Ephemeral - containers have no resource or scheduling - guarantees, and they will not be restarted - when they exit or when a pod is removed - or restarted. If an ephemeral container - causes a pod to exceed its resource - allocation, the pod may be evicted. - Ephemeral containers may not be added - by directly updating the pod spec. They - must be added via the pod's ephemeralcontainers - subresource, and they will appear in - the pod spec once added. This is an - alpha feature enabled by the EphemeralContainers - feature flag. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + dnsConfig: + description: Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. type: object - required: - - name properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - 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. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. 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. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + nameservers: + description: A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed. type: array items: type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. + options: + description: A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy. type: array items: - description: EnvVar represents an - environment variable present in - a Container. + description: PodDNSConfigOption defines DNS resolver options of a pod. type: object - required: - - name properties: name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. + description: Required. type: string value: - description: '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 "".' type: string - valueFrom: - description: Source for the - environment variable's value. - Cannot be used if value is - not empty. + searches: + description: A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. + type: array + items: + type: string + dnsPolicy: + description: Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. + type: string + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.' + type: boolean + ephemeralContainers: + description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature. + type: array + items: + description: An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: '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 "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Lifecycle is not allowed for ephemeral containers. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - fieldRef: - description: 'Selects a - field of the pod: supports - metadata.name, metadata.namespace, - `metadata.labels['''']`, - `metadata.annotations['''']`, - spec.nodeName, spec.serviceAccountName, - status.hostIP, status.podIP, - status.podIPs.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, - requests.cpu, requests.memory - and requests.ephemeral-storage) - are currently supported.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - divisor: - description: Specifies - the output format - of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. - type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: Probes are not allowed for ephemeral containers. type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether - the ConfigMap must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Lifecycle is not allowed - for ephemeral containers. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers. + type: string + ports: + description: Ports are not allowed for ephemeral containers. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the ephemeral - container specified as a DNS_LABEL. - This name must be unique among all - containers, init containers and - ephemeral containers. - type: string - ports: - description: Ports are not allowed - for ephemeral containers. - type: array - items: - description: ContainerPort represents - a network port in a single container. + hostPort: + description: 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. + type: integer + format: int32 + name: + description: 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. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + readinessProbe: + description: Probes are not allowed for ephemeral containers. type: object - required: - - containerPort properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: 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. + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - name: - description: 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. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - readinessProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: Resources are not allowed - for ephemeral containers. Ephemeral - containers use spare resources already - allocated to the pod. - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes - the minimum amount of compute - resources required. If Requests - is omitted for a container, - it defaults to Limits if that - is explicitly specified, otherwise - to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - securityContext: - description: SecurityContext is not - allowed for ephemeral containers. - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + securityContext: + description: SecurityContext is not allowed for ephemeral containers. + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + role: + description: Role is a SELinux role label that applies to the container. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + targetContainerName: + description: If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. type: object + required: + - devicePath + - name properties: - level: - description: Level is SELinux - level label that applies - to the container. - type: string - role: - description: Role is a SELinux - role label that applies - to the container. - type: string - type: - description: Type is a SELinux - type label that applies - to the container. + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. type: string - user: - description: User is a SELinux - user label that applies - to the container. + name: + description: name must match the name of a persistentVolumeClaim in the pod type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. type: object required: - - type + - mountPath + - name properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. + name: + description: This must match the Name of a Volume. type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. type: string - startupProbe: - description: Probes are not allowed - for ephemeral containers. - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + hostAliases: + description: HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods. + type: array + items: + description: HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file. + type: object + properties: + hostnames: + description: Hostnames for the above IP address. + type: array + items: + type: string + ip: + description: IP address of the host file entry. + type: string + hostIPC: + description: 'Use the host''s ipc namespace. Optional: Default to false.' + type: boolean + hostNetwork: + description: Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. + type: boolean + hostPID: + description: 'Use the host''s pid namespace. Optional: Default to false.' + type: boolean + hostname: + description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. + type: string + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + type: array + items: + description: LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + initContainers: + description: 'List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. 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. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. type: object required: - - port + - name properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + value: + description: '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 "".' type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps type: object - required: - - port properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - targetContainerName: - description: If set, the name of the - container from PodSpec that this - ephemeral container targets. The - ephemeral container will be run - in the namespaces (IPC, PID, etc) - of this container. If not set then - the ephemeral container is run in - whatever namespaces are shared for - the pod. Note that the container - runtime must support this feature. - type: string - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. - type: object - required: - - devicePath - - name - properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod - type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. - type: object - required: - - mountPath - - name - properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - hostAliases: - description: HostAliases is an optional - list of hosts and IPs that will be injected - into the pod's hosts file if specified. - This is only valid for non-hostNetwork - pods. - type: array - items: - description: HostAlias holds the mapping - between IP and hostnames that will be - injected as an entry in the pod's hosts - file. - type: object - properties: - hostnames: - description: Hostnames for the above - IP address. - type: array - items: - type: string - ip: - description: IP address of the host - file entry. - type: string - hostIPC: - description: 'Use the host''s ipc namespace. - Optional: Default to false.' - type: boolean - hostNetwork: - description: Host networking requested for - this pod. Use the host's network namespace. - If this option is set, the ports that - will be used must be specified. Default - to false. - type: boolean - hostPID: - description: 'Use the host''s pid namespace. - Optional: Default to false.' - type: boolean - hostname: - description: Specifies the hostname of the - Pod If not specified, the pod's hostname - will be set to a system-defined value. - type: string - imagePullSecrets: - description: 'ImagePullSecrets is an optional - list of references to secrets in the same - namespace to use for pulling any of the - images used by this PodSpec. If specified, - these secrets will be passed to individual - puller implementations for them to use. - For example, in the case of docker, only - DockerConfig type secrets are honored. - More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' - type: array - items: - description: LocalObjectReference contains - enough information to let you locate - the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - initContainers: - description: 'List of initialization containers - belonging to the pod. Init containers - are executed in order prior to containers - being started. If any init container fails, - the pod is considered to have failed and - is handled according to its restartPolicy. - The name for an init container or normal - container must be unique among all containers. - Init containers may not have Lifecycle - actions, Readiness probes, Liveness probes, - or Startup probes. The resourceRequirements - of an init container are taken into account - during scheduling by finding the highest - request/limit for each resource type, - and then using the max of of that value - or the sum of the normal containers. Limits - are applied to init containers in a similar - fashion. Init containers cannot currently - be added or removed. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' - type: array - items: - description: A single application container - that you want to run within a pod. - type: object - required: - - name - properties: - args: - description: 'Arguments to the entrypoint. - The docker image''s CMD is used - if this is not provided. Variable - references $(VAR_NAME) are expanded - using the container''s environment. - 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. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' type: string - command: - description: 'Entrypoint array. Not - executed within a shell. The docker - image''s ENTRYPOINT is used if this - is not provided. Variable references - $(VAR_NAME) are expanded using the - container''s environment. 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. Cannot - be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string - env: - description: List of environment variables - to set in the container. Cannot - be updated. - type: array - items: - description: EnvVar represents an - environment variable present in - a Container. + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. type: object - required: - - name properties: - name: - description: Name of the environment - variable. Must be a C_IDENTIFIER. - type: string - value: - description: '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 "".' - type: string - valueFrom: - description: Source for the - environment variable's value. - Cannot be used if value is - not empty. + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' type: object properties: - configMapKeyRef: - description: Selects a key - of a ConfigMap. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - key + - port properties: - key: - description: The key - to select. + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - optional: - description: Specify - whether the ConfigMap - or its key must be - defined - type: boolean - fieldRef: - description: 'Selects a - field of the pod: supports - metadata.name, metadata.namespace, - `metadata.labels['''']`, - `metadata.annotations['''']`, - spec.nodeName, spec.serviceAccountName, - status.hostIP, status.podIP, - status.podIPs.' + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - fieldPath + - port properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, - requests.cpu, requests.memory - and requests.ephemeral-storage) - are currently supported.' + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. type: object required: - - resource + - port properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - divisor: - description: Specifies - the output format - of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - secretKeyRef: - description: Selects a key - of a secret in the pod's - namespace + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' type: object required: - - key + - port properties: - key: - description: The key - of the secret to select - from. Must be a valid - secret key. + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - envFrom: - description: List of sources to populate - environment variables in the container. - The keys defined within a source - must be a C_IDENTIFIER. All invalid - keys will be reported as an event - when the container is starting. - When a key exists in multiple sources, - the value associated with the last - source will take precedence. Values - defined by an Env with a duplicate - key will take precedence. Cannot - be updated. - type: array - items: - description: EnvFromSource represents - the source of a set of ConfigMaps + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object properties: - configMapRef: - description: The ConfigMap to - select from + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. type: object properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether - the ConfigMap must be - defined - type: boolean - prefix: - description: An optional identifier - to prepend to each key in - the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select - from + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. type: object + required: + - port properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, kind, - uid?' + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - optional: - description: Specify whether - the Secret must be defined - type: boolean - image: - description: 'Docker image name. More - info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow - higher level config management to - default or override container images - in workload controllers like Deployments - and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One - of Always, Never, IfNotPresent. - Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management - system should take in response to - container lifecycle events. Cannot - be updated. - type: object - properties: - postStart: - description: 'PostStart is called - immediately after a container - is created. If the handler fails, - the container is terminated - and restarted according to its - restart policy. Other management - of the container blocks until - the hook completes. More info: - https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preStop: - description: 'PreStop is called - immediately before a container - is terminated due to an API - request or management event - such as liveness/startup probe - failure, preemption, resource - contention, etc. The handler - is not called if the container - crashes or exits. The reason - for termination is passed to - the handler. The Pod''s termination - grace period countdown begins - before the PreStop hooked is - executed. Regardless of the - outcome of the handler, the - container will eventually terminate - within the Pod''s termination - grace period. Other management - of the container blocks until - the hook completes or until - the termination grace period - is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - type: object - properties: - exec: - description: One and only - one of the following should - be specified. Exec specifies - the action to take. - type: object - properties: - command: - description: Command is - the command line to - execute inside the container, - the working directory - for the command is - root ('/') in the container's - filesystem. The command - is simply exec'd, it - is not run inside a - shell, so traditional - shell instructions ('|', - etc) won't work. To - use a shell, you need - to explicitly call out - to that shell. Exit - status of 0 is treated - as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name - to connect to, defaults - to the pod IP. You probably - want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. - HTTP allows repeated - headers. - type: array - items: - description: HTTPHeader - describes a custom - header to be used - in HTTP probes - type: object - required: + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: - name - value - properties: - name: - description: The - header field name - type: string - value: - description: The - header field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access - on the container. Number - must be in the range - 1 to 65535. Name must - be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to - use for connecting to - the host. Defaults to - HTTP. - type: string - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP - port. TCP hooks not yet - supported TODO: implement - a realistic TCP lifecycle - hook' - type: object - required: - - port - properties: - host: - description: 'Optional: - Host name to connect - to, defaults to the - pod IP.' - type: string - port: - description: Number or - name of the port to - access on the container. - Number must be in the - range 1 to 65535. Name - must be an IANA_SVC_NAME. - anyOf: + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - livenessProbe: - description: 'Periodic probe of container - liveness. Container will be restarted - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - name: - description: Name of the container - specified as a DNS_LABEL. Each container - in a pod must have a unique name - (DNS_LABEL). Cannot be updated. - type: string - ports: - description: List of ports to expose - from the container. Exposing a port - here gives the system additional - information about the network connections - a container uses, but is primarily - informational. Not specifying a - port here DOES NOT prevent that - port from being exposed. Any port - which is listening on the default - "0.0.0.0" address inside a container - will be accessible from the network. - Cannot be updated. - type: array - items: - description: ContainerPort represents - a network port in a single container. - type: object - required: - - containerPort - properties: - containerPort: - description: Number of port - to expose on the pod's IP - address. This must be a valid - port number, 0 < x < 65536. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 - hostIP: - description: What host IP to - bind the external port to. - type: string - hostPort: - description: 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. + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. type: integer format: int32 - name: - description: 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. - type: string - protocol: - description: Protocol for port. - Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - default: TCP - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container - service readiness. Container will - be removed from service endpoints - if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. type: object required: - - port + - containerPort properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. + hostPort: + description: 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. + type: integer + format: int32 + name: + description: 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. type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - resources: - description: 'Compute Resources required - by this container. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes - the maximum amount of compute - resources allowed. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes - the minimum amount of compute - resources required. If Requests - is omitted for a container, - it defaults to Limits if that - is explicitly specified, otherwise - to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - securityContext: - description: 'Security options the - pod should run with. More info: - https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - type: object - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation - controls whether a process can - gain more privileges than its - parent process. This bool directly - controls if the no_new_privs - flag will be set on the container - process. AllowPrivilegeEscalation - is true always when the container - is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities - to add/drop when running containers. - Defaults to the default set - of capabilities granted by the - container runtime. - type: object - properties: - add: - description: Added capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. type: string - drop: - description: Removed capabilities - type: array - items: - description: Capability - represent POSIX capabilities - type + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. type: string - privileged: - description: Run container in - privileged mode. Processes in - privileged containers are essentially - equivalent to root on the host. - Defaults to false. - type: boolean - procMount: - description: procMount denotes - the type of proc mount to use - for the containers. The default - is DefaultProcMount which uses - the container runtime defaults - for readonly paths and masked - paths. This requires the ProcMountType - feature flag to be enabled. - type: string - readOnlyRootFilesystem: - description: Whether this container - has a read-only root filesystem. - Default is false. - type: boolean - runAsGroup: - description: The GID to run the - entrypoint of the container - process. Uses runtime default - if unset. May also be set in - PodSecurityContext. If set - in both SecurityContext and - PodSecurityContext, the value - specified in SecurityContext - takes precedence. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the - container must run as a non-root - user. If true, the Kubelet will - validate the image at runtime - to ensure that it does not run - as UID 0 (root) and fail to - start the container if it does. - If unset or false, no such validation - will be performed. May also - be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the - entrypoint of the container - process. Defaults to user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context - to be applied to the container. - If unspecified, the container - runtime will allocate a random - SELinux context for each container. May - also be set in PodSecurityContext. If - set in both SecurityContext - and PodSecurityContext, the - value specified in SecurityContext - takes precedence. - type: object - properties: - level: - description: Level is SELinux - level label that applies - to the container. - type: string - role: - description: Role is a SELinux - role label that applies - to the container. - type: string - type: - description: Type is a SELinux - type label that applies - to the container. - type: string - user: - description: User is a SELinux - user label that applies - to the container. - type: string - seccompProfile: - description: The seccomp options - to use by this container. If - seccomp options are provided - at both the pod & container - level, the container options - override the pod options. - type: object - required: - - type - properties: - localhostProfile: - description: localhostProfile - indicates a profile defined - in a file on the node should - be used. The profile must - be preconfigured on the - node to work. Must be a - descending path, relative - to the kubelet's configured - seccomp profile location. - Must only be set if type - is "Localhost". - type: string - type: - description: "type indicates - which kind of seccomp profile - will be applied. Valid options - are: \n Localhost - a profile - defined in a file on the - node should be used. RuntimeDefault - - the container runtime - default profile should be - used. Unconfined - no profile - should be applied." - type: string - windowsOptions: - description: The Windows specific - settings applied to all containers. - If unspecified, the options - from the PodSecurityContext - will be used. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of - the GMSA credential spec - named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA - credential spec to use. - type: string - runAsUserName: - description: The UserName - in Windows to run the entrypoint - of the container process. - Defaults to the user specified - in image metadata if unspecified. - May also be set in PodSecurityContext. - If set in both SecurityContext - and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - startupProbe: - description: 'StartupProbe indicates - that the Pod has successfully initialized. - If specified, no other probes are - executed until this completes successfully. - If this probe fails, the Pod will - be restarted, just as if the livenessProbe - failed. This can be used to provide - different probe parameters at the - beginning of a Pod''s lifecycle, - when it might take a long time to - load data or warm a cache, than - during steady-state operation. This - cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: object - properties: - exec: - description: One and only one - of the following should be specified. - Exec specifies the action to - take. - type: object - properties: - command: - description: Command is the - command line to execute - inside the container, the - working directory for the - command is root ('/') in - the container's filesystem. - The command is simply exec'd, - it is not run inside a shell, - so traditional shell instructions - ('|', etc) won't work. To - use a shell, you need to - explicitly call out to that - shell. Exit status of 0 - is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. type: string - failureThreshold: - description: Minimum consecutive - failures for the probe to be - considered failed after having - succeeded. Defaults to 3. Minimum - value is 1. - type: integer - format: int32 - httpGet: - description: HTTPGet specifies - the http request to perform. - type: object - required: - - port - properties: - host: - description: Host name to - connect to, defaults to - the pod IP. You probably - want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers - to set in the request. HTTP - allows repeated headers. - type: array - items: - description: HTTPHeader - describes a custom header - to be used in HTTP probes - type: object - required: - - name - - value - properties: - name: - description: The header - field name - type: string - value: - description: The header - field value - type: string - path: - description: Path to access - on the HTTP server. - type: string - port: - description: Name or number - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - scheme: - description: Scheme to use - for connecting to the host. - Defaults to HTTP. - type: string - initialDelaySeconds: - description: 'Number of seconds - after the container has started - before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - periodSeconds: - description: How often (in seconds) - to perform the probe. Default - to 10 seconds. Minimum value - is 1. - type: integer - format: int32 - successThreshold: - description: Minimum consecutive - successes for the probe to be - considered successful after - having failed. Defaults to 1. - Must be 1 for liveness and startup. - Minimum value is 1. - type: integer - format: int32 - tcpSocket: - description: 'TCPSocket specifies - an action involving a TCP port. - TCP hooks not yet supported - TODO: implement a realistic - TCP lifecycle hook' - type: object - required: - - port - properties: - host: - description: 'Optional: Host - name to connect to, defaults - to the pod IP.' - type: string - port: - description: Number or name - of the port to access on - the container. Number must - be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - - type: integer - - type: string + - type: integer + - type: string x-kubernetes-int-or-string: true - timeoutSeconds: - description: 'Number of seconds - after which the probe times - out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: integer - format: int32 - stdin: - description: Whether this container - should allocate a buffer for stdin - in the container runtime. If this - is not set, reads from stdin in - the container will always result - in EOF. Default is false. - type: boolean - stdinOnce: - description: Whether the container - runtime should close the stdin channel - after it has been opened by a single - attach. When stdin is true the stdin - stream will remain open across multiple - attach sessions. If stdinOnce is - set to true, stdin is opened on - container start, is empty until - the first client attaches to stdin, - and then remains open and accepts - data until the client disconnects, - at which time stdin is closed and - remains closed until the container - is restarted. If this flag is false, - a container processes that reads - from stdin will never receive an - EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which - the file to which the container''s - termination message will be written - is mounted into the container''s - filesystem. Message written is intended - to be brief final status, such as - an assertion failure message. Will - be truncated by the node if greater - than 4096 bytes. The total message - length across all containers will - be limited to 12kb. Defaults to - /dev/termination-log. Cannot be - updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination - message should be populated. File - will use the contents of terminationMessagePath - to populate the container status - message on both success and failure. - FallbackToLogsOnError will use the - last chunk of container log output - if the termination message file - is empty and the container exited - with an error. The log output is - limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to - File. Cannot be updated. - type: string - tty: - description: Whether this container - should allocate a TTY for itself, - also requires 'stdin' to be true. - Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the - list of block devices to be used - by the container. - type: array - items: - description: volumeDevice describes - a mapping of a raw block device - within a container. + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' type: object - required: - - devicePath - - name properties: - devicePath: - description: devicePath is the - path inside of the container - that the device will be mapped - to. - type: string - name: - description: name must match - the name of a persistentVolumeClaim - in the pod + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. type: string - volumeMounts: - description: Pod volumes to mount - into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes - a mounting of a Volume within - a container. + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the - container at which the volume - should be mounted. Must not - contain ':'. - type: string - mountPropagation: - description: mountPropagation - determines how mounts are - propagated from the host to - container and the other way - around. When not set, MountPropagationNone - is used. This field is beta - in 1.10. - type: string - name: - description: This must match - the Name of a Volume. - type: string - readOnly: - description: Mounted read-only - if true, read-write otherwise - (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the - volume from which the container's - volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within - the volume from which the - container's volume should - be mounted. Behaves similarly - to SubPath but environment - variable references $(VAR_NAME) - are expanded using the container's - environment. Defaults to "" - (volume's root). SubPathExpr - and SubPath are mutually exclusive. - type: string - workingDir: - description: Container's working directory. - If not specified, the container - runtime's default will be used, - which might be configured in the - container image. Cannot be updated. - type: string - nodeName: - description: NodeName is a request to schedule - this pod onto a specific node. If it is - non-empty, the scheduler simply schedules - this pod onto that node, assuming that - it fits resource requirements. - type: string - nodeSelector: - description: 'NodeSelector is a selector - which must be true for the pod to fit - on a node. Selector which must match a - node''s labels for the pod to be scheduled - on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - overhead: - description: 'Overhead represents the resource - overhead associated with running a pod - for a given RuntimeClass. This field will - be autopopulated at admission time by - the RuntimeClass admission controller. - If the RuntimeClass admission controller - is enabled, overhead must not be set in - Pod create requests. The RuntimeClass - admission controller will reject Pod create - requests which have the overhead already - set. If RuntimeClass is configured and - selected in the PodSpec, Overhead will - be set to the value defined in the corresponding - RuntimeClass, otherwise it will remain - unset and treated as zero. More info: - https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md - This field is alpha-level as of Kubernetes - v1.16, and is only honored by servers - that enable the PodOverhead feature.' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - preemptionPolicy: - description: PreemptionPolicy is the Policy - for preempting pods with lower priority. - One of Never, PreemptLowerPriority. Defaults - to PreemptLowerPriority if unset. This - field is beta-level, gated by the NonPreemptingPriority - feature-gate. - type: string - priority: - description: The priority value. Various - system components use this field to find - the priority of the pod. When Priority - Admission Controller is enabled, it prevents - users from setting this field. The admission - controller populates this field from PriorityClassName. - The higher the value, the higher the priority. - type: integer - format: int32 - priorityClassName: - description: If specified, indicates the - pod's priority. "system-node-critical" - and "system-cluster-critical" are two - special keywords which indicate the highest - priorities with the former being the highest - priority. Any other name must be defined - by creating a PriorityClass object with - that name. If not specified, the pod priority - will be default or zero if there is no - default. - type: string - readinessGates: - description: 'If specified, all readiness - gates will be evaluated for pod readiness. - A pod is ready when all its containers - are ready AND all conditions specified - in the readiness gates have status equal - to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains - the reference to a pod condition - type: object - required: - - conditionType - properties: - conditionType: - description: ConditionType refers - to a condition in the pod's condition - list with matching type. - type: string - restartPolicy: - description: 'Restart policy for all containers - within the pod. One of Always, OnFailure, - Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - type: string - runtimeClassName: - description: 'RuntimeClassName refers to - a RuntimeClass object in the node.k8s.io - group, which should be used to run this - pod. If no RuntimeClass resource matches - the named class, the pod will not be run. - If unset or empty, the "legacy" RuntimeClass - will be used, which is an implicit class - with an empty definition that uses the - default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md - This is a beta feature as of Kubernetes - v1.14.' - type: string - schedulerName: - description: If specified, the pod will - be dispatched by specified scheduler. - If not specified, the pod will be dispatched - by default scheduler. - type: string - securityContext: - description: 'SecurityContext holds pod-level - security attributes and common container - settings. Optional: Defaults to empty. See - type description for default values of - each field.' - type: object - properties: - fsGroup: - description: "A special supplemental - group that applies to all containers - in a pod. Some volume types allow - the Kubelet to change the ownership - of that volume to be owned by the - pod: \n 1. The owning GID will be - the FSGroup 2. The setgid bit is set - (new files created in the volume will - be owned by FSGroup) 3. The permission - bits are OR'd with rw-rw---- \n If - unset, the Kubelet will not modify - the ownership and permissions of any - volume." - type: integer - format: int64 - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines - behavior of changing ownership and - permission of the volume before being - exposed inside Pod. This field will - only apply to volume types which support - fsGroup based ownership(and permissions). - It will have no effect on ephemeral - volume types such as: secret, configmaps - and emptydir. Valid values are "OnRootMismatch" - and "Always". If not specified, "Always" - is used.' - type: string - runAsGroup: - description: The GID to run the entrypoint - of the container process. Uses runtime - default if unset. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - type: integer - format: int64 - runAsNonRoot: - description: Indicates that the container - must run as a non-root user. If true, - the Kubelet will validate the image - at runtime to ensure that it does - not run as UID 0 (root) and fail to - start the container if it does. If - unset or false, no such validation - will be performed. May also be set - in SecurityContext. If set in both - SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint - of the container process. Defaults - to user specified in image metadata - if unspecified. May also be set in - SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence for that container. - type: integer - format: int64 - seLinuxOptions: - description: The SELinux context to - be applied to all containers. If unspecified, - the container runtime will allocate - a random SELinux context for each - container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence for that container. - type: object - properties: - level: - description: Level is SELinux level - label that applies to the container. - type: string - role: - description: Role is a SELinux role - label that applies to the container. + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string - type: - description: Type is a SELinux type - label that applies to the container. + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. type: string - user: - description: User is a SELinux user - label that applies to the container. + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. type: string - seccompProfile: - description: The seccomp options to - use by the containers in this pod. + nodeName: + description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. + type: string + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + overhead: + description: 'Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preemptionPolicy: + description: PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate. + type: string + priority: + description: The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. + type: integer + format: int32 + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to a pod condition type: object required: - - type - properties: - localhostProfile: - description: localhostProfile indicates - a profile defined in a file on - the node should be used. The profile - must be preconfigured on the node - to work. Must be a descending - path, relative to the kubelet's - configured seccomp profile location. - Must only be set if type is "Localhost". - type: string - type: - description: "type indicates which - kind of seccomp profile will be - applied. Valid options are: \n - Localhost - a profile defined - in a file on the node should be - used. RuntimeDefault - the container - runtime default profile should - be used. Unconfined - no profile - should be applied." - type: string - supplementalGroups: - description: A list of groups applied - to the first process run in each container, - in addition to the container's primary - GID. If unspecified, no groups will - be added to any container. - type: array - items: - type: integer - format: int64 - sysctls: - description: Sysctls hold a list of - namespaced sysctls used for the pod. - Pods with unsupported sysctls (by - the container runtime) might fail - to launch. - type: array - items: - description: Sysctl defines a kernel - parameter to be set - type: object - required: - - name - - value - properties: - name: - description: Name of a property - to set - type: string - value: - description: Value of a property - to set - type: string - windowsOptions: - description: The Windows specific settings - applied to all containers. If unspecified, - the options within a container's SecurityContext - will be used. If set in both SecurityContext - and PodSecurityContext, the value - specified in SecurityContext takes - precedence. - type: object + - conditionType properties: - gmsaCredentialSpec: - description: GMSACredentialSpec - is where the GMSA admission webhook - (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA - credential spec named by the GMSACredentialSpecName - field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName - is the name of the GMSA credential - spec to use. + conditionType: + description: ConditionType refers to a condition in the pod's condition list with matching type. type: string - runAsUserName: - description: The UserName in Windows - to run the entrypoint of the container - process. Defaults to the user - specified in image metadata if - unspecified. May also be set in - PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, - the value specified in SecurityContext - takes precedence. - type: string - serviceAccount: - description: 'DeprecatedServiceAccount is - a depreciated alias for ServiceAccountName. - Deprecated: Use serviceAccountName instead.' - type: string - serviceAccountName: - description: 'ServiceAccountName is the - name of the ServiceAccount to use to run - this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' - type: string - setHostnameAsFQDN: - description: If true the pod's hostname - will be configured as the pod's FQDN, - rather than the leaf name (the default). - In Linux containers, this means setting - the FQDN in the hostname field of the - kernel (the nodename field of struct utsname). - In Windows containers, this means setting - the registry value of hostname for the - registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters - to FQDN. If a pod does not have FQDN, - this has no effect. Default to false. - type: boolean - shareProcessNamespace: - description: 'Share a single process namespace - between all of the containers in a pod. - When this is set containers will be able - to view and signal processes from other - containers in the same pod, and the first - process in each container will not be - assigned PID 1. HostPID and ShareProcessNamespace - cannot both be set. Optional: Default - to false.' - type: boolean - subdomain: - description: If specified, the fully qualified - Pod hostname will be "...svc.". If not - specified, the pod will not have a domainname - at all. - type: string - terminationGracePeriodSeconds: - description: Optional duration in seconds - the pod needs to terminate gracefully. - May be decreased in delete request. Value - must be non-negative integer. The value - zero indicates delete immediately. If - this value is nil, the default grace period - will be used instead. The grace period - is the duration in seconds after the processes - running in the pod are sent a termination - signal and the time when the processes - are forcibly halted with a kill signal. - Set this value longer than the expected - cleanup time for your process. Defaults - to 30 seconds. - type: integer - format: int64 - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is - attached to tolerates any taint that - matches the triple - using the matching operator . + restartPolicy: + description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. + type: string + securityContext: + description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.' type: object properties: - effect: - description: Effect indicates the - taint effect to match. Empty means - match all taint effects. When specified, - allowed values are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - key: - description: Key is the taint key - that the toleration applies to. - Empty means match all taint keys. - If the key is empty, operator must - be Exists; this combination means - to match all values and all keys. - type: string - operator: - description: Operator represents a - key's relationship to the value. - Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent - to wildcard for value, so that a - pod can tolerate all taints of a - particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents - the period of time the toleration - (which must be of effect NoExecute, - otherwise this field is ignored) - tolerates the taint. By default, - it is not set, which means tolerate - the taint forever (do not evict). - Zero and negative values will be - treated as 0 (evict immediately) - by the system. + fsGroup: + description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." type: integer format: int64 - value: - description: Value is the taint value - the toleration matches to. If the - operator is Exists, the value should - be empty, otherwise just a regular - string. + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.' type: string - topologySpreadConstraints: - description: TopologySpreadConstraints describes - how a group of pods ought to spread across - topology domains. Scheduler will schedule - pods in a way which abides by the constraints. - All topologySpreadConstraints are ANDed. - type: array - items: - description: TopologySpreadConstraint - specifies how to spread matching pods - among the given topology. - type: object - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - properties: - labelSelector: - description: LabelSelector is used - to find matching pods. Pods that - match this label selector are counted - to determine the number of pods - in their corresponding topology - domain. - type: object - properties: - matchExpressions: - description: matchExpressions - is a list of label selector - requirements. The requirements - are ANDed. - type: array - items: - description: A label selector - requirement is a selector - that contains values, a key, - and an operator that relates - the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the - label key that the selector - applies to. - type: string - operator: - description: operator represents - a key's relationship to - a set of values. Valid - operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an - array of string values. - If the operator is In - or NotIn, the values array - must be non-empty. If - the operator is Exists - or DoesNotExist, the values - array must be empty. This - array is replaced during - a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a - map of {key,value} pairs. A - single {key,value} in the matchLabels - map is equivalent to an element - of matchExpressions, whose key - field is "key", the operator - is "In", and the values array - contains only "value". The requirements - are ANDed. - type: object - additionalProperties: - type: string - maxSkew: - description: 'MaxSkew describes the - degree to which pods may be unevenly - distributed. When `whenUnsatisfiable=DoNotSchedule`, - it is the maximum permitted difference - between the number of matching pods - in the target topology and the global - minimum. For example, in a 3-zone - cluster, MaxSkew is set to 1, and - pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 - | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod - can only be scheduled to zone3 to - become 1/1/1; scheduling it onto - zone1(zone2) would make the ActualSkew(2-0) - on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod - can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, - it is used to give higher precedence - to topologies that satisfy it. It''s - a required field. Default value - is 1 and 0 is not allowed.' + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: integer - format: int32 - topologyKey: - description: TopologyKey is the key - of node labels. Nodes that have - a label with this key and identical - values are considered to be in the - same topology. We consider each - as a "bucket", and - try to put balanced number of pods - into each bucket. It's a required - field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates - how to deal with a pod if it doesn''t - satisfy the spread constraint. - - DoNotSchedule (default) tells the - scheduler not to schedule it. - - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but - giving higher precedence to topologies - that would help reduce the skew. - A constraint is considered "Unsatisfiable" - for an incoming pod if and only - if every possible node assigment - for that pod would violate "MaxSkew" - on some topology. For example, in - a 3-zone cluster, MaxSkew is set - to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 - | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, - incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) - satisfies MaxSkew(1). In other words, - the cluster can still be imbalanced, - but scheduler won''t make it *more* - imbalanced. It''s a required field.' - type: string - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumes: - description: 'List of volumes that can be - mounted by containers belonging to the - pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' - type: array - items: - description: Volume represents a named - volume in a pod that may be accessed - by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore - represents an AWS Disk resource - that is attached to a kubelet''s - host machine and then exposed to - the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to - force and set the ReadOnly property - in VolumeMounts to "true". If - omitted, the default is "false". - More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the - persistent disk resource in - AWS (Amazon EBS volume). More - info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents - an Azure Data Disk mount on the - host and bind mount to the pod. + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. type: object - required: - - diskName - - diskURI properties: - cachingMode: - description: 'Host Caching mode: - None, Read Only, Read Write.' + level: + description: Level is SELinux level label that applies to the container. type: string - diskName: - description: The Name of the data - disk in the blob storage + role: + description: Role is a SELinux role label that applies to the container. type: string - diskURI: - description: The URI the data - disk in the blob storage - type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. + type: + description: Type is a SELinux type label that applies to the container. type: string - kind: - description: 'Expected values - Shared: multiple blob disks - per storage account Dedicated: - single blob disk per storage - account Managed: azure managed - data disk (only in managed availability - set). defaults to shared' + user: + description: User is a SELinux user label that applies to the container. type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents - an Azure File Service mount on the - host and bind mount to the pod. + seccompProfile: + description: The seccomp options to use by the containers in this pod. type: object required: - - secretName - - shareName + - type properties: - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretName: - description: the name of secret - that contains Azure Storage - Account Name and Key + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". type: string - shareName: - description: Share Name + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." type: string - cephfs: - description: CephFS represents a Ceph - FS mount on the host that shares - a pod's lifetime + supplementalGroups: + description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. + type: array + items: + type: integer + format: int64 + sysctls: + description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to be set + type: object + required: + - name + - value + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: object - required: - - monitors properties: - monitors: - description: 'Required: Monitors - is a collection of Ceph monitors - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - path: - description: 'Optional: Used as - the mounted root, rather than - the full Ceph tree, default - is /' - type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile - is the path to key ring for - User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. type: string - secretRef: - description: 'Optional: SecretRef - is reference to the authentication - secret for User, default is - empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - user: - description: 'Optional: User is - the rados user name, default - is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. type: string - cinder: - description: 'Cinder represents a - cinder volume attached and mounted - on kubelets host machine. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred - to be "ext4" if unspecified. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts. More - info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points - to a secret object containing - parameters used to connect to - OpenStack.' - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' + serviceAccount: + description: 'DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.' + type: string + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + setHostnameAsFQDN: + description: If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false. + type: boolean + shareProcessNamespace: + description: 'Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.' + type: boolean + subdomain: + description: If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all. + type: string + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds. + type: integer + format: int64 + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. + type: integer + format: int64 + value: + description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + topologySpreadConstraints: + description: TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. + type: array + items: + description: TopologySpreadConstraint specifies how to spread matching pods among the given topology. + type: object + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: type: string - volumeID: - description: 'volume id used to - identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents - a configMap that should populate - this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - 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 - 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: - description: Maps a string key - to a path within a volume. + maxSkew: + description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.' + type: integer + format: int32 + topologyKey: + description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field. + type: string + whenUnsatisfiable: + description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.' + type: string + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + description: 'List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. 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 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the - ConfigMap or its keys must be - defined - type: boolean - csi: - description: CSI (Container Storage - Interface) represents ephemeral - storage that is handled by certain - external CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the CSI driver that handles - this volume. Consult with your - admin for the correct name as - registered in the cluster. - type: string - fsType: - description: Filesystem type to - mount. Ex. "ext4", "xfs", "ntfs". - If not provided, the empty value - is passed to the associated - CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef - is a reference to the secret - object containing sensitive - information to pass to the CSI - driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. - This field is optional, and may - be empty if no secret is required. - If the secret object contains - more than one secret, all secret - references are passed. - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes - stores driver-specific properties - that are passed to the CSI driver. - Consult your driver's documentation - for supported values. - type: object - additionalProperties: + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. type: string - downwardAPI: - description: DownwardAPI represents - downward API about the pod that - should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits - to use on created files by default. - Must be a Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - 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 - items: - description: Items is a list of - downward API volume file - type: array - items: - description: DownwardAPIVolumeFile - represents information to - create the file containing - the pod field + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: - Selects a field of the - pod: only annotations, - labels, name and namespace - are supported.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version - of the schema the - FieldPath is written - in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of - the field to select - in the specified API - version. - type: string - mode: - description: 'Optional: - mode bits used to set - permissions on this file, - must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. 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 - path: - description: '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 - ''..''' + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - resourceFieldRef: - description: 'Selects a - resource of the container: - only resources limits - and requests (limits.cpu, - limits.memory, requests.cpu - and requests.memory) are - currently supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container - name: required for - volumes, optional - for env vars' - type: string - divisor: - description: Specifies - the output format - of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource to select' - type: string - emptyDir: - description: 'EmptyDir represents - a temporary directory that shares - a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: '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: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of - local storage required for this - EmptyDir volume. The size limit - is also applicable for memory - medium. The maximum usage on - memory medium EmptyDir would - be the minimum value between - the SizeLimit specified here - and the sum of memory limits - of all containers in a pod. - The default is nil which means - that the limit is undefined. - More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - ephemeral: - description: "Ephemeral represents - a volume that is handled by a cluster - storage driver (Alpha feature). - The volume's lifecycle is tied to - the pod that defines it - it will - be created before the pod starts, - and deleted when the pod is removed. - \n Use this if: a) the volume is - only needed while the pod runs, - b) features of normal volumes like - restoring from snapshot or capacity - \ tracking are needed, c) the - storage driver is specified through - a storage class, and d) the storage - driver supports dynamic volume provisioning - through a PersistentVolumeClaim - (see EphemeralVolumeSource for more - \ information on the connection - between this volume type and - PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs - for volumes that persist for longer - than the lifecycle of an individual - pod. \n Use CSI for light-weight - local ephemeral volumes if the CSI - driver is meant to be used that - way - see the documentation of the - driver for more information. \n - A pod can use both types of ephemeral - volumes and persistent volumes at - the same time." - type: object - properties: - readOnly: - description: Specifies a read-only - configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to - create a stand-alone PVC to - provision the volume. The pod - in which this EphemeralVolumeSource - is embedded will be the owner - of the PVC, i.e. the PVC will - be deleted together with the - pod. The name of the PVC will - be `-` - where `` is the - name from the `PodSpec.Volumes` - array entry. Pod validation - will reject the pod if the concatenated - name is not valid for a PVC - (for example, too long). \n - An existing PVC with that name - that is not owned by the pod - will *not* be used for the pod - to avoid using an unrelated - volume by mistake. Starting - the pod is then blocked until - the unrelated PVC is removed. - If such a pre-created PVC is - meant to be used by the pod, - the PVC has to updated with - an owner reference to the pod - once the pod exists. Normally - this should not be necessary, - but it may be useful when manually - reconstructing a broken cluster. - \n This field is read-only and - no changes will be made by Kubernetes - to the PVC after it has been - created. \n Required, must not - be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels - and annotations that will - be copied into the PVC when - creating it. No other fields - are allowed and will be - rejected during validation. - type: object - spec: - description: The specification - for the PersistentVolumeClaim. - The entire content is copied - unchanged into the PVC that - gets created from this template. - The same fields as in a - PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes - contains the desired - access modes the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field - can be used to specify - either: * An existing - VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) - * An existing custom - resource that implements - data population (Alpha) - In order to use custom - resource types that - implement data population, - the AnyVolumeDataSource - feature gate must be - enabled. If the provisioner - or an external controller - can support the specified - data source, it will - create a new volume - based on the contents - of the specified data - source.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup - is the group for - the resource being - referenced. If APIGroup - is not specified, - the specified Kind - must be in the core - API group. For any - other third-party - types, APIGroup - is required. - type: string - kind: - description: Kind - is the type of resource - being referenced + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - name: - description: Name - is the name of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - resources: - description: 'Resources - represents the minimum - resources the volume - should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: '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 ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits - describes the maximum - amount of compute - resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests - describes the minimum - amount of compute - resources required. - If Requests is omitted - for a container, - it defaults to Limits - if that is explicitly - specified, otherwise - to an implementation-defined - value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - selector: - description: A label query - over volumes to consider - for binding. - type: object - properties: - matchExpressions: - description: matchExpressions - is a list of label - selector requirements. - The requirements - are ANDed. - type: array - items: - description: A label - selector requirement - is a selector - that contains - values, a key, - and an operator - that relates the - key and values. + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: '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: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - key - - operator - properties: - key: - description: key - is the label - key that the - selector applies - to. - type: string - operator: - description: operator - represents - a key's relationship - to a set of - values. Valid - operators - are In, NotIn, - Exists and - DoesNotExist. - type: string - values: - description: values - is an array - of string - values. If - the operator - is In or NotIn, - the values - array must - be non-empty. - If the operator - is Exists - or DoesNotExist, - the values - array must - be empty. - This array - is replaced - during a strategic - merge patch. - type: array - items: + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + selector: + description: A label query over volumes to consider for binding. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. type: string - matchLabels: - description: matchLabels - is a map of {key,value} - pairs. A single - {key,value} in the - matchLabels map - is equivalent to - an element of matchExpressions, - whose key field - is "key", the operator - is "In", and the - values array contains - only "value". The - requirements are - ANDed. - type: object - additionalProperties: - type: string - storageClassName: - description: 'Name of - the StorageClass required - by the claim. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode - defines what type of - volume is required by - the claim. Value of - Filesystem is implied - when not included in - claim spec. - type: string - volumeName: - description: VolumeName - is the binding reference - to the PersistentVolume - backing this claim. - type: string - fc: - description: FC represents a Fibre - Channel resource that is attached - to a kubelet's host machine and - then exposed to the pod. - type: object - properties: - fsType: - description: 'Filesystem type - to mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. TODO: how do - we prevent errors in the filesystem - from compromising the machine' - type: string - lun: - description: 'Optional: FC target - lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target - worldwide names (WWNs)' - type: array - items: + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - wwids: - description: 'Optional: FC volume - world wide identifiers (wwids) - Either wwids or combination - of targetWWNs and lun must be - set, but not both simultaneously.' - type: array - items: + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. type: string - flexVolume: - description: FlexVolume represents - a generic volume resource that is - provisioned/attached using an exec - based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name - of the driver to use for this - volume. - type: string - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - The default filesystem depends - on FlexVolume script. - type: string - options: - description: 'Optional: Extra - command options if any.' - type: object - additionalProperties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string - readOnly: - description: 'Optional: Defaults - to false (read/write). ReadOnly - here will force the ReadOnly - setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef - is reference to the secret object - containing sensitive information - to pass to the plugin scripts. - This may be empty if no secret - object is specified. If the - secret object contains more - than one secret, all secrets - are passed to the plugin scripts.' - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: type: string - flocker: - description: Flocker represents a - Flocker volume attached to a kubelet's - host machine. This depends on the - Flocker control service being running - type: object - properties: - datasetName: - description: Name of the dataset - stored as metadata -> name on - the dataset for Flocker should - be considered as deprecated - type: string - datasetUUID: - description: UUID of the dataset. - This is unique identifier of - a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents - a GCE Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - partition: - description: 'The partition in - the volume that you want to - mount. If omitted, the default - is to mount by volume name. - Examples: For volume /dev/sda1, - you specify the partition as - "1". Similarly, the volume partition - for /dev/sda is "0" (or you - can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the - PD resource in GCE. Used to - identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a - git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - To provision a container with a - git repo, mount an EmptyDir into - an InitContainer that clones the - repo using git, then mount the EmptyDir - into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory - name. Must not contain or start - with '..'. If '.' is supplied, - the volume directory will be - the git repository. Otherwise, - if specified, the volume will - contain the git repository in - the subdirectory with the given - name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the - specified revision. - type: string - glusterfs: - description: 'Glusterfs represents - a Glusterfs mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is - the endpoint name that details - Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs - volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will - force the Glusterfs volume to - be mounted with read-only permissions. - Defaults to false. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: '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: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict - who can use host directory mounts - and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory - on the host. If the path is - a symlink, it will follow the - link to the real path. More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath - Volume Defaults to "" More info: - https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an - ISCSI Disk resource that is attached - to a kubelet''s host machine and - then exposed to the pod. More info: - https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI - Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI - Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator - Name. If initiatorName is specified - with iscsiInterface simultaneously, - new iSCSI interface : will be - created for the connection. - type: string - iqn: - description: Target iSCSI Qualified - Name. - type: string - iscsiInterface: - description: iSCSI Interface Name - that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun - number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal - List. The portal is either an - IP or ip_addr:port if the port - is other than default (typically - TCP ports 860 and 3260). - type: array - items: + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated type: string - readOnly: - description: ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI - target and initiator authentication - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - targetPortal: - description: iSCSI Target Portal. - The Portal is either an IP or - ip_addr:port if the port is - other than default (typically - TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must - be a DNS_LABEL and unique within - the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS - mount on the host that shares a - pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported - by the NFS server. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will - force the NFS export to be mounted - with read-only permissions. - Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname - or IP address of the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource - represents a reference to a PersistentVolumeClaim - in the same namespace. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the - name of a PersistentVolumeClaim - in the same namespace as the - pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly - setting in VolumeMounts. Default - false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk - represents a PhotonController persistent - disk attached and mounted on kubelets - host machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - pdID: - description: ID that identifies - Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents - a portworx volume attached and mounted - on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents - the filesystem type to mount - Must be a filesystem type supported - by the host operating system. - Ex. "ext4", "xfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely - identifies a Portworx volume - type: string - projected: - description: Items for all in one - resources secrets, configmaps, and - downward API - type: object - properties: - defaultMode: - description: Mode bits used to - set permissions on created files - by default. Must be an octal - value between 0000 and 0777 - or a decimal value between 0 - and 511. YAML accepts both octal - and decimal values, JSON requires - decimal values for mode bits. - 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: - description: Projection that - may be projected along with - other supported volume types + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: '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: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication type: object properties: - configMap: - description: information - about the configMap data - to project - type: object - 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 + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. 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: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - 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 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify - whether the ConfigMap - or its keys must be - defined - type: boolean - downwardAPI: - description: information - about the downwardAPI - data to project - type: object - properties: - items: - description: Items is - a list of DownwardAPIVolume - file - type: array + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: items: - description: DownwardAPIVolumeFile - represents information - to create the file - containing the pod - field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: - Selects a field - of the pod: - only annotations, - labels, name - and namespace - are supported.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version - of the schema - the FieldPath - is written - in terms - of, defaults - to "v1". - type: string - fieldPath: - description: Path - of the field - to select - in the specified - API version. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file, - must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - 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 - path: - description: '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 ''..''' - type: string - resourceFieldRef: - description: 'Selects - a resource of - the container: - only resources - limits and requests - (limits.cpu, - limits.memory, - requests.cpu - and requests.memory) - are currently - supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container - name: required - for volumes, - optional - for env - vars' - type: string - divisor: - description: Specifies - the output - format of - the exposed - resources, - defaults - to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: - resource - to select' - type: string - secret: - description: information - about the secret data - to project - type: object - 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 + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: '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 ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secret: + description: information about the secret data to project + type: object + properties: items: - description: Maps - a string key to - a path within a - volume. - type: object - required: - - key - - path - properties: - key: - description: The - key to project. - type: string - mode: - description: 'Optional: - mode bits used - to set permissions - on this file. - Must be an octal - value between - 0000 and 0777 - or a decimal - value between - 0 and 511. YAML - accepts both - octal and decimal - values, JSON - requires decimal - values for mode - bits. If not - specified, the - volume defaultMode - will be used. - 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 - path: - description: The - relative path - of the file - to map the key - to. May not - be an absolute - path. May not - contain the - path element - '..'. May not - start with the - string '..'. - type: string - name: - description: 'Name of - the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful - fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify - whether the Secret - or its key must be - defined - type: boolean - serviceAccountToken: - description: information - about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience - is the intended audience - of the token. A recipient - of a token must identify - itself with an identifier - specified in the audience - of the token, and - otherwise should reject - the token. The audience - defaults to the identifier - of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds - is the requested duration - of validity of the - service account token. - As the token approaches - expiration, the kubelet - volume plugin will - proactively rotate - the service account - token. The kubelet - will start trying - to rotate the token - if the token is older - than 80 percent of - its time to live or - if the token is older - than 24 hours.Defaults - to 1 hour and must - be at least 10 minutes. - type: integer - format: int64 - path: - description: Path is - the path relative - to the mount point - of the file to project - the token into. - type: string - quobyte: - description: Quobyte represents a - Quobyte mount on the host that shares - a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume - access to Default is no group - type: string - readOnly: - description: ReadOnly here will - force the Quobyte volume to - be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: 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 - type: string - tenant: - description: Tenant owning the - given Quobyte volume in the - Backend Used with dynamically - provisioned Quobyte volumes, - value is set by the plugin - type: string - user: - description: User to map volume - access to Defaults to serivceaccount - user - type: string - volume: - description: Volume is a string - that references an already created - Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados - Block Device mount on the host that - shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type - of the volume that you want - to mount. Tip: Ensure that the - filesystem type is supported - by the host operating system. - Examples: "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors - in the filesystem from compromising - the machine' - type: string - image: - description: 'The rados image - name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path - to key ring for RBDUser. Default - is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of - Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group type: string - pool: - description: 'The rados pool name. - Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will - force the ReadOnly setting in - VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name - of the authentication secret - for RBDUser. If provided overrides - keyring. Default is nil. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - user: - description: 'The rados user name. - Default is admin. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a - ScaleIO persistent volume attached - and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Default is "xfs". - type: string - gateway: - description: The host address - of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO - Protection Domain for the configured - storage. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references - to the secret for ScaleIO user - and other sensitive information. - If this is not provided, Login - operation will fail. - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: 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 + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable - SSL communication with Gateway, - default false - type: boolean - storageMode: - description: Indicates whether - the storage for a volume should - be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage - Pool associated with the protection - domain. - type: string - system: - description: The name of the storage - system as configured in ScaleIO. - type: string - volumeName: - description: The name of a volume - already created in the ScaleIO - system that is associated with - this volume source. - type: string - secret: - description: 'Secret represents a - secret that should populate this - volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits - used to set permissions on created - files by default. Must be an - octal value between 0000 and - 0777 or a decimal value between - 0 and 511. YAML accepts both - octal and decimal values, JSON - requires decimal values for - mode bits. Defaults to 0644. - 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 - 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: - description: Maps a string key - to a path within a volume. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to - project. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - mode: - description: 'Optional: - mode bits used to set - permissions on this file. - Must be an octal value - between 0000 and 0777 - or a decimal value between - 0 and 511. YAML accepts - both octal and decimal - values, JSON requires - decimal values for mode - bits. If not specified, - the volume defaultMode - will be used. 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 - path: - description: The relative - path of the file to map - the key to. May not be - an absolute path. May - not contain the path element - '..'. May not start with - the string '..'. + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - optional: - description: Specify whether the - Secret or its keys must be defined - type: boolean - secretName: - description: 'Name of the secret - in the pod''s namespace to use. - More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents - a StorageOS volume attached and - mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: Defaults to false - (read/write). ReadOnly here - will force the ReadOnly setting - in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies - the secret to use for obtaining - the StorageOS API credentials. If - not specified, default values - will be attempted. - type: object - properties: - name: - description: 'Name of the - referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. - apiVersion, kind, uid?' - type: string - volumeName: - description: VolumeName is the - human-readable name of the StorageOS - volume. Volume names are only - unique within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies - the scope of the volume within - StorageOS. If no namespace - is specified then the Pod's - namespace will be used. This - allows the Kubernetes name scoping - to be mirrored within StorageOS - for tighter integration. Set - VolumeName to any name to override - the default behaviour. Set to - "default" if you are not using - namespaces within StorageOS. - Namespaces that do not pre-exist - within StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents - a vSphere volume attached and mounted - on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to - mount. Must be a filesystem - type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". - Implicitly inferred to be "ext4" - if unspecified. - type: string - storagePolicyID: - description: Storage Policy Based - Management (SPBM) profile ID - associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based - Management (SPBM) profile name. - type: string - volumePath: - description: Path that identifies - vSphere volume vmdk - type: string - permissions: - type: array - items: - description: StrategyDeploymentPermissions describe the - rbac rules and service account needed by the install strategy - type: object - required: - - rules - - serviceAccountName - properties: - rules: - type: array - items: - description: PolicyRule holds information that describes - a policy rule, but does not contain information - about who the rule applies to or which namespace - the rule applies to. - type: object - required: - - verbs - properties: - apiGroups: - description: APIGroups is the name of the APIGroup - that contains the resources. If multiple API - groups are specified, any action requested against - one of the enumerated resources in any API group - will be allowed. - type: array - items: - type: string - nonResourceURLs: - description: NonResourceURLs is a set of partial - urls that a user should have access to. *s - are allowed, but only as the full, final step - in the path Since non-resource URLs are not - namespaced, this field is only applicable for - ClusterRoles referenced from a ClusterRoleBinding. - Rules can either apply to API resources (such - as "pods" or "secrets") or non-resource URL - paths (such as "/api"), but not both. - type: array - items: - type: string - resourceNames: - description: ResourceNames is an optional white - list of names that the rule applies to. An - empty set means that everything is allowed. - type: array - items: - type: string - resources: - description: Resources is a list of resources - this rule applies to. ResourceAll represents - all resources. - type: array - items: - type: string - verbs: - description: Verbs is a list of Verbs that apply - to ALL the ResourceKinds and AttributeRestrictions - contained in this rule. VerbAll represents - all kinds. - type: array - items: - type: string - serviceAccountName: - type: string - strategy: + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + permissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + strategy: + type: string + installModes: + description: InstallModes specify supported installation types + type: array + items: + description: InstallMode associates an InstallModeType with a flag representing if the CSV supports it + type: object + required: + - supported + - type + properties: + supported: + type: boolean + type: + description: InstallModeType is a supported type of install mode for CSV installation + type: string + keywords: + type: array + items: type: string - installModes: - description: InstallModes specify supported installation types - type: array - items: - description: InstallMode associates an InstallModeType with a flag - representing if the CSV supports it + labels: + description: Map of string keys and values that can be used to organize and categorize (scope and select) objects. type: object - required: - - supported - - type - properties: - supported: - type: boolean - type: - description: InstallModeType is a supported type of install - mode for CSV installation - type: string - keywords: - type: array - items: + additionalProperties: + type: string + links: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + maintainers: + type: array + items: + type: object + properties: + email: + type: string + name: + type: string + maturity: type: string - labels: - description: Map of string keys and values that can be used to organize - and categorize (scope and select) objects. - type: object - additionalProperties: + minKubeVersion: type: string - links: - type: array - items: + nativeAPIs: + type: array + items: + description: GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coersion. It doesn't use a GroupVersion to avoid custom marshalling + type: object + required: + - group + - kind + - version + properties: + group: + type: string + kind: + type: string + version: + type: string + provider: type: object properties: name: type: string url: type: string - maintainers: - type: array - items: - type: object - properties: - email: - type: string - name: - type: string - maturity: - type: string - minKubeVersion: - type: string - nativeAPIs: - type: array - items: - description: GroupVersionKind unambiguously identifies a kind. It - doesn't anonymously include GroupVersion to avoid automatic coersion. It - doesn't use a GroupVersion to avoid custom marshalling + replaces: + description: The name of a CSV this one replaces. Should match the `metadata.Name` field of the old CSV. + type: string + selector: + description: Label selector for related resources. type: object - required: - - group - - kind - - version properties: - group: - type: string - kind: - type: string - version: - type: string - provider: - type: object - properties: - name: - type: string - url: - type: string - replaces: - description: The name of a CSV this one replaces. Should match the - `metadata.Name` field of the old CSV. - type: string - selector: - description: Label selector for related resources. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. + additionalProperties: + type: string + version: + description: OperatorVersion is a wrapper around semver.Version which supports correct marshaling to YAML and JSON. + type: string + webhookdefinitions: + type: array + items: + description: WebhookDescription provides details to OLM about required webhooks + type: object + required: + - admissionReviewVersions + - generateName + - sideEffects + - type + properties: + admissionReviewVersions: + type: array + items: type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. + containerPort: + type: integer + format: int32 + default: 443 + maximum: 65535 + minimum: 1 + conversionCRDs: + type: array + items: type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - additionalProperties: - type: string - version: - description: OperatorVersion is a wrapper around semver.Version which - supports correct marshaling to YAML and JSON. - type: string - webhookdefinitions: - type: array - items: - description: WebhookDescription provides details to OLM about required - webhooks - type: object - required: - - admissionReviewVersions - - generateName - - sideEffects - - type - properties: - admissionReviewVersions: - type: array - items: + deploymentName: type: string - containerPort: - type: integer - format: int32 - default: 443 - maximum: 65535 - minimum: 1 - conversionCRDs: - type: array - items: + failurePolicy: type: string - deploymentName: - type: string - failurePolicy: - type: string - generateName: - type: string - matchPolicy: - description: MatchPolicyType specifies the type of match policy - type: string - objectSelector: - description: A label selector is a label query over a set of - resources. The result of matchLabels and matchExpressions - are ANDed. An empty label selector matches all objects. A - null label selector matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. This - array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - reinvocationPolicy: - description: ReinvocationPolicyType specifies what type of policy - the admission hook uses. - type: string - rules: - type: array - items: - description: RuleWithOperations is a tuple of Operations and - Resources. It is recommended to make sure that all the tuple - expansions are valid. + generateName: + type: string + matchPolicy: + description: MatchPolicyType specifies the type of match policy + type: string + objectSelector: + description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: - apiGroups: - description: APIGroups is the API groups the resources - belong to. '*' is all groups. If '*' is present, the - length of the slice must be one. Required. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: type: string - apiVersions: - description: APIVersions is the API versions the resources - belong to. '*' is all versions. If '*' is present, the - length of the slice must be one. Required. - type: array - items: + reinvocationPolicy: + description: ReinvocationPolicyType specifies what type of policy the admission hook uses. + type: string + rules: + type: array + items: + description: RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid. + type: object + properties: + apiGroups: + description: APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + apiVersions: + description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + operations: + description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + resources: + description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required." + type: array + items: + type: string + scope: + description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*". type: string - operations: - description: Operations is the operations the admission - hook cares about - CREATE, UPDATE, DELETE, CONNECT or - * for all of those operations and any future admission - operations that are added. If '*' is present, the length - of the slice must be one. Required. - type: array - items: + sideEffects: + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + type: integer + format: int32 + type: + description: WebhookAdmissionType is the type of admission webhooks supported by OLM + type: string + enum: + - ValidatingAdmissionWebhook + - MutatingAdmissionWebhook + - ConversionWebhook + webhookPath: + type: string + status: + description: ClusterServiceVersionStatus represents information about the status of a pod. Status may trail the actual state of a system. + type: object + properties: + certsLastUpdated: + description: Last time the owned APIService certs were updated + type: string + format: date-time + certsRotateAt: + description: Time the owned APIService certs will rotate next + type: string + format: date-time + conditions: + description: List of conditions, a history of state transitions + type: array + items: + description: Conditions appear in the status as a record of state transitions on the ClusterServiceVersion + type: object + properties: + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Current condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + requirementStatus: + description: The status of each requirement for this CSV + type: array + items: + type: object + required: + - group + - kind + - message + - name + - status + - version + properties: + dependents: + type: array + items: + description: DependentStatus is the status for a dependent requirement (to prevent infinite nesting) + type: object + required: + - group + - kind + - status + - version + properties: + group: type: string - resources: - description: "Resources is a list of resources this rule - applies to. \n For example: 'pods' means pods. 'pods/log' - means the log subresource of pods. '*' means all resources, - but not subresources. 'pods/*' means all subresources - of pods. '*/scale' means all scale subresources. '*/*' - means all resources and their subresources. \n If wildcard - is present, the validation rule will ensure resources - do not overlap with each other. \n Depending on the - enclosing object, subresources might not be allowed. - Required." - type: array - items: + kind: type: string - scope: - description: scope specifies the scope of this rule. Valid - values are "Cluster", "Namespaced", and "*" "Cluster" - means that only cluster-scoped resources will match - this rule. Namespace API objects are cluster-scoped. - "Namespaced" means that only namespaced resources will - match this rule. "*" means that there are no scope restrictions. - Subresources match the scope of their parent resource. - Default is "*". - type: string - sideEffects: - type: string - targetPort: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - timeoutSeconds: - type: integer - format: int32 - type: - description: WebhookAdmissionType is the type of admission webhooks - supported by OLM - type: string - enum: - - ValidatingAdmissionWebhook - - MutatingAdmissionWebhook - - ConversionWebhook - webhookPath: - type: string - status: - description: ClusterServiceVersionStatus represents information about - the status of a pod. Status may trail the actual state of a system. - type: object - properties: - certsLastUpdated: - description: Last time the owned APIService certs were updated - type: string - format: date-time - certsRotateAt: - description: Time the owned APIService certs will rotate next - type: string - format: date-time - conditions: - description: List of conditions, a history of state transitions - type: array - items: - description: Conditions appear in the status as a record of state - transitions on the ClusterServiceVersion - type: object - properties: - lastTransitionTime: - description: Last time the status transitioned from one status - to another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about - why the ClusterServiceVersion is in this condition. - type: string - phase: - description: Condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about - why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - lastTransitionTime: - description: Last time the status transitioned from one status to - another. - type: string - format: date-time - lastUpdateTime: - description: Last time we updated the status - type: string - format: date-time - message: - description: A human readable message indicating details about why - the ClusterServiceVersion is in this condition. - type: string - phase: - description: Current condition of the ClusterServiceVersion - type: string - reason: - description: A brief CamelCase message indicating details about why - the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' - type: string - requirementStatus: - description: The status of each requirement for this CSV - type: array - items: - type: object - required: - - group - - kind - - message - - name - - status - - version - properties: - dependents: - type: array - items: - description: DependentStatus is the status for a dependent - requirement (to prevent infinite nesting) - type: object - required: - - group - - kind - - status - - version - properties: - group: - type: string - kind: - type: string - message: - type: string - status: - description: StatusReason is a camelcased reason for the - status of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - group: - type: string - kind: - type: string - message: - type: string - name: - type: string - status: - description: StatusReason is a camelcased reason for the status - of a RequirementStatus or DependentStatus - type: string - uuid: - type: string - version: - type: string - served: true - storage: true - subresources: - status: {} + message: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + group: + type: string + kind: + type: string + message: + type: string + name: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + served: true + storage: true + subresources: + status: {} diff --git a/crds/operators.coreos.com_installplans.yaml b/crds/operators.coreos.com_installplans.yaml index 62b85efef..a57681d57 100644 --- a/crds/operators.coreos.com_installplans.yaml +++ b/crds/operators.coreos.com_installplans.yaml @@ -9,295 +9,247 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: InstallPlan listKind: InstallPlanList plural: installplans shortNames: - - ip + - ip singular: installplan scope: Namespaced versions: - - additionalPrinterColumns: - - description: The first CSV in the list of clusterServiceVersionNames - jsonPath: .spec.clusterServiceVersionNames[0] - name: CSV - type: string - - description: The approval mode - jsonPath: .spec.approval - name: Approval - type: string - - jsonPath: .spec.approved - name: Approved - type: boolean - name: v1alpha1 - schema: - openAPIV3Schema: - description: InstallPlan defines the installation of a set of operators. - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: InstallPlanSpec defines a set of Application resources to - be installed - type: object - required: - - approval - - approved - - clusterServiceVersionNames - properties: - approval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - approved: - type: boolean - clusterServiceVersionNames: - type: array - items: + - additionalPrinterColumns: + - description: The first CSV in the list of clusterServiceVersionNames + jsonPath: .spec.clusterServiceVersionNames[0] + name: CSV + type: string + - description: The approval mode + jsonPath: .spec.approval + name: Approval + type: string + - jsonPath: .spec.approved + name: Approved + type: boolean + name: v1alpha1 + schema: + openAPIV3Schema: + description: InstallPlan defines the installation of a set of operators. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: InstallPlanSpec defines a set of Application resources to be installed + type: object + required: + - approval + - approved + - clusterServiceVersionNames + properties: + approval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". type: string - generation: - type: integer - source: - type: string - sourceNamespace: - type: string - status: - description: "InstallPlanStatus represents the information about the status - of steps required to complete installation. \n Status may trail the - actual state of a system." - type: object - required: - - catalogSources - - phase - properties: - attenuatedServiceAccountRef: - description: AttenuatedServiceAccountRef references the service account - that is used to do scoped operator install. - type: object - properties: - apiVersion: - description: API version of the referent. + approved: + type: boolean + clusterServiceVersionNames: + type: array + items: type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - bundleLookups: - description: BundleLookups is the set of in-progress requests to pull - and unpackage bundle content to the cluster. - type: array - items: - description: BundleLookup is a request to pull and unpackage the - content of a bundle to the cluster. + generation: + type: integer + source: + type: string + sourceNamespace: + type: string + status: + description: "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system." + type: object + required: + - catalogSources + - phase + properties: + attenuatedServiceAccountRef: + description: AttenuatedServiceAccountRef references the service account that is used to do scoped operator install. type: object - required: - - catalogSourceRef - - identifier - - path - - replaces properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to the CatalogSource - the bundle path was resolved from. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - conditions: - description: Conditions represents the overall state of a BundleLookup. - type: array - items: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + bundleLookups: + description: BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster. + type: array + items: + description: BundleLookup is a request to pull and unpackage the content of a bundle to the cluster. + type: object + required: + - catalogSourceRef + - identifier + - path + - replaces + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from. type: object - required: - - status - - type properties: - lastTransitionTime: - description: Last time the condition transitioned from - one status to another. + apiVersion: + description: API version of the referent. type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed. + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string - reason: - description: The reason for the condition's last transition. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - status: - description: Status of the condition, one of True, False, - Unknown. + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - type: - description: Type of condition. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' type: string - identifier: - description: Identifier is the catalog-unique name of the operator - (the name of the CSV for bundles that contain CSVs) - type: string - path: - description: Path refers to the location of a bundle to pull. - It's typically an image reference. - type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + conditions: + description: Conditions represents the overall state of a BundleLookup. + type: array + items: + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed. + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + identifier: + description: Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs) + type: string + path: + description: Path refers to the location of a bundle to pull. It's typically an image reference. + type: string + properties: + description: The effective properties of the unpacked bundle. + type: string + replaces: + description: Replaces is the name of the bundle to replace with the one found at Path. + type: string + catalogSources: + type: array + items: + type: string + conditions: + type: array + items: + description: InstallPlanCondition represents the overall status of the execution of an InstallPlan. + type: object properties: - description: The effective properties of the unpacked bundle. - type: string - replaces: - description: Replaces is the name of the bundle to replace with - the one found at Path. - type: string - catalogSources: - type: array - items: + lastTransitionTime: + type: string + format: date-time + lastUpdateTime: + type: string + format: date-time + message: + type: string + reason: + description: ConditionReason is a camelcased reason for the state transition. + type: string + status: + type: string + type: + description: InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole. + type: string + phase: + description: InstallPlanPhase is the current status of a InstallPlan as a whole. type: string - conditions: - type: array - items: - description: InstallPlanCondition represents the overall status - of the execution of an InstallPlan. - type: object - properties: - lastTransitionTime: - type: string - format: date-time - lastUpdateTime: - type: string - format: date-time - message: - type: string - reason: - description: ConditionReason is a camelcased reason for the - state transition. - type: string - status: - type: string - type: - description: InstallPlanConditionType describes the state of - an InstallPlan at a certain point as a whole. - type: string - phase: - description: InstallPlanPhase is the current status of a InstallPlan - as a whole. - type: string - plan: - type: array - items: - description: Step represents the status of an individual step in - an InstallPlan. - type: object - required: - - resolving - - resource - - status - properties: - resolving: - type: string - resource: - description: StepResource represents the status of a resource - to be tracked by an InstallPlan. - type: object - required: - - group - - kind - - name - - sourceName - - sourceNamespace - - version - properties: - group: - type: string - kind: - type: string - manifest: - type: string - name: - type: string - sourceName: - type: string - sourceNamespace: - type: string - version: - type: string - status: - description: StepStatus is the current status of a particular - resource an in InstallPlan - type: string - served: true - storage: true - subresources: - status: {} + plan: + type: array + items: + description: Step represents the status of an individual step in an InstallPlan. + type: object + required: + - resolving + - resource + - status + properties: + resolving: + type: string + resource: + description: StepResource represents the status of a resource to be tracked by an InstallPlan. + type: object + required: + - group + - kind + - name + - sourceName + - sourceNamespace + - version + properties: + group: + type: string + kind: + type: string + manifest: + type: string + name: + type: string + sourceName: + type: string + sourceNamespace: + type: string + version: + type: string + status: + description: StepStatus is the current status of a particular resource an in InstallPlan + type: string + served: true + storage: true + subresources: + status: {} diff --git a/crds/operators.coreos.com_operatorconditions.yaml b/crds/operators.coreos.com_operatorconditions.yaml index 0804de47a..3b3a7cc0b 100644 --- a/crds/operators.coreos.com_operatorconditions.yaml +++ b/crds/operators.coreos.com_operatorconditions.yaml @@ -14,185 +14,124 @@ spec: singular: operatorcondition scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorCondition is a Custom Resource of type `OperatorCondition` - which is used to convey information to OLM about the state of an operator. - type: object - required: - - metadata - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorConditionSpec allows a cluster admin to convey information - about the state of an operator to OLM, potentially overriding state - reported by the operator. - type: object - properties: - deployments: - type: array - items: - type: string - overrides: - type: array - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - serviceAccounts: - type: array - items: - type: string - status: - description: OperatorConditionStatus allows an operator to convey information - its state to OLM. The status may trail the actual state of a system. - type: object - properties: - conditions: - type: array - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - served: true - storage: true - subresources: - status: {} + - name: v1 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorConditionSpec allows a cluster admin to convey information about the state of an operator to OLM, potentially overriding state reported by the operator. + type: object + properties: + deployments: + type: array + items: + type: string + overrides: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows an operator to convey information its state to OLM. The status may trail the actual state of a system. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + served: true + storage: true + subresources: + status: {} diff --git a/crds/operators.coreos.com_operatorgroups.yaml b/crds/operators.coreos.com_operatorgroups.yaml index dcd4c3ca2..54f09643f 100644 --- a/crds/operators.coreos.com_operatorgroups.yaml +++ b/crds/operators.coreos.com_operatorgroups.yaml @@ -9,296 +9,224 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: OperatorGroup listKind: OperatorGroupList plural: operatorgroups shortNames: - - og + - og singular: operatorgroup scope: Namespaced versions: - - name: v1 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - type: array - items: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - additionalProperties: - type: string - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - x-kubernetes-list-type: set - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - x-kubernetes-list-type: set - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + x-kubernetes-list-type: set + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: true - subresources: - status: {} - - name: v1alpha2 - schema: - openAPIV3Schema: - description: OperatorGroup is the unit of multitenancy for OLM managed operators. - It constrains the installation of operators in its namespace to a specified - set of target namespaces. - type: object - required: - - metadata - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorGroupSpec is the spec for an OperatorGroup resource. - type: object - properties: - selector: - description: Selector selects the OperatorGroup's target namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - additionalProperties: + x-kubernetes-list-type: set + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. type: string - serviceAccountName: - description: ServiceAccountName is the admin specified service account - which will be used to deploy operator(s) in this operator group. - type: string - staticProvidedAPIs: - description: Static tells OLM not to update the OperatorGroup's providedAPIs - annotation - type: boolean - targetNamespaces: - description: TargetNamespaces is an explicit set of namespaces to - target. If it is set, Selector is ignored. - type: array - items: - type: string - status: - description: OperatorGroupStatus is the status for an OperatorGroupResource. - type: object - required: - - lastUpdated - properties: - lastUpdated: - description: LastUpdated is a timestamp of the last time the OperatorGroup's - status was Updated. - type: string - format: date-time - namespaces: - description: Namespaces is the set of target namespaces for the OperatorGroup. - type: array - items: + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. type: string - serviceAccountRef: - description: ServiceAccountRef references the service account object - specified. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: type: string - served: true - storage: false - subresources: - status: {} + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: false + subresources: + status: {} diff --git a/crds/operators.coreos.com_operators.yaml b/crds/operators.coreos.com_operators.yaml index 78a501574..a1226a521 100644 --- a/crds/operators.coreos.com_operators.yaml +++ b/crds/operators.coreos.com_operators.yaml @@ -9,168 +9,129 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Operator listKind: OperatorList plural: operators singular: operator scope: Cluster versions: - - name: v1 - schema: - openAPIV3Schema: - description: Operator represents a cluster operator. - type: object - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorSpec defines the desired state of Operator - type: object - status: - description: OperatorStatus defines the observed state of an Operator - and its components - type: object - properties: - components: - description: Components describes resources that compose the operator. - type: object - required: - - labelSelector - properties: - labelSelector: - description: LabelSelector is a label query over a set of resources - used to select the operator's components - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - refs: - description: Refs are a set of references to the operator's component - resources, selected with LabelSelector. - type: array - items: - description: RichReference is a reference to a resource, enriched - with its status conditions. + - name: v1 + schema: + openAPIV3Schema: + description: Operator represents a cluster operator. + type: object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorSpec defines the desired state of Operator + type: object + status: + description: OperatorStatus defines the observed state of an Operator and its components + type: object + properties: + components: + description: Components describes resources that compose the operator. + type: object + required: + - labelSelector + properties: + labelSelector: + description: LabelSelector is a label query over a set of resources used to select the operator's components type: object properties: - apiVersion: - description: API version of the referent. - type: string - conditions: - description: Conditions represents the latest state of the - component. + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. type: array items: - description: Condition represent the latest available - observations of an component's state. + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. type: object required: - - status - - type + - key + - operator properties: - lastTransitionTime: - description: Last time the condition transitioned - from one status to another. - type: string - format: date-time - lastUpdateTime: - description: Last time the condition was probed - type: string - format: date-time - message: - description: A human readable message indicating details - about the transition. + key: + description: key is the label key that the selector applies to. type: string - reason: - description: The reason for the condition's last transition. + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - status: - description: Status of the condition, one of True, - False, Unknown. - type: string - type: - description: Type of condition. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - served: true - storage: true - subresources: - status: {} + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + refs: + description: Refs are a set of references to the operator's component resources, selected with LabelSelector. + type: array + items: + description: RichReference is a reference to a resource, enriched with its status conditions. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + conditions: + description: Conditions represents the latest state of the component. + type: array + items: + description: Condition represent the latest available observations of an component's state. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} diff --git a/crds/operators.coreos.com_subscriptions.yaml b/crds/operators.coreos.com_subscriptions.yaml index 77e497282..d2fb81fed 100644 --- a/crds/operators.coreos.com_subscriptions.yaml +++ b/crds/operators.coreos.com_subscriptions.yaml @@ -9,2065 +9,1333 @@ spec: group: operators.coreos.com names: categories: - - olm + - olm kind: Subscription listKind: SubscriptionList plural: subscriptions shortNames: - - sub - - subs + - sub + - subs singular: subscription scope: Namespaced versions: - - additionalPrinterColumns: - - description: The package subscribed to - jsonPath: .spec.name - name: Package - type: string - - description: The catalog source for the specified package - jsonPath: .spec.source - name: Source - type: string - - description: The channel of updates to subscribe to - jsonPath: .spec.channel - name: Channel - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: Subscription keeps operators up to date by tracking changes to - Catalogs. - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: SubscriptionSpec defines an Application that can be installed - type: object - required: - - name - - source - - sourceNamespace - properties: - channel: - type: string - config: - description: SubscriptionConfig contains configuration specified for - a subscription. - type: object - properties: - env: - description: Env is a list of environment variables to set in - the container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - required: - - name - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: '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 "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - type: object - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - type: object - required: - - key - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, - metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - resourceFieldRef: - description: 'Selects a resource of the container: only - resources limits and requests (limits.cpu, limits.memory, - limits.ephemeral-storage, requests.cpu, requests.memory - and requests.ephemeral-storage) are currently supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - type: object - required: - - key - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - envFrom: - description: EnvFrom is a list of sources to populate environment - variables in the container. The keys defined within a source - must be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists in - multiple sources, the value associated with the last source - will take precedence. Values defined by an Env with a duplicate - key will take precedence. Immutable. - type: array - items: - description: EnvFromSource represents the source of a set of - ConfigMaps - type: object - properties: - configMapRef: - description: The ConfigMap to select from - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap must be defined - type: boolean - prefix: - description: An optional identifier to prepend to each key - in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret must be defined - type: boolean - nodeSelector: - description: 'NodeSelector is a selector which must be true for - the pod to fit on a node. Selector which must match a node''s - labels for the pod to be scheduled on that node. More info: - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - resources: - description: 'Resources represents compute resources required - by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + - additionalPrinterColumns: + - description: The package subscribed to + jsonPath: .spec.name + name: Package + type: string + - description: The catalog source for the specified package + jsonPath: .spec.source + name: Source + type: string + - description: The channel of updates to subscribe to + jsonPath: .spec.channel + name: Channel + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Subscription keeps operators up to date by tracking changes to Catalogs. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SubscriptionSpec defines an Application that can be installed + type: object + required: + - name + - source + - sourceNamespace + properties: + channel: + type: string + config: + description: SubscriptionConfig contains configuration specified for a subscription. + type: object + properties: + env: + description: Env is a list of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: '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 "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: EnvFrom is a list of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Immutable. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - selector: - description: Selector is the label selector for pods to be configured. - Existing ReplicaSets whose pods are selected by this will be - the ones affected by this deployment. It must match the pod - template's labels. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - type: array - items: + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - tolerations: - description: Tolerations are the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' type: object - properties: - effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, allowed - values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to - the value. Valid operators are Exists and Equal. Defaults - to Equal. Exists is equivalent to wildcard for value, - so that a pod can tolerate all taints of a particular - category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the taint - forever (do not evict). Zero and negative values will - be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - volumeMounts: - description: List of VolumeMounts to set in the container. - type: array - items: - description: VolumeMount describes a mounting of a Volume within - a container. + additionalProperties: + type: string + resources: + description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - mountPath - - name properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - volumes: - description: List of Volumes to set in the podSpec. - type: array - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - type: object - required: - - name - properties: - awsElasticBlockStore: - description: 'AWSElasticBlockStore represents an AWS Disk - resource that is attached to a kubelet''s host machine - and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' - type: integer - format: int32 - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - diskName - - diskURI - properties: - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskName: - description: The Name of the data disk in the blob storage - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - required: - - secretName - - shareName - properties: - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - shareName: - description: Share Name - type: string - cephfs: - description: CephFS represents a Ceph FS mount on the host - that shares a pod's lifetime + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - required: - - monitors - properties: - monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + selector: + description: Selector is the label selector for pods to be configured. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'Optional: SecretRef is reference to the - authentication secret for User, default is empty. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: type: string - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - cinder: - description: 'Cinder represents a cinder volume attached - and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. type: object - required: - - volumeID - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'Optional: points to a secret object containing - parameters used to connect to OpenStack.' - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' + additionalProperties: + type: string + tolerations: + description: Tolerations are the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. + type: integer + format: int64 + value: + description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + volumeMounts: + description: List of VolumeMounts to set in the container. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + volumes: + description: List of Volumes to set in the podSpec. + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - configMap: - description: ConfigMap represents a configMap that should - populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. 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 - 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: - description: Maps a string key to a path within a - volume. + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: object - required: - - key - - path properties: - key: - description: The key to project. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. 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 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its keys - must be defined - type: boolean - csi: - description: CSI (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta feature). - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. - type: string - nodePublishSecretRef: - description: NodePublishSecretRef is a reference to - the secret object containing sensitive information - to pass to the CSI driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. This field is optional, - and may be empty if no secret is required. If the - secret object contains more than one secret, all secret - references are passed. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. - type: object - additionalProperties: - type: string - downwardAPI: - description: DownwardAPI represents downward API about the - pod that should populate this volume - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a Optional: mode bits used - to set permissions on created files by default. Must - be an octal value between 0000 and 0777 or a decimal - value between 0 and 511. YAML accepts both octal and - decimal values, JSON requires decimal values for mode - bits. Defaults to 0644. 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 - items: - description: Items is a list of downward API volume - file - type: array + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. type: object - required: - - path properties: - fieldRef: - description: 'Required: Selects a field of the - pod: only annotations, labels, name and namespace - are supported.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - mode: - description: 'Optional: mode bits used to set - permissions on this file, must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. 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 - path: - description: '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 ''..''' + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, requests.cpu and requests.memory) - are currently supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - description: Specifies the output format of - the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - emptyDir: - description: 'EmptyDir represents a temporary directory - that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: object - properties: - medium: - description: '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: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - description: 'Total amount of local storage required - for this EmptyDir volume. The size limit is also applicable - for memory medium. The maximum usage on memory medium - EmptyDir would be the minimum value between the SizeLimit - specified here and the sum of memory limits of all - containers in a pod. The default is nil which means - that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - ephemeral: - description: "Ephemeral represents a volume that is handled - by a cluster storage driver (Alpha feature). The volume's - lifecycle is tied to the pod that defines it - it will - be created before the pod starts, and deleted when the - pod is removed. \n Use this if: a) the volume is only - needed while the pod runs, b) features of normal volumes - like restoring from snapshot or capacity tracking are - needed, c) the storage driver is specified through a storage - class, and d) the storage driver supports dynamic volume - provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between this - volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs for volumes that persist - for longer than the lifecycle of an individual pod. \n - Use CSI for light-weight local ephemeral volumes if the - CSI driver is meant to be used that way - see the documentation - of the driver for more information. \n A pod can use both - types of ephemeral volumes and persistent volumes at the - same time." - type: object - properties: - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC - to provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the - PVC will be deleted together with the pod. The name - of the PVC will be `-` where - `` is the name from the `PodSpec.Volumes` - array entry. Pod validation will reject the pod if - the concatenated name is not valid for a PVC (for - example, too long). \n An existing PVC with that name - that is not owned by the pod will *not* be used for - the pod to avoid using an unrelated volume by mistake. - Starting the pod is then blocked until the unrelated - PVC is removed. If such a pre-created PVC is meant - to be used by the pod, the PVC has to updated with - an owner reference to the pod once the pod exists. - Normally this should not be necessary, but it may - be useful when manually reconstructing a broken cluster. - \n This field is read-only and no changes will be - made by Kubernetes to the PVC after it has been created. - \n Required, must not be nil." - type: object - required: - - spec - properties: - metadata: - description: May contain labels and annotations - that will be copied into the PVC when creating - it. No other fields are allowed and will be rejected - during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the - PVC that gets created from this template. The - same fields as in a PersistentVolumeClaim are - also valid here. + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field type: object + required: + - path properties: - accessModes: - description: 'AccessModes contains the desired - access modes the volume should have. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - type: array - items: - type: string - dataSource: - description: 'This field can be used to specify - either: * An existing VolumeSnapshot object - (snapshot.storage.k8s.io/VolumeSnapshot) * - An existing PVC (PersistentVolumeClaim) * - An existing custom resource that implements - data population (Alpha) In order to use custom - resource types that implement data population, - the AnyVolumeDataSource feature gate must - be enabled. If the provisioner or an external - controller can support the specified data - source, it will create a new volume based - on the contents of the specified data source.' + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' type: object required: - - kind - - name + - fieldPath properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. If APIGroup - is not specified, the specified Kind must - be in the core API group. For any other - third-party types, APIGroup is required. + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". type: string - kind: - description: Kind is the type of resource - being referenced + fieldPath: + description: Path of the field to select in the specified API version. type: string - name: - description: Name is the name of resource - being referenced - type: string - resources: - description: 'Resources represents the minimum - resources the volume should have. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: '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 ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' type: object + required: + - resource properties: - limits: - description: 'Limits describes the maximum - amount of compute resources allowed. More - info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes the minimum - amount of compute resources required. - If Requests is omitted for a container, - it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: - type: integer - type: string - x-kubernetes-int-or-string: true - selector: - description: A label query over volumes to consider - for binding. - type: object - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - storageClassName: - description: 'Name of the StorageClass required - by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of - volume is required by the claim. Value of - Filesystem is implied when not included in - claim spec. - type: string - volumeName: - description: VolumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - fc: - description: FC represents a Fibre Channel resource that - is attached to a kubelet's host machine and then exposed - to the pod. - type: object - properties: - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. TODO: how do we prevent errors in the - filesystem from compromising the machine' - type: string - lun: - description: 'Optional: FC target lun number' - type: integer - format: int32 - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. - type: object - required: - - driver - properties: - driver: - description: Driver is the name of the driver to use - for this volume. - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - options: - description: 'Optional: Extra command options if any.' - type: object - additionalProperties: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - secretRef: - description: 'Optional: SecretRef is reference to the - secret object containing sensitive information to - pass to the plugin scripts. This may be empty if no - secret object is specified. If the secret object contains - more than one secret, all secrets are passed to the - plugin scripts.' - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - flocker: - description: Flocker represents a Flocker volume attached - to a kubelet's host machine. This depends on the Flocker - control service being running - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - gcePersistentDisk: - description: 'GCEPersistentDisk represents a GCE Disk resource - that is attached to a kubelet''s host machine and then - exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: object - required: - - pdName - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: integer - format: int32 - pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - gitRepo: - description: 'GitRepo represents a git repository at a particular - revision. DEPRECATED: GitRepo is deprecated. To provision - a container with a git repo, mount an EmptyDir into an - InitContainer that clones the repo using git, then mount - the EmptyDir into the Pod''s container.' - type: object - required: - - repository - properties: - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - repository: - description: Repository URL - type: string - revision: - description: Commit hash for the specified revision. - type: string - glusterfs: - description: 'Glusterfs represents a Glusterfs mount on - the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' - type: object - required: - - endpoints - - path - properties: - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - hostPath: - description: '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: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict who can use host - directory mounts and who can/can not mount host directories - as read/write.' - type: object - required: - - path - properties: - path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - iscsi: - description: 'ISCSI represents an ISCSI Disk resource that - is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' - type: object - required: - - iqn - - lun - - targetPortal - properties: - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. - type: string - iqn: - description: Target iSCSI Qualified Name. - type: string - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: integer - format: int32 - portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: array - items: + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: '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: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: CHAP Secret for iSCSI target and initiator - authentication - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'NFS represents an NFS mount on the host that - shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: object - required: - - path - - server - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - persistentVolumeClaim: - description: 'PersistentVolumeClaimVolumeSource represents - a reference to a PersistentVolumeClaim in the same namespace. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: object - required: - - claimName - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - photonPersistentDisk: - description: PhotonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - type: object - required: - - pdID - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - portworxVolume: - description: PortworxVolume represents a portworx volume - attached and mounted on kubelets host machine - type: object - required: - - volumeID - properties: - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - projected: - description: Items for all in one resources secrets, configmaps, - and downward API - type: object - properties: - defaultMode: - description: Mode bits used to set permissions on created - files by default. Must be an octal value between 0000 - and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires - decimal values for mode bits. 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: - description: Projection that may be projected along - with other supported volume types + sizeLimit: + description: 'Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." type: object + required: + - spec properties: - configMap: - description: information about the configMap data - to project + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. type: object - 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: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - 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 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its keys must be defined - type: boolean - downwardAPI: - description: information about the downwardAPI - data to project + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. type: object properties: - items: - description: Items is a list of DownwardAPIVolume - file + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - required: - - path - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name and namespace are supported.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version of the schema - the FieldPath is written in terms - of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to - select in the specified API version. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file, must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - 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 - path: - description: '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 ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of - the container: only resources limits - and requests (limits.cpu, limits.memory, - requests.cpu and requests.memory) - are currently supported.' + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + selector: + description: A label query over volumes to consider for binding. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. type: object required: - - resource + - key + - operator properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' + key: + description: key is the label key that the selector applies to. type: string - divisor: - description: Specifies the output - format of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource - to select' + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string - secret: - description: information about the secret data - to project - type: object - 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: - description: Maps a string key to a path - within a volume. - type: object - required: - - key - - path - properties: - key: - description: The key to project. - type: string - mode: - description: 'Optional: mode bits used - to set permissions on this file. Must - be an octal value between 0000 and - 0777 or a decimal value between 0 - and 511. YAML accepts both octal and - decimal values, JSON requires decimal - values for mode bits. If not specified, - the volume defaultMode will be used. - 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 - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - serviceAccountToken: - description: information about the serviceAccountToken - data to project - type: object - required: - - path - properties: - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. - type: integer - format: int64 - path: - description: Path is the path relative to - the mount point of the file to project the - token into. + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. type: string - quobyte: - description: Quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - type: object - required: - - registry - - volume - properties: - group: - description: Group to map volume access to Default is - no group - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. - type: boolean - registry: - description: 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 - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - rbd: - description: 'RBD represents a Rados Block Device mount - on the host that shares a pod''s lifetime. More info: - https://examples.k8s.io/volumes/rbd/README.md' - type: object - required: - - image - - monitors - properties: - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'SecretRef is name of the authentication - secret for RBDUser. If provided overrides keyring. - Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - scaleIO: - description: ScaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - type: object - required: - - gateway - - secretRef - - system - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef references to the secret for - ScaleIO user and other sensitive information. If this - is not provided, Login operation will fail. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. - type: string - secret: - description: 'Secret represents a secret that should populate - this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: object - properties: - defaultMode: - description: 'Optional: mode bits used to set permissions - on created files by default. Must be an octal value - between 0000 and 0777 or a decimal value between 0 - and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults - to 0644. 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 - 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: - description: Maps a string key to a path within a - volume. + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' type: object - required: - - key - - path properties: - key: - description: The key to project. + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - mode: - description: 'Optional: mode bits used to set - permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal - values, JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. 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 - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: '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: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string - optional: - description: Specify whether the Secret or its keys - must be defined - type: boolean - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - storageos: - description: StorageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - type: object - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: SecretRef specifies the secret to use for - obtaining the StorageOS API credentials. If not specified, - default values will be attempted. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. 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: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: '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 ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + secret: + description: information about the secret data to project + type: object + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: 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 + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. - type: string - vsphereVolume: - description: VsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - type: object - required: - - volumePath - properties: - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - installPlanApproval: - description: Approval is the user approval policy for an InstallPlan. - It must be one of "Automatic" or "Manual". - type: string - name: - type: string - source: - type: string - sourceNamespace: - type: string - startingCSV: - type: string - status: - type: object - required: - - lastUpdated - properties: - catalogHealth: - description: CatalogHealth contains the Subscription's view of its - relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions - related to CatalogSources. - type: array - items: - description: SubscriptionCatalogHealth describes the health of a - CatalogSource the Subscription knows about. + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. 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 + 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: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. 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 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + installPlanApproval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + name: + type: string + source: + type: string + sourceNamespace: + type: string + startingCSV: + type: string + status: + type: object + required: + - lastUpdated + properties: + catalogHealth: + description: CatalogHealth contains the Subscription's view of its relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions related to CatalogSources. + type: array + items: + description: SubscriptionCatalogHealth describes the health of a CatalogSource the Subscription knows about. + type: object + required: + - catalogSourceRef + - healthy + - lastUpdated + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to a CatalogSource. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + healthy: + description: Healthy is true if the CatalogSource is healthy; false otherwise. + type: boolean + lastUpdated: + description: LastUpdated represents the last time that the CatalogSourceHealth changed + type: string + format: date-time + conditions: + description: Conditions is a list of the latest available observations about a Subscription's current state. + type: array + items: + description: SubscriptionCondition represents the latest available observations of a Subscription's state. + type: object + required: + - status + - type + properties: + lastHeartbeatTime: + description: LastHeartbeatTime is the last time we got an update on a given condition + type: string + format: date-time + lastTransitionTime: + description: LastTransitionTime is the last time the condition transit from one status to another + type: string + format: date-time + message: + description: Message is a human-readable message indicating details about last transition. + type: string + reason: + description: Reason is a one-word CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of Subscription condition. + type: string + currentCSV: + description: CurrentCSV is the CSV the Subscription is progressing to. + type: string + installPlanGeneration: + description: InstallPlanGeneration is the current generation of the installplan + type: integer + installPlanRef: + description: InstallPlanRef is a reference to the latest InstallPlan that contains the Subscription's current CSV. type: object - required: - - catalogSourceRef - - healthy - - lastUpdated properties: - catalogSourceRef: - description: CatalogSourceRef is a reference to a CatalogSource. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - healthy: - description: Healthy is true if the CatalogSource is healthy; - false otherwise. - type: boolean - lastUpdated: - description: LastUpdated represents the last time that the CatalogSourceHealth - changed + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string - format: date-time - conditions: - description: Conditions is a list of the latest available observations - about a Subscription's current state. - type: array - items: - description: SubscriptionCondition represents the latest available - observations of a Subscription's state. + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + installedCSV: + description: InstalledCSV is the CSV currently installed by the Subscription. + type: string + installplan: + description: 'Install is a reference to the latest InstallPlan generated for the Subscription. DEPRECATED: InstallPlanRef' type: object required: - - status - - type + - apiVersion + - kind + - name + - uuid properties: - lastHeartbeatTime: - description: LastHeartbeatTime is the last time we got an update - on a given condition - type: string - format: date-time - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transit from one status to another + apiVersion: type: string - format: date-time - message: - description: Message is a human-readable message indicating - details about last transition. + kind: type: string - reason: - description: Reason is a one-word CamelCase reason for the condition's - last transition. + name: type: string - status: - description: Status is the status of the condition, one of True, - False, Unknown. + uuid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. type: string - type: - description: Type is the type of Subscription condition. - type: string - currentCSV: - description: CurrentCSV is the CSV the Subscription is progressing - to. - type: string - installPlanGeneration: - description: InstallPlanGeneration is the current generation of the - installplan - type: integer - installPlanRef: - description: InstallPlanRef is a reference to the latest InstallPlan - that contains the Subscription's current CSV. - type: object - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - installedCSV: - description: InstalledCSV is the CSV currently installed by the Subscription. - type: string - installplan: - description: 'Install is a reference to the latest InstallPlan generated - for the Subscription. DEPRECATED: InstallPlanRef' - type: object - required: - - apiVersion - - kind - - name - - uuid - properties: - apiVersion: - type: string - kind: - type: string - name: - type: string - uuid: - description: UID is a type that holds unique ID values, including - UUIDs. Because we don't ONLY use UUIDs, this is an alias to - string. Being a type captures intent and helps make sure that - UIDs and names do not get conflated. - type: string - lastUpdated: - description: LastUpdated represents the last time that the Subscription - status was updated. - type: string - format: date-time - reason: - description: Reason is the reason the Subscription was transitioned - to its current state. - type: string - state: - description: State represents the current state of the Subscription - type: string - served: true - storage: true - subresources: - status: {} + lastUpdated: + description: LastUpdated represents the last time that the Subscription status was updated. + type: string + format: date-time + reason: + description: Reason is the reason the Subscription was transitioned to its current state. + type: string + state: + description: State represents the current state of the Subscription + type: string + served: true + storage: true + subresources: + status: {} diff --git a/crds/zz_defs.go b/crds/zz_defs.go index 6231312ca..df9f39aeb 100644 --- a/crds/zz_defs.go +++ b/crds/zz_defs.go @@ -84,7 +84,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\xdd\x8f\xdb\xb8\x11\x7f\xdf\xbf\x62\x80\x3e\xe4\x65\xad\xbd\xf4\x0e\x45\x61\x5c\x0f\x48\x77\xfb\x61\xf4\x72\x59\xec\x26\x01\xfa\x38\x26\xc7\x12\x6f\x29\x52\xc7\xa1\xec\xf8\x8a\xfe\xef\xc5\x90\x92\xfc\x25\xd9\xeb\xa0\xe1\x4b\x62\x8a\x9c\xef\xf9\xcd\x0c\x17\x1b\xf3\x99\x02\x1b\xef\xe6\x80\x8d\xa1\x2f\x91\x9c\xfc\xe2\xe2\xe5\xcf\x5c\x18\x7f\xb7\x7e\x7b\xf3\x62\x9c\x9e\xc3\x7d\xcb\xd1\xd7\x4f\xc4\xbe\x0d\x8a\x1e\x68\x65\x9c\x89\xc6\xbb\x9b\x9a\x22\x6a\x8c\x38\xbf\x01\x40\xe7\x7c\x44\xd9\x66\xf9\x09\xa0\xbc\x8b\xc1\x5b\x4b\x61\x56\x92\x2b\x5e\xda\x25\x2d\x5b\x63\x35\x85\x44\xbc\x67\xbd\xfe\xae\xf8\xa1\x78\x7b\x03\xa0\x02\xa5\xeb\x1f\x4d\x4d\x1c\xb1\x6e\xe6\xe0\x5a\x6b\x6f\x00\x1c\xd6\x34\x07\x85\x11\xad\x2f\xb3\x10\x5c\xf8\x86\x02\x46\x1f\xb8\x50\x3e\x90\x97\x7f\xea\x1b\x6e\x48\x09\xf7\x32\xf8\xb6\x99\xc3\xe8\x99\x4c\xaf\x17\x12\x23\x95\x3e\x98\xfe\xf7\x0c\xbc\xad\xd3\xff\x3a\xd5\x33\xd3\xe7\xc4\x34\xed\x5b\xc3\xf1\x5f\xa7\xdf\x7e\x36\x1c\xd3\xf7\xc6\xb6\x01\xed\xb1\xb8\xe9\x13\x57\x3e\xc4\x5f\x76\xcc\x67\x72\x88\x83\xca\x1f\x8d\x2b\x5b\x8b\xe1\xe8\xe6\x0d\x00\x2b\xdf\xd0\x1c\xd2\xc5\x06\x15\xe9\x1b\x80\xce\x7c\x89\xd0\x0c\x50\xeb\xe4\x10\xb4\x8f\xc1\xb8\x48\xe1\xde\xdb\xb6\x76\x03\x1b\x4d\xac\x82\x69\x62\x32\xf8\xc7\x8a\xa0\x09\x14\xe3\x36\x19\x02\xfc\x0a\x62\x45\x3d\xd7\x74\x03\xe0\x57\xf6\xee\x11\x63\x35\x87\x42\x6c\x5a\x68\xc3\x8d\xc5\xad\xc8\xd0\x9d\xc8\x4e\x79\xc8\xfb\xdd\x5e\xdc\x8a\xa0\x1c\x83\x71\xe5\x14\x6b\x39\xf3\x3a\x9e\xd9\x00\x1f\xb7\xcd\x21\xcb\xbd\x8d\xd7\xf0\x6b\xda\xa5\x35\x5c\x51\x78\x1d\xd3\xe1\xf8\x01\xcf\xc7\xa3\xdd\x11\xc6\x7b\x84\xfa\xb4\x28\x4e\x42\xfa\x80\xe8\xbb\xf2\x50\x0f\x8d\x31\x6f\xe4\xcf\xeb\xb7\x68\x9b\x0a\xdf\xe6\xe8\x50\x15\xd5\x38\xef\xce\xfb\x86\xdc\xbb\xc7\xc5\xe7\xef\x9f\x0f\xb6\xe1\x50\xfb\x83\xf8\x04\xc3\x80\x10\xa8\xf1\x6c\xa2\x0f\x5b\xb1\xc6\xfd\xf3\x67\xbe\x85\xfb\xa7\x07\xbe\x05\x74\x7a\x48\x17\x68\x50\xbd\x60\x49\x5c\x0c\x84\xb3\x84\x7e\xf9\x2b\xa9\x38\x6c\x06\xfa\xad\x35\x81\xf4\x8e\xff\x0c\x7a\xdd\xf7\xb6\xc4\xae\xc3\xcf\x26\x08\x97\x38\x24\x5c\x5e\x7b\x58\xb4\xb7\x7b\xa4\xcf\x1b\x51\x39\x9f\x02\x2d\x20\x44\x9c\x1c\xda\xe5\x02\xe9\xce\x4a\xd9\xd1\x86\x45\xdb\x40\x4c\x2e\xc3\xd2\x01\x61\x90\x43\xe8\x3a\x8d\x0a\x78\xa6\x20\x64\x24\x45\x5b\xab\x05\xbb\xd6\x14\x22\x04\x52\xbe\x74\xe6\xf7\x81\x36\x43\xf4\x89\xa9\xc5\x48\x1c\x8f\x68\xa6\xdc\x73\x68\x61\x8d\xb6\xa5\x6c\xd4\x1a\xb7\x10\x48\xb8\x40\xeb\xf6\xe8\xa5\x23\x5c\xc0\x7b\x1f\x08\x8c\x5b\xf9\x39\x54\x31\x36\x3c\xbf\xbb\x2b\x4d\xec\x31\x58\xf9\xba\x6e\x9d\x89\xdb\xbb\x04\xa7\x66\xd9\x0a\x9c\xdd\x69\x5a\x93\xbd\x63\x53\xce\x30\xa8\xca\x44\x52\xb1\x0d\x74\x87\x8d\x99\x25\xd1\x5d\xc2\xe1\xa2\xd6\x7f\x08\x1d\x6a\xf3\x9b\x03\x59\x4f\x02\x38\xaf\x04\x7a\x67\x3c\x20\xc0\x97\x23\x29\x5f\xcd\x5a\xec\x0c\x2d\x5b\x62\x9d\xa7\xbf\x3d\x7f\x84\x9e\x75\x72\xc6\xb1\xf5\x93\xdd\x77\x17\x79\xe7\x02\x31\x98\x71\x2b\x0a\xd9\x89\xab\xe0\xeb\x44\x93\x9c\x6e\xbc\x71\x31\x27\xb1\x35\xe4\x8e\xcd\xcf\xed\xb2\x36\x91\x53\x5c\x12\x47\xf1\x55\x01\xf7\xa9\x30\xc1\x92\xa0\x6d\x24\xc3\x74\x01\x0b\x07\xf7\x58\x93\xbd\x47\xa6\x6f\xee\x00\xb1\x34\xcf\xc4\xb0\xaf\x73\xc1\x7e\x4d\x3d\x3e\x7c\x94\x7f\x00\x7d\xbd\xbb\x78\x70\x2c\x59\x21\x67\xe7\x31\xca\xe6\x35\x9e\xa7\xb2\x50\xeb\x40\x7c\xb2\x7d\x92\xac\xf9\x58\x8e\x96\xca\xb3\xf8\x0d\x23\x7c\xf8\xf9\x3d\x28\x74\xd0\x32\x49\x2a\x29\xef\x9c\x04\x42\xf4\x80\x52\x95\x66\xf4\xc5\x70\x3c\xb4\xc8\x4e\x83\xd2\x70\x0c\xdb\x02\xfe\xee\x43\x8d\x71\x0e\x3f\xf6\x5b\xb3\xc4\xc0\x07\x30\xcd\x4f\xf3\x1f\x1b\x1f\xe2\x4f\xf0\xc1\xd9\xad\xb0\xd1\xb0\xa9\xc8\xc1\xf3\xb8\x9e\x79\xfd\x65\xef\xf3\x3f\x42\xa3\x0a\x58\x94\xce\x87\xfe\xae\x44\xdc\xa2\xc6\x92\x60\x65\xc8\xa6\x0c\x60\x8a\xc5\x9b\x13\x4a\x13\x3e\x85\xdc\x0e\xad\x4c\xf9\x1e\x9b\x0b\x86\xbb\xef\xcf\x09\x17\x61\xbc\x5f\xa4\x77\x1f\xa3\x4f\x21\x2d\xea\x45\x3f\xa2\xd1\x12\xd5\x0b\x60\xc7\xb5\xc6\x66\xc6\x29\xbd\xf6\x8c\x38\x69\x9f\x03\x6b\xdc\xf7\x04\x46\x78\xf8\xb0\x77\x70\xd1\x61\x5f\x71\x8d\x51\xf6\x35\xbf\xea\xde\xae\x1d\xb9\x60\xce\xf7\xc7\xf5\xe8\x15\xd4\x8d\x9a\x16\x67\x24\xb3\x60\x32\xbb\x20\x65\xd8\x12\x99\xfe\xf4\xc3\xa8\x10\x52\x2f\xb5\xc1\x38\x16\x95\xd3\x19\x08\xc9\xbf\x3d\xd1\xb1\xaf\x67\xd5\x83\x84\x32\x1d\xdb\xab\x6f\x1b\xc9\x83\x0b\x46\xcf\xb9\x22\x99\xef\x86\xa6\x62\xd6\x47\x5e\x1a\x0c\xd0\x38\x0a\x99\x96\x84\xb2\x71\x1c\xd1\x45\xd3\x77\x40\x87\x0b\x87\xa8\xed\xa3\x78\x63\x62\xf5\xda\x08\x4e\xf9\x3c\x42\x75\xb1\x82\xae\xf8\xdc\xa6\xdc\xea\x70\x6d\x97\xe2\x26\x43\xc0\x55\x01\xdd\x04\xe3\x83\x89\xdb\x4b\xe8\xf8\xd8\x9d\xeb\xb8\x21\xb3\x29\x9d\x20\xe5\x86\x4c\x59\xc5\xbe\xcb\xe8\x7a\x55\xe0\xdd\xfc\x71\x24\x8a\xef\x59\x9a\xdf\xa5\xd0\x52\x0d\xec\x33\xd2\x9a\x98\x80\x76\x49\x62\x70\x6e\x6b\xd2\xb0\xdc\x26\xaa\x9a\x1a\x72\x9a\x9c\xda\x8e\xa2\x2c\x7b\xbb\xa6\x50\xc0\x27\x16\x4f\xc3\x3f\x4d\x29\xdd\x73\x27\x98\x71\xda\xc8\xd0\xc4\x99\x49\x2a\xd1\x17\xa5\x34\x2c\xa6\x5e\x51\x10\x44\xf5\xe2\x40\xeb\x37\x03\x4d\xd2\x47\x14\x18\x74\x9b\xba\x8b\xcb\x82\xb6\x62\xcf\x22\x35\xfa\x01\x5d\x39\x00\x65\xef\x87\xae\x41\x11\x43\x94\x3e\xf7\x12\xa9\x03\x36\xeb\x09\x6b\x3a\x2a\x51\xbe\x82\xc9\xb0\x3f\x50\x35\x2e\x7e\xff\xc7\xcc\x49\xd3\x0a\x5b\x1b\x3b\xda\xa9\x74\x1d\x0e\x15\xfb\xab\xeb\x81\x24\x62\xa1\x75\xd9\xd1\xa4\x77\x02\x6e\x52\xc3\xb9\x24\xf8\x2e\x13\x3f\x34\x45\xba\x37\x26\x69\x45\xc0\x52\x18\x0e\x15\x65\xd8\x18\x6b\x85\x5a\x40\xf7\x42\x1a\x2c\x7d\x31\xca\x97\x01\x9b\xca\x28\xb4\x76\x9b\x80\x43\x8f\x81\xb9\x03\xe9\x9d\xa4\xda\x4c\x16\x36\xe9\x6f\xcb\x61\x08\xea\xd7\x30\x32\x5d\x05\xe1\x4c\x2a\x50\xbc\xd4\x46\x3c\xe7\x53\xbb\x46\x51\x0a\xaf\xb8\xa3\xbb\x9e\xa3\xb0\x8b\xf3\xe9\x6a\x88\x4a\x49\x6a\xa7\x94\xf2\x2e\x4a\xc3\x79\x34\x0e\x16\xb0\x88\x12\xa7\x4b\xe2\x94\x7d\x2f\x44\x4d\x8e\x6e\x6b\x4e\xfa\xfc\x24\x7f\x8d\xd6\xde\xca\xd8\xae\x08\x08\x55\x95\x4d\xef\x28\xc9\x20\xe2\xc4\x60\x48\xc3\xca\x07\xa0\x35\x09\xee\x75\x9e\x25\x27\xf5\x77\xc2\x56\x18\x02\x9e\x46\xbb\x89\x54\x8f\x96\x81\x73\x06\x1e\x10\xf0\x92\x8d\x77\xb8\xd9\xb5\x1c\xfd\x8c\x3e\x91\xd0\x67\x98\xe6\x1e\xfb\x39\x06\x8c\x54\x5e\x42\xc1\x4f\x07\x87\x87\x99\xae\xf2\x9b\xbe\x57\x3f\xce\x86\x54\x30\x8e\x67\x09\x48\xef\x38\x29\x02\xb4\x61\x25\xf8\x42\x5a\x5a\x25\x36\x9c\xfd\x8c\x2e\x8f\x66\x6b\xb4\x39\x60\x7a\x56\x8d\xb7\x36\x01\x4d\x1b\xc6\x66\x44\x59\x32\xc3\xa1\x03\xaa\x97\xa4\xb5\xcc\x81\xbd\xb8\xa3\x45\xfb\x6c\x93\x70\xbe\xa2\xf7\x35\xee\xd1\x5b\x7b\xae\x2a\x4f\x10\xbf\xcc\x00\xfa\x09\x75\x8d\x13\x0c\xe0\xa4\x90\xf7\x56\x33\xdc\x67\x17\x68\x8a\x14\x6a\xe3\x28\x87\x8a\xa9\x69\xa0\x3a\x49\x14\x60\x49\x71\x43\xe4\x40\x55\xa4\x5e\x86\xe4\xcb\x53\xf4\xb1\x97\xbb\x81\x3e\xe1\xe1\x19\x92\xfd\xad\xdd\xb3\x85\xb7\x36\x0d\xe8\x4c\x04\x66\x05\x08\x8e\x36\x3d\xb5\xf1\xe7\x9f\xb1\xc5\xbb\x07\x93\x35\x1a\x8b\x4b\x4b\x85\x74\x0b\xc3\xaf\xdb\x7d\xd9\x4d\xdf\xeb\x34\xad\xb5\xa3\xc8\xda\x2f\x89\xa4\xf2\xe9\xf1\x1e\x62\xc0\xd5\xca\x28\xb9\xa4\x4d\x20\x15\xb3\x61\x27\x0d\x32\xd6\xbd\xe4\x35\x91\x89\x1c\x31\xb6\xfc\xca\xc1\x70\x3a\x68\x86\x91\xe5\x49\x6a\x37\x39\x35\x82\x24\x5f\xdd\x15\xbb\xdd\x53\xe2\xf1\x76\x7a\xe5\xbc\x32\x7b\x2c\x72\xcc\x78\xf2\xd1\x8c\x0d\x05\x70\xb9\x27\x06\xc1\xea\x34\x57\x0a\x99\x99\x44\xf6\xc8\x29\x37\x3a\x73\xbc\x82\xfc\xa0\xd9\x57\xdd\xee\x1f\x53\x46\x9f\xc9\x5e\x49\xa3\x35\x23\x9e\x80\x13\x54\x5e\x3c\xe4\xa1\x3d\x55\x81\x04\x97\x95\xb7\x9a\xa1\x75\xe6\xb7\x96\x60\xf1\xd0\xf5\x1a\xb7\x60\x9c\xb2\xad\x9e\xb2\x26\xc0\xa7\x4f\x8b\x07\x2e\x00\xfe\x4a\x0a\x65\xe0\xdf\x10\x68\xef\xde\x44\xf8\xf0\xcb\xcf\xff\x4e\x4f\x00\xe9\xc4\x6d\x2e\xb4\x79\x5e\x40\x6b\xd2\x2b\xdb\x04\xc9\xac\x5c\xa2\x29\xc0\xdd\x49\xa9\xb0\x89\x6d\x20\x4e\x48\xe4\x62\x4a\xb5\x8a\x6c\xc3\x50\xe3\x0b\x01\xb7\x21\x6b\x32\x25\xe7\xe2\x81\xd3\x9d\xe4\x23\xd0\x1e\x9c\x8f\x50\x52\x4c\x29\x60\xd3\xab\xd1\xb5\x06\xef\x5e\x36\x8c\x77\xcf\x11\xe3\xff\x33\x73\x24\xd4\x3f\x2c\xd3\x24\xa4\x13\xed\x2b\x53\x65\xf2\x01\xe7\x82\x46\xd0\xa5\xd9\x7d\xd6\xec\x1b\xe6\xd8\x89\x86\x57\xf3\xca\x38\x9a\xe6\xd0\xa7\xb3\x75\xf5\xe4\xef\x05\xc2\x3b\x57\xb5\xf4\xe0\x72\xf8\x86\x9e\xb0\x7e\x18\x64\x2b\x94\x7e\x91\xc6\xba\x06\x29\x45\x19\xd5\xc9\x75\xd1\x47\xbb\x52\xd1\x36\xb3\xe8\x67\x7a\xcc\x75\x67\xed\x77\xc9\x76\x35\x31\x5f\x9e\xce\xdf\x41\xd5\xd6\xe8\x20\x10\x6a\x29\x67\xfd\xb5\x7e\xb6\xcb\x93\x57\x44\x63\x19\x70\xe9\xdb\x08\x9b\x6a\x6c\x00\x1b\xb1\x0f\xe7\xb1\x49\x66\x42\xef\xf2\xdf\xa4\xae\x1a\x9f\x03\x21\x8f\x81\xdb\x81\xfc\x4f\xe9\x50\xdf\xab\xe6\x2b\x23\xc2\x6c\x04\x46\x02\x3a\x4e\x62\x8c\x56\xe6\xe8\xd3\xcc\xa3\xda\x10\xd2\x68\x21\xa1\x76\xa5\xbc\x39\x14\x9e\x29\xac\xcd\xd5\xe5\xf1\x7c\x9a\xa6\x3f\x1e\x91\x7e\xf7\x2d\x13\xad\xf1\xe1\xeb\xc8\x37\xc1\x47\xaf\xfc\xd9\x46\x75\xf2\x32\x67\x6b\x8d\xbf\xde\x5d\x77\xff\x9a\x82\x9a\xf1\x64\x0e\x31\xb4\xd9\x16\x1c\x7d\x48\x4f\x1c\xbb\x9d\x76\x39\xfc\xc1\xa4\xa7\xda\x35\x53\xf0\x9f\xff\xde\xfc\x2f\x00\x00\xff\xff\xf4\x0c\x64\x04\x33\x1f\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x4b\x6f\x23\xb9\x11\xbe\xfb\x57\x14\x90\xc3\x5e\xac\xf6\x4e\x76\x11\x04\xc2\x66\x81\x89\x9c\x87\x91\x99\x1d\xc3\xf2\x0c\x90\x63\xa9\x59\xea\xe6\x9a\x4d\xf6\xb2\xaa\xa5\xd1\x06\xf9\xef\x41\x91\xdd\x7a\xbf\xec\x60\x74\xb1\xc4\x47\x55\xf1\x63\x7d\xf5\xa0\xb1\xb5\x5f\x28\xb2\x0d\x7e\x0c\xd8\x5a\xfa\x2a\xe4\xf5\x17\x17\x2f\x7f\xe6\xc2\x86\xbb\xc5\xbb\x9b\x17\xeb\xcd\x18\x26\x1d\x4b\x68\x9e\x88\x43\x17\x4b\xba\xa7\xb9\xf5\x56\x6c\xf0\x37\x0d\x09\x1a\x14\x1c\xdf\x00\xa0\xf7\x41\x50\x87\x59\x7f\x02\x94\xc1\x4b\x0c\xce\x51\x1c\x55\xe4\x8b\x97\x6e\x46\xb3\xce\x3a\x43\x31\x09\x1f\x54\x2f\xbe\x2f\x7e\x2c\xde\xdd\x00\x94\x91\xd2\xf6\x67\xdb\x10\x0b\x36\xed\x18\x7c\xe7\xdc\x0d\x80\xc7\x86\xc6\x50\xa2\xa0\x0b\x55\x36\x82\x8b\xd0\x52\x44\x09\x91\x8b\x32\x44\x0a\xfa\xa7\xb9\xe1\x96\x4a\xd5\x5e\xc5\xd0\xb5\x63\x38\xba\x26\xcb\x1b\x8c\x44\xa1\x2a\x44\x3b\xfc\x06\x18\x41\x70\x4d\xfa\xde\x1f\x3e\xab\x9d\x26\xb5\x69\xdc\x59\x96\x7f\x1d\xce\x7d\xb0\x2c\x69\xbe\x75\x5d\x44\xb7\x6f\x70\x9a\xe2\x3a\x44\xf9\x65\xa3\x5e\xd5\x95\x28\x1c\xcb\x3c\x6d\x7d\xd5\x39\x8c\x7b\x7b\x6f\x00\xb8\x0c\x2d\x8d\x21\x6d\x6d\xb1\x24\x73\x03\xd0\x43\xd8\x8b\x1a\x01\x1a\x93\xae\x05\xdd\x63\xb4\x5e\x28\x4e\x82\xeb\x1a\xbf\x56\xa5\x6b\x0c\x71\x19\x6d\x2b\x09\xfa\xe7\x9a\xa0\x8d\x24\xb2\x4a\x90\x40\x98\x83\xd4\x34\xe8\x5e\xef\x02\xf8\x95\x83\x7f\x44\xa9\xc7\x50\x28\xc2\x85\xb1\xdc\x3a\x5c\xa9\x35\x5b\xab\xf2\x35\xdd\xe7\xb9\xad\x71\x59\xa9\xe9\x2c\xd1\xfa\xea\x9c\x29\xba\xee\x7a\x1b\x32\x34\xcf\xab\xf6\xd0\x84\xbd\xc1\x6b\xf5\xb7\xdd\xcc\x59\xae\x29\x5e\x6f\xc4\x7a\xcb\x81\x0d\x8f\x47\x66\x4e\x18\xb2\x25\x74\x20\x54\x71\x40\x86\x03\x05\xef\xab\xc3\x33\x1a\x94\x61\x30\x2f\x5a\xbc\x43\xd7\xd6\xf8\xae\x1f\xe4\xb2\xa6\x06\x37\xfe\x10\x5a\xf2\xef\x1f\x1f\xbe\xfc\x30\xdd\x9b\x80\x5d\x74\x76\xfc\x1c\x2c\x03\x42\xa4\x36\xb0\x95\x10\x57\x8a\xd6\x64\xfa\x85\x6f\x61\xf2\x74\xcf\xb7\x80\xde\xac\x89\x07\x2d\x96\x2f\x58\x11\x17\x07\xb6\x86\xd9\xaf\x54\xca\xd6\x70\xa4\xdf\x3a\x1b\xc9\x6c\x5b\xa1\xf0\x0c\x98\xec\x0d\x2b\xfe\x5b\x43\x6d\x54\x9d\xb2\x45\xe4\xfc\xd9\x8a\x72\x3b\xe3\x7b\x27\xfc\x4e\x61\xc8\xeb\xc0\x68\x80\x23\x4e\x2e\xd0\x73\x8c\x4c\x8f\x5d\x76\x0d\xcb\x7a\xfe\x48\x4c\x3e\x87\x3c\x1d\x46\xdf\x9f\xa9\x80\x29\x45\xdd\xa8\x74\xef\x9c\xd1\x48\xb8\xa0\x28\x10\xa9\x0c\x95\xb7\xbf\xaf\xa5\x31\x48\x48\x6a\x1c\x0a\xb1\x40\x62\xad\x47\x07\x0b\x74\x1d\x65\x28\x1b\x5c\x41\x24\x95\x0b\x9d\xdf\x92\x90\x96\x70\x01\x1f\x43\x24\xb0\x7e\x1e\xc6\x50\x8b\xb4\x3c\xbe\xbb\xab\xac\x0c\x31\xbc\x0c\x4d\xd3\x79\x2b\xab\xbb\x14\x8e\xed\xac\xd3\x70\x78\x67\x68\x41\xee\x8e\x6d\x35\xc2\x58\xd6\x56\xa8\x94\x2e\xd2\x1d\xb6\x76\x94\x8c\xf5\x29\x8e\x17\x8d\xf9\x43\xec\xa3\x3e\x7f\xb7\x07\xdf\x51\x67\x86\x21\x6c\x9e\xc5\x5a\x83\x67\xf6\xa2\xbc\x3d\x9f\x65\x03\xa9\x0e\x29\x2a\x4f\x7f\x9b\x3e\xc3\x60\x40\x86\x3d\x23\xbc\x59\xca\x1b\xb0\x15\x28\xeb\xe7\x14\xf3\xca\x79\x0c\x4d\x92\x42\xde\xb4\xc1\x7a\xc9\x94\x76\x96\xbc\x00\x77\xb3\xc6\x0a\x27\x9f\x23\x16\xbd\x87\x02\x26\x29\x85\xc1\x8c\xa0\x6b\x95\x49\xa6\x80\x07\x0f\x13\x6c\xc8\x4d\x90\xe9\x9b\x43\xad\x88\xf2\x48\xe1\xbb\x1e\xec\xed\x0c\x7c\xb8\xe1\x80\x63\x00\x43\x86\xbc\x6a\xf1\x29\x52\x42\x66\xe0\xb1\x08\x0c\x67\xb8\xa8\x1f\x34\x26\x12\x1f\x99\x38\x20\x64\x5e\x98\xfd\xa4\x0e\xac\xf7\x87\x02\x9f\x3e\x7c\x84\x12\x3d\x74\x4c\x4a\x9e\x32\x78\xaf\x0e\x21\x01\x50\x73\xd9\x88\xbe\x5a\x4e\x0e\x14\xa9\xb2\x2c\x71\x55\xc0\xdf\x43\x6c\x50\xc6\xf0\xd3\x30\x34\x4a\xe2\x42\x04\xdb\xfe\x3c\xfe\xa9\x0d\x51\x7e\x86\x4f\xde\xad\x54\xa8\x81\x65\x4d\x1e\xa6\xeb\xb3\xc1\x5f\xb6\x7e\xfc\x23\xb6\x65\x01\x0f\x95\x0f\x71\x58\xa9\x5e\xf5\xd0\x60\x45\x30\xb7\xe4\x92\x5f\x33\x49\xb1\x7f\x83\x67\x6f\x11\x72\xb9\x34\xb7\xd5\x47\x6c\x2f\x42\x33\x19\x56\xaa\x2e\x55\xbf\x9d\xbc\x37\x93\x12\x92\x2b\xeb\x91\xf4\x2b\x96\x2f\x80\xbd\x96\x06\xdb\x11\x27\xda\x6c\xc1\x74\x1d\x02\x93\x41\x80\xe2\xb7\x19\x7e\xe8\x23\x57\xf1\xda\x63\x6f\x9f\xec\xd5\x7b\x37\x65\xc8\x45\xd0\x3e\x1e\xcb\x22\x57\xe8\xb0\xe5\x39\xc3\x8e\x72\x06\xce\xf2\x06\x12\x77\x66\xc8\xf4\xa7\x1f\x4f\x18\x94\xb3\x9e\xb1\x28\x87\xdc\x82\x0b\xfc\xd2\xcf\x46\xf8\xf1\xf9\x0b\x47\x86\x14\x57\x7a\xf5\x6f\x92\x60\x95\x0f\x17\xaf\x24\xb3\x46\xf9\xed\xd7\x05\xc3\x68\xf0\xc7\xd4\x3e\xa0\xf5\x14\xb3\x34\xf5\x61\xeb\x59\xd0\x8b\x45\xa1\x54\x81\xf4\x6c\xee\x3d\x79\x69\xa5\xbe\xd6\x8b\x7b\x1e\xcf\xa1\x4f\x23\xb7\x89\x3b\x7d\x6c\xda\x10\xd9\x66\xa2\xbf\xda\xa9\xdb\x68\x43\xb4\xb2\xba\x1c\xe5\x1e\xfb\x95\xbd\x4e\x64\xb6\x95\xd7\x88\xb7\x24\x5b\xd5\x32\xd4\x07\x7d\x25\x0a\x43\x2a\x0c\x83\x0a\xfb\xbb\x26\x46\x6a\x80\x43\x8e\x8f\x56\x52\x78\x9c\x91\x02\xc8\x5d\x43\x06\x66\xab\x24\xc3\x50\x4b\xde\x90\x2f\x57\x29\xa7\xba\x05\xc5\x02\x3e\xb3\xde\x14\xfc\xd3\x56\x5a\xf7\xf6\x4a\xad\x37\x56\x1b\x23\xce\x22\x53\x3a\xdd\xb3\xc0\xb2\x42\x37\xa7\xa8\x71\x30\x28\xfc\x2e\x2c\xd7\x12\xc8\xec\xad\x67\x30\x5d\xca\xf4\xfb\x46\x74\x8a\x43\x91\xca\xef\x88\xbe\x5a\x87\xb1\x01\xc1\xbe\x34\xd0\x23\x55\x21\xe7\xf4\x54\x77\xda\x45\x42\xc1\x53\x85\xe9\xbb\xcd\x81\x78\x2d\xc3\x7a\xf9\xe1\x8f\x59\xae\xa1\x39\x76\x4e\x7a\x49\x29\x51\xec\x1d\x46\x3d\x07\x3a\x9f\xc1\x27\xb3\x51\xbe\x4c\xe5\xdb\x8c\xe0\xfb\x2c\xea\xd8\x3e\x55\xcb\x1a\x80\x77\x4d\x66\x58\x5a\xe7\x74\x6f\x44\xff\x42\x06\x1c\x7d\xb5\x65\xa8\x22\xb6\xb5\x2d\xd1\xb9\x55\xa2\xa9\x81\xe0\x41\x2b\x11\x8d\xe1\x67\x92\x86\x56\x86\xd5\x4e\x33\xd1\x7b\xda\xd0\x66\xbc\x3a\x78\x32\x95\x91\xe4\x72\x22\x9e\xe6\x75\x9b\x92\x4b\xd3\x9b\x42\xdc\x0b\xc8\x3e\xd2\xfb\xdc\x90\x6d\xb0\x2c\x95\x48\xc9\x75\x83\x17\x2d\xd4\xf6\x9a\xaa\x02\x1e\x44\xbd\x68\xa6\x75\xaf\x04\x78\x21\x6a\xb3\xa7\x69\x7b\x0d\xdc\xa0\x73\xb7\xda\x10\x97\x04\x84\x65\x9d\xe1\xf4\xd4\x67\x33\x02\x89\x96\x0c\xcc\x43\x04\x5a\x90\xc6\x8b\xfe\x6e\xc8\x6b\x36\x3b\x89\x06\xc6\xb8\xd3\x9c\x0e\x1f\x2b\xd4\x9c\x08\xa7\xe7\x61\x5c\xc7\x94\xcb\x48\x6e\x62\x51\x9f\xb8\x87\x8e\x97\x37\x8f\x0b\xaf\x50\x9d\xab\xd4\xa9\x44\x14\xaa\x2e\xc7\x9a\xcf\x3b\xcb\xd7\x5d\x4e\x1d\x96\x43\xbd\x7b\x40\x72\x0d\xbc\x3c\xdc\xad\xb1\x5c\x2a\xd3\xc9\x68\x91\xc1\x96\xf3\x9d\xa2\xcf\x6d\xcb\x02\x5d\x76\x85\x41\x70\x1b\x9c\x4b\x94\xef\x62\xee\x91\xb4\x9b\x41\x0f\xd4\xcc\xc8\x18\xed\x81\x06\x53\x4e\xa4\xb9\x0b\x29\xf6\x52\x16\x1c\xf2\xc3\x63\x70\xee\x7c\x16\x3b\xa9\xe2\x1a\x35\xfa\x19\x00\x38\xbd\x62\x3f\xf5\x0d\x88\x59\x5e\x73\xc6\x90\x50\x6c\xac\xa7\xec\x1a\xb6\xa1\x0d\xb0\x33\x92\x25\x91\x87\xb2\xa6\xf2\x65\x4d\xa5\xbe\x6b\xdc\xbb\xb5\xbe\x65\xdd\x8d\x58\x9b\x86\x3c\x38\x97\xda\x4e\x26\x02\x3b\x07\x04\x4f\xcb\x61\xcf\x1e\x47\xb7\x82\x3d\x2e\xd0\x3a\x9c\x39\x4a\x59\x73\xfd\xeb\x76\xa7\x7b\x1d\xf2\x79\xdb\x39\x47\x26\xdd\x77\xf5\xf4\x38\x01\x89\x38\x9f\xdb\x52\xa7\x8c\x8d\x54\x4a\x3e\xf0\xc9\x23\x1c\x63\xef\xee\x8d\x1d\x61\x04\x0b\x4a\x77\x70\x47\x67\x2e\xf8\xdc\xc5\xae\x8b\xf1\x27\xcd\x71\xe4\xcb\xa3\xec\xfe\x3f\x6b\x40\xbf\xfb\x7c\xb6\x3f\x95\xde\xf9\xde\xe0\xf7\x0e\x59\x32\xd7\x9f\xed\xf1\xc2\x18\xae\xa9\x00\x41\x63\x6b\xea\x9b\x54\xd4\x48\xfd\xf1\xe8\x3a\x7f\xa2\xfa\xbe\x4a\xc9\xfa\x9c\x6f\x96\x30\x3c\x0f\x9c\x78\xe4\xb9\x5a\x4e\x67\x4f\xdc\xd3\x7e\x14\x7d\xb8\xcf\x2d\x69\x8a\xdd\x29\xe0\xd5\xc1\x19\x86\xce\xdb\xdf\x3a\x82\x87\xfb\x3e\xff\xdf\x82\xf5\xa5\xeb\x8c\x86\xc0\xcf\x9f\x1f\xee\xb9\x00\xf8\x2b\x95\xa8\x8d\xeb\x92\xc0\x04\xff\x9d\xc0\xa7\x5f\x3e\xfc\x3b\xb5\xb2\x69\xc5\x6d\x4e\x80\xb9\x22\x46\x67\xf3\xfb\x50\x36\x3a\xed\x56\x59\xbd\xe6\x12\x5b\xe9\x22\x71\x8a\x11\x5e\x12\xd9\x6a\x72\x2d\x43\x83\x2f\x04\xdc\xc5\xde\x3a\x15\x9c\x66\x13\xd6\x60\x02\xf8\x20\x50\x91\x24\x27\x77\xe9\x9d\xe3\x2d\xa0\xf5\x9d\xb7\x0d\x7e\x2a\x28\xdf\x82\x1f\xea\xc8\x9f\x66\xa9\xba\x37\x49\xc7\x1b\xc8\x70\xe6\xb9\xe1\xe2\x09\xa1\x27\xd3\x24\x9f\xf4\x9b\x33\xe9\xe0\xbc\x6f\xd2\x98\x23\x6a\xea\xad\x9e\x2e\x64\xc0\x83\x17\x70\xb5\x20\x67\x9e\xf4\x94\xb0\xfb\xea\x9b\xa2\xfb\xba\x3d\xab\x51\x6b\x37\xf2\x29\xa1\xe4\x78\x4e\xbe\xf7\x3a\xda\xa4\x82\xae\x1d\x49\x18\x99\xe3\x97\x77\x01\xb9\xcb\xa8\x35\xc4\x7c\x4d\xa7\xf9\x1e\xea\xae\x41\x0f\x91\xd0\x68\xda\x1a\x36\x0e\x9d\x4e\xee\x4c\x04\xad\x63\xc0\x59\xe8\x04\x96\xf5\xea\x18\x06\x9c\x1b\x0d\xed\x87\x82\xcf\xff\x6d\x79\x75\x73\x18\x09\xf9\x78\xa0\xda\xb1\xf9\x29\x2d\x1b\x2a\xc5\xbc\xe9\x88\x49\x4b\x0d\x12\x11\x3d\x27\x63\xf2\x45\x68\x3f\x51\x76\x31\xa6\x62\x5d\x1d\xe9\x0d\x36\xe6\x6b\x9e\x52\x5c\xd8\x37\x25\xbf\x4b\xc4\x4c\xff\xe0\x20\xf3\xfe\xdb\xd3\xaa\x0d\xf1\xed\x4a\xda\x18\x24\x94\xe1\x42\x01\x79\x46\x00\x67\x04\x4f\xbd\x51\xbd\x56\xc6\x6b\x93\x65\x8e\x26\x63\x90\xd8\x0d\xe8\xb0\x84\x98\x9a\xfe\xed\xb1\x6e\xb6\x7e\xe8\xdf\x48\xef\x4b\x2a\xf8\xcf\x7f\x6f\xfe\x17\x00\x00\xff\xff\xe3\x8c\x7a\xb6\x2d\x1e\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -99,12 +99,12 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_catalogsources.yaml", size: 7987, mode: os.FileMode(436), modTime: time.Unix(1607975192, 0)} + info := bindataFileInfo{name: "operators.coreos.com_catalogsources.yaml", size: 7725, mode: os.FileMode(436), modTime: time.Unix(1607977322, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x24\xb7\x91\x2f\xfa\xbf\x3f\x45\xc6\xd8\x7b\x48\xae\xd8\xcd\x19\xbf\xee\xee\x1c\xdf\xa3\xe0\xce\x50\x32\xaf\x66\x38\x8c\x21\x25\x1d\x87\xac\xd5\xa2\xab\xd0\xdd\x58\x56\x01\x65\x00\xd5\x9c\xf6\xd1\xf9\xee\x37\x90\x40\xbd\xba\x9b\x64\x17\x00\x9a\x1c\x19\xe9\x08\x6b\xf8\xca\xc6\x33\x33\x91\xf9\xcb\x4c\x52\xb1\xef\xa8\x54\x4c\xf0\xd7\x40\x2a\x46\x3f\x69\xca\xcd\x57\x6a\x7a\xf3\x6f\x6a\xca\xc4\xc9\xea\xd5\xaf\x6e\x18\xcf\x5f\xc3\x9b\x5a\x69\x51\x7e\xa4\x4a\xd4\x32\xa3\x6f\xe9\x9c\x71\xa6\x99\xe0\xbf\x2a\xa9\x26\x39\xd1\xe4\xf5\xaf\x00\x08\xe7\x42\x13\xf3\x6d\x65\xbe\x04\xc8\x04\xd7\x52\x14\x05\x95\x93\x05\xe5\xd3\x9b\x7a\x46\x67\x35\x2b\x72\x2a\x91\x79\xf3\xd1\xab\x97\xd3\xdf\x4f\x5f\xfd\x0a\x20\x93\x14\xff\xfc\x9a\x95\x54\x69\x52\x56\xaf\x81\xd7\x45\xf1\x2b\x00\x4e\x4a\xfa\x1a\xb2\xa2\x56\x9a\x4a\x45\xe5\x8a\x65\xd4\xfd\xbd\x9a\x8a\x8a\x4a\xa2\x85\x54\xd3\x4c\x48\x2a\xcc\x7f\xca\x5f\xa9\x8a\x66\x66\x14\x0b\x29\xea\xea\x35\xec\xfc\x1d\xcb\xb7\x19\x2c\xd1\x74\x21\x24\x6b\xbe\x9e\x80\x28\x4a\xfc\x97\x5b\x02\xfb\xe1\x57\xf6\xc3\xdd\xba\xe1\xcf\x0b\xa6\xf4\x37\x77\xff\xce\x3b\xa6\x34\xfe\x5e\x55\xd4\x92\x14\x77\x4d\x03\x7f\x45\x2d\x85\xd4\x17\xdd\xa0\x26\x90\xa9\x55\xf7\x2f\xf7\x4b\x8c\x2f\xea\x82\xc8\x3b\x38\xfd\x0a\x40\x65\xa2\xa2\xaf\x01\x19\x55\x24\xa3\xf9\xaf\x00\x9a\xcf\x31\x8c\x27\x40\xf2\x1c\x37\x90\x14\x97\x92\x71\x4d\xe5\x1b\x51\xd4\x25\x6f\x3f\x36\xa7\x2a\x93\xac\xd2\xb8\x41\xd7\x4b\x8a\x2b\x05\x62\x0e\x7a\x49\xe1\xcd\xd5\x77\xf8\x6b\x00\xff\xad\x04\xbf\x24\x7a\xf9\x1a\xa6\x66\xc1\xa7\x39\x53\x55\x41\xd6\xe6\x83\xdd\x6f\xd8\x9d\x7b\x6b\xbf\xef\xbe\xa7\xd7\x66\x74\x4a\x4b\xc6\x17\x77\x7d\x9e\x1b\xee\xc3\x1f\xb9\xea\xed\x44\xf3\x71\xdf\x0d\xbe\xb7\xcf\xc7\x35\xd3\x23\xe6\x93\x40\x2f\x89\x06\xbd\x64\x0a\x04\xa7\x20\x69\x55\x90\x8c\xaa\x3b\x06\xb0\xf1\x63\x3b\x82\x8f\xc3\x6f\xee\x18\x42\x9f\x8d\x26\xba\x56\xd3\x6a\x49\xd4\x70\xd9\x2e\x7b\xdf\xd9\x62\x61\x7f\x65\xf5\x8a\x14\xd5\x92\xbc\xb2\x27\x23\x5b\xd2\x92\xbc\x76\x7f\x21\x2a\xca\x4f\x2f\xcf\xbf\xfb\xdd\xd5\xe0\xdb\x30\x9c\xfd\xce\x33\x0b\x4c\x99\xa5\xc0\x5b\x0f\xcd\xb5\xc7\xbd\x58\x57\x14\xfe\x6b\xe7\xdf\x5c\x55\x34\xfb\xaf\x69\xfb\x21\x76\xbc\x62\xf6\xdf\x34\xd3\xed\x37\x25\xfd\x5b\xcd\x24\xcd\xbb\xb1\x4c\xa0\x11\x21\xbd\x6f\x99\x75\x6d\xbf\xac\xa4\xb9\xbc\xba\xbd\x98\x96\x7a\xb2\xab\xf7\xdd\x8d\xb9\x1d\x98\xe9\xbb\x19\xe5\x46\x68\x51\x85\xa7\xc9\x9d\x19\x9a\xbb\x15\xb3\xa7\x8c\x29\xb3\xd5\x92\x2a\xca\xad\x18\x1b\x30\x06\x3c\x1e\xdc\xcd\x68\x0a\x66\xf2\x54\x2a\x73\x65\xeb\x22\x37\xb2\x6e\x45\xa5\x06\x49\x33\xb1\xe0\xec\xef\x2d\x6f\x05\x5a\xe0\x87\x16\x44\x53\xa5\x37\x78\xe2\xdd\xe3\xa4\x80\x15\x29\x6a\x7a\x0c\x84\xe7\x50\x92\x35\x48\x6a\x3e\x05\x6a\xde\xe3\x87\xbf\xa2\xa6\xf0\x5e\x48\x0a\x8c\xcf\xc5\x6b\x58\x6a\x5d\xa9\xd7\x27\x27\x0b\xa6\x1b\x99\x9d\x89\xb2\xac\x39\xd3\xeb\x13\x14\xbf\x6c\x56\x1b\xb1\x77\x92\xd3\x15\x2d\x4e\x14\x5b\x4c\x88\xcc\x96\x4c\xd3\x4c\xd7\x92\x9e\x90\x8a\x4d\x70\xe8\x1c\xe5\xf6\xb4\xcc\x7f\x2d\xdd\x76\xab\x83\xc1\x58\xb7\xce\x9f\x25\x14\x8e\xf7\xec\x80\x11\x8c\xf6\x34\xd9\x3f\xb5\xb3\xe8\x16\xda\x7c\xcb\xac\xce\xc7\xb3\xab\x6b\x68\x3e\x1a\x37\x63\x73\xf5\x71\xdd\xbb\x3f\x54\xdd\x16\x98\x05\x63\x7c\x4e\xa5\xdd\xc4\xb9\x14\x25\xf2\xa4\x3c\xaf\x04\xe3\x1a\xbf\xc8\x0a\x46\xf9\xe6\xf2\xab\x7a\x56\x32\xad\xf0\x5c\x52\xa5\xcd\x5e\x4d\xe1\x0d\x2a\x32\x98\x51\xa8\xab\x9c\x68\x9a\x4f\xe1\x9c\xc3\x1b\x52\xd2\xe2\x0d\x51\xf4\xd1\x37\xc0\xac\xb4\x9a\x98\x85\xdd\x6f\x0b\xfa\x3a\x78\xf3\x97\x37\xee\x1f\x40\xa3\x17\xef\xd8\xaf\x3b\x6f\x36\xe4\x34\x2b\x88\xb4\xea\x1d\x34\x2d\x0a\xf8\xf0\xee\x3d\x2c\xc5\xad\x39\xdf\x8c\x2b\x4d\x50\x53\xf7\xc9\xdc\x16\xa7\x77\xad\x48\xcd\x08\x87\x92\x70\xb2\xa0\x40\xaa\x4a\xc1\x5c\x48\x20\xb0\x60\x2b\xca\x9b\x3b\x39\xdd\x67\x12\xbb\x04\x09\x58\xc1\xbe\xa5\x80\x9a\x9f\xec\x1a\xe2\x6e\xd1\x62\x87\xbe\x61\xcb\xdc\xb9\x62\xa7\xdd\x6f\xe2\x39\xe7\x50\x73\xa5\x65\x8d\xdb\x9b\xc3\x0d\x5d\xbb\x23\x5f\x92\x0a\x94\x16\xe6\x9b\xb7\x4c\x2f\xb7\xb8\x02\x90\xfe\x05\x20\x1a\xcf\xf5\x8c\x82\xa2\x1a\x66\x6b\x30\xe6\x19\x8a\x0a\x2d\x44\x81\x52\x05\xb9\xa1\xc8\x90\x54\x4b\x46\x57\x74\x17\x53\x39\x63\x5a\x12\xb9\x6e\xcf\xc9\x74\xeb\xb7\xee\x5c\x66\x64\xd0\x33\x15\xee\x5a\x2e\xb8\xfb\x74\x82\x15\xd6\xce\x46\xc9\x5b\xd3\xf1\xc1\x75\xbd\x3c\x77\xa7\xb0\x33\x37\x95\x3b\x85\x54\x01\x29\x8a\xc6\x36\x68\xed\x56\xfc\x9c\x1d\x23\xb3\x47\x2e\x07\x21\xdb\x73\x63\x16\xb4\x7f\x3c\x67\xd4\x08\x22\x49\xb8\xf9\xc1\xce\x4b\x30\x72\xd5\xee\x3e\x5a\x86\xc4\x2d\xdf\x3c\xbb\x43\xae\x44\xca\xd6\x5c\x1a\x12\xd3\xb4\xdc\xc9\xf3\xde\x15\x6c\xbf\x6d\x06\xb6\x62\x39\x35\x4b\xa9\x09\xb3\x07\xc9\xdc\x64\x32\x13\xf5\xf6\x34\x1a\x32\x2b\xdb\xfc\x69\x0e\x2b\x46\x80\x2c\x16\x92\x2e\x76\xe9\xc9\xbd\xd6\xc7\xd2\xee\x6b\xdc\xd1\xc4\xda\xef\x77\xfe\xd4\x08\xc9\x3b\x7f\xc8\x37\x85\x40\xff\x87\x43\xb3\x71\x93\xee\xdf\x3d\x4b\x24\x33\x73\x6f\x96\x56\xc8\x7b\x7e\xf5\xe1\x5d\xb5\x74\xef\xde\x5a\x1a\xee\xf0\xc6\x10\xdc\x4f\x67\xe6\x7e\x74\x02\x7b\xa7\x58\xd8\x9e\x49\x27\xa2\x67\x14\x2a\x2a\xe7\x42\x96\xe6\xd2\x70\x20\x90\x59\x4b\xb0\x15\x4f\x28\x4c\x79\x76\x3f\xe3\x3d\xf6\xdf\xd2\x43\xa7\xc0\xd2\x04\x2a\xb2\x53\x6c\x76\xb4\xcf\xb6\x59\xea\x2f\xe3\x03\xbf\x7a\xaf\x64\xdb\xe2\xdb\xe9\x9f\xa8\x7c\xcd\xd4\xa3\x32\x44\x9d\xf4\x30\xc7\xc1\x71\xfb\x48\x6e\xdf\x53\xa5\x8c\xfa\x46\x8b\x4e\x92\x5b\xa0\x3c\x13\x46\x24\xfc\x7f\x57\x1f\x2e\x2c\xd3\x6d\x41\xb9\x4d\xe7\x1a\x58\x59\x15\xb4\x34\x86\x1c\xbc\x27\x52\x2d\x49\x41\x25\xea\xb2\x6f\x79\x39\xf8\x3a\x23\x77\xdd\xd2\x3e\x19\x6b\x4d\xd1\xdc\x48\xb3\x9c\x16\x64\x6d\x07\x94\xd3\x4c\xe4\x46\xb2\x0b\x09\x95\x31\xa5\xcb\xaa\xd6\x14\x08\xfe\x74\x0f\xae\x38\x3b\xc6\x17\x0f\xcf\x69\xc4\xd2\x83\xb1\x7b\x4a\xa2\x5f\xc3\x6c\xad\x1f\xba\x9b\x9f\x26\xf9\x7e\x12\xa6\x3f\x8c\x87\xe4\x8c\xa5\x3d\xa4\x4d\x9f\xe9\x03\x73\x33\xc6\x2e\x61\x9c\xca\x4b\x21\xf5\xc3\xa2\xd0\x3c\x7c\x16\x54\xde\xf3\x7b\xcd\x22\x31\xae\x7f\xf7\xdb\x3b\x7f\x2f\xa7\x55\x21\xd6\xe6\x1c\x3d\x74\xe7\xf6\x9a\xc5\x9e\x72\x61\x3f\x5e\xfb\xc9\x82\xbd\x78\x59\x37\x56\x28\x97\xed\xc7\x9a\x07\x13\x1e\x63\x3e\xed\x23\xf3\x09\x94\xe6\xe5\x79\xe3\xd1\xf8\x48\xe7\x54\x52\x9e\x39\x79\xf6\x4d\x3d\xa3\x92\x53\x4d\x55\x3b\xbe\x07\x6e\x07\xba\x43\x50\xee\x18\x7b\x72\x53\x4d\xfe\x63\xb5\xe3\x3d\xb6\x50\xf3\x2b\xf7\x58\x44\xcd\xaf\xdc\x6f\x17\x59\xda\x5f\xcd\x3e\x74\xe0\x2c\x8d\x90\x9d\x0f\x1d\xbe\xd1\x0c\x57\xbb\x9c\x48\xde\x3c\xcd\xeb\xfa\x49\x2d\xc2\xab\xc1\x00\x06\xf6\xe0\x9c\xd1\x22\x07\x66\xcc\xb9\x81\x7f\x6d\x37\xcd\x0a\x91\xdd\x38\x8f\xe8\xc7\xb7\xa0\x84\x35\x0f\xcd\x4b\xc1\x98\x88\x99\xe0\xaa\x2e\x29\xb0\xfb\xcf\x6e\x32\x01\xe3\xf1\x4d\x26\xe0\x03\x94\x4c\xc0\xde\x30\x9e\xc2\x04\xb4\x71\x8c\xa7\x95\x7f\x1b\x43\xb8\x53\x02\xe2\xef\x25\x19\x98\x64\x60\x92\x81\x0f\x73\x4d\x32\x10\xf6\x9d\xdb\x1e\xf6\xe4\x03\x7c\xee\x17\x03\xc9\x3d\xdc\xa3\xe4\x1e\xde\xa4\xe4\x1e\xbe\x87\x92\x5e\x4c\x7a\x31\xe9\xc5\xe4\x1e\xf6\x9f\x45\x72\x0f\x27\xf7\x70\x72\x0f\x27\xf7\xb0\x27\xcf\xe4\x1e\xde\x35\xc9\x64\x02\xc6\xe0\x9b\x4c\xc0\x07\x28\x99\x80\xbd\x61\x24\xf7\x70\x72\x0f\x27\x19\x98\x64\x60\x92\x81\x0f\xfd\xee\x73\x72\x0f\xdb\x07\x44\xf3\x7e\xd8\x1f\x4b\xfd\xe2\xae\xfc\xbd\xdd\x80\xea\x37\x1f\xdf\xaa\x06\x34\xbd\x63\xa0\x61\x30\x6a\xf8\xeb\xae\x83\x7a\xde\x7e\x32\xa0\x27\x19\x53\x3c\x8c\x2c\x36\xdf\xfd\x70\xcb\x69\x8e\x69\x76\xc7\xc0\xb4\xf9\x05\x73\x2d\x58\xc6\x74\xb1\x6e\x87\x32\x7d\xb1\xc5\xf6\xb9\x03\xb4\xdf\x7c\x7c\xbb\xb7\xeb\xdd\x2c\xc4\x9d\x87\xc6\x6c\xd8\x1d\x3f\x8c\xe2\x65\x4f\x7e\xf4\xe4\x47\xef\x51\x32\x20\x92\x01\x91\x0c\x88\xa7\x31\x20\x9e\xab\x07\x3a\xf9\x8e\x93\xef\x38\xf9\x8e\x07\x94\x7c\xc7\xbb\x29\xf9\x4d\x06\x94\xcc\x9e\x64\xf6\x3c\xf4\x9b\xff\xf4\x66\x4f\xf2\x1d\xdf\x3d\xd1\x24\x03\x63\xf0\x4d\x32\xf0\x01\x4a\x32\xb0\x37\x8c\xcf\xcf\x77\x0c\xff\x40\x68\x71\x72\x6c\x26\xc7\x66\x72\x6c\xb6\x94\xb4\x5b\xd2\x6e\x0f\xfd\xe6\x3f\xbd\x76\x4b\x8e\xcd\xe4\xd8\x4c\x8e\xcd\xe4\xd8\x4c\x8e\xcd\x64\xf6\x44\xe3\x9b\xcc\x9e\x07\x28\x99\x3d\xbd\x61\x24\xc7\x66\x72\x6c\x26\x19\x98\x64\x60\x92\x81\x0f\xfd\xee\x73\x72\x6c\xde\x7b\x1f\xef\xfb\xbb\xfb\xee\xdb\x3d\x7f\xc7\xb2\xbb\x3f\x68\xf7\xea\xdd\xb9\x5a\x0f\x88\xb9\xfb\x84\xdb\x04\x66\x44\xd1\x3f\xfe\x7e\x50\x39\xbf\xff\xe3\x92\xe6\x8c\x98\x0f\xd8\xf1\xd3\x87\x84\x5d\xc7\xfa\xae\x3d\x79\x70\x5f\xdb\x8f\xf7\xe0\xe0\x4a\x75\x3f\x00\x6a\x36\x1b\x97\x9f\xdb\x5f\xbd\xd2\x92\x68\xba\x58\xf7\xca\xc3\x23\x72\xb8\xd3\x46\xfc\x9e\x06\x1e\x43\x6a\x9d\x94\xb7\x4b\x2a\x29\xb2\x71\x03\x32\xa3\xb5\x1f\xc3\x14\xbe\x07\xd8\x9c\xd1\x7c\x64\x61\xe8\xbb\x37\x75\xd2\xf2\xdf\xfa\xd1\xfd\x1b\xb6\x5d\xd3\x7d\xe7\x82\x35\x8b\xf4\xd6\x7a\xe1\xdf\xb6\xa9\xd1\x9b\xab\x56\x11\x69\xe4\xa1\xf3\xd6\xdf\xb1\x7f\xa8\xe2\x7b\x3c\x36\x76\x62\xb7\xd8\x7b\x50\xaf\xdf\xaf\xcf\x27\xbd\x7c\xee\xdd\xe3\x7a\x58\x8d\xbb\x9e\x29\x97\x54\x96\x4c\xa9\xdd\xe0\xf9\xe1\x70\xef\x17\x89\x0f\x8a\xc2\x3b\xf6\xa0\x99\x47\x6f\x20\xad\xe1\x75\x6f\x4c\xc4\x90\x9c\x91\x0c\x64\x5d\x18\x13\x8d\xe7\xe0\x8a\xab\x03\xc9\x32\x51\x73\x0d\x9c\xd2\xdc\xfa\x57\x76\x9d\xde\x07\xc5\xec\x83\x76\xd7\x3e\x56\xd7\xc4\x8e\xef\xde\xdf\x70\xe3\x3e\xb5\xc3\xde\x2a\xda\x3f\xa4\x7d\x2d\x34\xfc\xd8\x87\x74\xd3\xfe\xca\x6e\x4f\x55\x37\xd8\xe5\x4b\x51\xb0\x6c\xfd\xb1\x2e\x28\x2c\x45\x91\x2b\x6c\x16\x61\xf4\x76\x1b\x26\x69\x4d\xec\x3d\x74\x28\x81\x0a\xf9\xe1\xcc\x8e\x61\x56\x6b\xc8\x05\x55\xc0\x85\x6e\xca\x2a\xf4\x3f\x60\x1f\x8e\x18\x78\xbb\x5d\xda\xc6\x24\x86\x2d\x90\xaa\x2a\x18\xc5\xd0\x9c\x90\x70\xbb\x64\xd9\xd2\x76\x47\xaa\xc8\x83\x1e\x3d\x43\x3b\x18\xed\x6b\xf9\xec\x61\xe6\xc3\xde\xa6\x3e\x34\x1e\xb9\xd9\xc3\x4b\xbb\xbf\xcd\x0f\xb6\xc6\xd1\xd7\x52\xd4\xd5\x5e\xbf\xbc\xed\x3f\xb5\x7f\x6b\x34\x87\xde\x68\xa7\xd4\xfc\x70\x2f\xb6\xe0\xc2\x6c\x76\xdf\x2d\xb3\xd6\x31\x3c\xc5\x44\x9a\xb2\x2e\x34\xab\x0a\x64\xbc\x27\xcf\x85\x1d\x1c\x91\xb4\xd3\x6b\xc7\x40\xf8\xba\x89\xed\xb9\x06\x29\x34\x07\xb2\x30\x9f\xfb\xf0\x76\x59\x12\xbc\x9d\x26\xe5\x75\x49\x8d\x04\xca\xbb\x01\xe3\xc3\x92\xaf\xcd\x48\xef\x2d\xe5\xb4\x49\xb7\xac\x28\x8c\xdd\x4e\x8a\x42\xdc\xee\x52\xc1\xbb\x68\x8c\x81\x0b\x63\x8c\x5c\x18\x6b\xc4\x03\x70\xc1\x1b\x87\xfa\xb7\x1f\xdf\xf9\x1c\xa9\x8b\x21\x07\xd7\x63\x87\x6a\xb3\xdc\x15\x91\x9a\x91\xcd\x76\x2c\x77\x51\x2d\x0b\x65\x4f\x15\x31\x0f\x21\xd9\xb4\x34\x5a\x92\x15\xaa\x14\xaa\x6c\x5f\x1c\xf8\xd7\x7d\xa4\x15\x60\xcf\x91\x76\x6b\xac\xbc\x12\xbc\x58\x03\xb1\xa7\x75\x5e\x17\xc5\x31\xcc\x19\x27\x46\x25\xd1\x7d\xb7\xdc\xe5\x82\x99\xd7\x2c\x5c\x31\x9e\x51\xb3\x86\x93\xd6\x58\xc3\x35\x30\x9f\xcb\xc5\xbe\x67\xb3\x15\x6f\xf9\xb1\x6b\x1c\x64\x7d\x1d\xca\x0d\xd7\x08\xb2\x8c\xcc\x0a\x6a\x1e\x5d\x7b\xf2\x74\x46\xe6\x47\x51\x60\x40\xc4\x85\x4a\x72\xdb\x93\x88\xf4\x7f\xfc\x1f\x8c\xef\xf7\x3c\xb4\xf4\x11\x95\x7d\x46\x38\x50\xa6\x97\xe6\x7d\x5b\x55\xc5\xda\x88\x6b\x73\x77\xba\x0b\x75\xa8\xea\xec\x7e\x4f\x47\x47\x44\xc1\x8b\x4a\xe4\xea\x85\x11\xf9\x2f\x14\xcd\x24\xd5\xea\xc5\x91\xf9\x6a\x73\x6d\xf7\xe4\x68\x76\xc7\x8d\x01\xb9\x9f\x90\x8a\xbd\x38\x3a\x06\x3c\x04\xd8\x54\x49\xe8\xe5\xe7\x77\x5b\x9b\x95\xe8\x75\xe6\x7b\x88\x86\xde\x8f\xfe\xdf\xbb\x2e\x41\xa2\xb2\x4d\x75\x8c\xae\x7d\xf0\x29\xdf\x50\xc1\x14\x5e\x70\x3c\xba\x4d\x9b\xba\x6d\xc5\x0b\x70\xba\x8f\x19\x60\x88\x96\x95\x5e\xa3\xdc\x28\x29\xe1\x8e\x27\x5d\x51\xb9\xd6\x4b\xc6\x17\x38\xd8\xcf\x55\xc8\xee\x15\x30\xed\x68\xe7\x96\x39\xc1\xda\x2c\x7c\xcb\x72\x6f\x65\xcd\xd4\x8e\xed\x69\xb8\x9f\x16\x45\xef\xf1\xb5\xef\xb5\xc5\x3f\x6a\x54\xfe\x67\xb7\x2b\x68\x9b\x79\xec\xc8\x77\xe6\xef\x86\xbb\x61\xbf\x65\x55\x97\x11\x87\xfb\x0e\x58\xc0\xe9\xbb\x77\xb6\xed\x9c\x5b\xc7\x6f\x18\xcf\xed\x5b\xea\x54\xdb\x9e\x6d\xf4\x23\x35\x53\x42\xf3\x67\xdf\x9d\x69\x8a\x9c\xe5\x56\x5b\xb9\xad\x9f\x02\x0e\xd4\x7b\xaf\xb1\x13\xdc\xe7\xb4\xcf\xdb\xcf\xba\xfd\x9e\x63\xf7\xb2\xee\xbd\xfc\x9f\xf6\xc1\x8e\xdd\xf0\x06\xf6\xb7\x91\xc6\xc7\x0f\x07\x88\xcd\xe9\x2a\xc8\x8c\x16\xb6\xf1\x9d\xf9\xcb\x6e\x52\x70\xfa\xee\x7d\xdb\x4b\x52\x52\x72\xaf\x4a\x88\xfa\x4c\x7f\x00\xe0\x30\x79\x68\x62\xfb\xbe\xa2\x70\xea\x63\x82\x2b\x70\x45\xb5\xbd\xef\x25\xa9\xcc\x75\xb7\x1c\x6c\xa4\x60\x18\x07\x78\xf0\x04\xbf\xc3\x75\x7f\xe8\x12\x8d\x78\x8f\xee\xdb\x15\x6f\xd7\x07\xec\x71\x85\xf6\xc1\x6c\xec\x7f\x1f\xef\xf4\x0f\x76\x34\x58\xf8\x8d\xc3\xee\xde\xac\xee\x65\x98\x59\x37\x86\x98\x3f\x3c\x5b\x3c\xe1\xca\x16\x8a\xa0\x4b\xb2\x62\x42\x36\xaf\xc1\xee\x23\x22\x6e\xca\xbe\x2e\x82\x09\x28\x5a\xd0\x4c\x3f\x68\xd6\x4f\x40\xd3\xb2\x2a\xee\xbf\x8d\x30\xd2\x95\x50\x32\xfe\x91\x92\x7c\x7d\x45\x33\xc1\xf3\xbd\xc4\xef\x60\x77\xde\x33\xce\xca\xba\x04\x5e\x97\x33\x8a\x0b\xaa\x2c\x27\x14\x2b\xe8\xba\xd9\x4b\xa2\x13\xe0\xf4\xb6\x58\x3b\x71\x93\x43\x25\xf2\x46\x02\xcd\x28\x48\x33\x44\xec\x54\x29\x6a\x6d\x1e\xe9\x7b\xf1\x14\x73\x60\x5a\x75\xd5\x3e\x21\x93\x44\x19\x43\xf2\x18\x07\xc7\xb4\x51\xbe\x33\x8a\x71\x60\x96\x53\xb9\xb3\xc0\xc8\x8e\xa1\xae\x08\x2b\xcc\x53\x6c\x0a\x6f\xe9\x9c\xd4\x05\xb6\x6a\x85\x97\x70\x68\x06\xdd\x78\x03\x7c\x99\x9a\xa7\x8a\x12\x82\x9b\xff\xda\xfa\x22\x38\xf9\xa3\x7d\xdc\x5e\x78\x38\x1f\xae\x56\xda\xd0\x7e\x55\x4b\x1b\xaa\x48\xad\xf6\x71\x78\x6d\x1c\x90\x73\x9e\x9b\x5b\xda\x7f\x21\xf4\x14\x0d\x53\x8e\xef\x3e\x26\x85\x9d\xdf\x4c\x88\x82\xee\x11\x4b\xad\xa4\x58\x48\xaa\xd4\x5b\x4a\xf2\x82\x71\xea\x7b\xc2\xaf\x97\x14\x4a\xf2\x09\x4f\xb9\x66\x25\x35\xe6\x54\xff\x8c\x93\xde\x7c\xf6\xb3\x8b\x04\x94\xe4\x86\xb6\x03\x84\x19\x9d\x63\x13\x5f\x5c\x8e\xee\xdc\xd8\xd3\xb9\x17\xcb\x39\x61\x05\xcd\xa7\x38\xd6\xde\xea\x76\x3d\xef\xed\xb1\x34\x5f\x33\x5e\xef\xc7\x53\x0b\x33\x42\x74\xb8\x58\xf6\x7d\xab\x07\xed\x07\x62\x18\x5a\xcd\xb3\x17\x47\x73\x7f\x81\xc0\xe5\xc6\xc6\x9c\x7d\xca\x6c\x88\x40\x52\xa2\x04\x6f\x6e\xd0\x5e\x2c\x55\x2d\xe7\x24\x6b\x6c\xdc\xc1\xe4\x5d\x23\x73\xb8\x10\xda\xb5\xb0\x6d\x16\x7c\xcf\xc1\x16\x05\xb8\xd6\xcb\x54\x69\x56\xa2\x58\xca\x6b\xd9\x34\x89\xc6\xb3\x30\x7a\xf3\xbb\x03\x3f\x10\x1e\x7f\x7c\xf9\x72\x2f\xab\xfa\x71\xaf\xb8\xa4\xe8\x65\x1a\x7f\x47\x2e\x5a\xe9\xdf\xa8\xd8\x4a\xe4\xca\x9c\x47\xe6\x5e\x49\xd8\xfb\x7a\xaf\x21\xe3\xc9\xcb\x99\xd2\x8c\x2f\x6a\xa6\x96\x30\xa3\xfa\x96\x52\x0e\xf4\x93\xad\xb3\x04\x7f\xa7\x52\xe0\x01\x34\xdb\x73\x4f\xe8\x73\x17\xf5\x17\xfd\xd5\x73\x58\xf1\x15\x53\x4c\xf0\x3f\x33\xa5\x85\x5c\xbf\x63\x25\xbb\xb7\x20\x75\x43\x5b\x12\xaa\xd3\xbf\xa2\xc8\xb1\xe3\x3f\xcb\xc8\x15\xb5\x13\x95\xd4\x28\xc0\x7d\xd7\x1e\x5d\x2c\x60\xe4\xc6\x8c\x64\x37\x3b\x36\x71\x63\x83\xf6\xe2\xbb\xef\x26\xb6\x1b\xb4\xef\x68\x5f\xbd\x7c\xfa\x5d\x6c\x0c\xb8\xd1\x3b\x87\x2f\x81\xf6\xcf\x51\x9d\xd8\x8b\x73\xf6\xc9\xae\x6f\x7f\x27\xf7\x13\x5b\x4b\xa1\x28\x32\xb1\x01\x14\x64\xdd\x84\x5f\x99\x6a\xcd\x13\x23\xc1\x04\xdf\xd3\x75\x44\xe6\xf3\x21\x97\x4e\xe8\xe1\xdb\xa7\xac\x95\x86\x92\xe8\x6c\xf9\x60\xb0\xb8\x21\x63\x2a\x35\xe6\xec\x81\x72\x4f\xd1\xfd\x77\x72\xcf\x30\xdd\xd8\xb0\x1a\xd8\x59\x9c\x7d\xaa\x8c\x9e\xb8\x3f\x1e\x3f\xa4\xc1\xb6\x6e\x32\x19\x3a\x8a\x70\xae\x7b\xb2\xed\xce\x56\xf3\x9e\x40\xf5\x6b\x35\x7d\xff\x3b\x66\xb7\xf7\xe6\x79\x7a\xf1\x76\x5f\x79\x39\xde\x8d\x33\xd2\x91\xb3\x19\x9c\xb4\xcb\xb3\x73\xda\x7b\x73\x84\x26\x00\xe5\x78\x0c\xa3\x94\xf8\x66\x57\xc7\x40\xe0\x86\xae\x8f\x47\x30\x45\x9b\xa7\x57\x60\x10\xd9\x4a\x5a\x38\xeb\x96\x62\x7f\x7d\xf2\x40\x12\xc7\x90\xec\x58\xf6\xdd\x8a\xd1\xa7\xdf\xd2\xfe\xc1\xea\x86\x26\x66\x2a\x23\x7e\xbb\x59\x92\xbd\xff\x64\xec\xb5\xb4\x74\x43\xd7\x63\x7e\x7d\xe3\x68\x99\xdd\x71\xde\x03\x7b\xc6\xcc\x37\xcc\x1e\x8e\x62\x69\x3d\x09\xed\xd1\x1a\x83\x30\x18\x30\x19\xe7\xa7\x6e\xa8\x59\xe8\x80\x65\x68\x8f\x6f\x0f\x68\x85\x57\xe1\x60\x5f\x3f\x70\x43\x78\xf4\x8d\x7c\x5b\xb2\x0a\x0d\x87\x26\xe4\xeb\x4e\x35\x7c\x47\x0a\x36\xe6\x36\xf4\x67\x68\xf5\xd7\x39\x3f\x36\x06\xbc\xf9\x0f\xaa\x44\x35\xf2\x7e\x19\x7a\x2b\xa8\xba\x10\x1a\xff\xfe\x1f\xb2\x49\x76\xfa\x01\x5b\x64\x19\xb8\xd8\x1c\x4a\x5e\x74\xac\x8c\x1d\x47\x37\x96\x69\x53\xd3\xb4\xdd\x7c\xa6\xe0\x9c\x83\x90\x6e\x75\x3d\xae\x80\x1b\xa4\x1d\x1e\x5a\x00\x33\x1b\x06\xc7\x28\xde\xb8\x85\x86\x5d\xe3\x73\x1b\x2e\xe4\x60\x07\xa3\x0d\xd5\x0e\x13\xad\xdb\x91\x2c\x2d\x1f\xf4\xcc\x54\x05\xbe\x3e\xdd\xb3\x90\x34\xb0\x36\xf6\x50\x76\xd6\x26\x95\x54\x2e\x10\x4f\x90\xed\x19\x91\x6e\xa7\x37\x5a\x3b\x5b\x1a\xa9\xa3\xfb\x1f\x36\xe2\x1c\xa2\x21\x64\xdd\xdd\xfe\x86\x94\xfd\xfb\x81\xf3\xfd\xff\x18\xcd\x8d\xbb\xfa\x7f\xf7\x57\x39\x84\x49\x35\x85\x53\x50\x8c\x2f\x0a\xda\xe7\xd1\x78\x0f\x7a\x1f\xb7\x37\x5b\x33\x22\xa6\xc0\xa8\xd8\x15\x29\x28\x47\xa7\x22\xe1\x40\x6d\x34\xc0\x8c\x76\xd3\x1c\xdc\xff\x08\x5b\x6b\xde\xe8\xa9\x16\x0e\xf2\xe2\x86\xae\x5f\x1c\x6f\x5e\x96\xbd\x39\xbe\x38\xe7\x2f\x8e\xd1\x92\xd9\xba\x18\xad\x81\x84\x88\x93\x17\xf8\xb3\x17\xfb\x9f\xc6\x5d\x16\xa9\x8f\xa5\x39\xca\xb8\xf1\x8b\x7c\x0c\x3f\x70\xcf\xf3\xdc\x20\x56\xbd\x9e\xe7\x03\xbf\x94\xc3\x6d\x6b\x01\xb5\xa2\xf6\x7d\x8e\x72\x64\xaf\x71\xd3\xe6\x65\x88\x6f\x3c\x74\xa9\x71\x7a\x8b\x6f\xb9\x67\xf0\x7c\x92\xa2\x28\x18\x5f\x7c\x5b\xe5\x44\xef\x91\x96\x63\x69\xb0\x5a\x07\x1f\x2d\x0b\xa8\x91\x87\x39\x95\x73\xb6\x80\x8a\x48\x52\x8e\x30\x94\x2f\x5d\xd5\x6e\x3c\xcb\x6c\xde\x8f\x22\xb9\xf5\xbf\x5e\x57\x14\xfe\x5f\xf8\xd8\x1f\xf1\xfe\xfc\x27\x93\x09\x5c\x7f\x78\xfb\xe1\x35\xd8\xbf\xb4\xef\x62\x2d\x60\x2e\xd0\x7d\x22\x6a\x69\x86\xbe\xa2\x7c\x6f\xf7\x28\x58\xbf\x83\xd9\xca\x0f\xf3\x63\xb8\x5d\x12\x4d\x57\x54\xc2\xad\x39\x3e\x19\xcb\x69\x1b\xb1\x98\x1e\x3c\xde\x8d\xf2\xb1\xcc\x4b\xf2\xe9\xaa\x96\x8b\xbd\x37\x1c\xb6\x36\xbd\xef\x64\xef\x5c\x59\xe6\x88\x8f\xd3\x86\xbd\xaa\x2f\x2a\x5b\xd2\xbc\x2e\x68\x0e\x64\x26\x56\xb4\x1f\x00\x1c\xc5\x73\x38\x1c\x34\x6a\x6b\xda\x7c\x88\xb1\xcf\x66\x4a\x14\xf5\xde\xa8\xa9\x01\xd3\x43\xfa\xe9\x35\xfc\x01\x41\x6e\x04\x2a\x2a\x33\xca\x35\x59\xd0\x9e\x23\x75\x14\x57\x14\x09\xc8\xf3\xd5\xcb\x7f\x39\x72\x9e\x3b\x33\x52\xe7\xc7\x7e\x69\x6e\xc2\x7b\xf2\xe9\x5b\xde\x86\x9b\xc6\x19\x0d\x0a\x5e\x4e\xe1\xd4\x4d\xb8\x99\x04\x7e\x46\x91\xd5\x05\x7a\xc8\xe7\x52\x94\xe3\x06\xdd\x4d\x7b\xb6\x06\x29\x6a\x84\x22\x42\x5d\x0d\x3c\xe4\xa3\x58\xfe\xf6\x0f\xff\x32\x85\xb3\x4f\xa4\xac\x0a\xfa\x1a\x6e\x97\xd4\x01\x60\x98\xc2\x17\x8a\x16\xf0\xbb\x97\xff\x32\xce\x90\x44\x68\x05\xbd\xed\xf9\xe3\xba\x73\x46\xcc\x21\xab\x2b\x60\xa5\x4d\x34\xa2\x7b\x83\x7f\x2c\xb9\x01\xd2\x46\x7a\x36\xa2\x4f\x69\x22\xb5\x3a\x06\x44\x30\x8e\x7e\xa8\x62\x8c\x42\x68\x52\x6c\xf8\x86\xd1\xe7\x4a\x6f\xed\x61\xc9\xc7\x2d\xac\x39\x47\x14\xc3\x35\xf0\xea\x77\x2f\xff\x65\xdb\xe1\xff\xe1\xa1\x3a\x4a\x9b\x64\x46\x84\x23\x41\x80\xef\x8c\x52\x0e\x37\xac\x28\x68\x7e\xbc\xb1\xdc\xa3\xb8\x6e\x6d\xcd\xbc\x96\x7a\x49\xe5\x31\x50\xae\x9a\x10\xce\xd8\xf5\xdc\x58\x4b\x1c\xb5\xac\x39\x47\xcb\x1f\xa3\xd2\x18\x13\x1a\xf7\xec\xeb\xe2\x49\x6e\xd3\x8d\x99\xab\xa1\x14\x4a\x6f\x2e\xf1\x68\x51\xb0\xb7\x9a\x00\x74\x6e\xad\x3f\xcc\xc7\x08\xf0\xc9\x68\xa7\xfa\xe6\x5f\x8e\x7e\xd0\x7e\x9a\xdc\xb4\x15\x5e\x26\x8c\xeb\x89\x90\x13\xcb\xe4\x35\x68\xb9\x67\x5c\x13\xac\xc2\xea\xc9\xc0\x67\xa5\xb6\xea\x6e\x5c\xdb\xa7\x63\xdc\xdb\xf0\x2e\x4d\xb5\xa1\x7d\xc6\xdd\xd7\x3b\x35\xd5\xa6\xf6\x19\xc5\xf6\x61\x9d\xd2\xfb\xd0\x51\x9c\xfb\x3a\x25\x17\xb7\x7c\xb7\x56\x1c\xc5\xf2\xbd\x33\x77\x9c\x3e\xec\x87\x14\x07\x9a\xc7\x47\x09\x6c\x69\x29\xfb\xd2\x1b\xc4\xf4\x02\x44\xa1\x59\x01\xc3\xf9\xff\xd9\x16\xde\xe3\x2c\x81\x4e\xd5\x3d\xa0\xbe\xc6\x9d\x83\x0f\x98\x4b\xd1\x68\x27\xf3\x82\x44\xf4\xcb\x71\xe4\x15\x68\xd5\x81\xb5\xd6\x31\xb2\x35\x8a\xa7\x61\x66\xa7\xba\xc3\x32\xe8\xb4\xcc\x78\x29\xb0\x4b\x6b\xdb\xb5\xf0\xb2\xd8\x8c\x5e\x2a\x0a\xd4\x4b\xea\x4e\x65\x53\x50\xb2\x77\x0e\x95\xa5\x1d\xc7\x27\x29\x9b\x5d\x74\x5f\xd2\xf9\x26\x0d\x9d\x06\xe6\x75\x8a\x4b\xdc\x45\x5a\xdf\xd8\x83\xfc\xe2\x23\xb5\x28\xb9\xed\x26\x53\x77\x91\x90\xf0\x62\xf0\xd0\x7d\xd1\x8a\x2d\x73\x06\xbc\xde\xc0\xa3\x96\xb5\x09\xf5\x8e\x77\x9e\xb8\x3f\xec\xd5\x81\xc1\xcc\x2b\x73\x25\xf0\xc2\xdc\xb2\x62\xbf\x60\xea\x8c\x36\xe0\xc2\x67\xe0\x27\x29\xa9\x26\xf7\x95\x34\xd8\xa4\xa1\xd9\x71\xa5\x09\xcf\x89\xcc\xdd\xf8\x0e\x0e\x54\xcb\x70\x0a\xef\xc5\x88\x48\x30\xe3\x73\xf1\x1a\x96\x5a\x57\xea\xf5\xc9\xc9\x82\xe9\xe9\xcd\xbf\xa9\x29\x13\x27\x99\x28\xcb\x9a\x33\xbd\x3e\x41\x10\x19\x9b\xd5\x5a\x48\x75\x92\xd3\x15\x2d\x4e\x14\x5b\x4c\x88\xcc\x96\x4c\xd3\x4c\xd7\x92\x9e\x90\x8a\x4d\x3a\x6f\x87\x9a\x96\xf9\xaf\x9b\x01\x3d\xa2\xab\x62\x70\x43\x31\x96\x25\x57\x74\x52\xf3\x1b\x2e\x6e\xf9\x04\x3d\xa6\x6a\xc4\x5d\xdd\x07\x99\xdc\xd0\xc6\x7e\x6c\x80\x91\x77\x82\x8d\xf7\xbf\xac\xf3\xe6\x88\xdb\xcd\x7c\xc4\x4d\x32\x53\x9e\x10\x9e\x4f\x2c\x58\xee\x11\xf7\x6a\x6c\x0c\x7a\xd2\xc1\x76\xf7\xb5\x4c\x7c\x3c\x57\x24\xd3\x6c\x45\x3d\x20\xa2\x0d\x0d\x0e\xc2\x87\x26\x8d\x2e\xaf\xa5\x3d\x0b\x1d\x56\x74\xf4\xdb\xbd\x12\x39\x94\x64\x8d\xb6\x3b\x8e\x12\x84\x35\xb3\xb8\xc8\xa9\x8b\xbd\x3e\x58\x0d\x79\x83\xad\x80\x2b\x63\x94\x5d\xb3\x92\x36\xa8\x53\x8c\x66\xaf\x95\xa6\xa5\xc5\x06\xd9\xcf\x1a\xe9\xc1\xd0\x72\x6d\x61\xad\xf2\x06\x98\x6e\xf0\xa2\x84\xe7\xf8\x98\x07\xa2\x94\xc8\x8c\xb5\x38\xee\x0d\xdb\x9d\x80\xc6\xeb\xd6\xc4\xee\x08\x54\x42\x31\x5c\x14\x67\x11\x8c\x31\x33\x7d\x4d\x89\x1e\x28\xec\x8f\xbf\xdf\xff\x88\xcd\xb1\xc1\xe5\x28\xe4\xc2\x10\x41\x3d\xef\xe7\xc1\xbb\xa3\x71\xa0\x1a\x07\xe7\x58\x33\x33\x13\x5c\x69\x49\xd8\xfe\x79\x5f\xe0\x0b\x3c\xf1\xc5\x79\x00\x9e\xf1\x53\x8f\x85\x83\xed\xec\x91\xc6\x6c\xc0\x6b\xd3\x6c\xc6\x48\x96\xd0\x5b\x6c\x57\xea\xa4\xc9\x9a\x32\x62\xda\x2b\x8c\x3a\x7a\x2d\x21\x60\x3d\xed\xdf\xd2\x39\x95\x92\xe6\x6f\xf1\x1d\x70\xd5\xce\xe8\x7c\xc1\x45\xfb\xed\xb3\x4f\x34\xab\xf7\xab\x27\xb7\x4d\x5b\x71\xaf\xc6\x09\x2f\xf7\xb7\xd3\x76\x0f\xdb\x88\x97\x86\x99\xb3\xfe\x04\x6e\xe9\xd8\xe0\xbd\x25\x34\x1d\x15\xd1\x4c\xcd\x6d\x5d\x9a\xe6\x60\x00\xed\xe2\xb4\x5e\x9c\xdb\xab\xda\x82\x25\xd1\x10\xb1\xa5\x07\x1e\xa8\x34\x78\x17\x19\x35\x90\x2d\x85\x50\x46\xf2\xe1\x39\xc6\xf1\xaf\x98\x40\xec\x99\x17\x4f\x2c\x86\x21\xa1\x34\x3a\xa0\x29\x8a\xd1\x4d\x7d\xec\x91\xb6\x74\xdd\x68\x27\x1c\x1e\x53\xd6\x8d\xd9\x9e\x3b\x2f\x9e\x0e\xb1\x65\x86\x8b\xc1\x4e\xf3\xc5\x02\xed\x78\xa5\x41\xd5\xe3\x62\x0d\x0d\x89\x39\xdc\x52\xb6\x58\x6a\x75\x0c\x6c\x4a\xa7\x78\x9b\x29\xc9\x96\x38\x7c\xff\x13\x55\x52\xaa\x07\xdd\x8b\x3d\x65\x74\x43\x83\x78\xfa\x61\x5b\x03\xc1\x15\x40\x19\x0b\x85\x19\xf0\xdc\x92\x02\xfe\xb2\x11\x30\x2c\xdd\xc1\x1b\x80\xea\x6c\x7a\x74\x0c\x6d\x99\x42\xbf\x8b\x54\x97\xe6\x0a\x31\x4d\x8d\x2d\x85\x7e\x0b\x29\xea\x85\x3d\x01\x74\xdf\x5c\xcb\x5d\x84\x7b\xd3\x96\xd8\x40\x54\x67\x8e\xfe\xc1\x17\xf6\x50\xec\xff\xae\xee\x93\xb6\x05\x8c\xcc\xb0\xd9\xbc\x33\xd4\x10\xfc\xe1\x2d\xa5\x28\x64\x42\x4a\xaa\x2a\x61\x3d\x98\x9b\x50\x92\xff\xe9\xcd\xd7\x0c\xee\x50\x1d\x75\x97\x6a\xc9\x16\xcb\x90\x3b\x45\x9c\x31\x39\xbc\xf3\x3e\x82\xc4\x17\xd3\x64\xc9\x0b\xd9\x64\x69\x88\x44\xe6\xae\x1e\x45\x98\xfc\x1a\x98\x0e\x9a\xca\xb2\x39\x11\x46\x4c\x78\x72\xb4\xa6\x83\x43\x7f\x34\xed\xc7\x9d\x44\xf3\x64\xf9\x12\x0e\x51\x10\x32\x7d\xa0\x50\xc9\x4c\x44\x75\x34\x85\x53\xe0\xb5\xf7\x30\xdb\x85\xbb\x6b\x09\x3c\xf9\x72\xd1\xae\x80\x1b\xb4\x59\x4c\x25\xba\x71\xfb\xdd\x0a\x7f\xb3\xcc\xd2\x78\x9c\x75\x9f\x26\x6e\xbd\xe8\xd8\x10\x6a\xc7\x20\xe0\x04\x84\x18\x96\x0d\x87\x66\xf4\xbe\x1c\xb6\x52\x01\x50\x80\xee\x99\x1d\x7d\x1f\x99\x33\x77\xdc\x7b\x85\xb6\x42\x2f\x80\xe7\x50\x2e\xdb\x95\xf7\x3b\x77\x10\xe3\xec\x41\x94\x3d\x84\x80\x0c\x98\xdd\xb4\x99\xdc\x61\x73\x60\x82\x58\xc2\xf0\x5c\x0c\x8c\xa4\x40\xc6\xb3\x35\xf2\x1e\x95\x90\x74\x37\x85\xe9\xb1\x8e\x02\x34\x5a\x47\x3b\xae\x56\x20\xc7\xdd\xb9\x49\xc1\x4c\xb7\x53\x77\x82\x59\x6e\xa7\xfe\x04\xb3\xbc\xa1\xeb\xe3\xcd\x84\xa0\x60\xa6\xbb\x12\x8a\x82\x99\x9a\x41\x8e\x4d\x33\xba\x63\x78\x31\x84\x94\xa5\x30\x55\xd9\xd1\xb8\x44\xa5\xbb\x78\x44\xda\xc0\x38\xf2\xd7\xd2\xe8\x54\xa7\xdd\xb4\xe9\x90\x89\xc0\x12\xc2\xb2\xa7\x76\xd3\xae\x9c\xaa\x38\x8c\x47\xe6\x65\xdd\xc1\xc5\x2f\x84\xbc\x9b\xfc\x72\xb8\x76\xd3\x46\x99\xb8\x91\x05\xbd\xee\x27\x97\x14\x36\x48\xf3\x8a\xb4\x27\x5b\xa9\x62\x51\xf8\x62\xba\x59\x97\x40\x16\x67\x11\x06\x49\x68\x51\x58\xda\xbc\xa6\xe3\x80\xbc\xb4\xbb\xe8\x6b\x6d\x75\xd2\xbb\x28\xfc\xa2\x1e\x7a\x9f\x9c\xb8\xdd\xb4\xf1\x48\x8f\xb4\xcb\x21\x39\x76\xbb\x69\x98\x79\x17\x85\xe5\x30\x7b\x2f\x0e\xcb\x26\x03\x30\xda\x20\xb7\x92\xed\xa2\x70\x0d\xc9\x2d\xdc\x4d\x1b\x19\x87\x51\x78\x46\xcb\x5a\xdc\x4d\x9b\x29\x5b\x51\x98\x0e\xf3\x21\x9f\xf3\xd2\x7e\xad\xcd\xb2\xbe\xd3\xcf\xfd\xac\xda\x5a\xd5\x2e\xcf\x30\x0a\x47\xe7\xee\x3e\x1e\x51\x50\xed\x21\x6a\x0a\x81\x60\x45\x97\x4a\xd2\xb1\xc1\xf9\xbb\x88\x60\xd2\xb2\x47\x54\xfe\x6e\x42\xc0\x6e\x93\x74\x1b\x85\xe3\x46\xe2\x6e\x24\x73\xa9\x4d\xfe\xb5\xe9\xbc\x51\xb8\x7a\xa4\x04\xef\xa6\x58\xce\x08\x4b\x51\x5c\x12\xfd\x81\x05\x2b\x5e\x74\x5b\x7d\x65\x31\x5f\xff\x94\x1e\x2b\x8b\x77\x4b\x1e\xab\x7b\x29\x79\xac\x92\xc7\xca\x8f\x92\xc7\xea\x01\x4a\x1e\xab\xe4\xb1\xda\x83\x92\xc7\xaa\x47\xc9\x63\x95\x3c\x56\x7e\x94\x3c\x56\xcf\xdd\x0b\x90\x3c\x56\xc9\x63\x95\x3c\x56\xc9\x63\x95\x3c\x56\x9e\xf4\x4b\xf6\x58\x59\xbc\x58\x24\xa0\xdc\xf7\xc8\xcc\x37\xcb\x6a\x63\x60\x4c\x2f\xad\x2f\xad\x49\x15\x1f\x00\xdd\x02\x38\x73\x91\xd3\x2b\xf7\x60\xba\x46\x40\x9e\xad\xba\x17\xc0\x52\x12\xbe\xa0\xf0\x6a\xf2\xea\xe5\x5e\x45\xc0\x77\x93\x6f\x36\xd8\x90\xc6\x15\x0c\xdf\xa4\xbb\x30\xf9\x8f\x94\x99\xe3\xb4\x5d\x9b\xf3\x12\xec\x8f\xbc\x23\xe9\x65\x64\x0f\xcc\x21\x95\x54\x03\xd1\x03\xe8\x30\x2b\x69\x9b\x00\xe7\xc5\xb3\xdf\xd4\xa1\xab\x0f\x26\xb8\xc5\xee\x7b\xb1\x34\xc7\x7a\xfa\x8f\x5b\xd1\x8c\x12\xe5\x99\xa0\x82\xbd\x6e\x9a\x55\x15\x25\xb5\xe5\xfc\x43\x14\x4a\x25\x72\xa0\xcd\xa9\x84\x43\x3a\x5d\x4c\x21\xaf\xa9\xad\x80\xe9\xc5\xd1\xd6\xa5\x38\x3a\xee\xa7\xa5\x96\xe6\xa1\x23\xcd\x7f\x3c\x37\x48\x37\xf9\xa9\x74\x45\xb9\xae\x49\x51\xac\x81\xae\x58\xa6\xbd\x37\xdd\x4c\x1c\x8b\xd2\x30\x6d\x13\x0b\xfd\xd3\x1c\xbc\x9d\x93\x21\x0e\xc9\xc9\x96\x34\xf6\x39\xa5\xa1\xde\xc3\xad\x31\xf8\xea\xc3\x0d\x9f\x92\x5d\x97\xa9\x0b\xde\x78\x8b\x74\x31\xdf\x08\xdb\x68\x33\xc6\x69\x90\x53\x12\x59\xa0\x58\xfc\xf0\xd1\x2f\x39\x06\xa2\x58\x46\x81\xd6\xd0\x66\x68\xa6\x2e\x0a\x73\x45\xf1\x41\x16\x68\x22\x0c\x97\x3b\x30\x53\x04\x06\xd9\x22\xdb\x5d\x13\x02\xd8\xda\x04\xbf\xb2\x57\xe5\x16\xb9\x5f\x8b\x4a\x14\x62\xb1\xee\x9f\xeb\x80\x4f\x31\x3b\xdd\x6b\x2d\x68\x4c\xf6\x7a\xa6\x46\x16\x40\xda\x35\x70\xb8\xd8\xb8\x7c\x29\x77\x61\x8b\x3e\xd7\x48\x70\xca\x5d\xd8\x83\x52\x24\x38\x45\x82\xfd\x28\x45\x82\x1f\xa0\x14\x09\x4e\x91\xe0\x3d\x28\x45\x82\x7b\x94\x22\xc1\x29\x12\xec\x47\x29\x12\xfc\xdc\xa3\x6b\x29\x12\x9c\x22\xc1\x29\x12\x9c\x22\xc1\x29\x12\xec\x49\xbf\xe4\x48\x30\xa4\xdc\x85\x94\xbb\xb0\x17\x25\x8f\x55\xf2\x58\xf9\x51\xf2\x58\x3d\x40\xc9\x63\x95\x3c\x56\x7b\x50\xf2\x58\xf5\x28\x79\xac\x92\xc7\xca\x8f\x92\xc7\xea\xb9\x7b\x01\x92\xc7\x2a\x79\xac\x92\xc7\x2a\x79\xac\x92\xc7\xca\x93\x7e\x79\x1e\xab\x4a\xe4\x91\x1b\x72\x54\x22\x8f\xd8\x8f\xc3\xa2\x8f\x33\x31\x29\x44\xd6\xf4\xe3\x1e\xcd\xd5\x0c\xc9\x66\x25\x80\x22\xa5\x2d\x92\x7e\x0c\x7f\x17\x9c\xda\xa2\xf6\x40\xc6\xf3\x44\xa8\xb5\xd0\x4b\x2a\x0d\xfb\x43\x75\x34\xba\x3c\x75\xea\x17\x32\x7e\xd8\xa9\x5f\x48\xea\x17\x92\xfa\x85\xa4\x7e\x21\x9f\x5d\xbf\x90\x25\x51\xe3\xdb\xf1\x36\x84\x06\x6b\xdb\x60\x22\x4e\xf6\x5e\x4f\xf1\x5f\x53\x59\xfe\xcf\xad\xee\x21\x9e\xc7\x7f\xd0\x71\xe4\x17\xd7\x3d\xc4\x88\x36\x27\x32\xcc\xf9\x09\xe8\xf5\x61\xcf\x86\xdd\xd3\xdc\xe5\x7a\xd2\xfc\x72\xb8\x2b\x9e\xcc\x6d\xdc\x0d\x17\x9f\xe4\x39\xcd\xa1\xa2\x72\x62\x25\xb2\xf0\x66\xc9\xf3\x1d\x3b\xd9\x9c\x18\xbf\xc3\xf2\xe4\x9d\x39\x22\xac\xf6\x53\xb7\xe7\x18\x4e\x21\x52\xee\x4f\x3f\xd9\xca\x37\x29\xd3\x52\x6b\x50\x6d\x36\xeb\x08\xe0\xd9\x1a\x00\xcf\xb0\x59\x47\x78\x4c\x6e\x02\xda\x25\x1b\x7d\x13\x10\x95\x8b\x13\x46\xc3\x20\x55\x93\x4e\x14\x17\xc3\x80\xe1\xaf\xbf\xd5\x54\x86\xbe\xa4\xc5\x8a\xca\x2e\x14\xd2\x18\x47\x2a\xd4\x59\xc8\x5c\xdb\xfe\x8c\x28\xfb\xd2\x88\x01\x63\x88\x10\xf6\x8d\x17\x1f\x8d\x9b\x55\x05\x9b\x7b\xbc\xc9\x3e\x86\xc3\x44\x01\x69\xd0\x2f\xf6\x04\x45\x60\xba\x13\x02\x13\xc3\x59\x14\x31\x2b\xb1\xa1\x2e\x2b\x31\x1c\x26\x11\xd1\x95\x15\xcd\x91\xb5\x4b\x48\x44\xf1\x8f\x3d\x0a\xc8\x06\x36\x81\x36\x91\xe2\x13\x44\xb7\x60\x9b\x88\x0e\xfa\x63\x1b\x8b\x8e\x13\x44\x89\x0d\xda\x81\x1d\xc0\x9d\x28\x4c\x6f\xe8\x3a\x22\x78\x07\xe2\x02\x78\x20\x22\x88\x07\x22\x01\x79\x20\x26\x98\x07\x22\x03\x7a\x20\x1e\xa8\x07\x36\xc5\x4d\x9c\xa5\xb3\xe4\xbc\x55\xf1\xe4\x17\xb8\xa3\x8c\x77\x24\xd6\xdd\x80\xbe\x60\x8c\x89\x17\x82\x68\x98\x21\x88\x0d\xa1\x80\xc8\xd8\x21\xd8\x3c\x46\x51\x45\x22\xd8\x30\x5b\x4c\x40\x12\x3c\x26\x28\x09\x86\xc0\xa4\x68\x3c\x1b\x18\x08\x82\x93\xa2\x71\x8d\x0b\x72\x82\xc7\x01\x3a\x41\x0b\x76\x32\x7a\x2c\x1a\xcb\xf8\xb8\xa9\x47\xb8\xa8\xf1\xf0\x4e\xb0\x79\x4d\x2d\xeb\x98\x02\x9f\xf0\x88\x78\x12\xb0\x2e\xc2\x88\x6b\x09\x03\x34\x55\xbc\xdb\x1e\x1b\xa2\x02\x76\x35\xcf\x79\x87\xaa\x8a\x3a\xd8\xc8\x1b\x1f\x19\xf5\x02\x8f\x82\xd2\x82\x47\x82\x13\x41\x1f\xad\x15\xef\xdc\x3f\x06\xea\x0b\x3e\xa7\xed\x8f\xbc\xf5\x1d\xf4\x27\xe6\xae\x37\xf0\x9f\x68\x3c\x2d\x8c\xa8\x0f\x01\x8a\xc6\x1a\xa1\x44\xf1\x60\x40\x10\x1d\x0a\x04\x71\xe1\x40\x10\x57\x1b\xa3\x2b\xef\x1d\x96\x1f\x7a\x0c\x27\xa1\xe5\x1c\xcb\x3f\x58\x92\xca\xa8\xce\xff\x73\x43\xd7\xc7\x78\xdb\xff\x6f\x8c\x47\x2c\x61\x52\x4d\xe1\x34\x1e\x1e\xb1\x37\xbe\xf0\x8a\xa9\x0d\xf5\x96\xd3\xac\x43\x9c\x25\xa5\x7f\xab\xd9\x8a\x14\x94\x6b\xff\xf0\x61\x9f\x08\x6f\xe2\xf6\x66\x9f\x36\xdd\xc4\x31\xc4\xfd\xed\x52\x28\xcc\xfb\xb2\x91\xd0\x38\xcb\xf0\xe2\x86\xae\x5f\x1c\xc7\x56\xa2\x86\xf1\x39\x7f\x61\x53\x0e\xe2\x1c\x82\x01\x1e\x37\xa2\x23\x51\xf0\x62\x0d\x2f\x90\xfb\x8b\xb0\x72\x89\x1d\x0d\x90\x2d\x44\xc6\x60\x19\xd5\x3f\x1e\xc9\xcd\x47\xf2\x9c\x19\x81\x47\x8a\xcb\xa8\xde\xb0\x48\x32\x9e\x93\x92\xaa\x8a\x64\xa1\x83\x1a\x88\xf6\x8e\x69\xe0\x44\x1b\x28\x9d\x72\x38\x98\x68\x8c\x5b\x17\xdd\x55\x5c\x27\x98\x16\x70\xd8\x80\x75\xc8\xc2\xdc\x3e\x7d\xf4\x3f\x03\x79\x0e\x6a\x71\xda\x18\x58\x49\x49\xf0\xbd\x7e\x81\x31\xce\x4a\xe4\x07\xaa\x5b\x57\x3f\xe0\x53\x43\xcf\x2a\x61\x3b\xd2\x05\xe9\x45\xe4\x23\xde\x90\x6b\xb7\xf6\xa1\xf7\x63\x29\xea\x22\x37\xef\x86\x16\x26\x1d\xca\xf2\xb0\x81\x6d\x1c\x99\x33\xc7\x85\x8e\xc9\x9a\x6b\x36\xe9\xf8\x7b\x43\xcd\x3a\x72\xa5\xc3\xd5\xa0\xc0\x7d\x20\xcf\xa1\x5c\x88\x62\xa0\x75\x90\xe0\x4e\x82\x85\x5a\x3b\xb7\x4b\x2a\xfb\xfb\x1e\x9e\xdb\x91\xd3\x39\xe3\x34\x07\xa2\x40\xd6\x9c\x9b\xd5\x14\xa1\x59\x72\x0e\xad\x6c\xcd\x32\x34\x20\xc2\x9d\xc3\xad\xf0\xb6\x70\x20\x0c\x8e\x44\xc0\xcd\x58\xea\xa0\x96\x04\x8d\x54\xc2\x43\x39\xe2\x02\x08\xee\x54\x18\xe1\xeb\x38\x2b\x60\xc3\x37\x34\xb7\xe7\x3f\x78\xf3\xdd\x8e\x4f\xe1\x0c\xd5\x4c\xbc\x05\x65\x0a\xa5\x08\x29\x0a\x71\x1b\x6a\x9d\x3d\xb7\x3e\x1d\xb7\x9f\x45\x9f\x8e\x0d\xa0\x60\x6a\xd3\xd1\x51\x6a\xd3\xb1\x4d\xa9\x4d\xc7\x67\xdd\xa6\xc3\x7b\x8f\xac\x4a\xbd\xa3\x5f\x87\x17\x47\xdb\xe3\xe3\xbe\x7e\x1d\x7e\x0b\x6a\x0f\xe2\x46\xbf\x0e\xf8\x7e\x49\x51\xae\x79\xba\x12\xcc\x95\x29\xeb\x42\xb3\xaa\xe8\xb2\x4b\xec\x32\x14\xde\x41\x0e\xd7\x71\x42\x6d\xe0\x95\xcd\x4a\x10\xcf\x44\xe4\x0d\x69\x8e\xe3\xc6\x24\x64\x85\xe6\x80\x9f\x59\x89\x29\x50\xa4\x28\x5c\x3b\x8b\x26\xa7\xdd\xe6\xc7\xb1\xcf\x39\x6d\xe3\x2d\x1a\xb5\x2a\x14\x98\x80\x46\xd6\xa1\xb1\xde\x0b\x23\x16\x8c\x35\xdb\xe8\x6a\x4f\x8e\xdb\x2e\x08\x8b\xc9\x58\x05\xa4\x6a\x60\x6a\x1c\x5b\x51\xde\xbd\x33\x0e\xd5\xd1\x51\x48\x9d\xa1\xc6\x4b\x10\xf3\xad\xf9\x08\x6f\xcc\x5d\x6f\xcb\x63\xfb\x46\xf2\xe4\x38\x78\x59\xed\x78\x1b\x79\xb2\x15\x7c\xf7\x9b\x28\xc0\x22\xdb\x78\x0b\xfd\xa9\x67\xbb\xff\x2f\x4f\x96\x3b\x5e\x41\xcd\x3b\xc6\xd7\xee\xb6\xaf\x1f\x3c\x4a\x4d\x6a\xa4\xc5\xed\x7b\xe7\xc6\xd9\x58\x64\xc0\x6e\x3c\x79\x16\x52\xe8\x2b\x2b\x1c\x60\x19\x29\xcd\xe3\x51\x52\x3c\x1e\x21\xbd\x23\x62\x6a\xc7\x3f\x47\x93\x9c\xc8\xa9\x1c\xdb\x69\x1c\xb1\x10\xf4\x83\x14\x8e\xd8\x09\x18\x91\x92\x2f\x9e\x95\x7f\xfc\x51\x12\x2e\x52\x45\xd3\x54\xd1\xd4\x8f\x52\x45\xd3\x07\xe8\x31\x2a\x9a\xc6\x4a\x7c\xe8\x27\x3d\x44\x63\xda\x24\x3c\xc4\xcd\xb1\x72\x71\xde\x7f\xaa\xc2\xa6\x51\x91\x9f\x5d\x52\x42\x93\x4c\x10\x89\x6d\x97\x90\x10\x07\x6c\x04\xa9\x4a\x2a\x26\x0e\x44\x07\xfc\x7f\x0e\x85\x4d\x23\x82\x7d\x7b\x00\xff\x58\x89\x2d\x76\xed\xa2\x1e\xcb\x47\xaa\x19\x19\x1d\x8c\xff\xa8\x35\x38\x53\x89\xd3\xcf\xa5\xc4\x69\xaa\x49\x19\x4d\x10\xff\x92\x6a\x52\x0e\x29\x1a\xf8\xfc\x91\x80\xe7\x8f\x03\x3a\xdf\x00\x9c\x47\xe4\xec\x0a\x61\xc6\x85\x8a\x6f\xc2\xc4\x81\x84\x62\x86\x1e\x11\x22\xbe\x01\x0f\xef\xc0\xdd\x11\x00\x39\xfd\xea\xe2\x08\xec\x0e\x75\x3a\xb9\xb2\x5b\x11\xc5\x79\xeb\xf6\x18\x00\xba\x03\x99\x6e\xfa\xda\x22\x80\xb9\xa3\xf9\xda\x22\xb8\x26\x1e\x03\xc0\x1d\x41\x3e\xc6\x00\x6e\xdf\x01\xda\xee\x60\xd7\x21\x70\xa6\x0d\xc0\xf6\x76\xbc\x33\x80\x79\xf7\x88\x8f\x0b\xb7\x7e\x04\xa8\x75\x64\x98\x75\x0c\x95\x1f\xac\xe8\x23\x1c\xdf\x28\xb0\xea\x9d\x90\x6a\x17\xa8\x0e\x98\xde\x20\xc4\xdd\x0b\x56\x87\x84\xb2\x36\xc3\xdc\x9b\x01\xeb\x50\xe0\x60\x6c\x20\xf4\x2e\x10\x74\x87\x8d\x0a\xb9\x62\x1d\x00\x7a\x0b\xc2\x1c\x12\xd8\xdb\x15\xa2\x0f\x83\x2f\xc7\x0e\xd3\xc3\x76\xa8\x3e\x0e\xca\xf6\xae\x60\x7d\xc8\x79\x1d\xc2\x95\x07\x80\xe3\x00\xb6\x0e\xaa\xfc\x38\x60\xe3\x58\x40\xe3\xa0\x82\xfa\x5c\xb3\xc7\x28\xaa\xdf\x97\x15\xa3\x27\x76\x47\x65\x7d\xb2\x12\x2c\x87\xaa\xd6\xda\x47\x8c\xb7\xb8\xa0\xfb\xaa\xeb\x8f\xe6\x4a\x54\xaa\xae\x7f\x0f\x7d\xc6\xd5\xf5\x83\x4e\x30\x0c\xeb\x8b\x6f\x83\x74\xbd\x38\x0e\xca\xf2\x6f\x97\xd8\xf7\x9f\x78\x53\x96\x7f\x47\x89\xfd\xd0\xa9\x4f\xb7\x4a\xec\x7b\x71\xdc\x28\xe5\xbc\x51\x62\xdf\x73\xe6\xc3\xb2\xfc\x5b\x25\xf6\xfd\xf6\xa8\x5f\x96\x7f\xbb\xc4\xbe\xf7\x48\xfb\x32\x71\x67\x89\x7d\x6f\x3c\x18\x55\xfa\xf8\xce\xbc\x02\x2f\xae\x83\xbb\xb3\xab\xce\xbe\x17\xd7\xb6\x36\xff\x9d\x75\xf6\xbd\x17\xb7\x41\x4f\x6f\xd7\xd9\xf7\x9b\xff\xb0\x36\xff\xb0\xce\xbe\xf7\x20\x07\xb5\xf9\x87\x75\xf6\xbd\x79\x0e\x51\xde\x9b\x75\xf6\x83\x86\xda\xd4\xe6\xdf\xac\xb3\xef\xb7\xa2\xa9\x36\xff\x6e\x4a\xb5\xf9\x9f\x01\x2a\x36\xd5\xe6\xef\x28\xd5\xe6\x4f\xb5\xf9\xb7\x28\xd5\xe6\x4f\xb5\xf9\x47\x50\xaa\xcd\xdf\xa7\x54\x9b\x7f\x34\xa5\xda\xfc\xa9\x36\x7f\xaa\xcd\xef\x4d\xa9\x36\xff\x38\x4a\xb5\xf9\x53\x6d\xfe\x08\x94\x6a\xf3\xf7\x29\xd5\xe6\x4f\xb5\xf9\x53\x6d\xfe\x08\x94\x6a\xf3\xa7\xda\xfc\xa9\x36\x7f\xaa\xcd\x1f\x4c\xa9\x36\x7f\xaa\xcd\x1f\x44\xa9\x36\x7f\xaa\xcd\x9f\x6a\xf3\xa7\xda\xfc\xa9\x36\xbf\x27\xa5\xda\xfc\x01\x94\x6a\xf3\xa7\xda\xfc\x61\x83\x49\xb5\xf9\x47\x52\xaa\xcd\x9f\x6a\xf3\xa7\xda\xfc\xa9\x36\x7f\xaa\xcd\xbf\x9b\x52\x6d\xfe\x54\x9b\x7f\x0c\xed\xac\xcd\x1f\x9c\xa8\x32\x78\x3c\x45\xcc\x54\x69\x8a\xfa\x6f\x17\xe8\xf7\xe2\x39\x28\xea\xbf\xbb\x40\xbf\x17\xdf\xa6\xa8\xff\x46\x81\xfe\xe7\xbb\xac\x58\xd9\x7f\xbb\x4a\xbf\x17\xc7\x7e\x65\xff\x5d\x55\xfa\xbd\x98\xf6\x2b\xfb\xef\xa8\xd2\xef\xc5\xb3\xab\xec\x7f\x6f\x95\x7e\x2f\xde\x58\xd9\xff\xbe\x2a\xfd\x7e\xe7\x15\x6d\xaa\xbb\xab\xf4\x7b\x31\x2d\x6c\x25\xa6\xbb\xaa\xf4\xfb\x4d\x9f\x64\xcb\x54\xa5\xff\x41\x4a\x55\xfa\x53\x95\xfe\x54\xa5\x3f\x55\xe9\x7f\x90\x9e\x3c\x1f\x29\x55\xe9\xbf\x8f\x52\x95\xfe\x3d\x29\x55\xe9\x4f\x55\xfa\x47\x53\xaa\xd2\x9f\xaa\xf4\xa7\x2a\xfd\x77\xf0\x48\x55\xfa\x47\x51\xaa\xd2\x9f\xaa\xf4\x07\xb3\x4d\x55\xfa\x53\x95\xfe\x10\x4a\x55\xfa\x53\x95\xfe\x54\xa5\x3f\x55\xe9\x4f\x55\xfa\xfd\x28\x55\xe9\x1f\x4b\xa9\x4a\x7f\xaa\xd2\x6f\x29\x55\xe9\x4f\x55\xfa\x47\x0f\x2e\x55\xe9\xf7\xa5\x54\xa5\x3f\x55\xe9\x4f\x55\xfa\x1d\xa5\x2a\xfd\xa9\x4a\x7f\xaa\xd2\xff\xc4\x55\xfa\x49\xad\x45\x29\x6a\xae\xaf\xa8\x5c\xb1\x8c\x9e\x66\x99\xf9\xea\x5a\xdc\xd0\x51\x00\xd2\x61\x54\xee\x1e\xa6\xa3\xa6\xc7\x78\xce\x32\x8c\x21\xdd\x2e\x29\x16\xc0\x27\xa0\x2c\x4f\x20\x96\x29\xe8\xd1\x5c\x3b\x44\x10\xce\x9e\x68\x96\x91\xa2\x58\x03\x0e\x79\xdc\x0e\xd8\x35\x9f\x09\x51\xd0\x11\xcf\x07\x67\xce\x52\x39\x4a\x9b\x0d\x96\xf8\x9d\x8b\x45\x77\xac\x60\x46\x0b\xc1\x17\x63\x55\x9b\x83\xa6\x56\x22\x9f\xc2\x9b\x8e\x59\x46\x38\x0a\xfe\x5a\x4a\xca\xf5\x48\xd8\xe3\xac\x29\xe7\x8b\x01\xd5\x52\xac\x68\x8e\xa1\x6d\x44\x2a\x5a\x97\xcc\xc8\x58\x68\x41\x89\x99\x2f\xa7\xdd\x84\x8d\x70\x27\x70\x89\xe3\xb6\x83\x9d\x8d\x93\x1c\x16\x31\xea\xb1\xdd\x63\xad\x18\x0f\xbb\x65\x23\xc8\xed\x5e\xd4\x68\x3e\x66\x18\x6e\xe8\xd6\x61\xa4\xbc\x40\x61\xbb\x16\x35\xdc\x12\xfb\xec\x95\x35\x47\xc1\x8e\xcb\x69\x8e\xc1\xb8\xe3\xe3\xfb\x5c\xf1\x8b\x9b\x4e\x50\x0f\x8f\xfa\x13\xff\x58\x26\x91\x0b\x0f\x73\x73\xb0\x75\x07\xa7\x72\x51\xdb\xd7\xa5\xbb\x68\x94\x6b\xb9\x46\x50\xb4\x8f\xa4\x37\x6f\xd6\x5c\x64\x37\xe6\xf8\x97\x64\x41\x0f\x0e\x14\xbc\x79\xff\xd6\xe8\x90\x5a\x79\xa9\x38\xe6\x0a\xd2\x3b\x2d\x54\x49\xb1\x62\xb9\xb9\xaf\xdf\x11\xc9\xc8\xcc\xab\x84\x00\x16\xdd\xa6\xdc\xbc\x9e\x7e\x73\xf8\xdd\xe9\xc7\x9f\x2e\x4e\xdf\x9f\x1d\x61\xb4\x88\x7e\xaa\x08\xcf\xbd\x46\x5a\xab\x2e\xd5\xc4\x9d\x7d\x33\x7d\xca\x57\x4c\x0a\x6e\x16\xd9\x67\x45\xcf\xe7\x40\x60\xe5\xe6\xda\x88\xbd\x19\x45\xd8\x56\xb1\xf2\xc3\x25\x6b\xf4\x2c\xb8\x35\x68\x8c\x50\xc6\xab\x5a\xfb\x3f\x3e\x30\x1d\x61\x46\xa1\xe6\xd9\x92\xf0\x85\x93\xa8\xfd\xf5\xf5\x60\xaa\xd6\x5c\x93\x4f\x66\xd6\xe8\x26\x57\x19\xa9\x68\x6e\xcd\x3c\x02\xb9\xa8\xfd\xb6\xff\x37\xbf\x39\x06\x46\x5f\xc3\x6f\x7a\x83\x9b\xc2\x99\xe3\xde\x1d\x0e\xdf\x55\xe0\x74\x45\x25\x0e\xd8\x1d\xa6\x63\x90\x74\x41\x64\x5e\x50\xe5\xc3\x54\xcc\x5b\xf3\xc2\xfa\xad\xdc\x61\xa0\x4d\xbc\xc3\x83\x27\x17\xba\xa7\x97\x5a\x5d\x03\xef\x05\xc2\xde\xe7\xc2\xe7\xf5\xb8\xd4\xba\x52\xaf\x4f\x4e\x6e\xea\x19\x95\x9c\x6a\xaa\xa6\x4c\x9c\xe4\x22\x53\x27\x9a\xa8\x1b\x75\xc2\xb8\x91\xc3\x93\x9c\x68\x32\xe9\x29\x8b\x13\xfb\xc4\x98\x64\xa2\x2c\x09\xcf\x27\xc4\x09\xa5\x49\x7b\x91\x4e\x7e\xed\x4c\xdb\x09\x69\x7f\x8b\xf1\x09\x99\xa8\x25\x2d\x8a\x83\xd1\x63\x0d\x79\xee\x7b\x3f\xf3\x03\x9e\xf7\x6e\xce\xa1\xd2\xfe\xac\x15\xee\x76\xee\x53\xb8\x10\x3e\x5e\x3c\x9b\x23\xe3\xae\x22\x2a\x66\xdc\x87\x69\x4f\xfe\xfb\x88\xfa\x46\x63\x9c\x5d\x5c\x7f\xfc\xcb\xe5\x87\xf3\x8b\xeb\x46\x71\x34\x6a\xc0\x87\xeb\x5d\x8a\x23\xec\xa6\xdf\xa5\x38\x3a\x35\xe0\xc1\xf4\x4e\xc5\x31\x54\x03\x3e\x9c\xb7\x15\xc7\x50\x0d\xf8\xac\xec\xb6\xe2\xd8\xa1\x06\x3c\xad\x88\xfe\xfa\xee\x54\x03\x5e\xd2\xb9\xa7\x38\x76\xab\x01\x0f\xae\xdb\x8a\x63\xa8\x06\xbc\xee\xd7\xb6\xe2\xe8\xa9\x01\x4f\x95\xbf\xad\x38\xfa\x6a\xc0\x83\xe9\x6e\xc5\x91\xd4\xc0\x3e\x1f\xea\xa5\x06\x28\x5f\x05\xaa\x80\xe6\x5d\xde\x13\x2e\xed\xb9\xf0\x11\x83\x5a\x20\x16\xcc\x89\x82\x76\xa3\xe2\x1c\xaa\xcf\x63\x3f\x07\xeb\x7b\xc6\x57\xdf\x11\x39\x00\xf3\xf9\xf9\x4a\x77\x6d\x10\x38\xa6\xc0\xfc\x78\x92\xce\x83\xe2\x9f\x78\xe8\x1d\xfa\x0b\x41\x22\x7b\xbc\xab\x2d\x85\x22\x85\xcd\xc7\xfa\x06\x52\x06\x07\xe3\x82\x94\x8d\x9f\xbb\xbf\xb7\xde\xde\xd4\xe6\x4c\x4c\xe1\x7d\xe3\xb2\x82\x37\x3f\x9d\xbf\x3d\xbb\xb8\x3e\xff\xea\xfc\xec\xa3\xaf\x9f\x36\x38\x06\x85\x1e\xfd\x28\x4b\x76\x10\xc7\x52\xb3\x74\xbf\xbd\xe6\xef\xd4\x5e\xe2\xad\x5c\x31\x51\x77\x91\x92\x98\xfb\xab\xb6\x64\xab\x37\x4b\x9b\x44\xb1\x6e\x3d\xd4\x51\x87\x39\xdd\xe9\xa9\xf0\xe6\x1b\xd5\x50\xb5\x74\x8f\xb9\xea\xcd\x33\xaa\xb7\xc3\xd2\xdd\x3e\x0f\xff\x8d\x8f\x6d\xf2\x5a\xba\xd7\xf0\x0d\xd9\xf9\x3b\xcc\x5f\x6f\x96\xf7\x78\x4f\xbc\x79\x36\xc6\xf3\x5b\x3a\x27\x75\x61\xfd\xa7\x2f\x5e\x4c\xc7\xdb\xa0\x96\xe2\x88\xdd\xaf\xa4\xf0\xee\x5c\x37\x10\xbd\x57\x98\x12\x8a\xbd\x5c\x43\x02\xb3\xbb\x8c\x98\x03\x97\x1c\xe6\x7f\xee\x7a\x6e\x2b\xe7\x1a\xb0\x51\xe4\x00\xc0\xab\xe1\x17\x84\xc2\x8d\x00\x8b\x8a\x91\xd4\x94\x09\x3e\x67\x8b\xf7\xa4\xfa\x86\xae\x3f\xd2\x79\x08\x18\x65\x78\x1e\x30\x46\xed\x32\x53\x82\x40\x5a\x62\x6e\xcd\x50\x3b\xcc\x10\x2c\x5a\x24\x24\x5a\x8c\x04\xb9\xd0\xe4\xb8\x58\xf9\x6c\x11\x72\xd9\xb6\xba\xb4\xc6\x48\x3b\xc3\x57\xa2\x39\x41\x71\x12\x23\x23\xa4\xc8\x84\xd8\xf5\x0d\x0d\x8d\x55\x67\xe0\x87\xaf\x55\x67\xec\x68\xeb\x56\x09\x66\xf9\xa0\x5b\x26\x13\x3c\xa3\x95\x56\x27\x62\x65\x6c\x43\x7a\x7b\x72\x2b\xe4\x0d\xe3\x8b\x89\xb1\x3b\x26\xf6\x8e\xa9\x13\xc4\x18\x9d\xfc\x1a\xff\x13\x3c\xa8\xeb\x0f\x6f\x3f\xbc\x86\xd3\x3c\x07\x81\xca\xb9\x56\x74\x5e\x87\x67\x4a\xdb\x96\xbd\x53\x20\x15\xfb\x8e\x4a\xc5\x44\x84\xfc\x9a\x1b\xc6\xf3\x63\xa8\x59\xfe\xa5\xaf\x7a\x6f\x28\xda\xf9\x15\x95\xc5\xce\x46\x3d\xc3\x57\x88\x43\x0b\xbf\xee\x7d\x7b\xab\x15\xf5\xc1\x5c\x85\xc4\xa2\x54\x37\x74\xdd\xa0\x34\x82\x59\xba\x07\x5b\x94\x4d\x1d\x0b\xb2\xd9\x24\x3c\xb8\x31\x75\xf6\x41\xab\xb4\x83\xe6\x67\x01\xfd\xce\x73\x51\x89\xfc\x35\xa8\xba\xaa\x84\x0c\x2c\xfe\x50\x52\x4d\x72\xa2\xc9\xd4\x48\x93\xe3\xe1\x97\x88\x63\x0c\xbb\xb6\xff\xd5\x32\x44\x68\xa0\xfa\xe1\xe0\xe0\x4f\xdf\x9c\xfd\xe5\x7f\x1d\x1c\xfc\xf8\x5f\xb1\x38\xa3\x19\x6a\x93\x6b\xe3\xb1\x57\x15\xcd\xa6\x5c\xe4\xf4\x02\xd7\x05\xbf\x54\x03\x98\x1a\xfe\x20\xec\x33\x34\xd1\xb5\x9a\x2e\x85\xd2\xe7\x97\xc7\xcd\x97\x95\xc8\xcf\x2f\xa3\x30\x46\x4e\xca\xfb\x2d\x04\xcf\xcd\xb8\xc3\x2b\x70\x49\x82\xea\x2b\xc7\x32\xf1\x3a\xbd\x16\x55\xf4\x3b\x9e\xe1\x42\xda\x61\x5a\xb3\x25\x2d\x49\x94\x3e\x0c\x5f\x35\x8b\x0f\x4c\xc1\xad\x64\x5a\x7b\x96\x23\xec\x13\xe3\xae\x22\x9f\x98\x1f\x1b\x2d\x80\x4f\xf8\x18\x66\xee\x8b\xd5\xab\xe0\xc4\x9f\x68\x46\x42\x7b\x6e\xa3\x1e\x15\xdc\x8b\x48\x86\xae\x55\x2e\xed\xf3\x20\xca\xbe\xf6\x01\xf5\x70\x7a\x79\x1e\xcc\x74\x65\xef\xc6\xb3\xd8\xd6\xa6\x5a\xd7\x57\xcf\xd4\x5a\x68\xc6\xd7\x08\x82\xd6\x6b\x1d\x76\x04\x31\xaf\xae\xad\x54\x06\x05\x2b\x59\xe0\x7d\x25\x3c\x47\xed\x40\x95\x56\x70\x68\x19\x4e\xb3\xaa\x0e\x53\x80\x8e\x4f\x49\x4b\x21\xd7\xc7\xcd\x97\xb4\x5a\xd2\x92\x4a\x52\x4c\x94\x16\x92\x2c\x02\xd5\x77\x33\x6c\x1c\x6e\xf7\x95\xfd\xd0\x68\x8b\xb2\x3d\xea\x90\x64\x1a\x5b\x8b\xa3\x85\x6b\x37\x36\x24\xcd\x7f\x39\x56\x42\x73\x3c\x9f\x81\x91\xd0\xde\xba\x8b\xe8\x6e\x8e\x37\xc1\x61\xa8\x86\xd0\x05\xd3\xae\x3d\xcc\x23\x14\x82\x58\x89\xa2\x2e\xa9\x3a\x6e\x9f\xc7\xe1\xee\x04\x21\x81\xf2\x15\xac\x88\x54\xcf\xe6\xf1\x9f\xb3\x15\x53\xe1\xf5\x8c\x76\xbc\xfd\x63\x34\xae\xc6\x9c\xed\x5a\x57\xb5\x76\xe5\xe4\x63\x19\x95\xf4\x53\x25\x14\xc6\x9b\x22\x54\xac\xb4\x94\xf7\xa3\x37\xaf\xc2\xfa\xf5\x60\x01\x0a\x4d\x25\x7f\x0d\xff\x79\xf8\xd7\x2f\x7e\x9e\x1c\x7d\x79\x78\xf8\xc3\xcb\xc9\xbf\xff\xf8\xc5\xe1\x5f\xa7\xf8\x8f\x7f\x3d\xfa\xf2\xe8\xe7\xe6\x8b\x2f\x8e\x8e\x0e\x0f\x7f\xf8\xe6\xfd\xd7\xd7\x97\x67\x3f\xb2\xa3\x9f\x7f\xe0\x75\x79\x63\xbf\xfa\xf9\xf0\x07\x7a\xf6\xe3\x9e\x4c\x8e\x8e\xbe\xfc\x4d\xe0\xc0\x09\x5f\x7f\x08\x32\x25\xc0\x96\x5d\x8d\xd2\x83\x60\xc8\x2d\x4a\x39\xa4\x4f\x93\xce\xe9\x39\x61\x5c\x4f\x84\x9c\x58\xc6\xaf\x41\xcb\x3a\xec\x91\xd2\x1c\xc7\xb8\x72\xf6\x63\xa4\xba\x7d\x3d\x93\xac\x35\xb3\x9f\x85\x20\x53\x34\x93\x54\x3f\xef\x38\x95\x1d\x63\xf3\xaa\xc0\x64\xf3\xe0\xa8\x03\x3a\xb7\x7e\x29\x36\x4f\x0a\x7b\xdd\x47\x6d\x82\x2f\x9e\xa2\x78\xaf\xdc\xb9\x14\xe5\x14\x7a\xc0\xaf\x55\x94\x76\xfe\x6e\x9c\x37\x34\xb8\x16\x55\x0a\xd3\xf9\x50\x0a\xd3\x85\x51\x0a\xd3\x8d\xa3\x7e\x98\xee\x0a\xef\x7e\x8a\xd1\xed\x22\xca\x57\x7e\xc0\xaa\x9d\xc8\xfb\xc6\x87\xa5\x05\x54\xa2\xaa\x0b\xa2\xbd\x32\x44\x76\xe1\xf7\xb7\x61\xf8\x1e\x9c\x9d\xf2\xeb\xd0\xac\x5d\x8e\x97\xaf\x7b\xa3\xdc\x8d\x50\x86\xd3\xa2\x00\xc6\x7d\x95\x17\x0e\xb2\xc9\x37\x92\xd4\xba\x93\x80\x60\x55\x51\xec\x87\xe4\xc1\xf3\x76\x49\x37\x96\x10\x98\x02\xa5\x89\xd4\x8c\x7b\x35\x83\xfa\xde\x70\x44\x73\xb4\x49\xbb\x61\xbc\xeb\x87\x14\xf0\x90\x6d\x4b\x98\xf5\x1a\xe6\x75\x35\x6b\x0a\xa2\x7c\xe6\xef\x5e\x0a\xb8\xaa\x9a\xdc\x20\xb6\x39\xa3\x39\xe5\x19\x9d\xc2\x77\xbe\xb5\x5f\x9b\x93\x34\x5b\x9b\xbd\x39\xe3\xab\x36\x13\xab\xb6\xc9\x3f\x3e\x87\xca\xac\xe8\xee\x71\xfe\xf3\xa6\x9e\x18\x31\xe5\xa0\x9b\x5d\x06\x8a\x97\xe4\x44\xbb\xb5\xf5\xe4\xb7\x05\x9f\x5b\x34\x87\x57\xae\x50\xd8\xcb\x25\xf4\xb5\xd0\x62\x23\x03\x1e\x9c\x5b\xcf\x84\x76\x41\x42\x6a\x6b\xdb\x67\x01\x9a\xf5\x9e\x3c\x9e\x09\xfc\x34\xd4\x5c\xdf\x69\xaa\x07\x47\x91\x87\x66\xfa\xf3\x33\xb3\x1f\xc1\xc4\xde\x61\x5e\x5b\xf3\x38\x88\x6b\xa8\x69\x1d\xc5\xac\x8e\x61\x52\xef\x32\xa7\x03\x92\x6b\x3b\x1a\x20\xde\xa2\x98\xc0\xe1\xe6\x6f\x38\x3c\xad\x92\x74\xce\x3e\x45\x91\x99\xa7\xbc\xdd\x40\x60\x39\xe5\x9a\xcd\x59\xc0\x9a\x1b\x23\x5a\xd2\x8a\x72\x04\x11\x60\x1f\x47\x63\x17\x78\xe6\x47\xc2\xe6\x0e\x3e\xbb\xe4\x3a\xeb\xa2\x89\xa9\xc0\xae\x62\x39\xa7\x92\xf6\x4a\xda\x2b\x69\xaf\x87\xe8\xd9\x6b\x2f\x27\x0f\x9a\x27\xfb\xd3\xaa\x1f\xac\x08\x13\x5a\xf4\xe6\x6d\xaf\x1e\x19\xde\x71\x6f\x77\xed\xfe\x77\xaf\x2b\x7b\x78\x82\x9f\xeb\x73\xc5\xb0\xf0\x6e\x5b\x4e\xbd\xd5\x9a\x5a\xd8\x52\x9c\x1e\x1c\x97\x6c\x61\x6e\x68\x41\x57\xb4\x70\xcf\x21\x28\x09\x27\x0b\x5b\x17\xde\xeb\x05\xe3\x22\xe8\x20\x24\xf6\x95\x94\x2c\x1f\x38\x4f\x7c\x27\xcf\x38\x18\xb1\x55\x08\x92\x23\x3b\x29\x8a\x82\x4a\x05\x05\xbb\xa1\xf0\x96\x56\x85\x58\xfb\x36\x20\x24\x3c\x87\x2b\x4d\xb4\x11\x53\x57\x54\xfb\xe0\x94\x03\x44\x01\xae\xc8\x65\x5d\x14\x97\xa2\x60\x99\x47\xdc\x6a\x78\xb8\xcf\xf1\x54\x57\x75\x51\x40\x85\x0c\xa7\xf0\x81\xfb\x9c\x6d\x31\x87\xd3\xe2\x96\xac\xd5\x31\x5c\xd0\x15\x95\xc7\x70\x3e\xbf\x10\xfa\xd2\x3a\x11\x7c\x0c\x9e\x7e\x66\xac\x65\x0d\x6c\x0e\xaf\xb1\xe7\x9e\x06\x4d\x7c\x84\x28\xeb\x35\x92\x3f\x36\x67\xae\x3f\x48\xab\x80\x6e\x99\xf2\xca\x2d\xbd\xb7\x18\x9a\xdf\xa5\xff\x35\x72\x32\xaa\xd7\x7e\xfd\x0f\x3d\x68\x05\x9b\xd3\x6c\x9d\x15\xa1\xf2\xf3\x34\xc3\x0c\x87\xae\x6d\x5c\x27\x31\x7c\x1c\x8c\xb6\x8b\xbd\x2b\x71\x8b\xae\x3b\xc6\xc1\xb6\x70\x57\x9e\x1d\xba\x3b\x71\xd3\xce\xd9\x3a\x80\xd5\x93\xfa\x02\x3d\xed\xd9\x30\x4b\xb6\x12\x4a\x5f\x69\x22\x75\x84\x16\xef\x07\x97\x0d\x33\xc0\xd6\xbe\x45\xe1\x6d\x08\xb0\xb2\xa4\x39\x23\x9a\x16\x6b\x20\x73\x8d\x85\x92\x43\x0b\x5a\x98\x31\x49\x6a\x6f\xaa\xeb\x28\xb5\x24\x3c\x2f\xa8\x84\x39\x61\x85\x37\x3a\x6c\xcb\xfd\xaf\xa9\x2c\x19\x0f\x28\xa4\x6e\x61\xb5\x18\x45\xa0\x39\x16\x86\x96\x39\x16\x89\x13\xe0\x0f\x63\x76\x0c\x3b\xb1\x8f\xd6\x77\xd0\xe5\x84\x0e\xb3\xd0\x2d\xc0\xac\x10\xd9\x8d\x82\x9a\x6b\xe6\x6b\xd5\xe3\xd6\x08\x71\x03\x99\x28\xab\x02\x85\x67\x58\xa1\x49\xb8\xbf\xd8\xe4\x2e\x89\xdc\xfe\x73\xd2\x0a\x89\x89\x19\x93\x3a\xf9\x75\xf7\x23\xfc\x86\xdf\x1b\x21\xf8\x0d\x1b\xfe\x82\xa5\x9f\x68\x16\xa9\xe9\xc3\x07\x4e\xf1\xd4\x0a\x3e\xb2\xb4\xf6\x90\x04\x6f\x13\x01\xe6\xc2\x18\xad\xe6\xd4\xc7\xe8\x23\xd1\x1a\x01\x53\x38\xfb\x44\xb3\x28\x9d\x55\xcc\x28\x09\x2a\x3b\xac\x85\x4c\x6e\x02\x4a\x54\x3c\xa3\x26\xe6\xde\xa5\x43\xfb\x34\x38\x1c\x6f\x2c\xc7\xf0\x06\x73\x56\xd0\x58\x66\x05\xe3\x9e\xea\xbf\x4f\xae\x30\x29\x30\xae\xcc\x43\x64\x20\xc9\x62\xf4\xa2\x72\xae\x14\xc8\x99\xc4\x0e\x1e\xa1\x20\x0c\x57\x60\xa5\x5d\x85\xf0\x35\x95\x42\x68\x38\x3c\x38\x39\x38\xda\x42\x03\x04\x77\x94\x9d\xb3\x82\x5a\x03\xce\x96\x3b\x72\xa3\x0e\xe4\x6a\x6c\x7a\x56\x56\xc5\x1a\x77\xef\x20\x3f\x06\x16\x0a\x44\x71\x35\x5f\x65\xcd\x9b\x93\x10\xda\x87\x1c\x0b\x4c\x1e\x83\x12\xa0\x25\x69\x1a\x57\xc5\xe0\x69\x06\xa8\x65\xed\x8c\xec\xc3\x83\x9f\x0f\x42\xcf\x29\xd5\xd9\x11\xdc\x0a\x7e\xa0\xf1\xb8\x4e\xe1\x3a\xf4\x56\xd5\x8a\x36\x25\x7e\x8f\xb1\x36\x3f\xa7\xe1\x80\x1c\x01\xf4\x53\x55\xb0\x8c\xe9\x62\x8d\xc6\x25\x88\x3a\x74\xdf\xb1\x86\x3d\xd1\x4d\x35\xe2\xb3\x4f\xc1\x27\xc9\x66\x34\x1b\x25\xf6\x12\x4d\x41\x6b\x70\x06\x32\x25\x0a\x0a\xb6\xa2\x27\x4b\x4a\x0a\xbd\x5c\x43\xf8\x1d\xe2\x82\x4f\xfe\x4e\xa5\xc0\x7a\xc9\xdc\xf1\x8d\xd1\xe8\x2d\xbc\x3b\x5e\x94\xf6\x97\x11\x7c\xaf\xc6\x5e\xfc\x9a\x7a\xbe\x8b\x60\x53\x07\xfe\xf9\xfa\xfa\xf2\x6b\xaa\xa3\x19\x1e\x66\x74\x4d\xea\x1d\x46\xb5\xa8\x9c\x0b\x59\x3e\xb1\x05\x12\x0e\x12\x9f\x40\x25\xe4\x53\x9b\x40\x4b\xa1\x02\xf6\x1d\xb6\xf6\x5e\x28\xed\x5b\x8f\xb4\x4f\x5a\x18\xdd\xcc\x69\x66\x76\x3c\x5a\x1a\x7a\xd7\x30\x07\xce\x2f\xa7\xf0\x17\x51\x9b\x55\x9c\x91\x59\x90\x25\x6f\xa8\xe9\xc8\xa2\xa8\x86\x17\x66\x11\x5e\x84\x04\x5a\x2d\x99\x73\xff\x67\x4a\x72\x2a\x15\x6a\x42\x4a\xa2\xf4\xa7\x0c\x86\xee\xf6\xc6\x15\xd3\x72\xae\x95\x16\x25\x2c\x2d\xe3\xf0\x8d\xee\x95\x5e\x76\xb2\x23\x14\xb9\x6f\xe4\x9a\x8d\x2f\x28\x90\xb4\x8a\xa1\xed\xdc\x6c\x7f\x41\xda\x68\x4b\x13\xd8\x93\x12\xc8\xb5\xe1\x3b\xa3\x0a\x08\x64\x78\x54\x82\x59\xda\xc5\x37\x67\xc5\x95\x4b\x0c\xe6\xc8\xb8\x3d\x24\x46\xa8\x04\xe7\x17\x44\xeb\x26\x1b\x27\xa1\x09\x42\x4a\x4d\x0f\x99\x20\x34\x37\x90\x4b\xac\xfc\x28\x88\x94\x49\x03\x3b\x00\x24\x11\x58\xb6\xa7\xd4\x06\x3b\x23\x2c\x3f\xc4\xcc\xe1\x80\xd0\xa2\xd6\x7d\x7a\xfc\xe5\x8b\x71\xf0\x20\xde\xfa\x55\xc1\xe5\x67\xb6\x8b\xcf\x68\x01\x24\xcb\xfc\x9a\x29\xf5\x49\x58\xd5\x89\xe2\x4c\x51\xb9\xf2\x4b\x98\xe8\x28\xd6\x92\x09\xdf\xf0\x4d\x43\x3b\x2a\xcf\x4b\xe0\x75\x39\x0b\x56\x52\x6d\x1d\x38\xa9\x63\x6f\x43\xaf\x79\xc4\x45\x8c\xa1\x36\x10\x96\xc6\x40\x22\x7c\x11\x7a\x2f\x5e\x99\x39\xff\xf1\x0f\x7f\xf8\xdd\x1f\xa6\x76\x59\xcd\x67\x04\xf2\x9c\x51\x20\x1c\xce\x4f\x2f\x4e\x7f\xba\xfa\xee\x0d\xd6\xe4\x0e\x3b\x85\x11\x92\xf9\x63\xa6\xf2\x47\x4c\xe4\x7f\xc4\x34\x7e\x2c\x58\x16\x28\xe1\x87\xb8\x2c\x64\x18\xee\xd1\xae\x95\x2d\xc3\xed\x5e\x8a\x36\x6c\x18\xc1\x93\x6d\xde\xc4\x83\xea\xe5\x11\x1e\x0e\x4f\x2e\x3d\x75\x56\x5d\x89\xec\x26\x9a\x97\xe7\xe0\xfa\xcd\xa5\x65\x18\xc5\xd1\x43\x78\x13\x60\x62\x7c\x25\x8a\x95\xd9\x4c\x02\xd7\x6f\x2e\x03\x95\xc5\xd4\xf0\xc0\x08\xab\xf5\x7b\xaf\x83\x32\x39\xdb\xd2\x4c\x0e\xda\xc9\xca\xaa\x08\x89\x28\x03\x76\x20\x90\x94\x14\x4c\x69\x96\xe1\x58\xdb\x18\x6c\x90\x57\x47\xdc\xf8\xe3\x39\x93\x7f\xac\xa3\xc8\xfe\xb1\x83\x0f\x91\xb2\x9e\x5b\x47\x5b\xcf\x55\x16\xec\x34\x39\x1e\x14\xfd\x09\xaf\x50\xe9\x1c\x6d\x61\x29\xe7\xcf\xd4\x72\x44\x33\xcc\xaf\xc1\x68\x9f\x78\xaf\xf7\x91\xb3\x1c\x43\x23\x28\x68\x77\x6e\x5b\x8e\x81\x6c\xdd\x84\x87\x96\x63\xa8\x5f\xc2\xd8\x9d\x5b\x96\x63\x24\xdb\x36\x59\x8e\xfb\xd1\x23\x58\x8e\x95\xa4\x57\x5a\x54\x51\x70\x76\x96\x55\x54\x94\xdd\x8c\xce\x85\xa4\x71\x60\x76\x1d\x00\x0e\xf2\x1a\x85\x31\xe1\x01\x95\x55\x9b\x30\x97\xe8\xc3\xd5\xbc\x53\xf6\x01\x4d\x96\x6c\xd9\x44\x55\x39\x55\xea\x04\xa1\x71\x75\x65\x9d\x94\x9e\x4c\xe7\x84\x15\xb5\xa4\xc7\x66\xa7\x69\x89\x7b\x75\x1c\x5a\xe4\xd1\x6c\x06\xe5\x96\x15\xd5\x99\x85\x51\x38\xd4\xa2\xff\xfe\x18\x9b\xcf\x1e\x1c\xdb\x27\x37\xbc\x59\x58\x26\x89\x5a\x52\x6c\x11\x4a\x3f\x31\xad\xec\x40\x25\x25\xca\xbb\x46\x34\x42\x5d\xdc\x41\x42\x13\x58\x41\x45\x94\xa2\xb9\xbf\x36\xe8\x41\x3e\xed\x00\x2f\x45\x7e\x70\xa0\xfa\x1f\xe3\xc9\x79\x21\x49\x46\xa1\xa2\x92\x89\x1c\xb0\xea\x7a\x2e\x6e\x39\xcc\xe8\x82\x71\xdf\x17\x80\xbb\x91\x66\xd0\xcd\x85\x37\x26\x2c\x0d\x00\x52\x35\x7d\x98\xa7\xf0\x71\xd0\x27\xd6\x5f\x6b\x89\x5a\x67\xa2\xd3\xd6\x6e\x75\x8f\x03\x38\x76\x48\x52\xac\xd6\x80\xd7\xbc\x26\x45\xb1\xee\xc4\x8a\x27\x67\x57\x98\x44\x3f\xd6\xc6\x7f\x66\x98\x5a\x73\x59\x43\x39\xf6\x2f\x68\x7f\x29\xfc\x65\x93\xa4\x24\x5b\x86\x25\x53\x24\xe8\xee\x03\x94\xa0\xbb\x09\xba\x7b\x27\x25\xe8\x6e\x82\xee\x26\xe8\x6e\x82\xee\x26\xe8\x6e\x82\xee\x8e\xa4\x04\xdd\x7d\x88\x12\x74\xf7\x4e\x7a\x96\xa1\x89\x04\xdd\x4d\xd0\xdd\xbd\x29\x41\x77\x13\x74\x77\x1c\xdf\x04\xdd\xf5\xa2\x04\xdd\xbd\x97\x12\x74\x37\x84\x12\x74\xd7\x97\x12\x74\x77\x34\x25\xe8\x6e\x82\xee\x06\x50\x02\x60\x78\x50\x82\xee\x46\x78\x38\x3c\xb9\xf4\x4c\xd0\xdd\x04\xdd\xdd\x93\x92\x7f\xac\xa3\x04\xdd\x0d\xa0\x04\xdd\x7d\x90\x12\x74\x37\x41\x77\x03\x78\x3d\x3f\xcb\xb1\x81\x88\x5e\x4a\x31\x0b\x2e\x2d\x7d\x89\xe0\x28\x96\x59\x8f\x9a\xb9\x27\x21\xc0\xcb\x66\x68\x53\x78\x33\xc4\xcc\x61\x7f\x2b\x57\x3e\xd2\x83\xaf\xc3\x84\xda\x31\x62\x69\xcc\xe9\x8e\x6a\xb7\x1e\x8c\x47\x42\xba\x9a\x82\xce\xea\xa4\x12\xf6\xff\x3a\x40\x57\x0f\xc9\x65\xbd\x93\xbe\xb5\x72\x9f\xa4\xea\xaa\x3f\x7c\xeb\x4e\xe8\x16\x08\xaf\x32\xce\xd0\x3d\xf4\x37\x61\x5b\x43\xf0\x95\x27\xef\x21\x64\x6b\x08\xbc\xf2\xb5\xfc\xbd\xe1\x5a\xcf\x00\xb8\x17\x0c\xd1\xba\x03\x9e\x15\xa8\xbd\x36\xa0\x59\x0d\xb8\x2a\x80\xe3\x4e\x58\x56\xe0\x28\xb7\x20\x59\x0d\xa8\x2a\xc2\xcc\x11\x7b\xda\x07\x54\x05\x46\xf9\x7b\x50\xac\x3e\x98\x2a\x80\x6b\x0f\x86\xb5\x0d\xa4\x0a\xd9\x29\xbd\x0b\x44\xe5\x30\x40\x21\x8f\xcb\x01\x80\x6a\x07\x04\x2a\x80\x37\x82\xa7\x22\xc3\x9f\x76\x42\x9f\xc2\xec\xd7\x1d\xb0\xa7\x06\xb8\x14\xb2\xb0\x1d\xe4\xa9\x0f\x5a\x0a\x39\x02\x2d\xdc\x69\x13\xb0\x14\xe4\x02\xc9\x63\x83\x95\x62\x84\x86\x83\xc3\xc2\x81\x96\xaa\x4b\x13\xba\x5e\x4a\xaa\x96\xa2\xf0\x54\x05\x03\x35\xf0\x9e\x71\x56\xd6\xa5\x91\x39\xca\xc8\x6d\xb6\x0a\xcc\x61\x52\x2d\x5a\xd5\x1a\x81\x18\x53\xf6\xd6\x78\x28\x51\x24\xcd\x91\xbb\x39\x62\x58\xd0\x7d\x49\x56\xfe\xa6\xbe\xaa\xb3\x8c\xd2\x9c\xe6\x03\xbf\x26\xfc\x6e\xda\xac\x85\x27\x5f\xdb\x20\x95\x29\x78\x15\x62\x61\x84\xbc\x88\xe6\x42\x96\x44\x23\x8f\xdf\xfd\xd6\x83\x43\x10\xf6\xed\x51\x70\x6f\xd1\x31\x6f\xc1\x66\x5c\x98\x2f\x2f\xc0\x8f\x17\x6e\x3f\x86\xf9\xef\x76\x63\xdb\xc2\x74\xdc\x2e\x5c\x5b\x18\xc7\x47\xc0\xb4\xed\xc4\xb3\xf5\x91\x5f\x61\x96\x6e\x18\x96\x2d\x12\xe2\x35\x18\xc3\xf6\x38\xf8\xb5\xdd\xd8\x35\x94\x2e\x21\xc6\xc5\x10\xb7\x16\x8e\x3c\x7b\x16\xa6\xc5\x63\xa0\xcd\xb6\x91\x66\x6e\xb1\xc2\xbc\xd8\x2d\xca\x2c\x1e\x4a\x2c\x12\x42\x2c\x06\x3a\x2c\x18\x19\x16\x8e\x0a\x8b\x85\x08\x8b\x81\x06\xdb\xea\x02\x1a\xe1\x04\x41\xd3\xb8\x31\x0a\xbe\x3a\x96\xf7\x38\x0a\xfa\xeb\x71\x97\x2b\x06\xea\x2b\xc2\x7a\x85\xa1\xbd\x1e\x07\xe9\x15\x13\xe5\x15\x63\x89\x82\x62\x74\x8f\x83\xec\xda\x89\xea\x02\xef\xfc\x77\xd8\x74\x77\x4d\xfb\x91\xb5\x00\xa6\x1b\x68\xae\x7e\x54\x2d\x80\x6b\x8b\xe4\x8a\x1b\x51\x0b\x8c\xa6\xc5\x8a\xa4\x45\x8a\xa2\x3d\x12\xf6\x2a\x14\x77\xb5\x1b\x73\x65\x6c\x90\x80\x03\xb1\x85\xb7\xea\x10\x53\x01\x5c\xfb\x3e\x89\x30\xb4\x54\xe0\x86\x32\xce\x34\x23\xc5\x5b\x5a\x90\xf5\x15\xcd\x04\xcf\x3d\xad\x89\x8d\x5e\xd5\x0e\x2d\x30\x07\x65\x99\x7a\xce\xcf\x7a\x82\x86\xb5\x2e\x96\x44\x81\x7f\xec\x12\xba\xc2\x29\x4d\x78\xd4\x19\xa6\x40\x30\xf8\x68\xd6\xc3\x33\x7c\x09\xcf\x2e\x84\x09\xcf\xc2\xe5\x64\x4b\x7e\xc4\x3b\x5e\x7f\x16\xb7\x20\xe6\x9a\x72\x38\x64\xbc\x39\x61\x47\xbe\xde\xa7\xd6\xd9\xd4\xf9\x33\x5b\xa7\xa1\x3f\xcf\x57\x2f\x9b\x81\xb5\x2e\xc7\x20\xc3\xec\x73\x76\x39\xa2\x33\x56\xa9\xe7\xe9\xd1\x76\x83\x7b\x2c\x97\xb6\x63\x3f\xaf\x0b\x2b\xcc\x7c\xfd\x37\xe8\x0c\x77\x0e\xf2\xa1\x4f\xdb\xf3\x58\x00\xbc\x77\x66\xce\x2b\x9c\x79\x2b\x0d\x09\xcf\xc1\x95\x3b\xf3\xe6\xdc\x3f\xf0\x9f\xf5\xd1\x0d\x44\x11\x3f\x16\x82\xf8\x4e\xf4\xb0\xc5\x00\x7b\x72\xdd\x42\x0e\x77\xf8\x5f\x5f\x8e\x43\xd4\x70\x1f\xfb\x1b\x30\xc6\xae\x2b\xb3\x3f\xee\x37\xc5\x08\xfc\xfe\xf6\x4e\x7c\x2f\x86\x0b\x02\x4c\xe2\x0d\x6c\x6f\xac\x34\xf8\x61\x0a\x7c\x28\x46\xfc\xd9\xbc\xf6\x1b\x34\x6e\xa8\x6f\x2c\xbd\xf6\xd3\x6b\xff\x01\x7a\x84\xd7\xbe\x66\x25\x15\xb5\x7e\xb6\x0f\xce\xdb\x25\xcb\x96\x7d\x5b\x90\x95\xde\xaa\x5a\xd4\x7a\xc3\x5e\x73\x43\x8c\x08\x45\x48\xaf\xce\x0d\xf2\x8b\x69\xec\x70\xa8\x86\x57\xbf\x6d\x11\xb2\x40\x14\x10\x78\x7b\x71\xf5\xd3\xbb\xd3\xff\x38\x7b\x37\x85\x33\x92\x2d\x83\x58\x33\x0e\x04\x35\x1b\x8a\xb0\x25\x59\x51\x20\x50\x73\xf6\xb7\x9a\xfa\xea\x85\xc3\x76\x7c\x47\x51\x30\xdd\x01\x12\xc8\xe8\x24\x0f\xd9\x30\xd8\xc4\x77\x4c\x69\xb3\x89\xc8\xcb\xd5\x19\x13\x5e\xfe\xc0\xb9\x14\xe5\xa6\x6a\x3b\x33\xcc\xac\xe9\xed\x69\xcd\x2d\xa9\xa4\xb0\x60\x2b\x87\x7c\xb6\x18\x50\x20\x79\x40\x55\x39\x23\x05\xcc\xc5\x31\x8f\x03\x32\x43\x40\xe1\x92\x02\xa7\xda\x5c\xfa\xd6\x95\xe9\x87\xae\xec\x15\xff\x86\x5a\x51\x75\x0c\xb3\x1a\xc1\xa1\x95\x64\x25\x91\xcc\x0b\x82\xd1\x1b\x30\x29\xa6\x70\x21\x9a\xe7\xd1\x1a\x97\xd6\xc7\xdf\x64\xac\x19\x5c\xda\xb7\x1f\xce\xae\xe0\xe2\xc3\x35\x54\x12\xeb\x04\xfb\x22\x2b\x91\x23\x1e\x81\x19\x35\xa3\xb2\xc7\x28\x9f\xc2\x29\x5f\xfb\xee\xbd\x55\x32\x4c\x81\x79\x0f\x51\x6e\xd8\xba\xf0\x54\xee\xed\x7c\x7a\xf1\x72\x8a\xff\x7b\x61\xce\x90\x34\xa6\x5c\x0b\xd7\x0d\x11\x34\x4d\xd2\x88\x35\x0f\xd9\xac\xa0\xdd\x7d\x70\x27\xcb\xc7\x5a\x8a\x26\x5f\xfc\x50\x19\xde\x68\x8c\x0d\x88\xbd\x5b\xd7\x4b\x73\x46\x24\xad\x24\x55\x94\x7b\xbe\x59\x48\x7b\x51\xf1\xc4\xa1\x80\x37\x12\xa6\x08\x4c\x6c\x0b\x7c\xed\x86\xbc\x75\x27\xdd\xc8\x2f\xfd\x2e\x4a\xe8\x83\x77\xf0\xf9\xbe\x66\xf9\xce\xe7\xd7\x3c\x2c\x63\xb7\xd5\x47\xcd\xc5\xaf\x44\x7e\xa0\xe0\xdc\x1f\xf7\xe4\x6e\xfd\x14\xae\x97\x4c\x75\x2f\x1b\x63\x2b\x32\xff\x72\x4f\x78\x16\x6d\x60\xf9\x18\x5e\xc2\x9f\xe0\x13\xfc\x09\x1f\x5f\x7f\xf4\x7d\x23\xc5\x78\xe0\x84\xba\xf6\xac\x1f\xe4\xfc\x32\xca\x89\xf8\x7e\x49\x34\xf2\x83\xf3\xcb\x10\x70\xe3\x8c\xf1\x1c\x8f\x02\xfd\xa4\xa9\xe4\xa4\x68\x9e\xe6\x61\x2b\x1d\xf0\x04\x34\x93\x7a\xf6\x17\xc7\x56\xb0\x38\x9f\x7b\x73\x6c\xad\xf4\x63\xd0\x83\xab\xe3\xcd\x11\xaf\xdc\xce\xab\xe3\xcd\xd2\x5e\x39\x38\x9f\xa3\xaf\xed\xc2\x69\x0a\xa6\x7a\xa3\xf7\x5f\xd2\x76\xd6\x25\xd1\xd9\x72\xa8\xd6\xfc\x5d\x21\xef\xcd\x95\xe8\x4a\xef\x43\x2e\xd0\xb7\x1c\x54\x34\xd8\x0c\xf5\xf3\x16\x3c\x21\x90\xbb\xc1\x7d\x3a\x9f\x6f\x9e\x5c\xef\x55\xbd\xcb\x0d\x16\x54\x91\xd8\x3d\x46\x7b\x8d\x35\x2a\x91\xdb\x97\xaf\x37\x4f\xb3\x78\x79\xcf\x3e\x1a\x3c\x80\xfd\x35\x67\xff\xe1\xec\x2a\x3a\x85\x26\x0f\x5a\xd1\x6d\x34\x43\x46\xb8\x4d\xba\x9e\x53\x29\x43\x8e\xbe\x80\xd9\x1a\x91\x6b\x2c\xa3\x81\x97\x20\x40\x27\x54\x52\x68\x91\x09\xef\xa2\x1e\x43\x70\x9f\x63\x86\xcb\x1d\x12\xbe\xea\x22\x9a\xdf\xbe\xbd\x3c\x86\xeb\x37\x97\xc7\x20\x24\x5c\xbd\x09\xc1\xd7\xf4\x3d\x77\x2f\xae\xdf\x5c\xbe\x78\xb2\x45\x87\xe6\x5d\xf8\xda\xab\x4c\xd0\xc0\x8d\x6b\x9e\x9c\x93\x92\x54\x93\x1b\xba\xf6\xb0\xaa\x43\x6d\xfa\x49\x7b\x82\x22\x4c\xc3\x2e\x6c\x49\xaa\x91\xbc\x24\x25\x39\x7b\xa6\x95\x1b\xdc\x0d\xef\xc6\xb8\x59\xc2\xc1\x83\x27\xca\x9f\x52\xac\x68\x6e\x1f\xef\xcd\x67\x50\x9e\x57\x82\xf9\xbd\x58\x53\x25\x88\x87\x29\x55\x82\xd8\x8f\x52\x25\x88\x21\xa5\x4a\x10\x01\x3c\x53\x25\x88\x54\x09\xc2\x52\xaa\x04\x91\x2a\x41\x78\x52\xaa\x04\xf1\xf0\xe0\x52\x25\x88\xcf\x16\xdb\x9a\x2a\x41\x3c\x4c\x09\xe5\x99\x2a\x41\xa4\x4a\x10\x5b\x94\x2a\x41\x3c\xb5\x69\x91\x2a\x41\xa4\x4a\x10\x0d\xa5\x4a\x10\x23\x28\x55\x82\x18\x47\xa9\x12\xc4\x83\xf4\xcc\x72\x43\x52\x25\x88\x94\x1b\xb2\x2f\x9f\xe7\x97\x1b\x02\xa9\x12\x84\x1f\xa5\x4a\x10\xe3\x29\x55\x82\x18\x47\xa9\x12\xc4\x78\x9e\xa9\x12\x44\x47\xa9\x12\x44\xaa\x04\xf1\x99\x1e\xdd\x54\x09\x22\x55\x82\xd8\x4d\x29\x46\x90\x2a\x41\x8c\xa3\x54\x09\xc2\x9f\x69\x7a\xed\xfb\xf3\x79\x7e\xaf\xfd\x54\x09\x22\x55\x82\x78\x90\x42\x4c\x37\x49\x95\xa8\x65\xe6\xa3\x22\x87\xe7\xea\x8d\x28\xab\x5a\x53\xf8\xd8\x30\x6c\xf5\xbe\xc7\x9c\x66\x6b\x9b\x70\xd5\x93\x8e\x4f\x01\x9b\xce\x04\x9f\xb3\x45\x2d\x31\xf9\xfe\xa4\x24\x9c\x2c\xe8\x24\xb3\x13\x9d\xb4\x2b\x37\x69\x47\x79\xf2\x59\x41\xa7\x0b\x56\x32\x9f\x0a\x12\xb0\xb5\xf7\xef\x90\x53\x17\x1f\x0d\x80\xb7\x94\xe4\x13\x3e\x88\x48\x29\x6a\xae\x6d\x9e\x00\xae\xb7\x27\xcf\x76\x97\x6c\x9c\xdb\x3c\x09\xbb\x43\x10\x00\x11\x78\x06\x47\x07\x62\x18\xe7\x5d\x2d\x8d\xcb\x60\x6b\xb9\x22\x5a\x53\xc9\x5f\xc3\x7f\x1e\xfe\xf5\x8b\x9f\x27\x47\x5f\x1e\x1e\xfe\xf0\x72\xf2\xef\x3f\x7e\x71\xf8\xd7\x29\xfe\xe3\x5f\x8f\xbe\x3c\xfa\xb9\xf9\xe2\x8b\xa3\xa3\xc3\xc3\x1f\xbe\x79\xff\xf5\xf5\xe5\xd9\x8f\xec\xe8\xe7\x1f\x78\x5d\xde\xd8\xaf\x7e\x3e\xfc\x81\x9e\xfd\xb8\x27\x93\xa3\xa3\x2f\x7f\xe3\xfd\x38\x0c\x30\x3f\xe2\x18\x1f\x51\x4c\x8f\x47\x30\x3c\x1c\xba\x24\x8a\x78\xf8\xe8\x78\xc5\x11\x10\xce\x63\x12\x5f\x40\x34\xfa\x0a\x33\x88\x9b\x31\xfb\x3b\x21\x45\xc9\xb4\xa6\x39\xba\x8c\x7a\xe5\x45\x7c\x71\xe0\x4c\x0f\x9a\x71\x3b\x91\x8b\x09\x46\xde\x10\x68\xa6\xfa\xb8\xea\x5e\xa6\xac\xd0\x4b\x2a\x6f\x99\x77\x3c\xc8\x3c\x90\x78\xe7\xcd\x40\x21\x38\xc9\xe9\x9c\x71\x6f\x07\x09\x1a\x71\xa3\xed\xb7\x24\x86\x93\x18\x1e\xc3\xe5\x39\x89\x61\x45\xb3\x5a\x32\xbd\x7e\x23\xb8\xa6\x9f\x3c\x1c\x22\x43\x29\x7c\xe5\xd8\x81\xc0\xef\xf8\xe6\x39\x55\x22\x6f\xb2\xda\x64\xcd\x31\x75\x3d\xd0\xa4\xda\xe7\x1e\x57\xa2\x60\xd9\xfa\xa4\x59\x12\xbc\xb0\xf4\x93\x3e\x79\xb4\x37\x80\x26\xea\xa6\x13\x1f\x74\x62\x5e\x7e\x9d\x94\xd8\x1a\xc7\x67\x65\xf8\xa3\x25\x7c\x29\xd9\x8a\x15\x74\x41\xcf\x54\x46\x0a\x94\x8f\x31\x74\xfd\xe9\x1d\xbc\xfd\xe3\x43\x5a\x8a\x42\xc1\xed\x92\x1a\x9d\x04\xc4\xcc\x1d\x5d\x6f\x19\xf1\x65\xba\x20\x8c\x43\x69\x8e\x41\xd5\x0c\xd4\xdc\x06\xa3\xb1\xbc\x15\x7e\x45\x24\xe5\xba\x19\x9c\x2b\x30\x34\x13\xa2\x70\x29\x76\xde\x98\xeb\x76\x05\x5c\x2e\x31\x17\x3f\x71\x7a\xfb\x93\x19\xb9\xef\x58\xe7\x05\x59\xb4\x35\xcb\x14\xd5\x0d\xd8\x2b\x24\x23\x1b\xec\xa9\xb4\x93\x8f\x7c\x08\x30\xa7\xaa\xa6\x40\x8a\x5b\xb2\xc6\xa3\x10\x67\xbc\x4c\xbd\x86\x57\x47\x28\xc6\x88\x82\x76\xbc\x39\xfc\xd6\x37\x44\xbe\x24\x0a\xde\x9c\x5e\xfe\x74\xf5\x97\xab\x9f\x4e\xdf\xbe\x3f\xbf\x08\x31\x27\xcc\xe9\xa1\x5e\x87\x3c\x23\x15\x99\xb1\x82\xf9\x5b\x11\x5b\xb8\xcb\x3e\xcb\x00\xa3\x30\xcf\x4f\x72\x29\x2a\xbb\x87\xb2\xe6\x58\xd6\xaf\xab\x7f\xe3\xeb\x49\xee\x7b\x0d\x7b\x15\x02\xcd\xe1\xf6\x75\x46\xce\x07\x53\x86\x85\x24\xdc\x58\xf3\xe8\x99\x0a\x88\x76\x3b\x68\x8e\xac\xb9\x66\xe5\xe7\x9b\x7c\x4d\xf2\x58\x89\xd7\xa7\x79\x4e\xf3\x18\xc7\xeb\x39\x26\x1e\xbc\x69\xa6\x15\x92\x71\x03\x5d\xd5\x44\xb8\xfc\x70\x75\xfe\xbf\xe3\xac\x16\xb8\x15\x0b\x09\x60\x45\xa8\xd9\x22\x45\x15\xe9\x24\x7d\x74\xd5\x3b\xd2\x59\xba\x8f\x7e\xa1\x67\xa9\xb5\xe4\x62\x60\xa6\x3e\xd6\xbc\x27\xab\xbd\x0b\x18\x74\x63\x82\x52\xe4\x74\x0a\x97\xd6\x40\xa2\x2a\x0a\xcf\x5e\xd9\x38\x22\x29\x18\xc6\x5c\x33\x52\x78\x9b\x9a\xf4\x6f\x35\x5b\x91\x82\xda\x04\x3f\x2c\xe1\xd0\xaf\x1f\x18\x41\x37\xcf\x49\xa1\x82\x94\x9e\xbf\x4d\x64\x8c\xd3\xf7\xa2\xe6\x31\xf0\x49\x2d\x2f\xc8\x29\x17\x3a\xc8\x9f\x69\xe6\x85\x05\x1f\xa5\xc8\xc0\xfa\x34\x83\xa0\xd8\x0d\x36\xaf\x67\x54\xa1\x01\xe7\x5f\x34\x19\xac\x09\xee\xf6\xf1\xb2\x9d\xbb\x8d\xfd\xd6\x2a\x68\xfa\x5b\x26\x51\x28\x94\xc5\xcc\x5f\x52\x92\x63\x25\x9f\x8a\xe8\xa5\xc5\xe9\x95\x44\xdd\x78\xfb\x1e\x91\x8d\x7b\xd3\x39\x2f\xb1\x2d\xc0\xd3\x2e\xc6\xb5\xbf\xf0\x9b\x53\xa2\x6b\x49\xed\xab\xcc\x26\x03\x52\x4e\x66\x85\x2f\xb2\x3a\x50\x90\x9a\xb5\xfb\xc0\x8b\xf5\x47\x21\xf4\x57\x6d\xb5\x95\x08\x97\xe6\x7b\xf7\x82\x1f\x06\x76\x03\x1e\x5a\x08\x91\xcb\x27\xb8\xd1\x28\xac\xc2\x8b\xc3\xb8\x33\x6e\x8e\xfb\x13\x8a\x2a\x59\xf3\x53\xf5\xb5\x14\xb5\xa7\x65\xb4\xf5\x78\xfb\xfa\xfc\x2d\x4a\xf4\x9a\x07\x3c\x5e\x28\xd7\x72\x8d\x95\xd0\x62\xb4\x7d\x80\xbe\xbf\xe0\x5b\xa3\x12\x37\xee\xbf\xaf\xa0\x9a\x43\xcd\x15\xd5\x53\x78\x4f\xd6\x40\x0a\x25\x1a\x27\x87\xb7\xca\xbd\x44\x44\x7e\xdf\x15\x3b\x05\xac\x2c\xea\xfd\xb8\x64\x1c\x66\x42\x2f\x61\x83\x6d\x40\x29\xd1\xed\x31\x62\x85\xa8\x20\x20\x7d\xd7\x99\x83\xf1\xcd\xa1\xfa\x4a\x7c\x72\x43\x15\x54\x92\x66\x34\xa7\x3c\x0b\xba\x5f\x91\x10\x33\x7f\xfc\xbd\xef\x0d\xbd\x10\xdc\x08\xc9\x08\x77\xf4\x9c\xe7\x2c\x23\xda\x7a\x21\x75\x14\x07\x03\x62\xf5\x9c\x67\x8b\x60\xf1\x20\x23\x22\x3d\xd9\xd6\x8a\x4a\x8c\x8a\x6a\x59\x53\x7b\xb0\xbe\xa9\x67\xb4\xa0\xda\xb7\xd8\x22\x34\x15\xa0\x89\xb6\x95\xcd\x58\x49\x16\x14\x88\x6e\xc4\x80\xbf\x8f\x89\x72\x65\xd4\x29\xae\x24\xd3\x90\x0b\xda\x96\xe4\xf2\x75\x76\x28\xf8\xf6\xfc\x2d\xbc\x84\x43\xb3\x86\x47\x68\x4f\xcc\x09\x2b\xfc\x6b\x73\x60\xd6\xc0\x86\xfd\xc3\xe6\xcd\x70\x7d\xb5\xd7\xb9\x93\x7d\x20\xa4\x55\x5f\xc7\xc0\x05\xa8\x3a\x5b\x36\x6b\xed\xef\x83\x6d\xdc\xc5\x2e\x03\x08\x71\x34\x4e\xc0\x7a\x72\x6c\xc5\xf2\x5d\x02\xd6\x77\x6d\x2d\xd3\x5d\x02\xd6\x3b\x3e\x99\xdf\x25\x60\x83\x10\x89\xcf\x5c\xc0\x06\x1a\x30\xdf\x2a\x2a\x23\xd9\x2f\xdf\x3e\x73\xfb\xa5\xff\xc4\x35\xb2\xb2\xdb\x59\x7f\x03\xc1\x0a\xc4\x92\x6a\x92\x13\x4d\x9c\x5d\x13\x5a\x43\x74\xdb\x26\x4a\x97\xef\x79\x5e\xbe\xa7\xb4\x6e\x14\x7d\xc7\x78\xfd\xc9\x26\xac\xc4\x0a\x20\x5d\x9d\x21\x53\xc8\xc2\x96\x18\x8f\x2e\xa9\xaa\x82\x61\x45\xc9\x8d\x1c\x8a\x20\xc5\xd9\x6f\x14\x10\x2e\x1c\x9a\xe7\x0c\x2a\x4e\x52\x14\xc2\x18\x78\xe6\xcd\x4a\x78\x2e\x7c\x91\xec\x1b\x8b\x88\xce\x0e\x3a\x68\x93\x37\xc5\x4b\xee\x7b\xd7\x92\x68\xf8\x0c\x44\xc3\x93\x06\xfe\x0a\xba\xa2\xde\x7d\x0d\x36\xbb\x0f\x1a\x5e\xc0\x54\x73\xac\x03\xa2\x07\x38\x2c\x28\xc8\x8c\x16\xd6\xf2\xb7\x22\x22\x42\x3e\x5c\xb0\x70\x89\x12\x26\x93\xa2\x88\x55\xef\xe3\xa3\x28\x30\x19\x86\x44\x58\x76\x33\xac\x5f\xf0\xaa\x23\x8b\x38\xab\x7e\xbd\xae\xa2\xad\x3a\x86\x0c\x7e\xb9\xab\x5e\x7b\x3f\x1c\x60\x73\xd5\xcd\x1b\x24\xd6\xaa\xa3\x61\xff\xcb\x5c\x75\x45\xb3\x4c\x94\xd5\xa5\x14\x73\xe6\x2b\x67\xb6\x0c\x3e\xc7\xb4\x81\x9b\xfa\x1b\x7c\xb5\xa2\xbb\x12\xc2\x02\x0c\x91\xc1\xc0\x30\x78\x5a\x49\xb1\x62\xb9\xf7\x7b\x8d\x68\x6b\xd7\x34\x09\xd4\xff\x23\xd8\x7c\x44\x85\xb6\x61\x89\x06\x2e\xa5\x58\x51\x29\x9b\x4e\x02\x66\x94\x8e\xdd\x67\x5a\x3a\xd8\x1b\x6f\x10\xc1\x08\x12\x19\x29\xb0\xf1\x5f\xc8\x8d\x81\xcd\x5b\xb3\xc9\x36\x40\xb4\xb0\xd6\xa3\x8c\x80\x59\xc3\x0d\xc2\xf2\x2f\xa0\x69\xa8\x8d\xbc\x1c\x2e\x80\x8b\x9c\x3a\x34\x78\x00\x5b\x57\xfe\xd4\xc6\xa9\x9b\xd1\x86\xa7\xc1\x1b\x6b\xbb\xc1\x6f\xe7\x6e\xc4\x01\x1c\x71\xae\x5a\xb8\xfe\x08\xef\x83\x1b\x20\xda\xcd\xa7\x3c\x67\x7c\x81\x11\xe6\x63\x90\xb4\x20\x01\x05\x7a\xa0\xd3\x29\x37\xd6\x3d\x7f\x80\x12\xd3\x2d\x41\x00\xd7\x46\x64\x36\x9b\x83\xaf\x59\x26\x78\x48\x49\x01\x5c\x41\x0c\xde\x36\x2f\xce\x79\x28\x86\x88\x29\x78\xf1\xae\xb9\x44\xde\x9d\xc8\x9e\x9b\xe9\xf8\x02\xed\xbd\xf6\x46\x07\xac\x8f\x45\x6c\xdc\x30\x9e\xbb\xfc\xff\xfe\xa6\x86\xf0\x6d\xfa\x5f\x5b\xbf\xcc\x14\xbe\xc3\xe6\x9e\x61\xea\xca\x10\x91\xf4\x35\xfc\x95\x43\xbb\xa9\x30\xe9\x04\x5a\xd0\xcd\x43\x51\xb8\x25\xd0\x42\xc5\x43\xd7\xee\xc9\x0a\xb4\x8f\xd6\x09\x14\x56\x23\x0d\xac\xba\xdb\x05\x96\x09\x5b\x02\x84\x3a\x34\x57\xba\x1d\x7a\x98\x89\x9c\x4f\xe1\x5b\x8e\x32\xc7\xac\xef\x04\xb8\x88\xb0\x5d\xdd\xb2\x36\x27\xec\xc5\x53\xdd\xed\x5b\xc6\x73\x71\xab\xe2\xfa\x46\xbf\xb7\x4c\x1b\xc7\x93\x6f\xc5\x27\x45\xb5\x66\x7c\xa1\xfa\xfe\x51\x52\x14\x11\xf0\xf5\xbb\x1c\xa4\x61\xb7\xbb\xed\x8f\xbf\xed\xc0\x0b\x8c\x50\xda\x43\x68\xf1\x19\x8d\xc3\xd1\xd7\xdd\xba\x8d\xcf\xd8\xe5\x70\x0c\x80\xbf\x25\x87\xe3\x43\xb4\x28\x15\x79\x23\xcd\x24\x34\x23\xc5\x55\xe5\xdb\xee\x0f\x36\x2f\xde\xd7\xef\xaf\x4e\x87\x8c\xc3\x2c\x8f\xdb\x25\x95\xf6\x6d\x65\x38\x03\xc9\x4b\xa6\x94\x7f\xc0\xdd\xd0\x2d\x9d\x2d\x85\xb8\x81\xc3\x26\x51\x71\xc1\xf4\xb2\x9e\x4d\x33\x51\xf6\x72\x16\x27\x8a\x2d\xd4\x89\x13\x4c\x13\xb3\x5e\xbe\xe9\x4b\x38\x13\x5e\x30\xee\xe0\x8d\x18\x66\xe0\x5a\x81\xf0\xef\x1c\x0e\xdd\x92\x64\xed\x6a\xe3\x89\x0f\x51\xb6\xd8\xe3\xd8\xe6\xe2\xec\xd8\xc8\x8b\xb0\x52\x5f\x58\x1c\xfe\x49\xad\xc7\xed\x43\x7f\x11\xd4\x7b\xe0\x81\x83\x1f\xb8\x5e\xb6\x67\xa2\xad\x4b\xe7\x42\xeb\xe6\x33\x02\x38\x6e\x9c\x14\xe7\x05\x7a\x5a\x0f\x7c\x83\x69\x88\xb8\x13\x88\x6d\x70\x2c\xc3\x9e\xe5\x8d\x05\xd1\xa1\x24\x7a\x78\x87\x00\xd6\x9b\x48\x89\x16\xf3\x10\xc0\x73\x33\x59\x2f\x0a\x62\x02\x1e\x11\x35\x01\x7b\x23\x27\x02\x3e\x60\x68\xb0\x44\xb2\x02\xe0\xee\x28\x69\xa0\x40\x7f\x34\xc3\x05\xa2\x19\x2f\x10\x76\xf1\x5d\x65\xdf\x28\xdd\xaf\xaf\x7a\xbc\x82\x5e\xf2\x0d\x3e\xd4\xec\xa8\xad\xef\xde\x56\x4d\x2e\xd6\x4d\x8d\x7a\xf6\x77\xbf\xb3\x6e\x8e\x60\x67\xe3\x73\x61\xcb\xc0\xf4\x8a\xbe\x7b\xf0\x74\xed\x6f\x73\x30\x0f\xd6\xa2\x71\xe2\x97\x55\x61\x2c\x97\xc1\xe8\x3d\x47\x8c\x1c\x7b\x0d\xb6\x8f\xdb\xe5\x09\xe9\x03\xee\xca\xe6\x1f\xc3\x7f\xd7\x4a\x03\x69\xb3\xef\x9b\xda\xcf\xb8\x93\x1e\xcc\x9b\xb2\xd4\x98\x4a\x92\x11\xde\xb6\x7e\xd2\xa2\x89\x41\x78\x70\xcd\xd9\x7c\x4e\x9b\xfa\x03\x33\x0a\x15\x91\xa4\xa4\x1a\x33\xc3\x7c\xe1\xc4\x33\xba\x60\x36\x3d\x5b\xcc\x81\x98\x05\x3d\x38\x50\x5d\x41\x61\x1f\xf9\x81\x49\xdf\x4c\x43\xc9\x16\x4b\x8d\x97\x1c\x08\x14\x82\x2f\xb0\x6c\xa4\x1f\x9a\xb6\x10\x24\x07\x94\xf5\x42\xc2\x2d\x91\x25\x10\xc8\x48\xb6\x44\x98\xb2\x17\x78\x31\xaf\x25\x76\xee\xd6\x94\xe4\xeb\x89\xd2\x44\x9b\xb7\x2e\xb5\x25\x84\xec\xce\x79\x70\xcd\xb6\xca\x17\x3e\xb3\x52\x94\xa9\x87\xbb\xa3\xd4\xc3\x7d\x5f\x4a\x3d\xdc\xf7\xa6\xd4\xc3\x3d\xf5\x70\x4f\x3d\xdc\x53\x0f\xf7\xd4\xc3\x7d\x83\x52\x0f\xf7\xd4\xc3\xfd\x1e\x4a\x3d\xdc\x1f\x66\xf8\xd4\x40\xac\x5f\x46\x7f\x96\xd4\xc3\x3d\xf5\x70\x1f\x50\xea\xe1\xfe\xd4\xa6\x45\xea\xe1\x9e\x7a\xb8\x37\x94\x7a\xb8\x8f\xa0\xd4\xc3\x7d\x1c\xa5\x1e\xee\x0f\xd2\x33\xeb\xea\x96\x7a\xb8\xa7\xae\x6e\xfb\xf2\x79\x7e\x5d\xdd\x20\xf5\x70\xf7\xa3\xd4\xc3\x7d\x3c\xa5\x1e\xee\xe3\x28\xf5\x70\x1f\xcf\x33\xf5\x70\xef\x28\xf5\x70\x4f\x3d\xdc\x3f\xd3\xa3\x9b\x7a\xb8\xa7\x1e\xee\xbb\x29\xc5\x08\x52\x0f\xf7\x71\x94\x7a\xb8\xfb\x33\x4d\xaf\x7d\x7f\x3e\xcf\xef\xb5\x9f\x7a\xb8\xa7\x1e\xee\x0f\x52\x88\xe9\xa6\x74\xce\x3c\x9a\xf7\x3d\x4e\x75\x7e\x87\x96\xed\x55\x3c\x9c\xd5\xf3\x39\x95\x68\x76\xe3\x48\xbd\x1c\x37\xbb\xf3\xdf\xa7\x4d\x06\x80\x0f\x4f\x6b\xf8\x29\xaa\x8f\xb1\x91\x80\xb2\x39\xc9\x38\x44\x3f\xc0\xe3\x70\x88\xae\xf0\x23\xb6\xac\x93\x54\xf9\xbd\xaf\x19\x87\xb3\x0f\x5f\x4d\x23\x34\x26\x08\xa9\xe9\x8b\x6b\xf2\x81\x67\xa1\x79\x30\xdd\x21\x0b\xab\xaf\xd9\xd4\xd6\x74\x67\x2d\x2b\x84\xb2\xd8\x5a\xbb\x79\xd9\x92\x70\x4e\x7d\x72\x3f\xac\x40\x64\x1a\xdd\x6e\x33\x4a\x39\x88\x8a\x72\x9b\x6a\x4a\x40\x31\xbe\xf0\xaa\x63\x40\xb4\x26\xd9\x72\x6a\xe6\xcf\x9b\x03\xe6\x7a\x1a\xb6\xa3\xf6\xb9\x6a\x5a\x52\x52\xda\x83\x26\x69\x49\x98\x1d\x2e\x90\x4c\x0a\xa5\xa0\xac\x0b\xcd\xaa\x80\x01\x83\xa2\x98\xc1\xac\x6c\x3a\x7d\x73\x08\xc0\xeb\xba\x29\x6a\xc1\x9e\x58\x41\xbe\x5d\x03\xb7\xbc\x5e\x26\x58\x77\xd5\xf0\x01\x7f\x8c\xed\xac\xcb\x4a\xaf\x6d\xae\x91\xe7\x05\x9e\x33\xa9\x34\x64\x05\xc3\x17\x1c\xae\x03\x45\x4d\x86\x63\xf6\x41\x00\x13\x9e\x1b\xce\xdc\xed\x91\x72\x9b\xc4\x73\x34\x40\x2b\x2f\x83\x1f\x33\x5e\x9a\x94\x2a\xda\x0c\x37\x67\xca\x3d\x28\x94\xd7\x40\x9b\x9e\x3e\xf6\x72\x35\x7b\x84\xd7\x2b\xf7\x6c\x4e\xd1\xcc\xd9\x31\xe9\x0d\x39\xe0\xfe\x63\x1b\x1e\xe7\x15\x6f\x55\x80\x6d\xa0\xd3\x08\x48\xaf\xf9\x6f\xe7\xb9\x36\x2d\x19\x50\x41\x78\xb0\xec\xa9\x14\xbc\xa6\x9c\xae\x8c\xf6\xa2\x19\x65\x2b\x63\x84\x7b\xb0\xdc\xa9\x0f\xfe\xa1\xea\x40\x53\x59\x32\x8e\xf9\x50\xef\xa9\x52\x64\x41\x2f\xbd\xa2\xdf\x77\xbd\xad\x31\x00\xde\x1c\x46\xef\x6b\x5c\xd8\x6a\x5d\xad\x71\xdb\xa5\x20\x1c\x78\x65\x5e\x76\x93\x86\xd2\xce\xba\x2d\x39\x72\x2b\x99\xd6\xd4\xcb\xb0\x51\xb6\xe7\x17\x02\x87\x36\xeb\x41\xfa\x0d\xb4\x97\x5e\x01\xef\x9b\x81\xda\x01\x9a\x8f\x33\x46\x2a\xf7\xab\x74\x68\x51\x4e\x33\xc9\xe8\x1c\xe6\x0c\xb3\x18\x10\x6f\x7f\x6c\x7b\x4c\x10\x9f\xd1\x12\x0e\x44\x29\x2a\x71\x5d\x1d\xde\xba\x59\xdf\x29\x7c\xef\x9d\xc2\xa9\x65\xcd\x33\xd2\x75\x6c\xb5\xf5\x99\xd8\x1c\x16\x88\xec\xf7\x91\x3a\xd8\x21\xfa\xf7\x2f\xff\xfd\x8f\x30\x5b\x9b\x87\x06\x62\x59\xb4\xd0\xa4\x68\x06\xec\xc1\xb4\xa0\x7c\x61\x4e\xbb\x55\xd9\xc3\x6a\x3d\x01\x19\xac\x05\x2b\x99\xb6\x69\xa5\xaf\x7e\x7b\x33\x1b\xbc\xc9\x3c\x38\x9e\xe4\x74\x75\xd2\xbb\x01\x93\x42\x2c\xa6\xf0\xa6\xc9\x69\xf4\xe0\xd8\x64\x41\xfa\x26\x2a\x7a\x3d\xf3\x77\x08\x2e\xec\x2b\x1f\x28\xba\x9a\xf6\x3d\xb0\x14\xb7\xb6\xa7\x5f\xf7\x39\x1e\x4b\xd3\x48\x97\x2e\xef\xb0\x12\x55\x5d\xd8\xa4\xd1\xaf\xfc\x2a\x69\xa1\xa4\xaa\x15\xdd\x2c\xeb\x72\x87\x2c\xf7\x13\x0e\xcd\x30\x37\x1e\x42\x56\x48\x04\x2c\x84\x70\x35\x11\x5c\x74\xa9\xed\xbf\x53\x4b\xaf\xcc\xc7\xaf\x48\x51\xcc\x48\x76\x73\x2d\xde\x89\x85\xfa\xc0\xcf\xa4\x14\x72\xb0\x42\x3e\xf7\x98\x18\xab\x71\x59\xf3\x1b\x6c\x1d\xdd\x4e\xbe\x10\x0b\x10\xb5\xae\x6a\xaf\xd7\xdf\x7c\xf3\x38\xb5\x6b\xe2\x59\x51\xad\x35\x91\x9d\x51\xda\x1b\x29\xfd\xc4\xfc\x42\x1f\xb7\xcc\x08\x30\x0e\xd4\xac\xa3\x95\x8a\xdd\xac\xfd\x1e\x0b\x3d\xf1\xf5\xdb\x97\xbf\xff\x37\x2b\x70\x41\x48\xf8\xb7\x97\x98\x94\xe9\x65\xde\xa2\x29\x80\xf6\x17\x53\xa0\x4a\x52\x14\x54\x86\x0a\x46\x73\x1d\x7b\x82\xb0\x15\x6b\xff\x50\xa9\xa6\x43\x05\xd8\x23\x3a\x7f\xae\xaf\xff\x82\x9e\x1f\xa6\x15\x2d\xe6\x5e\x56\x79\xa1\x44\xd7\x75\xf3\x00\x8d\xe9\x03\x67\x8b\x98\xd7\xa4\x8f\x08\x78\x5a\x77\xca\x4a\x14\x75\x49\xdf\xd2\x15\xcb\x7c\xc2\x5a\x83\xad\x1b\xf0\xf2\xcf\x7c\x2e\x98\xc2\xb6\x48\xb3\x42\x64\x37\x90\x3b\x76\x1d\xac\xdd\xc7\x0a\x59\x87\x56\x37\x0f\x49\x42\xf0\x4e\x3e\xb8\x73\x75\xbb\xd4\x01\x2f\x07\x2f\x81\x92\x54\x55\x5b\x4f\x43\x92\xdb\xc1\x62\x7b\xf1\x34\x92\x17\x4b\x98\x06\x95\x90\x0f\x0c\x0e\x87\x84\x86\x27\x6e\xf6\x9e\x36\x87\x77\x5e\x42\x68\x54\xb9\x1b\xb5\x6f\xe0\x6b\x70\xcc\x3a\x76\xa1\xb5\x0b\x2a\xe4\x61\x93\xd6\x23\x75\x39\xeb\x15\x1d\xb2\xe3\x6c\x9f\xbd\xe6\x40\x07\x14\xec\xd2\xc2\x37\xe8\x18\x1c\xe9\x0b\xc9\x02\x19\xec\x1c\x6f\x63\xaa\x25\xd1\x5e\xce\x0a\x4b\xfd\xfa\x79\x04\x2a\x2a\x15\x53\xc6\x46\xff\x0e\x05\xd0\x9b\x82\x30\xdf\xc0\x59\x1b\x3c\xa9\x84\xef\x56\x05\x2c\xb7\x15\xa0\xd8\x22\x3b\x54\xd3\x5d\x8a\xdc\xb1\x43\xc5\x84\x6e\x13\xaf\x88\xca\x96\x9b\x25\xb4\x24\x45\x34\xf3\xef\x29\x55\xdd\x77\xdd\x4e\x85\x6b\x3a\xc3\xa5\x55\x75\x96\xb3\x53\x56\x9e\x1c\x3f\x5f\x05\x87\x6b\xf1\xb9\xe9\xb7\x76\xd0\x51\x84\x24\x2a\x36\x67\xab\x84\x28\xb7\xee\xad\xda\x45\x2a\x96\xd4\x09\x05\x6f\xae\x9d\x9b\xc5\x79\x62\xa7\x0e\x2c\xca\xbd\xfb\x25\xb7\x43\x85\x83\xd7\x07\x4f\xa6\xe4\xec\x26\x4a\x51\x91\x05\xfa\x0e\xa2\xec\xe5\x26\xd3\x00\x84\x97\x75\x6b\x50\x85\x6e\x33\xe4\xeb\x5b\x64\xd0\x52\xe5\x46\x45\xf3\xae\xba\x38\xf6\x0c\x08\x48\xbf\xef\x1d\x39\xe7\x30\xb1\x35\x11\x6f\x03\xf2\xa2\x89\x14\x35\xcf\x5d\x34\xb8\x85\x20\xbc\xdf\x58\xd8\x0b\xff\x0a\x66\xe8\xe6\x69\x3a\xaa\x98\x27\x2e\x26\x4a\x32\x05\x33\xaa\xfd\xfb\x95\x30\x0e\xaf\xa6\xaf\x5e\x7e\xfe\x36\x1b\xae\x49\x24\x9b\xed\xa2\xb5\xd9\xac\x96\x7b\xb2\xd5\x91\x94\xe4\x1f\x78\xe1\xe1\x09\xb2\x34\xcc\x37\x70\x21\x29\xc3\x74\x22\x78\x40\xad\x09\xd6\xf4\x8c\x47\x56\xb7\x92\x69\x77\x83\x6e\x59\x40\xa2\xda\x21\x3a\x6d\x40\xc8\x7e\x75\xdf\xa3\xce\x97\x17\xf0\x24\xf1\xf5\x07\xb9\xbf\x0f\x6c\x9c\x0d\xa0\xea\xd9\xb3\xd3\xbb\x56\xc1\x5a\xa1\xba\x2b\x9e\xea\xbf\xde\x8e\xf3\xb6\x0a\xf6\xe6\xd8\xc7\x1e\xbe\x78\x01\x87\xf6\x13\x0e\x6c\x35\xbb\xa3\x27\xbb\x9e\x6e\x5b\xcf\x3e\x55\xde\xad\x0d\x07\x5b\x7b\xf6\xa9\x22\x3c\xa7\xb9\x7d\xf0\x07\x98\xd6\xd0\xd4\x73\xde\xb5\xc7\xe1\x6a\xf3\x40\x0d\xf7\xd8\x9b\x63\xdf\x3c\xfb\x0f\xba\x24\x2b\x8a\x35\xff\x58\x41\x64\x80\x78\xd2\x02\xae\xec\xce\xc0\xac\xd6\x40\xf9\x8a\x49\xc1\x4b\x1a\x50\x33\x7d\x45\x24\x23\xb3\x82\x82\xa4\x58\x93\x37\xa3\x0a\x7e\x73\xf8\xdd\xe9\x47\x84\x59\xfb\x77\x66\x20\x92\x02\x6d\x76\xbd\x56\x98\x9e\x1b\xe9\x16\xf6\xa6\x3d\xdd\xb8\x40\xfe\x22\x7a\xe3\xe2\x35\xeb\x6c\x6e\x80\xff\x1a\xf0\xbc\xdd\x2f\xb3\x1e\x65\xad\x6b\x52\x60\xd9\xc7\xac\xa8\x15\x5b\x3d\x85\xfe\x75\x65\x38\xdf\x32\x8f\x9b\xbd\x51\xbe\xb4\xbb\x34\x5b\xb5\x3d\x3d\xab\x63\xa3\x79\x19\xaf\xb1\xb9\x03\x5e\x1e\xa8\xb6\x7d\x54\xbf\xeb\x8e\x77\x50\xce\x55\x84\x9e\xd1\x5e\xb7\x3a\xf0\x56\x5a\x9d\xcd\x8e\xdd\x00\x9e\x2e\x3c\x97\x73\xf5\x06\xe7\x33\xe6\x60\x0c\xf3\xfa\x07\xa5\x82\xdf\x5e\x5c\xf5\x4a\x7b\x8f\x9a\x83\x75\x2b\x8a\x7c\x0a\x97\x5d\x6d\xf0\xae\x7a\x3f\xb6\xae\x19\x8d\x36\x31\x32\x99\xca\x45\xd7\x88\x7f\x41\x39\x95\xf8\x00\x33\x43\x6d\xf6\x72\xfc\x3b\x71\x46\x94\xed\xd8\xf8\xf6\xe2\xca\x22\x34\xc6\xec\x98\xa7\xbb\xc7\xd7\x67\x62\xde\x25\xb6\xba\xca\x68\x67\xcb\x60\xaf\x4f\xdb\x20\x9c\x59\x3c\x74\x06\x5b\xb6\xa3\x0f\xeb\xf9\x25\x90\x3c\x97\x08\x5f\x74\x4f\xc0\x5e\x87\x3e\x3f\xf4\x97\xdb\x61\xb3\x33\xfd\x19\x77\x5b\x3e\x9a\x23\x9a\x1a\xdd\x06\xc3\xdb\xba\x2a\x98\x85\x6c\xf5\x3e\x60\x34\xdb\x66\xa6\x92\x96\x62\x35\xfe\xaa\xfb\x3b\x62\x3d\xdd\xb0\xde\x9a\x47\xf8\xb5\xa0\xbb\xe7\xcc\x49\xaa\x44\xe1\x73\xe0\x9a\x46\xc2\xc3\xb3\xe6\x64\x83\x31\x4e\xc7\xaf\x4a\x73\xd6\x9a\x26\xcd\x9d\x68\xd9\x38\x37\xa3\x59\xf7\xce\x19\xe5\x5a\x1a\xe1\x1a\x78\x66\x00\x3e\x9a\x95\xab\x11\xa0\xd3\x0e\x98\xad\x28\x37\x4a\xec\x83\x67\x9f\x3c\x1c\x54\xaf\x67\xb3\xcd\x71\xb0\x8d\xc7\x29\x91\x3e\x29\x2a\xed\xaa\x7a\x2f\xdf\x3f\xfc\x7a\x6c\x86\x80\xde\x5e\x5c\x59\x9d\x6a\x97\xd5\x75\xf2\xf4\xb1\x7d\xfb\x27\xbe\xdd\xb5\x56\x4f\x7a\xde\xe3\x27\xe9\x9f\xe0\xef\x19\x1b\xac\xee\x47\x17\xe7\x08\xa9\x5e\xe0\xfd\x44\x0e\xa8\x34\xe7\xfd\xc9\x8a\x12\x99\x2d\xc7\xaf\xf9\x3d\x22\xd4\xb2\x84\x5c\x60\xd6\xc3\x78\x9d\x28\x24\xba\xac\x27\xa8\xfe\x0b\x21\x6e\xea\x6a\x28\x55\x47\xb3\x6c\x34\xfe\x40\x83\xbb\x61\x56\x44\x2f\xc7\x0f\xf2\x4e\x51\xdc\x13\xad\xa3\x99\xf6\x47\xf4\xcf\xa1\xc3\x73\xae\xc6\xa3\x8f\x87\xaf\x03\xaa\xed\x9b\x00\xd9\x74\x15\x5d\xc6\x8a\xaf\xc1\x93\xff\x4d\x51\x2b\x4d\xe5\x57\x4c\x2a\xfd\xa2\xe9\xe4\x8c\xb7\x73\xdc\x49\x31\xef\xf3\x83\x3e\xb3\xef\x99\x5e\xfe\x59\x28\x7d\x41\xf5\xc1\xf1\xf0\x47\x07\xe3\x5e\x8e\x07\x6e\xc0\x07\x20\x24\x1c\x5c\x08\x4e\x0f\xa6\x1b\x8f\x23\xab\x7e\x47\x71\x65\xf8\xdc\xb0\xca\x65\x97\x0d\xe3\xd6\xd6\x2c\xf5\x48\x29\x53\xd0\x4c\x37\x4c\x7a\xb7\xe5\x5a\xc0\x92\xac\xec\xb3\xce\xa7\x99\xae\xa2\x1a\x08\xb6\x4f\x42\xce\x4b\xbb\xb6\xb7\x42\xde\xd8\x86\x0d\xc8\x7c\x64\xec\xcb\x3e\x09\xd7\xfd\x63\xd5\xeb\xda\xa0\xc5\xdd\x5b\x3a\xfe\x85\x36\xf2\xbe\x50\x4e\x66\x05\xbd\xa2\x72\xc5\x32\xfa\x8e\xf1\x9b\x51\x17\x75\x98\x6b\x74\xb6\xc5\xcb\xb3\x2b\xdb\xad\x43\xce\x32\x6e\x13\xb8\x8d\x49\x42\x66\xa2\xd6\xf8\x76\x43\x10\xa5\x87\xe3\x13\xeb\x3f\xfc\xb7\x3d\x35\x88\x57\xa9\x6c\xf7\xad\x9e\xa3\xae\xf5\x33\x8e\x84\x42\x63\xc8\xab\x71\x1e\xaa\x35\xd7\xe4\x13\xea\x2e\x91\xdd\x50\x09\x85\x59\x8a\x29\xb4\xa9\x58\xde\x62\x04\x81\xb9\x63\x72\x3b\xfc\x22\x27\xb4\x5a\xd2\x92\x4a\x52\xb4\xbe\x33\xff\x43\xf1\xce\xa9\xf1\x96\x67\x2f\x13\x67\xd4\x3a\xd8\xbe\x31\xae\x31\x9d\xc8\xa7\x70\x16\xca\xb1\x24\x6b\x54\x87\x96\x31\xe1\x40\x3f\x31\x85\x00\x9b\x4a\xe4\xbd\x9a\x6e\xa3\x98\xd6\x8a\xca\x49\x5b\x01\xd0\x55\x58\x52\x4d\x2a\x17\xe4\x74\x56\x2f\x16\x8c\x2f\xc6\xe9\x12\xb4\x55\xd0\x22\xea\x3a\x9e\x75\x7e\x26\xec\x00\x97\x49\x4a\xf4\x58\x5b\x0d\xad\xf2\x63\xf4\x00\xb3\x3e\xef\x52\xe4\x96\xf5\x6c\x6d\xbd\x7b\x63\x19\x37\xf5\x72\xcc\x20\xa7\x70\xce\x41\xc8\x9c\x4a\x2c\x0f\x93\xe7\xb8\xd6\xcd\xee\x8d\x62\xdb\x39\x21\x0d\xa7\xe1\x8e\x1d\x7b\xe5\x99\x18\x19\xa0\xba\xd1\xf4\xd2\xc4\x54\x3d\x33\x0f\x99\x5a\x8e\xed\x94\x39\x44\x07\x90\xa2\x5a\x92\x49\x41\x57\xb4\x00\xd7\x55\x69\x74\xec\x77\x29\xb8\x90\x76\x37\x1a\x0f\x11\xbe\x59\xad\xf0\xc6\xc5\x3e\xdb\xbe\xb3\xa3\x3e\x62\x4e\x89\x1e\x99\xf9\xe3\x67\x10\x7a\x18\x83\xc3\x97\x01\xdf\x31\xd7\xf1\xf9\x30\xfd\xac\x64\x5c\x4b\x27\x0d\x48\x8e\x56\x3d\x2d\x2b\x21\x89\x64\xa3\xa3\x60\xdb\xe7\x12\x2d\xc8\xa1\x58\x18\x3b\xd6\x4c\xb3\x15\x33\xef\xd8\x1d\x72\xa4\x5b\x8d\x91\x5c\x7b\x47\x1d\x6d\x1a\x2e\xa0\x39\xef\xc6\x02\x54\xd9\x92\xe6\x75\x31\xfe\xdd\xb9\xa8\x89\x24\x5c\x53\xaa\x8e\x1b\x78\xcf\xda\xa5\x69\x5b\xe1\xd2\x26\x99\x8f\x0d\x09\x19\x31\x87\xdc\xe8\x27\xa6\xb1\x33\xa5\xf9\x0e\xca\x30\x9b\xbc\x8e\xef\x9a\x91\x5c\x85\xdc\xc8\x7a\xef\x0b\x27\xef\xb0\x4e\x46\x6a\x85\xdd\x10\x9c\x2a\xa1\x9f\x32\x6a\xcc\x0e\xad\xda\x45\x1e\x7b\x08\x6c\xf6\x0f\x13\xfc\xb8\x95\xae\xee\xcc\xd2\x15\xcb\x3c\xe2\x2f\xbb\x14\x28\xb2\x74\xfb\x84\x57\x61\x24\xcf\xd9\xda\x05\xd7\x8a\x4e\x71\x6c\x28\x83\xeb\x25\x1d\x7b\xa9\xda\xf2\x5a\x78\x39\x57\x8c\x34\x2c\x77\x8b\xee\x91\xdc\x7b\x82\x7e\xf3\xc4\xfa\x3a\x05\xfb\x33\x06\xc1\x33\x37\x74\xe7\x74\x30\x5a\x61\x2c\x47\x54\x23\x8d\x94\x76\x82\xbf\xcd\xc2\x0e\x15\xfe\xad\xf8\xc7\x6a\x0f\xe3\xce\x91\xb7\x87\xce\x0f\x00\xec\x01\xde\xf5\x77\x03\x12\xb9\x08\x75\xae\x1e\x9c\xca\x45\x5d\x62\x5e\xb0\x73\x15\x75\x1d\xe4\x7d\x5c\x82\xd7\x4b\x0a\xb9\x7d\x56\x60\x1c\xd6\x3c\x60\xde\xbc\x7f\xdb\x60\x13\x3d\x38\x32\x57\xe8\xc3\x55\x6e\x72\xfd\x92\xf3\x29\x7c\xe7\xde\x42\x3e\x11\xed\x9d\x28\x8d\x01\xda\xc2\x83\xeb\x2e\x7c\xc6\xf0\xfd\xe6\x19\xcf\x27\x1d\xbe\xa4\xb3\x81\x9d\x17\xdb\x2b\xfe\x6e\xbb\x10\xb9\x35\x68\x52\x45\x18\xaf\xcc\x0b\xd6\xd7\x97\xdb\x62\x02\x78\xb6\x24\x7c\x61\xa5\x09\x0d\x44\xc1\xb8\xb7\xaa\xeb\x99\x4d\x55\x46\xaa\xc6\xa7\x42\x20\x17\xb5\xdf\xf6\xff\xe6\x37\xc7\xc0\xe8\x6b\xf8\x4d\x6f\x70\x53\x38\x73\xdc\xbb\xc3\xe1\xbb\x0a\xb6\xde\xcb\xac\x3b\x4c\xc7\x20\xe9\x82\xc8\xbc\xf0\x6b\xed\x21\xe6\xad\xcb\xc1\x76\xe1\x77\x87\x01\xcd\x38\x05\xc2\x07\xd4\xc1\x85\xde\x85\x91\xe8\x95\xd9\xf3\x60\x7a\x4f\x61\x3e\x4d\xd4\x8d\x3a\xb1\x0e\x8e\x49\x4e\x34\x99\x90\xca\xfa\x8d\x99\xe0\x27\x36\xa0\x33\x71\xad\x5d\x27\xc4\x09\xa5\x49\x7b\x91\x4e\x7e\x2d\x6b\x6c\x4c\x3e\x21\xed\x6f\x31\x3e\x21\x13\x6c\x04\xea\x5b\x4f\xe2\x1f\x9c\x7a\x13\x10\x2d\xf1\xee\x99\xbc\xe9\x02\x6b\x84\xbb\x9d\xfb\x14\x2e\xbc\xf2\x1d\xda\x06\xff\x6d\x32\xaa\x6b\xc8\xda\xc9\x7f\x1f\x51\xdf\x68\x8c\xb3\x8b\xeb\x8f\x7f\xb9\xfc\x70\x7e\x71\xdd\x28\x8e\x46\x0d\xf8\x70\xbd\x4b\x71\x84\xdd\xf4\xbb\x14\x47\xa7\x06\x42\x50\x4c\x9b\x8a\x63\xa8\x06\x7c\x38\x6f\x2b\x8e\xa1\x1a\xf0\x59\xd9\x6d\xc5\xb1\x43\x0d\x78\x5a\x11\xfd\xf5\xdd\xa9\x06\xbc\xa4\x73\x4f\x71\xec\x56\x03\x1e\x5c\xb7\x15\xc7\x50\x0d\x78\xdd\xaf\x6d\xc5\xd1\x53\x03\x9e\x2a\x7f\x5b\x71\xf4\xd5\x80\x07\xd3\xdd\x8a\x23\xa9\x81\x7d\x3e\xd4\x4b\x0d\x50\xbe\x0a\x54\x01\xad\xc3\x7b\x57\x54\xc1\x67\x32\x83\xd6\x96\xbd\xa2\xd8\x31\x0e\xd5\xe7\xb1\x9f\x43\x8c\x3e\x5f\x7d\x47\x24\x48\x5a\x49\xaa\xf0\x5d\xe5\x99\x13\xb2\x6b\x83\xc0\x31\xf5\x6d\xcd\x4f\x3a\xb8\xf1\x67\x97\x52\xfb\x44\x49\xb1\xd1\x12\xd0\x9a\xa4\x31\xfb\xc6\x8e\x97\x72\x30\x6d\x9b\x9c\x10\x78\xf3\xd3\xf9\xdb\xb3\x8b\xeb\xf3\xaf\xce\xcf\x3e\x3e\x59\xd6\x4b\x50\xfb\xc8\xa1\xb9\x1a\xc7\x52\xb3\x74\xbf\xbd\xe6\xcd\xd6\x56\x50\xa7\x2b\x26\x6a\xe5\x70\x69\x79\xd4\xfd\x55\x5b\xb2\xd5\x9b\x25\x56\x9f\xe5\xeb\x26\x4a\x1d\x77\x98\xd3\x9d\x9e\x0a\x6f\xbe\x51\x0d\x55\x4b\xf7\x98\xab\xde\x3c\xa3\x7a\x3b\x2c\xdd\xed\xf3\xf0\xdf\xf8\xd8\x26\xaf\xa5\x7b\x0d\xdf\x90\x9d\xbf\xc3\xfc\xf5\x66\x79\x8f\xf7\xc4\x9b\x67\x63\x3c\x0f\x53\xa7\xbc\xdb\xaf\xc4\x11\xbb\x5f\x49\x51\x46\x11\xbd\x57\x36\xd0\xe6\xd0\x65\xde\x8b\xb4\xcb\x88\x39\x50\x76\xac\xfe\xe7\xae\xe7\xb6\x72\xae\x81\xa6\x51\x84\x37\x4b\xc3\x0f\x6b\x24\x86\xa9\xcd\xa0\xc6\xdd\x31\xba\x5d\xdb\xf4\x9b\xf7\xa4\xfa\x86\xae\x3f\xd2\x80\x0e\x2d\x5b\xa8\xc3\x82\x66\xc6\x98\x85\x9b\xd1\xe1\xb1\x21\x21\xd8\xfa\x4d\x33\xcc\x90\xd6\x36\xcf\xaa\x57\x7a\xd8\xb2\xc4\x6a\x74\x7e\x43\xbd\x6b\x01\x34\xb4\xd5\xb8\x3b\x74\xc3\xa1\x79\x25\x9a\x13\x14\xb2\xdf\x10\xb3\xc9\x79\xf4\x96\xf0\x07\xce\xc0\x0f\x5f\xab\xce\xd8\xd1\xd6\xad\x12\xcc\x72\xff\xb6\x39\x62\x65\x6c\x43\x7a\x7b\xe2\x72\x51\x27\xc6\xee\x98\xd8\x3b\xa6\x4e\x30\x45\xeb\xe4\xd7\xf8\x9f\xe0\x41\xd9\xc6\x79\xa7\x79\xee\xaa\xab\xd4\x8a\xce\x6b\x9f\xca\xd7\x43\x42\x64\x93\x9a\x02\xa9\xd8\x77\x54\x2a\x26\xbc\xda\x37\x0c\xe9\x86\xf1\xfc\x18\x6a\x96\x7f\xe9\xdf\x5d\xcd\x52\xb4\xf3\x2b\xbc\xd0\x9a\xdb\xb4\x23\xf3\x34\xfc\xba\xf7\xed\xad\x56\xd4\x07\x73\xb5\x05\x65\x8d\x3c\x6a\x10\x17\xc1\x2c\xdd\x83\x2d\xca\xa6\x86\x14\x00\x81\xe6\xe0\xc6\xd4\xd9\x07\xad\xd2\x0e\x9a\x9f\x85\x0a\xb6\x5d\xf4\xf2\xd7\x4d\xcb\xcc\x30\x11\x50\x52\x4d\x72\xa2\xc9\xd4\x48\x93\xe3\xe1\x97\xaa\x22\x99\x57\x33\x8f\x8e\xfe\xab\x65\x58\x90\x19\x2d\xd4\x0f\x07\x07\x7f\xfa\xe6\xec\x2f\xff\xeb\xe0\xe0\xc7\xff\x8a\xc5\x19\xcd\x50\xf4\x5c\x47\x64\x8f\x28\x24\x2e\x72\x7a\x81\xeb\x82\x5f\xba\x07\xfb\x69\x96\x89\x9a\x6b\xfc\x41\xd8\x67\x60\x71\xf6\xe9\x52\x28\x7d\x7e\x79\xdc\x7c\x59\x89\xfc\xfc\x32\x0a\x63\xe4\xa4\x02\x5a\x51\x3e\x33\xe3\x0e\xaf\x80\x67\x39\xbf\x86\x62\x99\x78\x9d\x5e\x8b\x2a\xfa\x1d\xcf\x70\x21\x6d\xe5\x84\xca\x96\xb4\x24\x41\x6f\xc7\x86\xbe\x6a\x16\x1f\x98\x0a\x68\xba\x32\x24\xc6\xb1\xc0\xbe\x02\x31\x8f\xd2\x83\xd5\x92\x16\xf0\x62\xf5\xea\xc5\xb3\x31\x72\xdb\x73\x1b\xf5\xa8\xe0\x5e\x44\x32\x74\xad\x72\x69\x9f\x07\x51\xf6\x75\xd9\x4f\x3e\x38\xbd\x3c\x0f\x66\xba\xb2\x77\xe3\x59\x6c\x6b\x03\x05\xfd\xea\x99\x5a\x0b\x1d\x46\x7b\xa3\x10\x75\xd8\x11\x14\xbc\x58\xb7\xbc\x95\x6d\x15\x11\x76\x5f\x09\xcf\x51\x3b\x50\xa5\x15\x1c\x5a\x86\xd3\xac\xaa\xc3\x14\xa0\xe3\x53\xd2\x52\xc8\xf5\x71\xf3\x65\x0b\x02\x9e\x28\x2d\x24\x59\x04\xaa\xef\x66\xd8\x38\xdc\xee\x2b\xfb\xa1\xd1\x16\x65\x7b\xd4\xfe\x3e\x6d\x70\xb9\xa1\x59\x2d\xcd\xb3\xb6\x58\x77\x6d\xd7\x7f\x39\x56\x82\x27\x72\xbe\x4f\xb1\x8c\x84\xf6\xd6\x5d\x44\x77\x73\xbc\x09\x0e\x43\x35\x84\x2e\x98\x76\xed\x61\xee\x85\x63\x1c\x92\x2b\x15\x7e\xdc\x3e\x8f\xc3\xdd\x09\x42\x02\xe5\x2b\x58\x11\xe9\xd9\x26\xb8\xa3\x68\x7a\x3d\x67\x2b\xa6\x44\xa0\x48\xbd\xab\xea\x54\x14\xbd\xee\xfa\x00\xd9\xfc\xd8\x58\x46\x25\xfd\x54\x61\x3f\xc9\x56\x0f\x84\x7b\x76\xf2\x7e\xf4\xe6\x95\x7f\xe5\x3b\x4b\x15\xd1\x9a\x4a\xfe\x1a\xfe\xf3\xf0\xaf\x5f\xfc\x3c\x39\xfa\xf2\xf0\xf0\x87\x97\x93\x7f\xff\xf1\x8b\xc3\xbf\x4e\xf1\x1f\xff\x7a\xf4\xe5\xd1\xcf\xcd\x17\x5f\x1c\x1d\x1d\x1e\xfe\xf0\xcd\xfb\xaf\xaf\x2f\xcf\x7e\x64\x47\x3f\xff\xc0\xeb\xf2\xc6\x7e\xf5\xf3\xe1\x0f\xf4\xec\xc7\x3d\x99\x1c\x1d\x7d\xf9\x9b\xc0\x81\x07\xb6\x73\xb7\x14\xab\xa9\xfb\x90\x5b\x84\xeb\xf2\x28\x0d\xde\x3b\x6a\x8e\x63\x5c\x39\xfb\x31\x82\x4e\x1a\x8e\xaf\x33\xb3\x9f\x85\x20\x53\x34\x93\x54\x3f\xef\x38\x95\x1d\x63\xaf\x99\x46\x40\xc1\x4d\x68\xca\xc6\x55\x24\xc8\x46\x78\x56\x36\x4f\x0a\x7b\xdd\x47\x8d\x33\xc4\x9e\xa2\x78\xaf\xdc\xb9\x14\x65\xd3\xb0\x00\x81\x5f\x2b\x52\xb0\x50\x2f\x76\x73\x23\xcd\xcc\x9f\xc5\x53\x17\x52\x98\x2e\x85\xe9\xc6\x50\x0a\xd3\x8d\xa3\x7e\x98\xee\x0a\xef\x7e\x8a\xd1\xed\x22\xca\x57\x7e\xc0\xaa\x9d\xc8\xfb\xc6\x87\xd5\xeb\x9d\xeb\x31\xb7\x9d\xf8\xfd\x6d\x18\xbe\x07\x67\xa7\xfc\x3a\x34\x6b\x97\xe3\xe5\xeb\xde\x28\x77\x23\x94\xe1\xb4\x28\x80\x71\x5f\xe5\x85\x83\xec\xaa\xc6\x59\x77\x12\x10\x85\x25\x12\x56\x7e\xa0\xd6\xa6\x88\x43\xbf\x9e\xb4\x02\xac\xbf\x30\xba\x2a\x8e\xa5\xef\x6d\x11\x88\x1b\x5b\x17\x42\x69\xdc\xa4\xb2\x2e\x34\xab\x0a\x0a\x01\x0f\x59\x0b\x66\x2c\x6a\x0a\x44\x29\x91\xd9\x82\x3e\x6d\xcd\xb2\x82\x28\x9f\xf9\xbb\x97\x02\xae\xaa\x26\x37\x88\x6d\xce\x68\x4e\x79\x46\xb1\x2c\xdc\xd8\x82\x70\x96\x9a\x93\x34\x5b\x9b\xbd\x39\xe3\xab\x36\x13\xab\xa9\x1d\xe8\xb7\xfd\x77\x8c\xf3\x9f\x37\xf5\xc4\x88\x29\x07\xdd\xec\x32\x50\xbc\x24\x27\xda\xad\xad\x27\x9f\x60\x92\x8f\x98\x77\x68\x0e\xaf\x5c\xa1\xb0\x97\x4b\xe8\x6b\xa1\xc5\x46\x06\x3c\x38\xb7\x9e\x09\xed\x82\x84\x34\x9c\xb2\xcf\x02\x34\xeb\x3d\x79\x3c\x13\xf8\x69\xa8\xb9\xbe\xd3\x54\x0f\x8e\x22\x0f\xcd\xf4\xe7\x67\x66\x3f\x82\x89\xbd\xc3\xbc\xb6\xe6\x71\x10\xd7\x50\xd3\x3a\x8a\x59\x1d\xc3\xa4\xde\x65\x4e\x07\x24\xd7\x76\x34\x40\xbc\x45\x31\x81\xc3\xcd\xdf\x70\x78\x5a\x25\xe9\x9c\x7d\x8a\x22\x33\x4f\x79\xbb\x81\xc0\x72\xca\x35\x9b\xb3\x90\x2e\xc5\xc2\x0c\xae\xa2\xdc\x96\xb1\x22\xd9\x12\xed\x82\xc0\xbe\x48\x1d\x3c\xfd\xb9\x25\xd7\x59\x17\x4d\x4c\x05\x76\x15\xcb\x39\x95\xb4\x57\xd2\x5e\x49\x7b\x3d\x44\xcf\x5e\x7b\x39\x79\xd0\x3c\xd9\x9f\x56\xfd\x60\x45\x98\xd0\xa2\x37\x6f\x7b\xf5\xc8\xf0\x8e\x7b\xbb\x6b\xf7\xbf\x7b\x5d\xb5\xbf\x13\xfc\x5c\x0f\xec\x40\xc0\x71\xc3\x8f\xbc\xac\x8b\x62\x7c\xad\x79\x4b\xc3\x05\x3c\xc7\x95\xab\xea\xa2\x70\xe5\xc1\xa7\xf0\xc1\xab\x4f\xad\x98\xc3\x69\x71\x4b\xd6\xea\x18\x2e\xe8\x8a\xca\x63\x38\x9f\x5f\x08\x7d\x69\x1f\xaa\x3e\x4a\xb5\x9f\x7d\x69\x59\x03\x9b\xc3\xeb\x82\x68\xaa\x34\x68\xe2\x73\x51\x99\xea\x77\x4f\x13\x72\x30\xc8\xae\x91\x69\x9c\xa6\xf1\x63\x85\xfa\xd6\xc1\xfa\x75\x53\xc7\x72\xf2\x04\x07\xad\x60\x73\x9a\xad\xb3\x22\xf4\x8e\xbe\x6b\xf8\x34\xd5\x9a\x48\x51\x88\x5b\x2f\xb1\x83\x80\x9d\x1d\xa5\x43\x3f\xab\xe6\x2e\x95\x50\xfa\x4a\x13\xa9\x23\x74\x78\x39\xb8\x6c\x98\x99\xc5\xcd\x48\x51\x78\x8b\x73\x56\x96\x34\x67\x44\xd3\x62\x0d\x64\xae\xa9\xec\xd7\x29\xf6\xe5\xa9\x6c\x6d\x70\x57\xde\x16\xfb\x77\x13\x9e\x17\x54\xc2\x9c\xb0\xc2\x1b\xe3\xb3\xe5\xc4\xb5\x9d\xc7\xbd\xfa\x94\x58\xb2\xe0\x48\x57\x8b\x17\x48\x96\x09\x99\x63\xa9\x2f\x01\xfe\x60\x54\xc7\xb0\x13\xac\x68\x43\x95\x84\x93\x05\x0d\x28\xcc\xb0\x89\xbe\x85\x59\x21\xb2\x1b\x05\x35\xd7\xcc\xd7\x36\xb3\xad\xd5\xc5\x0d\x64\xa2\xac\x0a\x14\x4f\x61\xe5\x02\xe1\xfe\x92\x81\xbb\x64\x5e\xfb\xcf\x49\x2b\x7a\x26\x66\x4c\xea\xe4\xd7\xdd\x8f\xf0\x1b\x7e\x96\x5e\xf0\x4b\x24\xfc\x1d\x42\x3f\xd1\xcc\xdf\x3a\x1c\x5c\xfd\x0f\x9c\xe2\xa9\x0d\xea\xe6\x0d\x20\x78\x0b\xe7\x9e\x0b\x23\x98\xcd\xa9\x0f\x6c\xed\x0b\x83\x1e\x01\x53\x38\xfb\x44\xb3\xf6\xeb\x90\x07\x89\x19\xa5\x6d\x6b\x80\x15\x6d\xc9\x4d\x40\xa1\x81\x28\x50\x9b\x38\x20\x17\xef\x02\x90\x7d\xda\xe8\x3c\x8b\x1c\x43\xaa\x26\x58\xb2\x82\xc6\x32\x2b\x18\x1f\xdd\x7e\x66\x9b\x5c\x79\x49\x60\x5c\xd9\x36\x78\x3d\x49\x16\x0a\x13\x30\xcc\xb6\x1a\xed\x06\xf2\x6c\x9a\x30\x35\xab\x10\xbe\xa6\x52\x08\x0d\x87\x07\x27\x07\x47\x5b\x31\xdd\x40\x08\x9a\x79\x5d\x17\x54\xad\x95\xa6\xa5\x2d\x5a\xe3\x46\x1d\xc8\x95\x61\x6b\xee\x0a\xfb\x32\xd3\xec\x20\x3f\x06\x16\x0a\x27\x70\xb6\xa0\xed\x80\x82\x27\x21\x2c\x37\x05\x6c\x95\xd2\x63\x50\x02\xb4\x24\x39\x8b\x82\x11\x47\x9e\x66\x80\x5a\xd6\xae\x9d\xca\xe1\xc1\xcf\x23\xbb\x5b\x6d\x13\xd5\xd9\x11\xdc\x0a\x7e\xa0\xf1\xb8\x4e\xe1\x3a\xf4\x56\xd5\x8a\x36\x85\x5a\x6d\xaf\x28\x4e\xc3\x61\x15\xa2\xdf\x2a\xca\x18\x97\x20\xea\xd0\x7d\xc7\x4a\xe4\x44\x37\x35\x65\xcf\x3e\x05\x9f\x24\x9b\x97\x6a\x94\xd8\x4b\x34\x05\xad\xc1\x19\xc8\x94\x28\x28\xd8\x8a\x9e\x2c\x29\x29\xf4\x72\x0d\xe1\x77\x88\x0b\x3e\xf9\x3b\x95\x02\xab\xde\x72\xc7\x37\x0c\x8b\x17\x12\x96\xee\x93\x77\x88\x7a\x7b\x30\x41\x1e\x34\x63\x2f\x7e\x4d\x3d\xdf\x45\xb0\xa9\x03\xff\x7c\x7d\x7d\xf9\x35\xd5\xd1\x0c\x0f\x33\xba\x26\x81\xaa\xd7\xa2\xe9\x89\x2d\x90\x70\xa8\xef\x04\x2a\x21\x9f\xda\x04\x5a\x0a\x15\xb0\xef\xb0\xb5\xf7\x42\x69\xdf\xaa\x92\x7d\xd2\xc2\xe8\x66\x4e\x33\xb3\xe3\xd1\x92\x89\x5d\x37\x86\x4a\xe4\x70\x7e\x39\x85\xbf\x88\xda\xac\xe2\x8c\xcc\x82\x2c\x79\x43\xb7\x84\xeb\xa6\x6c\xeb\x0b\xb3\x08\x2f\x42\xc2\x65\x96\xcc\xb9\xff\x33\x25\x39\x95\x0a\x35\x21\x25\x9e\x0d\x65\x1b\x8a\x04\xc0\xec\x8d\x2b\xa6\xe5\x5c\x2b\x2d\x4a\x58\x5a\xc6\xe1\x1b\xdd\x2b\xa0\xeb\x64\x47\x28\xfe\xda\xc8\x35\xeb\x43\x53\x20\x69\x15\x43\xdb\xb9\xd9\xfe\x82\xb4\xd1\x96\x26\xb0\x27\x25\x90\x6b\xc3\x77\x86\xfd\x95\x32\x3c\x2a\xc1\x2c\xed\xe2\x9b\xb3\xe2\x8a\xde\x05\x73\x64\xdc\x1e\x12\x23\x54\x82\x51\xe2\x91\x52\x52\x20\x52\x5a\x0a\x84\x14\x0c\x1e\x32\x41\x80\x65\x20\x97\x58\x59\x2e\x10\x29\x1f\x02\x76\xc0\x00\x22\xb0\x6c\x4f\xa9\xad\xe9\x10\x61\xf9\x21\x26\x12\x1f\x42\x4b\x13\xf7\xe9\xf1\x97\x2f\xc6\xc1\x83\x78\xeb\x57\x05\x17\x11\xd9\x2e\x21\xa2\x05\x90\x2c\xf3\x6b\x89\xd3\x27\x61\x55\x27\x8a\x33\xdb\x7f\xf2\x59\xd8\x1e\xc6\x62\x8e\xb8\x64\x16\x4e\x22\x81\xd7\xe5\x2c\x58\x49\xb5\xd5\xbc\xa4\x8e\xbd\x0d\xbd\x16\x00\x17\x31\x86\xda\x00\x11\x1a\x03\x89\xf0\x45\xe8\xbd\x78\x65\xe6\xfc\xc7\x3f\xfc\xe1\x77\x7f\x98\xda\x65\x35\x9f\x11\xc8\x73\x46\x81\x70\x38\x3f\xbd\x38\xfd\xe9\xea\xbb\x37\x58\x59\x39\xec\x14\x46\x48\xc9\x8e\x99\x90\x1d\x31\x1d\xfb\x11\x93\xb1\xb1\xec\x54\xa0\x84\x1f\xa2\x6b\x90\x61\xb8\x47\xbb\x56\xb6\x98\xb2\x7b\x29\xda\xb0\x61\x04\x4f\xb6\x79\x13\x0f\x6a\x50\x47\x78\x38\x3c\xb9\xf4\xd4\x59\x75\x25\xb2\x9b\x68\x5e\x9e\x83\xeb\x37\x97\x96\x61\x14\x47\x0f\xe1\x4d\x80\x89\xf1\x95\x28\x56\x66\x33\x09\x5c\xbf\xb9\x0c\x54\x16\x53\xc3\x03\x23\xac\xd6\xef\xbd\x0e\xca\xc7\x6b\x0b\xec\x38\x80\x1e\x2b\xab\x22\x24\xa2\x0c\x58\x47\x5e\x52\x52\x30\xa5\x59\x86\x63\x6d\x63\xb0\x41\x5e\x1d\x71\xe3\x8f\xca\x4b\xfe\xb1\x8e\x22\xfb\xc7\x0e\x3e\x44\xca\x5d\x6d\x1d\x6d\x3d\x57\x59\xb0\xd3\xe4\x78\x50\xba\x25\xbc\xce\xa0\x73\xb4\x85\x25\x0e\x3f\x53\xcb\x11\xcd\x30\xbf\x36\x91\x7d\xe2\xbd\x0e\x36\xce\x72\x0c\x8d\xa0\xa0\xdd\xb9\x6d\x39\x06\xb2\x75\x13\x1e\x5a\x8e\xa1\x7e\x09\x63\x77\x6e\x59\x8e\x91\x6c\xdb\x64\x39\xee\x47\x8f\x60\x39\x56\x92\x5e\x69\x51\x45\xc1\xd9\x59\x56\x51\x51\x76\x33\x3a\x17\x92\xc6\x81\xd9\x75\x00\x38\xc8\x6b\x14\xc6\x84\x07\xd4\xc7\x6c\xc2\x5c\xa2\x0f\x57\xf3\x4e\xbc\x06\x34\x59\xb2\x65\x13\x55\xe5\x54\xa9\x13\x84\xc6\xd5\x95\x75\x52\x7a\x32\x9d\x13\x56\xd4\x92\x1e\x9b\x9d\xa6\x65\x65\x3b\xd4\x07\x96\xea\x33\x9b\x41\xb9\x65\x45\xb5\x6d\x1a\xdf\xa0\x16\xfd\xf7\xc7\xd8\x7c\xf6\xe0\xd8\x6e\xa7\xe1\x2d\x9f\x32\x49\xd4\x92\x62\xa3\x47\xfa\x89\x69\x65\x07\x2a\x29\x51\xde\x95\x7e\x11\xea\xe2\x0e\x12\x9a\xc0\x0a\x2a\xa2\x14\xcd\xfd\xb5\x41\x0f\xf2\x69\x07\x78\x29\xf2\x83\x03\xd5\xff\x18\x4f\xce\x0b\x49\x32\x0a\x15\x95\x4c\xe4\x80\xb5\xb3\x73\x71\xcb\x61\x46\x17\x8c\xfb\xbe\x00\xdc\x8d\x34\x83\x6e\x2e\xbc\x31\x61\x69\x00\x90\xaa\xe9\xa6\x3b\x85\x8f\x83\x6e\x9f\xfe\x5a\x4b\xd4\x3a\x13\x9d\xb6\x76\xab\x7b\x1c\xc0\xb1\x43\x92\x62\xce\x3d\x5e\xf3\x9a\x14\xc5\xba\x13\x2b\x9e\x9c\x5d\x79\x09\xfd\x58\x1b\xff\x99\x61\x6a\xcd\x65\x0d\xe5\xd8\xbf\xa0\xfd\xa5\xf0\x97\x4d\x92\x92\x6c\x19\x96\xae\x90\xa0\xbb\x0f\x50\x82\xee\x26\xe8\xee\x9d\x94\xa0\xbb\x09\xba\x9b\xa0\xbb\x09\xba\x9b\xa0\xbb\x09\xba\x3b\x92\x12\x74\xf7\x21\x4a\xd0\xdd\x3b\xe9\x59\x86\x26\x12\x74\x37\x41\x77\xf7\xa6\x04\xdd\x4d\xd0\xdd\x71\x7c\x13\x74\xd7\x8b\x12\x74\xf7\x5e\x4a\xd0\xdd\x10\x4a\xd0\x5d\x5f\x4a\xd0\xdd\xd1\x94\xa0\xbb\x09\xba\x1b\x40\x09\x80\xe1\x41\x09\xba\x1b\xe1\xe1\xf0\xe4\xd2\x33\x41\x77\x13\x74\x77\x4f\x4a\xfe\xb1\x8e\x12\x74\x37\x80\x12\x74\xf7\x41\x4a\xd0\xdd\x04\xdd\x0d\xe0\xf5\xfc\x2c\xc7\x06\x22\x7a\x29\xc5\x2c\xb4\xf8\x28\xf2\x50\xd8\x9f\x3a\x95\x1e\x0d\xc0\x30\xdd\x89\x5f\x02\xe1\x55\x2d\x18\xba\xd7\xee\x26\x76\x69\x88\x40\xf2\xe4\x3d\xc4\x2d\x0d\xd1\x47\xbe\xe6\xaf\x37\x66\xe9\x19\xa0\xd7\x82\x71\x4a\x77\x60\x94\x02\x45\xf8\x06\x3e\xa9\x41\x18\x05\x70\xdc\x89\x4d\x0a\x1c\xe5\x16\x2e\xa9\x41\x16\x45\x98\x39\x02\x30\xfb\xa8\xa2\xc0\x50\x77\x0f\x8f\xd4\x47\x14\x05\x70\xed\x61\x91\xb6\xd1\x44\x21\x3b\xa5\x77\x21\x89\x1c\x10\x26\xe4\x85\x35\x40\x11\xed\xc0\x01\x05\xf0\x46\x04\x51\x64\x0c\xd0\x4e\xfc\x4f\x98\x11\xb7\x03\xfb\xd3\xa0\x77\x42\x16\xb6\xc3\xfd\xf4\x91\x3b\x21\x47\xa0\xc5\xfc\x6c\xa2\x76\x82\xfc\x00\x79\x6c\xc4\x4e\x8c\xf8\x68\x70\x6c\x34\xd0\x5c\x73\xb9\x32\xd7\x4b\x49\xd5\x52\x14\x9e\xaa\x60\xa0\x06\xde\x33\xce\xca\xba\x34\x32\x47\x19\xb9\xcd\x56\x81\x89\x3c\xaa\x85\x6c\x62\xfc\xd3\x06\x56\xbd\x35\x1e\x4a\x14\x49\x73\xe4\x6e\x8e\x18\x56\x35\x5f\x92\x95\xbf\xbd\xab\xea\x2c\xa3\x34\xa7\xf9\xc0\xb9\x07\xbf\x9b\x36\x6b\xe1\xc9\xd7\xf6\x7a\x64\x0a\x5e\x85\x58\x18\x21\xcf\x82\xb9\x90\x25\xd1\xc8\xe3\x77\xbf\xf5\xe0\x10\x04\x00\x7b\x14\xf0\x57\x74\xe0\x57\xb0\x19\x17\xe6\xd0\x0a\x70\x66\x85\xdb\x8f\x61\x4e\xac\xdd\x00\xaf\x30\x1d\xb7\x0b\xdc\x15\xc6\xf1\x11\x80\x5d\x3b\x41\x5d\x7d\xf8\x53\x98\xa5\x1b\x06\xe8\x8a\x04\xfb\x0c\x06\x72\x3d\x0e\x88\x6b\x37\x80\x0b\xa5\x4b\x88\x71\x31\x04\x6f\x85\xc3\xaf\x9e\x85\x69\xf1\x18\x90\xab\x6d\xb8\x95\x5b\xac\x30\x57\x6e\x0b\xb5\x8a\x07\x95\x8a\x04\x93\x8a\x01\x91\x0a\x86\x47\x85\x43\xa3\x62\xc1\xa2\x62\x40\xa2\xb6\x1a\x1a\x46\x38\x41\xd0\xf4\xa0\x8b\x02\x32\x8e\xe5\x42\x8d\x02\x81\x7a\xdc\xe5\x8a\x01\x7d\x8a\xb0\x5e\x61\x90\xa7\xc7\x81\x3b\xc5\x84\x3a\xc5\x58\xa2\xa0\x40\xd5\xe3\xc0\x9b\x76\x42\x9b\xc0\x3b\x09\x1c\x36\xdd\x5d\xd3\x7e\x78\x29\x80\xe9\x06\xa4\xa9\x1f\x5a\x0a\xe0\xda\xc2\x99\xe2\x86\x95\x02\x43\x4a\xb1\xc2\x49\x91\x42\x49\x8f\x04\x40\x0a\x05\x1f\xed\x06\x1e\x19\x1b\x24\xe0\x40\x6c\x81\x8e\x3a\xd8\x50\x00\xd7\xbe\x4f\x22\x0c\x32\x14\xb8\xa1\x8c\x33\xcd\x48\xf1\x96\x16\x64\x7d\x45\x33\xc1\x73\x4f\x6b\x62\xa3\xed\xae\x0b\x99\xcf\x41\x59\xa6\x9e\xf3\xb3\x9e\xa0\x61\xc1\x87\x25\x51\xe0\xfa\xbf\x79\x72\x75\xd5\x43\x9a\xf0\xa5\x33\x4c\x31\xf6\x68\xd7\x43\xfb\xc7\xb3\x46\x96\x66\xb8\x15\xf2\xa6\x10\x24\x57\x27\x95\xb0\xff\xd7\x15\x66\xe8\x55\x64\xb0\x23\x0c\x29\xc9\xf0\x94\x2e\x27\x5b\xf7\x22\xde\xf1\xfa\xb3\xb8\x05\x31\xd7\x94\xc3\x21\xe3\xcd\x09\x3b\xf2\xf5\x3e\xb5\xce\xa6\xce\x9f\xd9\x3a\x0d\xfd\x79\xbe\x7a\xd9\x0c\xac\x75\x39\x06\x19\x66\x9f\xb3\xcb\x11\x9d\xb1\x4a\x3d\x4f\x8f\xb6\x1b\xdc\x63\xb9\xb4\x1d\xfb\x79\x5d\x58\x61\xe6\xeb\xbf\x41\x67\xb8\x73\x90\x0f\x7d\xda\x9e\xc7\x02\xda\xae\xfa\xaf\x70\xe6\xad\x34\x24\x3c\x07\x57\xf3\xcb\x9b\x73\xff\xc0\x7f\xd6\x47\x37\x10\x4a\xfb\x58\x30\xda\x3b\x21\xb4\x16\x08\xeb\xc9\x75\x0b\x3e\xdb\x81\x60\x7d\x39\x0e\xa1\xb3\x7d\x00\x6c\xc0\x18\x5b\x0d\x19\x00\x7e\x4d\x31\x02\xbf\xbf\xbd\x13\xe4\x8a\xe1\x82\x00\x93\x78\x03\xe0\x1a\x2b\x17\x7c\x98\x07\x1e\x0a\x94\x7e\x36\xaf\xfd\x06\x92\x1a\xea\x1b\x4b\xaf\xfd\xf4\xda\x7f\x80\x1e\xe1\xb5\xaf\x59\x49\x45\xad\x9f\xed\x83\xf3\x76\xc9\xb2\x65\xdf\x16\x64\xa5\xb7\xaa\x16\xb5\xde\xb0\xd7\xdc\x10\x23\x42\x11\xd2\xab\x73\x83\xfc\x62\x1a\x3b\x1c\xaa\x56\x3c\xb6\x78\x62\x8f\x89\x74\x8e\x8b\x16\x2b\x0b\x44\x01\x81\xb7\x17\x57\x3f\xbd\x3b\xfd\x8f\xb3\x77\x3e\x82\xe6\x7a\xc9\x94\x55\x99\x8d\xf8\xaa\x39\xfb\x5b\x4d\x81\x94\xc2\xd8\x82\x45\xd0\x50\xd5\x31\x3a\x42\x7a\xdf\xf0\x2c\xce\x14\x13\x88\xed\x25\xc6\x8c\x62\xf3\x10\x30\xc3\xe8\x83\xe1\xf1\x0c\x91\xe9\x7e\xb1\x68\xef\x18\xf4\x06\xb0\xd8\x8d\xde\x2c\x0e\x48\x5a\x49\xaa\x28\xf7\xb4\xd4\x08\x70\xaa\x8d\x4c\xb2\x76\x08\xe3\x40\x40\x31\xbe\x28\x02\x73\x5a\x02\x6d\xfc\x10\x0b\x7f\xd2\x8d\xfc\xd2\xcf\xd0\x0f\x35\xf3\x07\x9f\xef\x6b\x8c\xec\x34\x3a\xe7\x61\xc9\x7a\xb6\xe4\x9d\x50\xb4\x89\xc6\x55\x22\x3f\x50\x70\xee\x8f\xf6\x20\x79\x2e\xa9\xc2\xc2\xda\x4c\x75\xf6\x9c\xd1\x90\xcc\xbf\xd2\x0b\x9e\x45\x1b\x4e\x3b\x86\x97\xf0\x27\xf8\x04\x7f\x42\x93\xf3\x8f\xbe\x96\x61\x0c\xb3\x2e\xd4\xa1\x61\x5f\x7f\xe7\x97\x51\x4e\xc4\xf7\x4b\xa2\x91\x1f\x9c\x5f\x86\x40\xba\x66\x8c\xe7\x56\xd1\x7e\xd2\x54\x72\x52\x34\x0f\x92\xb0\x95\x0e\x30\x7c\xcd\xa4\x9e\xfd\xc5\xb1\xc9\xeb\xe7\x73\x6f\x8e\xad\x45\x72\x0c\x7a\x70\x75\xbc\x39\xe2\x95\xdb\x79\x75\xbc\x59\xda\x2b\x07\xe7\x73\xf4\x30\x5c\x38\x4d\xc1\x54\x6f\xf4\xfe\x4b\xda\xce\xba\x24\x3a\x5b\x0e\xd5\x9a\xff\x03\xf0\xbd\xb9\x12\x3d\xe3\x29\x17\x68\x3a\x04\xd5\x0b\x35\x43\xfd\xbc\x05\x4f\x08\xd0\x68\x70\x9f\xce\xe7\x9b\x27\xd7\x7b\x55\xef\x7a\xfc\x07\x15\x23\x75\xa6\x78\xaf\xa6\x7e\x25\xf2\x29\x9c\x91\x6c\xe9\xcd\xd3\x2c\x5e\xde\xb3\x8f\x2a\x91\xdb\xc1\x2f\x89\x77\xe8\xc3\x58\x5e\x6e\xac\x86\xbd\x2b\xe6\x12\x9a\x32\x65\x45\xb7\xd1\x0c\x19\xe1\x66\x6d\x25\x9d\x53\x29\x43\x8e\xbe\x80\xd9\x1a\xf1\x3a\x2c\xa3\x81\x97\x20\x40\x27\x54\x52\x68\x91\x09\xef\x7c\xfe\xcd\x7c\x57\x64\x86\xcb\x1d\xe2\xb4\xef\xe2\x38\xdf\xbe\xbd\x3c\x86\xeb\x37\x97\xc7\x20\x24\x5c\xbd\x09\x41\x15\xf4\xfd\x15\x2f\xae\xdf\x5c\xbe\x78\xb2\x45\x87\xc6\x09\xfc\xda\xa3\x42\x88\xa4\x24\x67\x29\x43\x79\x37\xa5\x0c\xe5\xfd\x28\x65\x28\x0f\x29\x65\x28\x07\xf0\x4c\x19\xca\x29\x43\xd9\x52\xca\x50\x4e\x19\xca\x9e\x94\x32\x94\x1f\x1e\x5c\xca\x50\xfe\x6c\x31\x57\x29\x43\xf9\x61\x4a\xe8\xa3\x94\xa1\x9c\x32\x94\xb7\x28\x65\x28\x3f\xb5\x69\x91\x32\x94\x53\x86\x72\x43\x29\x43\x79\x04\xa5\x0c\xe5\x71\x94\x32\x94\x1f\xa4\x67\x86\x59\x4e\x19\xca\x09\xb3\xbc\x2f\x9f\xe7\x87\x59\x86\x94\xa1\xec\x47\x29\x43\x79\x3c\xa5\x0c\xe5\x71\x94\x32\x94\xc7\xf3\x4c\x19\xca\x1d\xa5\x0c\xe5\x94\xa1\xfc\x99\x1e\xdd\x94\xa1\x9c\x32\x94\x77\x53\x8a\x11\xa4\x0c\xe5\x71\x94\x32\x94\xfd\x99\xa6\xd7\xbe\x3f\x9f\xe7\xf7\xda\x4f\x19\xca\x29\x43\xf9\x41\x0a\x31\xdd\x24\x55\xa2\x96\x99\x8f\x8a\x1c\x9c\xab\x8f\x0d\x9f\xc7\x04\x26\xc3\x59\x8c\x04\x68\x85\xf8\x34\x55\x99\x81\xca\x6e\xd8\x85\xa4\x24\xf7\x89\x58\x9a\x89\x66\x18\x3a\xed\x54\xe8\x67\x85\xa1\x2e\x58\xc9\x7c\xb2\x93\x61\x4b\xb8\xbc\x43\x4e\x5d\xa0\x34\x00\xe7\x52\x92\x4f\xf8\x32\x22\xa5\xa8\xb9\x36\xf2\x2a\x13\x65\xe5\x8f\xa4\xed\xef\x34\x1e\xcc\xbe\x2c\x08\xc0\x0a\x3c\x24\x41\x32\xc1\xe7\x6c\x51\x4b\x62\x96\xe8\xa4\x24\x9c\x2c\xe8\xc4\x4d\x65\xd2\x0e\x6a\xd2\x9e\xce\x93\x27\xb2\xd2\x49\xde\xe0\x4b\x2f\x83\xcd\xe6\x8a\x68\x4d\x25\x7f\x0d\xff\x79\xf8\xd7\x2f\x7e\x9e\x1c\x7d\x79\x78\xf8\xc3\xcb\xc9\xbf\xff\xf8\xc5\xe1\x5f\xa7\xf8\x8f\x7f\x3d\xfa\xf2\xe8\xe7\xe6\x8b\x2f\x8e\x8e\x0e\x0f\x7f\xf8\xe6\xfd\xd7\xd7\x97\x67\x3f\xb2\xa3\x9f\x7f\xe0\x75\x79\x63\xbf\xfa\xf9\xf0\x07\x7a\xf6\xe3\x9e\x4c\x8e\x8e\xbe\xfc\x8d\xf7\x2b\x31\xc0\x0e\x89\x63\x85\x44\xb1\x41\x1e\xc1\x02\x71\x30\x93\x28\xe2\xe1\xa3\xe3\x15\x47\x40\x38\xd7\x49\x7c\x01\xd1\x3c\x58\x31\xd9\xb3\x19\xb3\xbf\x37\x52\x94\x4c\x1b\xed\x60\xd4\x1a\xe9\x41\xf8\x7d\x39\xea\x41\xcb\x54\x27\x72\xd9\x3c\x04\x0b\xcd\x54\x1f\x60\xdd\x4b\x6a\x14\x7a\x49\xe5\x2d\xf3\x0e\x0c\x99\x97\x12\xef\xdc\x1a\x28\x04\x27\x39\x9d\x33\xee\xed\x29\x41\x6b\x6e\xb4\x21\x97\xc4\x70\x12\xc3\x63\xb8\x3c\x27\x31\xac\x68\x56\x4b\xa6\xd7\x6f\x04\xd7\xf4\x93\x87\x67\x64\x18\xef\x1d\x72\x73\x19\x2b\x9e\x76\xef\xad\x93\x6b\x9f\x7d\x1e\x21\x4e\xe6\x52\xb2\x15\x2b\xe8\x82\x9e\xa9\x8c\x14\x28\x2a\x62\xa8\xbd\xd3\x3b\x78\xfb\xc7\x4c\xb4\x14\x85\x82\xdb\x25\x35\xe2\x19\x88\x99\x3b\xba\xa3\x32\xe2\xcb\x74\x41\x18\x87\xd2\xc8\xd4\xaa\x19\xa8\x32\x1a\x85\x03\xf3\xd6\x7d\xe6\x85\xc5\x75\x33\x38\x57\x16\x65\x26\x44\xe1\xd2\xce\xbc\x71\xc8\xed\x0a\x30\xeb\x94\xe3\xe2\x27\x4e\x6f\x7f\x32\x23\xf7\x1d\xeb\xbc\x20\x0b\xb8\x65\x45\x81\xb9\x9a\x54\x6f\x35\xb3\xf6\x5d\x83\x66\xf2\x91\x0f\x01\xe6\x19\xd5\x14\x48\x71\x4b\xd6\x78\x14\xe2\x8c\x97\xa9\xd7\xf0\xea\x08\xf3\xd7\x88\x82\x76\xbc\x39\xfc\xd6\x37\x6c\xbc\x24\x0a\xde\x9c\x5e\xfe\x74\xf5\x97\xab\x9f\x4e\xdf\xbe\x3f\xbf\x08\xd1\xac\xe6\xf4\x50\xaf\x43\x9e\x91\x8a\xcc\x58\xc1\xfc\x15\xea\x16\x16\xb1\xcf\x32\xc0\x3e\xca\xf3\x93\x5c\x8a\xca\xee\xa1\xac\x39\x67\x7c\x11\x24\x46\x2d\xbd\x1d\xf6\xd5\x6f\x8c\x46\x73\xb8\x7d\x1d\x74\xf3\xc1\x94\x61\x21\x09\x37\x86\xed\x6c\x1d\x90\x39\xda\xc1\x55\x64\xcd\x35\x2b\x3f\xdf\x84\x64\x92\xc7\x4a\x46\x3e\xcd\x73\x9a\xc7\x38\x5e\xcf\x11\x8c\xff\xa6\x99\x56\x48\x16\x0a\x74\xb5\xde\xe0\xf2\xc3\xd5\xf9\xff\x8e\xb3\x5a\xe0\x56\x2c\x24\xa8\x13\xa1\xd2\x84\x14\x55\xa4\x93\xf4\x91\x96\x62\x95\xce\xd2\x03\xf4\x0b\x3d\x4b\xad\x25\x17\x03\x47\xf4\xb1\xe6\x3d\x59\xed\x9d\xd4\xdf\x8d\x09\x4a\x91\xd3\x29\x5c\x5a\x03\x89\xaa\x28\x3c\xfb\x95\x42\x25\x05\xc3\x98\x6b\x46\x0a\x6f\x53\x93\xfe\xad\x66\x2b\x52\x50\x9b\xf4\x86\x65\x0d\xfa\x55\xcf\x22\xe8\xe6\x39\x29\x54\x90\xd2\xf3\xb7\x89\x8c\x71\xfa\x5e\xd4\x3c\x06\x66\xa7\xe5\x05\x39\xe5\x42\x07\xb9\xf6\xcc\xbc\xb0\x4c\x9d\x14\x19\x58\xf7\x5e\x10\x3c\xb9\xc1\xab\xf5\x43\x49\xd7\x9d\x49\xe4\x6f\x82\xbb\x7d\xbc\x6c\xe7\x6e\xe3\xa1\xb5\x0a\x9a\xfe\x96\x49\x14\x0a\xef\x30\xf3\x97\x94\xe4\x58\xdd\xa6\x22\x7a\x69\xb1\x6b\x25\x51\x37\xde\x6e\x38\x64\xe3\xde\x74\xce\x61\x6a\x8b\xd2\xb4\x8b\x71\xed\x2f\xfc\xe6\x94\xe8\x5a\x52\xfb\x2a\xb3\x09\x72\x94\x93\x59\xe1\x8b\x36\x0e\x14\xa4\x66\xed\x3e\xf0\x62\xfd\x51\x08\xfd\x55\x5b\x81\x24\xc2\xa5\xf9\xde\xbd\xe0\xb1\xfe\x5f\xe8\xd3\x6d\x89\xe5\x9c\xcd\x58\x27\xb8\xd1\x28\xac\xc2\x0b\xa6\xb8\x33\x6e\x8e\xfb\x13\x8a\x2a\x59\xf3\x53\xf5\xb5\x14\xb5\xa7\x65\xb4\xf5\x78\xfb\xfa\xfc\x2d\x4a\xf4\x9a\x07\x3c\x5e\x28\xd7\x72\x5d\x09\x66\xe3\x0f\x51\xfd\x05\xdf\x1a\x95\xb8\x71\xff\x7d\x05\xd5\x1c\x6a\xae\xa8\x9e\xc2\x7b\xb2\x06\x52\x28\xd1\x38\x39\xbc\x55\xee\x25\xa2\xd4\xfb\x7e\xc4\x29\x60\x3d\x44\xef\xc7\x25\xe3\x30\x13\x7a\xb9\xe5\x9e\xf4\x2f\x80\xb8\x3d\x46\xac\x9a\x14\x04\x2e\xef\x6a\xa7\x33\xbe\x39\x54\x5f\x89\x4f\x6e\xa8\x82\x4a\xd2\x8c\xe6\x94\x67\x41\xf7\x2b\x12\x8a\xe4\x8f\xbf\xf7\xbd\xa1\x17\x82\x1b\x21\x19\xe1\x8e\x9e\xf3\x9c\x65\x44\x5b\x2f\xa4\x8e\xe2\x60\x40\xfc\x9a\xf3\x6c\x11\x2c\xa8\x63\x44\xa4\x27\xdb\x5a\x51\x89\x01\x42\x2d\x6b\x6a\x0f\xd6\x37\xf5\x8c\x16\x54\xa3\x1b\xd1\x3f\xb8\xc5\x72\xa2\x6d\xb5\x2f\x56\x92\x05\x05\xa2\x1b\x31\xe0\xef\x63\xa2\x5c\x19\x75\x8a\x2b\xc9\x34\xe4\x82\xb6\x65\xaa\x7c\x9d\x1d\x0a\xbe\x3d\x7f\x0b\x2f\xe1\xd0\xac\xe1\x11\xda\x13\x73\xc2\x0a\xff\x7a\x15\x88\xa4\xdf\xb0\x7f\xd8\xbc\x19\xae\xaf\xf6\x3a\x77\xb2\x0f\x84\xb4\xea\xeb\x18\xb8\x00\x55\x67\xcb\x66\xad\xfd\x7d\xb0\x8d\xbb\xd8\x65\xc5\x20\xa4\xc4\x09\x58\x4f\x8e\xad\x58\xbe\x4b\xc0\xfa\xae\xad\x65\xba\x4b\xc0\x7a\x87\xea\xf2\xbb\x04\x6c\x10\x4a\xef\x99\x0b\xd8\x40\x03\xe6\x5b\x45\x65\x24\xfb\xe5\xdb\x67\x6e\xbf\xf4\x9f\xb8\x46\x56\x76\x3b\xeb\x6f\x20\x58\x81\x58\x52\x4d\x72\xa2\x89\xb3\x6b\x42\xeb\x6a\x6e\xdb\x44\xe9\xf2\x3d\xcf\xcb\xf7\x94\xd6\x8d\xa2\xef\x18\xaf\x3f\xd9\x24\x8e\x58\x01\xa4\xab\x33\x64\x8a\x97\x2e\x60\x89\xf1\xe8\x92\xaa\x2a\x58\x87\x41\x0d\x6a\x58\x02\xad\xe2\xec\x97\x37\x0f\x17\x0e\xcd\x73\x06\x15\x67\x03\x9b\x35\x6f\x56\xc2\x73\xe1\x8b\xee\xde\x58\x44\x0b\x47\x20\xd9\xb2\x9f\x5a\x61\x2e\xb9\xef\x5d\x4b\xa2\xe1\x33\x10\x0d\x4f\x1a\xf8\x2b\xe8\x8a\x7a\x57\x63\xdf\x10\x0b\xef\x0c\x2f\x60\xaa\x39\xd6\x01\xd1\x03\x1c\x16\x14\x64\x46\x0b\x6b\xf9\x5b\x11\x11\x21\x47\x2c\x58\xb8\x44\x09\x93\x49\x51\xc4\xaa\x81\xf1\x51\x14\x98\x20\x42\x22\x2c\xbb\x19\xd6\x2f\x78\xd5\x91\x45\x9c\x55\xbf\x5e\x57\xd1\x56\x1d\x43\x06\xbf\xdc\x55\xaf\xbd\x1f\x0e\xb0\xb9\xea\xe6\x0d\x12\x6b\xd5\xd1\xb0\xff\x65\xae\xba\xa2\x59\x26\xca\xea\x52\x8a\x39\xf3\x95\x33\x5b\x06\x9f\x63\x0a\xa2\x0a\x29\xdb\x6d\x5f\x54\x16\x76\xd3\x8f\x1b\x04\xf4\x60\xda\x18\x18\x06\x4f\x2b\x29\x56\x2c\xf7\x7e\xaf\x11\x6d\xed\x9a\x26\xa9\xf8\x7f\x04\x9b\x8f\xa8\xd0\x36\x2c\xd1\xc0\xa5\x14\x2b\x2a\x65\x53\x5d\xdf\x8c\xd2\xb1\xfb\x4c\xcb\xe9\x7a\xe3\x0d\x22\x18\x41\x22\x23\x05\xb6\x2b\x0b\xb9\x31\xb0\x79\x6b\x36\xd9\x06\x88\x16\xd6\x7a\x94\x11\x30\x6b\xb8\x41\x58\x2a\x82\xe5\x0a\x04\xa3\x6c\x0d\x2e\x80\x8b\x9c\xba\xbe\x1f\x01\x6c\x5d\x49\x50\x1b\xa7\x6e\x46\x1b\x9e\x1a\x6e\xac\x6d\x97\x09\x41\x73\x37\xe2\x00\x8e\x38\x57\x2d\x5c\xcf\x80\xf7\xc1\x6d\xdb\xec\xe6\x53\x9e\x33\xbe\xc0\x08\xf3\x31\x48\x5a\x90\x80\xa2\x35\xd0\xe9\x94\x1b\xeb\x9e\x3f\x40\x89\xe9\x96\x20\x80\x6b\x23\x32\x9b\xcd\xc1\xd7\x2c\x13\x3c\x24\xcd\x1e\x57\x10\x83\xb7\xcd\x8b\x73\x1e\x8a\x21\x62\x0a\x5e\xbc\x6b\x2e\x91\x77\xff\xa4\xe7\x66\x3a\xbe\x40\x7b\xaf\xbd\xd1\x01\xeb\x63\x11\x1b\x37\x8c\xe7\x2e\x27\xbe\xbf\xa9\x21\x7c\x5d\x70\xc0\xf9\x65\xa6\xf0\x1d\xb6\x24\x0c\x53\x57\x86\x88\xa4\xaf\xe1\xaf\x1c\xda\x4d\x85\x49\x27\xd0\x82\x6e\x1e\x8a\xc2\x2d\x81\x16\x2a\x1e\xba\x16\x48\x56\xa0\x7d\xb4\x4e\xa0\xb0\xba\x61\x60\xd5\xdd\x2e\xb0\x4c\xd8\x12\x20\xd4\xa1\xb9\xd2\xed\xd0\xc3\x4c\xe4\x7c\x0a\xdf\x72\x94\x39\x66\x7d\x27\xc0\x45\x84\xed\xea\x96\xb5\x39\x61\x2f\x9e\xea\x6e\xdf\x32\x9e\x8b\x5b\x15\xd7\x37\xfa\xbd\x65\xda\x38\x9e\x7c\xab\x20\x29\xaa\x35\xe3\x0b\xd5\xf7\x8f\x92\x22\x2c\x4d\xc9\xd2\x2e\x07\x69\xd8\xed\x9e\x4b\x61\x4b\xeb\x6d\x3b\xf0\x02\x23\x94\xf6\x10\x5a\x7c\x46\xe3\x70\xf4\x75\xb7\x6e\xe3\x33\x76\x39\x1c\x03\xe0\x6f\xc9\xe1\xf8\x10\x2d\x4a\x45\xde\x48\x33\x09\xcd\x48\x71\x55\xf9\xb6\xc0\x83\xcd\x8b\xf7\xf5\xfb\xab\xd3\x21\xe3\x30\xcb\xe3\x76\x49\xa5\x7d\x5b\x19\xce\x40\xf2\x92\x29\xe5\x1f\x70\x37\x74\x4b\x67\x4b\x21\x6e\xe0\xb0\xc9\xfa\x5d\x30\xbd\xac\x67\xd3\x4c\x94\xbd\x04\xe0\x89\x62\x0b\x75\xe2\x04\xd3\xc4\xac\x97\x6f\xfa\x12\xce\x84\x17\x8c\x3b\x78\x23\x86\x19\xb8\x56\x20\xfc\xfb\x1d\x43\xb7\x24\x59\xbb\xda\x78\xe2\x43\x94\x2d\x76\x66\xb5\xb9\x38\x3b\x36\xf2\x22\xac\xfc\x15\x16\x4c\x7f\x52\xeb\x71\xfb\xd0\x5f\x04\xd5\xe3\x7f\xe0\xe0\x07\xae\x97\xed\x23\x68\x6b\xb5\xb9\xd0\xba\xf9\x8c\x00\x8e\x1b\x27\xc5\x79\x81\x9e\xd6\x03\xdf\x60\x1a\x22\xee\x04\x62\x1b\x1c\xcb\xb0\x67\x79\x63\x41\x74\x28\x89\x1e\xde\x21\x80\xf5\x26\x52\xa2\xc5\x3c\x04\xf0\xdc\x4c\xd6\x8b\x82\x98\x80\x47\x44\x4d\xc0\xde\xc8\x89\x80\x0f\x18\x1a\x2c\x91\xac\x00\xb8\x3b\x4a\x1a\x28\xd0\x1f\xcd\x70\x81\x68\xc6\xcb\xff\xcf\xde\xdb\x78\xc7\x71\x1b\x7b\xa2\xff\x0a\x0e\x93\x7d\x24\x13\xce\x50\xb2\x73\x73\x13\x6d\x5e\x7c\x18\x89\x72\xf8\x2c\x51\x7c\xa2\x2c\xbf\x3c\xcb\x37\xc1\x74\x63\x66\x70\xd9\x0d\x74\x00\xf4\x90\x93\xf5\xfe\xef\x7b\x50\x05\xf4\xc7\xcc\xc8\x72\x17\x5a\x22\xe5\x0c\xf6\x9c\xb5\xa5\x5c\xd7\xa0\xf1\x51\x5f\xf8\xd5\xaf\x58\xda\xc5\x0f\x6c\xb7\xfb\x36\xc6\xdb\x63\xdf\xc6\xf8\xe7\x8d\x7d\x1b\xe3\xfe\xd8\xb7\x31\x4e\x09\x06\xf6\x6d\x8c\xf7\x6d\x8c\x61\xec\xdb\x18\xef\xdb\x18\x13\xc7\xbe\x8d\xf1\x87\x27\xb7\x6f\x63\xfc\xd9\x36\x66\xd8\xb7\x31\xfe\xf0\xd8\xb7\x28\xd8\xb7\x31\xde\xb7\x31\xde\x1a\xfb\x36\xc6\xf7\xed\x5a\xec\xdb\x18\xef\xdb\x18\xc7\xb1\x6f\x63\x3c\x60\xec\xdb\x18\x0f\x1b\xfb\x36\xc6\x1f\x1c\x0f\xac\xb1\xd1\xbe\x8d\xf1\xbe\xb1\xd1\xcf\x95\xf3\xf0\x1a\x1b\xb1\x7d\x1b\x63\xda\xd8\xb7\x31\x1e\x3e\xf6\x6d\x8c\x87\x8d\x7d\x1b\xe3\xe1\x32\xf7\x6d\x8c\xdb\xb1\x6f\x63\xbc\x6f\x63\xfc\x99\x1e\xdd\x7d\x1b\xe3\x7d\x1b\xe3\xdd\x63\xff\x46\xb0\x6f\x63\x3c\x6c\xec\xdb\x18\xd3\x85\xee\xa3\x7d\xba\x9c\x87\x17\xed\xef\xdb\x18\xef\xdb\x18\x7f\x70\xa4\xb8\x6e\xd6\xe5\x92\xd0\xab\xeb\xe3\x90\x71\x07\xb4\x6c\x87\xe0\x6c\x56\xcf\xe7\xc2\x80\xdb\x0d\x33\x25\x25\x6e\x76\x97\xbb\x22\x07\xed\x52\x52\x8e\x6b\x40\xf9\x59\xe1\x4e\x80\x37\xdc\x62\x09\x22\x4c\x91\x06\x78\xec\x4f\x31\xf0\xbc\x41\x87\x2a\x23\x2c\x2d\xbe\x96\x8a\x9d\xbf\x7a\x3e\x1d\x81\x87\x3c\x85\xc2\x13\xd6\xe4\x95\xca\x52\x61\xef\xed\x21\x4b\xa3\xd3\x8b\x54\x7a\xe1\xac\x65\x85\xb6\x88\xad\xc5\xcd\xcb\x96\x5c\x29\x41\x61\x21\x46\x85\x28\x1d\xa4\xdd\x66\x42\x28\xa6\x2b\xa1\xb0\xb2\x8c\x33\x2b\xd5\x82\x54\xb6\xcc\x9d\xe3\xd9\x72\xea\xbf\x5f\xc5\x03\x16\x5a\x98\x35\xb3\xa6\x5c\x35\x67\x04\x2f\xf1\xa0\x19\x51\x72\x89\xd3\x65\x3c\x33\xda\x5a\x56\xd6\x85\x93\x55\xc2\x84\x99\x15\x50\xb0\x68\xb1\x7a\x36\x1e\x02\x46\xba\x6e\x56\x20\xd8\x13\x08\xa3\x9b\x35\x08\xcb\x4b\x72\xc1\xda\xab\x06\x01\xfc\x09\x34\x72\x2d\x2b\xb7\x66\xfe\x78\x50\xb6\x1f\x70\xff\xd2\x58\xc7\xb2\x42\x42\x04\x07\xeb\x20\xc0\x92\xc1\x9c\x29\x08\x60\xae\x72\x2f\x59\x85\x3d\xb2\x61\x93\x54\x0e\x0e\x68\x45\x72\xf8\xa1\x98\x09\x3e\x13\x2f\x13\x4e\x37\x97\x36\x04\x14\x96\x34\xd1\xd8\xc2\x03\x2f\x57\xdc\x23\xb8\x5e\x39\x91\x8b\x3e\x7e\x73\x10\xd2\x99\x72\xc2\xfd\x87\xae\x1b\x21\x2b\xde\x98\x00\xec\x97\x11\x15\x24\xe9\xfb\xb7\xcb\xda\x22\x03\x3b\x18\x08\x82\xc8\x8e\x49\x81\x6b\xaa\xc4\xca\x5b\x2f\x91\x09\xb9\xf2\x4e\x38\x41\xe4\x4e\x7b\xf0\x49\xcd\x81\xe3\x66\x21\xdc\xd3\xb8\x56\xb4\xfa\xc7\x3e\xdf\xfd\x1c\xed\xf0\x46\xd5\x68\x92\x52\x80\xa5\xbf\xd2\xf9\x35\xd4\x8b\x22\x8d\x3e\x49\x73\xed\xa8\xaf\x0a\x4b\x80\x9d\x74\x46\x12\x19\xe9\x0a\x68\xb4\xf4\xc1\x43\xf2\x8b\x67\x2b\x9e\x09\xcb\x8e\x2e\xae\x9e\x9e\xb0\xab\x8b\x67\x58\x19\x40\x90\xa9\xe7\x3b\x38\xd6\xa2\xd3\x04\x2a\x8d\xa8\x63\x77\x7d\xbe\xb4\xa1\xe0\x82\x20\xf3\x76\xc9\x1d\x5c\xac\xce\xe7\x73\xe3\xfd\x03\x6e\xb0\x47\x2f\x71\xa2\x95\xce\xa7\xec\x52\x3b\xd1\xf4\x61\x18\xc5\x6f\x81\x20\x3c\x64\x1b\x83\xee\xc2\x9e\x3f\x54\xb7\x8e\x14\xf4\x3a\x61\x4a\xa9\x80\xb6\xe9\xa5\xb0\x96\x2f\xc4\x15\x09\xc4\xf2\xbe\x14\x19\xe0\x58\xa2\x4d\x21\x5b\xe3\x02\x39\xb6\x9a\x18\xb5\xad\x24\x3a\xa4\x5c\xe6\xce\x47\xb3\x12\xbf\xba\xb9\x79\xb7\x46\x3a\x47\x3a\xd4\xd2\x62\xa7\x2e\xc0\xff\x6d\xb2\x38\xd2\x26\xda\xa9\x92\x62\x2f\xe3\x44\x71\x82\xfe\xe7\x7c\xac\xa9\x68\xfc\x84\x08\x56\x9c\x19\x29\xe6\x6c\x2e\xa1\x18\x09\xca\x66\x4e\xb0\x33\x04\xa7\xcc\x96\x2b\xc6\xad\x15\x06\xd6\x35\x94\x4d\xc4\xf5\x9d\xb2\xef\x68\x3d\x41\x66\xc2\xbb\x8b\x2a\xe3\x6d\x9f\x55\x64\x55\x92\x73\xb6\x80\x02\x1d\xda\xbd\xe6\x8a\xfd\xee\xd1\x1f\x7f\xcf\x66\x6b\x27\x42\x33\x34\xa7\x1d\x2f\xe2\x84\x09\x42\x0b\xa1\x16\xfe\xb4\xa3\xe7\xdd\xe7\xd8\xa1\xb6\x44\x99\x09\x56\xc8\x52\x3a\xe4\xed\x79\xfc\xc5\xcd\xac\x97\x5a\x21\x48\x3c\xcd\xc5\xea\xb4\x73\x03\x26\x85\x5e\x4c\xd9\x53\xae\xbc\x4e\x27\xbd\xff\xd5\x55\x0e\xf8\x81\xe1\x69\x93\x71\x15\x97\x2e\x64\xb6\x4e\x75\x42\x02\xa1\x1a\x5b\xea\x5b\xec\xc4\xd7\xfe\x0e\x61\x69\xa2\x76\x69\xcb\x87\x2b\x5d\xd5\x05\x2c\x17\x7b\x4e\xe3\xbf\x02\x4d\x55\x5b\xb1\x49\xc6\xf2\x1e\x5d\x4e\x53\x0e\x71\x9a\x1b\xf9\x0c\x54\x12\x09\x0b\xa1\x03\x93\x41\x78\x24\x6e\xba\xe6\x90\xec\x1e\x63\xcf\x79\x51\xcc\x78\x76\xf3\x46\xbf\xd0\x0b\xfb\x4a\x9d\x1b\xa3\x4d\x6f\x85\x28\xf7\x98\xfb\xe0\x6f\x59\xab\x1b\x68\xf8\xdc\x7c\x7c\xa1\x17\x4c\xd7\xae\xaa\x49\x49\x9c\xf9\xe6\x71\x6a\xd6\x84\xc8\x83\xd6\x44\xba\x21\xb6\xec\xcc\x54\xdc\x49\xda\x0b\xe6\xad\xf4\x0a\x4c\x31\xe1\xd7\x11\xb5\x62\xfb\xd5\xb4\x98\xbf\xa3\xbe\xbe\x78\xf4\xbb\x3f\xa0\xc2\x65\xda\xb0\x3f\x3c\x82\xda\x6a\x52\x94\x0a\xae\x00\x78\x7b\xd2\x32\x5b\xf2\xa2\xf0\x8e\x69\x9a\x62\xf4\xd7\xb1\xa3\x08\x1b\xb5\xf6\x49\xb5\x9a\x4b\x55\x60\x1f\x31\x87\xfb\xe6\xcd\xdf\x20\x81\x2b\x9d\x15\xc5\x9c\x14\x5c\x17\x56\xb7\xbd\x32\x0f\x21\x26\x3e\x0c\xbe\x88\x33\x35\x49\x05\xdc\x6f\x56\x74\xa5\x8b\xba\x14\xcf\xc4\x4a\x66\x94\xd7\xe9\xde\xd6\xf5\x64\xd1\x09\x0c\x0a\x69\xa1\x99\xd1\xac\xd0\xd9\x0d\xcb\x83\xb8\xb6\x3a\x85\xe2\x85\xac\x53\x39\xc9\x53\x6a\x89\xc8\x35\x44\xef\x5d\xdd\xb6\x02\x88\xf4\x4e\xc3\x59\xc9\xab\x4a\xaa\x85\x5f\x66\xce\x0c\xbf\xed\x2d\x36\x49\xa6\xd7\xbc\x40\x3c\x9a\x44\xfc\x9e\x88\xf1\x48\x41\x78\x4c\xc2\xd7\x13\x7d\x0e\x72\x79\x51\x2a\x38\xa4\x9d\x35\xf5\xfd\xba\x77\xcc\x5a\x71\xa9\x14\x24\x15\xc8\x40\xee\x89\x91\x7a\x93\xb1\x36\x85\x81\xf3\x6c\xc2\x5e\x7f\xa0\x13\x68\xb6\x9c\xa6\x62\x07\x92\x1f\xec\x53\x8a\xb9\x7a\x3b\xa7\x1a\x68\x44\xc9\x1d\x29\x59\x81\xa3\x9b\xbf\xe4\xac\x12\xc6\x4a\xeb\x7d\xf4\xb7\xa0\x80\x9e\x16\x5c\x52\xdf\xbf\x9b\x0c\x5f\xa5\xa9\x5b\x95\xb0\xdc\xa8\x40\xa1\xb1\x75\xaa\xa5\xbb\xd2\x79\x10\x07\x86\x09\xd2\x26\xa4\x7c\xe7\x56\x9a\x25\x95\x59\x66\x34\xf7\xef\x3e\x4d\xdd\xdb\x76\xa7\xd2\x2d\x9d\x97\xd2\x98\x3a\x94\x1c\x8c\x15\x51\xe2\xe7\x6b\xe0\x60\x2d\x3e\x37\xfb\xd6\x4c\x7a\x14\x25\x09\x86\x2d\xf8\x2a\x29\xc6\xad\x8d\x55\xdb\x07\xc7\xa5\x08\x4a\x81\x2c\xb5\x4d\xb3\x84\x4c\xec\x34\x60\xbe\x15\xb9\xcb\x71\x33\x55\x76\xf8\xe4\xf0\xde\x8c\x1c\x6e\xa2\xd1\x15\x5f\x40\xee\x60\x94\xbd\xdc\x14\x4a\x5e\xa1\x5c\x60\x5a\x43\x58\x48\x9b\x81\x5c\x78\x7c\xa1\xfb\x3e\x61\x56\x22\x6f\x39\xc1\x81\xe9\x3f\x81\x45\xa3\x73\xe4\x42\xc2\x44\x43\xa4\x7c\x9b\x40\x6f\xc0\x8d\xae\x55\x1e\x40\x1d\x0d\x92\xe8\xe5\xc6\xc2\x5e\xd2\x89\x08\x21\xcd\x13\xfb\xa0\xf8\x10\x17\xea\x9d\xa5\x65\x33\xe1\xe8\x5d\x46\xa4\x62\x8f\xa7\x8f\x1f\x7d\xfe\x3e\x1b\xac\xc9\x48\x3e\xdb\x65\xe3\xb3\xa1\x95\xbb\xb7\xd5\x31\x82\xe7\xaf\x54\x41\xc8\x04\xe1\xe8\x97\x0d\x85\x27\x29\x2f\x74\xa2\x55\x02\x65\x8c\x8c\x9d\xde\x41\xd4\xad\x91\x2e\xdc\xa0\x5b\x99\x50\x6f\x7a\x04\x49\x1b\xa6\x4d\x97\x93\xf7\xb8\xcd\xe5\x25\x84\x24\xd4\x7c\x50\xf8\xef\x13\xdb\x5d\x33\x66\xeb\xd9\x83\xb3\xbb\x68\x60\x51\xa9\xee\x7a\x4f\xa5\xaf\x77\x90\xbc\x6d\x82\xc9\x12\xbb\x10\xe2\x83\x03\x76\x84\xbf\x70\x88\xa4\x94\xc7\xf7\x76\x3d\xc3\xb6\x9e\xdf\x55\xe4\x86\x84\xbd\xad\x3d\xbf\xab\xb8\xca\x45\x8e\x01\x7f\x82\x6b\xcd\x22\x0b\xf3\xae\x3d\x4e\x37\x9b\x87\xb6\xbf\xc7\x64\x89\x5d\xf7\xec\x2f\x62\xc9\x57\x02\xa8\x3b\x65\xc1\x4d\x82\x7a\x72\x9a\x5d\xe3\xce\xb0\x59\xed\x98\x50\x2b\x69\xb4\x2a\x45\x02\xd3\xf9\x8a\x1b\xc9\x67\x85\x60\x46\xcc\x85\x11\x2a\x13\x96\xfd\xfa\xe8\xed\xd9\x6b\xa8\x96\xa0\xf7\x53\xe0\x46\x30\x11\x77\xbd\xb6\x50\x65\x3f\xd2\x2d\xec\x7c\xf6\x74\xe3\x02\xd1\x55\xf4\xc6\xc5\x8b\xeb\xec\x6f\x00\x7d\x0d\x54\xde\xec\x97\x5f\x8f\xb2\x76\x35\x2f\x80\xbd\x35\x2b\x6a\x2b\x57\xf7\x61\x7f\x03\x9b\xee\x33\x49\xb8\xd9\x1b\x2c\xc4\xed\xa5\xd9\xa2\xe8\xa5\x7c\x58\xc4\x5c\x8d\xd7\x8e\x3c\xe0\x90\x0e\x6d\xd3\xf4\xa9\xdb\x2b\x87\xfc\x28\xc7\x4a\xb9\x58\x42\x02\xa5\xd3\x66\x8f\x6c\xb4\x3a\xd0\xb0\x12\x50\x24\xf7\xf5\x3c\xe7\x83\x8f\xb3\x42\x72\x3b\x2c\x0c\xdf\x62\x17\x0c\x32\xa0\xfd\xac\x0a\xdd\x92\xf8\x30\x60\x48\x7c\xdf\xf1\x53\xc2\x07\xf4\x8b\xab\x80\x50\x8d\x3b\x28\xd5\x7f\x8b\x6c\xe8\x0b\x70\x93\x4d\xab\x74\x7e\x68\x83\x78\xc0\x5e\xc9\x39\x95\xf5\x1c\xfc\x73\x69\x91\x8e\x7d\x05\xfd\xdf\xe6\xda\x00\x07\xae\x97\x7f\x29\x9c\xbf\x1d\x83\x44\x56\x3a\x1f\xc4\x69\x47\x4b\xc7\x11\x12\x71\xbb\xf7\x9a\x2d\x75\x91\x23\xcb\x7b\x78\x34\x1a\x78\x60\x67\xc2\xdd\x0a\xa1\xd8\xc5\x15\xec\xb5\x5f\x36\x40\x38\xf6\x76\x7c\xa0\xcc\x78\x3e\x18\x87\x63\x08\x4d\x41\x3a\xb9\xe5\xb8\xfb\x03\xa5\xfa\xb3\x32\xec\x78\x90\xb3\x79\xf4\xa4\x58\xb3\x7e\x89\x1a\xfe\xaf\xcd\x3e\x44\x12\x05\x3e\xd3\x24\x4a\x06\xbf\xb1\x79\x6e\x48\xfd\x53\xee\x25\xd7\x9c\x60\x60\x65\x95\x8a\xcf\x6a\x16\x2b\xbe\x89\x2d\x69\x45\xd8\xa0\xd8\xe0\xe0\x7f\x42\x0b\x72\x71\xf5\x94\x6c\x3d\x0e\xbf\x0d\x90\x2f\x2f\xe8\xf0\xd0\x32\x59\x65\x2d\xd6\x79\xd8\x47\xb4\xf8\xdc\x88\x9e\x68\xa2\xe5\x21\x20\x3e\x5a\x88\xdc\x51\xfc\x49\xa6\x94\x29\x14\xe2\x7d\xab\xc0\xa1\x4a\xc0\x79\x03\x4e\x06\x20\xde\xbd\xf5\xb5\x51\x3a\x75\x89\x63\x41\x0a\x9a\x78\x80\x29\xc5\xe2\x86\x4a\x1b\x67\x87\x33\xde\x77\xdd\xb3\xa6\x84\xbb\xb5\xcb\x24\x02\x1f\x4a\x92\x84\xbe\xeb\x57\x17\xcf\xc6\x3b\xfe\x95\xcc\x3f\xdb\xe3\x3f\x34\xff\xd9\xe7\x79\xeb\xb5\x8e\x89\xe2\x28\xd5\x32\x57\x3a\x7f\x4f\x60\xd1\x3a\x01\x83\x5f\xad\xe2\x31\x0d\xb5\x7e\x9c\xe1\x63\xec\x24\x76\xd7\x85\x22\xee\xe1\xe7\x6d\xa0\xb6\x85\x70\xe1\xaa\x2e\x8a\x6b\x91\x19\x31\xec\xc1\xba\x7f\xee\x2e\x36\x24\x8d\xe1\xba\x77\xf2\x09\xc0\x05\x1d\x04\xa3\x03\x66\x87\xae\x78\x73\x0b\x02\xf7\x1f\x78\x24\x55\x5d\x14\xc0\x91\xa3\xd6\x94\xa3\x01\xeb\x87\x2f\x0f\x88\xfe\x92\x36\xd6\x51\x61\x21\x68\x73\x5e\x06\x6a\x5b\x61\x45\xf3\xc1\xf1\xa8\x54\xdc\x5a\x44\x88\x4a\x95\xcb\x95\xcc\xeb\x81\xeb\xea\x3f\x16\x62\xc4\xc0\xba\x03\xaf\x2e\x8d\x67\x56\x92\x3a\x05\x3e\xd7\x86\x89\x3b\xee\x45\x9e\x34\xb5\xe7\xdc\xc2\x45\xcb\x75\x76\x23\xcc\x09\x1b\x9c\x4f\x7f\x06\xff\xe1\x53\x88\x8c\xe1\x60\x37\x6b\xc1\x8d\xbf\xcb\x4a\x9b\xa1\x21\xd6\x40\x22\x84\xb6\x24\xe1\x14\xf7\xf8\x57\xb8\x95\x6b\xa9\x16\x13\xf8\x1b\xbf\x98\x61\x56\x13\xad\x26\x7c\xe2\x95\xc1\x83\x0f\xb8\xa0\x19\xf8\x2b\x88\x24\x5e\xc7\xdb\x15\xd3\x07\x43\x03\x19\xa1\x74\xbd\x58\xc2\xa2\x9a\x92\x87\xd6\x5c\xac\x10\x0e\x7a\xe0\x20\x1e\x76\xa0\x48\x24\x7a\x0f\xf3\xca\x43\xc8\xd3\xed\x08\x35\xf8\xd6\x33\xaa\xf5\xbb\x87\xa0\x8b\xf6\xde\xb7\xc1\x77\xd2\x69\x24\x1a\x56\x92\x44\xfb\x35\xf0\xbe\xe8\x95\x30\x2b\x29\x6e\x4f\x83\xab\x39\xb9\x95\x6e\x39\xc1\xd5\xb3\xa7\xb0\x05\xa7\xbf\x82\x7f\x10\xe6\x82\x64\x61\x67\x79\x1e\x9e\xa2\x6b\x2b\xe6\x75\x81\x8f\xbc\x76\xca\x78\x25\xdf\x0a\x63\xa5\x26\x95\x9c\xdf\x48\x95\x9f\xb0\x5a\xe6\x5f\x7d\xa2\xc2\x1c\xa9\x64\x5b\x10\x9c\x60\x71\x5f\x04\x2b\x19\x98\x5a\xe5\xbf\xf0\x0a\xb6\x9a\x6b\xd0\xe7\xcc\x44\xa1\xd5\xa2\xc3\x64\x0b\xce\xfe\x85\x92\x8e\x2a\x11\xd3\xf7\xd0\x0d\x0e\x52\x9b\xda\xe4\x50\x2c\x2e\xbd\xb9\xd1\xf4\x79\x42\x9f\xc1\x4e\x41\xbb\x37\xdd\xb2\x37\x4f\x28\x95\x19\x58\x30\x11\xb9\xc0\xb0\x1c\x20\x92\x34\x3a\xcd\x96\x7c\x25\x9a\xfe\x43\x03\xeb\xfa\xa5\x65\x4b\xae\x72\xf8\x4f\xb3\x4c\x9b\x3c\xac\xaf\x74\x4d\x55\x3e\x96\x63\x0d\x4d\x17\x06\xe8\xa4\xb7\xdc\x5c\x6d\x7e\x3d\x64\x0e\x4d\x39\xd0\x39\x68\xff\xfb\x18\x34\xd5\x4a\xfe\xb3\x16\x8c\x97\xda\x3b\x48\x09\xbd\xf0\x37\x4e\x11\x2b\xf9\x1a\xbc\x69\x58\xda\x17\x91\x5f\x68\xd8\xe1\xc2\x46\x70\x27\xec\xb5\xe0\xb9\xec\x90\xf5\x9e\xb0\x17\x7d\xf6\xde\x61\xc7\x40\x1b\x76\x8d\x14\x97\xe1\x3f\xc7\xea\x1e\x23\xac\xae\x4d\x26\x5e\x23\x30\xce\x3b\x4f\xc3\x8e\xad\x9e\xef\xd8\x28\x7f\x43\x1c\xbf\x11\x0a\x93\xca\xfe\x88\x0c\x45\x78\xe6\xb5\x81\xfb\x90\x2d\x45\x5e\x83\x27\x3b\x5b\xb3\xb9\xf7\x0f\xc3\x6b\xd9\x52\x2e\x96\x62\x60\xea\x27\xa4\x09\x4e\xa1\x26\x09\xfb\xa6\xf2\x6c\xd9\x2c\x02\xa8\xbd\x61\xcb\xda\xf0\x7a\xb4\xcf\x78\x25\xbf\xf3\xab\x02\xa6\x8a\x3b\x02\x05\x6e\xc8\x27\xda\xba\x8c\xf6\x0e\x4f\x7d\xf7\x98\xb2\x17\xfe\x13\x86\xeb\x2d\x5e\x55\x85\x8c\xbe\x76\xff\xf0\x42\xf5\x41\x78\x87\x1d\x24\x77\xce\xed\x52\x6a\xb5\xa5\x54\x59\x86\x8f\x35\x59\x6d\xbc\xb1\x1e\xe8\x2a\xcf\x04\xe3\x79\xee\x7d\x25\xc3\x8c\x28\xf5\xca\x6b\xc5\xc4\xe7\x9f\x34\xd2\x30\xbf\x60\x93\x8e\xff\xfc\xf0\x9d\xe2\xb3\x40\x57\x84\xdb\x9e\x6d\xd8\xd1\xc1\x2e\x2c\x47\x07\x38\x76\x8e\x32\xb5\x6a\xcb\x56\xbc\x55\xfd\x34\x6e\x28\x0d\xc3\x4b\xc0\xdf\xd2\xfd\x5d\x6e\x16\xa9\xef\x0b\x87\x67\x66\x51\x83\x3a\x8e\x7e\x4b\xdb\xba\x9d\xe2\xf6\x7a\x65\x8f\x61\x2b\xc6\xf6\x87\x87\x96\x3d\x7d\xf9\x2c\xc2\x0b\x09\x12\x65\xc8\x70\x06\x0e\xb5\xca\xe8\x95\x84\xf6\x83\x6f\x03\x6c\x82\xf2\x28\xbd\x13\x68\xd1\x03\x4c\x10\xa4\xee\x82\x58\x1c\xda\x1e\x56\x82\xf6\x24\xcf\x5b\x88\x48\xd6\x68\x26\x6f\x4d\x8a\x15\xed\x09\xbd\x17\x26\xc6\xac\x83\x54\x55\xed\xe8\x88\xa5\x26\x6f\xac\xb2\x25\x57\x0b\x84\x92\x8a\x44\x20\x8b\x5d\x2b\xc7\xef\xfc\x57\x7b\xd1\xc2\x66\xbc\x12\x79\x28\x1f\x66\xb9\xae\x69\xdb\xff\xeb\x5f\x9f\x30\x29\x9e\xb0\x5f\x77\x26\x37\x65\xe7\x41\x7a\x7b\x38\xa8\xab\x80\xcc\x4b\xb3\xf6\x30\x9d\x30\x23\x16\xdc\xe4\x05\xad\xc9\x8e\x9e\xb3\xdb\x0e\x9d\x5d\x73\x18\xc4\x9d\xb4\xce\x32\x12\xe5\x8c\xd2\x6e\x97\x9d\xeb\xd8\x2e\x82\xd0\x9f\xb0\x76\x8e\xdb\x1b\x6f\xdb\xbc\x1e\x9e\xe4\xdc\xf1\x49\xc7\x58\x9c\x62\xd6\x76\x12\x9a\x2c\x4f\x78\x50\x4a\xad\x19\x3c\xfd\x95\xa9\x95\xf2\x81\x31\x6f\xfe\xaf\xa4\x9a\xf0\x09\xb4\xe4\xa5\x46\x9e\x9f\xcf\x8b\x26\xb9\x7b\x79\x5f\xdb\x9f\x37\xca\x1d\xbf\x1d\x18\x87\x08\x5f\xd2\xc4\xa5\x8d\x61\x0e\xad\x91\x5b\xfd\x4f\x51\xf5\xd1\x62\x9c\x5f\xbe\x79\xfd\xb7\xab\x57\x17\x97\x6f\xa2\xe1\x88\x66\x80\x22\xf5\x7d\x86\x23\xed\xa6\xbf\xcf\x70\xb4\x66\x20\x05\x88\xb4\x69\x38\xfa\x66\x80\x22\x79\xdb\x70\xf4\xcd\x00\x65\x65\xb7\x0d\xc7\x0e\x33\x40\xf4\x22\xba\xeb\xbb\xd3\x0c\x90\xb4\x73\xc7\x70\xec\x36\x03\x04\xa9\xdb\x86\xa3\x6f\x06\x48\xf7\x6b\xdb\x70\x74\xcc\x00\xd1\xe4\x6f\x1b\x8e\xae\x19\x20\x08\xdd\x6d\x38\xf6\x66\xe0\xe7\xfc\x28\xc9\x0c\x08\xb5\x4a\x34\x01\x31\xeb\xd9\x51\x2e\xcd\xb9\x20\x91\x9c\xf5\x9a\xcc\x76\xe8\xfb\xc6\x38\x54\x9f\xc7\x7e\xf6\x61\xf6\x6a\xf5\x96\x1b\x66\x44\x65\x84\x85\xb8\x8a\x58\xd6\xb1\x6b\x83\x58\x10\x4a\xa3\x2e\x64\x8c\xb7\x88\xe1\xcf\xae\x2a\xf6\x9e\xea\x5a\x47\xab\x21\xeb\x3e\x2c\x8d\x59\x35\x30\x6d\xda\x0d\x71\xf6\xf4\xef\x17\xcf\xce\x2f\xdf\x5c\x3c\xbf\x38\x7f\x7d\x6f\x85\x2b\x49\x8d\x5c\xfb\xee\xea\x38\x9e\x1a\x8e\x9f\xf6\xd7\xc8\x62\xb1\x97\x81\x58\x49\x5d\x03\xc4\x1d\xc0\x27\x63\xee\xaf\xdd\xd2\xad\x64\x91\xc0\x03\xad\xd6\xd0\xa0\x55\x66\xe3\x1e\x43\x3b\xdd\x99\xa9\x20\xcb\x1d\xd5\x51\xc5\xf1\x13\xee\x2a\x59\xe6\xa8\xd9\x0e\x1c\xef\xcf\x79\xd0\x37\x7e\x6c\x97\x17\xc7\x4f\x3a\xbe\x29\x3b\xff\x1e\xf7\x97\x2c\xf2\x27\xb2\x27\x64\x99\xd1\x79\xee\x57\x3f\x91\x1b\x21\x8d\xa3\x76\x9f\x1b\x5d\x8e\xa2\x7a\xaf\xf1\xa5\x2a\x40\x9b\xc8\x8b\xb4\xcb\x89\x39\xb4\xc3\xc1\x79\xfd\xd1\x49\x5b\x85\xd4\x40\x6c\xd9\x42\x16\xe9\xe5\x01\xcd\x61\x9a\xd9\x4c\x6a\xa1\x3f\x46\xdf\x79\xac\x86\x7a\xc9\xab\x6f\xc4\xfa\xb5\x48\xe8\x95\xb4\x79\x1e\x44\x21\x32\xef\xcc\xb2\x1b\x41\x2f\x9e\x64\xe1\x25\x97\x3d\x8d\xd3\x4c\x69\x32\x35\xc2\x92\xb3\xe4\x7e\x73\x38\x26\x89\xcb\x32\xc6\xd6\xfb\x71\x23\xc8\xe5\xfc\x71\x6c\xb5\xd0\x4f\xdd\x70\x16\xa3\x44\x7f\x82\x52\xf6\x9b\x8d\xd3\x2d\x0e\x47\x8a\x5f\x1f\xc7\x4e\xe4\x58\xfa\x5a\x75\x91\x67\x90\x56\x49\x16\xf9\x40\x70\x68\xfd\xb1\x1b\x95\x96\x2c\x76\x1c\x54\x5b\x7f\xa4\x60\xdc\xfa\x63\xb4\xf3\x1b\x81\xe1\xa3\x9e\x61\xc4\xfc\xa7\x5f\xf7\xae\xbf\xd5\xa8\xfa\x64\xa9\xc8\x09\xeb\xf5\x51\x84\x58\x25\x8b\x0c\x01\xdb\x28\x9b\x9a\xc2\xe1\xc1\xe2\xc1\x1d\xd3\x66\x1f\x36\x46\x3b\xe9\xfb\x90\x0b\xa8\xe9\x67\x99\x3f\x89\xed\x24\xd2\x54\x40\x29\x1c\xcf\xb9\xe3\x53\xaf\x4d\x4e\xfa\x7f\x04\xb8\x71\xda\xb5\xfd\x47\x23\xb0\xe0\x33\x51\xd8\xef\x0f\x0f\xff\xf4\xcd\xf9\xdf\xfe\x7c\x78\xf8\xc3\x3f\xc6\x92\x0c\x6e\x28\x16\x01\x8c\x27\xde\x56\x22\x9b\x2a\x9d\x8b\x4b\x58\x17\xf8\x63\x08\xd8\xcf\x10\xe0\x06\xff\x43\xda\x6f\x00\xbf\xfa\x14\x6b\x05\x4f\xe2\x1f\x2b\x9d\x5f\x5c\x8d\x22\x18\x24\xd9\x84\xa6\xb0\x0f\xcc\xb9\x83\x2b\x40\x64\xe4\x8b\x63\x2c\x17\xaf\xb5\x6b\xa3\xaa\xfe\x20\x33\x5d\x49\xa3\x9e\xb0\xd9\x52\x94\x3c\x29\x76\x8c\xe3\x79\x5c\x7c\x26\x6d\x42\xdf\x94\xfe\x90\x0a\x38\xf2\x2d\xd3\xf3\x51\xba\x21\xe3\x70\x9a\x1d\xac\x1e\x1f\x3c\x18\x27\xb7\x39\xb7\xa3\x1e\x15\xd8\x8b\x91\x1c\x5d\x34\x2e\x4d\x78\x30\xca\xbe\x2e\x3b\xf5\xaa\xec\xec\xea\x22\x59\xe8\x0a\xef\xc6\x83\xd8\xd6\x08\x22\x7e\xfe\x40\xbd\x85\x06\xe4\xbc\xc9\x25\x9d\x76\x04\x81\xd9\x23\xca\xb6\xd8\xed\x21\xed\xbe\x72\x95\x47\xa0\xb6\x65\x47\x28\x70\x9a\x55\x75\x9a\x01\x0c\x72\x4a\x51\x6a\xb3\x3e\x89\x7f\x6c\x9a\x90\x4d\xac\xd3\x86\x2f\x12\xcd\x77\x9c\x36\x4c\xb7\xfd\x13\xfe\xe8\x68\x8b\xb2\x3d\x6b\x7a\x4e\x9b\x05\x5c\x78\x83\xd1\x8e\x3e\x24\xa9\x9f\x4f\x3b\x1e\x94\x97\x10\x8f\xe7\x03\x70\x12\xb2\xb4\x86\x89\xfd\xd1\x57\x13\x4f\x93\x9f\xa1\xe2\x80\x14\x4c\xb3\xf6\xc4\xd6\x79\xfd\x11\xd8\xbe\x4f\x68\x75\xd3\xbb\x06\x54\x6f\xa8\x15\x5b\x71\x43\x6c\xd8\xdd\x8e\xd1\xec\x7a\x2e\x57\xd2\xea\x44\x95\xfa\xbe\x7a\xff\x51\xec\x7a\x68\xe5\x83\x95\xad\x63\x39\x95\xe2\xae\x82\xce\xae\x8d\x1d\x48\xcf\xec\xe4\xdd\xd7\x9b\xc7\x74\xf2\x3a\x1c\x15\x77\x4e\x18\xf5\x84\xfd\xd7\xd1\xbb\xdf\xfe\x38\x39\xfe\xea\xe8\xe8\xfb\x47\x93\x3f\xfe\xf0\xdb\xa3\x77\x53\xf8\x97\xdf\x1c\x7f\x75\xfc\x63\xfc\xc3\x6f\x8f\x8f\x8f\x8e\xbe\xff\xe6\xe5\xd7\x6f\xae\xce\x7f\x90\xc7\x3f\x7e\xaf\xea\xf2\x06\xff\xf4\xe3\xd1\xf7\xe2\xfc\x87\x9f\x29\xe4\xf8\xf8\xab\x5f\x27\x4e\x9c\xab\xf5\xab\x24\x57\x82\x81\x06\x4c\xef\x4d\xbf\x2d\x6d\x84\xeb\xc2\xd8\xdd\xa4\x4d\x7a\x4e\xa4\x72\x13\x6d\x26\x28\xf8\x09\xb0\xcd\x8e\xe2\xf2\x8c\xab\x67\x5f\x8f\x60\x93\xfa\xf3\x6b\xdd\xec\x07\xa1\xc8\xb0\xf8\xff\x61\xbf\x53\xe1\x1c\x7b\x9c\x65\xc9\xaf\x0e\x90\xdc\xfa\xa5\xf8\x3c\xfb\x67\xaf\x9f\x1a\x31\x19\x82\xa7\x68\xbc\x28\x77\x6e\x74\x19\x7b\x0e\x00\xf0\x0b\x38\x0f\x93\xc5\x86\x79\xde\x08\xf2\x2b\x78\x1c\xfb\x67\x3a\xca\xd8\x3f\xd3\xa5\x8d\xfd\x33\xdd\xb0\xd1\x7d\xa6\x43\xda\xa9\xfd\x1b\xdd\xae\x21\xd4\x8a\x06\xac\xda\x89\xbc\x8f\x39\xac\x4e\xfb\x5b\xc2\xb7\xed\xc4\xef\x6f\xc3\xf0\x09\x92\x83\xf1\x6b\xd1\xac\x6d\x8d\x17\x35\xbd\x51\xee\x46\x28\xb3\xb3\xa2\x60\x52\x51\x8d\x17\x4c\x32\xd6\x1b\x19\x81\xe9\xa4\xc8\x35\xbb\xa2\x81\x5a\x6f\x97\x62\x63\x09\x81\x53\xd1\x71\xe3\xa4\x5a\x50\x96\x13\x7a\xb6\x80\x3b\x1a\xcb\x6e\xa4\x62\x65\x5d\x38\x59\x15\x82\x25\x04\xb2\x08\x66\x2c\x6a\xc1\xb8\xb5\x3a\x93\x3c\xd6\xe3\xc1\xff\x52\x70\x12\x5f\x69\x88\x14\x60\x55\x1d\xbf\x01\x6c\x73\x26\x72\xa1\x32\x31\x65\x6f\xfd\xaf\x51\x2c\x4a\x3c\x49\xb3\xb5\xdf\x9b\x73\xb5\x6a\x2a\xb1\x6a\x2c\xfe\xa1\x1c\x2a\xbf\xa2\xbb\xe7\xf9\xef\x5b\x7a\xe2\xd5\x54\x80\x6e\xb6\x15\x28\x24\xcd\x09\x7e\x6b\x93\xc9\xe7\x50\xe4\xa3\xe7\x2d\x9a\x83\x54\x2b\x94\x16\xb9\xa4\x46\x0b\x0d\x36\x32\x21\xe0\xdc\x0a\x13\x9a\x05\x49\xe9\x19\x85\x61\x01\xb8\xf5\x44\x19\x0f\x04\x7e\x9a\xea\xae\xbf\x97\x8b\x2d\x31\x41\xd3\x75\xd3\x1f\x9e\x9b\xfd\x11\x5c\xec\x1d\xee\x35\xba\xc7\x49\x52\x53\x5d\xeb\x51\xdc\xea\x31\x5c\xea\x5d\xee\x74\x42\x71\x6d\x3b\x7a\x88\xb7\x51\x5c\xe0\x74\xf7\x37\x1d\x9e\x56\x19\x31\x97\x77\xa3\xe8\xcc\xb3\x96\xd3\x96\xc9\x5c\x28\x27\xe7\x32\xa5\xd1\xb0\xf6\x93\xab\x84\x02\x10\x01\xd0\x6c\x79\xbf\x20\xb1\xb5\x51\x0b\x4f\x7f\x68\xc5\x75\x98\xa2\x19\xd3\x80\x5d\x8f\x95\x9c\xda\x5b\xaf\xbd\xf5\xda\x5b\xaf\x0f\x8d\x07\x6f\xbd\x82\x3e\x88\x21\xfb\xfd\x9a\x1f\x60\x84\x49\x25\xbd\x79\xd6\xe1\x23\x83\x3b\x4e\x4e\xd7\x26\xf0\x5f\x93\x12\x31\xdd\x4e\xac\x8d\xd5\x74\x9a\xf1\xa2\xd0\xb7\x04\x89\x40\x66\x69\x58\x21\x56\xa2\x08\xe1\x10\x2b\xb9\xe2\x0b\x60\xe4\xa4\x45\x30\xb1\xad\x97\x36\xcc\x2b\x1c\x23\x73\xb1\xd9\x4f\x8b\xc4\xda\xa3\x58\xe4\x45\x04\x71\x46\x17\x85\x30\x96\x15\xf2\x46\xb0\x67\xa2\x2a\xf4\x7a\x38\x8b\x28\x0e\xe8\x09\xe7\xb8\xf3\x6a\xea\x5a\x38\x0a\x4e\x39\xa5\x37\x4d\x24\xfa\x47\xe6\xda\xd4\xc3\x0d\x7d\x03\x80\x99\x9e\x55\x48\x85\xcb\x5e\x91\xda\x00\xeb\x39\x3b\x2b\x6e\xf9\xda\x9e\xb0\x4b\xb1\x12\xe6\x84\x5d\xcc\x2f\xb5\xbb\xc2\x24\x02\xc5\xe1\xe9\x56\xc6\xa2\x68\x26\xe7\xec\x49\xc1\x9d\xb0\x8e\x39\x4e\x51\xa2\xd2\x76\x7b\x48\x68\xd3\x9b\x64\xdb\x27\x76\x9c\x9e\xfc\xe9\xa4\xf7\x20\xa9\xa1\xbc\x27\x00\x88\x12\x0e\x5a\x11\x89\x81\x13\x8f\xd8\x19\x52\x05\x23\x31\x27\x32\xcf\x46\x8d\x41\x49\x30\x42\x9b\x8e\xd8\xbf\x15\x52\x77\x52\x31\x23\x6c\xa5\x95\x15\x34\x15\xd4\xaa\x9b\xe6\x9b\x31\x01\x6c\xef\x35\x17\x48\xf4\x67\xd3\x3c\xd9\x4a\x5b\x07\x0c\xcc\x34\x07\xa3\xaf\x5c\xae\xa2\x30\xa0\xf5\xe6\x45\x41\x76\x04\x64\x59\x8a\x5c\x72\x27\x8a\x35\xe3\x73\x27\x0c\xe3\xc9\x84\x16\x7e\x4e\x46\xf0\xc8\x63\x0e\x6c\xcd\xc0\x16\x4e\x22\x30\x6f\xc7\x56\xfa\x1f\xdb\xce\xf3\xa1\x9d\x0e\xdb\x81\xb0\xda\x40\xba\xbe\x45\x65\x4e\x14\x1a\x04\xb6\x6a\x1f\xbc\xef\xa4\xcb\xc9\x5a\xcc\x42\xbb\x00\xb3\x42\x67\x37\x96\xd5\xca\x49\xaa\x57\x8f\x1d\x84\xf4\x0d\xcb\x74\x59\x15\xa0\x3c\xd3\x88\x26\xd9\x4f\x93\x4d\xee\xd2\xc8\xcd\xbf\x4e\x1a\x25\x31\xf1\x73\xb2\xa7\xbf\x6a\xff\x27\xf8\x0b\x5a\x8c\x90\x1c\xc3\xa6\x47\xb0\xe2\x4e\x64\xf4\xb8\xa2\x77\xf5\x5f\x29\x01\xa7\x36\xa9\x95\x3b\x63\x5a\x35\x85\x00\x73\xed\x9d\x56\x20\x5b\x4f\xeb\xeb\xcc\x36\x1a\x92\x9d\xdf\x89\xac\xf9\x73\x4a\x28\x0b\xdd\x15\xb3\xd8\x87\xc5\x9b\x26\x3a\x0c\x66\x14\x90\xd6\x38\xf0\x28\x32\x75\x68\x77\x6c\xb4\x1d\x06\x89\x29\x7c\x1b\x38\x50\xd1\xa0\xb0\x42\x2a\xa2\xf9\xef\x8e\x40\x4c\xda\x6d\x79\xd3\xdc\xee\x54\x80\x89\x17\xb6\xd5\x65\x39\x51\x66\xec\xea\x19\x57\x21\x7d\x4d\x8d\xd6\x8e\x1d\x1d\x9e\x1e\x1e\x6f\xa1\x01\x12\xc1\x8b\xd8\xcd\x12\x1d\x38\xa4\x3b\x0a\xb3\x4e\x94\x2a\xa1\x2f\x7b\x05\x4d\xb9\x45\x76\x98\x9f\x30\x99\x0a\x44\x09\x9c\xaf\xa6\x56\xf1\x24\xa4\x55\x35\x31\xe4\xb7\x3d\x61\x56\x33\x67\x78\x2e\x47\xa9\x2e\x00\x99\x7e\x82\xce\xd4\xc1\xc9\x3e\x3a\xfc\xf1\x30\xf5\x9c\x0a\x97\x1d\xb3\x5b\xad\x0e\x1d\x1c\xd7\x29\x7b\x93\x7a\xab\x6a\x2b\x22\xc5\xef\x09\x70\xf3\x2b\x91\x0e\xc8\xd1\x4c\xdc\x55\x85\xcc\xa4\x2b\xd6\xe0\x5c\x32\x5d\xa7\xee\x3b\x70\xd8\x73\x17\xd9\x88\xcf\xef\x92\x4f\x12\x56\x34\x7b\x23\xf6\x08\x5c\x41\x74\x38\x13\x85\x72\xcb\x0a\xb9\x12\xa7\x4b\xc1\x0b\xb7\x5c\x0f\xee\x8b\xb3\x3d\x94\x56\x93\x7f\x09\xa3\x81\x2f\x59\x05\xb9\x69\x28\xce\x14\x40\x43\x77\x90\xc1\x0d\xdb\x93\x49\xca\xbd\x7a\x7f\xf1\x6b\x41\x8c\x8b\xd8\x56\x6b\xd8\x37\x6f\xae\xbe\x16\x6e\x34\xc7\xc3\xcf\x2e\x96\xde\xc1\xab\x96\x30\x73\x6d\xca\x7b\xf6\x40\xd2\x41\xe2\x13\xe8\x43\x7b\xcf\x2e\xd0\x52\xdb\x84\x7d\x67\xbb\xdb\x02\xd3\xf8\x48\xbb\x03\xbb\x78\x29\x91\xf9\x1d\x1f\xad\x0c\xbd\xed\x3f\xc6\x2e\xae\xa6\xec\x6f\xba\x86\x56\x4c\x7c\x96\xe4\xc9\xfb\x11\x3b\xb2\x58\xe1\xd8\x81\x5f\x84\x83\x94\x87\x56\x1c\xfe\xdc\xff\x55\xf0\x1c\x5b\x03\x59\x27\x38\x89\x31\xbc\x1d\x23\x41\x77\x3b\xf3\x1a\xd3\x73\xae\xad\xd3\x25\x5b\xa2\xe0\xf4\x8d\xee\x50\x2f\x07\xdd\x91\x8a\xdc\xf7\x7a\x0d\xdf\x17\x2c\x33\xa2\x1a\xc3\xda\x85\xaf\xfd\x05\x59\xa3\x2d\x4b\x80\x27\x25\x51\x6a\x94\x3b\x13\x96\x71\x96\xc1\x51\x49\x16\x89\x8b\xef\xcf\x4a\xa0\x4b\x4c\x96\x28\x15\x1e\x12\xec\xef\x36\x8a\x5d\x4f\x2e\x66\x62\x23\x15\x34\xb1\x14\xaa\xe9\xbe\x90\xe1\x0d\xd9\xb6\xc7\x58\xf5\x51\x6c\xa4\x4a\x1a\xb6\x03\x40\x32\x82\xc8\xe6\x94\xe2\x63\xe7\x08\xcb\xcf\xc6\xac\xe1\x60\xa9\xa4\xd6\xdd\xf1\xf1\x97\x6f\x8c\x83\xc7\xc6\x5b\xbf\x2a\x99\x7e\x66\x9b\x7c\x06\x9b\x3d\xd2\x9a\x29\x75\x87\x46\xd3\x09\xea\xcc\x0a\xb3\xa2\x15\x4c\xb4\x63\xac\x25\xd3\xd4\xe7\x9b\x38\x76\x30\xcf\x1b\xa6\xea\x72\x96\x6c\xa4\x1a\x1e\x38\xe3\xc6\xde\x86\x4e\xf3\x88\xcb\x31\xa6\x1a\x21\x2c\xd1\x41\xe2\x6a\x91\x7a\x2f\x1e\xfb\x6f\xfe\xfd\x7f\xfc\xc7\x97\xff\x31\xc5\x65\xf5\xbf\x91\x28\x73\x26\x18\x57\xec\xe2\xec\xf2\xec\xef\xd7\x6f\x9f\x02\x27\x77\xda\x29\x1c\xa1\x98\x7f\xcc\x52\xfe\x11\x0b\xf9\x3f\x62\x19\x3f\x10\x96\x25\x6a\xf8\x3e\x2e\x0b\x04\xa6\x67\xb4\x6b\x8b\x34\xdc\x21\x52\xc4\x67\xc3\x11\x32\xd9\x3e\x26\xee\xb1\x97\x8f\x10\x38\xdc\xbb\xf6\x74\x59\x75\xad\xb3\x9b\xd1\xb2\x3c\x87\x6f\x9e\x5e\xa1\xc0\x51\x12\x3d\x5c\xc5\x07\x26\xa9\x56\xba\x58\xf9\xcd\xe4\xec\xcd\xd3\xab\x44\x63\x31\xf5\x32\xe0\x85\x15\xf3\xde\xeb\xa4\x4a\xce\x86\x9a\x29\x40\x3b\x65\x59\x15\x29\x2f\xca\x0c\x3a\x10\x18\xc1\x0b\x69\x9d\xcc\x60\xae\x05\xa9\x6b\x75\x7f\xf8\xef\xa5\xe3\x39\xf7\xf9\xb1\x76\x8c\x9c\x1f\x3b\x7c\x35\x52\xd5\x73\x93\x68\xeb\xa4\xca\x92\x93\x26\x27\x3d\xd2\x9f\x74\x86\xca\x90\x68\x4b\x2b\x39\x7f\xa0\x9e\x23\xb8\x61\xb4\x06\xa3\xdd\xa1\x3a\xbd\x8f\x82\xe7\x98\xfa\x82\x02\x7e\xe7\xb6\xe7\x98\x28\x36\x7c\x70\xdf\x73\x4c\xcd\x4b\x78\xbf\x73\xcb\x73\x1c\xc9\xb7\xdd\x7b\x8e\x3f\x6f\x7c\x04\xcf\xb1\x32\xe2\xda\xe9\x6a\x14\x9c\x1d\x8a\x1a\x15\x65\x37\x13\x73\x6d\xc4\x38\x30\xbb\x16\x00\xc7\xf2\x1a\x94\x31\x57\x09\xcc\xaa\xf1\x99\x4b\x77\xe1\x6a\xe4\x92\x7d\x06\x2e\x4b\xb6\x8c\xaf\xaa\x4a\x58\x7b\x0a\xd0\xb8\xba\xc2\x24\x25\x51\xe8\x9c\xcb\xa2\x36\xe2\xc4\xef\xb4\x28\x61\xaf\x4e\x52\x49\x1e\xfd\x66\x08\x85\xa2\x84\xcb\x10\x46\x11\x50\x8b\xf4\xfd\xf1\x3e\x1f\x1e\x1c\xec\x93\x9b\xde\x2c\x2c\x33\xdc\x2e\x05\xb4\x08\x15\x77\xd2\x59\x9c\xa8\x11\xdc\x92\x39\xa2\x01\xea\x12\x0e\x12\xb8\xc0\x96\x55\xdc\x5a\x91\xd3\xad\x41\x07\xf2\x89\x13\xbc\xd2\xf9\xe1\xa1\xed\xfe\x0c\x51\xf2\xc2\xf0\x4c\xb0\x4a\x18\xa9\x73\x06\xac\xeb\xb9\xbe\x55\x6c\x26\x16\x52\x51\x23\x80\x70\x23\xfd\xa4\xe3\x85\xf7\x2e\xac\x48\x00\x52\xc5\x3e\xcc\x53\xf6\xba\xd7\x27\x96\x6e\xb5\x74\xed\x32\xdd\x5a\xeb\xb0\xba\x27\x09\x12\x5b\x24\x29\xb0\x35\xc0\x35\xaf\x79\x51\xac\x5b\xb5\x42\x94\x1c\x88\x49\xdc\xc7\xda\xf8\xcf\x0c\x53\xeb\x2f\x6b\xaa\xc4\xee\x05\xed\x2e\x05\x5d\x37\x19\xc1\xb3\x65\x5a\x31\xc5\x1e\xba\xfb\x81\xb1\x87\xee\xee\xa1\xbb\xef\x1d\x7b\xe8\xee\x1e\xba\xbb\x87\xee\xee\xa1\xbb\x7b\xe8\xee\x1e\xba\x3b\x70\xec\xa1\xbb\x1f\x1a\x7b\xe8\xee\x7b\xc7\x83\x7c\x9a\xd8\x43\x77\xf7\xd0\xdd\x9f\x3d\xf6\xd0\xdd\x3d\x74\x77\x98\xdc\x3d\x74\x97\x34\xf6\xd0\xdd\x9f\x1c\x7b\xe8\x6e\xca\xd8\x43\x77\xa9\x63\x0f\xdd\x1d\x3c\xf6\xd0\xdd\x3d\x74\x37\x61\xec\x01\x18\x84\xb1\x87\xee\x8e\x10\x38\xdc\xbb\xf6\xdc\x43\x77\xf7\xd0\xdd\x9f\x39\xf6\xf9\xb1\x76\xec\xa1\xbb\x09\x63\x0f\xdd\xfd\xe0\xd8\x43\x77\xf7\xd0\xdd\x04\x59\x0f\xcf\x73\x8c\x10\xd1\x2b\xa3\x67\xc9\xd4\xd2\x57\x00\x8e\x92\x19\x66\xd4\xfc\x3d\x49\x01\x5e\xc6\xa9\x4d\xd9\xd3\x3e\x66\x0e\xfa\x5b\x05\xfa\x48\x82\xdc\x80\x09\xc5\x39\x02\x35\xe6\x74\x07\xdb\x2d\x41\xf0\x40\x48\x57\x24\x74\xb6\xa7\x95\xc6\xff\xaf\x05\x74\x75\x90\x5c\x98\x9d\xa4\x72\xe5\xde\x0b\xeb\x2a\x1d\xbe\xf5\x5e\xe8\x16\xd3\x24\x1a\x67\xd6\x06\xfa\x9b\xb0\xad\x3e\xf8\x8a\x28\xbb\x0f\xd9\xea\x03\xaf\xa8\x9e\x3f\x19\xae\xf5\x00\x80\x7b\xc9\x10\xad\xf7\xc0\xb3\x12\xad\xd7\x06\x34\x2b\x82\xab\x12\x24\xee\x84\x65\x25\xce\x72\x0b\x92\x15\x41\x55\x23\x7c\x39\x60\x4f\xbb\x80\xaa\xc4\x57\xfe\x0e\x14\xab\x0b\xa6\x4a\x90\xda\x81\x61\x6d\x03\xa9\x52\x76\xca\xed\x02\x51\x05\x0c\x50\x4a\x70\xd9\x03\x50\xed\x80\x40\x25\xc8\x06\xf0\xd4\xc8\xf0\xa7\x9d\xd0\xa7\x34\xff\x75\x07\xec\x29\x02\x97\x52\x16\xb6\x85\x3c\x75\x41\x4b\x29\x47\xa0\x81\x3b\x6d\x02\x96\x92\x52\x20\xf9\xd8\x60\xa5\x31\x9e\x86\x93\x9f\x85\x13\x3d\xd5\x50\x26\xf4\x66\x69\x84\x5d\xea\x82\x68\x0a\x7a\x66\xe0\xa5\x54\xb2\xac\x4b\xaf\x73\xac\xd7\xdb\x72\x95\x58\xc3\x64\x1b\xb4\x2a\x3a\x81\xf0\xa6\x4c\xb6\x78\xa0\x51\x8c\xc8\x41\xba\x3f\x62\x40\xe8\xbe\xe4\x2b\xba\xab\x6f\xeb\x2c\x13\x22\x17\x79\x2f\xaf\xc9\xbe\x9c\xc6\xb5\x20\xca\xc5\x06\xa9\xd2\xb2\xc7\x29\x1e\x46\x4a\x44\x34\xd7\xa6\xe4\x0e\x64\x7c\xf9\x05\x41\x42\x12\xf6\xed\xa3\xe0\xde\x46\xc7\xbc\x25\xbb\x71\x69\xb9\xbc\x84\x3c\x5e\xba\xff\x98\x96\xbf\xdb\x8d\x6d\x4b\xb3\x71\xbb\x70\x6d\x69\x12\x3f\x02\xa6\x6d\x27\x9e\xad\x8b\xfc\x4a\xf3\x74\xd3\xb0\x6c\x23\x21\x5e\x93\x31\x6c\x1f\x07\xbf\xb6\x1b\xbb\x06\xda\x25\xc5\xb9\xe8\xe3\xd6\xd2\x91\x67\x0f\xc2\xb5\xf8\x18\x68\xb3\x6d\xa4\x59\x58\xac\xb4\x2c\x76\x83\x32\x1b\x0f\x25\x36\x12\x42\x6c\x0c\x74\x58\x32\x32\x2c\x1d\x15\x36\x16\x22\x6c\x0c\x34\xd8\x56\x17\xd0\x11\x4e\x10\x8b\x8d\x1b\x47\xc1\x57\x8f\x95\x3d\x1e\x05\xfd\xf5\x71\x97\x6b\x0c\xd4\xd7\x08\xeb\x95\x86\xf6\xfa\x38\x48\xaf\x31\x51\x5e\x63\x2c\x51\xd2\x1b\xdd\xc7\x41\x76\xed\x44\x75\x31\x72\xfd\x3b\xdb\x4c\x77\x4d\xbb\x2f\x6b\x09\x42\x37\xd0\x5c\xdd\x57\xb5\x04\xa9\x0d\x92\x6b\xdc\x17\xb5\xc4\xd7\xb4\xb1\x5e\xd2\x46\x7a\x45\xfb\x48\xd8\xab\x54\xdc\xd5\x6e\xcc\x95\xf7\x41\x12\x0e\xc4\x16\xde\xaa\x45\x4c\x25\x48\xed\xe6\x24\xd2\xd0\x52\x89\x1b\x2a\x95\x74\x92\x17\xcf\x44\xc1\xd7\xd7\x22\xd3\x2a\x27\x7a\x13\x1b\xbd\xaa\x03\x5a\x60\xce\x2c\x0a\x25\x7e\x1f\x66\x82\xfa\x5c\x17\x4b\x6e\x19\xfd\xed\x92\xb5\xc4\x29\xf1\x79\x34\x38\xa6\x8c\xc3\xe3\xa3\x5f\x0f\xe2\xf3\x25\x7b\x70\x4f\x98\xec\x41\xa4\x9c\x90\xf2\x63\xbc\xe3\xf5\x57\x7d\xcb\xf4\xdc\x09\xc5\x8e\xa4\x8a\x27\xec\x98\x9a\x7d\x6a\x92\x4d\x6d\x3e\xb3\x49\x1a\xd2\x65\x3e\x7e\x14\x27\xd6\xa4\x1c\x93\x1c\xb3\xcf\x39\xe5\x08\xc9\x58\x6b\x1f\x66\x46\x3b\x4c\xee\x63\xa5\xb4\x83\xf8\x79\x5d\xa0\x32\xa3\xe6\x6f\x20\x19\x1e\x12\xe4\xfd\x9c\x36\xf1\x58\x30\xf6\x32\xb8\x39\x8f\xe1\xcb\x1b\x6d\xc8\x55\xce\x02\xdd\x19\x59\x72\xf7\xc0\x7f\xd6\x47\x37\x11\x45\xfc\xb1\x10\xc4\xef\x45\x0f\x23\x06\x98\x28\x75\x0b\x39\xdc\xe2\x7f\xa9\x12\xfb\xa8\xe1\x2e\xf6\x37\x61\x8e\x6d\x57\x66\x3a\xee\x77\xff\x46\x40\xfb\x6f\xdf\x8b\xef\x85\xe7\x82\x04\x97\x78\x03\xdb\x3b\x56\x19\x7c\xbf\x04\x3e\x15\x23\xfe\x60\xa2\xfd\x88\xc6\x4d\xcd\x8d\xed\xa3\xfd\x7d\xb4\xff\x81\xf1\x11\xa2\x7d\x27\x4b\xa1\x6b\xf7\x60\x03\xce\xdb\xa5\xcc\x96\x5d\x5f\x50\x96\x64\x53\xad\x6b\xb7\xe1\xaf\x85\x29\x8e\x08\x45\xd8\x47\x9d\x1b\x83\xf6\xa6\xb1\x23\xa1\x9a\xce\x7e\xdb\x20\x64\x19\xb7\x8c\xb3\x67\x97\xd7\x7f\x7f\x71\xf6\x97\xf3\x17\x53\x76\xce\xb3\x65\x92\x68\xa9\x18\x07\xcb\x06\x2a\x6c\xc9\x57\x82\x71\x56\x2b\xf9\xcf\x5a\x50\xed\xc2\x51\x33\xbf\xe3\x51\x30\xdd\x09\x1a\xc8\xdb\x24\x82\x6e\xe8\x6d\xe2\x0b\x69\x9d\xdf\x44\x90\x15\x78\xc6\x34\x29\x1f\x38\x37\xba\xdc\x34\x6d\xe7\x5e\x18\xba\xde\x44\x6f\x6e\x29\x8c\x60\x0b\xb9\x0a\xc8\x67\xc4\x80\x32\x9e\x27\xb0\xca\x79\x2d\xe0\x2f\x8e\x0f\x0e\xf8\x0c\x00\x85\x4b\xc1\x94\x70\xfe\xd2\x37\xa9\x4c\x1a\xba\xb2\x43\xfe\xcd\x6a\x2b\xec\x09\x9b\xd5\x00\x0e\xad\x8c\x2c\xb9\x91\x24\x08\x46\x67\xc2\xbc\x98\xb2\x4b\x1d\xc3\xa3\x35\x2c\x2d\x25\xdf\xe4\xbd\x19\x58\xda\x67\xaf\xce\xaf\xd9\xe5\xab\x37\xac\x32\xc0\x13\x4c\x45\x56\x82\x44\x38\x02\x33\xe1\x67\x85\xc7\x28\x9f\xb2\x33\xb5\xa6\xee\x3d\x1a\x19\x69\x99\x8f\x87\x84\xf2\x62\xc3\xf3\x54\x4e\x4e\x3e\x1d\x3c\x9a\xc2\xff\x3b\xf0\x67\xc8\x78\x57\xae\x81\xeb\xa6\x28\x9a\x58\x34\x82\xee\xa1\x9c\x15\xa2\xbd\x0f\xe1\x64\x51\xbc\xa5\xd1\xf4\x0b\x0d\x95\x41\x46\x63\x6c\x40\xec\xc3\xba\x5e\xf9\x33\x62\x44\x65\x84\x15\x8a\x18\xb3\xf0\xe6\xa2\xc2\x89\x03\x05\xef\x35\x4c\x91\x58\xd8\x96\x18\xed\xa6\xc4\xba\x93\x76\xe6\x57\xb4\x8b\x92\x1a\xf0\xf6\x7e\x9f\xea\x96\xef\x0c\xbf\xe6\x69\x15\xbb\x8d\x3d\x8a\x17\xbf\xd2\xf9\xa1\x65\x17\x74\xdc\x53\xb8\xf5\x53\xf6\x66\x29\x6d\x1b\xd9\x78\x5f\x51\xd2\xe9\x9e\xe0\x2c\xe2\xc3\xf2\x09\x7b\xc4\xfe\xc4\xee\xd8\x9f\x20\xf8\xfa\x3d\x35\x46\x1a\x23\xc0\x49\x4d\xed\x61\x1e\xe4\xe2\x6a\x94\x13\xf1\xdd\x92\x3b\x90\xc7\x2e\xae\x52\xc0\x8d\x33\xa9\x72\x38\x0a\xe2\xce\x09\xa3\x78\x11\x43\xf3\xb4\x95\x4e\x08\x01\xfd\x47\x3d\xf8\x8b\x83\x0c\x16\x17\x73\xb2\xc4\xc6\x4b\x3f\x61\xae\x77\x75\xc8\x12\xe1\xca\xed\xbc\x3a\x64\x91\x78\xe5\xd8\xc5\x1c\x72\x6d\x97\xc1\x52\x48\xdb\x99\x3d\x7d\x49\x9b\xaf\x2e\xb9\xcb\x96\x7d\xb3\x46\x4f\x85\xbc\xf4\x57\xa2\xa5\xde\x67\xb9\x86\xdc\x72\x12\x69\xb0\x9f\xea\xe7\xad\x78\x52\x20\x77\xbd\xfb\x74\x31\xdf\x3c\xb9\xe4\x55\x7d\x5f\x1a\x2c\x89\x91\x38\x04\xa3\x9d\xc6\x1a\x95\xce\x31\xf2\x25\xcb\xf4\x8b\x97\x77\xfc\xa3\x5e\x00\x4c\xb7\x9c\xdd\xc0\x39\x30\x3a\xa5\x16\x0f\xa2\xea\xf6\x96\x21\xe3\x0a\x8b\xae\xe7\xc2\x98\x94\xa3\xaf\xd9\x6c\x0d\xc8\x35\x99\x89\xc4\x4b\x90\x60\x13\x2a\xa3\x9d\xce\x34\x99\xd4\xa3\x0f\xee\x0b\xc2\x60\xb9\x53\x9e\xaf\xda\x17\xcd\x6f\x9f\x5d\x9d\xb0\x37\x4f\xaf\x4e\x98\x36\xec\xfa\x69\x0a\xbe\xa6\x9b\xb9\x3b\x78\xf3\xf4\xea\xe0\xde\x16\x9d\xc5\xb8\xf0\x09\x89\x26\xa8\x97\xc6\xf5\x21\xe7\xa4\xe4\xd5\xe4\x46\xac\x09\x5e\x75\xaa\x4f\x3f\x69\x4e\xd0\x08\x9f\x81\x0b\x5b\xf2\x6a\xa0\x2c\x23\x78\x2e\x1f\x28\x73\x43\xb8\xe1\xed\x1c\x37\x29\x1c\x08\x32\x41\xff\x94\x7a\x25\x72\x0c\xde\xe3\x6f\x08\x95\x57\x5a\xd2\x22\xd6\x3d\x13\xc4\x87\xc7\x9e\x09\xe2\xe7\x8d\x3d\x13\x44\x7f\xec\x99\x20\x12\x64\xee\x99\x20\xf6\x4c\x10\x38\xf6\x4c\x10\x7b\x26\x08\xe2\xd8\x33\x41\x7c\x78\x72\x7b\x26\x88\xcf\x16\xdb\xba\x67\x82\xf8\xf0\xd8\xa3\x3c\xf7\x4c\x10\x7b\x26\x88\xad\xb1\x67\x82\xb8\x6f\xd7\x62\xcf\x04\xb1\x67\x82\x88\x63\xcf\x04\x31\x60\xec\x99\x20\x86\x8d\x3d\x13\xc4\x07\xc7\x03\xab\x0d\xd9\x33\x41\xec\x6b\x43\x7e\xae\x9c\x87\x57\x1b\xc2\xf6\x4c\x10\xb4\xb1\x67\x82\x18\x3e\xf6\x4c\x10\xc3\xc6\x9e\x09\x62\xb8\xcc\x3d\x13\x44\x3b\xf6\x4c\x10\x7b\x26\x88\xcf\xf4\xe8\xee\x99\x20\xf6\x4c\x10\xbb\xc7\xfe\x8d\x60\xcf\x04\x31\x6c\xec\x99\x20\xe8\x42\xf7\xd1\x3e\x5d\xce\xc3\x8b\xf6\xf7\x4c\x10\x7b\x26\x88\x0f\x8e\x14\xd7\xcd\x08\xab\x6b\x93\x51\x4c\x64\xff\x5c\x3d\xd5\x65\x55\x3b\xc1\x5e\x47\x81\x8d\xdd\x27\x7c\xd3\x6c\x8d\x05\x57\x1d\xed\x78\x1f\xb0\xe9\x4c\xab\xb9\x5c\xd4\x06\x8a\xef\x4f\x4b\xae\xf8\x42\x4c\x32\xfc\xd0\x49\xb3\x72\x93\x66\x96\xa7\x9f\x15\x74\xba\x90\xa5\xa4\x30\x48\xb0\xad\xbd\x7f\x01\x92\xda\xf7\xd1\x04\x78\x4b\xc9\xef\x20\x20\xe2\xa5\xae\x95\xc3\x3a\x01\x58\x6f\xa2\xcc\x66\x97\xf0\x9d\xdb\x87\x84\xed\x21\x48\x80\x08\x3c\x80\xa3\xc3\xc6\x70\xce\x5b\x2e\x8d\xab\x64\x6f\xb9\xe2\xce\x09\xa3\x9e\xb0\xff\x3a\x7a\xf7\xdb\x1f\x27\xc7\x5f\x1d\x1d\x7d\xff\x68\xf2\xc7\x1f\x7e\x7b\xf4\x6e\x0a\xff\xf2\x9b\xe3\xaf\x8e\x7f\x8c\x7f\xf8\xed\xf1\xf1\xd1\xd1\xf7\xdf\xbc\xfc\xfa\xcd\xd5\xf9\x0f\xf2\xf8\xc7\xef\x55\x5d\xde\xe0\x9f\x7e\x3c\xfa\x5e\x9c\xff\xf0\x33\x85\x1c\x1f\x7f\xf5\x6b\x72\x70\x98\xe0\x7e\x8c\xe3\x7c\x8c\xe2\x7a\x7c\x04\xc7\x23\xa0\x4b\x46\x51\x0f\xaf\x83\xac\x71\x14\x44\xc8\x98\x8c\xaf\x20\xa2\xbd\x82\x0a\xe2\x38\x67\x7a\x12\x52\x97\xd2\x39\x91\x43\xca\xa8\x43\x2f\x42\xc5\x81\x4b\xd7\x6b\xc6\x1d\x54\x2e\x14\x18\x91\x21\xd0\xd2\x76\x71\xd5\x9d\x4a\x59\xed\x96\xc2\xdc\x4a\xf2\x7b\x90\x0f\x90\x54\x9b\xcd\x00\x25\x38\xc9\xc5\x5c\x2a\x72\x82\x04\x9c\xb8\xc1\xfe\xdb\x5e\x0d\xef\xd5\xf0\x10\x29\x0f\x49\x0d\x5b\x91\xd5\x46\xba\xf5\x53\xad\x9c\xb8\x23\x24\x44\xfa\x5a\xf8\x3a\x88\x63\x1a\xfe\x86\x5a\xe7\x54\xe9\x3c\x56\xb5\x99\x5a\x41\xe9\x7a\xa2\x4b\xf5\x73\xee\x71\xa5\x0b\x99\xad\x4f\xe3\x92\xc0\x85\x15\x77\xee\xf4\xa3\xc5\x00\x8e\xdb\x9b\x56\x7d\x88\x89\x8f\xfc\x5a\x2d\xb1\x35\x8f\xcf\xca\xf1\x07\x4f\xf8\xca\xc8\x95\x2c\xc4\x42\x9c\xdb\x8c\x17\xa0\x1f\xc7\xb0\xf5\x67\xef\x91\x4d\x7f\x1f\x72\x46\x17\x96\xdd\x2e\x85\xb7\x49\x8c\xfb\x6f\x87\xd4\x5b\xc6\xa9\x42\x17\x5c\x2a\x56\xfa\x63\x50\xc5\x89\xfa\xdb\xe0\x2d\x16\xd9\xe0\x57\xdc\x08\xe5\xe2\xe4\x02\xc1\xd0\x4c\xeb\x22\x94\xd8\x91\x31\xd7\xcd\x0a\x84\x5a\x62\xa5\xff\xae\xc4\xed\xdf\xfd\xcc\xa9\x73\x9d\x17\x7c\xd1\x70\x96\x59\xe1\x22\xd8\x2b\xa5\x22\x9b\xe1\xa9\xc4\x8f\x1f\xf9\x10\x40\x4d\x55\x2d\x18\x2f\x6e\xf9\x1a\x8e\xc2\x38\xf3\x95\xf6\x09\x7b\x7c\x0c\x6a\x8c\x5b\xd6\xcc\x37\x67\x5f\x50\x9f\xc8\x97\xdc\xb2\xa7\x67\x57\x7f\xbf\xfe\xdb\xf5\xdf\xcf\x9e\xbd\xbc\xb8\x4c\x71\x27\xfc\xe9\x11\xa4\x43\x9e\xf1\x8a\xcf\x64\x21\xe9\x5e\xc4\x16\xee\xb2\x2b\x32\xc1\x29\xcc\xf3\xd3\xdc\xe8\x0a\xf7\xd0\xd4\x0a\x68\xfd\x5a\xfe\x1b\x6a\x26\xb9\x9b\x35\xec\x30\x04\xfa\xc3\x4d\x4d\x46\xce\x7b\x9f\xcc\x16\x86\x2b\xef\xcd\x43\x66\x2a\xe1\xb5\x3b\x40\x73\x4c\xad\x9c\x2c\x3f\xdf\xe2\x6b\x9e\x8f\x55\x78\x7d\x96\xe7\x22\x1f\xe3\x78\x3d\xc4\xc2\x83\xa7\xf1\xb3\x52\x2a\x6e\x58\xcb\x9a\xc8\xae\x5e\x5d\x5f\xfc\x7f\xe3\xac\x16\x0b\x2b\x96\xf2\x80\x35\x02\x67\x8b\xd1\xd5\x48\x27\xe9\x75\x60\xef\xd8\x9f\xa5\x9f\x1a\xbf\xd0\xb3\xd4\x78\x72\x63\x60\xa6\x5e\xd7\xaa\xa3\xab\xc9\x04\x06\xed\x9c\x58\xa9\x73\x31\x65\x57\xe8\x20\x09\x3b\x8a\xcc\x0e\x6d\x1c\x37\x82\x79\xc1\xca\x49\x5e\x90\x5d\x4d\xf1\xcf\x5a\xae\x78\x21\xb0\xc0\x0f\x28\x1c\xba\xfc\x81\x23\xd8\xe6\x39\x2f\x6c\x92\xd1\xa3\xfb\x44\xde\x39\x7d\xa9\x6b\x35\x06\x3e\xa9\x91\xc5\x72\xa1\xb4\x4b\xca\x67\xfa\xef\x02\xc2\x47\xa3\x33\x86\x39\xcd\x24\x28\x76\xc4\xe6\x75\x9c\x2a\x70\xe0\xe8\xa4\xc9\x0c\x5d\xf0\xb0\x8f\x57\xcd\xb7\xe3\xdb\x6f\x6d\x93\x3e\x7f\xcb\x25\x4a\x85\xb2\xf8\xef\x37\x82\xe7\xc0\xe4\x53\x71\xb7\x44\x9c\x5e\xc9\xed\x0d\x39\xf7\x08\x62\x42\x4c\x17\xb2\xc4\x48\xc0\xd3\x2c\xc6\x1b\xba\xf2\x9b\x0b\xee\x6a\x23\x30\x2a\xc3\x62\x40\xa1\xf8\xac\xa0\x22\xab\x13\x15\xa9\x5f\xbb\x57\xaa\x58\xbf\xd6\xda\x3d\x6f\xd8\x56\x46\xb8\x34\xdf\x85\x08\xbe\xff\xb0\x9b\x10\x68\x01\x44\x2e\x9f\xc0\x46\x83\xb2\x4a\x27\x87\x09\x67\xdc\x1f\xf7\x7b\x54\x55\xa6\x56\x67\xf6\x6b\xa3\x6b\xa2\x67\xb4\x15\xbc\x7d\x7d\xf1\x0c\x34\x7a\xad\x12\x82\x17\xa1\x9c\x59\x03\x13\xda\x18\x6d\x1f\x58\x37\x5f\xf0\xad\x37\x89\x1b\xf7\x9f\xaa\xa8\xe6\xac\x56\x56\xb8\x29\x7b\xc9\xd7\x8c\x17\x56\xc7\x24\x07\xd9\xe4\x5e\x01\x22\xbf\x9b\x8a\x9d\x32\x60\x16\x25\x07\x97\x52\xb1\x99\x76\x4b\xb6\x21\x36\x81\x4a\x74\x7b\x8e\xc0\x10\x95\x04\xa4\x6f\x3b\x73\x48\xb5\x39\x55\xaa\xc6\xe7\x37\xc2\xb2\xca\x88\x4c\xe4\x42\x65\x49\xf7\x6b\x24\xc4\xcc\xef\x7f\x47\xbd\xa1\x97\x5a\x79\x25\x39\xc2\x1d\xbd\x50\xb9\xcc\xb8\xc3\x2c\xa4\x1b\x25\xc1\x00\x58\xbd\x90\xd9\xe2\x40\x1e\xe4\x55\x24\x51\x6c\x6d\x85\x81\x57\x51\x67\x6a\x81\x07\xeb\x9b\x7a\x26\x0a\xe1\xa8\x64\x8b\x2c\x32\x40\x73\x87\xcc\x66\xb2\xe4\x0b\xc1\xb8\x8b\x6a\x80\x9e\x63\x12\xca\x7a\x73\x0a\x2b\x29\x1d\xcb\xb5\x68\x28\xb9\xa8\xc9\x0e\xcb\xbe\xbd\x78\xc6\x1e\xb1\x23\xbf\x86\xc7\xe0\x4f\xcc\xb9\x2c\xe8\xdc\x1c\x50\x35\xb0\xe1\xff\xc8\x79\x9c\x2e\xd5\x7a\x5d\x04\xdd\xc7\xb4\x41\xf3\x75\xc2\x94\x66\xb6\xce\x96\x71\xad\xe9\x39\xd8\x98\x2e\x0e\x15\x40\x80\xa3\x09\x0a\x96\x28\xb1\x51\xcb\xef\x53\xb0\xd4\xb5\x45\xa1\xbb\x14\x2c\xf9\x7d\x32\x7f\x9f\x82\x4d\x42\x24\x3e\x70\x05\x9b\xe8\xc0\x7c\x6b\x85\x19\xc9\x7f\xf9\xf6\x81\xfb\x2f\xdd\x10\xd7\xeb\xca\x76\x67\xe9\x0e\x02\x2a\xc4\x52\x38\x9e\x73\xc7\x83\x5f\x93\xca\x21\xba\xed\x13\xed\x2f\xdf\xc3\xbc\x7c\xf7\xe9\xdd\x58\xf1\x42\xaa\xfa\x0e\x0b\x56\xc6\x7a\x40\xba\x3e\x07\xa1\x2c\x4b\x5b\x62\x38\xba\xbc\xaa\x0a\x09\x8c\x92\x1b\x35\x14\x49\x86\xb3\xdb\x28\x20\x5d\x39\xc4\x70\x06\x0c\x27\x2f\x0a\xed\x1d\x3c\x1f\xb3\x72\x95\x6b\x2a\x92\x7d\x63\x11\x21\xd9\x21\x7a\x6d\xf2\xa6\x70\xc9\xa9\x77\x6d\xaf\x1a\x3e\x03\xd5\x70\xaf\x0f\x7f\x85\x58\x09\x72\x5f\x83\xcd\xee\x83\x5e\x16\x93\x36\x1e\xeb\x84\xd7\x03\x98\x16\x2b\xf8\x4c\x14\xe8\xf9\xa3\x8a\x18\xa1\x1e\x2e\x59\xb9\x8c\xf2\x4c\x66\x74\x31\x16\xdf\xc7\x6b\x5d\x40\x31\x0c\x1f\x61\xd9\xfd\xb4\x7e\xc1\xab\x0e\x22\xc6\x59\xf5\x37\xeb\x6a\xb4\x55\x87\x27\x83\x5f\xee\xaa\xd7\xe4\xc0\x81\x6d\xae\xba\x8f\x41\xc6\x5a\x75\x70\xec\x7f\x99\xab\x6e\x45\x96\xe9\xb2\xba\x32\x7a\x2e\xa9\x7a\x66\xcb\xe1\x0b\x42\x23\xdc\x94\xee\xf0\xd5\x56\xec\x2a\x08\x4b\x70\x44\x7a\x13\x83\xc7\xd3\xca\xe8\x95\xcc\xc9\xf1\x1a\x77\xe8\xd7\xc4\x02\xea\xff\x2b\xd9\x7d\x04\x83\xb6\xe1\x89\x26\x2e\xa5\x5e\x09\x63\x62\x27\x01\x3f\xcb\x20\xee\x33\xa5\x0e\x26\xe3\x0d\x46\x70\x82\x74\xc6\x0b\x68\xfc\x97\x72\x63\xd8\xe6\xad\xd9\x14\x9b\xa0\x5a\x64\x93\x51\x06\xc0\xac\x97\xc6\xd2\xea\x2f\x58\x6c\xa8\x0d\xb2\x02\x2e\x40\xe9\x5c\x04\x34\x78\x82\xd8\x40\x7f\x8a\xef\xd4\x71\xb6\xe9\x65\xf0\xde\xdb\x8e\xf8\xed\x3c\xcc\x38\x41\x22\x7c\xab\xd3\xa1\x3f\xc2\xcb\xe4\x06\x88\xb8\xf9\x42\xe5\x52\x2d\xe0\x85\xf9\x84\x19\x51\xf0\x04\x82\x1e\xd6\xda\x94\x1b\x4c\xcf\x1f\x82\xc6\x0c\x4b\x90\x20\x35\xaa\xcc\xb8\x39\x10\xcd\x4a\xad\x52\x28\x05\x60\x05\xe1\xf1\x36\x46\x9c\xf3\x54\x0c\x91\xb4\xec\xe0\x45\xbc\x44\xe4\x4e\x64\x0f\xcd\x75\x3c\x00\x7f\xaf\xb9\xd1\x09\xeb\x83\x88\x8d\x1b\xa9\xf2\x50\xff\xdf\xdd\xd4\x14\xb9\xb1\xff\x35\xe6\x65\xa6\xec\x2d\x34\xf7\x4c\x33\x57\x7e\x70\x23\x9e\xb0\x77\x8a\x35\x9b\xca\x26\xad\x42\x4b\xba\x79\xa0\x0a\xb7\x14\x5a\xaa\x7a\x68\xdb\x3d\xa1\x42\x7b\x8d\x49\xa0\x34\x8e\x34\x86\xe6\x6e\x17\x58\x26\x6d\x09\x00\xea\x10\xaf\x74\x33\xf5\x34\x17\x39\x9f\xb2\x6f\x15\xe8\x1c\xbf\xbe\x13\xa6\xf4\x08\xdb\xd5\x2e\x6b\x3c\x61\x07\xf7\x75\xb7\x6f\xa5\xca\xf5\xad\x1d\x37\x37\xfa\x1d\x0a\x8d\x89\x27\x2a\xe3\x93\x15\xce\x49\xb5\xb0\xdd\xfc\x28\x2f\x8a\x11\xf0\xf5\xbb\x12\xa4\x69\xb7\xbb\xe9\x8f\xbf\x9d\xc0\x4b\x7c\xa1\xc4\x43\x88\xf8\x8c\x98\x70\xa4\xa6\x5b\xb7\xf1\x19\xbb\x12\x8e\x09\xf0\xb7\x7d\xc2\xf1\x43\x63\x51\x5a\xfe\xd4\xf8\x8f\x70\x92\x17\xd7\x15\xb5\xdd\x1f\xdb\xbc\x78\x5f\xbf\xbc\x3e\xeb\x0b\x4e\xf3\x3c\x6e\x97\xc2\x60\x6c\xe5\x25\x33\x9e\x97\xd2\x5a\xfa\x83\xbb\x1f\xb7\x62\xb6\xd4\xfa\x86\x1d\xc5\x42\xc5\x85\x74\xcb\x7a\x36\xcd\x74\xd9\xa9\x59\x9c\x58\xb9\xb0\xa7\x41\x31\x4d\xfc\x7a\x51\xcb\x97\xe0\x4b\x54\x21\x55\x80\x37\xc2\x33\x83\x72\x96\x69\x7a\xe7\x70\xd6\x2e\x49\xd6\xac\x36\x9c\xf8\x14\x63\x0b\x3d\x8e\xb1\x16\x67\xc7\x46\x5e\xa6\x51\x7d\x01\x39\xfc\xbd\x7a\x8f\xdb\x87\xfe\x32\xa9\xf7\xc0\x07\x0e\x7e\xe2\x7a\x61\xcf\x44\xe4\xa5\x0b\x4f\xeb\xfe\x37\x12\x24\x6e\x9c\x94\x90\x05\xba\xdf\x0c\x7c\xc4\x34\x8c\xb8\x13\x80\x6d\x08\x22\xd3\xc2\xf2\xe8\x41\xb4\x28\x89\x0e\xde\x21\x41\xf4\x26\x52\xa2\xc1\x3c\x24\xc8\xdc\x2c\xd6\x1b\x05\x31\xc1\x3e\x22\x6a\x82\xfd\x6c\xe4\x44\xc2\x0f\xf4\x1d\x96\x91\xbc\x00\xf6\xfe\x57\xd2\x44\x85\xfe\xd1\x1c\x17\x36\x9a\xf3\xc2\xd2\x2e\x7e\x60\xf6\x1d\xa5\xfb\xf5\x75\x47\x56\x52\x24\x1f\xf1\xa1\x7e\x47\x91\xdf\xbd\x61\x4d\x2e\xd6\x91\xa3\x5e\xfe\x8b\x76\xd6\xfd\x11\x6c\x7d\x7c\xa5\x91\x06\xa6\x43\xfa\x4e\x90\x19\xda\xdf\xe6\xcc\x07\xac\x45\x4c\xe2\x97\x55\xe1\x3d\x97\xde\xec\x89\x33\x06\x89\x9d\x06\xdb\x27\xcd\xf2\xa4\xf4\x01\x0f\xb4\xf9\x27\xec\xbf\x6b\xeb\x18\x6f\xaa\xef\x23\xf7\x33\xec\x24\x41\x78\xa4\xa5\x86\x52\x92\x8c\xab\xa6\xf5\x93\xd3\xf1\x0d\x82\x20\x35\x97\xf3\xb9\x88\xfc\x03\x33\xc1\x2a\x6e\x78\x29\x1c\x54\x86\x51\xe1\xc4\x33\xb1\x90\x58\x9e\xad\xe7\x8c\xfb\x05\x3d\x3c\xb4\x2d\xa1\x30\x45\x7f\x40\xd1\xb7\x74\xac\x94\x8b\xa5\x83\x4b\xce\x38\x2b\xb4\x5a\x00\x6d\x24\x0d\x4d\x5b\x68\x9e\x33\xd0\xf5\xda\xb0\x5b\x6e\x4a\xc6\x59\xc6\xb3\x25\xc0\x94\x49\xe0\xc5\xbc\x36\xd0\xb9\xdb\x09\x9e\xaf\x27\xd6\x71\xe7\x63\x5d\x81\x14\x42\xb8\x73\x04\xa9\xd9\x16\x7d\xe1\x03\xa3\xa2\xdc\xf7\x70\x0f\x63\xdf\xc3\xfd\xe7\x8e\x7d\x0f\xf7\x9f\x3d\xf6\x3d\xdc\xf7\x3d\xdc\xf7\x3d\xdc\xf7\x3d\xdc\xf7\x3d\xdc\x37\xc6\xbe\x87\xfb\xbe\x87\xfb\x4f\x8c\x7d\x0f\xf7\x0f\x0b\xbc\x6f\x20\xd6\x2f\xa3\x3f\xcb\xbe\x87\xfb\xbe\x87\x7b\x6f\xec\x7b\xb8\xdf\xb7\x6b\xb1\xef\xe1\xbe\xef\xe1\x1e\xc7\xbe\x87\xfb\x80\xb1\xef\xe1\x3e\x6c\xec\x7b\xb8\x7f\x70\x3c\xb0\xae\x6e\xfb\x1e\xee\xfb\xae\x6e\x3f\x57\xce\xc3\xeb\xea\xc6\xf6\x3d\xdc\x69\x63\xdf\xc3\x7d\xf8\xd8\xf7\x70\x1f\x36\xf6\x3d\xdc\x87\xcb\xdc\xf7\x70\x6f\xc7\xbe\x87\xfb\xbe\x87\xfb\x67\x7a\x74\xf7\x3d\xdc\xf7\x3d\xdc\x77\x8f\xfd\x1b\xc1\xbe\x87\xfb\xb0\xb1\xef\xe1\x4e\x17\xba\x8f\xf6\xe9\x72\x1e\x5e\xb4\xbf\xef\xe1\xbe\xef\xe1\xfe\xc1\x91\xe2\xba\x59\x97\x4b\x42\xf3\xbe\x8f\xc3\xce\x1f\xd0\xb2\x1d\xc6\xc3\x59\x3d\x9f\x0b\x03\x6e\x37\xcc\x94\x94\xb8\xd9\x5d\xff\x3e\x8d\x15\x00\x14\x99\xe8\xf8\x59\xe1\x4e\xa0\x91\x80\xc5\x9a\x64\x98\x22\x0d\xf0\xd8\x9f\x62\x20\x7e\x84\x96\x75\x46\x58\x5a\x7c\x2d\x15\x3b\x7f\xf5\x7c\x3a\x42\x63\x82\x14\x4e\x5f\x58\x93\x57\x2a\x4b\xad\x83\x69\x0f\x59\x1a\xbf\x66\xe4\xd6\x0c\x67\x2d\x2b\xb4\x45\x6c\x2d\x6e\x5e\xb6\xe4\x4a\x09\x4a\xed\x07\x2a\x44\xe9\x20\xed\x36\x13\x42\x31\x5d\x09\x85\xa5\xa6\x9c\x59\xa9\x16\x24\x1e\x03\xee\x1c\xcf\x96\x53\xff\xfd\x2a\x1e\xb0\xd0\xd3\xb0\x99\x35\xe5\xaa\x39\x23\x78\x89\x07\xcd\x88\x92\x4b\x9c\x2e\xe3\x99\xd1\xd6\xb2\xb2\x2e\x9c\xac\x12\x26\xcc\xac\x80\x0a\x66\x8b\xe5\xf4\xf1\x10\x30\xd2\x75\xb3\x02\xc1\x9e\xc0\x20\xdf\xac\x41\x58\x5e\x92\x0b\xd6\x5e\x35\x08\xe0\x4f\xa0\x9d\x75\x59\xb9\x35\xd6\x1a\x11\x2f\xf0\x5c\x1a\xeb\x58\x56\x48\x88\xe0\x60\x1d\x04\x58\x32\x98\x33\x05\x01\xcc\x55\xee\x25\xab\xb0\x47\x36\x6c\x92\xca\xc1\x01\xad\x48\x0e\x3f\x54\xbc\xc4\x92\x2a\x11\xa7\x9b\x4b\x1b\x02\x0a\x4b\x9a\x68\xec\xe9\x83\x97\x2b\xee\x11\x5c\xaf\x9c\xd8\x9c\x22\x7e\x73\x10\xd2\x99\x72\xc2\xfd\x87\x36\x3c\x21\x2b\xde\x98\x00\x6c\xa0\x13\x15\x24\xe9\xfb\xb7\xeb\x5c\x63\x4b\x06\x30\x10\x04\x91\x1d\x93\x02\xd7\x54\x89\x95\xb7\x5e\x22\x13\x72\xe5\x9d\x70\x82\xc8\x9d\xf6\xe0\x93\x9a\x03\x27\x4c\x29\x15\xd4\x43\xbd\x14\xd6\xf2\x85\xb8\x22\xbd\x7e\xbf\x2f\xb6\x86\x07\xf0\x78\x18\xc9\xd7\xb8\x40\xb6\xae\xc6\xb9\x6d\x4b\x10\x0e\x49\x95\x97\xed\x47\xb3\x12\xbf\xba\xa1\x1c\xb9\x35\xd2\x39\x41\x72\x6c\x2c\xf6\xfc\x02\xe0\xd0\x26\x1f\x24\x6d\xa2\x9d\xf2\x0a\xf6\x32\x4e\x14\x27\xe8\x7f\xce\x3b\xa9\x8a\xc6\x74\x88\x28\xa7\x99\x91\x62\xce\xe6\x12\xaa\x18\x00\x6f\x7f\x82\x3d\x26\x38\x65\xb6\x5c\x31\x6e\xad\x30\xb0\xae\x01\x6f\x1d\xd7\x77\xca\xbe\x23\x97\x70\x3a\x53\xab\x8c\xb7\x1d\x5b\x91\x9f\x49\xce\xd9\x02\x90\xfd\x14\xad\x03\x1d\xa2\x7f\xf7\xe8\x8f\xbf\x67\xb3\xb5\x0f\x34\x00\xcb\xe2\xb4\xe3\x45\x9c\x30\x41\x68\x21\xd4\xc2\x9f\x76\x34\xd9\x7d\xb6\x9e\x84\x0a\xd6\x42\x96\xd2\x61\x59\xe9\xe3\x2f\x6e\x66\xbd\x98\x8c\x20\xf1\x34\x17\xab\xd3\xce\x0d\x98\x14\x7a\x31\x65\x4f\x63\x4d\x23\x41\x62\xac\x82\xa4\x16\x2a\x92\xc2\xfc\x1d\x8a\x0b\xfa\xca\x27\xaa\xae\xd8\xbe\x87\x2d\xf5\x2d\xf6\xf4\x6b\x7f\x87\xb0\x34\x51\xbb\xb4\x75\x87\x95\xae\xea\x02\x8b\x46\x9f\xd3\x98\xb4\x40\x53\xd5\x56\x6c\xd2\xba\xbc\x47\x97\xd3\x94\x43\x9c\xe6\x46\x20\x84\x4a\x22\x61\x21\x74\xe0\x44\x08\xaf\x4b\x4d\xff\x9d\xda\x90\x2a\x1f\x9f\xf3\xa2\x98\xf1\xec\xe6\x8d\x7e\xa1\x17\xf6\x95\x3a\x37\x46\x9b\xde\x0a\x51\xee\x31\xf7\x5e\xe3\xb2\x56\x37\xd0\x3a\xba\xf9\xf8\x42\x2f\x98\xae\x5d\x55\x93\xa2\xbf\xf9\xe6\x71\x6a\xd6\x84\xc8\xa8\xd6\xb8\xc8\xc1\x29\xed\xcc\x54\xdc\x49\xda\xd3\xc7\xad\xf4\x0a\x4c\x31\xe1\xd7\x11\xb5\x62\xfb\xd5\xb4\x60\xa1\xa3\xbe\xbe\x78\xf4\xbb\x3f\xa0\xc2\x65\xda\xb0\x3f\x3c\x82\xa2\x4c\x92\x7b\x0b\xae\x00\xf8\x5f\xd2\x32\x5b\xf2\xa2\x10\x26\x55\x31\xfa\xeb\xd8\x51\x84\x8d\x5a\xfb\xa4\x5a\xcd\xa5\x2a\xb0\x8f\x98\xfc\x79\xf3\xe6\x6f\x90\xf9\x91\xce\x8a\x62\x4e\xf2\xca\x0b\xab\xdb\xae\x9b\x87\xe0\x4c\x1f\x06\x5f\xc4\x47\x93\x14\x15\x70\xbf\xe9\x94\x95\x2e\xea\x52\x3c\x13\x2b\x99\x51\x9e\xb5\x7a\x5b\xd7\x93\x45\xaf\x7c\x2e\xa4\x85\xb6\x48\xb3\x42\x67\x37\x2c\x0f\xe2\x5a\x58\x3b\xc5\x0b\x59\xa7\xb2\x9b\xa7\x14\x21\x90\x8b\x0f\xde\xbb\xba\x6d\xe9\x00\x29\xc1\xcb\x59\xc9\xab\xaa\xe1\xd3\x30\xfc\xb6\xb7\xd8\x24\x99\x5e\xf3\x02\x85\x69\x12\x85\x7c\xe2\xe3\x70\xca\xd3\xf0\x24\x7c\x3d\xd1\xe7\x20\xd7\x25\xa4\xbe\x2a\xb7\xb3\xa6\x3e\x7c\xf5\x8e\x59\x2b\x2e\x95\xbb\xa0\x02\x19\x58\xb4\x3e\x52\x97\xb3\x0e\xe9\x10\xce\xb3\x09\x7b\xfd\x81\x4e\x20\xec\x72\x9a\xfa\xe8\x98\xfc\xd2\x97\x52\x05\xd2\xdb\x39\xd5\xbc\xa9\x96\xdc\x91\x92\x15\x38\xba\xfc\x79\x9c\x55\xc2\x58\x69\xbd\x8f\xfe\x16\x14\xd0\xd3\x82\x4b\xea\xc3\x59\xf3\x78\x52\x69\xea\x56\x25\x2c\x37\x2a\x50\x68\x91\x9d\x6a\xe9\xae\x74\x1e\xc4\x81\x61\x82\xb4\x09\xe9\x45\x65\x2b\xcd\x92\x4a\x49\x31\x9a\xfb\x77\x9f\xa6\xee\x6d\xbb\x53\xe9\x96\xce\x4b\x69\x4c\x1d\x4a\x0e\xc6\x8a\x28\xf1\xf3\x35\x70\xb0\x16\x9f\x9b\x7d\x6b\x26\x3d\x8a\x92\x04\xc3\x16\x7c\x95\x14\xe3\xd6\xc6\xaa\xed\x4b\xc5\x52\x04\xa5\x40\x96\xda\xa6\x59\x42\x26\x76\x1a\xc0\xa2\x8a\xdc\x2f\xb9\x99\x2a\x3b\x7c\x72\x78\x6f\x46\x0e\x37\xd1\xe8\x8a\x2f\x20\x77\x30\xca\x5e\x6e\x0a\x4d\x40\x78\x61\x5a\x43\x58\x48\x9b\x81\x5c\x2a\xc9\x20\x8e\x2a\xcc\x4a\xe4\x2d\xbb\x38\xf4\x0c\x48\x28\xbf\xef\x1c\xb9\x90\x30\x41\x4e\xc4\xdb\x84\xba\x68\x6e\x74\xad\xf2\xf0\x1a\xdc\x40\x10\x5e\x6e\x2c\xec\x25\x9d\xc1\x0c\xd2\x3c\xb1\xa3\x8a\x0f\x71\xa1\x50\x52\x5a\x36\x13\x8e\xde\xaf\x44\x2a\xf6\x78\xfa\xf8\xd1\xe7\xef\xb3\xc1\x9a\x8c\xe4\xb3\x5d\x36\x3e\x1b\x5a\xb9\x7b\x5b\x1d\x23\x78\xfe\x4a\x15\x84\x4c\x10\x8e\x7e\xbd\x41\x78\x92\xf2\x42\x27\x5a\x25\x70\x4d\xc8\xd8\x33\x1e\x44\xdd\x1a\xe9\xc2\x0d\xba\x95\x09\x85\x6a\x47\x90\xb4\x61\xda\x74\xd9\x7d\x8f\xdb\x5c\x5e\x42\x48\x42\xcd\x07\x85\xff\x3e\xb1\x71\x36\x63\xb6\x9e\x3d\x38\xbb\x8b\x06\x16\x95\xea\xae\xf7\x54\xfa\x7a\x07\xc9\xdb\x26\x98\x2c\xb1\x8b\x3d\x3c\x38\x60\x47\xf8\x0b\x87\xc8\x66\x77\x7c\x6f\xd7\x33\x6c\xeb\xf9\x5d\x45\x6e\x6d\xd8\xdb\xda\xf3\xbb\x8a\xab\x5c\xe4\x18\xf0\x27\xb8\xd6\x2c\xf2\x39\xef\xda\xe3\x74\xb3\x79\x68\xfb\x7b\x4c\x96\xd8\x75\xcf\xfe\x22\x96\x7c\x25\x80\xf3\x4f\x16\xdc\x24\xa8\x27\xa7\xd9\x35\xee\x0c\x9b\xd5\x8e\x09\xb5\x92\x46\xab\x52\x24\x70\xa6\xaf\xb8\x91\x7c\x56\x08\x66\x04\x70\xf2\x66\xc2\xb2\x5f\x1f\xbd\x3d\x7b\x0d\x30\x6b\x7a\x67\x06\x6e\x04\x13\x71\xd7\x6b\x0b\xe5\xb9\x23\xdd\xc2\xce\x67\x4f\x37\x2e\x10\x5d\x45\x6f\x5c\xbc\xb8\xce\xfe\x06\xd0\xd7\x40\xe5\xcd\x7e\xf9\xf5\x28\x6b\x57\xf3\x02\x68\x1f\xb3\xa2\xb6\x72\x75\x1f\xf6\x37\xd0\x70\x3e\x93\x84\x9b\xbd\x41\x5f\xda\x5e\x9a\x2d\x6e\x4f\x22\x3b\x36\xb8\x97\xe3\x35\x36\x0f\xc0\xcb\x43\xdb\xb4\x8f\xea\x76\xdd\x21\x3f\xca\x05\x46\xe8\x99\xe8\x74\xab\x63\x64\xa3\xd5\xfa\xec\xd0\x0d\xe0\xfe\x9e\xe7\x94\xce\xc5\xd0\x6e\x11\xfd\xc2\x97\x20\x00\x5b\xd8\x76\x08\xe3\x6c\xb6\x14\x79\x3d\xf0\x05\x18\x99\xd2\x75\xce\xb4\x72\x9a\xf1\xa6\xdb\x14\xcc\x13\x60\x74\x72\xf0\x73\xad\xd2\x6a\x02\x0f\xca\x78\xb6\xe2\xbc\x4c\xe4\x63\x8d\x7f\x31\x4c\x6a\x7f\xa6\x90\x7e\xf6\x73\x3c\x61\xdc\xda\xba\x44\xd5\x37\x90\x33\x54\x3a\x36\x97\x0e\x70\x83\xba\x36\x99\x88\x59\x1d\xaf\xf4\x06\xf1\x64\x91\x4f\xc2\xb5\x28\xe0\x2a\x93\x4f\xc3\xe1\x65\x47\x0a\x1e\x09\x1b\xfe\x34\x68\x29\xc2\x95\x0b\x85\x40\x80\x42\x6e\x8a\x81\x35\xbc\xb9\xcf\xe5\xb0\xc5\xd5\x8a\xf1\x70\x8a\x9a\xf9\x75\x7e\x05\xc2\xac\x81\x9d\x32\xbd\x34\x20\x9c\xe7\x33\x51\xd8\xcd\x09\xce\xda\xa3\x36\xcc\xa5\x00\x4a\x9c\x70\x9c\x06\x17\x92\x44\xe5\x04\xf1\xf9\x29\xb7\x56\x2e\xd4\xa4\xd2\xf9\xc4\x4b\x3b\x1d\x82\x64\x22\x66\x24\x79\x1e\xf9\x83\xaf\x88\x09\x3e\xd2\xe9\xd5\x2b\x61\x96\x82\x0f\x4a\x80\x6e\x60\x3b\x83\x04\x66\x44\x65\x84\x05\xf0\x11\xf2\xdf\xe1\x6d\x1c\xb6\x87\x51\x18\xb7\x56\x67\xc0\x5f\x81\x18\x14\x53\x63\xc3\x02\x3e\xf8\xad\xc3\x1f\x2f\xce\x16\x72\x25\x54\xec\xd9\xf8\xb4\xe0\xd6\xf6\x12\x28\x83\xd1\x78\x33\xc1\x78\xed\x74\x83\xde\x62\xdc\xb5\x6d\xc1\x10\x64\x3d\x1b\xe6\xbb\xfa\x35\xeb\xce\xaf\x23\xce\x5b\x3d\xa3\x01\xd3\x32\x48\xe4\xc5\xfc\xe7\x49\x1d\xa6\x6d\x2d\x13\xca\x7b\xc1\xf9\x49\xbb\x5d\x65\x48\xaa\xb6\x2d\x74\x06\xc9\xbc\xd2\x39\xcb\x00\xbc\x19\x2d\x61\x80\x60\x76\xa7\x3e\x48\xe2\xae\xcf\x8c\xd5\x14\xfe\x66\x76\x7e\x72\x90\xdc\x38\xbd\xa0\x03\x7d\xb0\x82\xa9\xc3\xe6\xe0\x16\x46\xf0\x7c\xd8\xd6\x5b\xe1\xc0\x46\xf7\x36\x4a\x76\xfb\xfb\x0e\x46\xe8\xa3\xf5\x68\x5c\x2d\xe8\x12\x54\x89\xec\x84\x35\xd7\x95\x72\xe4\x63\xa1\x47\xd3\x24\xa8\xd3\x6c\x15\xfd\x4f\x63\x84\xad\x34\x34\x3e\x1e\x24\xbc\xfb\xe9\x27\x6d\x1a\xc9\xdb\xf6\x4e\x0d\xcc\x20\x91\xb5\xf2\xd3\x85\xdc\x6e\xcb\xf8\xfd\x2f\x61\x74\xd7\x38\x0c\x92\xd8\x69\xd5\x37\xbd\xf9\x03\x58\x11\xa1\x96\x5c\x65\xe8\x6a\x9c\xde\x88\xca\x9e\x5a\xb9\x40\xa3\xf1\xc5\xa3\xc7\x7f\x7c\xf4\xc5\x17\xbf\x07\x33\x12\xcf\xc7\xb4\x1c\xb6\x8f\xfd\x24\x2f\x2f\xaa\x25\x9f\x40\xff\x78\xff\x31\x7a\xce\xbe\x69\x6c\xda\x20\xb1\xab\xc7\xd3\xc7\xbf\x3f\x61\x81\x60\x1f\xba\x6a\x2c\xb5\xd2\x06\x31\xd5\x48\x28\x37\xd4\xaf\xe3\x2e\x28\x86\x78\xe0\x9a\xa3\x36\x17\xdc\xd5\x46\x0c\x02\x04\xdf\x9b\x19\xad\xb8\x73\xc2\xa8\x27\xec\xbf\x8e\xde\xfd\xf6\xc7\xc9\xf1\x57\x47\x47\xdf\x3f\x9a\xfc\xf1\x87\xdf\x1e\xbd\x9b\xc2\xbf\xfc\xe6\xf8\xab\xe3\x1f\xe3\x1f\x7e\x7b\x7c\x7c\x74\xf4\xfd\x37\x2f\xbf\x7e\x73\x75\xfe\x83\x3c\xfe\xf1\x7b\x55\x97\x37\xf8\xa7\x1f\x8f\xbe\x17\xe7\x3f\xfc\x4c\x21\xc7\xc7\x5f\xfd\x7a\x98\x82\x1b\x5e\x9a\x9d\x52\x8e\x9d\x50\x82\x3d\x5a\xd9\x75\x65\x84\x8f\x47\xa4\x56\xc3\xa1\xdd\xfd\xe4\xe9\x86\xa0\xd8\xe5\x10\xff\x34\xd8\xbb\x88\xf3\x52\x0b\xef\x9c\x58\x74\x58\x0a\x7d\x0b\xa5\x46\x52\x1b\xe9\x06\x86\xf8\xaf\x14\x3c\x3c\x5c\x8a\x95\x30\x27\x71\xb6\x2f\xbc\xc0\xab\x28\x8f\x96\x0f\x77\x7a\xa7\xb4\xd0\x4b\xcf\x5b\xa1\xc1\x2d\x90\x7a\x0f\x50\xa8\x9a\x4e\xd8\xa2\x5b\x9d\x71\xa9\xd5\x55\xb3\x42\xf1\x27\x87\xfd\x06\xea\x8f\x89\x17\xfb\xd1\xe3\xb9\xb8\x65\xe4\xd3\xf5\x06\xaa\xed\xc3\xca\x82\x99\x9c\xb2\xb7\xdc\x48\x3d\x10\x28\x8f\xa0\x15\xe8\xa8\xa6\x15\xb8\xd5\x08\x61\x6f\x0c\x02\x44\x73\x03\xfd\x02\xd7\x9d\x5c\xc3\x99\x11\x5f\x2c\x49\xbb\x73\xd6\xb8\x5a\x4f\x5b\x57\xab\xeb\x25\x4a\xe7\xaf\xc8\xca\x7f\xc2\x30\x03\x6e\x85\x89\x95\xdb\xd8\xfe\xba\xf3\xf5\xe8\x1f\xd2\x3a\xf1\x76\x5c\xc2\xe8\xc0\xdb\xee\xc2\xc2\x4f\xc6\xb5\x00\x97\xe4\x92\x0f\x7d\xff\x03\x32\x5c\xb9\x88\x25\xd1\x70\x0e\x30\x91\xd2\xf9\x5b\x8a\x7a\xa0\xea\x70\x1a\x0b\x41\xb5\xb9\x0a\xe4\x6b\xd1\xef\x40\xd8\x34\x4a\x1c\x9c\x08\xac\x74\x7e\x68\xdb\x95\x63\x07\x78\x4f\xc0\xe7\x9a\x64\x46\x3a\x99\xf1\x62\x58\x72\xdb\xbb\x41\x51\x4c\x56\xd4\xd6\x09\xd3\x4a\x82\x6c\xb4\xbb\x1d\x86\x33\x80\x2f\xe5\x05\xbb\x11\xeb\x5b\x6d\xf2\x18\x2e\xc4\xaf\x6e\xcf\xc1\x40\x2e\x99\xf0\xd9\x52\x04\x2b\x83\xdd\xcc\x4c\x29\x0c\x9b\x89\xf8\x6e\x90\x20\x78\x3d\x65\x67\x6a\x1d\x80\x10\xaa\x4b\x2a\x13\x3c\xfd\x61\x11\xc3\x1a\x43\x2c\x0c\xdc\x7b\x17\x2a\x78\x76\xf0\x15\xc3\xfd\x4c\x3f\xb3\xe9\x7b\x72\xe0\x95\xce\x9b\xaf\x19\x96\x3b\x0b\xe9\xee\x98\xfe\xd6\x86\x61\x43\x1f\xd0\x92\x46\x20\xab\xc4\x20\x91\x41\xd4\x47\xb7\x59\x3e\xe4\x94\x4a\x58\xfb\xb5\xbf\x52\xf4\x5c\x4e\xff\x8e\x72\x88\xbb\x82\xe4\x41\xdf\xbd\x80\x9b\x1d\x17\x54\x78\xe5\x87\xd8\x1d\xef\x2d\xe9\xbc\x95\x3a\x4c\xa7\x9e\xc1\x7f\x0c\x15\xe2\x3c\x5f\x63\xcf\x49\x3f\x49\xe9\x3a\xa5\x2d\x03\xf3\x04\x46\x04\x69\x67\x97\xcf\x62\x8d\x26\x86\x10\x96\xd8\xb8\xb8\xe9\xff\x10\xbe\x31\xac\x06\xa4\x0a\x42\x13\x2b\xf1\xcf\x9a\x0f\x0b\xbe\x9d\x66\x07\x6f\x4c\x2d\x0e\x76\x25\x36\x3f\x1c\x8f\x0a\x77\xab\xcd\xcd\xe9\xa3\x47\x8f\xfe\x13\xc2\x51\xf8\xe4\xff\xf1\xc5\x5f\xfe\xc7\x17\x7f\x99\x96\xf9\xf0\xb8\x6c\x28\x9a\x95\x80\x63\xdd\x04\x08\xbf\xee\x9e\xf1\xb8\xdd\x43\x1f\x46\x71\x63\xc2\xe3\x2d\xf0\x84\xc1\x91\x6a\xf6\x9c\x90\x70\x25\x60\x4f\x69\xa8\xd3\x49\x3b\xcd\x37\xeb\x6a\xa0\xd1\x24\x83\x46\x7b\xbf\x99\xfe\x0a\xda\xca\xc2\x7d\x20\x95\xeb\x6b\x44\x0d\xa3\xac\x0e\x06\xfe\xd0\x12\x77\x12\x07\x14\x4a\x81\x59\x85\x57\x0d\x30\xa7\xeb\x8a\x5c\x40\x36\x58\x87\x03\xeb\x45\x62\x68\x7b\xf8\x1a\xc5\xb0\x0a\x23\x5b\xc8\x7e\xf7\x2a\xcf\x07\xda\xc4\x88\x30\xc2\x28\x21\x44\xa6\x67\x40\x7d\x74\xc2\x5e\xa9\xe7\x58\xab\x3b\xec\x79\x18\x02\xdb\x96\xe8\xc2\xe9\x20\x70\x54\xfa\xaf\xd3\x5f\x85\x15\x9d\xe0\x52\x0c\x57\x72\x43\x37\xb0\x93\xc2\x4c\xf2\x94\x0f\x5f\x6f\x48\x0a\x57\x65\x28\xd8\x95\xf7\x13\xca\xc1\xe3\x0a\xdb\x09\xaf\x64\x68\x34\x86\x99\x76\xa3\xeb\xea\x24\xf8\xb3\x2d\xb8\x2b\x36\xba\x36\xb5\x1a\x4e\xda\x05\x47\x0b\xdd\xb9\xfe\x94\x9b\x17\x5d\xb8\x90\x83\x5f\x9a\xb1\xee\x26\x67\x19\x66\x95\xa3\x77\x88\x6c\x2d\xf8\x58\x61\x6a\x35\xf8\x4d\x05\x13\xcb\xda\xb0\xce\xeb\xf8\x41\x21\x16\x3c\x5b\x1f\xd0\x5f\x2c\x7a\x68\x8b\x18\x2f\x58\xc6\x15\xb0\xce\xca\x4c\x3a\xfc\x8e\xc1\xf7\x17\xea\xb7\xa1\x30\x1c\x7c\x78\x54\x9a\xe0\x46\xd7\x96\x10\x7f\x45\xf7\x38\x12\x75\x2d\xb9\xca\xa1\xda\x9a\xe4\x98\xe8\x5c\x9c\x06\x49\x13\xf8\x3c\x52\x82\x1c\x1e\xcc\x67\xc2\xf1\x98\x2a\x4a\xcf\x8e\xff\x8e\x90\xad\x1e\xa8\x30\x1a\x44\xc5\x88\x71\x75\xf7\x8c\x0f\x7d\xdd\xc9\xa5\xad\xe0\x9e\xe1\x23\x40\x14\xda\xce\x73\xf0\x4d\x79\x4f\x78\xd6\x44\x5a\xcd\x0f\x0e\x0d\x2b\xe3\x21\x24\x4d\x8d\xb6\x59\x22\xab\x21\x7a\xd5\xca\x89\xbb\x41\xf4\xb7\x7d\xe5\x7e\xdd\x17\xc4\x96\xba\xc8\x01\x11\x83\xc9\xd3\x81\xaf\x7c\x28\x8b\x71\xe7\x8c\x9c\xd5\x3e\xce\xe0\x2a\x87\xe6\xc9\xe1\xe9\x73\x38\x1c\x2c\xe4\xda\xec\x94\xb5\xb4\x4d\x5d\xe4\x20\xe8\x92\x29\x63\xd7\x62\x20\x46\xc9\x3b\x7d\x9d\xb5\x00\xdf\x24\x6e\x24\xe4\xc7\xfc\x9d\x1d\x24\x52\xf0\x6c\x19\xd2\x81\x9f\xe0\x6d\x89\xea\x44\xcf\xed\xd7\xde\x68\x0e\x75\x9e\x7b\xc7\xe6\xe0\xac\xc9\x29\xd9\xba\x0a\x2c\xe4\x03\x63\x48\x16\xcd\x37\x6a\x7f\x5e\x55\x85\xc4\x82\xcb\x04\x0f\x91\x61\xc4\xcb\xd1\x88\x5f\xeb\xb2\xc1\x1b\xfb\x55\xb6\xd8\xbe\x70\xb8\x07\xbd\x14\xa0\xbc\x0b\x7c\x70\xce\x96\xc0\x95\x0c\x0f\xed\xb7\x7e\x8a\x4b\x59\x0d\x96\x09\xd9\x6e\xee\x9a\xe9\x01\xd4\xc8\x8b\x8b\x2f\x15\x83\x25\x56\x3a\x7f\xc2\xde\x29\xf6\x18\x93\xd1\xfa\x16\x20\x2a\x5f\x5f\x3c\x8b\x1a\x8e\xf4\xdd\xcf\xaf\xe1\xb8\xb0\x2f\x50\xaa\x15\x6e\x21\x73\x36\xc3\xe6\xe5\x56\x0c\x87\x2f\x1f\x29\x71\x8b\x65\xb0\x01\xf1\xd0\xbc\xd7\xaf\x62\xf9\x26\x81\x8b\xaa\xbb\x78\x61\xca\xc7\xec\x4b\x9c\x73\x25\x0c\x25\x2f\x0f\x62\x25\x96\x8a\xb1\x57\xaf\x0f\x23\xf6\xe7\x76\x62\x6e\x27\x93\xc9\xc4\xaf\xf5\xc5\x30\x0d\xc1\x22\x10\xe0\xa4\x77\xa6\x1a\x17\xb0\xd4\xb9\x9c\x0f\x07\x99\xf7\x4e\x22\xa8\xdc\xf6\x93\xc1\xf3\xe0\x6a\xb8\x50\xdc\x8d\xe9\x50\x60\x76\x0a\x41\x71\xe7\x51\xe0\xf7\xbf\xa3\x28\xb5\xa7\x70\x33\x69\x54\x5b\x7d\xbb\xb8\x43\x60\x48\x3a\x0f\x57\x48\x33\xb1\xe4\x2b\xa9\x81\x46\x1b\x74\x07\x14\x2c\x77\xf7\x6b\xf8\x5d\x6f\xf6\x37\x3e\x9b\x85\xcb\x13\x7a\x30\x41\xfa\x7d\xb0\x54\x71\x57\x69\xec\x2c\x0a\xb4\x0e\x57\x3a\x4f\x83\xa5\x31\xc0\x41\x16\x6b\x50\xee\x6b\xaf\xe3\x7a\xca\x38\x44\x6d\xd8\x0b\x63\xb0\xe0\xb0\x43\x6c\xc6\xfd\x94\x9b\xe5\x3c\xda\x38\xfe\x84\x4a\x9c\x8b\x70\x23\x21\x47\xaa\x34\x13\xf3\xb9\x0f\x55\xb5\x62\xa2\x5a\x8a\x52\x18\x82\xa5\xeb\x7d\x78\x20\x31\x7c\xe2\x3d\x26\xe3\x95\x01\x42\xab\x4a\x5e\x0d\x3f\x5c\xfe\x73\xc1\x07\xca\xa5\x99\xb2\xb7\xbc\x90\x79\x74\x5f\xbc\xde\x3a\x78\xa5\x5e\x6b\xed\x5e\x4a\x0b\x41\xeb\xf0\x32\x0b\x78\x8d\xc2\x84\xc8\xc1\xae\x47\x8e\xf8\xbf\x0d\x37\xd3\xa1\x72\x74\x28\x2f\x1f\x19\xf9\x61\x6a\x75\x36\x82\xef\xe3\x2d\x8a\x37\xaa\x4d\x7a\x41\x30\xa1\x9c\x59\x57\x5a\x12\x8a\x79\x36\xa9\x53\x22\x1d\xec\x94\x7d\xeb\xc3\xe1\x10\x8c\x12\x12\x9d\x81\x76\xaa\x81\x52\xbc\xe4\x6b\x24\xb8\x42\xe0\x1c\xc5\xab\xda\x88\x15\x30\x49\x12\x7a\x4c\xcf\x34\x81\x77\x60\x33\xf8\xf0\x67\xed\x0a\x3a\x9a\x75\xff\x7a\x78\xb1\x47\x8b\x08\x6c\xc3\xc6\xed\xf9\x0f\x17\xcb\x6f\x84\x65\x95\x11\x99\xc8\x21\x63\x8f\x58\x71\xee\xe8\xa4\x11\xf7\x63\x2d\xe1\x26\x5c\x6a\xd0\x0c\x49\x77\xe1\xa2\xf3\x6e\x1e\x98\x7b\xe8\x45\x3f\xf0\xb6\xeb\xaf\x14\xb7\x00\xf2\x57\x13\xa3\x35\xa4\x85\x0c\x52\x2f\x9b\x9a\x40\xb6\xbc\xe5\x67\xad\xbc\x8a\x8c\xaf\xde\x50\xb7\x33\x5c\x27\xb6\xf9\x26\x1f\x81\x2a\x5b\x1b\x81\x2b\x20\x1d\xcb\x35\xc1\x45\xf0\x4a\x35\x7c\xfa\xb7\x17\xcf\xd8\x23\x76\x04\xc5\x6c\x0d\x01\x25\x85\x59\x00\x33\xef\x7d\xed\x22\xe7\x71\x8a\x53\xb2\xef\xca\xb4\x09\xcc\xd7\xde\x38\x82\x2d\x0b\x6b\x4a\xf1\xb0\x63\xf6\x25\x34\x0b\x14\xf9\x5e\x55\x7d\x04\x55\x45\xd3\x4b\x94\xf2\x72\xd0\x2d\xdf\x5a\x31\xb8\x46\x71\xcb\xc8\x7e\xfb\x09\x8c\x2c\xb9\x8e\x1f\x1b\xe0\x9a\xfe\xae\x81\x36\x61\xa5\x70\x3c\xe7\x04\xfe\x0b\x34\xd6\x51\xe0\xd6\x3d\xa0\xb4\x0a\xf9\xd0\x3d\x48\x3e\x68\xef\xb9\x07\xed\xb9\x1e\xae\xb6\x7e\xe2\x1e\xe0\xb9\x1e\x1e\x2d\x7d\xfe\x26\xdb\x8a\x17\x52\xd5\x77\x98\x03\x1d\xfc\x6c\xbe\x75\xb7\xae\xcf\x41\x1c\x12\x34\xdf\x91\x88\x6b\x66\x22\xe4\xec\xf2\xed\x9c\xdd\x34\x3c\x4c\x35\x61\x02\x49\x2f\x6e\x35\xe1\x89\x9d\x6e\x90\xf3\x75\xf8\x59\x65\x86\xab\x5c\x97\x5b\x5f\xef\x0f\x85\xe0\x04\x82\x96\x4e\x3f\xb6\x1d\xb7\x75\xe7\xed\x1b\x7e\x1f\xde\x7f\x5b\x3f\x37\x2b\x34\xda\xed\x23\x31\xac\xa5\x50\x95\xc1\x63\x48\x32\xf3\xdd\x0b\x28\x95\x91\xb6\x39\x80\xc3\xdf\x58\x9a\x09\xf1\x99\x28\xb6\x32\xe7\x89\x34\xb8\x89\xf4\x23\x46\x17\x24\xde\xa4\xde\x1a\xbd\xd6\x45\xa8\x42\x8f\x8b\xe4\xc5\xfe\x62\xd6\xc8\x91\x70\x4b\x9b\x1a\x7c\x5d\x6d\xac\x91\x1b\x0a\xc1\x8a\xe3\x21\xae\x51\x4d\xf0\x1e\xd9\xe6\x1a\x79\x17\xb4\xbf\x46\x5e\xec\x2f\x62\x8d\xac\xc8\x32\x5d\x56\x57\x46\xcf\xe5\xf0\x1b\xb7\xe5\x0b\x04\x71\x4c\xa3\x6f\x41\xf1\x05\x6a\x2b\xb6\x58\xb8\x2d\x3e\xeb\x20\xbf\xc2\x27\x54\xf3\x54\x12\xcd\x09\xe5\x12\x25\xd9\x14\x9d\xf1\x62\xa9\xad\x23\x6e\x24\xdb\xdc\xcc\x4d\x81\x6d\x59\x03\xe9\xd8\x73\xff\x75\x20\xa7\x53\x57\xcb\xb1\xdf\x11\x91\x8e\xb1\x69\x8f\xd3\x87\x6a\x85\x67\x3a\xfc\x35\x92\xe0\x58\x17\xe0\x7d\x8d\xb6\x4c\x59\xb7\xe0\x32\xda\x74\x35\xd0\xe3\x4c\x9b\x96\xee\x1c\x16\x5c\x0c\x2f\x28\x8e\xa3\xe2\x6e\x79\xc2\x8c\x28\xb8\x93\x2b\x11\xd5\xc8\x0d\xe6\xa7\x88\xc4\x4a\x9d\x0f\x8e\x57\x39\x6e\x1c\x38\xca\x52\x0f\x04\x95\xc5\x01\x5f\x0d\xef\x37\xd1\xa5\x9d\x23\x6c\x42\x5a\x76\xf0\x22\x1e\xb6\x83\xcf\xd3\x86\x1e\xe0\x97\x34\x09\x4c\x6a\x0b\x30\xc6\x6e\xa4\xca\x43\x87\xdc\xde\xe2\x53\x5f\xdd\xfd\x08\x91\x55\x7c\xd0\x89\xaa\x99\x1b\xf1\x84\xbd\xa3\xdd\xbd\x66\xc3\xd8\x64\xfb\x6a\x93\x24\x76\xd5\xc1\x8e\xab\x4d\x92\x89\xea\x20\xc0\x16\x23\x24\x77\x32\x02\xbd\x7c\x0c\x21\xe3\xcb\x48\x5c\x80\x04\xb6\xb8\x46\x7b\x7d\xab\xe0\x0e\x7a\x15\x39\x61\x4a\x27\x69\xb2\x56\x33\xc6\x33\x40\xa1\x46\xa3\xfb\x16\x1d\x38\x0f\xbc\x95\xa5\xe5\x1a\xce\x9a\x7e\x1f\x00\xf5\xb1\xf1\xa3\x28\xf9\xb6\xb6\x67\x66\x48\xdf\x41\x6a\x50\x2a\xc4\x5d\x35\xa7\x63\x78\xf4\xeb\xcf\x71\x28\xd4\xdf\x72\xec\xb0\xb8\xaf\xe4\x66\x38\x80\xe2\xeb\x8b\x67\x53\xb6\x99\x08\xf1\xc7\x23\x2c\x05\x15\xe7\xc2\xf3\x3c\xe4\x5c\xd4\x3a\x35\x90\xa6\xf0\xc0\x13\x59\xe0\xd3\x3a\x57\x27\x64\xce\xd6\x36\x73\x45\xda\x31\xbe\x46\x19\x80\x8e\x64\x3c\x9e\xe9\xe1\xaf\x3c\xbc\x14\xb6\xe2\x99\xb7\xd4\x41\x22\x20\xd5\x3b\x9c\x53\xc3\x8d\xe9\x55\x53\xe4\x5f\xab\x80\xa5\xe8\xc8\x3f\x1a\xc8\xfb\xc3\xde\x97\x7b\x3b\x0e\xd4\x79\x73\x4e\x68\x78\xeb\x34\x2b\x78\xad\xb2\xe5\x83\x3f\xa5\x3b\xb6\x3d\xe2\x7e\x18\x67\x37\xc2\xd0\xda\x3d\x57\xdc\xf0\x52\x38\x61\x22\xa7\x18\xe1\x59\x2b\xa9\xb9\x00\xbd\xb5\x00\xb1\x35\xc0\x84\x98\xfe\x4f\x6b\x28\x40\xa7\xee\xee\xd3\x21\xb6\x0d\x52\x70\x3a\x54\xe2\x57\xa7\x49\x5b\xcd\xd2\x99\x80\x61\xf5\x47\x58\x8a\xb7\x90\x16\xfe\x5c\xd7\xe2\x56\xaa\x5c\xdf\xda\xb1\x9e\x4d\xbe\x43\x71\x2d\xa1\x65\x44\xa7\x0f\x7f\x8b\xf8\xb8\x4f\x27\x31\x60\xd8\xee\xdb\x75\x68\x93\xd3\xfa\xdd\xda\xa0\xe9\xbf\xf9\x83\xe2\x67\xf2\x7e\xb1\x28\x2d\x7f\x6a\xfc\x94\x9d\xe4\xc5\x75\x25\xb2\xe4\x00\xfa\xeb\x97\xd7\x67\x7d\x91\xb4\x20\xd2\x87\xde\xc2\x20\x1c\xc7\xcb\xec\x90\xe5\xdd\x8a\xd9\x52\xeb\x1b\x92\xdc\xa3\x4e\xd5\xd7\xb2\x9e\x4d\x33\x5d\x76\x8a\x37\x27\x56\x2e\xec\x69\xd0\x0e\x13\xbf\x3a\x34\xbe\x6c\xa9\xa0\x49\xe8\x76\xb3\xdb\xf0\x31\xb4\x84\x4e\xb3\xaa\x70\x76\x43\xd9\x60\xc8\xaf\x6e\x2f\xfb\x25\xad\x73\x4f\x20\x4b\xfa\xe4\xd9\x9b\xed\xa3\x38\xb4\xe0\x2c\x8e\x0f\x1c\x47\xf2\xba\x04\xfe\xad\xd8\x25\xad\x39\x98\xed\xbe\xd0\x22\x7b\xbf\x97\x88\x1b\xf9\xf4\x4f\x73\x11\x95\x33\xca\x5a\x03\x3a\x27\x08\xf3\x4a\x35\x98\x45\x6a\x8e\x75\x1b\xe1\x33\x4e\x47\xc1\x2d\x94\x4f\x8c\xee\xc9\x2f\x41\x3f\x81\xf6\x61\x72\x78\x3c\xc8\x10\x52\x37\x2a\xe2\x87\x61\x48\xb8\x05\x3d\x68\xcc\x34\x2d\xd5\xf5\x31\xd1\x07\xec\xe3\x21\x10\xd8\x08\x58\x38\x46\x2f\xd2\x34\x2b\x99\x89\xb3\x2c\xd3\xb5\x4a\xa8\xd1\x7c\x26\xfc\xe4\xb9\x13\xf9\x75\x4f\xe2\x50\x0a\x75\xce\x72\x90\x84\x44\xc6\xbc\x90\x1c\xe9\xae\xfb\x52\x87\x93\x8b\xb5\xf3\x83\x67\xd7\x8d\xef\x0e\x4a\xc2\x3a\xc1\x29\x75\x91\x49\x6b\x9e\x46\x7c\xb0\xbd\x2e\x94\xa6\xa9\x5d\x33\xb2\xb1\x7f\x68\x0c\x82\x0a\x1c\x24\xb4\x79\x57\xfd\x99\x1c\x15\x8e\xdb\x9b\x96\x56\x5c\x00\xeb\x4e\xa3\x5c\x3b\x7f\x1f\x96\x6f\xc2\x71\x86\x04\xaa\xf1\xc1\xfb\xe5\xfe\xaa\xad\xf3\x8b\x74\x66\x9f\xff\xbf\xcf\x2e\x53\x2a\xcf\x81\x61\xbe\x65\x5f\x59\x06\xc1\x03\x23\x46\x0c\x6e\xba\x6c\xc7\xb6\x23\xd4\xcf\x71\x98\x8a\x33\x3c\xb4\x3c\xe7\x68\xe6\x0a\xc1\xe7\x78\x2a\x8e\xb0\xd5\x2d\x18\xa7\x81\x75\x4a\x17\x8a\xb5\x18\x36\x8c\x1c\x4f\xf0\x54\x94\x82\x2b\x1b\x03\xd3\x81\x87\x4a\xc0\xe7\xc5\x7a\xcc\xb8\x7e\xa1\xfc\x0b\xcf\xf0\x20\x89\x98\x2f\xc3\xef\x54\x3a\x17\x7d\x69\xd6\x99\x3a\x73\xac\x76\xd6\xff\xfd\xf0\x05\x88\xd1\xf8\xc8\x4b\x60\xc4\x42\x5a\x67\x02\x5b\xa6\x9f\x68\xbb\x10\x98\xa8\x1d\xb6\xfd\x51\xdc\x8d\x58\xb3\xbf\x7e\x73\xfe\xb7\xbf\xbf\x78\xf5\xf4\xec\xc5\xdf\x5f\x9e\x3d\xfd\xeb\xc5\xe5\xf9\xbb\x77\xd7\x7f\xbb\x7e\x73\xfe\xf2\xdd\xbb\xa7\xb5\x31\x42\xb9\x40\x5b\x79\x2d\xdc\xbb\x77\x41\x5f\xd8\x77\xef\xde\x64\x95\xac\xde\xbd\xbb\x8a\x79\xc4\xc1\x4c\xab\x7e\x63\xc1\x0b\x40\x8e\xa9\x5c\x0b\x0b\x55\x07\x50\xe4\x36\xfc\x50\xc3\x3a\x2f\xb9\x6d\xeb\xe3\x7a\x0c\x3a\x83\x7b\x9b\xd1\x00\xe7\x76\xc9\x8d\xb8\x42\x37\xef\x32\x26\xd7\x13\x14\xbe\x17\xc7\x38\xb3\x52\x2d\x0a\xd1\x3c\x33\x35\x69\xfb\x41\x2b\x34\x13\xee\x56\x04\x4a\xb8\x4d\x77\xd6\xb6\x45\xea\x83\x64\x02\x2d\xaa\x0b\x1c\x23\xde\x9d\xeb\x48\x8c\x8a\x8b\xcf\x86\x76\x6b\xd1\x6c\x25\xc5\x2d\xb8\x73\x56\x2e\x14\x2f\xe2\x97\x8b\xc0\x77\x0a\x04\x8c\x83\x64\x6e\xa2\x80\x04\xb3\xfe\xfe\x54\x3a\x3f\x69\xfa\x5b\xc2\x5b\xde\x20\xa9\x71\x43\xb6\xde\xfc\xba\x24\x3a\xc3\x5c\x22\x68\xad\x21\x72\x76\x75\xf1\x8c\x3d\x9e\x32\x6f\x8b\xfc\xbf\x42\xff\xa7\x5d\x87\x6b\xd8\x2a\x84\x76\x40\xde\x79\x46\x8f\x7e\x07\x8b\xc5\xd0\xbd\xc2\xab\x35\xdc\x30\x0f\xbe\x5b\xf5\x2c\xd7\x25\x97\x83\xba\xb9\x7e\x80\x0b\x66\x5e\x17\xc5\x9a\xfd\xb3\xe6\xc5\x70\x22\xc3\x2b\x9d\xb7\x8a\x38\x1e\xf6\x83\x3f\xc5\xbf\xfa\xf3\xf4\x4f\xcd\x8c\xff\x3c\xfd\xd3\xd0\xbe\x1c\xcd\x1d\xff\xf3\xd4\xae\xb2\xe9\x9f\x02\xf1\x2a\x0b\x02\x9b\xd2\xd7\x61\x4f\x8f\xef\x21\x9b\x69\xf4\x2e\x0f\xf2\x07\x7b\x29\xdc\x79\xbd\xf2\xd1\x69\x66\xb0\x71\x2e\x40\x88\xbe\x36\x3c\x13\x57\xc2\x48\x08\xf8\xb4\xca\xe9\xc4\x9e\xf1\x0a\xb0\x3c\x74\xb8\xf1\x17\xda\xa2\xd0\xc1\xd6\xda\x2f\xaa\x12\x22\xc7\xe0\x3e\xcc\x57\xb0\x85\x9f\x2e\x1c\xb7\x61\x1a\xd6\x47\xe0\xc0\xba\x9a\x19\xc1\xb1\x16\x9e\xe5\xa2\x10\x6d\x2f\x90\x29\x3e\x89\x0c\x92\x1a\xe1\x69\x4a\xab\x89\x12\x0b\x04\x7f\x85\xa7\x70\x04\xbf\x0d\x4f\x6d\x23\x1b\x6c\x83\x5f\x0a\x93\x94\x65\x29\x72\x1f\xe0\x15\xeb\xc1\x15\x7e\x60\x58\xd0\xe9\x91\x96\x29\x59\xe0\xb1\x8d\x88\x19\x58\x52\x56\xc1\x11\x20\xb9\xd4\x75\xe0\x16\x80\x48\x10\xbe\x9a\x2c\x32\xa4\xe8\x76\x1c\x20\xc6\xe7\xae\xe1\xb3\x0e\x56\x6c\x98\xbf\x16\x7a\xfb\xb4\x44\x83\x50\x48\x6f\x85\x72\x8c\x77\x6f\xc4\x30\x55\x80\x86\x35\xda\x3e\xac\x66\x41\x6b\x4e\x9d\xa8\x9f\xd5\x5c\x9b\x4c\xce\x8a\x35\x5b\xf2\xa2\xe9\x4e\xc4\xd9\x8d\x5f\x71\xfc\xc9\x61\xc7\xff\x5a\xb8\xee\x31\x28\xb4\x5a\x74\x43\x17\x71\x57\x41\x1f\x97\x61\x56\xd0\x9b\x9d\xba\xc2\x6f\xf6\x1e\xf4\x5a\xd7\xa9\x25\x78\x4e\xb3\x2f\x1f\xc5\x2d\xff\xc4\x7c\xe5\x03\xf0\x27\x4e\x17\x02\x4f\x28\x5d\x5b\xee\x64\x54\x3b\xb4\x5d\xd9\xc3\x17\xe0\x53\x33\xe6\xbe\x89\x1d\xd5\xfc\xd9\x7a\xd3\xcc\x7c\x68\x06\xcb\x1b\x3e\xc7\x81\x13\xce\x6b\x7b\x94\x03\x2c\x63\x6b\xe6\x3d\x41\x37\xbc\x5d\x1f\x8b\x6c\x8e\x78\x2f\x8d\xac\x0a\xc1\xfe\x74\x23\xd6\x27\x48\x92\x8f\xc1\xcd\x9f\x07\xca\x6c\xdb\xa6\x36\xe4\xad\xba\xf2\x93\xd5\x86\xfd\x29\xfe\xdb\x9f\x87\xdd\x4d\xf2\xd3\x21\xfd\xe1\x10\x3f\x3e\x11\x45\x73\x8e\xf4\x29\x74\x8e\x7d\x1c\xb8\xbf\x81\x8b\xc5\x69\x5c\xd8\x29\x3b\x07\x2e\x49\x88\xf8\x09\x42\x43\xc3\xc0\xa2\xe8\x89\xb7\xa1\x01\x45\xc2\x23\x3c\x43\xaa\x31\xd1\x23\x63\xb9\xd4\xd7\x81\x21\x10\xfa\xa8\xcc\x85\x69\xff\x86\xf2\x0b\x2a\x67\x97\xfa\xfc\x4e\x64\xf5\xb0\x4e\x24\x38\x12\x1e\x94\x6e\x04\xa1\xfd\x7b\xef\x50\x7c\x23\x9a\x3e\x37\xb8\xf2\x37\x82\x82\x2b\x69\x68\x27\x5a\x6d\xd8\xa9\xd1\xa1\x64\xfa\x3b\xe7\x69\xeb\x74\xdc\x88\xf5\x40\x8e\x78\x1c\xa1\xf3\xdd\x0d\x7e\x73\xe0\x69\x6d\xf4\x81\x77\x0e\x09\x42\x67\x82\x9d\xdf\x49\xeb\xec\xff\x44\xad\x9a\xe9\x72\x16\x3c\x13\xf2\x75\x88\xd7\x0a\xbe\x39\x1e\x5c\x95\xc3\x1f\x69\x1f\x9f\x70\xc8\xe2\x02\x25\x9e\xb4\x57\x71\x9d\x3b\x1d\x21\x87\xd7\xe6\xc3\x99\x3f\xb4\xa1\x74\x43\x2b\x60\xee\xea\x36\x9f\xa3\x9c\x8b\x08\xee\xc7\x09\xa2\x8e\xc0\x3d\x85\x55\x3f\xf7\x81\x32\x45\x6e\xf7\xbd\x13\x85\x44\xb1\x12\xd8\xfe\xe5\x8a\x17\xb4\xce\xe3\x4e\x7b\x6f\x3e\xcf\xb8\x41\xd4\x6a\x68\x24\x63\x43\xef\x5c\xca\xba\x02\xe3\xbd\xf7\x2f\x83\x35\x6f\xef\x1b\x52\xd7\x51\x44\x72\xe3\x64\x56\x17\xdc\x30\x6f\x71\x16\xa4\xae\xd6\x09\x27\xb7\x55\x46\x84\x50\x19\x47\xdf\x7b\xda\x94\xd7\x39\xcb\x24\xa5\x19\x63\x2e\x48\x4c\x02\x8d\x4d\x4f\x85\x12\x64\x1e\xf5\x7b\xfd\xea\x79\xb4\xd4\x8d\x81\xa2\xd8\xd0\xb6\xf3\xa2\xeb\x75\x1e\x94\x0b\xe8\x0e\x48\xc1\xec\xb4\x4e\x63\x63\x7b\xa6\xec\x2f\x0d\x87\x2f\x65\x96\xc8\x85\x09\xbc\x68\xc2\x45\xb2\x6c\xb4\x20\xf1\xd7\x88\xbb\x84\x66\x67\xae\x8d\x58\x09\xc3\x8e\x72\x0d\xbf\x22\x56\x32\x1b\xfa\x5e\x84\xe3\xff\x17\x46\x83\x6a\x69\x92\x10\x41\xc9\xd3\x6b\x95\x3a\xdd\x2c\x1f\xb1\x23\x98\x5a\x37\x09\x41\xd9\xa2\x80\x74\xc2\x16\x48\xd4\x8b\xfb\xe9\x0b\x0d\xc8\x98\xdb\x1d\x78\xdb\x9e\x6b\x44\x83\x3d\xb2\x4d\xbf\xa8\x89\x73\xf4\x34\x78\x24\x94\x1b\x19\xad\xa9\xb4\xc1\xa6\x9c\x74\xb1\x1b\xd4\x62\xaa\x99\x68\xdc\xa2\xe6\xca\xff\xb7\xd7\x25\x9c\x19\xb1\xf0\x9a\x9c\x20\x14\x75\xf7\x27\xd2\xfc\x4e\x57\xba\xd0\x8b\xf5\x75\x65\x04\xcf\x9f\x6a\x65\x9d\x01\x23\x46\xef\xdc\xf7\x3e\x89\xe1\xff\x6c\x36\x30\x5f\xb4\xd4\xb7\x8c\x07\xca\x65\x3d\xc7\xe6\x90\xba\x5e\x2c\xb1\xcf\x3f\xfc\x08\xe3\x99\xd1\x03\x49\xfd\xe3\x87\x87\x54\xb6\x9d\xb2\xeb\xa6\x37\x3f\xa8\x15\x4b\x89\x70\x60\x76\xf0\x48\x76\xcb\xd7\x41\xa5\xf2\x99\xcc\x85\xed\x14\x9a\xc7\x05\x19\xd8\xb7\xc9\xfb\x17\xef\x5d\x5b\xef\x83\x9d\x5d\x3e\x13\x83\x5e\xe6\xee\x29\xa9\xf2\x9e\x8f\x18\x78\xe0\x63\x94\x6b\xe1\x84\xb4\x67\xa1\xc9\x5c\xf8\xbd\x18\x9a\xa6\x29\x75\xc8\x7f\x60\xab\xf3\xb8\xde\x9f\x28\xe3\x41\x6d\x69\x54\xf2\xbb\xeb\x1b\x31\x8c\x20\x7c\xd2\x7c\xdc\x37\x03\x43\xd8\x09\x64\x80\xbf\x55\x96\x3b\x69\xe7\x72\xf0\xc3\x2d\x3d\xaf\x03\x8c\x16\xd7\xd0\x94\x3b\x39\xbe\x7a\xd1\x95\x15\x59\x5d\x69\xa1\xc5\x5c\xaa\x8d\x63\x37\xc5\xf2\x36\x42\x56\x8f\x35\xd9\x1d\x70\x1d\x91\xc3\xc3\xc6\x69\xfa\x5b\x0e\x08\x27\xea\x54\x73\x81\x2f\x01\xe8\x3a\xab\xba\x9c\x09\x13\xb5\x2a\xc5\x85\x84\xfc\xba\x34\xfd\x9e\xe5\xcd\xc9\x22\x48\x44\x6d\x4c\x35\x7e\xc4\x2a\xb3\xb4\xe2\x2d\xd8\xae\xf3\x3b\x1f\xd9\x58\x4a\xb9\x0e\x8e\xde\xe1\xdc\x14\x49\x92\xc8\x90\x47\x26\x56\x32\xf7\x8f\x12\x51\x62\xd0\x50\xd0\x80\x06\xdf\xc2\xba\x7f\x43\x14\x4a\xb2\x5d\xed\xa0\x17\x5b\xe2\x20\x96\x5c\xe2\xd8\x2c\x1b\x1f\x63\x91\x7b\xcb\x8c\x9b\x98\x2c\xb1\x4b\x5f\x16\x9e\xc9\xec\x09\x94\x86\xae\x69\xc8\x67\x16\x32\xb9\x5c\xb5\xce\x35\xfc\x08\xa4\x9a\x88\xdc\x2d\x2c\xb8\xff\x37\x62\x0d\xc2\x71\x9e\xb4\x63\x91\xa8\x13\x70\xd0\xeb\x4f\x71\x4c\x88\x09\x62\xfc\x6f\xe3\xc2\x12\x05\xa4\xa9\x35\x1c\xa4\x94\x79\x3b\x7a\xd7\xe3\xa6\x49\x9e\x27\x48\x8c\xbc\x56\x5e\x58\x93\x46\x4f\xbe\x1e\xac\xa9\x6d\xa4\x26\xe0\xe3\x48\xac\x7f\xc5\x41\xcf\x21\xb7\xa3\xb7\xf4\x7a\x3b\x9b\x9c\xb6\x56\xbb\xf3\xca\x89\x32\x81\xa5\x79\x1e\x6f\x3d\xe6\x99\x93\x44\xf6\x73\xd4\x17\xea\x84\x5d\x6a\x77\xa1\xe8\x1a\xcf\x8f\x4e\xaa\xfb\x99\x16\xf6\x52\x3b\xf8\x9b\x7b\x3f\x34\xb8\x6c\xa3\x1d\x99\x90\x62\x83\xee\x79\x69\xfb\xea\x2d\x73\x00\x4e\x7b\xef\x30\x4d\xa9\xe3\x08\x4f\x53\xdd\xb4\xce\x45\xda\x2c\xb5\x09\x67\xa3\xcd\x0b\xd9\x04\xa7\x22\x8e\x2e\x84\x2a\xf4\xfc\x22\x90\xa9\x76\xc7\xe6\x77\xe3\x71\x4c\xfd\xf6\xee\x49\xee\x2e\xc1\x08\x3b\x1f\x97\x20\x7c\xfe\x9b\xa1\x8d\x2d\x77\x4b\x85\x06\xd6\x55\x01\xac\x24\x79\x9d\x74\x71\x18\x2a\x1f\x67\xb8\x13\x0b\x99\xb1\x52\x98\x85\x60\xd0\x54\x2f\xfd\x52\xa7\x1e\xa1\x24\xef\xb4\x3b\x11\xb2\x76\x81\x60\x04\xc2\xe5\xd1\x42\x1b\x94\x06\xba\x85\xf8\x65\x25\x87\x6c\xe0\xff\x6a\x10\x2f\xff\x9b\x55\x5c\x1a\x3b\x65\xb4\xe2\x65\x16\xd1\xf3\x5d\x89\x01\x4b\xd7\x99\x72\xc2\x6c\x7b\x6f\x98\xc8\x83\xc4\x04\x72\x56\x11\xa5\xea\xf9\x56\xa0\x78\xc2\x6e\x97\xda\x8a\x04\xaf\xb3\x79\xac\x3a\xb8\x11\xeb\x83\x93\x9e\xba\xa1\x87\xa1\x07\x17\xea\xa0\x85\xd0\x8f\xa0\x5d\x9b\x50\x06\x88\xfe\x0e\x40\xe2\xc1\xc3\x8a\x48\x13\x02\x8f\xc8\xeb\xc5\x8b\xab\x64\x1f\x3e\xe1\xf6\x87\xbc\x62\x62\xa6\xed\xf0\x25\x8a\x69\xf3\xff\xc4\x10\x20\x17\x0b\x23\xa0\xee\x10\x13\xeb\x90\x6c\x2f\x11\xf9\x5c\x2b\xb1\x12\xaa\x20\xa5\x9c\xa4\x0d\x7d\x3f\xf3\x00\xa0\xfa\xc7\x56\x82\xf3\xff\x7e\xa6\x2f\xb5\x8b\x2f\x04\xff\xa0\x3f\xb7\xa2\x3e\xb9\x93\x65\x5d\x62\xbb\x2f\xe7\xbc\x01\x93\xf3\xd0\x4e\x9f\xf4\x08\x85\x15\x3b\xfd\x8c\x5e\x4a\x1a\x9c\x35\xa9\x3d\xe6\xb8\x59\x40\xfb\xc8\xf0\x5a\x12\xaf\xf0\xa2\xd0\x33\x12\xa1\x40\x29\x95\xff\xf8\x29\x7b\xae\x0d\x13\x77\xbc\xac\x0a\x71\x82\x4f\x26\x5f\x4e\xfe\xa5\x15\x65\x05\x42\xd5\xc3\x09\x8b\x27\x2d\x94\x19\x39\xcd\x1e\x9f\x90\x1a\xd5\x85\x97\x1c\xc0\x25\x37\x65\x40\xbd\xf4\x33\xe5\x61\x2f\x3c\x56\x59\xf6\xf8\xf4\xf1\xe9\xa3\x27\xec\x47\xe6\x3f\xf8\x71\xf8\xe7\x17\x04\x91\xf8\x5f\x7e\xc9\x7e\x64\x3f\x32\xc6\xae\xe0\x6f\xda\x7f\xc2\xff\x05\x41\xea\x84\xc9\x79\x77\x2d\x1f\xfb\x0d\xca\x74\x19\x8e\x13\x65\x87\xb8\x6a\x29\x59\xc3\x2d\x02\x30\x2c\x4e\x9f\x14\x39\xce\x44\xa6\x4b\x01\x6b\xf9\xf8\x7f\x46\xa9\x00\x81\x77\x4c\x2b\x92\x48\xd8\x8e\x23\xd8\x8c\x63\x76\x0b\x8c\x96\x25\xbf\xc1\x64\xf9\x59\xe6\x6a\x5e\xf8\x25\x39\xfa\x62\xf2\x88\x02\x10\xd0\xaa\xff\x03\x2b\xa9\x0b\xee\x44\x5c\xe9\xa3\xc7\x24\x70\xc4\xe6\x66\x7d\x31\xca\x66\xf5\xf6\xc9\xaf\x26\x80\x95\xfd\xc4\x29\x73\x7c\x9f\x56\x8d\x0a\xf5\x4c\xad\x6f\xf9\x3a\x41\xad\xc6\xce\xf9\x0b\xb9\x12\x6c\x29\x17\x4b\xe8\x96\x13\xa9\x13\x68\x6f\x25\x41\xe7\xc9\xd8\x26\x0c\x27\xbe\x66\xd2\x4d\xd9\x85\x3b\x24\xd1\x1e\xf3\x26\xa3\x18\x68\x6c\x9a\xea\x53\x2a\x5a\xc2\x5f\x4f\xd0\xca\x8f\x22\x9a\x27\x20\x78\x07\x77\x28\x1c\x11\x82\xf2\xe5\x50\x5d\xd6\x79\x8b\x4c\x06\x9d\x35\x92\xa2\xbd\xa5\x39\xc3\x7a\x8e\xc4\xc0\xa0\xf5\xed\x94\x5d\xea\x3c\x9e\x84\x25\x5f\x91\x80\xcf\x21\x75\x19\xac\x8a\xb4\x4d\x9e\x5b\x02\x41\x4f\x46\x32\xa8\x1d\xa0\x76\xa6\xa1\x03\xaa\xc1\xbb\x30\x13\xc1\x88\x53\x4c\x15\x87\x26\x71\xe1\xf5\x9b\x7d\xd7\xca\xa6\x75\x9c\x61\x58\x9b\x80\x93\xfd\x33\xb6\xca\x3b\x98\xd5\xd9\x8d\x70\x07\x54\x0b\xed\x0c\xf4\x66\xad\x6a\xc7\x66\xbc\xe0\x2a\x13\xf9\x18\x2f\x9a\x4e\x63\x95\x2e\xce\x0e\xae\xba\xed\xdc\x5b\x82\x4c\x22\x61\x55\x82\xe3\xbe\xa5\x69\x53\x5d\xf8\xef\x36\x05\x26\x91\xf4\x07\xc0\x46\x2e\x78\x11\x4b\xbf\x2a\x9d\x77\xba\xfc\xa9\xc3\x43\x4a\xe0\x14\x35\x34\x78\x6c\xe8\x6c\xb5\x70\x9b\x29\x9b\x10\x44\xf6\xfc\x7e\x76\x14\x59\x2f\x98\x13\x45\x41\x8d\x63\x6c\x03\x34\xf2\xea\xda\xe9\xe6\x2f\xc0\xb4\x50\x66\xd9\xb7\xa3\xed\xe4\xda\x9f\xa2\x99\xc0\x66\x62\xb1\xa4\xd0\xfb\xe9\x6a\xdd\x10\xf4\x9f\x78\x37\xac\xa6\x6c\xd5\x42\xae\xbc\x83\xb2\x65\xaa\xfb\x86\x97\x32\x6b\xaf\xa0\xd1\x75\x5b\x8a\xa2\x62\x46\xe4\x75\x86\x1f\xc0\x98\xbd\x11\xb7\x14\xff\xe5\xac\x73\x8e\x18\x14\x2d\x34\x8a\xf6\xa0\x77\x2d\x28\xa4\xe7\x73\x6d\x18\x57\x3d\xa7\xcd\x5f\x05\x6f\x17\x34\x2d\xa2\x95\x73\x26\x56\xc2\xac\x59\xa5\xad\x95\xfe\xb6\x82\x25\x03\xd6\x00\x62\xbe\xa9\x69\x81\x05\xd5\xe0\xb0\xbc\xd1\x7d\x3d\x08\xce\x27\xe5\xdb\xb5\x62\x56\xf7\x4c\xcd\x46\x58\x48\x32\xb3\x18\x48\xbe\x2f\x2c\xa4\x5d\x05\x0c\x24\x3f\x6e\x58\xf8\xa5\x0f\x65\xc6\x0e\x0b\xaf\xe0\xff\x6d\x85\x87\x04\xa9\x17\x73\xb6\xc3\x0e\x34\xa1\x76\x4f\x55\x92\x5c\xf9\xee\x0d\xd8\x19\x31\xd2\xb6\x0e\x56\x11\x82\xae\x2f\x8f\xd1\x31\x82\xc0\xf1\xcb\xd3\x2f\x4e\x1f\x1f\xf9\x35\xff\x82\x12\xcd\x71\xdb\x0f\x09\x1f\x1f\xc7\x00\x2f\xfe\x16\xd9\x82\xf9\x90\xa3\x13\x14\xb2\x0b\x85\xf8\x62\x76\xab\x4d\x6e\x29\x4b\x0b\xc8\xd3\xc0\x0d\xe1\x57\xd6\xba\x50\xdc\x2e\xcb\xe8\x3b\x51\xc4\xce\x6a\xd7\xb1\x66\xb7\xda\xdb\x6d\x8c\x98\xa5\x63\xbf\x29\xb5\x11\xbf\xa1\x9c\x83\x66\x4e\x21\xd0\xda\x0e\x9b\xa8\xb1\xcd\x60\x6f\xea\x6e\xd2\x61\x5f\x2d\xa4\x75\x93\x92\x57\x93\x1b\xb1\x1e\x94\x8f\xa5\x82\x2d\xd3\xa0\x96\xdb\x73\xc7\x45\x28\x79\xf5\xb3\xa5\xac\x74\x51\x97\xc3\x92\xcf\x7d\xcf\xf1\x45\x80\x9f\x05\x41\x01\x88\x04\x19\x86\x41\x7b\x58\x22\xec\x91\xcd\xd6\x5d\x96\x9e\x99\x28\xb4\x5a\x20\xe6\x70\xb0\x37\x36\x80\x88\x2e\xd3\x2a\x13\x95\xb3\xa7\xd6\x69\xc3\x17\xe2\x34\x7c\xce\x70\x3e\x9b\x4f\x8d\xb6\x7e\x0b\x13\xed\x55\x11\x22\x33\xef\xc0\x1b\x84\x1f\xdc\x10\x40\xe1\x3e\x86\xe4\x3b\xcf\x80\x07\x62\xa8\xc8\xd9\xba\xdf\x0b\xa4\xc3\x5d\xf1\xc0\x01\xd7\x83\x89\x6f\xe8\x50\x2c\x7e\x6b\xcf\x0b\x6e\x9d\xcc\xfe\x52\xe8\xec\xe6\xda\x69\x93\x1c\xcd\x9d\x7d\x77\xbd\x25\x93\xa0\xa7\xbb\x67\x4a\xb1\xb3\xef\xae\xd9\x33\x69\x6f\x98\x11\x56\xd7\x86\x96\x75\x83\x66\xf4\xb6\x47\x97\xc0\x9b\x3e\x63\xa4\x8c\x1b\xb4\x8e\x2a\x79\xb6\x94\x4a\xc4\xd7\x0b\xc5\xc4\x5d\xa5\x31\x65\x48\x34\xa6\x23\xe8\x8e\x5f\xf1\x5b\x2b\x70\x1b\x66\x7e\x1b\xfc\xff\x2c\xa8\x86\xed\x1e\xfa\x6b\xe0\x67\x5c\x3c\x1b\xfc\x9f\xa6\xe1\x12\xe7\xf6\x0d\xb1\x91\xda\xe6\x35\x78\x2e\x0b\x81\xd5\x7a\xf4\x46\xa4\x4d\x97\xf6\xa0\x1f\xe1\x04\xaf\x75\xcd\x6e\x39\xf9\x5d\xdf\x69\xb4\x76\x53\xf6\x46\x56\x4f\xd8\xb9\xb2\xb5\x11\x0d\xd8\x91\xfc\xae\xdf\xfb\x58\xf0\xdb\x63\xdb\x1d\xa2\xc8\x50\xd1\x04\x37\x0c\x21\x02\xde\x10\x53\xeb\x1f\x71\x9c\x63\xe8\x67\x9f\xb0\x03\x71\xe7\x7e\x77\x70\xc2\x0e\xee\xe6\xd6\xff\x43\xb9\xb9\x25\x35\xed\xf3\xe3\xa2\xac\x0a\x99\x49\x57\xac\xfd\x7d\x15\xa6\x4d\x91\xe2\xcf\x50\x91\x0d\x9b\xad\xef\xc7\x57\x08\xc4\x99\xbd\x79\xf5\xec\xd5\x13\x48\xb4\xe5\x9a\xdd\x42\x87\xc9\x95\x50\x8e\x09\x63\xf4\x40\x16\xce\xce\xe7\xaa\xc0\x80\xd8\x1c\x25\xe0\x59\xcc\x74\x59\x19\x5d\x4a\x4b\x07\x61\xe1\xb3\x38\x28\xe9\xe1\x1a\x90\xa5\x63\x9c\xa0\xf4\x1e\xd4\xc2\x08\x7a\x05\x58\x83\xa2\x40\x2a\x75\x39\x7b\xaf\x56\xa1\xe3\x6c\x83\x56\xb9\x98\x33\x8d\xc0\x83\x1e\x53\x1a\x1d\xdd\x13\x15\x96\xd7\x08\x61\xc6\x6a\x30\x1d\x77\x3b\x5a\x1d\xf0\x5c\x9b\x28\xf0\x34\x17\xab\x53\x9b\xf3\xc7\x54\xf0\xae\x5f\x3e\xbc\xaa\xa8\xb6\xda\x1d\xe2\xd4\xfb\x70\xf0\xf8\x60\xca\xae\x65\x29\x0b\x6e\x8a\xf5\x49\x77\xc7\x1a\xe9\x54\x75\xad\x4d\xf3\xc9\x00\xa0\x7a\x74\xc0\x8e\x90\x84\x8c\x8a\x98\xe2\x8a\x15\x82\xaf\x44\xe4\x6e\x83\xa6\x48\x88\xca\x3c\x26\x04\xd4\x2c\xf9\xc1\x90\x25\x3e\x1a\x32\x70\x60\x78\xfe\x4a\x15\xc4\x22\x85\x0d\x1e\xdd\x70\x3a\x0e\x9c\xa9\xc5\x01\xfd\x9a\xcd\xb5\xc9\xd0\xd7\x84\xcc\xd8\x52\xb0\xd7\x61\x96\xa9\xbd\xa8\xa4\x0a\xf1\xdc\x4b\x7f\xdd\xe0\xe2\xe1\x64\x13\x50\xc5\xbb\x54\x01\x9c\x38\x60\x6c\x25\x5b\xdc\x07\xe1\x1b\x33\x32\x8d\x6c\x3b\xa2\x9b\x3b\xc6\x09\xfb\x56\xc9\x7f\xd6\x82\x5d\x3c\xa3\xb0\x92\xb7\xa3\x12\xc6\x4a\xeb\xbc\x3d\xcf\xbb\x11\x17\xdd\xd6\xf8\xe0\xed\xe8\xac\xe4\xff\xd2\x8a\x9d\xff\xe5\x3a\x7c\xf4\x31\x7a\x34\xe4\xc3\xfa\x50\x36\x9f\xe4\x16\xf0\x7f\xd5\x46\xf8\x80\x36\x31\xda\x3e\x8b\x72\xd2\x6a\x6f\x7c\x84\xed\x25\xb1\x67\xdc\x71\x0c\xb4\xd1\xe6\x6a\xea\x1b\x3f\xf8\xed\x5e\x4b\xcd\xa0\x7e\x39\xb6\x76\x20\x77\xf4\xbc\xb7\x40\xd4\xdf\x01\x52\xd7\x24\xfc\x4f\xbf\x7d\x7d\xf1\x89\x43\xd8\x0c\x3c\xdd\xc5\x4b\x9d\x8f\x12\xc7\xfe\xd5\x6f\xe4\x53\x94\xc9\x4a\xb2\x50\xc6\x2e\xb5\x12\x27\x60\xac\x98\xb7\x56\xe1\x5f\xbf\x33\xd2\x0d\x63\xee\x6e\x47\xa2\x5b\x1e\x77\x76\x84\x55\xf2\x4e\xf9\x65\xa7\xa7\x49\xce\x1d\xb5\xf6\x00\x74\x6e\x88\x85\x66\x85\x9e\xb1\xa0\xbf\xee\x6b\x85\xbe\x7d\x7d\x31\xd2\x02\x7d\xfb\xfa\xe2\x97\xb4\x38\xa3\xa5\x8a\x36\x32\x45\xc9\x11\xd8\xcb\x50\x12\xc5\x3b\xb1\x34\x35\x4a\xf4\xf3\x69\x1b\x28\xef\xcc\xc9\x10\x45\x87\x4c\x0e\x3b\xbf\x9b\x7e\x8e\xd9\x98\xfb\x38\x71\x37\x52\x11\x6b\xc5\xfb\x2a\xfd\x3c\x30\x56\xa7\x55\xe1\x41\x2b\x88\xfc\x09\x2b\xeb\xc2\x01\x41\x30\x5c\x48\x7f\x43\xa9\x12\x2b\x61\xe2\x85\x66\xa1\xd9\x12\x63\xcf\x04\x42\xc1\xc8\x55\xf2\xa1\xf4\xaa\x99\x5d\xf7\x67\x88\x22\x9b\xc9\xbd\xe4\x8a\x2f\xfc\x22\x80\x3f\xc7\x4a\xfc\x23\x55\xb9\x79\xdf\x0b\x66\x78\x04\xd8\x04\xa9\xa2\x40\xc6\x57\x5c\x16\x7c\x26\x0b\x49\x8e\xee\xac\x70\xc7\xd3\x18\x82\x41\x70\x07\x8d\x62\xf2\x7b\x31\xbd\x23\x06\xd6\x5d\x5e\x4f\x08\x2a\x89\xeb\x73\xe4\xe7\x74\x7a\xeb\xdd\x91\xe3\x69\x1b\x53\x2f\x05\x39\x44\x01\xa2\x2f\x0c\xd7\x7b\x61\x3a\xa5\x07\x53\x3b\x36\xa2\xf4\x14\x45\x44\x0b\x5b\xe1\xa8\x7b\x9b\x35\x46\xe8\xe2\xe5\x8c\x14\xba\x80\xa8\xd0\x1c\x6a\x1f\xbd\xc0\x98\x30\x2b\x32\x23\x1c\x31\x7e\x01\x05\x41\xfa\x6f\xd3\x22\x98\xbd\x76\xf8\x7c\xb5\x03\x03\x53\x13\x0f\xdd\x08\x3b\xd8\xed\x3a\x8c\x82\xc9\x2f\x1e\x5d\x92\x22\xd4\x19\xd7\x49\x6e\x40\x6c\x59\x09\x91\x9f\xd7\x16\x43\xc9\xee\x9a\xa9\xa5\x59\xd3\xe6\x9e\x8e\xb0\xdc\xd8\xee\x8d\xdc\x26\x3a\xe1\x4b\x32\x51\x2d\xe7\xa9\xac\xd0\x4f\x45\xb5\x7c\x7e\xdd\x07\x24\xf9\xbf\x23\x7c\xcc\xf3\xeb\x9e\x15\x41\x9b\x80\xb5\x5a\x7e\x8d\x68\x05\x5a\xd8\xa6\xa4\x90\x73\xe1\x24\x61\x89\xef\xcd\x8e\x94\x5a\x49\x47\x79\xdb\x4d\x64\xbf\x0b\x3f\x3b\x46\xd4\xf3\x3a\x7e\x3e\x7b\x49\xfd\x18\x1c\xc0\x99\x96\xe9\xa2\x10\x19\xbc\xf0\xe9\x39\x1c\x31\xfa\x1a\xe1\xd8\xf1\xa6\x11\xa0\xea\x76\x7a\xf3\x07\x48\x6c\x87\x14\xf6\x29\x5e\x95\xd3\xd7\xe7\x67\xcf\x5e\x9e\x4f\xcb\xfc\x57\x4b\x7d\x3b\x71\x7a\x52\x5b\x31\x91\x2e\xc5\xa3\xbf\x27\xa2\xbb\xe4\x07\x76\xb7\x1c\xe3\x88\xb4\x7d\x08\xbf\xb5\x40\xdf\x9d\x02\x38\x08\x90\x52\xa3\xb5\x3b\xe9\xf6\xbb\x4d\x90\x39\xaf\x8b\x02\xcf\x9a\x33\x42\x9c\xa4\xbf\xad\x0f\xea\x65\xdc\x99\xcb\x83\x89\xfe\x0e\xb7\x5a\x47\x92\xf7\x2c\x38\x88\xef\x71\xf5\x88\x52\xbd\x83\xf8\x3e\x57\x8f\x1e\xc8\xbb\xd0\x8b\xad\xe7\xea\x8d\xf7\x9a\xf6\xe9\xd5\x4e\xaa\xaf\x49\x0b\x47\xd9\x4f\x9c\xa6\xeb\x46\x6e\x02\x72\x05\x80\x20\x6e\xe9\xcf\xd6\x8d\x58\x33\x20\x28\x9b\x93\x99\x6e\xbe\xb5\xc2\x9c\x74\x1f\xd1\x4f\x85\xcb\x60\x53\x4e\x6b\x2b\xcc\x34\xc9\x3b\x7e\x10\xd6\x87\xee\x01\xc3\xa7\xbf\x16\xf3\x8f\x71\x08\x5e\x0b\x2a\xfa\x01\x68\xc4\x02\xf7\x4a\xcc\x1f\xf0\xda\x2d\xb1\x1e\x3b\x01\xc0\x83\xdf\x0b\x38\x9e\xcd\x53\x41\x94\x18\xf8\xd3\x1e\xc4\x31\x48\xe0\x36\x4a\x67\x25\x55\xe4\x38\x8a\x6d\x9d\xa4\xce\x93\x20\x59\x22\x8b\x47\xc8\x0d\x46\x80\xea\x95\x30\x2b\x29\x6e\x4f\x6f\xb5\xb9\x91\x6a\x31\xb9\x95\x6e\x39\xc1\xd5\xb5\xa7\xd0\xdd\xf7\xf4\x57\xf0\x8f\x84\xd9\x21\x16\xf4\x2c\xcf\x43\x15\x59\x6d\xc5\xbc\x2e\xb0\x92\x2a\x89\x87\x91\x57\xf2\xad\x30\x16\x0a\x81\x6f\xa4\xca\x4f\x58\x2d\xf3\xaf\x68\xe7\x8a\xa5\xab\x18\xaf\x62\x47\xf7\x31\x0d\xfd\xc2\x42\x57\x7e\x9e\x6b\xa0\x27\x31\x70\x6c\x47\x70\x08\x79\x5e\x4a\xf5\x30\xb4\x00\x2d\x89\x20\x55\x4e\xd9\xa7\xfe\x1e\x3d\x05\x29\xa9\xcd\xd1\x70\x2e\x11\xb3\xd9\x54\x9d\xf0\x98\x51\x26\x3d\x14\x69\x15\x2b\x56\x6c\xaf\xfa\xa4\xab\x1c\x28\x09\xef\xf7\x6c\x73\xb9\xb6\xff\x2c\x26\xf8\x25\x93\x2a\x6f\xf7\x79\x5f\x4a\xf2\xa1\xf1\xd0\x4a\x49\xda\xc2\x8f\xcf\x0d\x20\xb0\xbb\x68\x83\x28\x36\x80\x0b\x76\xc1\x04\xe8\x0b\xdb\x80\x0b\x46\x81\x09\xfc\x2c\x6f\x7c\xc4\x9b\xc9\xf6\x21\xfd\x80\xf1\x8b\x08\xe9\x3f\xca\xe9\x49\x8d\xe2\x47\x8f\xdf\x2a\x2d\xe9\x34\xad\x50\x1d\x1a\x02\x2d\xb4\x5a\xf1\xf5\x88\xae\xd3\x2a\x6e\x78\x29\x9c\x30\x2d\xa9\x5c\xa6\x95\xc2\xee\xcd\x44\x99\xaf\x2a\xa1\xae\x1d\xcf\x6e\x92\x50\x94\xfb\x98\xab\x37\xf6\x31\xd7\x43\x88\xb9\xc6\xac\x8e\x88\x14\x03\x79\xbc\x79\x54\xbd\x0a\x6c\x7a\xa1\xcc\xab\xe5\x2d\x40\x55\xfa\x6f\x61\xef\x33\xad\xe6\x72\xf1\x92\x57\xa9\x6f\xb5\x51\x4e\x22\x00\xa8\x9d\x50\x7c\x9e\x05\x06\xa9\x4a\x57\x75\x41\x6d\x33\x2b\x6d\xd8\xdb\x4f\x1b\xe6\xa4\xa9\xd2\x10\xfd\x8f\x85\xfc\x6f\xed\x68\xa9\x73\xc1\x66\x92\x6c\x4a\xa3\xad\xb3\xc2\x21\x2f\x35\xf2\xc9\xfb\x60\x36\xc3\x56\xb9\x44\xc1\x10\xbf\xf8\xa8\x23\x7c\x7a\x27\xb6\xa1\xa6\x56\x75\xe6\x78\xe8\xf3\xde\x90\x5f\x3f\x7a\xf4\xe8\x11\x91\x47\xd2\x8f\x47\xff\xf9\x9f\xff\xc9\xb4\x61\x9c\xe5\x22\x93\xe5\xa6\x78\xaa\x54\xc8\x24\xfc\xc7\xe3\xc7\x53\xf6\xb7\xb3\x97\x2f\x80\x27\xa5\x72\x96\xcd\xb4\xa3\xc0\x1d\x58\xf3\xed\x5e\x6c\x6f\xa2\xf6\x84\xfd\x3f\xd7\xaf\x2e\x89\x42\x43\xe8\x6e\x37\x64\x26\x3c\x84\x34\xc7\x71\xda\xc3\x77\x3d\xfa\xfd\xef\x7e\x47\x55\xc0\xcf\xa4\x01\x86\x35\x29\x90\x80\x2d\x92\xc5\x70\xf2\x5a\x72\x23\x90\x30\x17\x5a\x7e\xc7\xd8\x18\x09\xcd\x1c\xa9\x05\x2f\x8e\x37\x5e\x46\x29\x17\x4b\x17\x38\x58\xbd\xf6\x2b\x64\xe6\x60\xde\xd4\x8d\x07\x37\x42\xc3\x85\x0f\x2c\x4a\x38\xef\x44\x4e\x08\xd8\xaa\x13\x56\xc8\x1b\xc1\xe6\xf6\x6b\xa3\xeb\x8a\x4a\xc8\xca\x62\xce\x53\xd8\xba\x88\x24\x4f\x61\xe2\xfe\x57\x88\x22\xfd\x31\xf2\x5b\xf2\xd9\xd6\x28\x27\xe0\x2e\x7a\xea\xfe\xa2\x97\xb8\x38\xa1\x32\xf1\x32\x6c\xeb\x36\x41\x0d\x57\x71\xd9\x10\x2f\x41\x69\x21\xb8\xa8\xd4\x43\x3a\x0f\x07\x20\xbc\xa8\xe5\xad\x07\x41\x94\x18\x3a\xbc\x7b\xb3\xfb\xdf\x78\x49\x81\xa1\xb7\xf5\xec\xa8\x77\xdf\x86\xdc\x5a\x68\x98\x02\xf8\xc5\xa4\xe6\x74\x91\xcb\xd9\x47\xa0\xa1\x6f\x63\xd3\xeb\x84\x5c\x28\x33\x67\x9d\xfd\xf6\xe2\x0a\x69\xfd\x22\xdc\x88\x35\xd5\xd2\xff\xc4\x8a\x36\xbf\x45\x8e\x9d\xdd\xd2\x22\x4f\x66\xad\x3a\x33\x85\xdf\xa4\x06\x9e\xda\xe1\x6c\xc1\xfb\x04\xf2\x0a\x1e\x3a\x09\x52\x53\x39\xf1\x2b\x43\x1b\x91\x40\x9b\x1e\x7e\x81\x9c\xcb\x81\x15\x6c\x8e\xfb\x49\xfa\x11\xb5\xc2\xd5\x15\x6e\x17\xb0\xb6\xf8\x35\x15\xd6\x22\xe3\x3d\xd5\x2e\x73\x73\x23\xf2\x60\x46\x78\x31\x65\x57\x7e\xcb\xa0\x45\x17\x55\x3b\x8b\xd0\x04\x70\x85\x00\xdb\x92\xaf\x61\x39\x43\x22\x26\xc1\x8c\x1c\x4e\xa7\x87\x08\xce\xd0\x86\x59\xc7\x4d\x92\xfd\xf4\xd2\x3e\xf7\xfe\xb2\x2f\x79\x65\xb1\x53\x99\x54\x8b\x84\x1e\x4f\x21\x73\x06\x6b\x1b\x5c\x29\x1e\xce\xea\xbf\x6d\xaf\xd5\x04\x3f\xf2\xa1\xf5\x59\x7d\x13\x3a\xe8\x26\xf6\xe3\x0c\x06\xe2\xde\xfb\x5a\xa6\x54\xb4\xb3\xf7\x87\xcc\x49\x6b\xd3\xc4\x37\xdd\xc0\x39\x6d\xb5\xfb\x41\x37\xc4\x21\xde\x3f\x49\xeb\x93\xd9\xc6\xda\xdd\xa8\x39\x49\xe4\x66\xc4\x0d\xb1\x73\x92\xc4\xd1\xe3\x6e\x1c\xef\x89\xbe\xd3\x3e\x5e\x7b\x73\xb4\x19\x83\x27\x89\xec\xc6\xef\x4d\x24\x9e\x24\x71\x3b\x8a\x4f\x09\xbf\x70\x60\x2c\x7f\x31\x07\xdb\xde\xfa\xa4\x49\x32\x3b\xe9\xd9\x4e\x5e\x2c\x49\x64\x74\x6e\xfd\xad\x9c\x76\x02\xf1\xc4\x13\xbf\x15\xc4\x63\x54\x9b\x76\xea\x47\x0d\xe5\x71\xbc\x2f\xa0\x4f\x12\x1a\x5b\xbe\xf5\xc2\xfa\xb4\x4f\x6f\x52\x02\xa9\xc1\x3d\x8e\xf4\x10\x1f\x47\x6a\xa0\x8f\x83\x5e\xea\x80\x63\xcb\x96\x47\xff\x3a\xcd\xbe\x80\x23\x3d\x6f\x08\x1c\x01\x6c\x42\x0e\xcb\x71\xb8\xc6\xd1\x98\xb2\x97\xc1\xef\x4f\x3c\x1a\x5c\x31\x3e\xb3\xba\xa8\x1d\xa6\xf6\x40\x70\x92\xc4\x4e\x30\xd2\xc2\xbd\xd3\x1a\xaf\xe2\x80\x88\xa2\xf9\xee\xe4\x00\x05\x07\x84\xe1\xe8\xdf\xd3\x23\x96\x20\x2a\xcd\xf9\xa2\xbf\xf8\xbe\xf7\xb5\xb7\x7d\xb3\x1d\xef\x11\xee\x5e\x5f\x7a\x3f\xca\x2b\xef\x98\x2f\xbc\x89\x67\x40\x27\x39\xcb\xfd\xaa\xd5\x40\xae\x78\xbb\x14\xa1\xce\x8a\xaa\x28\xda\x47\x49\x6d\x98\x37\x1f\x90\x62\x0a\x5d\xc6\xc9\x61\xf6\x5c\x2a\x62\xde\x2b\x05\x59\x93\x59\x99\xfa\x44\x7b\x7d\xc1\x8e\x9e\x36\x14\xfa\xf4\x72\xe9\x0b\xe5\x84\x99\xf3\x4c\x1c\x77\x51\xb5\xa2\x5a\x8a\x52\x18\x92\x8f\x1b\x89\x62\x22\xab\xfb\x92\xab\xbc\x08\x2d\x1c\x84\x21\x66\x87\xc4\x9d\x13\x46\xf1\x02\x3e\x3c\x37\x72\x25\x8c\x65\x47\x7f\x11\x8e\xb3\xb9\xe0\xae\x36\x82\xd0\x45\xf3\xfe\xa8\xeb\xe0\x03\x3e\xf5\x23\x34\xfc\xe8\x18\xd4\x0d\x20\x28\x66\xba\x07\x37\x45\x68\x47\x30\x0f\xed\x96\xc6\x3e\x8b\xfe\xc0\xd0\xe1\xf7\x0d\x44\x60\xea\x95\x06\x78\xaf\xe0\xbc\xaf\x75\x4d\x75\x13\x11\x7d\x8f\xdd\xb0\x04\xcb\xb4\x31\xde\x6f\x87\xd7\x03\x72\x2d\xaa\x11\x0b\x69\x1d\x74\x13\x0b\x3e\x4a\x68\xd5\x73\x2f\x14\x56\x0f\x96\x34\x6d\x7c\x1a\xb2\x79\x48\xfc\xeb\x95\xcc\xe3\x03\x0b\x54\x59\x25\xa5\x49\xa4\x65\x15\xb7\x21\x2d\x04\xf5\x64\xd6\xea\x4c\x26\x60\x28\x3a\xf7\x02\x9f\x2c\x20\xcc\xcd\x85\x13\xa6\x94\xa4\x8e\xd9\x2c\xb8\x9a\xb1\x28\xad\xdb\x1d\x40\x33\x5e\x55\xc5\xfa\x5e\x0e\x9f\xd2\xb9\xb8\xaa\x67\x85\xb4\xcb\xeb\x11\x01\xa7\x97\x3b\xc4\xd2\x77\x97\x6f\x97\x0c\x26\x15\x76\x6e\x41\x57\x99\x15\xca\xca\x84\x90\xcf\xbb\xc8\x3e\x94\x95\x5a\x41\x8b\x54\x6e\x6d\x9c\xe9\xd3\xeb\xe1\x6c\xa7\x38\xa2\x66\xd6\x40\xf8\x5f\x08\x27\x1a\xa5\xdd\x59\xdf\xb7\x49\xaf\xb2\x2a\x07\x59\xdf\xaa\xaa\x2b\x8d\x65\xbc\x28\xc8\xfe\xf4\x1b\x4c\xa5\x8a\x22\xf7\x9b\x17\x5d\x5a\x7c\xa6\x64\x25\x39\xba\x9c\x45\x5d\x21\xbd\x1a\x89\x30\x64\xa8\x27\x45\x7f\x20\x41\x2d\xb5\x47\x6a\xe3\x70\x90\xdf\xfd\x34\x76\x10\x51\x4c\xab\x28\xfa\x84\xf1\xa2\x48\x3b\xb9\xcd\x3d\xc0\xfe\xc3\xa8\xf6\x52\x14\xc7\x1e\xe3\xdc\x1b\x7b\x8c\xf3\x43\xc0\x38\x8f\x58\x39\x73\x1d\x32\xe7\x68\x44\x78\x3e\x21\x76\x78\x65\x0d\xc8\xb7\x36\xa8\xe6\xa3\x4b\x9a\xf6\x8c\xbb\x45\xc6\xd6\x2f\xcc\xf9\xe4\xf1\x31\x6b\x20\xe6\x67\xce\x19\x39\xab\x1d\xf5\x7a\xef\x68\x8a\xd7\x8a\xa4\x22\x34\x9c\x06\xd4\x24\x18\xc6\x49\x78\x15\xc9\x3a\x9a\x88\xec\x99\x71\xd7\x51\xa8\x1d\xd3\x1d\x7e\x8b\xba\xbd\x31\x0a\xf2\x01\x50\x10\x75\x68\x59\xae\xb3\xba\x14\xca\xa5\xd0\x1d\xf8\xe3\xd7\x16\x19\xe2\xcb\xd3\x3d\x19\x02\x9e\xe7\x12\x6d\xfc\x55\xb2\x49\x48\xd0\x1c\xb9\xbe\x55\xb7\xdc\xe4\x67\x57\x04\x76\xee\x7e\x98\xdd\x4a\x4a\xc3\xe1\xc7\x29\x31\x2f\x89\xcf\x74\xed\x9a\xc6\xde\xfe\xc8\x51\x52\x3c\x7d\x20\xff\x1e\x96\x3f\x32\x2c\xdf\x69\x6f\x55\x3b\x28\xfc\x6d\x3c\x3d\x35\x95\xde\x54\x18\xef\x8b\x08\xf6\x45\x04\xfb\x22\x82\x7d\x11\x41\xc2\xdd\xdc\x17\x11\x7c\x70\x3c\x98\x22\x02\x2f\x07\xb3\x58\x05\xb6\xe6\xa6\xa6\x83\xba\xce\x44\x80\xf1\xcc\xa9\x64\x6c\x0f\x07\x63\xdb\x71\xb6\x30\x4a\x48\x20\x98\xeb\xb5\x48\xee\xe7\xe4\xc8\x12\xd1\x90\xb6\x30\x8e\xe4\x82\xf7\xa6\x9f\x71\x52\xe5\xc7\x83\xc0\xff\xde\x33\x86\x17\xd6\x8f\x9c\xb0\xc6\xf1\x1e\x42\xdc\x24\x4c\xc9\xb5\x28\x44\xe6\xb0\xe0\x45\x14\x79\x7a\x5a\x0a\x5a\xe7\x3f\x61\xd0\x02\x83\x2b\xa5\x31\x72\xb4\x69\x30\xb3\x82\xcf\x44\x61\x4f\xc2\x5b\x9a\xca\xe1\x5f\x6c\xc5\x49\x8d\xc4\xdb\xe1\xed\x73\x13\x98\x8e\x80\x32\x4b\x3a\xe2\x6c\x84\x63\xce\xe0\xa8\xc3\x4e\x5e\xd1\xcf\x3b\x1b\xe9\xcc\xb3\x5e\xba\x2e\x4d\xce\x66\x92\x06\x65\x26\x8a\x6c\x1e\x97\x6d\xb6\x14\x25\x4f\x3e\xf9\x7e\x3c\x8f\x8b\xef\xed\xe8\xad\x91\xce\x25\x42\x95\x59\xa8\x20\x12\xa6\xb4\x4c\xcf\x1b\x96\xb8\x34\x1c\x30\xc3\x00\xf2\x60\xf5\x98\xfc\x44\xda\x88\x19\x03\xc8\xcf\xa2\x8e\xbc\x4a\x44\x48\xb2\xcd\xa3\x72\x85\xe0\xc6\xf4\xd5\x02\xab\xea\x75\x24\x44\xb1\x45\xda\x4d\xc7\x11\x42\x8c\xb6\xea\xec\xec\x8a\xfa\x02\xd7\x8e\x15\xde\x8d\x07\xb1\xad\xff\xde\xf5\x19\x69\x46\xaf\xdc\xd7\x67\xec\xeb\x33\xf6\xf5\x19\xfb\xfa\x8c\x84\xb1\xaf\xcf\x18\x36\x46\xad\xcf\x18\x29\x44\x8b\xce\x64\xd8\xc8\xb1\xea\x3d\x54\x07\x7b\x4f\xce\xcd\xc4\x81\x24\x9a\x21\x91\x1f\x32\xf0\x4a\x27\x5f\xdd\xa6\xdc\x43\x9b\xc4\xa2\xf1\x30\xcd\xa5\x60\x87\x87\xd3\xe9\xe1\x61\x2c\x20\xa1\x17\xb7\x37\x93\xac\xdd\x7c\xf2\x07\x26\x54\xa6\x73\x54\x5c\xa9\x7a\xc0\x58\x07\x49\xab\xb6\x32\x62\xac\x3d\x2f\xc3\xbe\x8c\x55\x91\x82\x6b\x99\x7e\xfd\x13\xbd\xcc\xd8\xe3\xfe\xf9\xe8\x49\x96\x26\x3d\x92\xb4\x4c\x4d\x0f\xfe\xb0\xa1\x59\x84\xe4\xa7\x29\x06\xc8\xb1\x44\xd9\x96\x15\xb2\xa4\x3f\xcf\xe1\xf0\xe6\xc2\xbb\x31\xc2\x3a\xcb\x8e\x50\xe0\x34\xab\xea\xc4\xec\x0d\xca\x29\x45\xa9\xcd\xfa\xa4\xf9\x01\x2f\x78\xb4\xd9\x06\xe9\xc7\x8c\x93\x29\x57\x71\x64\xb5\x31\x42\xb9\x62\xfd\x4b\xcc\x0c\xc5\xc3\xf2\x00\x12\x43\xcd\x1d\xa0\x77\xbe\x6b\xc7\x06\xff\x7b\x14\x9d\x1c\x4a\x03\xea\xaf\x59\xfb\x84\xe7\xca\x76\x04\xe6\xfd\x93\x06\x6c\x9a\x2c\xd1\xc7\x08\x42\xad\xd8\x8a\x1b\x9b\x72\x52\xd9\x98\xb9\x9c\x5c\xae\xa4\xd5\x89\x0a\xee\x7d\x00\xb9\x51\x72\x39\xba\x76\x55\xed\x82\xdf\x38\x56\x22\x51\xdc\x55\xda\x8a\xbc\xd5\xca\x69\x9a\x93\xb5\xf8\x13\x78\xde\x3e\x78\x4c\xed\x7f\x1e\x47\xc5\x9d\x13\x46\x3d\x61\xff\x75\xf4\xee\xb7\x3f\x4e\x8e\xbf\x3a\x3a\xfa\xfe\xd1\xe4\x8f\x3f\xfc\xf6\xe8\xdd\x14\xfe\xe5\x37\xc7\x5f\x1d\xff\x18\xff\xf0\xdb\xe3\xe3\xa3\xa3\xef\xbf\x79\xf9\xf5\x9b\xab\xf3\x1f\xe4\xf1\x8f\xdf\xab\xba\xbc\xc1\x3f\xfd\x78\xf4\xbd\x38\xff\xe1\x67\x0a\x39\x3e\xfe\xea\xd7\x89\x13\xe7\x6a\xfd\x2a\xc9\xb0\x33\xd0\x80\x63\x85\x1b\x5d\x69\x23\x5c\x17\xc6\xee\x26\x2d\x66\x77\x22\x95\x9b\x68\x33\x41\xc1\x4f\x98\x33\x89\x79\x9f\x78\x1c\xc7\xd5\xb3\xe3\x84\x37\xdd\xf9\xb5\xa9\xd5\x7b\x54\x64\x80\xdc\x7f\x26\x93\xdb\x90\x9c\x07\x39\xa9\xfc\xb8\x4e\x94\x95\x36\xdc\xac\x59\x1e\x10\x2a\xeb\x51\x1a\x99\x76\x3a\x99\x0e\xc6\x90\x87\xf2\xcd\xd8\x47\xe6\x57\xb0\x66\xb9\x34\x9f\xb8\xaf\x48\x62\x7b\x52\x91\xcb\xba\x1c\x03\xd4\xf7\x9d\xdf\x0e\x28\x64\xd3\xf3\x58\xda\x4a\x05\x36\xc1\xa4\x22\x78\x72\xc6\xb3\x1b\xcc\x27\x37\x7b\x4f\x07\x0d\x89\x6e\xf7\xb9\x83\x83\x50\x2f\x56\x0a\x4e\x2e\x1d\x09\x10\x44\xa8\xf0\xd4\xb9\xf0\x47\x2a\xfe\x04\x7e\x47\x32\x02\x51\x85\x42\x9a\xc0\x7b\x70\x14\xc4\x1f\x53\x41\x4e\x86\xbd\x84\x40\xe1\x1e\x4f\x3c\x1b\xa1\x61\x9e\xfc\x97\x78\xe1\xa3\xaa\x31\x0e\xef\x1b\x0d\x29\xf1\xd0\x2d\x99\xfa\x50\x56\xe8\x8c\x17\x4d\x59\x77\xd7\x65\x86\xf3\x4b\x94\xda\xe8\xd0\x58\xab\xeb\x4f\xb1\xff\x7a\x0c\x2a\x89\x52\xa5\x65\xbc\xb0\x58\xcb\x28\x33\x3e\x2b\x04\x26\xda\xe1\x64\x24\xdd\x5b\x9c\x60\xc9\xef\x64\x59\x97\xac\xb6\x7e\x2d\xc8\xcf\xd4\x38\x9f\xa8\x11\x9a\xa5\xb8\xf5\x9a\x81\x0a\x75\xc3\xcb\x5a\x4a\x05\x13\x1c\xe3\xc1\xc6\xcb\xbb\x8e\xe7\xb1\xf3\x94\x99\xd0\x5c\x3f\x66\xad\x6d\x0d\x39\xb0\xb0\x0e\x49\xf9\x0d\x3d\x87\x8a\xb6\x26\xea\xb4\x0c\x88\x0d\x2b\x4d\x2e\xc5\xdb\xd0\xa7\x4a\x16\x63\x28\x54\x30\x24\xcb\x70\xbc\xbd\xdc\x5a\x05\xfe\x89\x91\x78\x51\x76\xab\xb9\xda\x0a\x33\x59\xd4\x32\x1f\x4b\xc1\x7d\x66\x71\x46\x42\x74\x31\x46\x4c\x31\x42\x24\x31\x72\xfc\xd0\x70\x7b\x24\x7a\xc1\x07\xe7\x51\x50\xaa\x1b\x1c\x5e\x1b\x77\x10\x86\xf0\xc8\x89\x40\xb1\xa4\xc1\x60\x85\x02\xe6\xa3\xb3\xa2\x5a\xa6\xb0\x85\xa0\x5e\xc0\xb9\x06\x07\x3b\x5b\x67\x05\xf2\x47\x4b\x6a\xe7\x92\x6e\x25\x4e\xe0\xa3\x01\xae\xdf\x89\xff\xff\x88\x04\xca\xed\x7b\x0d\x9b\x89\x39\xd6\x00\xe3\xaf\xc0\xe3\x00\x29\x73\x81\xef\xea\x85\x70\x40\xa0\x2c\x54\x23\x12\x4a\x9f\x4b\xbd\xa2\xa9\xb1\x77\x8a\x7d\x6b\x43\x01\x91\x9c\x3f\x61\xfc\xb8\xd7\xbe\x85\x72\x9e\x20\x77\xae\x84\xc8\x91\xea\xb9\x68\xbf\xde\xd4\x34\xb4\xe2\xec\x38\x1e\x1b\xeb\xad\x8d\xd2\x06\xde\xf1\x51\x9b\xc2\x93\x2e\x41\xa8\x11\xfe\x80\x42\xe3\x69\xa3\x4b\x66\x15\xaf\xec\x52\x3b\x78\x0f\xe3\x15\xcf\xa4\xa3\xf8\x2b\xef\xfc\x91\x32\x3c\xbb\xf1\x82\xa1\x48\x01\x16\xe2\x84\x65\xc7\xc4\x67\xec\x8d\x6b\x24\x6d\xc7\x11\x70\x4b\xa3\xeb\x05\xe5\xa1\x89\x37\x72\xb3\x82\xdb\xc0\x1e\x9e\x1f\x07\x22\x34\x6a\x94\x15\xe6\x18\xd2\xfb\x96\xe5\x6b\xc5\x4b\x99\xc5\xe3\x04\x94\x1f\x56\x6a\x22\x6c\x3a\x7c\x2d\x4e\xff\x4a\x18\x2b\xad\x13\xca\x21\x5e\xfc\x69\xc1\x25\xa5\x57\xe3\x91\x15\x82\x35\x9a\x14\x65\x5d\x63\xc6\x04\x11\x22\x24\x57\xeb\xdd\x06\x1b\x84\x56\xf1\x75\x4a\x89\x8c\x58\xef\x19\x11\x46\x9d\x62\x3f\x0c\x8c\x51\x3b\x10\x24\xee\x5c\xc3\xe3\x69\x54\x0a\x63\x2d\xb1\x36\x40\x7f\x10\xf2\xb8\x2b\xa1\x72\xdd\x29\xdb\x3d\xbb\xba\xa0\x68\x19\xbf\x39\x51\x03\x80\xee\xae\x70\xb6\xf0\x3f\x14\x5a\xd1\xfc\x05\xe0\x6a\x40\x27\x31\x5a\x17\xef\xde\x2a\x26\x55\x2e\x57\x32\xaf\x49\x8f\x0a\xde\x15\x8e\x8b\xfa\xf4\xfa\x02\xa7\x28\x17\x4b\x37\xb9\x15\x44\x18\x0e\xc6\x84\x8d\x2b\xd1\x2c\x85\x9c\x27\xd0\x8d\xb4\x2a\xc6\x3b\xda\x2e\x40\x0f\x10\xca\x47\x2b\x54\xbd\xe5\x6b\x36\x61\xfe\x8a\x01\xed\x4d\xb7\xe2\x99\x8e\x87\x0f\xd3\x8c\xd7\xb3\x7b\xd1\xfc\x32\x13\x24\x9e\x81\x79\xca\xb8\x82\x9c\x0b\xa0\xd9\xfc\xcd\x02\x6b\x93\x42\xc5\x16\x77\xc5\x2b\xd7\xaa\xb9\x4d\xed\x5f\x53\x96\x14\x34\x34\xf7\x77\x5f\x96\x62\x3a\xfc\xd1\xe2\x1e\xb3\x82\x7b\x46\x87\x07\xc0\xe8\x00\x5a\xfc\x8d\x28\xab\x82\xbb\x31\xca\xae\x0f\xbe\xeb\x80\x0b\xe9\x25\x56\xa1\xc0\xca\xfb\x25\x5c\xe5\x13\x5e\x78\x93\x71\xf5\xf6\x29\x5d\x62\xe3\x6d\x74\xb7\x13\x62\x88\x4a\x53\x93\x3c\x52\x85\x4c\x04\x18\xe1\x9d\x6e\x03\x3d\x71\x26\xca\x99\xc8\xc1\x6b\x0e\x2b\x0a\x6f\xa9\xb7\xf4\xd7\xf6\x60\x71\xaf\xde\x3e\x3d\x61\x72\x2a\xa6\xf1\x4f\x29\x8d\x61\x66\xa2\x09\x43\x9c\x5e\x20\xa9\x28\x40\x3f\xe9\x20\x4d\x30\x8f\xb0\x31\x5d\xe0\x5c\xfa\x3c\xff\xf1\x27\xaf\xd5\xbd\xcc\x3f\x4f\xfe\x14\x1c\x26\xf8\xd3\x3f\x88\x32\x6f\xa1\xc3\xf1\x3f\xfa\xb2\xd2\xda\x17\xc1\x17\x43\x00\xe2\xbf\xf9\x1f\x57\x3a\xf7\x9a\x6d\x8a\x07\xca\x52\x27\x0a\x15\x9d\x4c\x28\x67\xd6\x53\x76\xa5\x81\x19\x44\xe6\x29\x44\x23\x70\x24\x8d\xf8\xef\x00\xc7\xc5\xc8\xb3\x81\x5c\x65\xdc\x09\x95\x40\x34\x10\xdb\x40\x29\xed\x70\xaa\xa0\x85\xb9\x3f\x03\x44\x89\x47\x00\xdd\xc0\x4e\xa1\x27\xcc\x69\x0d\x3e\xe1\x31\xd1\x3f\xf0\xe3\x4c\x31\x71\x27\x2d\xb4\xa3\xc6\xb3\x09\x87\x9e\xbb\x14\x06\xce\x98\x72\xf1\x1f\xee\x6f\x7a\xd3\x28\x9e\xae\xa2\x60\xa7\x7e\xa3\xb4\xfb\x4d\xa3\x94\xa3\x49\xa3\x0b\x75\x9a\xf1\x95\x86\x16\xb1\x10\xd8\x2a\x56\x2b\xc0\x4e\x92\xb7\x3c\xdc\xa1\xd9\x9a\x95\xd2\x3a\x7e\x23\xa6\xec\xda\x71\x93\xd0\x16\xbf\x93\x10\x71\x4b\xa1\xd8\xac\xd0\xd9\x8d\xc8\x59\xad\x9c\xa4\x6a\x11\x2f\xb3\xf9\x52\xd8\xf6\xb4\x74\x0b\x0b\xdd\xc5\xea\x6c\xc9\x38\xab\x8c\x98\xc4\x44\x11\xca\x26\x3f\x67\x6c\xb8\xeb\xed\x29\xa2\xa2\x64\xa2\x0a\x5e\x72\xf0\x61\xea\x2a\x87\x69\x26\xe0\x5a\xb9\x42\x63\xb6\x4d\xe3\x48\x3f\x97\x5a\x65\x6d\x7a\x09\xae\xa7\x9d\xb2\x4b\xc8\x0f\x91\xdd\x41\xa4\x91\xc0\x47\xe2\xd0\x06\x4d\x89\x4c\x58\xcb\xcd\x9a\xba\x9a\xb3\xda\x31\xe9\xa0\x4b\x17\x6e\xd1\xbc\x2e\x30\x8d\x57\x72\x55\x27\x4c\xd6\x88\x4c\x2b\xeb\x4c\x9d\x81\x62\xe2\x6c\x66\xf4\x8d\x50\x69\x54\xb6\x90\x16\xec\xf3\x37\x36\x3e\x76\x02\xbf\x84\xd2\x2c\x5b\x72\xb5\x10\xb6\xf1\x70\x4a\x9e\x83\x0e\xf8\xa6\x49\xb0\xd3\x15\x54\x3c\xb1\x7c\xee\x7c\x10\xeb\xe0\xe8\xce\xe8\xaf\x6f\x0d\xe4\xfe\x9d\x62\x11\x8f\x73\xd2\xe0\xbc\xe9\x6e\x89\x92\x05\x21\x6c\x63\x63\x00\x5e\xd3\xa0\xae\x13\xc8\x3c\xd2\xde\xac\x92\xa1\xad\xa5\x70\x3c\xe7\x8e\x8f\xc4\x14\xf9\x92\xaf\x9b\xf6\x14\x58\x02\x9f\x80\x8a\xf2\xe1\x7d\xa7\x20\x1f\xad\x7a\x82\xef\xca\xc2\x1b\x82\xae\x64\xb7\x4f\x24\x78\x1d\xcb\xa4\xf2\x3f\x38\xd3\x5e\x51\x48\xe7\xf5\x64\x28\x39\x42\xea\xc8\x94\x05\x30\x82\xf1\xa2\xd0\xb7\x22\x87\xc5\x08\xd7\x3b\x41\x22\xba\x9a\x22\x67\x79\x0d\x39\xfa\xd6\x81\xa5\x17\xdf\x8e\x80\x17\xf7\x17\x60\xa4\x13\xf8\xa6\xad\x4e\xce\x52\x3c\x73\x16\x92\xa1\x70\x42\x76\x65\x6c\x53\xaa\x95\xfd\x24\x85\x72\xd2\x88\x6e\x83\x55\x3c\x98\x09\x62\x6b\x85\x86\x60\xe3\x70\x13\x93\x8c\x71\x2c\x84\xb3\x2d\x61\x1b\xc6\x54\xde\x19\x0c\xb9\x8e\xd4\x75\x80\xa4\x1b\x5e\x15\xc6\x11\xe4\x90\x20\x71\xe7\x56\x25\x96\x58\x00\xf2\x06\xe3\x27\x1f\xa9\xde\xeb\x4d\x19\xab\x9c\x81\x67\xde\xf5\x7a\xa9\xf3\xd4\xaa\x88\x3e\x32\xeb\xac\x15\x9b\x24\xb5\xa9\xb6\xb0\x81\xd8\xdd\x7a\xfb\x9a\x28\x12\xbf\x19\x2a\x41\x6d\x7a\x43\xdb\x38\x82\x4b\xbb\xe4\xab\x1e\x28\x35\x51\xea\x10\x80\x5f\x9b\x02\x9f\x44\x28\x0c\x7e\xea\x04\x3e\x75\xf2\x38\x0d\x9a\x9c\xca\x66\x15\x47\x12\xab\x55\x7f\x32\xc9\xf8\x75\xef\xf2\x5c\x8f\x00\x30\xdf\xc0\x25\x36\xbe\x7d\xea\xe1\x47\x9e\xb8\x86\xed\x01\xbb\x0d\x25\x0a\x15\xd2\x7b\x25\x4f\xd8\x6f\xba\x39\x97\x44\x99\x21\x43\xdb\x3c\xf2\xa7\x16\x8d\x31\x78\x3a\x0e\xe2\xa6\xe1\x80\x4f\x6f\xfe\x00\xa7\xbf\xff\x63\x54\x40\x6d\x1c\xbf\xd9\x4a\x3d\x1d\xed\x7e\xb8\x1d\xf5\x77\xb2\xda\x3a\x4d\x79\xed\xed\x8e\xb6\xf8\x00\xf2\x5c\x65\x85\xfd\xdf\x52\x55\xae\xbf\x14\x91\xfc\x56\x6a\x15\xa0\x45\xa9\xdf\x7f\xa1\x98\x36\x39\xb6\x5a\xa8\xad\x18\x7b\x05\xe0\x3d\x31\xd1\xc3\xf1\xa3\x59\xc5\xcd\x65\x48\xad\x87\xf2\x86\xe6\x4c\xad\xf1\x44\x3d\x6b\xf4\x4e\xa2\xd4\x00\xdc\x61\x0b\xee\x44\x62\xb7\xb0\x38\x84\xe2\xb3\xc2\x07\xe6\xa1\x65\x43\xf3\xd0\x93\x5c\x76\xa4\x0d\xc0\xe2\x63\xaf\x2b\x6f\xda\x8d\x2e\x8a\x64\xb9\x5e\x4d\x06\x50\xcc\x28\x1d\xff\xe3\x80\x13\x80\x07\xec\x24\x01\xaf\xd6\x9b\x6a\x7c\x87\x53\xe2\x76\x1c\xbf\x63\xc6\xbd\x75\x68\x11\x30\x6e\x04\x0d\x10\xc9\xc5\x1a\x24\x94\x5f\x89\x54\xff\x08\xd6\x31\xa9\x22\x79\xb4\x9a\xe4\x71\xaa\x92\xa1\x39\xbb\x24\xe7\xeb\xa2\x88\x84\xf7\x0d\x1c\x63\x15\x36\x03\xe7\x1d\x50\xb7\xa4\xd7\xc5\xf5\x1c\xa2\xb3\xab\x0b\x10\x9b\x2c\x95\xc5\xae\x6c\x0b\x2f\x6e\x94\xaa\xe6\x86\x97\x17\xed\xc8\x4c\xa4\x3b\x43\xac\xdb\x43\x06\xf5\xe8\xb8\x2b\x30\x22\x1b\x12\x8e\xfe\x65\xff\x26\xf5\x4c\xe3\x88\x2c\x60\xb1\xfb\x1b\x0d\xea\xb7\x39\xce\xae\x2e\x70\xf7\xa7\xec\x39\xd8\x93\x54\x77\x98\x35\xd4\x40\x6e\x29\x4d\x3e\xa9\xb8\x21\x41\x53\x37\x07\x78\x24\x27\x23\xef\x7c\x6a\x17\xa6\xfe\xf4\x46\x2a\x00\xf6\x3a\x70\x64\x8d\x31\xd2\x11\x0c\xda\x22\xd6\x37\x8e\x40\x22\x11\x07\xe8\x89\xce\x2d\x7f\x48\xfb\x91\xd6\xf1\x29\x8e\x7e\xab\xb9\x54\x1b\x85\xa3\xd3\x53\xf3\xdf\x64\x3f\x1a\x3a\x85\x31\xf3\x0b\xaf\xa3\xd0\xe4\xe8\xa9\xe1\xf1\xee\xd4\xd6\x8d\x14\x92\xfd\xd2\x53\x6b\xcd\x77\x3e\x10\x8f\x76\x3c\x2f\x10\xcb\x15\x47\xd6\x20\x87\x2f\xd2\x49\x9e\xba\x62\x67\xe1\x80\x85\x8a\xd5\x11\xe4\x36\x75\xc4\xd0\x09\xb2\x76\x63\xa8\xa5\xf6\x32\x84\xf7\xbb\x74\xc3\x3d\xb8\x5f\x7c\x0f\x7f\x7b\x5a\x72\xc5\x17\x62\x12\x3e\x71\xd2\x4c\x70\xd2\x14\x98\x9e\xa6\x32\x58\x8c\x78\xa8\xd9\xc8\x9d\xaf\xba\xe3\x33\x2b\xf4\xdc\x58\x94\x31\x48\x65\xd8\xe8\xc4\x32\x6c\x6c\x72\x19\xf6\xb1\x09\x66\x58\x43\xc4\x36\xb6\xc2\x7b\x1d\xe4\x8e\xaf\xf2\x46\xb1\xd3\xec\xa3\xab\xbc\xf1\x82\x15\x40\xf5\xc5\xf5\x84\x7e\xb7\xa5\x74\x74\x70\x64\x77\x20\x12\xb6\x51\x7e\x63\x44\xd3\xd2\xf5\xa8\xaf\x46\x33\x7c\x00\x08\x46\x40\xab\xb8\xab\x0a\x99\x49\x47\x06\xb6\x75\x47\x9b\x4a\xc0\x40\xf8\x56\xda\x31\x0e\x82\xd3\x50\xd9\x15\xf3\xe9\x60\x7e\x26\x81\x12\x60\x04\xf1\xc0\x00\x31\xa2\x3b\xc8\x7e\xa6\x4b\xb8\x37\xa7\xbb\xc7\xde\x9c\xb2\x7f\x7b\x73\x8a\x0c\x68\xa9\xe4\x89\xfd\xdc\x31\xe2\x07\xd9\x3f\x6b\x41\x66\xb8\x89\x43\xaf\x44\xa7\xaa\x55\x7b\xad\x6f\x65\x9e\xbc\x4b\xde\x84\xcc\xa4\xca\x13\xfa\xe2\xe1\x78\x80\xb1\x60\xc9\x5d\xb6\x3c\xbf\xab\x8c\xc0\x2e\x11\x23\x3b\x49\x9b\xe2\xc7\xc9\x31\x35\x4d\xe0\xf0\xec\x8c\x61\x22\xc3\xc1\x8e\x3e\x0d\x3c\xb3\x8f\xe1\xd7\xbc\x59\x8a\x9e\xcc\x31\x74\x99\x11\xec\xec\xf2\xd9\x78\x49\xe2\x74\xc8\x0f\x1b\x0b\xf6\xc3\xde\xa3\x1e\x46\x10\xbb\x7b\x93\x47\x11\x0c\x47\x32\x4a\x1f\x45\x22\xf8\x81\x11\x1a\x37\x8a\xc4\xd8\x10\x84\xb3\x1b\x41\xae\xc3\xe8\x0f\xc4\x6d\x33\xaf\x8a\xf8\xa8\x1f\x8e\x05\x43\x29\x75\x81\xfd\x71\x23\xa0\xee\x22\xa9\xc1\xf7\xc6\x34\xc7\xf4\xd8\xc6\x7a\xad\xc6\x31\xf1\x9f\x3b\x8a\x9c\x11\x37\x76\x3c\x83\x85\xe3\x46\x10\xab\xe0\xb7\x47\x4f\xdd\x8c\xb3\x74\x38\xc2\x63\xc8\x78\xfa\x8b\x85\xa3\x1c\xa9\xd8\x46\x13\xda\x28\x46\xa0\x1d\x1c\x81\xc5\x3a\x0e\xa7\xc7\xb8\x6c\x6c\xdc\xe7\x33\x1c\xf1\x70\x7f\x94\x63\x34\xaa\x4a\x64\xbd\x97\x9c\xd1\x44\x82\x21\x38\xb4\xa1\x87\x87\x56\x76\x29\xc7\x78\xc4\xc6\xe1\x34\x58\xc4\x04\xd6\xce\xed\x11\xb4\x37\x7b\xcb\x0b\x39\x46\x82\x01\x47\xdc\xaa\x11\x17\xd6\x08\x76\xa1\x4e\xd8\xa5\x76\x17\xc9\xa8\xc2\x76\x9c\x43\x79\x66\x42\xfd\xe0\xf6\x78\xa6\x85\xbd\xd4\x0e\x24\x3f\xd8\x8b\x8a\xdb\xfe\x51\xae\x29\x8a\x1e\x53\xe1\x73\x35\x92\x37\x1d\x07\xb0\x36\x8f\xb6\x96\xac\x73\x8d\x2e\xc6\xbb\x99\x40\xb4\x31\xb6\xca\x93\x16\x21\xc5\x63\xdf\x23\x78\xb5\x1e\x77\xe3\x91\x2f\xa2\x4c\xed\xd8\xd4\x1d\x33\xc1\x94\x56\x13\xa0\x3a\x1d\xeb\x6a\xb2\x88\xf8\xfd\x18\x7b\x85\xea\x69\xbc\x73\x6f\x7a\xda\xe9\xdf\x70\xfb\x47\xde\x7a\xa8\x59\x19\x57\x37\x01\x5e\xad\x2a\xf8\x18\x70\x9c\x38\x42\xbd\x2a\xf7\x5a\x8f\x3b\xb1\x90\xb4\x82\xe9\x5d\xa3\x14\x66\x21\x58\xc5\x5d\xb6\x1c\xd7\xd8\x8d\xb9\xaa\xa3\x65\x51\x70\x8c\x68\x8d\x21\x95\xf7\x02\x6a\xbd\x3f\x46\x92\xf0\x45\x6a\x15\x79\x1c\x90\x8c\x29\x79\xe5\x4d\xe7\xff\xba\x11\xeb\x13\xb8\xed\xff\x7b\x94\x17\x10\x69\xec\x94\x9d\x31\x2b\xd5\x22\xb1\x2d\x21\x8e\xce\xfc\x02\x8c\x76\x04\xa1\x9d\xe5\xf4\xeb\x30\xce\x92\x8a\x7f\xd6\x72\xc5\x0b\x01\x3c\x29\xa3\x3c\xc8\x30\x11\xea\x70\xf4\x7c\x2b\x4d\x3c\x86\xba\xbf\x5d\x6a\x2b\x20\x5e\x1e\xa3\x52\x8f\xe1\x32\x1c\xdc\x88\xf5\xc1\xc9\xd8\x46\xd4\x0b\xbe\x50\x07\x27\x91\x5e\x7e\xac\xd7\xd3\xa0\xf0\xc7\x4c\x24\x02\x87\xc9\x01\x48\x3f\x48\xef\x28\x89\xa3\x9b\x1f\x4f\xee\x92\x87\x63\xd4\xfc\xf8\x03\x7f\x98\x1d\x49\xc7\x07\x28\xe4\xd3\x82\x5b\x9b\xde\xf9\xae\x0f\x95\xb9\x44\x40\x70\xe2\xc7\x42\x3f\x87\xce\x2c\x9b\xb4\x69\xa2\xdc\xc0\xf6\x94\x01\xdb\xc3\x83\xc1\x9f\x02\xb1\xf4\x38\x35\xdd\xc9\x67\x03\xe7\xf4\x32\xb1\x65\xfe\x66\xf4\xdd\x08\x4d\x5c\xe8\x48\x3b\x7f\xdb\xe9\x75\x94\x28\xb2\x21\x70\x6f\xfb\xc5\xcc\x52\x5d\xbc\xce\x19\x7b\x0b\xdd\x4d\x92\x67\xf9\x5c\x16\xc2\xae\xad\x13\xa5\x9f\xa9\x2c\xab\x22\xbd\x26\x12\x58\xb5\x94\x76\x4c\xaa\xac\xa8\x73\xe0\x18\x49\x14\x09\x1f\x0d\x28\xa4\x31\x9e\xcf\x47\x3a\xcc\x23\xab\xb8\xb7\x8d\xd0\xc4\xc5\x0a\xaf\x06\x01\x6f\xd0\x56\x3c\xa4\x1e\x3e\xbd\x93\xe1\x26\x55\x73\x06\xa6\x7e\x20\x8a\xc9\x52\xd9\x72\x92\x76\x78\x4e\x20\x16\xea\xed\xe0\xf3\xa7\xdd\x7a\x09\xce\x9e\xcb\x19\xc9\x15\x79\xba\xe4\x4a\x89\x62\xb3\x78\xdf\x32\xee\x1c\xcf\x96\xa4\x0b\x0a\xe9\x74\x6f\x47\x0a\xe1\x0e\x2d\x5b\x6a\xeb\x58\xc9\xb3\xa5\x54\x82\x98\x10\x06\x8a\xc7\xd8\x13\xb4\xe5\x11\x1c\xbe\x7d\xf7\xc8\x87\x3d\xb7\x6f\xfc\x8f\x93\x4e\x5c\xdf\x3f\xe9\x28\x52\xff\x3d\xc4\x33\xec\x34\x03\xbc\xed\xb4\x6d\x12\x07\xfd\xeb\x51\x32\x55\xa8\xb7\x67\x4d\xc3\xe7\xe8\xab\xc0\x09\xc0\x08\x84\xae\x0c\x71\x5e\x53\x76\x7e\x37\x65\x07\xe2\xce\xfd\xee\xe0\x84\x1d\xdc\xcd\xad\xff\x87\x72\x73\x7b\x40\xa6\xe8\x2c\x23\x7a\xd5\x3b\x52\xc2\x18\x3c\x63\x33\x11\x7e\x86\x28\x56\xce\x59\xad\x1a\x30\xeb\x94\xbd\x79\xf5\xec\xd5\x13\xb6\xd4\xb7\x2c\xa7\x86\xa4\xb7\x82\x55\x46\xac\x7c\x18\x2a\x8c\xd1\xd8\x7c\xcb\x2f\x70\xf2\xbe\x01\x81\x56\xa6\xcb\xca\xe8\x52\x5a\x54\x92\x22\x5e\xda\x7b\x69\xcd\x57\xd4\x6a\x8c\xbb\xf2\x2a\x74\x87\x06\x8d\xe9\xb8\x59\x08\x6a\x68\x54\xd4\x8a\xa9\xba\x9c\x89\xa4\x56\x85\x29\x48\x4c\x6c\x7c\x00\x32\xbe\xfc\x82\x20\x61\x44\x46\xfe\xce\xba\x46\xf2\x7b\xba\x1a\xda\x41\x99\xcf\x5e\x87\xb9\x12\xa5\x02\x77\x37\x10\x13\xce\xb5\x09\xac\xb1\x89\x22\xad\x70\x48\xa6\xa8\x82\xfb\xf4\xd2\x6b\x4f\x4b\xa4\x90\x48\xa5\xf7\xc7\xa3\xfc\xdd\x77\x97\xc4\xa0\xfc\x63\xdd\x92\x5b\x6d\x8a\xfc\x56\xe6\x58\x56\x6b\xd9\x91\x9f\xe2\x71\xca\x1a\xd1\xf3\xd5\x49\xd9\xe9\x44\xf5\x75\x7b\x2b\xf3\xf1\xb7\x26\xa9\x7e\x15\xb6\x86\xc1\xde\xc8\x5c\x28\xe7\xed\x92\xb1\xec\x08\xa6\x4a\xe5\x53\x3a\x97\xd8\x14\xc0\xcb\x80\x6e\x5a\xba\x9c\x49\x95\x42\x71\xa9\xe7\x9d\xc3\x0d\x39\x46\xaf\x79\xd3\xc8\x84\xac\x70\x27\x40\xcb\x0c\x14\xcf\xda\x2d\x99\x95\x65\x5d\x38\xae\x84\xae\x6d\xb1\x4e\xba\xc4\x9f\xdf\x01\x9d\x17\xe2\x0e\x75\x58\x6a\x14\xd2\x08\x4a\xed\x4a\xb8\x10\x4a\x98\xb6\x79\xd8\x66\x38\x42\x90\xd9\x12\x45\xe5\xa7\x31\x98\x69\x19\xed\xc5\x1d\x89\xdc\x18\xe9\x8d\xaa\xa2\x5e\x48\x02\x37\x6d\x52\xf4\x41\x47\x5d\x4e\x42\x13\xa5\x4f\x1c\xf0\xe0\x8f\x8e\xa0\x03\x9f\x35\x9d\xaa\x22\x5d\x43\x82\x6a\x59\x36\xcd\xf5\x02\xf3\x5b\x62\x67\xe5\x94\xce\x41\x89\x36\x66\xb4\x88\x72\x23\xa0\xa4\xbf\x99\xed\x03\x4a\xb6\xd1\xd1\xb8\x5d\x00\x96\x8b\x4a\x28\x32\xf3\xb6\x56\x5d\x6d\x8b\x9b\x77\x2f\xa7\x4e\xc3\xa1\x19\xd9\xb7\x39\xbf\x73\x86\x4a\xe9\x96\xe9\xb2\xf4\x6e\x42\x98\x98\x0f\xbc\xb9\x4a\x33\xe9\x09\x6f\x68\x63\xbe\x9b\x25\xee\xd4\x3e\xde\xfb\xe5\xc4\x7b\x56\x64\x46\xb8\xd7\x82\x58\x16\xfa\xbe\xcd\xbc\x8e\x62\xa9\x49\x2e\xbb\xdd\xe0\x05\xa7\x9a\xf6\x0e\x1d\x30\x00\x7e\xfd\xad\x50\x56\x3a\xb9\xea\xb5\x7e\xa4\x1f\xbe\x8a\x5b\xdb\xa4\x90\xc1\x8f\x0b\xca\x94\x5c\x69\x03\x58\xb5\xd0\xec\x05\x60\x70\x5e\x03\x29\x1d\xd6\x81\xaa\xee\x61\xf5\x7a\x0d\x80\x23\x05\x2a\xf9\x3c\x77\xb6\xa5\x25\x32\x27\xf6\xbc\x65\xb1\x7f\xaa\x56\x71\xc7\x4f\x18\x2f\x8a\xf0\xef\x54\xed\xc0\x8d\x80\x1d\xea\xa4\xf9\xfb\x7b\x74\x4f\x5a\x3d\xbd\x22\x28\x8d\x06\x6d\x27\x40\x21\x11\x7c\x13\x2e\xae\x9b\x0e\xa5\xf0\xd1\x2b\x61\x56\x52\xdc\x9e\xde\x6a\x73\x23\xd5\x62\x72\x2b\xdd\x72\x82\xab\x6b\x4f\x21\xef\x73\xfa\x2b\xf8\x47\xc2\xec\x30\x5d\x7e\x96\xe7\x81\x0e\x31\xb4\x51\xc2\x96\x0c\x29\xef\x76\xbc\x92\x6f\x85\xf1\x81\xe1\x09\x70\x05\x9e\xb0\x5a\xe6\x5f\xd1\x81\x0b\x49\x71\xb8\xce\x6e\x28\x21\xd2\x46\x10\x0e\x52\x7a\xef\x81\x84\xaf\x89\x62\x42\x04\xde\x84\xcc\xfd\xd7\x3c\x82\xe0\xee\xfb\xdf\x14\xb5\x65\x70\x85\x03\x4f\x70\xc2\x64\x03\x69\x33\xb3\xfe\x44\x46\xc2\x54\x66\x6a\x45\xea\x3a\x7e\x8f\xaf\x83\x39\x77\xdc\x0a\x47\x7f\xe7\xdf\x22\x48\x6c\xa2\x5d\x94\x4c\xb5\x1a\x4e\x1b\x91\x33\x6e\x9b\x9e\x4c\x6c\xf2\xe7\x40\x99\x48\xb6\xc2\xed\xac\x20\xfa\x8e\x9b\x89\xc4\x7a\x44\xa1\xd0\x42\x09\x09\x14\x70\xbe\xb9\xbf\x0e\x19\xb9\x69\x61\xa2\xef\x1d\xbe\xef\xdb\x6f\x2f\x9e\x8d\xb0\x9f\x5e\xcc\xc6\x7e\x26\x79\x2b\xd2\xb2\x5a\xc9\x7f\xd6\xdd\x4c\x30\x1d\xe0\xc3\x9b\x1d\x4c\x39\x6b\x09\x0b\xbe\xc8\x44\x0b\x15\x79\x26\xed\x4d\xa2\x46\x3d\xfc\xfa\xe9\x79\x5f\x60\x6a\x7a\xf3\xeb\xa7\xe7\x2c\xc8\xf9\x48\x38\x8b\x8f\x0b\xb4\x48\xc3\x19\x0e\xc1\x16\x46\x40\xe1\x22\x13\x2d\xcc\x30\x97\xf6\x66\xb8\x85\xbe\xb7\x74\x6b\x95\x93\xa0\x55\xbf\x2c\x7c\x49\x50\x57\xc1\x9d\x80\xe3\xbe\xd6\x35\xbb\xe5\x64\x1a\x8b\x16\xb1\xf2\x46\x56\x4f\xd8\xb9\xb2\xb5\x11\xa9\xf5\xe5\xf3\x8d\xdc\xa7\x8f\xb8\x62\xba\xf1\xff\xb0\xf7\xed\xcd\x8d\xe4\xd6\xbd\xff\xe7\x53\xa0\xe4\x5b\xa5\x99\xb5\xc8\x99\x8d\xd7\x5e\xdf\xa9\x54\x5c\x5a\x49\xeb\xe8\xee\x68\x46\x91\xb4\xe3\xba\x65\xfb\x26\x50\x37\x48\xe2\xaa\x1b\xe8\x05\xd0\xd4\x30\x71\xbe\x7b\x0a\x07\x40\xbf\xd8\x6c\x36\x01\x48\x94\x62\xe2\x9f\xd9\x95\xc4\x43\x3c\xcf\xf3\x77\xce\xf1\x15\x45\x7d\x4e\x4a\xe7\x6e\xf4\x8d\xb3\x99\xee\xc6\xf2\xc3\xab\xc4\xbe\xec\x68\x60\x6c\xe5\x05\xbe\xb2\xaf\x01\xc1\x59\x07\xd3\xf8\xae\xb5\x0b\xc1\x59\x07\xd3\x04\xe8\x49\xfb\x84\xe0\x14\x58\x28\xf0\x65\xc6\x60\x2a\xd0\x8a\xdf\x11\xf4\x47\xe9\x6e\x62\x29\xc1\x31\x8b\xcb\x99\x2b\xe3\x78\x62\x9b\xbb\x81\x9b\xd3\xdf\x2f\xe6\xb8\x95\x66\x07\x8d\x1e\xf2\xe1\x0c\xe0\x47\x5e\x19\x69\xef\x52\xb2\x7c\x27\x53\xfc\xad\x6f\x0a\x92\xde\x3e\xdb\xc7\xcb\xc8\xfa\xea\x84\xb0\xef\x7b\x38\xfa\xf6\x68\x8a\x6e\x69\x4e\x33\x2c\xb2\xd5\x49\xf3\xc4\x2a\xea\xbe\xbc\x9a\x8b\x6a\xc9\x90\x86\xf4\xfe\x08\xbd\xe1\x42\xaf\xc2\xd7\xcf\x88\x19\xca\x08\x5e\x12\xd7\x5b\x48\x0b\xe0\x95\x71\xe3\xbd\xf5\x3d\xaa\xd8\xdc\xee\xb5\xe2\xcd\x8c\x1a\x14\x83\x79\xfc\x6c\x8c\x15\x16\xec\xf7\xba\x3e\xaf\x35\x70\xca\xb4\x5a\x3e\x45\x3f\x1b\x5d\xd7\xf7\xa5\x1b\x03\xca\x3c\x1f\x7d\x5a\x15\xdd\x2b\x7f\xcf\xea\x0b\xb9\x3c\x2f\x22\xf2\xe4\xc2\x38\x75\x8c\xc7\x9f\x7b\x74\x22\x43\x8d\x18\x8f\x27\xcd\x56\x64\xa8\x0a\x8d\x55\x41\xae\xff\x09\x1c\xc4\x2f\x66\x35\xa7\xea\x86\x14\x1e\xd6\x62\xc7\x10\x37\x64\x42\x7d\x9b\x73\xaa\x34\x09\x2e\xa9\xe2\x62\x85\xb0\x42\xd8\x08\xa3\xa4\xcc\xb0\x40\x82\x18\xa4\x90\xcf\x71\x9d\x5f\x5c\xdf\x5c\x9c\x9d\xde\x5d\x9c\x7f\x40\x6e\xb6\xb4\xe9\x7d\xf2\x21\x7a\xc7\x6b\xf8\x52\xb3\x1e\x34\x7a\xa4\x6a\x11\xb4\x03\x27\x56\x29\xc1\x0c\x5d\x68\x21\x77\x4e\x05\xb4\x65\xf6\xf1\x6a\x30\x74\xc9\xa8\x3a\xab\x26\x67\xca\x00\x66\x9c\x79\x17\xc3\xd3\x33\xb4\x18\xad\x39\x55\x27\xc6\x1d\x61\x26\xac\xdf\xad\x9b\xb1\x07\xe5\xba\xf5\x34\x4f\x8f\x8f\x65\xbd\xa5\x1e\x11\xa5\xbd\xf9\x15\xea\x2b\xfc\xdc\xde\x69\x2a\xa0\xe4\x5a\x0c\x86\x7e\x07\xe0\xce\x9a\x64\x40\x3c\xcd\x22\x8d\x18\xaf\xe2\x99\x88\x0b\x24\x15\x16\xde\xf0\x65\xfd\xbe\x8e\xa7\xd3\xe3\x29\x94\x9f\x39\x9e\x1e\x3b\x87\x40\x16\xd0\xdc\xac\xa1\x02\x57\xcb\x0e\x6c\x9b\x0f\x6d\xe7\x5a\x5c\x6d\x8a\xd0\x67\x57\x2f\xdd\x77\xa2\x74\xd6\x2c\xbf\xde\x98\x76\x80\xd8\x75\x27\xb3\x3e\xe3\x30\x2b\x50\x96\xf7\xcd\xcd\x54\x0b\xfb\x0d\x4b\xe2\x4b\xd5\xdf\x3c\x0b\x56\x97\xdc\x96\x44\x78\x5f\x37\xf5\xfe\xfe\x7c\xf3\x71\x3f\xcb\x31\x92\x2b\xc2\x62\xce\x78\x9e\x53\x85\x16\x58\x2e\x2c\x50\xd3\x1b\xfe\x50\x35\x14\x0c\x91\xf6\x61\x61\x8a\xac\x94\x8a\x88\x99\x07\x0b\xee\x68\x45\x8e\x50\x70\x58\xa2\x22\x64\x5b\x6f\xb0\xda\x73\xe9\xd9\xbd\x58\x2e\xb0\x20\x52\xeb\x57\x46\xd0\x66\x74\x46\x14\xcd\x43\x7b\x23\x38\x35\x98\x58\x37\x88\xeb\xbe\x6d\x55\xde\x77\xd5\xde\xbe\xbb\xb9\x38\x3d\xbf\xba\x98\xe6\xe9\x2b\x12\xec\x84\xa5\x05\xa7\x3e\xa7\x38\x41\x05\x56\x8b\x67\x56\x07\xaa\xe9\xc6\xb0\xef\x2e\x1c\x31\x08\x5a\x7b\xe3\xb0\xf5\xbd\x75\xf3\x32\x8e\x02\x50\x47\x53\xa2\x30\xf5\xae\xd4\x54\xbf\x0f\xc5\x0b\x9e\xf1\xf9\x2a\x42\xc5\x0d\x8f\xab\xfc\x2b\xd3\xa8\x79\x82\x27\xfa\x55\xed\xc7\x17\xac\x16\x31\x4e\xfb\x1a\xab\x85\x43\xf2\x57\xbb\xeb\xb9\x91\x95\x57\x51\x2d\x7a\x43\x0c\xaf\x6a\x83\x5f\xb8\xcb\xa4\x7e\x09\xce\xfb\xee\xeb\x30\xbb\x27\x46\xd8\x90\xd4\x68\x6d\x7a\xe1\x13\x28\xd4\x54\x10\x91\x53\x53\x52\xcb\xd7\x71\xb2\xee\x81\x79\xdd\xef\xd5\xcf\xf9\xa2\xe5\xf7\xb5\xd7\x83\x6d\xdf\xa3\x7f\xb1\x74\x42\xd5\x8c\x42\x90\x09\xf9\x4a\x25\xf8\xda\x66\x34\x23\xda\x4c\x0b\x31\x00\x9b\x7a\x8a\x03\x3c\x38\x40\x85\xa1\xeb\x05\xfb\xee\x00\x1f\x6a\x1f\x81\x43\xcd\xf8\x38\x5e\x08\x23\x02\x67\xd9\x0a\x95\x9a\xb4\x56\x62\x6d\x98\x10\xcf\x3d\x37\x94\x0b\x8b\x89\x2c\x04\x5d\xd2\x8c\xcc\xf5\x94\x17\x94\xcd\xa5\xaf\xd2\x86\x05\x71\x2d\x21\xf5\xe2\x25\x21\x6b\xfb\xeb\xf3\x22\xaf\xf4\xe7\xab\x5d\x94\xc6\xe4\xfd\xf4\xf9\x0e\x31\x62\xa6\xec\xf5\xce\x03\x9d\xa3\x7a\x51\x5e\x3a\x13\x42\x93\xc9\x04\x62\xc8\x6f\xfe\x3f\x67\x44\xa6\xd9\x5b\xf4\x27\x62\xd7\xc2\x91\x20\x9a\xf7\x7b\xe1\x8b\x1f\x17\x1c\x22\x51\xa5\xb4\x7b\x5e\x1b\xb6\xc0\x2a\xbd\x5e\x1d\x4b\x1d\xdd\x77\x9a\x36\xe3\xca\x2a\xf9\xad\x6f\xf0\xab\x9f\x8f\x25\xaa\xb3\x37\x5e\x93\x07\x6d\x0f\xca\x72\x54\xcd\xc9\x61\x00\x03\x9d\x67\x0d\xfe\xe9\xb2\x0a\x60\x9e\xfe\xea\x37\x46\x72\x95\x67\x94\x3d\x9c\x20\xaa\x5c\x26\x8e\xe6\x28\x01\x26\xbb\x26\xe7\x78\xb1\x20\x38\x6b\x68\x7a\xcf\x1e\x57\x73\x5c\x63\x2f\xba\xa1\x8a\x04\xec\xba\x5b\x15\x26\xdf\xd5\x09\xf6\xa0\xa8\x57\x4b\xd9\x3a\x3a\x8a\xa7\x68\xbd\x8a\x73\xa1\x32\x91\x34\x54\xc1\xba\xbc\x3d\xbb\xbd\x6c\x05\xb7\x7c\x7c\x97\x86\xca\x01\x5e\xba\x49\x41\x87\xa3\x7a\x95\x7e\x21\xfa\xcb\xee\xf7\x61\x82\xb2\xd2\xe7\x53\xa6\xe8\xc6\x35\x17\x0a\xef\x6e\x2e\x86\x89\xc8\x64\x81\x8b\xd3\x52\x2d\xce\xa9\x4c\xf8\x92\x44\x71\x83\x3f\x2e\x08\xe8\xc8\x16\xcc\x89\xa8\x7e\x24\xbe\x56\xa5\x9b\x17\x3a\xfb\x97\xd3\x6b\x84\x4b\x7d\x8f\x15\x4d\xfc\x53\x11\x43\xd3\x41\xdd\x8e\xdd\x9a\x12\xd4\x2f\x6c\xbf\xec\xac\x5e\xcc\x6e\x1d\xa0\xd1\x5e\xe3\x00\x8d\x7e\xf9\xd0\x68\x90\x6d\x9e\x53\x39\xc0\xa1\x77\x1a\x94\x51\x45\xb1\xe2\x22\x12\xaa\xf1\xac\x94\x8a\xe7\x86\xd1\x02\x92\x86\x06\x14\xe8\xff\x04\x70\x88\xcb\x59\x7b\x96\xad\xfc\xf1\x10\x48\x04\x5c\xb3\x4b\xa6\x88\x98\xe1\x84\x74\xaa\x67\xf9\xa2\x0d\x18\x79\xb4\xab\xa7\x15\xe5\x7f\x0a\xaa\x3e\x57\x80\xf6\xf2\xcf\x1f\xfe\xa9\x01\xb8\xfe\xe7\x40\xa4\x85\x71\xe5\xa6\x2e\xfc\x8c\x12\xce\x18\x49\xd4\x3e\x02\xc8\x7a\xd0\x5f\x62\x48\x7b\x0b\xc2\x31\xbb\xff\xaf\x25\xce\x42\x6e\xc8\xa7\x7d\xe1\x26\xda\xb7\x32\xc2\xb6\xb8\xb7\xe8\x6e\x63\x40\x85\x6c\x90\xbd\xa5\x24\xd0\x65\xcd\xd0\x55\x02\x33\xa9\xaf\x68\x8c\xe8\xc6\xb1\x4d\x50\x38\x46\x6f\x54\x52\x78\x62\xd5\x5f\x44\x8d\x56\xb3\x39\xf6\x46\x7e\xf4\xb0\x5d\xcc\x30\xb5\x59\x43\xf6\x61\xaf\x58\x79\xe0\x5c\x31\x02\xea\xad\xed\xf4\x34\xe7\xcc\xf8\x48\xa5\x82\xae\x29\x76\x76\xd0\x59\xc7\xd4\x7b\xf4\x52\xc3\xf5\xb8\xbc\x46\x5c\x20\x5a\xfc\x1b\x4e\x53\xf1\xc1\x58\x1a\xd6\xff\xc8\xbd\x51\x7b\x54\xda\x80\x08\x54\x24\x71\xa5\xb7\xde\xa8\x55\x41\x13\x9c\x79\x57\x00\xba\x3b\xbb\x86\x59\x49\xf4\xfb\xdf\xbd\x07\x87\xfa\x6f\xfe\xf1\x77\xef\x83\x9e\xda\xeb\xab\x15\x89\xe2\xc6\xa6\xff\xfe\xd0\xfc\x2f\xa9\xf2\x13\x18\xe4\xa6\xe6\x13\xe8\x33\x21\x46\xbe\x51\xd4\xe0\x59\x54\x3a\x67\x3c\x63\xff\x50\xab\xa7\x35\x0e\xb5\x7a\xf6\x5d\xab\x07\x55\x57\xde\xc8\xd4\xa7\x91\xd4\x21\x25\x27\xaf\xd7\x85\xb4\x11\xb7\xbe\x52\x75\x83\x90\xf6\x0f\x12\xbe\x12\x21\xed\x75\x3f\xfc\x78\x46\x9b\x57\x18\xf9\x73\x7c\x2c\x1b\xd9\x0d\x1e\xeb\x80\xca\xab\xe7\x9f\x6e\xff\xed\xe3\xe9\x0f\x17\x1f\x61\x4f\x6c\xb5\x17\xfd\xf8\xbd\xa4\x63\x4f\xa0\x26\x32\xfb\xf1\x8d\xca\xf8\x1d\x56\x38\x06\xfb\xd3\x8f\xb7\xed\xc0\x1d\xfa\xf4\xe3\xad\xc7\xce\xf6\x03\xaf\x2b\x18\xb5\x97\x29\xd1\x02\x5e\x87\x7a\x18\xd9\xcc\xfb\x6c\x5e\x0b\xc0\x63\x02\xf5\xc3\x9e\xbd\x40\x76\x54\x64\x88\x0b\xf8\x92\xaf\x31\x1c\xf4\xfa\x76\x9b\x3d\x89\x08\xa0\x7c\xf2\x5b\x87\x5e\x94\xa9\xf3\x14\x30\x5c\x7d\x2e\xe6\x84\x6d\x2c\xc2\x42\x69\x43\x7c\xbb\xaf\x06\x80\xfb\x8c\xf7\x27\xc4\x5c\x13\x71\xaa\xde\x1f\xdf\x02\x25\x07\x96\xd7\xa2\x21\xa4\xf4\xbd\xd0\xba\xa0\xd6\xe7\x88\x94\x2e\x00\xd9\x78\xe5\x9e\x64\xf7\x21\x5b\x50\xd8\x2b\x2f\x3a\x4d\x05\xcf\x32\x4c\xf3\x50\x6d\xa0\xdb\xa9\x10\x88\x9a\xff\xbc\x05\x40\x8e\x17\x2b\x6a\xf4\xf7\x6b\x55\x59\xc6\x6b\x9d\x11\xe1\xfb\xbc\x62\x5a\x26\x97\x12\xdb\x60\x89\x2c\x70\x12\x2b\x55\xcb\xb3\x93\x6c\xfd\x23\xf3\x13\x68\xd4\xf8\x9a\x54\x10\x98\xf0\x1e\x0a\xc0\x55\xdf\x1b\x83\xf9\x9c\x39\x62\x96\xff\x04\x78\x52\x34\xb7\x89\x77\x63\xd1\xa6\x5b\x8b\x70\xc8\x44\x0b\xee\x9a\xc3\x40\x77\x50\xdb\xd5\xe3\x79\xb1\xa6\x4f\xf8\x18\xd0\x8b\xd2\x8c\xfe\xf4\x2c\x85\xfa\x9d\x2e\xe2\xab\x74\xed\xc7\xe5\x5b\x2c\xb8\xe2\x2c\x6a\x39\xd3\xeb\x1e\x92\xa1\xf2\xc8\xd0\x3c\x33\xe5\x97\x33\x22\x1a\x62\xd5\x83\x34\xd4\x4d\xaa\x2a\x4e\x63\x96\x56\x29\x62\x9c\x39\x08\x6a\x68\xe9\xe9\xd7\x23\x40\x8a\xf4\xf2\xfc\x99\x65\xc7\xa1\x95\xd0\xcb\x6c\x25\xf4\x3c\x20\xb4\x7d\x88\x13\x7d\xc9\x23\xdc\xb7\xcb\x73\xeb\xf9\x70\x75\xac\x7d\x7d\xd3\x86\xa1\xa1\x58\x1c\x0d\x59\xae\xf6\xec\xd6\x0d\x17\xea\x91\x8b\x38\xed\xfd\xae\x5b\xc4\x82\xb3\x40\x2d\xb5\xb5\x0e\x03\x0d\x7e\xef\x41\xb8\x21\x21\x5e\x29\xbf\x37\xfb\xf1\x8a\x79\xfe\x2d\x24\x16\x05\x5d\x0f\x64\x83\x0c\x5d\xcc\xb1\x03\x36\xfb\xfa\x27\x7a\xc4\x47\x47\x10\x84\x39\x4a\x23\x23\x99\x3b\xe2\x63\xda\x10\x00\xfe\x66\xc8\xba\xd8\x78\x09\x02\x20\xa2\x3d\xb1\xe6\x74\xf4\xdc\xab\xfe\x96\x64\xe0\xbe\xf5\x76\xb0\xf6\x5a\x3a\xce\x66\xf1\xb7\x7f\x5b\x96\xce\x5e\x1c\x9d\x8e\x6b\x45\x38\xbf\x2f\x96\x94\x0d\x53\xfa\xdf\xf5\x4a\x09\xd0\x16\x4a\x5b\xdc\x3c\xbb\x20\x16\x5c\x0b\x12\x1f\x89\xd0\x56\x70\x14\xc9\x25\x80\x75\x70\x96\xe9\x93\xe7\x1e\xa2\x0d\x55\x89\x81\xd2\x35\xe8\x3a\x41\x09\x67\x33\x3a\xcf\x71\x21\x4f\x3c\xd3\xf9\x52\xfe\xc8\x1e\xb1\x48\xd1\xe9\xf5\xee\x28\xa2\x7d\x36\xdb\x31\xfc\xe2\x8a\xa7\x31\xc4\x9f\x26\x83\xee\xa9\x92\xa6\xc2\x83\xb7\xc5\x23\x89\x6a\x46\x60\xb4\x62\x53\x61\xcf\xb5\xf0\xf2\x17\x54\x76\xbd\x0d\x6b\x8a\x21\x9e\xf8\x03\x43\x97\x38\x2b\x09\xba\x27\xea\x91\x10\x86\xde\xbf\x7f\x6f\x80\x17\xef\xbf\xff\xfe\x7b\xff\xf0\x04\x46\x29\x49\x68\x8e\xb3\x2e\x79\x4f\x92\x7a\x46\xbf\xfd\xf6\xdb\x29\xfa\xbf\xa7\x57\x1f\x11\x4e\xc0\xd7\x66\x9a\x7f\x87\xac\x5d\x93\x6d\x4d\x54\x9e\xa0\xff\x73\xfb\xf9\x93\xd3\x00\x7d\x8f\xa9\x4d\x13\x1e\x7c\xee\x2e\x96\x77\x30\xae\x2e\xf2\x60\xa1\x1f\x55\xa6\xbf\xef\xea\x05\x81\x4a\x12\x78\x36\x03\xe6\x66\xd4\x20\x2a\x9d\x40\x0b\xeb\xa1\x48\xe7\x0b\xb8\x9e\x94\x01\x73\xca\x68\xa2\x60\xde\x41\x70\x23\xd7\x16\x16\xcc\x44\x33\xef\xc0\x9c\x38\x38\x98\x13\x94\xd1\x07\x82\x66\xf2\x8f\x82\x97\x85\x2f\x07\x45\x56\xed\x15\x44\x96\x99\x82\x22\x20\xf7\xc4\x4e\x5c\x7f\x8b\xef\x9b\xd7\xdc\xc8\xbb\x49\xd4\xfe\xd1\xf0\x56\x56\x45\x60\xce\x19\xd5\xfa\xf9\xac\xaa\x15\x66\xa4\xb2\xbe\x10\x01\x5b\xb3\x27\x14\x77\xdb\x36\xaf\x56\xe2\x5b\xf4\xc7\x0c\xdb\xb8\xb4\x52\x57\x10\xce\x38\x9b\x87\x3c\x3b\xf7\xf0\x6a\x57\x9b\x4b\x74\x5d\x15\xde\xec\x31\x18\x15\x1c\x03\x17\x8c\xac\xce\x74\x85\x0b\x7f\x12\x5d\x10\x68\x70\x53\x5b\x33\xf0\x3d\x2f\x95\x4b\x50\x33\x73\x84\x76\x6c\x41\x44\x15\x77\x17\x23\x80\x4c\x84\xa3\x43\x91\x8e\x0f\x85\x3e\x41\x37\xda\x2a\x7a\xcb\x98\xf6\xcd\x86\xac\x07\xc1\xc9\x02\x3d\x90\xd5\xc4\x28\x42\x05\xf6\xaa\x78\xde\x1e\x56\xf4\x9f\x63\x85\x0d\x2e\x3b\x98\xa2\xc5\x90\x54\xc0\x84\x70\x8a\x67\xd5\xc5\x0d\xcb\xd8\xac\x47\xcd\xd5\x5c\xfd\xf7\x60\x92\xce\x79\x29\xad\x4f\x09\x3d\x2e\xb8\xb7\xc3\xa1\x1e\xac\x0e\xb5\xeb\xa3\x0f\x50\x27\xea\x91\x70\xa6\x08\x53\x8e\x2c\xdc\xa6\x10\x34\xbe\x19\x97\xdd\x1a\xe1\xc1\x14\xb5\x8c\x26\xa9\x5e\xb6\x7c\xc9\x27\x5f\x57\x90\xd6\x0a\xb4\xb7\xd1\xdc\x1e\x25\xeb\xae\x3e\xfc\x2a\x71\x65\x24\x3a\x38\x63\xa7\xe8\xd2\xb7\xaf\x67\x3d\x30\xdc\xc9\x08\xc9\xe4\xf5\x78\x5c\xd0\x04\x2a\xc1\xea\xe9\xda\xb9\xc6\xe2\x72\x15\x23\x09\xe7\xc5\x8d\x3a\x1d\x92\xa8\xb2\x88\x73\x44\x50\x61\x41\x9f\x3d\x91\x12\xd1\x80\x8c\x8a\x7a\xe4\x58\x3c\x90\xd4\x5a\x3b\x38\x9b\xa2\x6b\x7d\x49\xc3\xc9\x5a\x8f\x81\x20\x19\x86\x26\xfc\x31\x2e\xbd\xd6\x39\x9b\x4d\x1b\x62\xbc\xce\xe3\xe9\xf4\xd8\xd4\xb0\x0b\x6c\x01\x51\x8f\xba\x19\x44\x20\xa9\x50\xab\xa1\x1e\x51\x94\x97\xae\xff\x0a\x17\xe1\xf7\x04\x2a\x00\x82\x9f\x14\x58\x85\xb7\x13\xac\x4d\x11\xce\xd3\x7a\x2e\xc2\x34\x59\x33\x2c\xac\x2b\x9c\x2b\xc4\x51\x69\xcd\xf0\x0f\x1d\x76\xc7\x44\xef\x7d\x04\x2a\x01\x0e\xa2\x7a\xc4\xd2\xd7\xcd\x78\x20\x9e\x81\xa2\xee\x68\x97\xc1\x88\xc0\x78\xcc\x30\x97\xde\xa9\x1d\xe1\x37\x0c\x85\x07\xd8\xba\x23\xf7\x76\x77\x77\x47\x1b\x2a\xfa\xd9\x8a\x9c\x38\xb4\x51\xed\xf6\x04\x7f\x7a\x24\xa2\x50\xd5\xb8\xe5\x5f\x8f\x44\x18\xfc\x2f\x54\x82\x2d\x10\xe7\xd8\x51\x2c\x37\x7d\x77\xb4\xfc\xea\x91\x68\xc6\x70\xfe\x77\x47\x33\x18\xf0\x92\x97\xde\x0e\x31\x44\xa2\xda\x0c\x54\xc4\xda\x4f\x7d\x87\x9a\x81\x8b\x98\x9b\x6a\xc3\x1f\x91\x48\xba\x20\xca\x93\xcc\xb4\x0a\xaa\x44\xa2\x0a\xa1\x19\x6d\x0f\x33\x1e\xae\x05\x98\x11\xd9\xb2\x36\xc3\xb5\x1e\xab\xa3\x9e\x91\x08\x5b\x63\x1d\xf8\x74\x2c\xde\xd7\x8a\x04\x45\xa2\xd9\x88\x27\x45\x5b\xb9\x36\x34\x9a\xf1\xa5\x58\x72\xaa\x8e\x52\x45\xa3\x48\x1a\x51\xab\x48\x44\x5b\xb1\xaf\x58\x9c\x8f\xa5\x8d\x58\x58\x24\xa2\xcd\x88\x5a\x74\xfd\x44\x12\xe5\x51\xfc\xbe\x6f\x84\x87\xdc\xba\x23\x34\x04\xd7\x1d\xfe\xc9\xca\xdd\xf1\x44\x1a\x78\xe5\xa1\x88\x62\xbd\x98\x61\x7d\xdc\xfa\xf9\xc4\xd3\x43\x73\x5c\x38\x37\x6f\x34\xa2\x53\x74\x65\x7c\x2a\xb1\x44\x1b\x28\x9f\xf8\x5e\xf2\xac\x54\xb1\xd6\x6e\xcb\xf7\x47\x9d\x68\x4c\x17\x92\x19\xe0\x73\x20\x19\xc9\x63\x38\x24\xcd\x30\x0d\x45\xe3\x2e\x1c\x5c\x5c\x55\xdf\xcb\x68\x44\xc1\x83\x13\xc3\xe7\x65\x46\x34\x13\x36\xac\x24\x93\x19\xbd\x85\x99\xa2\x78\x88\xdb\xe5\x99\x22\xb8\xb1\x5f\x54\x79\x27\x33\xfa\x8b\x3c\x05\x93\xb5\x45\xa2\x9a\xa5\x9e\x82\x69\xc6\x28\x15\x65\x46\xb4\xfb\xcb\x23\x39\x49\x5a\x77\xf8\x16\xac\x85\x70\x29\xe2\x6a\xbf\xb7\x62\x27\xe1\x01\x62\x81\xb4\x92\x04\x81\x2d\x1b\x46\x88\xe0\xb8\x9e\x51\x16\xec\x14\x0a\x85\x3e\xdb\xb9\x58\xf4\xeb\xe9\xf5\xe5\x0b\x46\x83\x34\x66\x19\x44\x31\xc5\x0a\x1f\xf0\x20\x9b\x46\x0f\x64\x3b\x42\x4c\x0f\x57\xf0\xb5\xf3\xfa\x14\xbf\xf8\xc3\xd9\x9b\x23\x82\x4e\xfb\xb2\xc3\x5a\x6b\x5b\xf6\x63\x1c\x2d\xbe\x91\x06\x1d\xeb\xb5\x9a\xa1\xb8\xc5\x7b\xc7\xb4\x39\xac\x7e\x6c\x0a\x1b\x40\x0d\xb7\x08\x44\xe3\x00\x88\x5e\x6c\x10\xed\x05\x86\xbf\x60\xc7\xbd\x6b\xc0\x76\x47\xb7\x4c\x55\xac\xad\x33\xe3\x96\x64\x5a\xfb\x44\xb1\x80\x66\x66\x70\x57\x80\x32\xda\x3c\xa1\xe4\x15\x66\x8c\x2b\x78\xc1\x32\x9a\x6f\x0c\xdf\x93\x4c\x9e\xa0\x80\x6a\x4d\xdd\x81\x59\x5a\x17\x3a\x89\x45\x53\x34\x92\x20\xa3\xba\xb1\x22\x3d\x69\x14\xf5\x59\x23\x78\xda\x70\x23\x03\x3a\xdf\xb5\x47\xdc\x37\x8e\x5a\x05\x6f\x63\x51\xec\xa6\xda\x19\xea\xd1\x88\x57\x0f\x53\x26\x0b\x92\xc7\xc0\x68\xb8\xa1\x89\xfe\x18\xf5\xb8\xcc\xa0\x12\x3d\x0a\xaa\x54\xb4\x38\x20\xb2\xc0\x33\x22\xf2\x58\x51\x00\x04\xfb\x7a\xe2\x42\x36\x31\xc9\x2a\x8e\x8e\x96\xdf\x7a\x17\xa4\xe8\x21\x18\x17\xa5\x80\x9c\xb4\xf3\x6b\x60\xbd\x69\xb4\x73\x27\xe2\xde\xa8\xca\x4b\x1c\x4f\xda\x21\x07\x59\xc8\xe2\x05\x82\x50\xa3\x72\x56\x34\x18\x67\x3d\x4e\xaf\x2f\xd1\xd2\x70\x97\x17\x7b\xb9\x0e\x10\x98\xa7\x86\xc0\xc4\x52\xa2\xf2\x03\x04\xe6\x00\x81\x39\x40\x60\x0e\x10\x98\x38\x44\x0f\x10\x98\x03\x04\xe6\x00\x81\x39\x40\x60\x82\xc6\x13\x41\x60\xa2\x3b\xe0\xa0\x1f\x00\x95\x28\x22\xff\x7c\x0a\x70\x0d\x8b\xd2\x19\xa9\x39\xe0\x8d\x9b\x3a\x57\xb6\x72\x4a\x54\x44\xb6\x49\xac\x8b\xf5\xd4\x2d\xb6\xc6\xbf\x3f\x4f\x77\xc4\x87\xc2\x1c\x1f\x4f\xa7\xc7\x26\xab\x2a\x36\xb4\xbd\x54\xb3\xc9\xef\x23\xd1\x24\x2c\xe1\x29\x49\xa7\x11\xc1\x64\x33\x2a\xa4\x82\xb0\x54\x0c\x88\x88\x19\x86\xb1\x9b\x77\x14\x13\xab\x94\xdb\xbb\x19\x1f\x58\x64\xce\x3f\x26\x7b\x8f\x66\xc9\xbb\x7a\x56\x3f\x3e\x61\x60\xc4\x06\x32\x62\x3d\xf8\x6a\xce\x71\xaf\x94\x7d\xf6\xbe\x3d\x27\xd6\x07\xc4\x45\xaa\x7a\x61\xd1\xb4\xa5\x9c\x42\x9b\xa4\x14\x0c\x1c\x22\xa3\xed\xeb\x1b\x43\x7a\x9a\x14\x65\x3c\xd5\x0e\x28\xe6\x24\xe7\xc2\xbb\xbb\x75\x77\xb8\x65\xeb\x89\x46\x54\x17\x2b\xb2\x66\xb6\x6f\x23\x46\x87\x92\x52\x08\xc2\xfc\x4b\x4f\x76\xc7\xdf\x5d\xb4\xc9\x3d\xa2\x17\x1a\x6c\xaa\x38\x87\x7f\xd3\x88\xbe\xd1\x69\x24\xe1\xbe\x24\xa2\xab\x19\xc0\xa0\xd5\x69\x45\x24\x3c\xe3\xc2\xba\x0a\xa2\x45\x83\x51\x03\xfc\x17\x79\xa6\x84\x2d\x23\x52\x5c\x62\xe1\xd9\x58\xa2\x6f\x3c\x41\x54\x28\xa5\x4b\x2a\x79\x34\x31\xd7\x8b\xa5\xf4\xaf\x1f\xde\x37\xb4\x78\xe6\xa5\x2a\xca\x98\x21\x1c\x63\xd5\xc6\xd3\x21\x90\x9d\x28\xf9\x5a\xf0\x78\xc1\x06\xd4\xac\x39\x1a\xf3\x2d\x3d\x51\x48\xf4\x5b\xdf\x52\xfa\xeb\xa3\xc0\x4a\x11\xc1\x3e\xa0\xff\xf7\xe6\x2f\xbf\xfe\xdb\xe4\xed\x1f\xde\xbc\xf9\xf3\xfb\xc9\xff\xfe\xeb\xaf\xdf\xfc\x65\x0a\xff\xf1\xcd\xdb\x3f\xbc\xfd\x9b\xfb\x9f\x5f\xbf\x7d\xfb\xe6\xcd\x9f\x7f\xba\xfa\xe3\xdd\xf5\xc5\x5f\xe9\xdb\xbf\xfd\x99\x95\xf9\x83\xf9\xbf\xbf\xbd\xf9\x33\xb9\xf8\xeb\x48\x22\x6f\xdf\xfe\xe1\x7f\x45\x5b\x02\x66\xab\xcf\x91\x54\x6a\x04\x92\x30\xbe\x73\xa7\x49\x37\x2a\x9b\x41\xe8\xeb\xa4\x86\xdc\x4f\x28\x53\x13\x2e\x26\xe6\x2b\x3e\x20\x25\xca\x78\x3e\x15\xf3\x3c\x9e\x4a\xf2\xc6\x76\x2b\xa1\xc6\x9c\x9f\x22\xcc\xfd\xc2\x84\x8f\xa9\x93\xfc\x82\x91\xdd\x66\x82\x87\x22\x7f\x7d\xe3\x50\xe4\xef\xa5\x16\xf9\xbb\x35\xb7\xd6\xc5\xcd\xaa\x3a\x6d\x11\x16\x6f\xea\xbc\xd5\x15\xfa\x82\x49\x36\x2b\xfc\xc5\x81\x73\xb6\x2b\xfc\xb9\x0a\x7d\xb1\xc8\x9a\x0a\x7f\xed\x0a\x7d\xc1\xb4\x35\xe1\xe8\x35\xea\x5a\x15\x67\xf5\xc9\x45\x99\x66\xb7\x42\x5f\xf8\x05\x80\xd6\xe9\x8d\xd5\x07\x53\x84\x7b\xdf\xa9\xd0\x17\x4c\xf4\x72\xf6\xda\x2a\xf4\x19\x2e\x10\x27\xc2\x7f\x28\xcf\x77\x28\xcf\x17\x34\x5e\x76\x1e\xd3\xa1\x3c\xdf\xce\xe3\xc5\x66\x16\x1d\xca\xf3\x6d\x1b\x87\xf2\x7c\xe1\xe3\x80\x4d\xae\xc7\xa1\x3c\xdf\x01\x9b\x7c\xc0\x26\x1f\xb0\xc9\x71\x48\x1e\xb0\xc9\x07\x6c\xf2\x01\x9b\x7c\xc0\x26\x87\x8f\x57\x82\x4d\x3e\x94\xe7\x8b\x42\xf4\x50\x9e\xef\x50\x9e\x2f\x0a\xd1\x43\x79\xbe\x5d\xc7\xa1\x3c\x5f\xd0\x38\x94\xe7\xdb\x69\x3c\x79\x79\x3e\x13\x38\x09\x8f\xeb\x56\xb5\xf9\xfe\x47\x96\xe6\x93\xfa\xd9\x25\xe4\x34\x49\x78\xc9\xd4\x1d\x7f\x20\x41\xf5\x54\x9e\x1c\xc8\xb1\x36\xdb\x20\xca\x2f\xae\x54\x5f\x0c\x17\x7a\xb0\xdb\x3b\x96\xc3\x1b\x97\x29\x25\x2c\x1c\xb6\xd5\xba\x54\xa7\x96\x68\x2c\x24\x80\x36\x55\x58\x4a\xd2\x6a\xb6\xb1\x90\x20\x4a\xdf\xce\x29\x3a\x45\x82\x24\xb4\xa0\x31\x94\x30\x3e\x43\xd8\xd0\x35\xbc\xc8\x76\xf1\x0f\xe7\x9b\x54\x49\x92\xcd\x8c\x12\x86\x99\xa3\x4b\x23\x58\x70\x35\xd0\xc0\xc6\xb3\x9f\x64\x9b\xe3\x74\x18\x04\x75\xe0\x91\x4a\x82\xe4\x82\x97\x59\x8a\x04\x89\x12\x17\x6b\xdc\x86\xbb\x98\x3b\xe0\x00\xbe\xc8\xc2\x79\x22\x1e\x9b\xdd\x5c\x5c\x50\xcd\x72\x89\x88\x13\x38\x8e\xa0\x7e\x90\xaf\x05\x15\x20\x52\x6e\x49\xc2\x59\x1a\x17\xba\x76\xd1\xa5\x1e\x8b\xcb\xd8\xdc\x23\x92\xa2\xb4\x14\x71\xca\x60\xf2\x19\x5a\xe2\x8c\xa6\x54\xad\x62\xe5\x06\x5b\xf1\x8a\xb0\x91\xaf\xf6\xd2\x06\x93\x3d\x95\xf5\x13\x40\xb8\x28\x04\xc7\xc9\x22\x82\x22\x5f\xdf\x85\x13\xe3\x87\x28\xef\x49\x16\x41\xe5\x73\x1d\xd0\xb3\x72\x4e\x59\x1c\x9c\x0c\xac\x59\xd1\x25\xc9\x56\x48\x70\x85\x23\xb8\x22\x1a\xfa\x90\x3b\xb0\x70\x9a\x35\x97\x8a\xb5\x99\xe0\x5a\x37\x36\xbe\x12\xab\x18\x01\x60\xc5\xed\x16\xd6\xb7\x2a\xfc\x99\x36\x84\x89\x7e\xb3\x3c\x4b\x23\x70\x51\xb5\xc0\x0c\xfd\xfe\x3d\x2a\x88\x48\x08\x8b\x92\x89\xa2\x6d\x11\x45\x73\x48\xde\xcf\xe8\x32\x4a\x52\xfc\x13\x2e\xfe\x1f\xbf\x43\x0b\x5e\x0a\x39\x3d\x8f\x95\x8c\xa2\x38\xfa\x16\x68\x82\x9b\x5d\xab\x41\x31\x20\x96\x58\xa1\x8c\x60\xa9\xd0\xb7\xef\x51\x4e\x59\xa9\x88\x8c\x23\xf2\xe2\x78\xc2\x1b\x3e\xf0\xdf\x7d\x17\x44\x2b\x86\xf7\x7b\xad\x42\x60\x0c\xd8\x1f\x94\xac\xd5\xb4\xa2\x25\xfe\x5b\xad\x28\x07\x51\x56\x70\x1a\x47\x01\xaf\xa2\x50\x51\xcc\x46\x3b\xd3\xfa\xf5\x31\xc5\xf7\xa8\x6b\xfd\x52\xf2\xfb\x95\xf2\x30\xd8\x5a\x57\xe2\x5f\x0d\x95\x66\xfd\x6f\x1f\xcc\x9b\x23\x63\x0e\x90\x1b\xf3\x61\xc1\xa5\x32\xb1\x45\xb9\xc0\xc2\x4b\x89\xc0\xa8\xe0\xe9\xb1\x44\x19\x9d\x11\xcd\x4a\x77\x26\x11\x64\xeb\xfb\x5b\xf8\x13\x24\xc8\x9c\x4a\x25\x76\xb7\xf7\x26\x56\xa7\xd9\xf9\x83\x61\xae\x80\xb9\xe0\x65\xe1\xc7\x6d\x5a\x17\x0a\xa2\xb3\x2e\xe2\xe4\xb9\x12\x33\x70\x92\x10\x09\x06\x93\x15\x48\x06\xb5\x6d\x66\xea\x45\x33\xd0\xb2\x11\x04\xa7\x9f\x59\xe6\x89\x09\x6c\xed\xd2\x8d\x25\x85\x16\x44\x90\x10\xb5\x75\xc6\x45\x62\x94\x2b\xf7\x04\xad\x46\xec\x0d\x86\xbd\xb7\xaf\x98\xa4\xc6\xc7\xa0\x57\x3d\x81\xea\x19\x0d\x1c\x9b\x2f\xdf\x3b\x6f\x98\xc1\x33\x9c\x49\x4f\xf4\x5a\xa8\x3f\xd5\x3d\xce\x28\x27\x69\x48\x35\x38\xa8\xef\x7d\x47\x92\xb2\x79\xa6\xd5\x44\x94\x97\x99\xa2\x45\x56\x9d\xaa\x27\xc9\x6a\x72\xd6\xf8\x08\x4f\xa4\xc0\xb2\xc6\x5c\x63\x09\x2c\xfe\x43\xc1\x85\x0a\x49\xf5\x7a\x53\xad\x96\x30\x25\x28\x91\xa6\x8a\x3b\x29\xb0\xc0\xfe\x39\x54\x70\x79\x13\x9e\xe7\x58\xbe\xb5\x59\x1f\x18\x0a\xf8\xcb\x00\xfb\x5b\x9b\x06\x02\x67\xd5\x05\x6a\xd6\x56\xd8\x07\x4b\x52\x84\x61\xe6\x99\xce\xd9\x86\x44\x00\x21\xc4\x1f\x5d\x53\x0d\xcf\x0d\x9a\xd3\x25\x61\x5d\x5e\x14\x14\x2a\xff\x01\x27\x0f\x84\xa5\xe8\x67\xe9\x38\x52\xba\x62\x38\xa7\x09\xce\xbc\x6b\xb8\x14\x82\x2f\xa9\x66\x64\x24\xed\xcc\xd5\x3b\xbd\xca\x80\x3d\x29\xe0\x73\xd0\xfd\xca\xe8\xc8\xe0\x95\xd8\xc7\xbd\x28\xa5\x6f\xe5\xa4\xd6\xad\xf8\x59\x12\xf1\x34\xb2\x5c\x1a\x70\xb4\xa0\xcb\x84\x84\x79\x44\xf4\x52\xf7\xb1\xc5\x66\x3f\x22\x6c\xf2\x17\xfb\x48\x6a\xce\xea\xb9\x13\xa0\x6a\x57\x49\xad\x12\xc0\x34\x99\x16\xdf\x2b\x57\x38\xd0\x93\x70\xe7\x39\xdf\xaf\x00\x19\x11\x22\xba\xbd\xd6\x29\xee\x3d\x34\xf1\x4e\xf5\x80\x1f\xce\x5b\xa6\x0e\xba\xc1\x29\xf7\xe1\xdc\x3f\x64\x3c\x79\x40\xe7\x04\x5c\x7a\xfd\x56\x8f\x07\x55\x63\x27\x59\xab\xa7\x61\xf6\x18\x88\x87\x81\x68\x78\x90\x75\xa0\x0e\xf2\x15\xe7\x45\x46\xe4\xf4\xe1\xf7\x00\xeb\xb0\x2c\xef\x9d\xb8\x4f\xdf\xdd\x5c\x9c\x9e\x5f\x5d\x4c\xf3\x74\x77\xf4\xc2\xde\x6c\x2c\x9a\xe3\xf9\xee\x1c\x69\x82\x72\xce\xa8\xe2\x62\xf7\x73\x0f\x33\xb1\x66\xf2\x4e\xef\x54\x38\xc7\x38\xfe\x91\x66\x44\xae\xa4\x22\x39\x6c\xbe\xe7\xb3\xb6\x1e\x12\x67\x30\x68\xee\xb1\xe2\x25\x7a\xc4\xde\xbc\x58\x8b\x0a\xfd\x16\xa6\xe8\x8e\x16\x1f\xd0\x05\x93\xa5\xb0\x94\xfd\x15\x80\x59\x7b\xb1\x20\x63\x5d\xcd\x35\x5f\x1b\x67\x55\x3f\x55\x7d\xa2\x58\x69\xad\xc7\x7c\x89\xaf\x69\x73\x61\x1f\xd7\x07\x74\x44\xbe\xaa\xef\x8e\x4e\xd0\xd1\xd7\x99\xd4\xff\x30\x35\x93\xde\xad\x49\x2e\xf3\x22\xa3\x09\x55\xd9\x4a\x3f\x7f\x22\x04\x49\x6d\x31\x58\xf3\x35\x9e\x64\x69\xab\xf0\x43\x93\xbf\x8c\x82\x80\x49\xc5\x05\x9e\x13\xc7\x41\x7e\x25\xee\x7d\x8f\xc2\x20\xbc\x16\xfc\x11\xa5\x1c\x3d\x42\xfa\xf8\x92\x30\x65\xb2\x95\x7d\x4d\x29\x1b\xbf\x6e\xdc\x9c\x99\xe0\xb9\xb6\x06\x0a\xc1\x73\x2a\x43\x64\x2c\x41\x39\x4e\x16\x94\x11\x3f\x98\x57\xa0\xd6\x01\x2c\x2f\x06\x0b\xb9\x5b\x10\x24\xb4\xf0\xf3\xe4\xa2\x66\x80\x1e\xd0\x77\x79\x46\x89\x9a\x5f\x2d\xf8\xe3\x44\xf1\x49\x29\xc9\x84\x7a\x56\xca\x09\xdc\xcf\x07\xb2\x82\x12\x48\x11\x76\xf4\x27\x43\xca\x85\x91\x03\x80\x3d\x8a\x03\x86\x0d\xa8\x69\x03\xf3\xe6\x87\x73\xad\x89\x4f\x9d\xf2\xec\xfb\x2a\x24\x7a\x47\x54\xf2\x2e\x21\xc5\xe2\x9d\x5d\x78\xa0\x66\x81\x76\xd5\x2e\x5e\xc0\x91\x3b\xe9\x1f\xe3\xcc\x4f\x51\xc2\xb3\x8c\x24\xfa\x7f\xfd\x43\x86\x67\xa4\x58\x54\xd3\x7a\x09\xcf\xc9\xbf\x6a\x40\x50\xad\x80\xc0\x83\x2d\x38\xf7\x84\xba\x6e\x62\x8d\x9a\x62\x80\xad\x83\x9a\x9e\x6b\x71\xdf\x2f\x66\x5f\xcb\xb3\x89\xe8\xfd\x3e\x7e\x02\xf7\x77\x45\x52\x12\x05\xda\x9c\xa7\xe3\x05\x59\x7b\xfc\x4a\xeb\xb1\x72\x1a\xcb\x63\x8d\x5e\xc0\xd1\xfb\xfb\xcb\x4d\x51\x36\xef\x82\xe4\xdd\x02\xe4\x96\x18\xc4\x73\xfc\xeb\x4f\x39\xdc\x5b\xa9\x16\x84\x29\x9a\x00\xba\xc8\x4e\xd5\xff\x3a\xd5\xc2\xf6\x72\x66\xfc\x84\x29\x49\x11\x5f\x12\x21\x68\xea\x0d\x84\xaa\xa4\x6d\x33\x94\x45\xb3\xa0\xd4\x8d\xbd\xde\xa5\x00\xf4\x74\x38\x64\x39\x2c\x2f\xa7\x37\x23\x27\x10\x93\xd7\xce\xc5\x79\x69\xb9\x34\xfd\x59\x34\x2e\x0b\x26\x80\x70\x23\x7f\x26\x4a\xfe\xcb\xcb\xf0\x7a\x37\x14\x00\x4d\x31\x96\x02\x80\xd3\x9c\xb2\xbf\x33\x7d\x5b\x26\x38\x23\x97\x9f\x03\xdd\xb6\xb7\x86\x4a\x28\x48\xc5\x91\x29\xf4\x95\x95\x8a\x30\x55\x55\x55\x54\x0a\x27\x0b\x2f\x77\x12\x20\xdb\x6c\xbc\x9c\x33\xf4\x53\xf5\xd6\x11\xe3\xa9\x0f\x32\x6d\x6f\xde\xd4\x39\x56\xe4\xd1\x43\xed\x9f\xd4\xea\x81\xcf\x67\xc1\x3f\xf3\x5a\x3d\xb1\x1d\x47\xac\x3f\xea\xc2\xba\x4d\xab\x22\x3c\x0d\xdf\x55\x80\x31\x55\x3b\x4a\xfb\x5d\x9e\x9e\xa4\xad\xa3\x14\x5d\x7c\x9d\xc6\x75\x76\x36\xb8\x25\xd0\x7b\xf6\x10\x93\x1e\xf6\x1d\xc4\x08\xaa\xbb\x0d\xc7\x69\x2a\x88\xf4\x15\xe1\x56\xd1\x75\xec\xeb\xf4\xfa\x12\xfd\xd1\xcc\x71\x2f\xfb\x53\x08\xae\x8c\xc7\xe3\x9c\xe7\x98\x7a\xe6\x20\xae\x6d\x54\xa3\x71\x9a\x5b\xaa\xe7\x7e\x5d\x57\x13\x44\x66\x86\xa0\xd7\xdb\xae\x42\x33\x3a\x2f\xfd\xdb\x6b\x58\xbf\xf7\x5e\xf6\x3d\xa2\x01\xbe\x66\xd4\xfa\x22\x77\xf4\x9c\xde\x3d\x0a\xaa\xc8\xdb\x69\x1b\xd4\xe6\x8d\xda\xc9\xb2\x01\xab\xde\x3f\x1e\xd0\xb2\xea\x5f\xbd\x11\x5d\xdb\xd0\x75\xbc\xdf\xdf\xd9\xdc\xa8\xbb\xae\x5f\x8a\x63\x34\xde\xc8\x0a\xa3\x15\x19\x5b\x43\x12\x26\x29\x94\x48\x69\xa4\x18\x7b\x07\xc3\x66\xa6\xee\x5d\x55\xbe\xd7\x98\xe7\x27\xe8\x23\xf7\x05\xda\x20\x27\x0d\x39\xb3\x97\x0f\xd3\x2c\xe4\x82\x1c\x2c\xe3\xd6\x38\x58\xc6\x2f\xc1\x32\x96\x32\xbb\x60\xf8\x3e\xf3\xcd\x56\x6f\x2b\xbd\x19\x9e\x6b\xb6\x41\x80\xe2\xbb\x94\x4a\xfd\xaf\xe7\xd2\x6e\x6f\x3f\x02\x4a\xb3\x64\xce\x83\x07\x18\x3f\xab\xe0\xf8\xa2\xf1\x6c\xba\x6d\x80\x70\x0b\xe6\xf6\x46\x53\xb8\xf2\xae\x7f\xda\xee\xd3\xc0\x52\xbd\x3d\x44\xba\xb2\x19\x01\xe1\x6b\x3b\x33\x60\xf5\xb8\xaa\x33\x0e\x59\xd4\xbe\x70\x0a\x82\xee\x16\x34\x79\xb8\x6e\xc0\x2a\xb9\xd0\x3f\x63\x8d\x1f\x45\x30\x0a\xa2\x50\x0c\x7d\x4a\x66\xfb\xae\xe3\x04\x9b\xee\x1a\x8a\xfd\xad\xa1\xec\xab\xf5\x72\x9e\x21\x2c\x25\x4f\x28\xae\xc0\xfb\x10\x88\xae\xd4\x61\xdf\xc7\x04\x4a\xf4\x7e\x36\x1b\x2c\xcd\x27\xb0\x30\x64\xd0\x5e\x5b\x93\x1f\xcb\x86\x45\xa1\x95\x4c\x7b\x92\x7b\xd9\x2a\xf3\x90\xfd\x9b\x1e\x6e\xdc\x2e\x1c\x08\xfd\x6d\x43\x50\xab\x5e\x09\x41\x26\x9e\xf3\xb9\x2c\xb0\x71\xad\xb6\xaf\xbd\x37\x73\xa4\xb2\xe2\x87\xd0\x10\xea\xd9\x0f\xd2\xb7\x3d\x53\x5f\x84\x2d\xd4\x5d\x6a\x2d\x02\x9b\xc0\x07\x45\x36\x0a\x5e\x94\x99\xc9\xe6\xf6\x4a\x23\xb5\xa5\xf0\x43\xd1\x66\x66\x66\xcf\x0c\x54\x0d\x53\xce\x1b\x75\x70\x63\x44\x28\xaa\xf2\xe7\x75\x61\x50\xcf\x4b\x5f\x4a\x03\x28\xec\x14\x2a\x47\x9c\x05\x82\xc6\xc1\x81\x89\xee\x57\x6e\xe9\x0d\xe7\xa6\xb7\xa5\x06\x35\xa5\x5b\x65\xb5\xab\x5a\xe0\x9e\x24\xdf\x7f\xff\xfd\xf7\xad\xda\xdf\x51\xaa\x76\x77\xaa\x74\xc7\xa8\xaf\xbd\x56\x4f\x3b\x46\x25\xec\x6e\xe5\xeb\x46\xcd\x6a\x6f\x3f\xb6\xbd\x8e\x6d\xe4\xc4\xfb\xdf\x7d\xf7\x9d\xb7\xfe\x47\x05\x49\x14\x87\xc4\x30\xdb\x96\x23\x10\x5f\x87\x05\x01\xff\x81\x29\x79\xec\x9c\xe3\x26\x77\x47\x51\x36\xf7\x9d\x69\xab\x8c\x74\xb3\x00\x74\x88\x54\x6a\x15\x7c\x6e\x96\x6a\x0e\x84\x54\x9b\xd2\xcc\xed\xa2\xca\x01\x0f\xa9\x2e\xa2\xdc\x2a\x7f\x1c\x52\xfa\x3c\xb0\xdc\x71\x78\x51\x87\xd0\x72\xc6\x01\x60\xb8\xa1\x2e\x7d\xd0\x65\xcf\x1f\x88\xd2\xe8\xcd\x17\xad\xb7\xde\x5a\x47\xbd\x66\x47\x3c\x7f\xab\xb2\xdd\x4d\xad\x91\xad\xe0\xfb\xf0\xe5\x7a\xf7\x3b\x8b\xd7\xf5\xdf\xcf\x66\xcf\xbb\x76\xcf\x3a\x7f\x2f\x67\xbb\x24\x3f\x0a\xef\xd5\xb6\xd6\x99\xb0\xde\xd1\xd0\x94\x60\xd3\x95\x6e\xbd\xab\x5c\xc8\xd9\x77\x7a\xc9\x35\x7b\xc1\xf9\x5a\x0c\x55\x71\xbb\x88\x1d\xe0\xd6\xfb\xbe\xb5\xfa\xb6\x85\x9c\xd5\x7a\xb7\x36\xdb\x6d\xcd\xdb\xcb\xdd\xea\xd1\xb6\xd6\x63\x2d\xc0\xd1\xdf\xd3\x59\x0d\xaa\x39\x07\xdc\xa7\xaa\x9f\x5a\x68\x3f\xb4\xbd\xe2\x99\xd7\x3a\x9e\xb5\xfa\x95\xf9\xfb\x82\x79\xb7\x4b\x59\x60\x8f\xb1\x08\x05\x51\x43\x8b\xa1\x86\x74\x11\x0b\x2a\xa2\x1a\xa3\x80\x6a\x60\x9f\xb0\x35\xcf\x4b\x84\x66\x76\x11\x7a\x82\x45\xa9\x03\x19\xda\xff\xeb\x29\xba\x7e\xb5\x7b\x7d\x59\xe3\x37\x6c\xb7\xdb\x86\x73\xa4\xde\x5c\xdd\x8e\x5c\x46\xab\x08\x22\xd9\xb5\x9a\xc3\x3b\x68\x45\xb7\x9d\xcd\xd8\x60\x41\x87\x2d\x9e\x6b\xc1\x12\xb5\x2f\x55\xd3\x06\xaf\xac\xe9\x20\x8a\xeb\x96\x78\x78\xf7\xa8\x66\xcf\xa8\x58\x4d\x94\x1b\xba\x4e\xac\x1e\x4f\xad\xce\x4e\x0d\x63\x3a\xf0\xc6\xaf\x19\xe2\x11\x1a\xf3\xc4\x35\xc7\xcd\xd8\x64\x94\x07\x11\x6d\xf7\x37\xb2\xa6\x79\xd8\xd2\x2b\xb3\x3e\x4e\x3f\xa2\x58\xb5\x17\xe3\xf4\x1e\x0a\xad\xb9\xb8\x26\xcb\xa3\x94\x48\x34\x2a\x71\xbb\xa0\x61\x8e\x7d\xed\x0b\x33\x54\xa5\x68\x54\x5d\x62\x42\xaf\x46\xa3\x7b\x4f\xdd\x77\x27\x88\x62\xd7\xac\x88\xd6\x27\xa7\xd5\x1d\xa7\x61\x6a\x04\x6f\x69\xa4\x6e\x36\x81\xca\x57\x58\xe7\x8f\xbe\x7e\x1f\xcd\x7e\x1d\xbe\x50\x0f\xe3\x12\xaa\xbb\x74\xd4\x56\x68\x48\x9b\x8d\x38\xb8\xbc\x48\x81\xd3\x26\x6a\x2a\x2c\x17\xcd\xdd\x78\x53\x09\x06\x80\x4e\x05\x4e\xe0\xe9\x97\x51\xb3\x10\x9f\x23\xf2\x86\x02\xc3\xa2\x66\x1a\xdc\xc3\x46\x6b\xdf\x65\x43\xe7\xf3\x6d\x58\xb5\x3e\xdc\x20\xd4\xc9\x20\xf1\xf4\xa0\xbf\x9c\x0c\x92\x43\x62\xc5\xb6\xf1\x1a\x13\x2b\x9e\xa7\x8a\xcc\x3e\x60\x2f\x07\x54\xfc\x01\x15\xbf\x8e\x8a\x77\x77\xd2\x1b\x14\x5f\x23\xe2\x8d\xbc\x05\x43\x9c\xdf\x6b\x45\x34\xac\x78\x50\x2d\x39\x4e\xaf\x2f\x51\x22\x08\x34\x82\xc1\x99\x9c\x22\x74\xe9\x5b\x40\xa4\x6d\xd7\x57\xe8\x57\xe3\x43\x08\x8c\x18\x61\xa5\x48\x5e\xa8\xb0\xe7\x7d\x00\xc5\xb7\xc6\x01\x14\xff\x12\x40\xf1\x51\x11\x93\x5f\x2a\x62\x61\x01\xe5\x45\x99\x63\x36\xd1\x12\x04\xdf\x67\x9d\xac\x38\xc7\x3a\x3c\x49\x3b\xf4\x9d\xab\x38\x0a\xf7\x04\xc0\x30\x9c\x79\x97\xd2\x2d\x19\xfd\xa5\x24\x75\x24\xaa\x32\x54\xf6\x0c\x82\x85\x39\x44\x3d\x57\x63\x7e\x45\x91\x2c\x09\x2f\x48\xa7\xfc\xa2\xd9\x40\x5f\xcb\xda\xdd\x0c\x10\x22\x88\xf1\xfa\x18\x7c\x75\x83\x46\xa9\x70\x3d\x4d\x63\x8c\x5e\xf3\xf4\xd8\x77\xe1\xb5\x05\xdb\xf6\xf3\x82\xa3\xd7\x37\xfa\x9c\x65\xfc\xd1\x20\x2e\x9a\x66\x93\x7e\x33\x7a\x8f\x03\x24\x35\xe8\xc6\x39\x15\x82\x0b\x0b\x2a\xa6\x2c\xf8\x01\x42\x1a\x2a\x9d\x2f\x14\x11\xc6\xe1\x69\xf2\xce\xa6\xe8\xd6\xdb\x4b\xd0\x60\x3b\x8a\x23\xcc\x4c\x69\x5e\xfd\xdf\xae\x64\x4d\xc0\x3d\x75\x7a\xc4\x3d\x59\xe0\x25\xe5\xa5\x80\x99\xfa\xdb\x62\x47\x96\xe0\x91\x36\x1c\x56\xbc\xac\x80\x78\x65\x40\x45\xc6\xea\x5e\xc9\xb5\x63\xf2\x95\x55\x9f\x6a\x92\xe0\xe0\x4f\xb9\xc3\x8a\x4c\xc8\x57\xea\xdd\xc5\xa8\x3b\xbd\xea\x21\x58\xa0\xed\xb3\x73\xcc\xa5\x2c\xb4\x51\xf2\xc5\xb3\x92\x75\x9b\x4f\x36\x69\x85\xba\x57\x96\xb7\x40\xac\xcf\xb9\xe2\x5c\x25\x3e\x4e\x51\xe6\x3a\xa5\x99\xc6\x05\xae\x90\xe7\xf3\x3a\x58\x42\x4a\x74\x98\xfd\xb8\xf6\x41\x3b\x1c\xfc\x3a\xdb\xc6\xc1\xaf\x53\x8d\x17\xe0\xd7\xa9\xd2\xec\x32\x9a\xac\x2e\xcf\x63\x78\x07\x6c\xde\xa3\x21\x89\x7e\xc0\xd2\x1b\x4c\x77\x85\x19\x9e\x43\x10\x0a\xbd\xb9\xbd\xfe\xe1\xea\xad\x7e\x5e\x10\x98\xbb\x3c\xf7\x55\x65\x7a\x32\xf7\x6e\x9b\x7b\xf0\x69\x1f\x25\xf7\x51\xf7\x24\x22\x59\x4b\xcf\x72\x16\x7b\x69\x52\x80\x2a\x2b\xe4\xda\x3b\x94\xbc\xde\xb4\xcf\x24\xba\xb9\x9e\xc1\xbe\xea\x72\x47\xac\x2e\xf3\xf4\xe1\xa9\xb6\xa7\x81\x88\xda\xbc\x07\x63\xc0\x99\x5b\x01\x98\x9d\x7b\x25\xb0\x22\xf3\xd5\x39\x29\x32\xbe\xd2\x97\xe2\xba\x01\xcd\x32\x7f\x7a\x4f\xb6\x9a\xe7\xe2\x1e\x27\x48\x94\x19\x34\xd1\x48\xd7\x7a\xed\x32\x42\xd2\x5a\x42\x50\x26\x15\x86\xc6\xa9\xe6\xbb\x07\x28\x8f\x54\x1c\xc6\xa8\x08\x13\x33\xbf\xc1\xbf\x68\xb7\xe0\xff\x34\x5c\x6a\x73\xac\x82\x00\x5f\xbb\xed\x5e\x8f\x87\xdd\x8e\x04\xd8\xb6\x9f\x04\x70\x8d\x9b\x32\xd3\xe2\x39\x4b\x65\xb3\xb4\x88\xd5\xd8\xed\x49\x8f\x79\x29\x18\x15\x86\x0b\xe9\x95\x9d\xa0\xfb\x52\x2b\xfc\x44\xb6\xb0\x07\x8d\x2f\x18\x43\xf1\x9e\x97\x0a\x3d\x2e\x0c\xbe\x5e\x93\x45\xb8\x28\x32\x4a\x20\xb4\xc0\x85\x85\xa0\xef\x62\xa3\xf7\x10\xda\xce\xda\x76\xd2\x53\xc7\xeb\xa5\x13\xb4\x24\xe2\x7e\xfb\xd6\xee\xa6\x72\xe2\x82\x02\xde\x69\xa4\x7e\xda\xba\x10\xa7\xd7\x97\xe6\xb3\x2e\xff\xa2\xe9\x36\x73\xbf\x1c\xc9\xea\xe0\xfe\xd8\x73\x77\x0d\xc1\x4d\x36\xb0\x71\xd1\xd7\xbd\xd9\x4e\xaf\x2f\x47\xd2\x9c\x9b\xc9\x41\x5b\xb3\xda\x4d\xaf\xad\x75\x6c\xea\x54\xd5\x3d\xc7\xf1\x5c\x7f\xef\x58\xb3\x82\xb3\x6a\x99\x84\x95\x39\x81\x86\x69\xf5\x84\x11\x65\xf0\x2d\xa7\xd7\x97\x3b\xb5\x4d\xac\x7c\xff\x59\xc6\x1f\xc7\x2a\x80\xbb\x42\xed\x77\x82\xd6\xef\x28\x91\x19\x67\x37\x76\x13\x7e\xbe\xf9\xe8\x73\xa5\x3e\xb5\x29\xd8\xf6\x4c\x44\xe9\xed\x2e\xb0\x50\x74\x34\x72\xb4\x14\x99\x03\x0a\x9a\x7a\xa2\x36\x99\x7a\x81\x97\xa4\x6e\x8c\x35\x45\xe8\x9b\xb1\x72\x5d\xdf\x23\x7b\x34\x86\x5f\x41\x7b\x46\xd3\xd8\x0e\xcd\xca\x2c\x3b\x41\x33\xca\xb0\x16\x49\x64\xec\x91\x37\x01\x56\xb7\x94\x25\x44\xef\xe1\xc4\xdd\x24\x04\x7b\x60\xdd\x35\x23\x29\x56\xec\x0d\x92\x98\x00\x11\x4d\xb2\x14\x9a\x56\xc3\x74\x35\x23\x4b\xc0\xc9\x3d\x3e\xdd\xf4\x2c\x2b\xa5\x22\xe2\x86\x6b\xd1\xdc\xc8\x36\x83\xf6\x1e\xb8\xf9\xeb\x1f\x28\x4b\x77\x48\xe5\xbc\x01\x61\x9f\x60\x86\x08\x85\xa0\x87\x9e\xde\x4a\xb3\x6b\xfd\x76\xea\x07\xf5\x46\x96\xa3\x73\xef\xb0\x44\x47\x05\x4f\xe5\x91\x66\xf9\x47\x26\x9c\x28\x8f\xde\xea\xff\xeb\xee\xed\x48\x8a\x90\x6a\x65\xe6\x00\xd4\xdf\xe1\x82\x1e\xbd\x3d\x41\x70\x09\x00\xc0\xc7\xd5\xe2\xf5\xbd\x56\xb7\x13\xe0\x77\xf3\x78\xab\x37\xcd\xcf\xc3\x4b\x65\x15\x02\x4e\xcb\xda\xd1\xfd\x33\x33\x2a\xe1\x81\x9b\xc8\x88\xeb\x5b\xb4\x26\x78\x11\x3a\x1d\xeb\xa9\x27\x79\xa1\x20\x4e\x8f\x72\x82\x1d\x60\x98\x2c\x89\x58\xa9\x85\x6d\x16\xf2\x6a\x99\x6c\xf5\x2a\x02\x8e\xcc\x32\x56\xb7\xf1\x15\xc9\xd1\xc2\x9a\xca\x9e\xe3\x71\xd4\x4f\xb3\x6c\x77\x57\x24\x86\x0f\x39\x91\xff\xea\x4e\x05\x74\x33\x8f\x13\xf9\xa2\x3f\xd7\x3e\x0d\xf3\x23\x23\xba\x34\x3b\x1c\x3b\x61\x8e\x4e\x3f\x7e\xb4\x48\x15\xb3\x8f\x3f\x51\x96\x1a\x5b\xea\x54\x29\x41\xef\x4b\x45\x6e\x88\x5e\x12\xa8\x3f\x63\x4f\xc6\x6a\x65\xae\x88\x8c\x3d\xfa\x29\x82\x89\x7a\x9f\xf5\x83\x9e\xdb\x6b\x3a\xe7\x75\xb3\x6e\x9c\x39\xb6\x91\xb4\xb3\x5c\xfb\xc9\x0c\x7c\xd8\x9a\xbe\x57\x3c\xed\x63\x02\x9d\x0a\x66\xf5\x9f\x5a\x25\x78\xd5\xf0\xb6\x5a\x4a\xd6\x84\x5b\x15\x3d\x1c\x60\x68\xf3\x37\x6e\xf4\xa6\x39\xd4\xfe\x36\x90\x16\x8d\xdf\xdc\xad\x0a\x13\x8d\x45\x18\xcd\x32\xdc\x7f\x14\xd5\x45\x03\x1e\x6e\x14\xf0\xb3\xdb\x2f\x6e\x41\x12\xd1\x3e\x2d\x69\x8b\x3d\x36\x64\x81\x4d\x06\x7b\xde\x4d\x36\xb5\x01\xdc\x66\x82\x55\x44\x37\xdd\xa0\xed\xf0\x2e\x35\x10\x18\xd8\xb4\xfb\x77\xb6\x8f\x1f\x6e\xdc\x00\x70\xbf\xf3\x99\xbb\x09\x1b\x6f\x34\x64\x9e\xcc\xb8\x80\xfd\x6e\x5e\x9b\xc1\x15\xf4\x5e\xdf\x07\xb2\x7a\xe4\x22\xed\xd9\x1b\xaf\xbb\x36\xf0\x4d\x19\xbe\x27\xd9\xb6\x27\x72\x85\x0b\xbd\x01\x75\x86\xb0\xe1\x98\x36\x13\xcc\xd8\xa5\xa6\xb4\x86\xcb\x5b\xe4\x62\x8e\x19\xfd\x8f\xbe\x93\x87\xa2\x04\xfa\x55\x73\x41\xff\x83\xa0\x37\x06\x73\x60\xbc\x59\x19\x49\xd4\x5b\x7b\x0f\x7b\x38\xdf\xe0\x35\xc5\x69\x4a\x8d\x66\x75\x3d\x78\xb7\x86\x36\x83\xb2\x87\xb8\x7b\xbe\xf1\x49\x6d\xbb\xff\x43\xd0\xb0\xad\xfc\xb8\x14\x1b\xf3\x2b\x06\x3e\x9b\x63\x6a\xa4\x58\x5f\x07\xb2\x7d\xec\x01\xc9\x31\xf5\x59\x88\x19\x9e\x3b\x98\x63\x55\x0a\xaa\x7a\x44\xce\xd0\x87\x28\xfb\xa9\xbc\x27\x16\x43\xb6\xd3\x47\x19\x24\x61\x9d\x5e\x5f\xc6\xda\xf4\xd6\xcb\x05\xff\x92\x9d\x96\x56\x75\x50\xc9\x70\x7e\x4f\xe7\x25\x2f\x65\xb6\x6a\x38\xee\x11\x06\x75\x63\x8a\xd0\x65\xbf\x19\x9d\x72\x22\xd9\xb1\x42\x98\x71\xb6\xca\xed\xc7\x59\x92\x95\x29\x69\x7d\x0b\xa0\x3d\x96\x9c\xa6\x08\x97\x8a\xe7\x58\xd1\x04\x25\xdc\xfc\x6e\x3b\xf5\x52\x12\x84\x37\xd0\x4b\x4a\xa9\x78\x8e\x72\x2c\xe4\x02\x67\x59\xff\xb9\x07\x49\xb2\x4d\x9e\xa8\x09\xec\x4d\xef\x2f\x96\x66\x96\x1e\xb7\x1b\xbe\xcc\xfb\x76\xeb\x09\x79\x7f\x78\xb9\xe9\x9e\x6e\xfd\xbc\x2d\x6c\xdd\xd3\xcc\x66\x70\xe3\x87\xf7\x62\xf3\x4b\xdd\xb2\x92\x8d\x7c\x6e\xe0\x73\x82\x14\x19\xee\x35\x0d\x07\xea\x4c\x6a\x89\x0e\x6a\x3d\x67\xa4\xa2\x30\x45\xb7\xc6\x5f\x96\x63\x95\x2c\x36\x84\x6e\xfe\x3d\x27\x0a\xa7\x58\xe1\xa9\x56\x87\xff\xdd\xba\x9a\xac\x67\x94\x67\xa9\x26\xbd\x49\xd0\xf5\xce\xdf\x08\x49\xde\x73\x02\xad\xf9\x7f\xd4\x72\xbd\xfa\x63\x50\x4b\x20\xe1\xb3\xe9\x84\xdd\x51\xc0\x0e\x1f\x22\x6c\xc2\xc5\x57\xad\x7d\x0e\x04\xd7\x5a\x73\xec\x7e\xa4\x6d\xe3\x65\xed\x15\xd8\x97\x9b\x93\x81\x84\x00\x93\xd6\x5a\xff\x1d\xf8\x05\x4f\x3f\x9d\x6f\xf2\x61\x6c\xb3\x9a\x06\xad\xa4\xb6\x9f\x7f\x60\xba\xce\x43\x6b\x7f\x33\xd8\x81\xbd\x72\xef\xbb\xfc\x7d\x28\x2e\x64\x6a\x18\x81\xef\x88\x08\xec\x88\xd8\x03\x95\x2e\x61\x76\x23\xd1\x5a\x57\xdb\xb4\x71\x23\xe2\x31\xdb\xa2\x30\x43\x75\x52\x26\xd5\xc4\x37\xfc\xc1\x98\x80\xcc\x96\x5a\x26\xad\xe3\x30\x05\x99\x4c\x85\x2a\x38\x17\xc8\x27\x76\x5e\xb3\xea\x28\xac\x6b\x66\xd0\x46\x1d\x0e\x67\x8d\x32\x8d\xdd\xe2\x47\x4f\xbf\x3a\xe6\x66\xa1\x54\xbd\x86\x63\x69\xd3\xb6\x39\x93\x0b\x5a\x6c\x03\x29\x55\x71\x01\x7b\xfa\xe8\x0b\xce\x68\x5a\x91\x37\xef\xe3\x92\x9d\xa0\x4f\x5c\xe9\x7f\x2e\xbe\x52\xb9\xc5\x43\xa1\xef\xd2\x39\x27\xf2\x13\x57\xf0\xd7\xc1\x9b\x63\xa6\x36\x7a\x6b\xac\xcd\x61\x5c\xa9\xf0\x72\x1b\x96\x89\x5b\xe6\xe5\xf6\x34\x88\x6a\x8b\xa9\x44\x97\x0c\x71\xe1\xf6\xa0\x2a\x92\x26\x2d\x79\x97\x09\xcc\x38\x9b\x80\xd3\x74\xd8\x23\x73\x69\x59\x7b\x83\xbe\xd9\x56\xfd\x1d\xcd\x9d\x6b\x7e\xd5\xf0\x96\xb7\xa6\x61\xa6\x60\x8a\x50\x98\xdf\x50\xe9\x44\x52\x8a\xd2\x12\x36\x02\x3b\xcf\x09\x4d\x06\x49\xe7\x44\xcc\x21\xb4\x92\x0c\x3a\xe7\xc7\x79\x97\x46\xf8\x94\xb6\xdc\x08\x10\x08\x1f\x37\x58\xa4\xa8\x57\x7c\x98\xbf\x36\x2c\x36\x37\x66\xea\x7f\x6a\x8e\x09\xfb\xfa\x5f\x50\x4b\x50\x4e\xd1\x29\x92\x94\xcd\x37\xb6\x02\x68\x7e\xc2\x86\x9b\x9a\xc4\x35\x5d\x2a\x91\x66\x80\x4b\x9c\x69\x8e\x0e\x88\xe6\x2d\xe9\xfe\x7c\xb6\x26\xe0\x4e\x6c\x75\x3f\xcd\x8d\xaa\x98\xd3\xd1\x03\x59\x1d\x9d\xb4\x2e\xcd\x06\x8a\xfa\x8f\x2f\xd9\xd1\x49\x55\x3b\xa3\x75\x4f\x2b\xd1\x01\x41\xac\x23\xf8\xdd\xd1\x74\x4d\x26\x6e\xa0\x3d\x4a\x52\x0e\x08\x88\xb1\xd6\x37\x1a\xbe\x05\x1b\x35\xd3\xd6\xc9\x7f\xb6\xfb\xe4\x4c\x04\x38\xfd\x47\x81\x8b\x82\x08\x84\x05\x2f\xc1\x99\x90\x2f\x89\x98\xba\x3f\x01\x60\x43\x9f\x87\xd1\xf9\xc5\x12\x2e\x04\x49\x94\x33\x2f\xf4\x2b\x52\xdc\x96\xf8\x61\x29\xd4\xd1\xd9\x49\x4f\x7b\x24\xf7\x0b\xce\x1f\xa0\x7e\x00\xec\xcc\x93\xd8\x77\x7f\x32\xdf\x72\x5e\xff\xcc\xa9\xe8\x12\xa5\x44\x61\x9a\x01\xb2\xe3\xf3\xc7\x2b\x8b\xfd\x70\x62\xbc\xf7\x68\xec\x9c\xfb\xee\x48\x90\x5d\x85\x53\x8b\x74\xba\x21\x4b\x4a\x1e\xed\x99\xf4\x7d\xcd\x04\xcd\x09\x03\xb0\xc0\x06\x50\xd0\x04\x49\x9a\x92\x0b\x28\x6c\xd3\x4f\xc0\xd3\xe1\xb8\x61\x8e\xc3\x77\x78\x88\x25\x6e\x61\x87\x5b\x85\xa3\x8b\x29\x88\x6b\x2e\x36\x16\x5e\x1f\x53\xa3\x66\x4c\xfd\x19\x9b\xff\xf0\x01\x7d\xf7\xdd\x6f\x36\xfc\x49\x8e\xbf\xd2\xbc\xcc\x3f\xa0\xdf\xfd\xf6\xb7\xbf\xf9\xed\xa6\x3f\xa2\xcc\xfc\xd1\xb7\x9b\xd6\x64\x5f\xf8\xd9\xcd\xf9\x1e\xf7\x36\xad\x50\x78\x43\x41\x8a\xad\x64\x66\x98\x66\xa5\xb0\x00\x54\x6f\x2a\xcd\x1b\xef\x4d\x04\x44\xcd\xf0\x44\x3a\x2e\xdd\xea\xef\xc1\xe7\x5d\x65\x8f\x81\x60\x71\x2e\x6f\x63\xd9\x1a\x14\x9a\xef\xcc\x0c\xcf\xb8\xdd\x68\xb6\xf6\x4c\x6e\xcd\x9a\x32\x86\x21\xfc\xec\x97\x92\x88\x15\xe4\x10\x55\xea\xed\xc6\x7b\xd0\xc0\x47\xdd\xd5\xa5\xa6\xdc\xba\xac\x74\x37\x85\x42\xdb\x82\x7a\xb3\x29\x55\x89\x49\x74\xca\x6c\x0c\xbd\x33\x57\xa0\x45\x20\x7a\x5e\x79\xb2\xd1\xe9\x46\x8a\xac\xcc\xb2\x4d\x24\x18\xdf\xec\x0b\x6f\xee\xfe\xa0\xe1\x36\xc6\xb6\x1a\x67\xbc\x9b\xe1\x6d\xc2\x0f\x6a\x86\x2d\xf3\x7e\x67\x43\xbe\xb9\x19\x11\xd4\x54\x4f\xd3\x7e\x90\x66\x17\xbf\xb7\x83\x81\xbf\x95\x2e\xa9\xaa\x3d\x0f\x9b\xf9\xcd\x6d\x1a\x01\xbe\x1c\x07\xbc\xdc\x5e\x20\x75\xab\xf9\x6f\xc6\x78\x54\xe6\xa8\xb2\xa6\x1e\x0e\x81\xad\x34\x91\x07\xca\x75\x14\x3e\x62\x8c\x8b\xa0\x67\x59\x63\x1d\x05\x23\x16\x06\xb5\x7b\x77\x72\x17\x8c\x20\x6a\x2d\xdf\x5d\x9c\x06\x76\x36\xe3\xb7\x6e\xbb\x03\xc1\x8c\x9d\xdd\x08\x23\xd6\xd7\x63\xec\x0f\x3a\x13\x46\x90\x5c\x77\x37\x0c\xba\x14\x46\x50\xdc\xe4\x74\xd8\xec\x58\x18\xf3\x0e\x46\xb8\x1e\xc6\xba\x17\xcc\xd8\x05\xc2\x32\x1a\xbe\x32\xea\x1e\x6d\x75\x3b\x98\xe1\xe9\x7c\x18\x9c\xa5\x73\x4c\xec\xec\x82\xd8\xe2\xb3\x6c\xb8\x27\xc6\x3a\x22\x06\x29\xf6\x38\x29\x46\xba\x23\x86\xbd\x70\x83\xae\x8a\x5d\xa4\xfe\x56\x71\xb6\x8b\x83\xa2\x49\x78\xe0\xee\x08\x42\xd9\x92\x9b\xe6\x90\x3b\xa8\xde\x37\x6b\x1f\xeb\x68\xe0\x8f\x20\x97\xac\x0a\x3e\xa8\x7c\x1b\xe1\x5f\x99\xae\x48\x5b\xef\xa8\x94\xdb\x1c\xfd\x43\x6b\x1a\x4a\xa2\x09\x36\xcc\xda\xfb\x50\x66\xe4\x4f\x54\x2d\x3e\xbb\x36\xb7\xf6\x25\xa9\xb2\xc8\x60\xe9\x8d\x5f\x0c\x17\xaf\xbb\xa9\xf5\xfc\x4b\x65\x98\x52\xc2\xf3\x9c\xb0\xd4\xa0\x51\x72\xfc\x40\x90\x2c\x05\xb1\x90\xc1\x2c\x33\x56\x8e\xfe\xa2\x01\xb2\xe4\x6b\x81\x99\x51\x6b\xf5\x4d\x5c\x6a\x69\xb8\xf9\x26\x8e\xba\x87\xe3\x74\x9c\x91\x19\x27\xc3\x99\x26\x55\x6a\x45\x27\x57\x64\x0b\xd7\xbc\x27\x19\x07\xdf\xd7\x14\x1d\x7f\x73\x6c\x61\xc0\x96\x10\x88\x22\xfb\x53\xab\x6f\x9c\x8c\xa8\x28\x93\x11\x36\xaf\xcb\xc4\xca\x8c\x26\xa4\x92\x3a\x9c\x91\x29\xba\xb1\x8a\xe6\x18\xbd\x75\xbb\x80\x18\x25\x1c\x46\x2a\x18\x75\x61\xa0\x1d\xcf\xc2\x7d\xaa\x79\x1a\x4b\xf7\xb3\xf0\xf3\x70\xa4\xfe\xfe\x4e\xa4\x6a\x8a\xbd\xcb\x81\xb4\x59\x4c\x2d\xc5\xaa\xd3\xa8\x58\xe8\x96\x49\x02\x83\x4d\xb0\xd0\x62\x0e\xfc\xa9\x13\x74\x76\x73\x71\x7a\x77\x71\x82\x7e\xbe\x3e\x87\x7f\xcf\x2f\x3e\x5e\xe8\x7f\xcf\x3e\x7f\xfa\x74\x71\x76\xb7\x5d\x47\xfb\xc6\x34\xbc\xcd\x32\x73\x1e\x5a\x2e\xf3\x16\xe7\x83\x4c\xa9\x59\xa9\x34\x03\x1b\x3b\xd1\xd6\xfa\x34\xcf\x83\xcf\xa6\x24\xdd\x74\x63\xec\x9d\xd8\x46\xf6\x15\xde\x98\x91\xd9\x00\xad\x0b\x73\xb4\x2d\x0d\xa0\x46\x79\x6f\x99\x64\x13\xfe\xff\x17\x86\x7e\xe4\x02\x91\xaf\x38\x2f\x32\xf2\x01\x1d\x17\x3c\x95\xc7\x36\x01\x43\xff\xf7\xd4\xfc\xe8\x5d\xc6\xe7\xdb\x8a\x8f\xb9\xac\x0d\x82\x32\x3e\x47\xb2\xbc\xaf\xb2\x76\x40\x69\x00\x5a\xdf\x38\xda\xad\xcc\x81\x6d\x86\x9b\x4b\xd9\x69\xd0\xac\x26\xd6\xa2\xd8\xfc\x83\xed\xf7\xc6\xcd\xe9\x9d\x4c\x70\x46\x5a\x74\xf4\x0f\xba\x5f\xf7\xcd\xbb\x6f\xc6\x6d\x41\x6b\x6d\x4e\x17\xa5\xa2\x43\xef\x2f\x4c\xdf\xfb\x47\x9a\xa5\x09\x16\xdb\x32\xfa\xbb\x4f\x03\x24\xbf\x41\x80\x43\x4a\x87\xe9\x83\xc4\x40\xa3\x18\xbb\x03\xb6\x54\x0f\x5f\x12\x91\xe1\xc2\xe0\xb8\x09\x4e\x6c\xcd\x7f\x98\xe0\x39\x29\x08\xe4\x86\x99\x56\x1d\xdb\x6e\x16\x61\x49\xc6\x25\xfc\x39\x28\x1d\x27\xad\x25\xdb\x76\x7f\xb6\x5f\xd5\xc8\x54\x9e\xea\x11\x0f\xd7\xe7\xd8\xc7\x2b\x06\x98\xf0\x0e\x2f\xd8\xc0\x8a\xdb\x6e\xed\x46\x79\xb3\x2a\x45\x03\x7c\x1c\xa3\x5c\x0c\xc0\x43\x8f\x6c\x26\xdf\xd1\x09\x3a\xaa\xaa\x31\xa5\xd6\x08\x3a\xfa\xe6\xa8\xfe\x83\x91\xef\x17\xdb\x24\xc9\xc4\x7c\x6c\x02\x73\x6c\x66\xca\xc2\x65\x03\x03\x6e\xab\x1f\xb0\x5a\x54\x5d\x15\x4e\xeb\x1d\xd6\x87\x0c\xf3\x6f\x7f\xcd\xb6\xfb\xd0\x5c\xe2\xda\x8c\xeb\x34\xca\xce\x6c\xb7\xad\xdc\xc2\xe5\xaa\xd9\xea\x6d\x6b\x10\x57\x50\x0a\xc2\xa4\x74\xda\x23\x13\x8d\x94\x9c\x6d\x73\xbe\x6d\x3d\x02\x07\xcd\x6b\x95\xb6\xa3\x02\x15\x58\x68\xdb\xd8\xfd\xe5\x36\xa2\x8d\x56\xef\x47\xdf\x6c\x29\x8a\xb3\xf5\x42\x37\x22\x98\xde\xf1\x1e\x85\xc5\x9c\xa8\xa1\xd0\x20\x66\xab\xcf\x1b\x6b\xd7\x4e\x46\x45\x0e\x27\x63\x1e\xe7\xd7\x49\x5d\x17\x74\x42\x99\x9a\x70\x31\x31\x1f\xf8\x80\x94\xd8\xd0\x16\x48\xd1\x9c\xf0\x52\xdd\x92\x84\xb3\xbe\x34\x07\xfb\x57\x51\xa2\x9b\xa3\xf3\x40\x6c\x30\xfd\xd4\xa9\x58\x2e\x19\xa4\x19\x11\xab\x6d\xed\x81\x60\xb9\x19\xad\x8a\x4d\x9f\x3f\x5e\xf9\x1e\x35\x82\x0c\xfa\xcd\x27\xf9\xc5\x4a\x27\x36\xaf\x66\x6e\x57\xb2\xf1\x23\x57\xa5\xda\xed\x03\x67\x55\xe0\x76\xe8\x2f\xed\x96\x0c\xd5\x97\xd9\xb0\x5a\xa9\xb0\x2a\x3b\xf7\xa0\x75\x36\x96\xab\xde\x9a\x0c\x33\x6b\x5d\xdd\xc2\xa7\x9a\xce\xef\x66\xbd\x0d\x50\xd0\x3b\xd3\x30\x8d\x30\xe0\x53\x00\xec\x2d\x78\x3a\x45\x96\x4c\x8e\x57\x48\x09\x4c\x8d\x73\x00\x27\xaa\x84\x44\x75\xac\x2c\x08\xd8\xd6\xca\xfa\x87\xf5\xe5\xf4\x18\xfd\x9b\x0d\xfd\x84\x08\x25\x3f\x62\xa9\x7e\x2e\x52\xdc\x9b\xe0\xd4\x01\xf2\x4a\x05\xcf\xc5\x98\x2d\x8f\x8c\xa4\x9a\xa9\xdb\x8d\x30\xd4\xd0\xa3\xe6\x98\xa5\xa1\xb7\x46\x6e\xf0\x82\xb9\xe7\xa3\x3f\x3a\xd1\x5f\xd3\x37\xdb\x1b\xae\x77\xe1\xb4\x87\xd5\xb4\x31\xd3\xdb\x66\xa9\x25\x99\x00\x5a\x88\x91\xaf\xeb\x5e\x92\xb0\x99\x72\x96\x6e\x02\xda\xb4\x77\xd4\xea\xf2\xf5\x07\x4e\x10\x46\x0b\x2a\x15\x17\x36\x0c\x00\x9d\xe4\x05\x66\x92\xf6\x67\x81\x86\x03\x77\xce\xaa\x2f\xd7\x16\x02\xc1\x55\xc7\x5b\x7b\x3b\xa1\x21\xac\x20\x09\x17\x69\x35\xa5\x7e\xee\x56\x4f\xd3\xaa\x8d\xfd\x6f\xa5\xe7\xc3\x81\xe9\x39\x19\x96\xea\xae\xfa\x76\x7d\xf8\xa3\xb8\x6c\xfb\x42\xdb\xe5\xd6\xab\x70\x35\x13\x38\x73\xbf\xdc\xec\x71\xe3\x08\x33\xa3\x3e\xfb\xf3\xd6\x6d\xd7\xaa\x5e\xab\x79\xaf\x1e\xeb\x7c\xac\xde\x66\x63\xc9\x4f\x3d\xe3\x9c\x48\x89\xe7\xe3\xa6\x7a\x6a\x8a\x3b\xa3\xaa\xb8\xb3\xfd\x30\xa2\x2c\xa5\x09\x48\x8a\x0a\x4d\xd6\xc7\x55\xeb\xf1\xb8\x58\x6d\xbe\x82\x5a\x96\xba\xfc\xe8\xea\xf1\x79\x1f\x5d\xb1\xc0\x72\xdc\xf2\xaa\xb7\xe6\xdc\x17\x63\x1f\xc8\xa8\x79\x08\x82\xe5\xe6\x5c\x9a\xce\x3e\xdf\x0b\x4a\x66\xe8\x0c\xe7\x24\x3b\xc3\xf2\x39\x36\x1a\x38\xc7\x14\x91\xe9\x7c\x8a\x8e\x6f\x1a\xd1\x95\x4f\x5c\x5d\x6d\xee\x98\x33\x98\x32\xba\xfd\xdd\x87\xbd\xf8\x7e\x5c\xfb\xc6\xb7\x1e\x24\x36\xb6\xbd\xec\xa0\x37\x1d\x34\xb3\x8d\x2f\x38\xec\xed\xea\xab\xd3\x27\x0c\x02\x5f\xed\x50\xd2\x58\xff\x4b\x6d\xbf\xd1\x52\x80\x41\x96\xf8\xbd\xd5\xc1\x84\xaf\xfe\xf7\x19\xf8\x32\x43\xb6\x71\xe7\x37\x39\xb8\xbc\xea\xe3\xb7\x3d\x4a\xf4\xda\x4a\xef\x5a\x1a\x30\x78\xa0\x9a\x80\x26\xa8\x04\xae\xe7\x78\x76\xfb\x25\x8e\xda\xf3\xdc\x19\x99\xf6\xe0\x7a\x7f\xc7\x36\x82\x8a\x37\xc9\xe4\x90\x0c\xcf\x14\xfc\x79\xfa\x5c\x9f\x27\xa0\x7a\xee\xbe\xcf\x1a\x34\xd6\x74\xb5\xa7\x3d\xb3\x0d\x71\xed\xdf\x0c\x3a\xcc\xeb\xfb\xf0\x46\x71\x54\x08\xb2\x04\xb0\x1b\x03\x2c\xbb\x56\xde\xa5\x7e\x10\x6f\x37\x6b\x66\x63\x62\xa1\xdb\xe1\x65\x9b\xcf\xdf\xfd\x7e\xc3\x2d\x70\xbf\xde\xa2\x40\x0e\x1d\xae\x19\xe3\xe2\xb5\x83\xa9\xbc\x66\x8c\xf4\x72\x0e\xa5\xf5\xee\x44\x68\x8b\xfa\xb7\x13\xad\x3e\xe3\xbc\x3b\x3a\xc5\x4e\xf5\x07\x6e\x80\xf1\x9a\xf8\x49\xa2\xf9\x6a\x82\x25\xf8\x0a\xe1\xc7\x86\xd1\x6c\xf3\x71\x37\x6d\xf5\x9b\x2e\xa7\x83\x8c\xaa\xf6\x9d\x8f\xb1\xdc\xb2\xa4\x71\xce\x60\x4b\x9a\xf5\x48\x5a\x7b\xcc\x13\xdf\x72\x89\x9e\xaa\x04\x83\x19\xc3\xb7\xce\xf7\xbe\x6d\x63\x09\xa1\x37\x6d\x7b\x6d\x8e\x81\xdb\x15\x3d\x71\x5f\x12\xb1\x24\x69\xc3\x0f\x6b\x4b\x66\x37\x7f\xd2\x70\x97\x3b\xba\x76\xeb\xd1\x7f\xfe\xd7\x3f\xfc\x77\x00\x00\x00\xff\xff\x6a\xbf\x6a\x45\xd5\xd7\x0a\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x73\xe3\x36\x96\x30\xfa\xfb\xfc\x15\xa8\x4e\xf6\x93\xbd\x91\xe4\xee\x99\xd9\xb9\x3b\xfe\xe6\x6e\xca\x6b\x3b\x19\xdf\x74\xbb\x55\xb6\xd3\xf9\x52\x49\x36\x03\x91\x47\x12\xd6\x24\xc0\x05\x40\xd9\x9a\xdb\xf7\x7f\xbf\x85\x83\x07\x49\x3d\x6c\x89\x64\xb7\x65\x37\x91\xaa\xb4\x25\x91\x20\x78\x70\x70\xde\x0f\x9a\xb1\x0f\x20\x15\x13\xfc\x98\xd0\x8c\xc1\xbd\x06\x6e\x3e\xa9\xe1\xed\xbf\xab\x21\x13\x47\xf3\x37\x7f\xb8\x65\x3c\x3e\x26\xa7\xb9\xd2\x22\xbd\x02\x25\x72\x19\xc1\x19\x4c\x18\x67\x9a\x09\xfe\x87\x14\x34\x8d\xa9\xa6\xc7\x7f\x20\x84\x72\x2e\x34\x35\x5f\x2b\xf3\x91\x90\x48\x70\x2d\x45\x92\x80\x1c\x4c\x81\x0f\x6f\xf3\x31\x8c\x73\x96\xc4\x20\x71\x72\xff\xe8\xf9\xeb\xe1\x9f\x87\x6f\xfe\x40\x48\x24\x01\x6f\xbf\x61\x29\x28\x4d\xd3\xec\x98\xf0\x3c\x49\xfe\x40\x08\xa7\x29\x1c\x93\x28\xc9\x95\x06\xa9\x40\xce\x59\x04\xee\x7e\x35\x14\x19\x48\xaa\x85\x54\xc3\x48\x48\x10\xe6\x9f\xf4\x0f\x2a\x83\xc8\xac\x62\x2a\x45\x9e\x1d\x93\xb5\xd7\xd8\x79\xfd\x62\xa9\x86\xa9\x90\xcc\x7f\x26\x64\x40\x44\x92\xe2\xdf\x0e\x08\xf6\xf1\xd7\xf6\xf1\x0e\x72\xf8\x7b\xc2\x94\xfe\x61\xf3\x35\x6f\x99\xd2\x78\x5d\x96\xe4\x92\x26\x9b\x5e\x04\x2f\x51\x33\x21\xf5\x65\xb1\x2c\xb3\x8c\x48\xcd\xcb\x7f\xbb\x0b\x19\x9f\xe6\x09\x95\x1b\x66\xfb\x03\x21\x2a\x12\x19\x1c\x13\x9c\x2c\xa3\x11\xc4\x7f\x20\xc4\x3f\xcb\x4e\x3e\x20\x34\x8e\x71\x23\x69\x32\x92\x8c\x6b\x90\xa7\x22\xc9\x53\x1e\x1e\x6e\xae\x89\x41\x45\x92\x65\x1a\x37\xeb\x66\x06\x08\x35\x22\x26\x44\xcf\x80\x9c\x5e\x7f\x08\x97\x12\xf2\xdf\x4a\xf0\x11\xd5\xb3\x63\x32\x34\x1b\x30\x8c\x99\xca\x12\xba\x30\x4b\x28\x5d\x65\x77\xf3\xcc\xfe\x56\xfa\x5e\x2f\xcc\x7a\x95\x96\x8c\x4f\x1f\x7a\xbe\x7b\x89\xed\x96\x30\x2f\xed\x53\xf9\xf1\x1f\x56\xbe\xdf\xf6\xf1\xfe\xf5\xa9\x79\x32\xd1\x33\xaa\x89\x9e\x31\x45\x04\x07\x22\x21\x4b\x68\x04\xea\x81\x05\xad\xb9\xc4\xae\xe8\x6a\xf5\x87\x0d\x4b\x2a\x4f\xa9\xa9\xce\xd5\x30\x9b\x51\xb5\x0a\xe2\xd1\xd2\xb7\x6b\xa6\xb3\x17\xce\xdf\xd0\x24\x9b\xd1\x37\xee\x4b\x15\xcd\x20\xa5\x05\x0e\x88\x0c\xf8\xc9\xe8\xe2\xc3\x9f\xae\x97\x7e\x20\x55\xe8\xac\xc5\x7e\xc2\x94\x01\x15\x52\x10\xe2\x49\x08\xee\xdd\x22\x03\xf2\x8f\xb5\xf7\x5c\x67\x10\xfd\x63\xb8\xb2\x72\x31\xfe\x6f\x88\x74\xe9\x6b\x09\xff\x93\x33\x09\x71\x79\x45\x06\x40\x9e\x2c\x2d\x7d\x6d\xe0\x5f\xfa\x2a\x93\x86\x2c\xe8\xd2\x91\xb7\xa3\x44\x17\x2b\xdf\x2f\xbd\x6d\xcf\x80\xc4\xbd\x63\x6c\x48\x22\x28\xc4\x47\x87\x71\x10\x3b\x38\x5a\x3c\x65\xca\x20\x87\x04\x05\xdc\x12\x49\x44\x21\xee\xde\x69\x48\x0c\x00\x40\x2a\x43\x00\xf2\x24\x36\xb4\x73\x0e\x52\x13\x09\x91\x98\x72\xf6\xcf\x30\x9b\x22\x5a\xe0\x63\x12\xaa\x41\x69\x82\xa7\x96\xd3\x84\xcc\x69\x92\x43\x9f\x50\x1e\x93\x94\x2e\x88\x04\x33\x2f\xc9\x79\x69\x06\xbc\x44\x0d\xc9\x3b\x21\x81\x30\x3e\x11\xc7\x64\xa6\x75\xa6\x8e\x8f\x8e\xa6\x4c\x7b\xaa\x1f\x89\x34\xcd\x39\xd3\x8b\x23\x24\xe0\x6c\x9c\x1b\xc2\x79\x14\xc3\x1c\x92\x23\xc5\xa6\x03\x2a\xa3\x19\xd3\x10\xe9\x5c\xc2\x11\xcd\xd8\x00\x17\xcb\x91\xf2\x0f\xd3\xf8\x2b\xe9\x36\x59\xf5\x96\xc0\xb7\x16\x9d\x89\x27\xb0\x0f\xc2\xda\x90\x57\x8b\x49\xf6\x76\xfb\x2e\x05\x48\xcd\x57\x06\x2a\x57\xe7\xd7\x37\xc4\x2f\xc0\x9d\x4b\x84\x70\x71\xa9\x2a\x80\x6d\x00\xc5\xf8\x04\xa4\xbd\x72\x22\x45\x8a\xb3\x00\x8f\x33\xc1\xb8\xc6\x0f\x51\xc2\x80\x6b\xa2\xf2\x71\xca\xb4\x42\x9c\x03\xa5\xcd\x3e\x0c\xc9\x29\x32\x3d\x32\x06\x92\x67\x31\xd5\x10\x0f\xc9\x05\x27\xa7\x34\x85\xe4\x94\x2a\xf8\xe4\xa0\x36\x10\x55\x03\x03\xbe\xed\x81\x5d\xe6\xd9\xab\x37\xac\x9c\x31\x42\x3c\x2f\xdd\xb8\x3b\x1b\xcf\x30\x89\x21\x4a\xa8\xb4\x42\x01\xd1\x90\x24\xe4\xfd\xdb\x77\x64\x26\xee\x0c\x16\x33\xae\x34\x4d\x12\x3c\x05\x8e\x3f\x5b\x72\x1a\x51\x4e\x52\xca\xe9\x14\x08\xcd\x32\x45\x26\x42\x12\x4a\xa6\x6c\x0e\xdc\x9f\xae\xe1\xb6\x8b\xdf\x44\x24\x88\x25\xee\x6b\x19\x94\xff\xd5\x2d\x70\xe9\x97\x4d\x64\xc3\x8c\x15\x19\xe8\x01\xa8\x9d\x14\xd7\x22\x66\x73\x92\x73\xa5\x65\x8e\x9b\x1d\x93\x5b\x58\x38\x24\x4f\x69\x46\x94\x16\xe6\xcb\x3b\xa6\x67\x84\x96\x11\x9c\x6a\xc4\xe2\x31\x10\x05\x9a\x8c\x17\xc4\x88\x71\x48\x10\xb4\x10\x09\x52\x0b\xbc\x17\x09\x83\x04\x2d\x19\xcc\x81\x50\x39\x66\x5a\x52\xb9\x08\xd8\xb0\x0c\xd0\x47\x80\x8a\x2f\x5b\x12\x1e\x36\x83\x84\x3c\x84\x8b\xc4\x92\x5b\x27\xbb\xc4\x41\xb0\xdc\x02\x7a\xa3\x0b\x87\x6f\x85\x38\xaa\x1c\xbe\x81\x22\x06\xaf\x9c\x7c\x10\xe4\x5a\x7c\x92\x43\xac\x98\x08\x19\x30\xc3\x80\xad\x8c\x84\x63\x30\xe4\x44\x52\x6e\x7e\x58\x8b\xdc\x35\xa0\xf5\x10\xda\x98\x21\xee\xf8\x3a\x1c\x2d\xcf\x4d\xa5\xac\x08\x4c\xe5\xc1\x34\xa4\x1b\x66\x7e\x10\x76\xe1\x6b\xb3\xc0\x39\x8b\xc1\x00\x51\x53\x66\x51\xc7\x9c\x56\x3a\x16\xb9\xb6\xb0\x73\x97\xc4\x64\xce\x28\xa1\xd3\xa9\x84\x29\x22\xf0\xc6\xc7\x3e\x02\x13\x3b\x36\x1f\xd0\x62\x0c\xac\x24\xff\xe0\x15\x86\x0c\x3e\x78\x01\x5f\x77\xcc\xcb\x17\xac\x0a\x8b\xd5\xf1\xd8\x1e\xda\x41\x23\x03\x13\x0f\x5a\x21\x1f\xbc\x78\x9b\xbd\xb5\xe3\x91\x1d\xb6\xa3\xba\xcf\x4b\x0b\x71\xbf\x8e\xcd\xf9\x28\x48\xb3\x21\x07\x78\x61\x41\x7c\xc7\x40\x32\x90\x13\x21\x53\x73\x50\x38\xa1\x24\xb2\xf2\x5b\x20\x3c\x48\x1a\x79\xf4\x10\x38\xc9\xb6\xfb\x6f\xc7\x36\x58\x60\xc7\x80\x64\x54\xcf\x1e\xb9\x6c\xbb\xad\xb2\xa3\x0c\xb4\x47\x2f\x7e\x84\x9a\xad\xcc\x5d\x70\x98\xd6\xe7\x36\x60\x68\x7d\x52\xe4\x39\xdb\xcc\x5a\x41\xb5\x2b\x7a\xf7\x0e\x94\x32\x2c\x1b\xa5\x34\x49\xef\x08\xf0\x48\x18\x62\xf1\xff\x5c\xbf\xbf\xb4\xd3\x0e\xc9\x85\x26\x2c\xcd\x12\x48\x8d\x20\x46\xde\x51\xa9\x66\x34\x01\x89\xdc\xe9\x47\x9e\x56\x3e\x3b\x4c\xcc\x15\xc4\x86\x16\xc5\x90\xd0\x85\x9d\x2c\x86\x48\xc4\x86\x46\x0b\x49\x32\x23\xe0\xa6\x59\xae\x81\x50\xfb\x2b\x3e\x97\xf1\xe9\x3a\x22\xdd\x08\x34\xc4\x48\x22\x29\xd5\xc7\x64\xbc\xd0\x8f\xa1\x3e\x21\xf7\x83\x78\x5b\x1a\x50\x5e\xcc\xe3\x94\xc0\x8e\xad\xe8\x41\x79\xe2\x47\xdf\xd2\x08\xa1\x94\x71\x90\x23\x21\xf5\x36\x44\xcb\x28\x1f\x53\x90\x0f\x5e\xe9\x41\xc6\xb8\xfe\xd3\x1f\x1f\xb8\x32\x86\x2c\x11\x0b\x83\x17\x8f\x9f\x95\x2d\xdf\x67\xeb\x73\xbd\xed\x7c\xdb\x9e\xe5\x2d\xe7\xb3\xc6\xa9\x36\x66\x5a\xa7\x40\xd5\x9a\x88\xb7\xf5\x6e\x41\x09\x7c\x32\xe6\x37\xba\xf0\xd6\x86\x2b\x98\x80\x04\x1e\x39\xda\xf4\x43\x3e\x06\xc9\x41\x83\x2a\x09\xd2\x8b\xcc\x51\x1a\x23\x0b\x2e\xb3\xbb\xa7\xe1\x72\x8f\xc8\x33\xfe\xb2\x47\xa4\x1a\x7f\xd9\x63\xb2\x8d\x1d\xbb\xb0\xcd\xc7\x91\xce\x8e\x9d\x68\xec\xe3\x08\x58\x63\xd2\xf9\x7a\x73\x4e\x83\x79\x8d\x4e\xbc\x07\x12\xde\x75\x65\x19\x15\xf9\x6e\xc2\x20\x89\x09\x33\xc2\x9b\x59\x2c\x19\x27\x22\xba\x75\x76\xcb\xab\x33\xa2\x84\x15\xf7\x8c\x84\x6f\x18\x6d\x24\xb8\xca\x53\x20\xec\x31\x0c\xee\x44\xba\x4e\xa4\xeb\x44\xba\xe7\x22\xd2\x59\xff\xc0\x3e\x50\xaa\xa5\x85\x6c\xa4\x55\x78\x5d\x47\xad\x1e\x1a\x1d\xb5\xc2\xd1\x51\xab\x47\xc6\xb3\xa3\x56\x5b\xc9\x69\x8f\xce\xf5\xd8\x41\xee\x8c\xa9\x9d\x31\xb5\x33\xa6\xba\xd1\xf1\x32\x37\x3a\x5e\xd6\xf1\xb2\xce\x98\xfa\xd0\x94\x9d\x31\x75\xc7\x89\x3a\x63\x6a\x67\x4c\xed\x8c\xa9\x9d\x31\xf5\xb1\x97\xe9\x44\xba\x4e\xa4\xeb\x44\xba\x6d\x17\xd3\x19\x53\x3b\x63\xea\x43\xa3\xa3\x56\xa5\xd1\x51\xab\x07\xc6\xcb\xa6\x56\xcd\x8d\xa9\x56\x70\xf7\x72\xfb\x2e\xd1\xb9\xaf\x36\x65\x8c\xad\x0f\xd1\x3d\xbd\x3a\x6b\x2b\x30\x97\xfc\xca\xc9\x45\x98\x95\xa0\x9d\x15\xc3\xfe\x0d\x45\x34\xdf\xbe\xbf\xe3\x10\x63\xca\x56\x9f\x30\x6d\x2e\x30\x28\xcc\x22\xa6\x93\x45\x78\xf0\xf0\xd5\x9a\x37\x7c\x3e\x01\xbe\xa7\x57\x67\xdb\x1b\xa3\xfd\x06\x7c\x0e\xbb\x73\x67\x55\xee\xac\xca\x61\x74\x4c\xbd\xe6\xa4\x1d\x53\x7f\x60\xbc\x6c\xa6\xbe\xef\x56\xd8\xce\x76\x4a\x3a\xdb\xe9\xc3\x97\x75\xb6\xd3\xce\x76\xda\x59\x23\x36\x8c\x4e\x70\xc1\xd1\x09\x2e\x8f\x8c\x67\x27\xb8\x74\xb6\xd3\x8e\x5a\x75\xd4\xaa\xa3\x56\xcf\x83\x5a\x3d\xc7\x40\xd4\xce\xe8\xd7\x19\xfd\x3a\xa3\x5f\xc7\x8d\x3a\x6e\xf4\xc8\x78\x76\xdc\xa8\x33\xfa\xed\x3a\x51\x67\xf4\x5b\x3b\x3a\xa3\xdf\x23\xa3\x33\xfa\x75\x46\xbf\x0d\xa3\x13\x5c\x6a\x4e\xda\x09\x2e\x0f\x8c\x97\x2d\xb8\x74\x46\xbf\x8e\x5a\x75\xd4\xaa\xa3\x56\xcf\x83\x5a\x35\x37\xfa\x3d\x72\x92\x1e\xbe\xf7\xe1\x93\xf2\xe0\xbd\x2c\x7a\xe8\x81\x9b\x20\xfa\x00\x04\x1f\x25\x5c\x8f\x91\xab\x01\x19\x53\x05\x7f\xf9\xf3\x4a\x15\xee\xf2\x25\x29\xc4\x8c\x9a\x47\xad\xbd\xe2\x71\x12\x56\x3c\x62\xf3\x9e\x6d\xb1\xf7\x61\x19\x35\x67\x71\x65\x82\x1f\x0d\x8a\x35\x5b\x1b\x5f\xd8\x8b\xaf\xb5\xa4\x1a\xa6\x8b\x52\x59\x6a\xb4\xc9\x16\x9c\x87\x6f\x28\xa7\x1e\x94\xc6\xbb\x19\x48\xc0\x9b\x7c\x21\x65\xe5\x27\x65\x0a\xa5\x6e\x36\x61\x10\xd7\x28\x55\xfb\xf0\xe6\x0e\xc2\x73\xd6\xfc\xfc\xd8\xa6\xad\xab\x25\xbd\x16\x58\x1e\x40\x67\xd6\x7a\x7d\x16\x12\x5a\x97\x21\x96\x51\x69\x28\xa4\xb7\x72\x23\xd3\x2e\x5d\xbd\x04\xef\x4d\x44\x71\x0b\x4e\xfd\x38\x87\x1e\x94\xf2\x6e\x37\x59\xd6\xb7\x61\xcc\xae\xa3\xc3\x08\x64\xca\x94\xda\x14\x70\x5d\x5d\xfa\x63\x64\x73\x0b\x72\xb9\x01\xfe\xfe\x8d\x4a\xcb\x09\xe2\x13\xee\x80\x1c\xd3\x88\xc8\x3c\x31\xc2\x14\x8f\x89\x2b\xe6\x4c\x68\x14\x89\x9c\x6b\xc2\x01\x62\x6b\xd9\x58\x87\xab\x5b\x10\xdb\x2d\xe4\xa7\x6d\xa5\xa7\x81\x5d\xe7\xa3\x57\xb9\x77\x38\xb1\xaf\xb0\xb6\x3c\x78\x79\x6c\x2f\x6d\xe1\xe3\x1f\xe7\x5a\xbb\xb0\xc2\xad\x19\x61\x65\x7f\x47\x22\x61\xd1\xe2\x2a\x4f\x80\xcc\x44\x12\x2b\x2c\x52\x6f\xb8\x7b\x70\x38\x94\x45\xe4\x0c\xaf\xc6\xd5\xf7\xc9\x38\xd7\x24\x16\xa0\x08\x17\xda\xa7\xb9\x57\x6e\xb7\x2e\xa6\xbb\x99\x6d\x54\x60\x6e\x22\x34\xcb\x12\x06\xe8\x84\x12\x92\xdc\xcd\x58\x34\xb3\xdd\x57\x32\x1a\xc1\xba\xcb\xb6\x97\x5e\xb6\x12\xaf\xc9\x4e\x22\x36\xf1\x36\xab\xf1\x63\xa8\x42\x76\x94\xb5\x89\x2d\x78\xfe\xbd\x14\x79\xb6\xe5\xe5\xab\x96\x45\x7b\xb7\xa1\xf2\x7a\xa9\x1d\x8b\xff\xd1\xb9\x8c\xec\xde\xd8\xcb\x82\x49\x74\x48\xc8\xc5\x84\xa4\x79\xa2\x59\x96\xe0\x2d\x36\x77\x5e\x11\x2a\xa1\xe0\x1b\x7d\x42\xf9\xc2\x7b\xa0\x5c\xd3\x03\x88\x09\x9d\x9a\x19\x35\x76\x3b\xf1\x05\xd6\x79\x9e\x82\x39\xcd\x71\xf1\x10\x54\xa7\xf8\xa2\x98\x9d\xdc\xb1\x24\x31\xf2\x2c\x4d\x12\x71\xb7\x9e\x2d\xad\x1b\xbb\x09\x85\x64\x37\xc1\x90\xec\x2e\x02\x13\xc2\x05\xf7\xa6\xdd\x1f\xaf\xde\xd6\xdb\xc4\xcb\xea\x1c\xae\xb3\x05\x68\x03\xd2\x8c\x4a\xcd\x68\x42\x72\x99\x28\xbb\x8f\xd4\x28\x01\xd2\xb7\x06\x99\x51\xf4\x0c\x46\xa0\x6c\x0f\x0a\xf2\xaf\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x59\x10\x6a\x77\x7e\x92\x27\x49\x9f\x4c\x18\xa7\x86\xec\x42\xe6\x33\x61\x8c\xfe\x44\xae\x19\x8f\xc0\xbc\xd3\x20\x08\x16\xb8\x22\x33\xa3\x39\xdf\xe1\x90\xc6\x7d\xd7\x24\xc3\x6a\xcb\xca\x3d\xc2\x1c\xd8\x88\x8e\x13\xc0\x2e\x0d\x4e\x64\xb9\x12\x09\x9a\xb7\x9d\xe1\x3b\xb6\x9d\x35\x68\xf9\xe7\xff\x64\x1c\x95\x14\x72\x85\x8c\xc3\x28\x3b\xc0\xf4\xcc\xe8\x3e\x59\x96\x2c\x0c\xa1\x30\xb8\x53\x20\xd4\x81\xca\xa3\x99\x79\xa5\x57\x99\x88\xd5\x2b\x43\x46\x5e\x29\x88\x24\x68\xf5\xea\xd0\x7c\x5a\x7e\x07\x7c\xbf\xf2\x7d\x47\x34\x63\xaf\x0e\xfb\x04\x01\x84\x6d\x3b\x84\x9e\x3d\x5f\x3c\xf4\xef\x5a\xe9\x16\xf5\xd8\xa8\x6a\xad\xe5\x19\x5c\x0f\x0a\x91\xd9\x96\x0e\x86\x46\x6b\xc0\x3c\x29\x83\x94\x88\x06\xbe\xd9\xd1\x2a\xb1\x26\xe4\x84\x13\x48\x33\xbd\x40\x2c\x4e\x81\x72\x77\x35\xcc\x41\x2e\xf4\xcc\x68\xab\x4c\x3d\xff\xc3\xbf\xa5\x63\xa9\x18\x6b\x01\xee\x0e\xbc\x07\x6e\x81\xe4\xb6\x4f\xd0\x0a\x70\xfd\x7d\x27\x49\x52\x16\x7f\x29\x7e\xf4\x64\xfd\xd9\xc2\x14\xf9\x6c\x2d\x78\x7e\x30\x77\x56\x61\x69\xbf\xb2\x64\x33\x10\x92\xb7\x6f\x6d\x73\x20\x07\xab\x1f\x18\x8f\xad\xac\x7a\xa2\x6d\xd7\x1d\xb8\x02\xb3\xe0\xc8\xa6\x28\xfa\xd2\x3d\xb1\xa5\x94\x6e\x4b\x86\x04\x27\x5f\xb3\x07\xd8\x7f\xe7\x39\xc2\x7f\x55\xcc\xdd\x56\x34\x7d\x64\xfa\x92\x1e\xb4\x0f\xaa\x0b\xf6\x22\xaa\x48\x43\x86\x9e\xf5\xad\x6b\xca\xe0\x41\x42\xc7\x90\xd8\x46\x43\xe6\xd7\x62\xf9\xe4\xe4\xed\xbb\xd0\x93\x4b\x02\x7d\xc4\xee\xf5\x09\x14\x96\x2d\x1c\xac\x2b\x9d\xcd\x56\xc7\xf6\x32\x2a\x82\x62\x37\xa3\x31\xb9\x06\x6d\x4f\x61\x4a\x33\x73\x08\xed\x1c\x6b\x6d\x9e\x6f\x11\xd2\x8f\x1f\x96\x9d\x64\xfb\xed\x3b\x11\xad\x7b\xc8\x56\x47\x65\x3b\xcf\xf0\x2e\x67\xef\x01\x4b\x48\x31\x2a\x60\x5e\x42\x68\x27\xff\x3b\x89\x3d\x0a\x5d\xe5\x2c\x06\x2b\x9b\x40\x0d\x33\x3a\x67\x42\xfa\xef\x8b\x29\x5a\xde\x82\x5d\x94\x2b\xa3\x5f\x27\x10\x69\xf1\x70\xb1\x33\x7f\xb1\x86\x34\x4b\x1e\x3b\x79\x64\x67\x45\x2c\x65\xfc\x0a\x68\xbc\xb8\x86\x48\xf0\x78\x4b\x02\x5b\xd9\x8f\x77\x8c\xb3\x34\x4f\x09\xcf\xd3\x31\x20\x88\x95\x9d\x0b\x09\x89\x55\x72\x29\xe1\x70\x97\x2c\x1c\xf1\x88\x49\x26\x62\x4f\x4f\xc6\x46\x29\xa3\xf1\x02\xbb\x7a\x61\x59\x50\xbe\x30\x93\x30\x5d\xb0\x20\x49\x22\x49\x95\x11\x9f\xfa\x38\x29\xd3\x86\xa1\x8d\x01\x7d\x50\x2c\x06\xb3\xc7\x74\x4e\x59\x62\x44\xf0\x21\x39\x83\x09\xcd\x13\x6c\x4e\x47\x5e\x93\x03\xf3\x30\xaf\x77\xad\xbb\xc1\x88\xc5\x4a\x18\x8d\x5d\xb9\x5c\x78\x5c\xd0\xe1\x0e\x56\xf5\x6d\xaa\xd6\xf9\xb1\x6d\xf5\x3a\x3f\x32\x9a\xab\x6d\xd5\xf5\xca\xc6\x5c\xf0\xd8\x9c\x87\xb2\xc4\x5a\x22\xe9\x4c\xb9\x99\xb7\x63\xd9\xf6\x3d\xc7\x42\x24\x40\x1f\x0b\x60\x21\x16\x0b\xa7\x12\x94\x3a\x03\x1a\x27\x8c\x43\x7d\xfc\xba\x99\x01\x49\xe9\x3d\xe2\x98\x66\x29\x18\x71\xa4\x8c\x61\xb4\xfc\x56\x5a\x90\x94\xde\x42\x78\x3c\x19\xc3\x04\x9b\x0f\xe2\x0b\x97\x76\xdf\xe2\xcf\x84\xb2\x04\xe2\x21\x3e\xa3\x34\x4b\xd1\xb3\xd7\x22\x8e\xf9\xcc\x78\x0e\xe6\xae\x4c\x0a\x54\x3a\xed\xad\x65\x1e\x8f\x3c\x94\x9a\x8b\x2d\x1d\xf6\x7d\xea\x46\x4b\xa0\x38\xbf\x8f\xac\x31\x50\x02\x55\x78\x99\xc5\x4d\x95\xcb\x89\x51\x31\xbd\x66\x5a\x5a\x90\x6b\x70\x4a\x2e\x85\x76\xed\xee\xc2\x0b\xe2\xdd\xae\xfd\x22\x28\xcd\x52\x3c\x60\x71\x2e\x7d\x33\x48\x84\x19\x5d\xbf\xf5\x95\xa3\xf2\x97\xd7\xaf\xb7\x94\xdf\x3e\x3d\xd2\x4b\x40\x8d\xba\x0e\xbe\x5c\x06\x3a\xe4\xc9\xbf\x51\x95\xcd\x1e\x33\x27\x25\x63\x57\x4b\x90\xe8\x4f\x64\x4a\x33\x3e\xcd\x99\x9a\x91\x31\xe8\x3b\x00\x4e\xe0\xde\x56\xc2\x20\xff\x04\x29\x70\x53\x0d\x78\x0b\x57\x42\x05\x68\x6f\xf6\x07\x62\x73\xa6\x98\xe0\x7f\x67\x4a\x0b\xb9\x78\xcb\x52\xf6\x48\xc1\x4d\x3f\x56\x7b\xfb\x06\x08\x8a\x24\xc6\x8e\xbc\x2c\xa2\xd7\x60\x5f\x58\x02\x5a\x3a\xb5\xb0\x6a\x2c\x31\xe7\x64\x4c\xa3\xdb\x4f\x06\xe0\xd7\xfb\x02\x61\xcf\xae\x6b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\xf7\x16\x3e\x15\x28\xdf\xcd\x84\x02\xbc\xc0\x1a\x23\xf1\x36\xef\x3c\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x64\x52\xbd\xa2\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x9a\x59\x93\x97\x88\x83\x38\xd1\x53\x4e\xec\xdf\x05\xca\x5b\x1b\x9b\x77\x37\x0b\x13\xbb\xce\xf3\x7b\xa3\x5b\x3e\xea\xf5\xa9\x8e\x0a\xc8\x97\xa7\xa9\x2a\xc8\x49\x75\x43\x9c\xdc\x96\xda\xc6\xb8\x37\x68\x28\x2e\xbe\xc1\x5d\x38\xb9\x3c\xdb\xde\x64\x53\x47\xc1\xdd\x59\xc5\x5d\x36\x89\x3f\xf0\x52\xde\xb4\xea\x7e\xa9\xda\xc5\x6d\x43\xe4\x3e\xa1\xe4\x16\x16\xb6\x77\xf2\x4a\x33\x5a\x09\x89\x93\x24\x00\x7b\xb2\x9a\x8b\x5c\x23\xe5\x1d\xd6\xbb\x33\xf6\xd8\xb1\x9b\xcb\xc2\x8f\x81\x59\xe8\x8e\x77\xf8\x97\xde\xe1\xb6\xdd\x11\xdc\x8e\x5b\x58\xec\x76\xc3\xd2\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x45\x10\xf4\xc2\x56\xef\xe6\x4b\x2a\x8f\x9d\x2d\x58\x7e\x78\x20\x36\x7a\xbd\x80\x7e\x65\x2b\x93\x79\xc7\x9e\xb2\xc8\x68\xce\xf4\x8c\x65\xc8\x88\xbc\xd3\xc0\xb7\xf6\xfe\x40\x13\x16\x87\x29\xec\xf9\xbd\xe0\x7d\x23\x3e\x99\x7f\x90\xe8\x5a\x71\xed\x4c\x80\xba\x14\x1a\xbf\xf9\x6c\x00\xb2\xcb\x6c\x04\x1e\x3b\x85\xb3\x56\x23\x95\x41\xc5\xab\xd4\x15\x5c\x0d\x7d\x05\xb0\x00\x4a\xa6\xc8\x05\x27\x42\x7a\x38\x60\x9f\x76\x3b\x91\x9d\x02\xf9\xc4\xd8\x3a\x42\xd0\x8e\xbd\x76\x0e\x07\x3e\x21\x2b\xd0\x7b\x60\x3a\x37\x15\xca\x07\xf6\x17\xdb\x07\x3e\x41\x69\xd7\x89\xaa\xd4\x3b\xc3\x59\x44\x52\x90\x53\xf4\xcc\x44\x5b\x7b\x26\xaa\x9b\xb2\x1b\xdd\xb5\x63\x67\xea\x5b\x7e\xe0\x4e\x58\x80\xac\xc9\x9a\x80\x9a\x30\x37\x3b\x43\xc5\xe4\xf4\xff\x1a\x0a\x8e\x7b\xf0\xff\x91\x8c\x32\xa9\x86\xe4\x84\x28\xc6\xa7\x09\x54\x7e\x73\x1a\x46\x79\x1a\x33\x03\x53\xc4\x90\xda\x39\x4d\x9c\x2e\x45\x39\x01\x6b\xb3\x32\xb3\x2f\xb3\xd4\xbe\x93\x54\x0c\xe5\x09\x0e\xb1\x57\xb7\xb0\x78\xd5\x5f\x41\x9a\x57\x17\xfc\x95\xe5\x2d\x2b\x68\x12\x18\x11\xfa\xd2\x5e\xe1\x6f\xaf\xda\xe4\xc2\x3b\x32\x9c\xba\x76\xb4\xea\x43\xb7\xc6\x08\x1f\x03\x52\x53\x58\xaf\x68\x89\x2e\xf2\x49\x0b\x92\x2b\xb0\xd2\x3a\x9e\x32\x02\x5e\xce\x44\xa9\x12\x15\x53\x0e\x77\x28\x3d\xee\x8d\xe0\x67\x34\x09\xc6\xa7\x3f\x66\x31\xd5\x5b\x05\x9f\xda\x51\x81\x48\xef\xca\x4e\x42\x72\x9c\xc5\xe0\xd6\x84\x4d\x49\x46\x25\x4d\xd5\x90\x8c\x5c\x15\x44\xc4\x34\x36\x29\xdb\x12\x1d\xec\x6e\x16\x19\x90\xff\x9b\x5c\x95\xd7\x32\x24\x83\xc1\x80\xdc\xbc\x3f\x7b\x7f\x4c\xec\x37\x56\xca\xd6\x82\x4c\x04\x2a\x41\x22\x97\xe6\x51\x73\xe0\xa8\xf8\x1b\xf9\x5e\x70\x78\x3f\x31\x27\x84\x6a\x98\x83\x24\x77\x66\xab\x22\x16\x43\xb0\x5e\x0d\x7b\x9f\x16\x8f\xeb\x49\x26\x29\xbd\xbf\xce\xe5\x74\x87\x0d\x20\x2b\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\x8b\x57\x45\x33\x88\xf3\x04\x62\x42\xc7\x62\x0e\x15\x93\x6d\xf5\x36\x64\xe9\x39\xf8\x1b\x0d\xcf\x1b\x2b\x91\xe4\x3a\x28\xab\x07\x70\x7f\x4c\xfe\x0d\x5d\xe0\x94\x64\x20\x23\xe0\x9a\x4e\x61\xd9\x0c\x60\xaf\x7b\xf3\xfa\x5f\x0e\x1d\x3f\x32\x33\x3a\xeb\xc9\x6b\x83\x11\xef\xe8\xfd\x8f\xbc\x30\x0d\x32\x45\x5e\x0f\xc9\xc9\xd2\xc3\xf0\xbe\x24\xca\x13\xb4\xb5\xa0\x5b\xbf\xf4\xc8\xf1\x82\x48\x91\xa3\x63\x9f\xe4\x59\x55\x9b\xfd\xe3\xbf\xfd\x8b\x51\xfa\x68\x9a\x25\x70\x4c\xee\x66\xe0\x5c\x6b\x4c\xa1\x0c\xa3\x05\xf9\xd3\xeb\x7f\xb1\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x6c\x42\xb2\xf0\x13\x81\x3f\x43\x1e\xfd\x95\xa6\x52\xab\x3e\x41\xef\x7f\x10\x0e\xb5\xd0\x34\x59\xd2\xf2\x51\x0b\x87\x3b\x0b\xa4\x58\x20\x4c\x00\x0d\x55\xe4\xcd\x9f\x5e\xff\xcb\xaa\x39\xe5\x3d\x8f\x00\xef\xc4\x3b\x30\x1c\x63\x6c\x94\xfb\x5b\x96\x24\x10\xf7\x1f\x5d\xfe\x24\x97\x7a\x06\xb2\x4f\x80\x2b\x6f\xac\x32\xeb\x5b\x5a\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x65\x0d\x23\xd4\x24\x15\x4a\xaf\x5f\xf2\xf6\xc7\xcd\x0c\xca\x17\xef\x27\xbb\x8a\x03\x83\x1a\x66\x88\xd5\xbb\x6b\x88\x94\xf7\x83\xdb\x90\x51\x39\x60\x5c\x0f\x84\x1c\xd8\x69\x8e\x89\x96\xf9\xe3\x5e\x83\x62\xa4\x95\x13\xf0\x19\xc8\x40\x5e\x3a\x6f\x2b\xbb\xfa\x49\x4e\x7e\xfd\xf3\x1c\x8b\x3b\xbe\x99\x72\x20\xe1\x74\x34\xa3\xe6\xa9\xaf\x5a\xdc\x96\x8e\x8d\x79\xba\xb9\xfa\xff\x5a\xc5\xee\x1d\xc8\x81\x3b\xbb\xe1\xb4\x1b\xb9\x0a\x3d\x1e\xfd\x2d\x9e\x1e\x8e\xad\xe5\x7c\xd6\xe6\x64\x2e\xb0\x8f\x59\x43\xb9\x56\x4e\xf8\x1a\x0a\x64\xd7\x51\x38\x64\x34\x46\x14\x98\x73\xae\x36\x1e\xf4\x04\xa8\xd2\xeb\x40\xd1\x1d\xf4\xc7\xc7\xc3\x81\xfe\xcb\xa3\x2a\x74\x1a\x09\x09\x41\x5e\xd8\x18\x4f\x2d\xa2\xbc\xba\x02\xeb\xe1\xb3\x81\x69\x15\x21\xea\x55\x38\x12\x66\xff\xaa\xf2\xd5\xa7\x8a\xaa\xf1\x46\xce\x3a\xa2\xb5\xbb\xb5\x14\x00\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8d\x14\x9d\x82\xa6\x0f\x27\x83\x2c\x8f\x2a\xd1\xbe\xd6\x94\xc7\x54\xc6\x6e\x95\xbd\x9e\x0a\x53\x0e\xc9\x3b\xf4\xa5\xf1\x89\x38\x26\x33\xad\x33\x75\x7c\x74\x34\x65\x7a\x78\xfb\xef\x6a\xc8\xc4\x51\x24\xd2\x34\xe7\x4c\x2f\x8e\xd0\x81\xc6\xc6\xb9\x16\x52\x1d\xc5\x30\x87\xe4\x48\xb1\xe9\x80\xca\x68\xc6\x34\x44\x3a\x97\x70\x44\x33\x36\x28\x64\x66\x35\x4c\xe3\xaf\xfc\x83\x3e\xb1\x60\x5c\x39\x43\x68\x5d\x92\x73\x18\xe4\xfc\x96\x8b\x3b\x3e\x40\x4d\x56\xed\x74\x9a\xb6\x8b\x62\xf0\x63\x09\xde\xbb\x04\x2e\x64\x22\xfe\xe4\x9b\x60\x5e\x66\x40\x79\x3c\xb0\x4e\xc7\x4f\xbc\x17\x75\x6c\xbb\x83\x22\x30\x60\x9b\xc8\x74\x3b\xea\x69\x43\x34\xd2\x6c\x0e\xb5\x9c\xd8\x7e\x54\xb6\xfb\xbd\x0f\x2c\x8d\x73\x69\x77\xbc\xe4\xcd\xf6\xbe\x99\x94\x2e\x50\xd6\xc1\x67\x13\x61\x59\x39\x17\x31\x38\xcb\xe7\x1c\x55\xfb\x6b\xc3\xcc\x6f\x8c\x28\xec\x7c\xdc\x68\xf7\x5d\x28\x0d\xa9\x25\x4e\xf6\xfe\x64\x41\xb4\x5c\x58\xc7\xb8\xbc\x35\xca\xa7\xf3\x5c\x1b\x89\xff\x16\xaf\x53\x4a\x44\x0c\x45\x9f\x02\xae\x5e\xee\xf2\x36\x3c\x4a\x32\xa1\x18\x3e\xdb\xf1\xbc\xdd\x2c\x73\xf5\xd9\x65\xc9\x4d\xf7\x97\x3f\xef\xb2\x75\x13\x6c\xb7\xb0\xa3\x95\xbd\x1a\x41\x31\x29\x67\x02\xb8\xed\xe9\x29\xaf\xb8\x1a\xb1\x24\x12\x5c\x69\x49\xd9\xe6\x5c\xa7\xf5\xa3\xa6\x2b\xa4\xbe\xbf\x81\x20\x06\x9d\xd4\x02\x0a\x59\x8d\xc1\xf2\x4c\x11\xd1\xd2\x83\xba\x0c\x18\x9b\x0a\xe5\x63\x09\x0d\xe1\xaa\x69\x5a\xad\x01\x23\xd2\x08\x4e\xf6\x6e\x98\x80\x94\x10\x9f\xa1\xf4\x79\x1d\xde\xeb\x62\xca\x45\xf8\xfa\xfc\x1e\xa2\x7c\xdb\x8c\xf1\xd5\xb1\x62\xcb\xf3\x06\x11\x17\x76\x62\x17\x61\x8e\xae\xff\xc1\xc9\x1f\x02\xc1\xee\x04\x11\x45\x35\x53\x13\x9b\x57\x16\x36\x02\x4a\x8e\xcf\x80\xc2\xc1\x3d\x8c\x2c\xce\xa6\x48\x30\x8d\xe4\x26\x9a\x09\xa1\xcc\x29\xc7\xfd\xc4\x79\xe7\x4c\x58\x9f\x1f\x26\xb9\x48\x92\x1a\x1a\xe3\x93\x5d\x8a\xe9\xad\xa1\xb6\xb8\x8d\x29\xab\x82\x07\x08\x7a\x2f\x95\x99\x06\x0d\x8f\xe6\xc3\x14\xa5\x26\xa5\x89\xca\x53\x33\xe9\x1d\xb0\xe9\x4c\xab\x3e\x61\x43\x18\x22\xd6\x00\x8d\x66\xa5\x69\x53\x00\x5d\xe9\x96\x52\x46\xb5\xb2\x95\xf8\x20\x64\x3f\xb8\x74\x9d\x7e\xe0\x31\xcb\x7b\xb9\x16\x5c\x7d\x02\x3a\x1a\x1e\xf6\x49\x91\x50\x6e\xd6\x38\x5e\x10\xa6\xc1\xd0\x6c\xd4\x45\xa4\xc8\xa7\xf6\x4d\xc0\xc7\x74\xe2\xba\x42\x6a\x08\x7a\x51\x63\xd4\x19\x5f\xd9\x97\x7b\x65\xf6\x0d\x57\x9e\xa7\x46\x5f\x0c\x44\x1d\xcd\xea\x4e\xbe\x8c\x84\x94\xa0\x32\x61\xb5\xcd\x65\x83\xfb\xff\x0e\x37\x1d\xa8\xc3\x02\x98\x33\x36\x9d\x79\x58\x52\xc7\x08\xaa\x7b\xb0\xfb\xd9\x23\x8d\x7c\x29\x76\xd4\xf4\xa8\xd8\x51\xf5\x6d\xfb\xbc\x8a\x02\xab\x4a\xfb\xaf\x41\xa6\x01\x8a\x88\x22\x48\x32\x9c\x9d\xdb\x37\xb6\x71\x38\x46\x5e\x93\x03\x44\x32\xa6\x7b\x0a\x11\x7e\x20\xb2\xc3\x21\x39\x21\x3c\x0f\x67\xee\xa1\x07\x70\x11\xe6\x77\x13\x99\x87\x2a\x51\xcc\x55\xf3\x8d\x1b\x91\x3b\x3b\xea\x79\xca\xcb\x63\xe0\x20\x00\x8f\x97\x4f\x7c\x68\x12\x0b\xeb\x9a\x13\x34\x23\xdd\x7e\x0e\xff\x16\xf5\xe7\x58\x09\xb0\xc0\xe3\x5a\x44\x51\x80\x4c\xfb\x65\xe9\x29\x1c\xc8\xea\x29\xb6\xb0\xa8\x8b\x15\xa4\x1d\xcc\x20\x2d\xc1\x95\x34\x8a\xd0\x59\x3f\x96\xc3\x58\x7c\xb6\x55\x05\xda\x15\x22\x3f\x5e\xe0\xaf\x3b\x06\x2f\x6d\x1e\x4d\x29\x5d\x31\x1a\xd1\xbc\x62\x3c\x88\x78\xfb\x17\xd8\xb3\x7e\xb4\x84\xb6\x76\x34\x27\x6d\xc5\xd8\x3d\x34\x68\xd3\x3c\x35\x02\x86\xd6\x8f\xb6\xce\xa6\x1d\x35\x82\x8b\xd6\x8f\x15\x11\xf5\xd3\xc4\x1a\xad\x1f\xb5\x8d\xa4\xeb\x47\xdd\xb8\xa4\xf5\x63\x29\xa5\xf1\x13\x05\x29\xf5\xab\x11\x4a\xe4\x7b\x6d\xcf\xf1\xdb\x46\xfc\xa4\x18\x2d\x83\xb8\x5e\x64\xd3\xfa\xb1\x2c\x00\x3e\x93\x28\xa7\x35\x53\x7d\xaf\xcd\x34\x6f\x37\xde\x6c\x73\xd9\x7d\x9c\x8e\x53\x28\xfa\x2e\x75\xc6\xdb\x99\x31\xa2\x3a\x93\x80\xe5\x07\x30\xec\xcb\xdb\x61\x3e\x4f\x60\xd5\xfa\xd1\x1e\xe3\xb4\xa3\x25\xf6\x69\x47\x6b\xc8\x8d\x02\xcf\x77\xd6\x2e\xfc\x84\xb2\x8e\xb5\x4c\x77\xb2\x4e\x27\xeb\xec\x30\x3a\x59\x67\xdb\xd1\xc9\x3a\x9b\x46\x27\xeb\xac\x19\x9d\xac\xd3\xc9\x3a\x8d\xc6\xfe\xc9\x3a\xd6\x52\xd5\x9a\xc1\xec\x27\x6b\x70\x5d\xb6\x90\xa1\x34\xe5\x43\x7a\xaa\xa6\x32\xc3\xfb\xaf\x1d\x89\xbd\x41\xf3\x9a\x8b\x54\x97\x94\x4f\x81\xbc\x19\xbc\x79\xbd\x65\x3a\xe0\xfa\xd1\x24\x68\xa7\x3c\x76\x4d\x1d\x5c\x1e\x9b\x3c\x12\x9f\xcc\xbb\xe4\x4e\x6a\x70\x78\x54\x24\xcc\x0d\x0e\xa2\x50\xfd\x2a\x05\x4d\xa8\xae\x18\xc4\x59\x0a\xc1\x21\x5a\x49\x41\x2e\x62\x7a\x05\x77\xfe\x0e\xb3\xa9\xc3\x7a\x2b\x88\x80\xda\x38\xf6\x31\x84\x55\x88\x14\x6c\x82\xa9\x3f\xf4\x66\x09\xe0\x61\x45\x0e\x60\x38\x1d\x92\xd8\x26\x6b\x53\xee\x62\xc6\x0e\xfb\x65\xf7\x78\x6a\x88\xab\xc4\x7f\xcc\xb2\x9d\x7f\x1c\xe6\xc0\x75\x4e\x93\x64\x41\x60\xce\x22\x1d\xde\x0f\x03\x02\x99\xb6\xce\xce\x26\xae\x94\x06\xe2\x61\x53\x91\x70\xb0\x72\xb6\x76\xf3\x57\xfb\xd1\x5c\x76\x5b\x59\x47\x7d\x7a\xb3\x24\x97\x58\x08\x0d\x37\xaa\x55\xda\x3c\xcd\xfa\x2b\xf1\x4f\x44\xf0\xf7\x57\x75\xdd\x63\xa4\x25\x9e\xd0\x98\x0f\x2c\x2b\x50\x79\x92\x18\xf4\xb6\x1e\xb3\x55\x10\xac\xf1\x64\xad\xc9\xb6\xb1\x6e\xd6\xb4\x94\x75\x83\xd7\xdc\x88\x4c\x24\x62\xba\x28\xef\xa0\xed\xdc\x52\x2a\x6f\x43\x89\xca\xc7\x4e\x04\x34\x87\xe8\x72\x69\xcb\x3b\x5f\xc8\xc6\xd1\xf9\x42\x56\x46\x67\x1f\x58\x1e\x9d\x7d\x60\x87\xd1\xd9\x07\xd6\x8c\xce\x3e\xb0\x3a\x3a\xfb\x40\x67\x1f\x68\x32\x5e\xbe\x7d\x80\x74\xbe\x90\x4d\xa3\x93\x75\x8a\xd1\xc9\x3a\xdb\x8f\x4e\xd6\x59\x1d\x9d\xac\xd3\xc9\x3a\x9d\xac\xd3\xc9\x3a\x75\x47\x03\xe4\xce\x44\xdc\x7a\x8a\x4c\x26\xe2\x07\x32\x64\xac\xbd\x3a\x12\x83\x44\x44\xa1\xb2\x88\xb9\xc5\x79\x3e\x14\x4d\xad\x09\xbd\x4f\xfe\x29\x38\xd8\xf4\x04\x5b\xb2\x36\x05\x22\xb0\x59\x44\x26\xe2\x03\x75\x58\x23\xf0\xbc\xcb\xb0\xe9\x32\x6c\xbe\x80\x0c\x9b\x19\x55\xae\xf0\x11\x92\xd6\xcd\x09\x37\xa5\xe3\x7f\x03\x32\xfd\x62\xf3\x6d\x0c\xc2\x39\x84\xc1\x5e\x72\x05\x52\x58\xd8\xc5\xce\xb7\x0b\xf1\xa8\x0a\x31\xa7\x97\xd9\x56\x3c\x71\x0c\x31\xc9\x40\x0e\x2c\x92\x09\x32\x61\xae\xfe\xd7\x12\xfe\x3a\x08\x3f\xf3\xbc\x99\x2a\x24\x9e\x75\xf2\x4c\xf5\x55\x5a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xec\x52\x69\xda\xd1\x4a\x07\x44\x3b\x77\xda\x0f\x8d\xf4\xd2\xb6\x94\x48\x54\xf2\xae\x77\x2a\x73\xbc\x79\xac\x2d\x4e\xfb\x3f\x39\xc8\x05\x11\x73\x90\x85\x62\x14\x9a\xf7\xf4\x43\xa7\x99\x88\xba\x02\xc8\xed\x18\x78\x5a\x31\x45\xb4\xa9\xa9\xb7\xed\x35\x24\x7b\x56\xfd\x78\xf3\x68\x57\x71\x68\x51\x6d\x78\x6e\xb5\x94\x37\x8f\x56\xcd\x6f\xa4\x65\x13\x1c\x69\xd1\x0c\x47\xda\x35\xc5\x91\xd6\xcd\x71\xa4\x4d\x93\x1c\xf9\xec\x15\xa0\x37\x8f\x96\xcd\x47\xa4\x75\x2b\x1d\x79\x86\xf5\xa4\x37\x8f\x4f\x00\xee\x36\x2d\x76\xa4\xab\x4e\xdd\x78\xb4\x6d\x50\x23\x6d\x1b\xd5\x48\xdb\x78\x58\xab\x0a\xf6\xe6\xd1\xd5\xc7\xfe\x04\x72\x5a\x6b\x42\x44\xd3\x9a\xda\x8f\x2d\xb4\x05\x9c\x0c\x3d\x7e\xdb\xf5\x6b\x17\xd3\x06\x33\xa1\x5a\x6e\xfd\x5d\x62\xe2\xd7\xab\x6c\x9b\x1c\x84\xda\x26\xb6\xed\xf4\xe1\xff\x5e\x8a\xf1\x44\xb9\xde\xb6\x9b\x7d\xe5\xed\xc7\x3d\x55\xcc\xff\xea\xa5\xb9\xc9\x5b\xdb\xf4\x92\xfe\xdd\xea\xae\xdf\x78\x2b\x7e\xd1\xe5\x2e\x98\xf8\x63\x72\xe0\x0d\x1f\xae\x65\xb3\xae\xfe\xc8\x35\x1b\x14\x57\x04\x53\x08\x5a\x30\x2b\xc9\x13\x55\x8c\xf1\x0e\x83\x60\x8c\x2e\xf0\xcb\x50\x22\x90\x95\x35\x60\x97\xa0\x09\xf6\x77\xa5\x45\x85\x65\xc1\xbd\x85\xda\x92\x2e\x24\x36\xde\xf6\x67\xa5\x4c\x5c\x0f\x8a\x9a\x05\xec\x4a\x26\x55\x8a\xa4\x90\x72\x17\x79\x2c\xb8\x6f\x01\x68\xdb\xfa\x15\xa2\x69\x28\x5c\x1b\x9e\x3e\x24\xe7\x88\xce\xe5\x89\x99\x6d\xb0\xbf\x63\xcb\xe4\x8d\xdb\xbd\x87\x59\x32\x77\x3b\x67\xc9\x2c\x99\xe7\xba\x24\x99\x2e\x49\xa6\x51\x92\x0c\xfe\x68\x0f\x77\xeb\xd9\x32\xe4\x27\x57\x8b\x5a\x02\x82\x2a\xcd\x13\xcd\xb2\xc2\xdd\xad\xec\xa3\x12\x2b\xb4\x4f\x9c\xdb\xad\x8a\xef\xe6\x69\x34\x9a\x2d\xe3\x3d\xce\x87\xee\x71\x85\xe4\xc4\xb9\xb6\xb0\x72\x34\xa6\x77\x78\x09\xdf\xfa\xef\xd8\xf3\x77\xcb\x9c\x21\xc1\x56\x85\x82\x6a\x0b\x9b\x1b\x3a\x9f\x18\x94\x30\x14\xfb\x01\x06\x51\xae\x1e\x8a\x2e\x42\x36\x07\x5e\x70\x89\x03\x75\x78\xe8\xed\x07\xad\x72\xaf\x4f\xc2\x7d\xfe\x56\xe2\x12\xff\xb1\x0d\xff\xc1\x17\x0a\x1c\xa8\x00\x5f\xc1\x7f\x9e\xb7\xff\xa9\xb9\x2b\xa1\x0d\xe3\x57\x6b\x2e\x84\x27\x77\x1f\x7c\x49\x89\x46\x7b\xe9\x2e\xd8\x3b\xad\xe3\x65\xb8\x08\xba\xe8\xdc\xed\xc7\x73\x88\xce\x7d\x22\x37\xc0\xf3\x09\xd2\x7d\xb6\xa6\xff\xe7\x12\xa4\xdb\x99\xfb\x77\x1a\x2f\x35\x76\xb6\x3a\x5a\x34\xef\x77\xa6\xfd\x96\x65\xaa\x56\x98\xff\xa7\x31\xe9\xb7\x82\x7f\xed\x98\xf2\x5f\x94\x19\xbf\x1d\xa2\xd3\x02\xa9\x69\x65\x83\x5b\x32\xdb\x77\x26\xfb\xfd\x36\xd9\x37\x4c\xe4\xe0\x9a\x7d\x9a\x64\x8e\xf2\x6e\x6f\xca\xe8\xa0\x73\xc1\x62\x92\xe5\xda\xc5\xb3\x77\x59\x1d\xfb\x9c\xd5\x51\xd9\xd1\x2e\xb5\x63\xab\xd4\x8e\x4d\x30\xeb\xf2\x3b\x36\x8c\xfd\x71\x24\x74\xf9\x1d\xbb\x8e\x2e\xbf\x63\xfd\xe8\xf2\x3b\x1e\x18\x5d\x7e\x47\x97\xdf\xd1\xe5\x77\x34\x18\x5d\x7e\xc7\x9a\xd1\xe5\x77\xd4\x1f\x5d\x7e\xc7\x56\xa3\xcb\xef\xe8\xf2\x3b\xaa\xa3\x73\xf8\x34\x1b\x5d\x7e\x47\xc3\xd1\x39\x81\xba\xfc\x8e\x2e\xbf\xa3\xcb\xef\xd8\x71\xa2\x2e\xbf\xe3\x4b\x71\x16\x91\x2e\xbf\x63\xbb\xf1\xc5\xe7\x77\x54\x1c\x17\x4f\x97\xe4\xb1\xfb\x32\xba\x4c\x8f\x2e\xd3\xa3\xcb\xf4\xe8\x32\x3d\xba\x4c\x8f\x2e\xd3\x63\xfb\xb1\xff\x8e\x83\xbd\xd3\x3f\x5e\x86\xb3\xa0\xcb\xf4\xd8\x7e\x74\x99\x1e\x1b\x47\x97\xe9\xd1\x65\x7a\x74\x86\xff\x3a\xa3\xcb\xf4\xd8\x71\x74\x46\xfe\x2e\xd3\x63\xa7\xd1\x65\x7a\xac\x8c\x2e\xd3\x63\xcd\xe8\x8c\xf7\xfb\x6d\xbc\xaf\x89\x2b\x34\xd7\x22\x15\x39\xd7\xd7\x20\xe7\x2c\x82\x93\x28\x32\x9f\x6e\xc4\x2d\xec\x68\x30\xae\x6a\x7c\x0f\x4c\x4b\x18\x8f\x59\x84\x3a\xdb\xdd\x0c\x30\x51\xc3\x88\x92\x78\x1d\xa1\xf6\x42\xa2\xf1\xca\x02\xbd\x70\x9d\x54\xb3\x08\xad\xa8\x38\xf5\xae\xf0\xb2\x10\x1a\x0b\x91\x00\xe5\x3b\xdc\xe9\x18\x0f\xc8\x1d\x4f\x73\x05\x20\x6f\x9d\x7d\xa0\x98\x8c\x8c\x21\x11\x7c\xea\x8c\xb6\xee\x04\x0c\xc9\x69\x71\x41\x44\x39\x1e\x9e\x5c\x4a\xe0\x3a\x59\x20\x1c\x30\x64\x1c\x05\xf4\x54\xcc\x5d\x4f\x61\xb4\x15\x5b\x91\x8d\x6a\x92\x00\x35\xcf\xe2\x50\x3c\xcc\x1c\x1e\x4a\x46\x38\xbf\x9d\x74\x0c\xce\x7e\x5d\x0b\x88\xbb\xd3\xc6\x5a\xd4\x70\xc9\x88\xe0\x24\x14\x64\x13\x11\xaa\x22\xa5\x37\xc4\xa3\xb9\x10\x39\xb9\xa3\x56\x28\x91\x39\xc7\xc3\x8c\xaf\x6e\x40\xbb\xe3\xc3\x1b\xb0\xff\xfa\x9a\xfe\x00\xa9\xda\xae\x99\x5a\x0d\x64\x0a\x2a\xa7\xb5\x98\x54\x65\x6b\x7a\x27\x72\x9a\x5b\xe9\xcb\xa1\x32\x70\x2d\x17\xe8\x54\xb1\x12\x5a\x2c\xa2\x5b\x83\x86\x29\x9d\x42\xaf\xa7\xc8\xe9\xbb\x33\x43\xfb\x72\x65\x48\xb5\x4b\x5a\x71\xb4\x30\x93\x62\xce\x62\x83\xd9\x1f\xa8\x64\x74\x9c\x18\xf9\x6e\x02\x12\xb8\x91\x1a\xbe\x3e\xf8\x70\x72\xf5\xfb\xe5\xc9\xbb\xf3\x43\x94\xf4\xe0\x3e\xa3\xdc\x1c\x89\x5c\x15\xae\x40\x87\x13\xe6\x41\xc0\xe7\x4c\x0a\x6e\x16\x87\x3a\x11\x25\x73\x3f\x6b\x14\x4e\x82\x04\x25\x92\x39\xc4\x56\x1e\x0d\x4f\xf3\x2c\x87\xf1\x2c\xd7\x5e\x47\xf3\x5d\xa5\x72\x1e\xcd\x28\x9f\xfa\xae\xde\xe5\x75\xa9\x05\xd7\xf4\xde\xcc\x8f\x4a\x94\x8a\x68\xe6\x7d\x96\x94\xc4\x22\x37\x0f\xff\xfa\xeb\x3e\x61\x70\x4c\xbe\x2e\xdd\x38\x24\xe7\xee\xda\xd2\x0b\x5b\x87\x18\xcc\x41\xe2\x64\xee\x75\xfb\x44\xc2\x94\xca\x38\x01\x85\xae\x20\x4f\x48\xad\xd4\xec\x5e\x10\x82\xbe\xc7\x85\x5e\x77\xf2\xc9\x3b\x81\x6e\xa1\x89\x38\x26\x33\xad\x33\x75\x7c\x74\x74\x9b\x8f\x41\x72\xd0\xa0\x86\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x5b\x75\xc4\xb8\x39\x09\x83\x98\x6a\x3a\x28\x1d\xc1\x23\xcb\x66\x07\x91\x48\x53\xca\xe3\x01\x75\xa8\x30\x08\xdb\x70\xf4\x95\x63\x80\x03\x1a\xae\x62\x7c\x40\x07\x6a\x06\x49\xd2\xab\x81\x7c\xcd\x04\xb4\x06\x82\x59\x23\x81\xcc\xbd\x7b\xf3\xd3\x76\x1e\x0e\x97\x85\xc1\x90\x5c\x0a\xed\x3c\x96\x0e\xd1\x90\xe8\x21\x7c\xd7\x9f\xbf\xf3\xcb\x9b\xab\x9f\x47\xef\x2f\x2e\x6f\xba\x63\xd8\x1d\xc3\x2f\xea\x18\x02\x9f\x37\x3e\x82\x5e\x9a\x2b\xa1\x75\xd8\x6f\xe4\x81\x0a\xb4\x47\xdb\xb0\x01\x8d\x65\x2f\x3b\x9e\x0c\xea\x15\x08\x9c\xf3\xf9\x07\x5a\x35\x13\xf3\xb5\xe0\x20\xee\x02\x2b\x82\x06\xe9\xb6\x49\x78\x41\x03\x93\x4c\x53\x1f\x4c\x2d\xf9\xcc\x8e\xe6\xfe\x11\xf3\xe8\xfa\x2a\x7c\x65\xfb\x2e\x69\x5a\x64\x53\xaf\xd9\xb5\x21\x79\xe7\x15\x0a\x72\xfa\xfb\xc5\xd9\xf9\xe5\xcd\xc5\x77\x17\xe7\x57\xf5\x35\xd4\x16\x6c\x19\xa8\xad\xb7\x04\x80\x5e\x4d\xae\x96\x49\x98\x33\x91\x17\xd6\x85\xf5\x24\x60\xf9\xec\x3b\xd7\xe5\x22\xe8\xb9\x6b\x6f\xfb\xd2\x59\xe3\x19\x4c\x68\x9e\x58\x2d\xe2\xd5\xab\x61\x1d\x9e\x64\x47\x5b\xc8\xf6\x9d\x14\x0d\x72\x7b\x2b\x08\x77\x6d\xab\x02\x4c\x84\xdc\x78\xe8\x7a\xce\xe1\x5d\x61\x14\x4e\x34\xb3\x96\x2a\x27\x9b\x59\xbf\x4c\x43\xe8\x34\x34\x6c\xb7\xe3\xee\x8d\x04\x9f\xb0\xe9\x3b\x9a\xfd\x00\x8b\x2b\x98\x34\x33\x97\x56\xe1\x8d\x56\x38\xe7\xbd\x44\x9b\x9d\x61\x3e\xf6\x61\xcd\x3c\x03\xad\xf9\x05\xda\x0a\x08\x68\x1e\x0c\xd0\x9e\xef\xbe\x15\xbf\xfd\x4a\xa5\x05\x6b\x8f\x75\x96\xd5\xb6\xc2\x3a\x5a\x71\x16\x37\xe3\xc9\x7e\x54\x59\x53\x99\x39\x3b\x3a\xab\xb7\x55\x12\x22\xc1\x23\xc8\xb4\x3a\x12\x73\xc3\x69\xe0\xee\xe8\x4e\xc8\x5b\x23\xf5\x1b\xea\x3e\xb0\x58\xab\x8e\xd0\x76\x7e\xf4\x15\xfe\x43\x6e\xde\x9f\xbd\x3f\x26\x27\x71\xec\xca\xe6\xe4\x0a\x26\x79\xe2\x0a\x55\x0c\x09\xcd\xd8\x07\x90\x8a\x09\xde\x27\xb7\x8c\xc7\x7d\x92\xb3\xf8\xdb\xfa\xc4\xd9\x8f\x16\x77\x41\x64\xd6\xbb\xd6\xf2\x4e\x5c\xa3\xaf\x61\x51\xe1\x5d\x81\x88\x18\xae\xc5\xb4\x42\xdc\xf4\xd6\x57\x27\x14\xb4\x04\x9a\xdd\x4d\xd5\xcb\x03\xb7\xb0\x5d\xba\xda\x2b\x08\xab\x75\xe6\x3a\x44\xcd\x44\x7c\x4c\x54\x9e\x65\x42\x6a\x45\x52\xd0\xd4\xa8\xa8\x43\x83\x61\xfd\xea\x47\xf4\xd9\xf4\xc9\x3f\xc2\x97\xe8\x78\x51\xbf\xf4\x7a\x7f\xfb\xe1\xfc\xe7\xff\xe8\xf5\x7e\xfb\x47\xf9\x57\x64\x85\x36\xf0\xa4\x7a\x89\xca\x20\x1a\x72\x11\xc3\x25\x3e\x03\x3f\xaa\x8a\xbb\xc1\xfd\xa0\xa9\xce\xd5\x70\x26\x94\xbe\x18\x85\x8f\x99\x88\x97\x3f\xa9\x06\x12\x07\xd9\x4f\xc6\x80\x5b\x34\xa2\x7a\xb6\x27\xec\xa1\xa0\x25\x2d\x1f\x55\x37\x6b\xb9\x3c\x53\x4a\xf1\xcf\xef\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x82\x72\x71\xef\x62\xd2\x37\xa7\xb6\x10\x3b\xe7\x6f\x5e\xed\x15\x83\x09\x3b\xd8\x32\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\xbb\xea\x6a\x3d\x19\x5d\x90\xb9\x85\xf0\xde\x00\xc7\xc7\x32\x7f\xf7\x49\x69\x5c\x28\xe7\xe5\x40\x15\x34\xba\x63\x1b\x87\x12\x22\xaa\x49\xc2\x52\xe6\xc2\xdb\x5c\xe9\x2f\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x11\xb2\x19\xa4\x20\x69\x32\x50\x5a\x48\x3a\x85\x7e\xb8\xdd\xde\x16\x3e\xd9\x1b\x2b\x0f\x58\xbd\xdb\x2a\xae\x85\xcb\xd0\x51\x64\x88\x5f\x1e\x6d\xf3\xa0\xdf\x13\xd2\x16\x30\xe3\xf2\x13\x88\x84\xc1\x6e\x66\x05\xce\x00\x45\xd4\x27\xe7\x22\xc9\x53\x50\xfd\x20\x06\xd9\x0a\x76\x7c\x6e\x34\x4b\xb5\x57\x82\x5a\xcc\xe6\x4c\xb5\x11\xb9\xba\x46\x4e\x63\x2e\xa8\x48\xe4\x3a\xcb\xb5\x4b\xae\x2b\x95\x0c\x14\x0a\xed\x16\x21\x03\xa2\x42\xf6\xdf\x34\xcd\x00\x26\x24\xa3\x5a\x83\xe4\xc7\xe4\xbf\x0e\x7e\xfd\xe6\xe3\xe0\xf0\xdb\x83\x83\x5f\x5e\x0f\xfe\xfa\xdb\x37\x07\xbf\x0e\xf1\x8f\x7f\x3d\xfc\xf6\xf0\xa3\xff\xf0\xcd\xe1\xe1\xc1\xc1\x2f\x3f\xbc\xfb\xfe\x66\x74\xfe\x1b\x3b\xfc\xf8\x0b\xcf\xd3\x5b\xfb\xe9\xe3\xc1\x2f\x70\xfe\xdb\x96\x93\x1c\x1e\x7e\xfb\x75\xe3\xa5\x53\xbe\x78\xdf\x90\x80\xda\x31\x68\x2d\x37\x72\x79\xc6\x96\x42\x7b\xef\x07\x85\xd2\x34\x60\x5c\x0f\x84\x1c\xd8\xa9\x8f\x89\x96\x79\x33\x62\x52\x30\xa5\xb6\xcf\xbf\xaf\x0b\x77\x5c\x30\xa4\xc0\xae\xf7\xe6\x80\x2b\x88\x24\xe8\xcf\x61\xc9\xb1\x4f\xf2\x72\xca\x52\xe8\xdf\x4b\xe3\x73\x5f\x82\x71\x27\x84\xce\xe1\xbe\x16\x92\xe8\x44\x8a\x74\x48\x4a\xce\x88\x39\xe6\x18\xb8\xeb\x6e\xa1\x81\x15\xd4\x8f\xce\x18\xd4\x19\x83\x36\x8c\x47\x8d\x41\xd7\x16\x0f\xf7\xd6\x12\x04\x7c\x5e\xd7\x85\xb1\xd6\xdf\xed\x75\x1d\x2d\x48\x26\xb2\x3c\xa1\x7a\x83\x27\x6b\x8d\xf3\xdb\x1d\xf5\xc2\x73\x56\xc4\xa9\x58\x86\x96\xae\xf7\x38\x92\x93\x24\x21\x8c\xdb\x83\x8f\x13\x78\x07\x97\x04\xab\xda\x10\x6a\xbd\xcf\x73\xb3\x84\x3b\x97\x43\x5f\x0e\x7e\x54\x44\x69\x2a\x35\xc6\xe0\x62\x8e\xbd\x65\x25\xce\xfb\xc4\x78\x91\x69\x1f\x84\xc3\x90\x7e\xb0\xb6\xe6\x6a\x42\x95\xf6\xcb\xc6\xd5\x68\x7a\x8b\xbe\xc1\x08\x62\xe0\x11\x60\x2e\x54\x0e\xc5\xbb\x8e\x8d\xde\x46\xce\xf9\x3c\x38\xd9\x72\x1b\xba\x61\xc9\xdf\xfa\x39\x5e\x56\xb8\x80\x41\xc4\x6b\x5f\x1a\x3b\x44\x0d\x20\xd5\x0f\x1a\x76\x48\x29\x0b\x56\x56\xf5\x34\x71\x02\xcd\x79\x66\xf0\x6c\x35\x12\x86\x56\x98\x65\x61\x7e\xae\x32\xc9\x97\xe0\x0c\x6c\xce\x3e\xbf\x38\xd6\xd9\x12\xdb\x6c\x87\x65\xee\xe0\x3b\x69\x93\x4d\xb6\xe1\x2c\xc9\x24\x4c\xd8\x7d\x4b\xe7\xf4\x84\x17\x96\x18\x16\x03\xd7\x6c\xc2\x6c\x37\x85\x4c\x42\x06\x3c\x0e\x55\x5a\x30\x1f\x99\x57\x61\xb3\x97\xa1\x37\x56\xe0\x6e\x97\x94\x5d\xaf\x13\xf6\x3b\x3a\x46\x3a\x3a\x56\x7b\x7c\x26\x3a\xe6\x30\x77\x7f\x88\x18\xc6\x75\x37\x0f\x2c\x3f\x2b\x45\x89\x23\x16\xef\x8c\x65\x45\x7a\xd3\x11\xce\xa2\x6c\xaa\x60\x48\xfb\x0d\x74\x51\x0b\x9b\xf4\x66\x5b\x85\x48\x92\xc0\x1c\x12\x27\x34\x91\x94\x72\x3a\xb5\xf9\xc4\x5a\x78\x3b\xad\xd1\xb2\x0c\x12\x4b\x16\x57\x84\x7b\xfb\x18\xc6\x89\x41\xec\x44\xd0\x18\x7f\x94\x22\x49\x40\x2a\x92\xb0\x5b\x20\x67\x90\x25\x62\xe1\xd2\x83\x79\x4c\xae\x35\xd5\x06\xa5\xaf\x41\xd7\xf3\xf9\x36\x42\x57\x5c\xf1\x28\x4f\x92\x91\x48\x58\x54\xcb\xa2\x52\xdd\xb6\x0b\xdc\xaf\x2c\x4f\x12\x92\xe1\x94\x43\xf2\x9e\x23\xc5\x38\x49\xee\xe8\x42\xf5\xc9\x25\xcc\x41\xf6\xc9\xc5\xe4\x52\xe8\x91\x15\xbd\xab\xd1\x76\xf6\x42\xc2\x26\xe4\x38\xb1\x9d\x71\x34\x9d\xa2\xe2\xe4\x7d\x80\x7d\x03\xff\xf2\x04\x96\x38\xdc\x31\xb5\x56\x53\x69\x8c\x38\x5f\xe1\x4c\x86\x50\xd9\xcf\x9f\x7d\x9b\x12\x36\x81\x68\x11\x25\xcd\xcf\xd5\x49\x84\xd1\x0b\x45\xa1\x91\x12\x7e\xbb\xba\x71\x2e\xd1\x11\x55\x40\xc6\x89\x2d\xe8\x66\x2b\xd5\x15\xa8\x1e\x56\x64\x55\x5d\xd5\xaa\x86\x58\x9b\x73\x36\xe5\x99\x99\x50\xfa\xda\xa8\xe7\xad\x94\x7d\xeb\x8d\xfc\x74\x04\x8b\x5b\x25\x09\xc4\x84\xa5\x29\xc4\x46\x85\x4f\x16\x84\x4e\x34\x26\x9c\x56\xcc\x03\x11\xf6\x83\x8a\x43\xd5\x8c\x19\xe5\x71\x02\x92\x4c\x28\x4b\x9c\x31\xa0\x72\xbd\x06\x99\x32\x8e\x36\x01\xeb\x8e\x45\xfb\x82\xf9\x14\x45\x42\xfa\x42\x7c\x4c\x2b\xff\x53\x71\x30\x91\x89\x94\x10\x60\xd9\xaf\x4c\xc6\x89\x88\x6e\x15\xc9\xb9\x66\x89\x5d\x8c\x10\xb7\xd8\x09\x2a\xc1\xa3\xd3\xe0\x64\x85\x3f\x07\x01\x95\x06\x66\x76\x75\xf4\x55\xf1\x13\x7e\x51\x97\x9b\xb7\x20\x85\xb5\x21\x83\xc1\x3d\x44\xad\x25\xbb\x1b\x5a\x6a\x76\x19\xfd\xfd\x82\x07\x51\x6c\x22\x0c\x03\x33\x7b\x5d\xa4\x29\x07\x72\x39\x24\xe7\xf7\x10\x95\xea\x1f\x60\xc1\x4a\x24\x04\x98\x23\x49\x6f\xe1\x05\x15\x5c\x6b\x90\xda\x56\x1e\x15\xb0\x9f\xda\x39\x7d\xbd\x26\xf7\x08\x92\x30\x8e\x64\xd1\xa5\xbb\x11\xc6\x15\x8b\xa1\x7a\x86\xec\x89\x75\x82\x2e\x89\x99\xc4\x0a\x02\x8b\x10\x7c\xed\xe7\xc2\xe4\x7c\x21\x34\x39\xe8\x1d\xf5\x0e\x57\x6c\x96\x3d\x23\xb8\x24\x60\x49\xb4\x35\x60\x46\xc5\xa2\x14\x4b\xb3\x64\x81\xeb\xe8\xc5\x7d\xc2\xb4\x8f\xce\x96\x39\xf7\xab\x72\x39\x78\x7d\xa2\x04\xd1\x92\xfa\x22\x20\xf6\x5b\x73\x91\x96\xb9\x63\x0e\x07\xbd\x8f\x3d\xec\xfb\x76\x48\xee\x04\xef\x69\x5c\xfe\x90\xdc\x08\x23\x7e\x17\x13\x2d\x44\x4e\x38\x80\x55\x21\xef\xb3\x84\x45\x4c\x27\x0b\x24\x74\x44\xe4\xda\xe6\xdf\x52\xed\x73\xff\xce\xef\x99\x76\x31\x6e\x06\x6d\x5f\x23\x34\x2d\xb1\x23\xd4\x48\x47\x73\x38\x9a\x01\x4d\xf4\xcc\x06\x96\x70\xc1\x07\xff\x04\x29\x30\x2b\x90\xbb\x5f\x5e\x5c\x71\xba\x56\xb4\x0d\x43\x7b\xbf\x87\xf6\xaa\x1c\xff\xfd\xe6\x66\xf4\x3d\xe8\x25\x92\x61\x9e\xe2\xc3\x7d\xd0\x82\x00\x72\x22\x64\xba\x07\xb4\xa3\xad\x06\x5f\x99\x90\xfb\x40\xc2\x66\x42\x35\xda\x4b\xb2\xb2\x9f\x42\x69\x54\xa2\x9c\x10\xc7\x21\x32\x3b\x58\x8d\x3b\xf1\x85\x80\x2f\x46\x43\xf2\xb3\xc8\xcd\xdb\x8c\xe9\x38\x59\x84\x2a\x06\x0a\x34\x79\x65\xa6\x7a\x65\xc8\x93\xc1\x86\xbf\x03\x8d\x8d\x66\x63\xa8\x07\xd0\xfd\x28\xf8\x4d\xdc\x79\x70\x6b\x6b\x97\x0f\xe4\x4a\x8b\x94\xcc\xdc\x6b\x57\x93\x2b\xdd\xc9\x18\xe2\xe9\xb1\x1a\x25\x56\x28\xb3\x14\xce\xdd\xf3\xe2\xe8\xd7\x0a\xdd\xb0\x70\x77\xdf\x8f\xb1\xea\x71\x54\x06\x9b\xab\x78\x6d\x93\x89\xb8\x05\x96\x41\x35\xa8\xe7\x5e\x29\x8f\x3d\x2e\x91\x59\x3b\x55\x73\x79\x22\x74\x04\x36\x8f\x0f\x6b\xb5\x40\x66\x3b\xb1\x06\x64\x9d\x61\xd6\xe1\x8c\x35\xda\xb4\x04\xc4\x4f\x53\xa1\xf1\x73\x00\xa0\x9d\xcd\x27\x6d\x42\x20\x6b\x21\x1c\x7c\x35\x18\x5c\x0b\xa3\xbe\x62\xba\xa6\x25\xae\x48\x26\x14\xc8\x79\xdd\x74\xed\x62\xb4\xf7\xea\xa2\xbe\xa1\xc0\x8f\x35\x99\xd0\x92\xf0\x3c\x1d\x83\x2c\xb2\x59\xa4\x5e\x05\x48\x29\x9a\xe1\xd2\x5e\xee\x4d\xc0\xd5\xfe\x12\xe6\xce\xbf\xfc\xdb\xbf\xfd\xe9\xdf\x86\x76\xfa\x10\xd9\xc0\xc9\xc5\xc9\xe5\xc9\xef\xd7\x1f\x4e\x31\x9f\xb6\x29\x54\x5b\x0a\xdb\x6c\x3b\x68\xb3\xd5\x90\xcd\x4f\x1a\xb0\x89\x69\x22\x8d\xa9\x48\xd5\x5f\x80\x53\x1a\x0c\x30\x7a\x9b\xd1\x38\x9d\xec\x57\x2a\xf4\x65\x64\xcd\xaa\xfd\xd5\x1c\xb5\xbd\x38\x63\x3a\xca\xae\x45\x74\xdb\xa2\x5e\xd3\xbb\x39\x1d\xd9\x29\x4b\xaa\x0d\xe5\xde\x18\xc2\xf8\x5c\x24\x73\x5b\x48\xf6\xe6\x74\x84\x27\x6f\x88\x7f\xa1\x21\x0a\x35\xea\x85\xb9\xd7\x27\x32\x38\xf7\x94\xd1\xbe\xad\x05\x8d\x12\x09\x34\x61\x4a\xb3\x08\xef\x2b\xcc\xa4\x66\x86\x26\x7e\xa9\x4e\x53\x5a\x37\x5a\xd7\x94\x7a\xef\xbd\xdb\x6e\x67\xa5\xa9\x69\xe0\xe1\x1e\xf3\x25\xc7\x8f\x6c\xc6\x47\xc7\x97\xbe\x08\xbe\x94\x49\xb8\xd6\x22\x6b\xc9\x13\x62\x27\xdb\xe0\x07\x19\xc3\x44\x48\x58\x76\x84\x94\x1c\x1b\xbe\xe3\x11\xc7\xec\x3f\x6f\x82\x12\x15\xe7\x85\x0d\xb9\x54\x79\x34\xf3\xd6\x44\x0e\x4a\x1d\xa1\xcb\x23\xcf\xac\x8a\x89\x4e\x94\x5c\x42\xdf\xbc\x1d\xa4\xb8\xba\x7e\x91\xc6\x60\x1e\x0f\xdc\x7e\x09\x3a\xb2\x66\x56\xef\x7f\x71\x16\x55\xbf\xfc\x65\x57\x49\x24\xa9\x9a\x01\xd6\x0f\x81\x7b\x56\x74\xd8\xa0\x4a\x70\x6b\xec\x75\xaf\x83\x8c\x46\x91\x8c\x2a\x65\x4d\xa7\x25\x27\x8f\xbd\x69\x24\xe2\x5e\x4f\x55\x6e\x98\x4a\x1a\x01\xc9\x40\x32\x11\x13\xcc\x27\x8e\xc5\x1d\x27\x63\x98\x32\xae\x3c\xfc\xcc\x44\x1e\xd0\x86\xdd\xd8\xd2\xb3\xbe\x16\xdb\x90\x5c\x55\x8a\xa0\xb8\xf4\xa4\x48\x14\x27\xda\xad\x62\xd9\xc9\x84\x11\xa1\xa5\xbe\x51\x61\x63\x7c\xd8\xac\x7e\x7c\xd1\x2d\x78\x9b\x0c\x68\x8b\xdf\x36\x42\x07\xcb\xc2\xd3\x68\xd6\xcc\xf1\xdb\xb9\xa7\xb6\x1c\x9d\x7b\x6a\xb7\xd1\xb9\xa7\x3a\xf7\xd4\xe6\xb1\x77\xe6\xdd\xce\x3d\xd5\x29\x5d\xcb\xa3\x73\x4f\x75\xee\xa9\x0d\x63\xef\xe8\x57\xe7\x9e\xda\x62\x74\xee\xa9\x2d\x47\xe7\x9e\xea\xdc\x53\x9d\x7b\xaa\x73\x4f\x7d\x41\x66\x40\x3f\x3a\xf7\xd4\xca\x24\x9d\x7b\xaa\x04\x8c\x4e\x53\x5a\x33\x3a\xf7\xd4\x9a\xd1\xb9\xa7\x4a\xa3\xe3\x4b\x35\xf8\x92\x77\xee\x8c\x8c\x5e\xd6\x3c\x67\x6d\x84\x8e\x03\x16\x39\x1f\x51\xb9\x33\x5a\x78\x54\xa9\x19\x5a\xa9\xe6\x87\x4f\xb5\x71\xde\xa0\xc2\xc7\xb4\x36\x1f\x6a\x57\x77\x84\x4f\x22\x54\x47\x99\xb0\xff\x2b\x9c\x11\x25\x2f\x84\xd5\x4e\xeb\xe7\xa4\x3d\x59\xb6\x55\x13\xd7\xc3\x5e\xbb\x1d\xf6\xc4\xb5\xd3\x82\xab\xa1\x73\x33\xbc\x38\x37\xc3\xcb\xe9\x28\xeb\x9c\xf9\x37\x33\x09\x6a\x26\x92\xda\x88\x5e\x41\xf2\x77\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x1e\xa2\x06\x54\x40\x57\x4b\xe8\xad\xa5\xd0\x5c\xc8\x62\xc0\x02\xa8\x94\x25\x66\x1b\x31\xad\x73\x46\x51\x54\x57\x79\x14\x01\x60\xf3\xb2\xb2\x16\xf3\xa7\x61\x78\x52\x68\xa7\xf1\xa6\x19\xbd\x69\xc6\xfb\x6d\x89\x52\x9c\xe5\x4f\x7f\xac\x35\x47\x43\x2f\xcf\xe7\xf7\xf0\xb4\x40\xa6\x9b\xeb\x2b\x8d\x74\x95\x36\xb8\x44\x53\x1d\xe5\xb9\x79\x72\x5a\xf3\x68\xb6\xe0\xc1\xd9\x23\xef\xcd\xde\xb0\x85\x7d\xf1\xd8\xec\x61\xf5\xd5\x16\x1c\x0c\x6d\x78\x68\xda\xf3\xce\x7c\x82\x22\xa5\x9f\xc6\x2b\xd3\xa2\x36\xdc\x92\x37\xe6\x73\x78\x62\x5a\x79\xeb\xa6\x1e\x98\xcf\xe7\x7d\x69\xe7\x75\x1b\x5a\xb7\x5e\x84\xc7\xa5\x05\xab\x56\x9b\x16\xad\xd6\xac\x59\x9f\xcc\xc3\xd2\xdc\xbb\xb2\x07\x9e\x95\xc6\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xe2\x1a\x22\xc1\xe3\xda\x1c\x66\xa9\x6a\x5d\x38\x3f\xca\x4e\xeb\x74\xb4\x6a\xfc\xf1\x8c\xba\xe2\xbc\x10\xfb\x90\x6a\x6f\xfe\x73\x02\x05\x36\x34\xb1\xab\xdc\x4b\x83\x1e\xd9\x1b\x65\xd0\x06\x63\xb7\xb9\x89\x7f\x17\x77\x44\x4c\x34\x70\x72\xc0\xb8\xdf\xc7\xc3\x92\x1a\x58\x68\xe6\x01\xad\xcd\xaf\x6f\x5e\xfb\x8b\x5f\x9e\xca\x8d\xc6\x05\xa5\x3e\xbd\x05\xc4\x3d\xe8\x71\x13\x88\xbb\x70\x92\x27\x55\x33\x88\x35\x8d\x54\xe9\xcd\x9b\xa2\xbc\xe8\x1b\x9c\x37\x9c\x36\xca\x63\xe2\x12\x37\x5e\xde\xa6\x35\xf6\x1b\xbf\x04\x9f\x71\x67\x7b\x21\x6d\xdb\x5e\x9e\xc8\x37\xbc\x87\x52\xf3\x33\xf5\x07\x77\x52\xf3\x0e\x43\xb3\x14\x44\xae\x3f\x8b\x98\x78\x37\x63\xd1\xac\xcc\xf5\x58\x0a\x8a\x88\x7c\x49\x7e\x7e\xe3\x6e\x5b\xcb\xb2\x3a\x59\x71\xed\xa8\x6b\x01\x5a\xa3\x26\x2f\xa7\x13\x16\x2d\x23\xa9\x22\x94\x9c\x5d\x5e\xff\xfe\xf6\xe4\x3f\xcf\xdf\x0e\xc9\x39\x8d\x66\xe5\x5c\x53\x4e\x28\x52\x42\x3c\xd4\x33\x3a\x07\x42\x49\xce\xd9\xff\xe4\xb6\xf2\x30\x39\x08\xf7\x1e\xb6\x5a\xe7\xb4\xe6\xc9\xc2\xb6\xb6\xad\xf5\x51\xb1\x4d\x72\xad\xf3\x52\x18\x6d\x51\x8a\x74\x99\x34\x9e\x9b\x9f\xac\x10\x81\x64\x74\x06\x12\xc8\x94\xcd\x9d\x5f\xc6\x15\x8e\xa5\x71\x70\xa7\x1a\x3c\x37\x68\x61\x44\x10\x3a\x46\x37\xe8\x0c\x08\x07\x6d\xd0\x3a\x28\xa3\x82\xab\x4a\xd2\x6f\xae\x40\xf5\xc9\x38\x47\xc7\x6d\x26\x59\x4a\x25\x4b\x16\xe5\xc9\x68\x32\x24\x97\xc2\x8b\x3a\x8b\xe5\x25\x9d\xbd\x3f\xbf\x26\x97\xef\x6f\x48\x26\x6d\x3a\x30\x7a\x5e\xf1\x77\x7c\xad\x31\x98\x3b\x5c\xff\xbd\x21\x39\xe1\x0b\xfb\xa3\x3d\xe0\x4c\x11\x23\xe7\x00\x37\x17\x39\xfe\xe0\x0b\x3e\xbf\x7a\x3d\xc4\xff\x5e\x99\xb7\x94\x86\x81\x04\x87\x72\xb4\x12\x18\x62\x59\x0c\x1b\x27\x25\x68\xba\x77\x7f\x51\x9d\x54\x42\x48\xcc\xc8\x00\xb1\xd4\x49\x85\x86\xad\x46\xf0\xda\xce\x3a\x8c\x4f\x93\x32\x56\xd5\x23\xfb\x4d\xe5\xc6\xa6\x52\xe3\xa0\x78\x83\x51\x5d\xe1\xb1\x95\x8e\x2e\xc5\x1a\x5a\xea\x83\x50\x70\x3f\x2f\x2a\x39\x8a\x20\xca\xad\xed\x2e\x46\xfe\x04\x0c\x6d\x3d\xf5\x74\xa9\x1f\x1a\xde\x6c\x0d\x96\x7d\xf2\x9a\xfc\x8d\xdc\x93\xbf\xa1\xe8\xf4\x97\xa6\x5d\x23\x9a\x0a\x35\xcd\x55\x37\x2b\xb1\x5f\x8c\x5a\x82\xf8\x4f\x86\x3a\x99\x19\x0d\x54\x8d\x2a\xcd\x78\xec\x3a\x84\x6a\x90\x86\x8e\xba\x9d\x78\xd2\x7e\x1b\x66\x81\x9f\x11\xcd\xac\x5d\xf2\x62\x52\x2e\xf7\xae\x77\x44\x34\x73\xbb\xd1\x81\x2e\x1d\x15\xaa\x16\x8f\x2f\x66\x4b\xa9\x8e\x66\x55\x32\x66\x04\x35\xa5\x8b\x03\xa6\x48\x2c\x50\x4b\xb6\x31\x3e\x33\xd6\xc0\xcb\xba\x3f\x68\xdc\xcc\xf1\x56\xd9\xcf\x87\x76\x6a\x49\x39\x42\xbb\x8e\x13\xac\x4a\xa5\x23\x32\x11\x3b\x99\xcc\x2c\x2b\x2e\xf1\x8c\x07\x84\x32\xa7\x87\x05\x73\x14\xe2\x92\x39\x4f\x11\xe5\x36\x38\x73\x02\x52\xda\xb0\xac\xf1\x82\xb8\x66\xfc\x8d\x37\xaf\xd1\x49\xca\xa4\xd0\x22\x12\x0d\x5a\x82\x54\x9d\x61\x6e\x3a\x04\x82\x35\xec\x78\x7b\xda\x8f\x67\xa3\x3e\xb9\x39\x1d\x61\xa7\x84\xeb\xd3\x9b\x51\x55\x53\x79\x75\x73\x3a\x6a\xd0\x5a\xbe\x15\xbd\xd0\x49\x56\xc7\x66\x99\x35\x26\xa9\x28\x95\x46\x6c\x1b\xa4\x34\x1b\xdc\xc2\xa2\x26\x4f\x6d\x83\xaf\x0f\xc2\x0e\xb7\xf2\x42\x16\xcc\x29\xcd\x76\x9e\x4d\x02\x8d\xd9\x67\x8a\x90\x76\x27\xab\x78\xe6\xfa\x50\xe9\x54\xcc\x21\xb6\xe2\xb0\xbf\x03\x78\x9c\x09\x66\xe4\xc5\x2e\x7e\x7a\xf7\xbb\xbb\xf8\xe9\x87\x46\x17\x3f\xdd\xc5\x4f\x77\xf1\xd3\x0f\x8f\x2e\x7e\xda\x8d\xa7\x37\x83\x92\x2e\x7e\xba\xe6\x78\x59\x3e\xbc\x2e\x7e\x7a\xa7\xd1\xc5\x4f\xaf\x8e\x2e\x7e\x7a\xc3\xe8\xe2\xa7\x37\x8c\x2e\x7e\xba\x8b\x9f\xee\xe2\xa7\xbb\x48\x90\x47\xe7\xda\xcf\x48\x10\xd2\xc5\x4f\xbb\xd1\xc5\x4f\xbf\x88\x98\x18\xd2\xc5\x4f\x6f\x35\xba\xf8\xe9\x2e\x7e\xba\xce\xe8\xe2\xa7\x71\x74\xb6\x97\x2e\x7e\xda\x8f\x2e\x7e\xda\x8e\x2f\x47\x6a\xee\xe2\xa7\x5f\x84\xac\xe8\x7b\xd7\x34\x8f\x07\xee\x9d\x8a\x34\xcb\x35\x90\x2b\x3f\x65\xe0\x10\x64\xbc\xb0\x81\x3d\xa5\xd3\xde\xdc\x3d\x1f\x09\x3e\x61\xd3\x5c\x62\x60\xef\x91\x6d\x0c\x33\x88\xec\x22\x06\xe1\xbd\x06\xe1\x99\x47\xcf\xd0\x45\x9f\xb0\x94\xd5\x8b\xd5\x26\x2b\xfb\xf3\x16\xe7\x2a\xd9\x71\xcd\x81\x4a\xe9\x3d\x9e\x14\x9a\x8a\xdc\xf6\xd4\x71\x10\x2c\x30\xc3\x5a\xbb\xf7\x75\x83\x48\x3b\xc2\x4c\x11\x7b\x3e\x6a\x41\xae\xc8\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x5f\xbf\xf9\x38\x38\xfc\xf6\xe0\xe0\x97\xd7\x83\xbf\xfe\xf6\xcd\xc1\xaf\x43\xfc\xe3\x5f\x0f\xbf\x3d\xfc\xe8\x3f\x7c\x73\x78\x78\x70\xf0\xcb\x0f\xef\xbe\xbf\x19\x9d\xff\xc6\x0e\x3f\xfe\xc2\xf3\xf4\xd6\x7e\xfa\x78\xf0\x0b\x9c\xff\xb6\xe5\x24\x87\x87\xdf\x7e\x5d\x7b\xc9\x8d\x99\x5f\x7b\xac\xaf\x25\xc6\xf7\x49\xd8\x9e\xf3\x03\xb5\x74\x24\xaf\xdc\x6c\xcb\x87\xd2\xb1\xaf\x87\x0e\xa5\xa7\xad\x18\xab\x1a\xe6\x61\x8a\x88\x94\x69\xa3\x47\x18\x85\x8e\x96\x23\x40\x98\xae\x88\x9f\x8e\x1c\x60\xe8\x14\xd5\xb6\xd3\x57\x88\x9e\x28\x45\x64\x0a\x3d\x03\x79\xc7\x94\xef\xa0\x16\x34\x13\x3c\xd6\x83\x18\x26\x8c\x83\xb3\x78\x77\x24\x62\xeb\xd1\x91\x88\x97\x48\x22\x14\x44\xb9\x64\x7a\x71\x2a\xb8\x86\xfb\x5a\x2a\x55\x95\x42\x5c\xbb\x09\x89\xc8\x6c\x54\x94\xd7\x1a\x5d\x44\x9d\xcc\x39\x86\x42\xef\x7c\xf2\x32\x91\xb0\x68\x71\xe4\x17\x8c\x47\x0c\xee\xf5\xd1\x96\xf3\x68\xaa\x6e\x8b\xe3\x0b\x03\x23\x1f\x17\xa7\x74\x65\xd6\x67\x28\x7a\xa1\xd4\x33\x92\x6c\xce\x12\x98\xc2\xb9\x8a\x68\x82\x54\xaa\x1d\xca\x7f\xb2\x61\x76\x24\xd8\x52\x24\x8a\xdc\xcd\x00\x3b\x1e\x52\xf3\x26\xa8\x32\x47\x94\x93\x29\x65\x9c\xa4\x66\x8b\x32\x7f\xb3\xc1\x09\x43\x97\xb5\x22\x19\x95\xc0\xb5\xbf\xc1\x25\xd8\x8c\x85\x48\x5c\xc8\x5f\xb2\x28\xe6\x77\x31\xb3\x5c\xfc\xce\xe1\xee\x77\x33\x9b\x22\x93\x84\x4e\x43\xcc\xad\x02\xbd\xa2\xa5\x17\x53\x6f\x7c\x01\x8c\xa7\xcb\x81\xd0\xe4\x8e\x2e\xf0\x35\x96\xe7\x60\xea\x98\xbc\x39\x44\xd4\xa5\x8a\x84\x39\x62\xf2\xc7\x43\xf4\x01\x9c\x9e\x8c\x7e\xbf\xfe\xf9\xfa\xf7\x93\xb3\x77\x17\x97\xcd\x08\xbe\x79\x77\xa0\xbc\xd6\x1c\x11\xcd\xe8\x98\x25\xac\x09\x9d\x5f\xf1\x12\x97\x27\x45\x86\x1a\xc7\x47\xb1\x14\x99\x85\x93\xcc\x39\x26\x0f\x16\xd9\x23\x55\x0d\xb7\x9c\x51\x88\xdb\x33\xa9\x4e\x38\x95\x94\x6b\xaf\x6f\x95\x41\x2e\x73\x6e\x94\xe6\x67\x1e\x50\x4b\xe3\xf6\x82\x69\x4f\xe2\x18\xe2\x0a\xf4\x5e\x5c\xf0\xce\xa9\x7f\xb9\x45\x91\x5b\x49\x46\xef\xaf\x2f\xfe\xcf\x12\x1a\x2e\xb2\x66\xb1\x0a\xed\xe4\x73\xc8\xfa\xcd\x82\xc9\xf2\xab\x5f\xb9\x7c\x81\x6e\x7f\xf7\x62\x7f\x03\xaf\x6a\xc7\x43\x76\x95\xf3\x6a\xfa\x7d\x31\x3f\x49\x45\x0c\x43\x32\xb2\x6c\x0a\xd4\xd2\xaf\xa5\xb4\x3c\x2a\x81\x98\x4b\xb8\x66\xd8\x95\xd8\xe8\x53\x73\x9a\x80\x0d\x81\xc4\x20\xf8\x4a\x46\x61\x99\x0e\x4f\x68\xa2\x1a\x12\xd3\x26\x9c\xc9\x30\xe1\x77\x46\x35\x6c\x05\x9a\x61\x36\x12\x03\x17\xda\xe9\xa0\x66\x95\x98\x64\x29\x45\x44\xac\x1e\x5a\x0a\x67\xa8\x70\x17\xd7\xab\xda\x33\x26\xa6\x3c\xac\x46\x61\x66\x6b\xc1\xcd\x15\xa8\xf5\x8c\xa9\xd0\x4c\xcd\xec\x12\x68\x8c\xb9\x24\x19\xd5\x33\xeb\x8d\x4c\xa9\xba\x85\xd8\x7e\xe1\xe4\x1a\xa7\x01\x2b\xd7\xb7\xda\x3d\xea\xc6\xac\x7b\x02\x54\xe7\x12\xac\x3c\x63\x7d\xa4\xc0\xe9\x38\xa9\x97\x2c\x4f\xda\x38\x02\xe6\x9d\xde\xf3\x64\x71\x25\x84\xfe\x2e\xe4\x50\xb4\xb2\x81\x3f\x39\x49\xb1\x6a\x62\x45\x51\x0a\x9d\x87\xf1\x00\x81\x89\x28\x5d\x4e\xdf\x38\x2b\x36\xec\x89\x11\x5a\xe6\xfc\x44\x7d\x2f\x45\xde\x4e\xbb\x78\x83\x8d\xdf\x5f\x9c\xe1\x39\xce\xed\x19\x06\xae\xe5\x02\xb3\xc5\x56\x0b\x7d\x04\x99\xf6\x47\x83\x9f\x4b\x18\x69\xe4\xe4\x9c\x2b\xd0\x43\xf2\x8e\x2e\x08\x4d\x94\xf0\xc2\x31\xe3\x64\x84\x31\x16\x65\x95\x6f\x48\x30\xa3\xd5\xfe\x3c\x16\x7a\x46\x96\x2e\x40\x74\x5e\xbd\xcf\x66\xe8\x58\x87\x45\x51\x79\x84\xf1\x95\xdb\x35\xbd\x05\x45\x32\x09\x11\xc4\xc0\xa3\x86\xbb\xd6\x9a\xef\xe1\x2f\x7f\xae\xbf\xf3\x97\x82\x9b\x63\xd1\xca\xde\x5f\xf0\x98\x45\xd4\x52\x31\xaa\x97\x76\x1a\xbd\x86\x4e\xef\xa0\x98\xda\x83\x87\x22\x57\x20\xd1\x8e\x66\x14\x17\xbb\x11\x3f\xe4\x63\x48\x40\x5b\x65\x08\xf3\xc5\xa9\xb6\x39\x55\x2c\xa5\x53\x20\x54\x07\x44\xd1\x82\x00\x57\x39\x36\xd0\xa7\x1a\xcd\x6c\x02\x8a\xc4\x27\xaa\xc8\x8f\x17\x67\xe4\x35\x39\x30\xcf\x3a\xc4\xed\x9f\x50\x96\x60\x80\xb9\xa6\x72\x79\x8d\x6c\xe2\xa7\xc0\x25\x21\xee\x11\x21\xed\x11\xed\x13\x2e\x88\xca\xa3\x99\x5f\x93\xd1\xb8\xbc\xc2\xe6\xe2\x70\xd0\x52\xff\x02\x51\xb5\x31\x81\xf9\x51\x81\x6c\x8d\xbe\xfc\x58\x83\xbe\x94\x45\x08\x83\x73\x55\xe8\x59\xc4\x4a\x41\xd3\x98\x6a\xea\xe8\x4e\x91\x2d\xf9\x12\xb7\xf4\xa9\xa9\x8f\x82\xb7\x8c\xe7\xf7\x36\x70\xa3\x3d\x25\xff\xfa\x1c\xa7\x25\x91\x07\x1a\x6e\x1a\xcd\xb2\x84\xd9\x3c\xc5\xa5\xc8\x87\x8b\xca\x56\xf7\x37\x88\x48\x78\xcc\x69\x92\x08\x43\xde\x0c\x67\xa7\x3c\x16\xe9\xca\xc3\x8c\x00\x05\x95\x02\x55\x43\xf2\x22\x91\xe7\xc9\xcd\x11\x09\xcc\xa1\x41\x2d\x86\xe5\x7a\x5a\x66\x36\x23\x8b\xf9\x0d\xc5\xe9\x49\x42\xc7\x90\x58\xce\x62\x11\x48\xad\x22\xd0\x53\x47\x0f\x49\x91\xb4\x17\x3b\x7d\x25\x12\x0c\xd9\xa0\x01\x10\x66\xfa\x67\x01\x07\x9c\xa4\x2d\x38\xa0\x22\x53\x81\x03\xaa\x64\xcf\x01\x0e\x79\x03\x46\x4b\x96\xe1\x60\xb8\x76\x15\x0e\xc8\x3a\xf7\x1d\x0e\x0a\xa2\x48\xa4\xd9\x48\x0a\xa3\x72\xb5\xc6\x5a\xdc\xb4\x85\x3b\xc8\xea\xe4\x6b\x02\x6c\x90\x94\x57\x2f\xa6\xe8\x36\x10\x73\x16\x43\x6c\x24\x58\xa4\xf1\xde\xa1\xf4\xbf\xca\x5d\x0b\x0d\xe9\x59\xe6\x43\x7e\x16\x31\x07\x29\x7d\x85\x01\x73\xa7\xfb\xe1\x99\xa7\x01\x37\xb0\x92\xb5\xc2\x4c\x44\x44\x13\x2c\x95\xd5\x0c\x63\xc8\x32\xd6\x2c\x4f\x4c\x58\xd0\x90\xd0\xb5\x84\xdf\x79\x2f\x3e\x56\x4d\xc2\x6f\x9c\xed\x8b\x8b\x18\x4a\xd5\x3b\x72\xac\x7b\x78\x63\x23\xf1\xf0\x3a\x1f\x88\x69\xb8\xba\xf7\x06\xc6\x95\xbb\xb5\x70\x95\x1b\xde\x85\x02\x5c\x66\x81\xc0\x63\xc6\xa7\x68\xd1\xe9\x13\x09\x09\xc5\x40\x77\x77\x86\x6f\xad\xfa\xd5\x43\x8c\xf6\x93\x7a\x74\xf6\x8f\x46\x49\x88\x09\xee\x66\x46\x23\x87\x97\x6f\x26\x96\x5a\x32\x45\x5e\xbd\xf5\x00\x68\x50\xb1\x68\x1f\x19\xc4\x2b\xfb\x86\x61\x37\xad\x8d\xed\x96\xf1\xd8\x45\x50\x56\x80\x15\x6a\x4b\x5a\x29\x74\x48\x3e\x60\x11\xb4\x12\x69\x38\x26\xbf\x72\x12\x80\x45\x06\xb5\xd1\xe3\xca\x0a\xac\xde\xbc\x34\x78\xd8\xe4\x17\x1e\xb2\x3c\xcd\x8f\x1c\xf7\xde\x3c\x77\x60\xd4\xde\xd5\xeb\xfc\xbb\xbc\x7a\xca\x7d\xbd\x63\x3c\x16\x77\xaa\x6d\x1d\xe2\x27\x3b\xad\x17\xa8\x23\x83\xd6\x9a\xf1\xa9\x2a\xeb\x11\x34\x49\x2a\x66\xd8\x75\x8a\x84\xdf\xe1\x50\x49\x74\x55\x80\x0f\xc8\x61\x01\xdf\x29\x01\x3b\x8c\x69\xaa\xe8\xa9\x34\xaf\xa2\x19\x4d\xae\xb3\xfa\x25\x95\xc8\x32\x1a\x7c\xff\xee\xfa\xa4\x3a\xb5\xa1\x67\x77\x58\xa9\xd6\x00\xdb\xfc\x4e\x68\x9c\x32\xa5\xd0\x0c\x04\xe3\x99\x10\xb7\xe4\xc0\x87\x6d\x4c\x99\x9e\xe5\xe3\x61\x24\xd2\x52\x04\xc7\x40\xb1\xa9\x3a\x72\x48\x3b\x30\xab\x3f\x24\x8c\x27\x8c\x97\x4c\xf3\x58\x83\xd5\x99\x31\xf0\x21\x51\x58\x05\xee\xad\xab\xb3\xe7\xbc\xcc\xab\xcb\xb4\x95\xf5\x18\x24\x4f\x5f\x28\x62\x75\x7b\x2e\x1b\xe6\xbc\x3f\xb2\x45\xf8\xee\xae\x42\x53\x39\xfd\x61\x2d\x1c\xad\xf4\xf6\xe4\x40\x0a\xd6\xb1\x56\x61\x83\x56\x32\x37\xa9\x21\x04\x9e\xa2\x35\xb1\x9a\x99\x4b\x3e\x95\xe5\xec\x79\x90\x3d\xd2\x74\xd3\x5d\x5e\x5f\x4b\x95\xfd\xae\x4b\xb3\x95\x64\x91\x60\x7b\x1f\x89\xd8\xe6\xf5\x86\xbc\x44\x2c\xc8\x8d\x79\xc6\xec\x9f\x9e\xdb\x14\x1c\x8b\x0b\x1b\x70\x5a\x4e\xf8\x75\x85\xcd\x62\x62\x04\x87\xc4\x2b\x3a\x69\x96\x18\x7a\x56\x99\xd9\x1a\xf1\x67\x4c\x95\x4b\x01\xf6\xc3\x42\x56\x1a\xaf\xf7\xc9\x7f\x1b\xc9\x91\x86\x68\xa8\x4a\x67\xf8\x90\x34\x89\xee\x46\x57\x17\x14\xcb\x9c\x68\xe1\xf5\x28\x12\xb3\xc9\x04\x7c\xd4\x95\x91\x83\xa9\xa4\x29\x68\xf4\x30\x5b\x10\x8c\x61\xca\x6c\x58\x8f\x98\x10\x6a\x16\xd2\xeb\xa9\x22\x8d\xaf\x6f\x43\x7f\x98\x26\x29\x9b\xce\x2c\xa2\x10\x4a\x12\xc1\xa7\xc4\xfb\x17\x12\x41\x63\x82\xb8\x2d\x24\xb9\xa3\x32\x25\x94\x44\x34\x9a\xa1\xb3\x82\x72\x12\xe7\x12\x6b\x5d\x69\xa0\xf1\x62\xa0\x34\xd5\x86\xef\x83\x74\xe2\xb1\x5f\x7f\x57\x0f\xf1\xc1\xd1\xd5\x43\xdc\x3c\xba\x7a\x88\x5d\x3d\xc4\xae\x1e\xe2\xc3\xa3\xab\x87\xe8\xc6\xd3\xa7\x35\x92\xae\x1e\x62\xcd\xf1\xb2\x72\xf2\xbb\x7a\x88\x3b\x8d\xae\x1e\xe2\xea\xe8\xea\x21\x6e\x18\x5d\x3d\xc4\x0d\xa3\xab\x87\xd8\xd5\x43\xec\xea\x21\x76\x95\x5d\x1e\x9d\x6b\x3f\x2b\xbb\x90\xae\x1e\xa2\x1b\x5d\x3d\xc4\x17\x51\xe3\x86\x74\xf5\x10\xb7\x1a\x5d\x3d\xc4\xae\x1e\x62\x9d\xd1\xd5\x43\xc4\xd1\xd9\x5e\xba\x7a\x88\x7e\x74\xf5\x10\xed\xf8\x72\xa4\xe6\xae\x1e\xe2\x8b\x90\x15\x95\x8e\x59\xad\x12\x2f\xdb\x64\xe4\x3a\xaf\x6f\x29\x87\x67\x9c\x4f\x26\x20\x51\xd8\xc0\x27\xaf\x78\x18\x43\xe5\x8e\x10\xd9\xe0\x7c\x88\x0a\x74\x1f\x93\x7b\x5d\x64\xdf\x86\xdb\x5d\xd2\x10\x96\x62\x91\xa0\x30\xa1\x95\x93\xf3\xf7\xdf\xb5\x93\xfe\xdb\x2c\x33\x0f\xd7\xfc\x9e\x47\xcd\xe3\x50\x0a\x80\xaf\x8b\x34\x75\x70\x8f\x12\xa1\xac\x1f\xd8\x02\x2b\x9a\x51\xce\xc1\x0b\x86\x4c\xa3\xc2\x35\x06\xe0\x44\x64\xc0\x6d\x80\x5b\xe8\x3b\x4e\xb5\xa6\xd1\x6c\x68\x9e\xc4\x3d\xb0\x5d\xa5\x9b\x62\x46\xa5\x25\xd0\xd4\x02\x5d\x42\x4a\x99\x9d\x8a\xd0\x48\x0a\xa5\x48\x9a\x27\x9a\x65\x61\x32\xa2\x00\x23\xf7\x6c\xe0\x66\x00\x06\xba\x8e\xc1\x3a\x6a\x31\x1f\x35\x3c\xcd\x2d\x4b\x94\xab\x1f\xa0\x58\xda\xc7\xf2\x6d\x69\xa6\x17\x21\x46\x06\xc8\x84\x49\xa5\x49\x94\x30\x94\x9a\xf0\x89\x36\x49\x02\xe7\xeb\xa3\x50\xab\xb1\xea\x0c\xae\x54\xb9\xa5\xf2\x18\x59\x52\xa6\x95\x8d\x38\x29\x26\x74\x53\xc5\x4c\x39\x16\xae\xfa\x84\xfa\xdc\x7e\x0b\x68\xbf\x52\x04\x75\x8c\x93\xf9\xd9\xdd\x57\xa5\xe9\x4a\x05\x81\x8a\x90\x9c\x02\xd1\x31\x79\xdf\x23\x67\xbf\xd2\x28\x3f\x0b\xe5\x1d\xd0\x95\xbd\x72\x0c\x70\x03\x38\xcc\x0d\x0e\x40\x04\x46\x63\xa0\x1b\xb0\xfe\xb3\x23\xbd\x06\x99\x32\x8e\x91\x39\xef\x40\x29\x3a\x85\x51\x4d\x8b\xe4\x26\x69\x0b\x8d\x92\xc5\xc6\x20\x2a\x24\x36\x0e\x3f\x7c\x53\x84\x30\xf4\x54\x79\x49\x24\xb5\x6b\x0a\xb1\x52\x77\x92\x69\xa3\xe4\x32\x65\xab\x40\xa0\x53\x63\x39\xd3\xa6\xb7\x14\x08\xf1\xce\x4f\x52\xdc\x6c\x88\x3a\x8f\x5d\x3f\x65\x20\x63\xc9\x60\x42\x26\x0c\x63\x1d\x30\xfa\xa0\x6f\xf3\x9a\xa9\xd5\x16\x94\x32\xb2\xac\xe0\xde\xd7\xed\xd7\x35\x24\x3f\xb9\x85\x69\x99\xf3\x88\x96\xaa\x1d\x61\x2c\x3a\x9b\x90\x29\x46\x2f\x48\x1b\x19\xf5\xe7\xd7\x7f\xfd\x0b\x19\x2f\x0c\x4b\x43\xab\xb4\x16\x9a\x26\xe1\x25\x13\xe0\x53\x03\x2b\x7b\x3c\xab\xd1\xd4\x01\x02\x58\x83\xd5\x2e\xfc\xcd\x1f\x6f\xc7\x55\x1e\x7b\x14\xc3\xfc\xa8\x04\xbf\x41\x22\xa6\xeb\x8a\xdb\xd6\x0f\x87\xaa\x29\xee\xac\x41\x33\xac\xf8\xd6\x18\xd1\x7c\x82\x3d\x99\x89\x3b\x5b\x29\x64\x0d\xf6\x14\xf1\x4d\x99\xc8\xf2\xc4\x5a\xa7\xbe\x0b\x79\x08\xb9\x82\xd5\x60\xe3\xb5\xe7\x02\xed\x29\x6e\x8a\x25\xaa\xe1\x82\x56\xfc\x23\x85\x8b\xdb\x74\x1a\x7f\xc8\xb3\xcf\x25\x0c\xc9\x77\x34\x49\xc6\x34\xba\xbd\x11\x6f\xc5\x54\xbd\xe7\xe7\x52\x0a\x59\x5d\x4b\x42\x0d\xb5\x9c\xe5\xfc\xb6\xda\x9f\x38\x11\x53\x23\x5a\x65\xb9\xf6\x41\x82\xeb\x5e\xd8\x66\xd6\x78\x22\xec\x48\x6b\x69\x16\xb8\x47\x1c\xba\x63\x06\xdd\x38\x01\xf3\x7c\x8b\x91\xe5\xf9\x55\x19\xd9\xfe\xf8\xfa\xcf\xff\x6e\x51\xd7\xa8\x0e\xff\xfe\x1a\x03\x9b\x54\xdf\x1e\x62\xa4\x6d\x86\x51\xa4\x34\x49\x8c\xb6\x50\x46\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x37\x47\xb7\xad\x45\xa9\x9b\x9b\x9f\x51\x8e\x62\x5a\x41\x32\xe9\xdb\x88\xdf\x50\x23\xa6\x87\x8c\xa1\xe7\xa8\x8f\xe1\xab\xfb\x20\x00\xcd\x45\x92\xa7\x70\x06\xd8\x5a\xbe\x31\xa8\x2a\xb3\xf9\xa8\xb8\x84\x29\x0c\xae\x1e\x27\x22\xba\x25\xb1\xfb\xb1\xe4\xa2\x5e\xae\x15\x57\x1f\x0a\x75\x9d\xf5\x0d\x9c\xf4\x1b\xdf\xbf\xe2\x9e\x4f\x69\x96\x85\xf8\x5b\x49\xef\x2a\xc0\xc0\x33\x89\x89\x4d\x0d\x13\x47\x1b\x9b\x90\x9a\x1a\x90\x06\xee\x8d\x0c\xdd\xac\x3d\x45\x6d\xf7\x74\x73\xfb\x53\xb1\xfa\xfa\x46\x87\x0a\x42\x14\x13\xfa\xd3\x90\xe1\xdf\x36\xf4\x72\x25\xe3\x20\x04\xad\x07\xc4\xb0\x02\x80\x41\x1f\x24\xc9\xf5\x8d\x29\x2d\x58\x2e\x9a\xc5\x26\x54\xe0\xc2\x83\xc5\x28\xa5\xda\x09\x84\xde\x34\x45\x49\x06\x52\x31\x65\xf8\xf2\x07\x3c\x50\xa7\x09\x65\xa9\xd7\x2c\x33\x11\x3f\x0d\x10\xec\xe1\xc6\x12\x5f\xcd\x29\xe5\x48\xc4\x6e\x42\x24\x85\xb6\xbc\xd9\x1a\xb1\xb6\x2a\xd5\xb6\xc8\x50\x9f\x9a\x54\x7e\x28\xa0\x59\xa5\x94\xe6\x9b\x40\x2a\xed\x55\x2f\x89\x40\xe2\xfb\x3d\x57\xfa\x18\x16\xdf\x12\x19\x40\xc2\xe8\x36\xb7\x4a\x09\x2b\xca\xa3\x3d\x28\x25\x91\xde\xe9\x81\x43\x62\xdd\x65\xe6\x4c\xb8\x5b\x49\xef\xb8\xf7\xa4\x44\xd2\x82\x48\x8a\x8c\x4e\x1b\x15\x6b\x5e\x82\xd4\xf2\xb4\x24\x06\xab\x04\x80\x42\x35\x08\x7f\x0f\xf5\x15\xf0\x2a\x88\x8b\x8c\x5b\xcc\xa7\xb6\x9e\x0f\x0f\x60\xa7\x20\xd8\x5c\xa7\x3b\xba\x20\x54\x8a\x9c\xc7\xce\xbe\x14\x0c\x7c\xef\x96\x1e\x7c\x29\x38\xaa\x19\x3e\x0f\xdf\x88\xae\x18\x60\xc5\x14\x19\x83\xa6\x86\x4c\xbf\x19\xbe\x79\xfd\x52\x38\x15\xbe\xe1\x12\xa7\xba\x0c\x9c\xca\xd2\xa7\x27\x7d\x57\x5f\xd6\xb1\xa5\xf7\x7d\xe7\x4c\x2c\x45\xd5\x46\xe6\xab\xd2\xe1\x57\x77\x92\x69\x28\xb5\x64\x38\x40\xc5\xc5\xe8\x87\xa5\x8c\xc7\xc3\x16\x8b\x95\xb6\x51\x7c\x8d\x10\x95\x8f\x3f\x21\xdd\x72\x04\x0a\x8f\xdb\x3a\x0b\x97\x7a\x80\x84\x95\x01\xf5\xea\x15\x39\xb0\x57\xf6\x6c\xd6\xcf\xe1\x93\xa2\x96\x03\xda\xf9\x7d\xd6\xa0\x98\x4e\x05\x70\xe7\xf7\x19\x45\x1b\x5c\xd6\x22\x04\xff\x13\x66\x74\x0e\x98\xed\xc4\x12\x2a\x93\x85\x01\xe5\xb5\x5d\x3b\x19\xe7\x9a\x00\x9f\x33\x29\x38\x3a\xef\xe7\x54\x32\x3a\x4e\x80\x48\xc0\xac\x49\xa3\x8b\x7e\x7d\xf0\xe1\xe4\x0a\x9d\x95\x87\x2e\xdd\xd3\xad\x32\x57\x18\x1e\xb6\xb4\x92\xd2\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9c\x34\xd7\xb9\xad\xfc\x7b\x1f\x25\xb9\x62\xf3\xa7\xa2\x24\x2e\x0d\xed\x8c\xd5\xda\xe7\xa5\x94\xb8\x02\x50\x2b\xd9\x6d\x68\x5a\x47\xd6\xf2\x48\xa9\xb9\x9e\x0a\xc5\x39\xca\x95\x21\x9c\xe9\xc9\xe5\xa9\xda\x38\x1b\x5f\x9b\x65\x45\x84\xc0\x9c\xec\xa7\x35\x42\xc5\x5c\x9d\xe2\x0a\x77\x03\x6b\x35\x72\xb1\x92\xf0\x73\x76\x79\x5d\x4e\xf0\xb5\xea\x92\x88\x87\x64\x54\x7c\x59\x64\x81\x63\xa1\x86\xa0\x44\x82\x9c\x16\xc5\xff\xa6\xc0\x41\xa2\x90\x60\xa6\xac\x74\xc1\x21\x63\xaa\xac\x93\xe7\xec\xf2\xda\xda\x6c\x77\x83\x59\x6d\x31\xbb\xbe\x84\x6a\x38\xbe\x8d\x77\xae\x21\xdc\x56\xcb\xf2\x07\x83\x95\x01\x0c\x2a\xa5\x76\x62\x72\x31\x22\x34\x8e\x25\xba\x7d\x9c\xe8\x53\xaa\x69\x13\x7c\x0b\x98\x71\x4d\x15\x94\xd7\x54\x02\x37\x92\xb8\x02\xb0\xe4\x2c\xcf\x12\x66\xdd\x08\xe5\x1b\x8a\x4c\x71\xac\x23\xbf\x3b\xd2\x36\x51\xf3\x6a\x2b\x79\x0d\xa8\x90\xa8\x5b\xbe\xe6\x81\xdd\x93\xa0\x44\x32\x2f\x2a\x87\x2d\xed\x9a\x3b\x11\x68\x12\x0f\xbb\xe6\xab\xd5\x6c\xb5\x63\xc0\xb5\x34\x47\x73\x79\xb7\xb0\x05\x61\x92\xe3\x69\x0a\x13\xb2\x39\xa0\x7f\xdc\x15\xea\xb1\x37\x95\x6a\x99\x59\xdf\xb0\x2d\x27\x07\x54\x7a\x8a\x86\xab\xaa\x79\x12\xc9\x53\x21\xc2\xb2\xb1\xe3\xec\xf2\xda\x52\x42\xfb\xf2\xae\x9e\x93\x5a\xbb\x4b\x05\x55\xab\x8d\x81\x4f\x96\xc1\xdf\x44\xf3\x58\xea\x1f\xe1\xba\xab\x35\x0a\x64\x69\x20\xfe\x35\xca\xca\x69\xf0\x74\x05\x54\x46\xb3\x3a\xf0\x7f\x80\x10\xd8\x49\x49\x2c\x6c\x24\xc0\x44\x48\x54\x89\x07\x48\xde\x13\x21\x6e\xf3\x6c\x1b\x8a\xee\xa6\xb1\x4d\x01\xb6\x22\x10\x95\x3b\xbe\x28\x9a\x1e\x73\x55\xc7\xdf\x5b\x95\x7d\x40\x5b\x89\x07\x27\x2a\x22\xad\xc5\xb2\xde\x74\x9a\xe4\x4a\x83\xfc\x8e\x49\xa5\x5f\xf9\xca\x72\x88\xc1\xd6\x26\xd2\x2b\x5f\xf0\x13\xd3\xb3\xbf\x0b\xa5\x2f\x41\xf7\xfa\xd5\x9f\xcc\x67\x37\x71\xcf\xe8\xb4\xbd\x4b\xc1\xa1\x37\x5c\x16\xbb\x02\x29\x0f\x64\x6d\x23\x4f\x71\x4b\x57\x90\x40\x14\xfc\xaf\x25\x5c\xb9\x11\xc4\x68\x2f\xf8\x04\x4f\xff\x14\x68\x42\xb1\xfc\x0a\x5e\x3d\xb3\x6b\x35\xd2\xb4\x2d\xae\x80\x37\x68\xe1\x04\xbd\x45\x19\x44\xa5\x7a\x0b\x5a\x6c\x7e\xed\x3a\xf2\xdc\xce\x18\x60\x1b\x5e\x5c\x83\x9c\xb3\x08\xde\x32\x7e\xbb\x23\xfa\x55\xa3\x4b\xce\x57\x66\xab\x54\x1e\xb4\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x2c\x72\x8d\xb2\x1b\x3a\x1c\x0b\xc5\x91\xf1\xff\xb6\x7b\x81\xf6\xf6\xcc\x56\xc3\x59\xa7\x23\xaa\xbe\x35\xfa\x78\x25\x50\x2d\xb8\xa6\xf7\x48\x53\x44\x74\x0b\x92\x24\x66\x19\x43\x52\x04\xbe\x54\x2a\x45\xc9\x1c\x76\x8c\xba\xa8\x6b\xe9\x80\x6c\x06\x29\x48\x9a\x04\xed\xab\x09\xa8\xdf\x3a\xc2\x19\x66\x2d\xc7\xa4\xd8\xca\x21\xae\xc4\x91\x39\x87\xe7\xeb\xae\x4a\x29\x16\xc2\x74\x17\x53\x4e\xe0\x9e\x29\x34\xeb\x67\x22\x2e\x67\xa8\xe4\x0a\xe4\x20\xe4\x0f\xb9\x18\x7d\x15\x02\x71\x62\x18\xe7\xd3\x29\xe3\x53\x47\x9d\x91\xa6\x17\x75\x84\x0a\x4d\x07\x2b\x18\x45\x12\xa8\xb6\x91\xfd\x99\x88\x6d\x7c\x19\x2b\x5f\x9f\x8a\xd8\x5e\x3e\x5e\x58\x6d\xd0\xef\x2c\xf6\x33\xcc\x20\x1a\x92\x0b\x4e\x84\x74\x39\xd4\x34\x8e\x71\xed\xab\x6f\xe8\x3a\x91\x96\xdf\xaa\x1f\xe2\x38\x0c\x46\xa9\xe2\xae\x12\x58\x54\x3e\xf6\x2d\x45\x97\x6d\xa7\x34\xc9\x66\x74\x60\x2b\x6e\xbb\xea\x2d\x68\x7d\x9b\x09\x2e\x5c\x03\x6b\xaf\x1a\xa0\x8c\x68\x0f\x17\x3e\xef\x7c\x75\xf7\x7d\xff\x99\x3a\xe7\x7c\x77\xf6\x52\x8b\xb5\x54\xb9\x35\x5f\xf3\x16\xb6\xe6\xf2\x92\x77\xd4\x61\x16\xc5\xe6\x69\x1a\xd2\x4c\x48\x2a\x99\x25\x77\xcb\x78\x66\xf8\xc5\x1a\x04\x9b\xdb\xa6\x54\x6b\x70\x6c\x2d\x2e\x23\xb5\xe5\x22\x74\xbe\x35\x7c\x41\x45\x33\x88\xf3\xc4\x3c\x68\x9a\x53\xec\x79\x67\xa8\x85\x33\xaa\x2f\x5c\xf8\x9f\x45\xba\x10\x58\x18\x3a\x11\x2e\x30\x18\x07\x2b\x69\x99\x6f\x10\x5b\x6d\x08\xa2\xed\x19\x86\x0d\x88\xca\xd1\x88\x1b\x90\x30\xa2\xd8\xcf\x88\xfa\x43\x05\xf7\x11\x18\xb2\xa6\x55\xb1\x58\x17\x9f\xc2\x04\xef\x07\x4c\x77\x30\x84\x39\x8b\xf0\x09\x1b\x8f\xb0\x7b\x03\x0b\xec\xf1\xa2\xe8\xe1\xb8\xe1\xf0\xdc\x98\x77\x0b\x89\x00\x78\xd7\x9c\xd1\xed\x0f\xc5\x32\x04\xab\x8a\x90\x7f\x0e\x11\x3c\x72\xd3\xbb\x53\xc4\x6c\xc8\x9e\x39\x42\xa1\xf3\x92\x6b\xb7\xe4\xa3\x4b\x1e\x38\x24\x18\xe7\xb9\xab\x30\xd6\x40\xcf\xa8\xef\x44\xac\xe5\xfc\x6b\xa2\xd2\x50\x39\x6d\xa1\x2f\xff\x89\x9c\xe6\x29\x46\xd9\x39\x61\xba\xa8\xba\xe8\x1a\x77\x59\x76\x8a\x16\x3b\xc3\x8c\x4f\xdf\x9d\x79\x1f\x93\x0d\x79\x2b\xa2\xce\x7d\xf5\x70\x23\xe4\x35\xb4\xe4\x2e\x9b\x72\xcd\x41\x2b\xec\xc3\x05\xd7\x70\xfa\xa9\xb3\x55\x86\xa7\x79\xb4\x64\x3c\x33\x72\x06\x4a\x47\x85\xb5\x92\x47\x33\xca\xa7\xbe\x56\x75\x79\x5d\x4e\x8a\x70\xd5\xfc\x40\x45\x34\x0b\x71\x79\x24\x16\xb9\x79\xf8\xd7\x5f\xf7\x09\x83\x63\xf2\x75\xe9\xc6\x21\x39\x77\xd7\x96\x5e\xb8\x14\x67\x3c\x2e\x5e\xb7\x4f\x24\x4c\xa9\x8c\x13\xcc\xeb\x99\x04\xf1\xc8\x56\x8a\x74\x2f\x88\xa4\x12\x23\xfb\xb8\xd0\xeb\xec\xa4\x3b\x35\xe2\xb5\x42\xd5\x20\xa6\x9a\x0e\xb0\x3e\xb0\x25\x3a\x47\x56\xd1\x1f\xb8\xa2\x64\x03\xea\x50\xa1\xd4\xaa\xf7\x2b\xd7\x73\x74\x40\xc3\x55\x8c\x0f\xe8\x00\xcb\x83\xd5\x8f\x5a\x7d\x82\x00\x87\x46\x3a\x77\x83\xda\x74\xcb\x82\x72\x28\x69\x8a\x30\x18\x92\x4b\xa1\x8b\x12\x96\x21\x96\xc2\x95\x5f\x5b\x77\xfe\xce\x2f\x6f\xae\x7e\x1e\xbd\xbf\xb8\xbc\xe9\x8e\x61\x77\x0c\xbf\xa8\x63\x08\x7c\xde\xf8\x08\x06\x05\x6a\x9d\x4e\xb9\x54\xc6\xaa\x94\x6e\xf9\x82\xa2\xbb\xce\xf9\xfc\x03\x95\x45\x53\x58\x94\xcf\xd6\xba\x61\x7d\xd7\x58\x24\x49\xa7\xcf\x3e\xbc\xeb\x09\x83\xb3\x5a\x0c\x7a\xb9\x2c\x65\x09\xaf\xdb\xb5\x72\x27\x8d\xd3\xdf\x2f\xce\xce\x2f\x6f\x2e\xbe\xbb\x38\xbf\x7a\xd2\x68\x85\x86\x65\xa4\xaa\x4c\xb4\x26\x57\xcb\x24\xcc\x99\xc8\x55\xe8\x57\xb1\x9e\x04\xac\x86\xbb\xf1\x98\x50\xbe\xf0\xd6\xaa\xf5\xb7\x7d\xe9\xac\xb1\x1a\x6a\xd1\x20\x45\xbf\x2d\x64\xfb\x4e\x8a\xda\xfd\x73\x97\x2d\xdd\x56\x5b\xf7\x16\xee\x75\xfb\xdf\x53\xf6\xa9\x15\x46\xe1\x44\xb3\x90\x56\x6d\xbe\xc7\x0c\xa0\xa6\x47\xb1\x61\x99\xbf\x76\x2a\xe2\xd9\xb0\x84\x77\x34\xfb\x01\x16\x57\xd0\xb0\x12\xc0\x92\x67\x21\x81\xc8\xb0\x25\x72\x0b\x0b\xeb\x70\x3c\xf5\x0f\x6b\x52\xb1\x60\x2f\xab\x24\xde\x42\x93\x0a\x96\x6d\x96\x37\xbc\x85\x06\x71\x8a\x7e\xac\x14\xfa\x33\x5b\x88\x52\x95\xd9\xd3\x66\xbb\x47\xda\x2d\x6d\xf8\x09\xca\x39\xf6\xca\xcc\xd9\xd1\x59\xbd\x73\x31\x05\x31\x37\x9c\x06\xee\x8e\x5c\x8c\xd6\xc0\x50\xf7\x81\xc5\x5a\x75\x84\x81\x28\x47\x5f\xe1\x3f\xae\xfc\xcd\x49\x1c\xbb\x58\xe1\x5c\xc1\x24\x4f\xac\xe5\x5a\x0d\x09\xcd\xd8\x07\x90\x0a\x0d\x8c\xb7\x8c\xc7\x7d\x92\xb3\xf8\xdb\x26\xf5\x53\xec\x68\x71\x17\x84\xf7\xcf\xb4\xbb\x13\xd7\xce\xfd\x56\xe6\x5d\x81\x88\x10\x9b\x08\x88\xb8\xe9\x2d\xa2\x4e\x28\x68\x09\x34\xcd\x02\x62\xcd\xc0\x2d\x6c\x97\xae\xf6\x0a\xc2\x6a\x5d\x1b\xa1\xd6\x4c\x7c\xec\x4b\x2a\xa9\xd0\x28\x65\x68\x30\xac\x5f\xfd\xa8\x32\x1a\x41\x9f\xfc\x23\x7c\x89\x7d\x16\xd5\x2f\xbd\xde\xdf\x7e\x38\xff\xf9\x3f\x7a\xbd\xdf\xfe\x51\xfe\x15\x59\x21\xea\xb8\x4b\x97\xa0\x45\x9a\x8b\x18\x2e\xf1\x19\xf8\xd1\x89\x57\x27\x51\x24\x72\xae\xdd\x0f\x98\xc4\x3b\x9c\x09\xa5\x2f\x46\xe1\x63\x26\xe2\xe5\x4f\xaa\x51\x51\xa0\xbd\x64\x0c\xb8\x45\x0d\x92\x51\xec\x68\x8f\x3d\x14\xb4\xa4\xe5\xa3\xea\x66\xf5\xd8\x88\xc5\x25\xad\x5f\xe2\x3b\x0f\x02\xec\x6c\xe5\xab\x05\x70\x4c\xb1\x36\x92\x69\xb5\x42\xd4\xab\xf9\x9b\x46\x3d\xfc\xec\x68\x91\xb4\x85\x1d\x6c\x19\x60\x08\x11\xdf\x34\x04\x0f\x72\x60\xb0\x5e\xab\x28\x9c\xaf\x27\xa3\x0b\x32\xb7\x10\xde\x1b\xe0\x78\x97\xd2\x77\x9f\x94\xc6\x15\x3e\xc1\xa5\x54\xce\x63\xeb\xbd\xf5\xbf\xbb\xb4\x7a\xe5\xea\x91\x60\xe5\x72\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x31\x38\xcc\x06\x4a\x0b\x49\xa7\x98\x86\x61\x6f\xb7\xb7\x85\x4f\xf6\xc6\xca\x03\x56\xef\xb6\x8a\x6b\x94\x4b\x23\x34\x24\x8b\xa2\xc8\xdd\xcb\xa3\x6d\x1e\xf4\x7b\x42\xda\x02\x66\x34\xed\x70\x66\x47\x15\x21\x0b\x97\x39\x0a\x9c\x01\x8a\xa8\x4f\xba\x34\xd3\x7e\x10\x83\x6c\x83\x76\x3e\x37\x9a\x65\xed\x42\x59\xc5\x68\x91\x9a\xc5\x6c\xce\x94\x68\xd4\xb9\xd9\x4d\xb4\x39\x82\xde\x55\xba\xb0\x71\x42\xc1\xc8\x75\x9f\x61\x6d\xa0\x70\x5e\x97\xc8\xfe\x9b\x26\x0d\x3e\xed\xc8\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x5f\xbf\xf9\x38\x38\xfc\xf6\xe0\xe0\x97\xd7\x83\xbf\xfe\xf6\xcd\xc1\xaf\x43\xfc\xe3\x5f\x0f\xbf\x3d\xfc\xe8\x3f\x7c\x73\x78\x78\x70\xf0\xcb\x0f\xef\xbe\xbf\x19\x9d\xff\xc6\x0e\x3f\xfe\xc2\xf3\xf4\xd6\x7e\xfa\x78\xf0\x0b\x9c\xff\xb6\xe5\x24\x87\x87\xdf\x7e\xdd\x78\xe9\x2d\x94\xe1\xb3\xa3\xcd\x62\x7c\xd5\x19\x5b\x41\xbf\x4f\x58\xce\xda\x0e\x8f\x5e\x6d\x9f\x7f\x1f\x2c\x7c\x5c\x30\xa4\xc0\xae\xf7\xe6\x80\x2b\x88\x24\xe8\xcf\x61\xc9\xb1\x4f\x2a\x85\x8d\xf4\x14\x09\xaa\xc5\x4b\xe3\x73\x5f\x82\x71\xc7\x8b\xed\x76\x5f\x0b\x49\x74\x22\x45\xea\x93\xc0\xd1\x19\x31\xc7\xc0\x5f\x77\xdd\x2d\x34\x6a\x0b\x66\x47\x67\x0c\xea\x8c\x41\x1b\xc6\xa3\xc6\xa0\x6b\x8b\x87\x7b\x6b\x09\x02\x3e\xaf\xeb\xc2\x58\xeb\xef\xf6\xba\x4e\xb9\x62\xda\x76\x0e\xb0\xa1\x3f\xea\x85\xe7\xac\x88\x53\xb1\x0c\x2d\x5d\xef\x71\x24\x27\xd8\xa5\xd0\x1e\x7c\x9c\xa0\xc8\xb2\x70\xf5\xbb\x6d\x41\x3f\x98\x9b\x25\xf8\x10\xcc\x6a\xed\x47\x8c\xb5\xc4\x08\xd0\x9f\x6c\x40\xe6\xad\x8d\xd1\x34\x4a\x1a\xe3\x45\xd5\xcc\x20\x1c\x16\x2d\x77\xa9\x52\x22\xb2\xb1\xa5\x21\xe6\x1f\x0b\xb9\xb9\x65\xe3\x6a\xb0\xa3\x6a\xa9\xf3\x2e\xf9\x60\x53\x13\xfc\xbb\x8e\x17\x58\x1d\x92\xcf\x83\x93\xcd\x67\x90\xe0\x4a\xd6\xcf\xf1\xb2\xc2\x05\x0c\x22\x3a\x27\x58\x29\x6a\x00\xa9\x7e\xd0\xb0\x29\x06\x4e\x88\x49\x61\x65\xad\xd7\xd0\xaa\x31\x17\x6f\xce\x33\x83\x67\xab\x91\x30\xb4\xc2\x2c\x0b\xf3\x73\x95\x49\xbe\x04\x67\x60\x73\xf6\xf9\xc5\xb1\xce\x96\xd8\x66\x3b\x2c\x73\x07\xdf\x49\x9b\x6c\xb2\x0d\x67\x49\x26\x61\xc2\xee\x5b\x3a\xa7\x27\xbc\xb0\xc4\x30\x6c\xc6\x3f\x61\x36\xa3\x24\x93\x90\x01\xb7\xa1\xfc\x34\x9a\x21\xed\x77\x9c\xb2\x70\x4e\xef\x63\xe8\x8d\x15\xb8\xdb\x25\x65\xd7\xeb\x84\xfd\x8e\x8e\x91\x8e\x8e\xd5\x1e\x9f\x89\x8e\x39\xcc\xdd\x1f\x22\x86\x71\xdd\xcd\x03\xcb\xcf\x4a\x51\xe2\x88\xc5\x3b\x63\x59\x91\xf5\x73\x84\xb3\x34\xe8\xd1\x5f\x13\x19\xf0\xb1\xa3\x3c\x49\x5a\xaa\x45\xdd\xbb\x40\x68\x64\x79\x92\xb8\x14\xdc\x21\x36\xdf\x17\x13\x72\x82\x3d\x0f\xfa\xe4\x12\xe6\x20\xfb\xe4\x62\x72\x29\xf4\xc8\x0a\xb6\xd5\x58\x36\x7b\x21\x61\x13\x72\x6c\x54\x26\xa5\x89\xb6\x75\xe7\x4b\x55\x72\x84\xac\x4c\x50\x14\xe0\x6a\x10\x31\xbe\x79\x5b\xbe\xf2\xf9\x5d\x83\x27\xda\xa6\xd0\xd8\xa3\x05\xdd\xd4\x37\x67\x72\xd1\x71\xd8\x29\xd8\xb9\x46\xd6\x65\xb8\x3e\xc3\xa2\x13\x99\x50\xfa\xda\xa8\xb0\xed\x34\x7d\x19\xf9\xe9\xb0\x8f\x02\x4d\x12\x88\x09\x4b\x53\x88\x8d\x9a\x9b\x2c\x5c\xb7\x0a\x5a\x55\xa1\x23\xdb\xb1\xdf\x35\x4f\x00\x32\xa3\x3c\x4e\x40\x62\x01\x74\xb5\x5c\xe5\x89\x15\x15\xff\x43\x8f\x06\x9f\x24\x49\xa3\x48\xc8\xd8\xb5\x65\x74\xa9\x8c\xb8\x98\x70\xbc\x90\xd0\xa6\x94\xd3\xa9\xed\xc7\xb5\x52\x46\x17\x8b\x2b\xab\x52\xa3\x87\x99\x10\xb7\x24\x12\x69\x96\xe0\x01\x68\x70\x3e\x8a\x3e\x33\x01\x45\x07\xd8\x37\xec\xa8\xd4\x82\x06\xbf\x78\xc2\x3e\x60\x6d\xc8\x29\x70\x0f\x51\x6b\xfd\xa7\x0c\x45\x34\xbb\x8c\x3e\x71\xc1\x83\xb8\x32\x11\xe6\x30\x9a\xbd\x2e\xb2\xf3\x03\xd1\x1b\x92\xf3\x7b\x88\x96\x1a\xde\xbb\x26\x6e\x5a\xa0\x3d\xa4\x79\x6f\xce\xc6\xa6\xfc\xb6\xcc\xe7\x0d\xd2\xbf\xca\x63\xa9\x16\x1b\xce\xe9\x4b\x4f\xbb\x47\x60\x15\x7f\x9b\x2e\x8c\x29\x61\xbe\x1a\x75\xe5\x0c\xd9\x13\xbb\x52\xc0\x2d\x04\x28\xfb\xb9\x30\x6d\x59\x08\x4d\x0e\x7a\x47\xbd\xc3\x15\xbb\xde\x52\xfd\xe2\x9b\xd2\x9d\x0c\x0b\xf6\x65\x58\xfd\x0e\xa2\x5e\xdc\x27\x4c\x7b\x1a\x6d\xeb\x06\xe0\xaa\x5c\x9e\x5a\x9f\x28\x41\xb4\xa4\x31\x73\x9a\x13\x7e\x8b\xdd\xef\x65\xee\x8a\x06\x1c\xf4\x3e\xf6\xfa\x04\x74\x74\x48\xee\x04\xef\x69\x5c\x3e\x56\xd8\xc8\x55\x69\xa2\x85\xc8\x09\x07\x70\x19\xd3\xa1\x5c\x86\x21\x74\x44\xe4\xb6\xeb\xcd\x8c\x6a\x9f\x1f\x77\x7e\xcf\xb4\xef\xf4\x20\x26\xe4\xb5\x6d\xba\x63\xbb\xcc\x53\x85\x1d\x1a\x8f\x66\x40\x13\x3d\xb3\xc1\x17\x5c\xf0\xc1\x3f\x41\x0a\xcc\x9c\xe3\xee\x97\xa6\x7e\x88\x76\x7a\xd1\x93\x76\xfa\xd1\x93\xb6\x24\x72\x43\x7b\xbf\xaf\xdf\xf5\x91\xac\xeb\x8d\xff\x7d\xa5\xed\x23\x12\x7f\xad\x33\x1f\x12\x53\x2a\x3d\xb1\x07\xb4\xa3\x1d\x27\x60\xa3\x9e\x8d\xa4\x45\x12\xd6\xb4\x77\x23\x59\x6d\x70\xbb\x5b\xd3\x46\xf2\xb3\xc8\xb1\x21\x1d\x1d\x27\x0b\x72\x47\xb9\xf6\xc9\x76\xaf\xcc\x54\xaf\x0c\x79\x32\xd8\xf0\x77\x6c\x0c\xaf\x90\x7a\x00\xad\x5d\x62\xcb\x8f\xd6\x9c\x53\xa5\xb5\xb5\xcb\x07\x72\xa5\x45\xea\xfa\xe1\x2f\x27\x20\xba\x93\x31\xb4\x3d\xe3\x51\x3a\x36\x32\x57\x66\x29\x9c\xbb\xe7\xc5\xd1\xaf\x15\xba\x61\xe1\x5e\x29\x45\x1f\x95\xc1\x56\x6e\x58\xc2\xb8\x05\x96\x6d\x35\xd8\x12\x2d\x6d\x21\xa8\x80\xb4\x18\x58\x40\x9a\xa5\x33\x2e\x4f\x84\xce\xb2\xe6\x31\x54\xad\xc5\x2a\x90\xd6\xfc\xf1\x64\x9d\xf1\xd2\xe1\x8c\x8d\x9c\x6d\x09\x88\xad\x7a\xc1\x49\xf3\x84\xc9\xf2\x78\x18\x00\xed\x6c\x3e\x69\x13\x02\x59\x0b\x21\xd3\xab\x01\xd3\x2b\xcd\x74\x91\x4c\xd8\xba\x4d\x7b\xc3\x65\x9a\x76\x16\x26\xeb\xb3\x85\x25\xe1\xa1\x59\xec\xf3\xe8\x2e\x4c\xda\x0b\x6d\x6c\x3b\xb0\xb1\xd5\xb0\xc6\x4f\x1a\xd4\x88\xa9\x14\x8d\xa9\x48\xd5\xa6\x8e\x53\x1a\x0c\x30\x7a\x9b\xd1\x38\x9d\xec\xe7\x8c\x42\xbe\xa1\x45\xd5\x8a\x6a\x8e\xda\x5e\x9c\xb1\xc6\xdd\xec\xc9\x0b\xe9\x68\x4f\x3a\x4d\x69\xc3\x68\x5d\x53\x7a\xa2\x4e\xf7\x64\xbf\xf9\xd2\x33\xed\x7a\x4f\x3a\xbe\x54\x9f\x2f\x65\x12\xae\xb5\xc8\x5a\xf2\x84\xd8\xc9\x36\xf8\x41\xc6\x30\x11\x12\x96\x1d\x21\x25\xc7\x46\x9c\x83\x2b\x4b\x79\x32\xba\x08\x26\x28\x51\x71\x5e\xd8\xb0\x44\x5f\x8b\x32\x61\x73\xe0\xa0\xd4\x11\xba\x3c\xf2\xcc\xb5\xd7\x77\x5d\x64\xfb\xe6\xed\x20\xcd\x6c\x35\xc7\x10\xea\xef\x7a\xd8\xe2\x97\xa0\x6d\x19\xc6\xe0\x7f\x71\x16\x55\xbf\xfc\x65\x57\x49\x24\xa9\x9a\xd9\xfe\xae\x70\xcf\xb4\xeb\x51\x2c\x81\x2a\xc1\xad\xb1\xb7\xd4\x6a\x96\x29\x92\x51\xa5\x8a\xa2\xd8\xee\x21\xf6\xa6\x91\x2d\xa4\x5b\xbe\x61\x2a\x69\x04\x24\x03\xc9\x44\x4c\x30\xe7\x36\x16\x77\x9c\x8c\x61\xca\xb8\xf2\xf0\x33\x13\x79\x40\x1b\x76\x03\x68\x1b\xf6\xf5\xca\x86\xe4\xaa\x52\x28\xc4\xa5\xf0\x44\xa2\x38\xd1\x6e\x15\xcb\x4e\x26\x8c\x9a\x44\xf0\xda\x26\x2b\x61\x63\xca\x7d\x67\x1e\x59\x74\x0b\xde\x26\xdb\x1a\xc9\xff\xb6\x11\x3a\x58\xfe\x93\x46\xb3\x66\xee\xdb\xce\x3d\xb5\xe5\xe8\xdc\x53\xbb\x8d\xce\x3d\xd5\xb9\xa7\x36\x8f\xbd\x33\xef\x76\xee\xa9\x4e\xe9\x5a\x1e\x9d\x7b\xaa\x73\x4f\x6d\x18\x7b\x47\xbf\x3a\xf7\xd4\x16\xa3\x73\x4f\x6d\x39\x3a\xf7\x54\xe7\x9e\xea\xdc\x53\x9d\x7b\xea\x0b\x32\x03\xfa\xd1\xb9\xa7\x56\x26\xe9\xdc\x53\x25\x60\x74\x9a\xd2\x9a\xd1\xb9\xa7\xd6\x8c\xce\x3d\x55\x1a\x1d\x5f\xaa\xc1\x97\xbc\x73\x67\x64\xf4\xb2\xe6\x4d\x75\x51\xbb\xc3\x7a\x7e\x2f\x34\xad\xa9\x89\x8d\x7f\xaf\xed\xfb\x7b\xe2\x43\x69\xc1\xa6\xdf\xd9\xf3\x5f\x9c\x3d\xbf\x1d\x5b\x58\x0b\x76\xb0\xc6\xa4\xdc\x79\xcd\x6f\x66\x12\xd4\x4c\x24\xb5\x11\xbd\x82\xe4\xef\x18\x67\x69\x9e\x1a\x9c\x53\x06\x9f\xd9\x3c\xb8\xe7\x55\xd1\xa0\x18\xbd\xf6\xd6\x24\x67\x2e\x64\x31\x60\x35\x4e\xca\x12\xb3\x8d\x98\x3f\x39\xa3\x28\x13\xab\x3c\x8a\x00\xb0\x93\x56\x59\x5d\xf8\xd3\x30\x3c\x29\xf4\x76\x78\xd3\x8c\xde\x34\x63\xb2\xb6\x5e\x26\xce\xf2\xa7\x3f\xd6\x9a\xa3\xa1\x3b\xe5\xf3\xbb\x52\x5a\x20\xd3\xcd\x15\x83\x46\x4a\x41\x1b\x5c\xa2\xa9\x32\xf0\xdc\x5c\x26\xad\xb9\x0e\x5b\x70\x95\xec\x91\x9b\x64\x6f\xd8\xc2\xbe\xb8\x46\xf6\xb0\x14\x68\x0b\x96\xfc\x36\x5c\x21\xed\xb9\x41\x3e\x41\xc5\xcc\x4f\xe3\xfe\x68\x51\xed\x6c\xc9\xed\xf1\x39\x5c\x1e\xad\xbc\x75\x53\x57\xc7\xe7\x73\x73\xb4\xf3\xba\x0d\xcd\x48\x2f\xc2\xb5\xd1\x82\xf9\xa8\x4d\xd3\x51\x6b\x66\xa3\x4f\xe6\xca\x68\xee\xc6\xd8\x03\x17\x46\x63\x20\xdb\x36\xfe\xc9\x19\x24\x74\x71\x0d\x91\xe0\x71\x6d\x0e\xb3\x54\x42\x2d\x9c\x1f\x65\xa7\x75\x3a\x5a\x35\xd0\x77\x46\x5d\xa5\x58\x88\x7d\xec\xb2\x37\xe9\x39\x81\x02\xad\x71\x76\x95\x75\xea\x30\xdd\x09\x79\x9b\x08\x1a\xab\xa3\x4c\xd8\xff\x15\x61\xbc\xa5\xf8\x5d\xfb\xac\x66\x01\xbc\x4f\xad\x0c\xda\xa8\xe7\x36\x37\xf1\xef\xe2\x8e\x88\x89\x06\x4e\x0e\x18\xf7\xfb\x78\x58\x52\x03\x0b\xcd\x3c\xa0\xb5\xf9\xf5\xcd\x6b\x7f\xf1\xcb\x53\xb9\xd1\xb8\xa0\xd4\xa7\xb7\x80\xb8\x07\x3d\x6e\x02\x71\x17\x4e\xf2\xa4\x6a\x06\xb1\xa6\x91\x2a\xbd\x79\x53\xd4\xba\x7c\x83\xf3\x86\xd3\x46\x79\x4c\x5c\x86\xc4\xcb\xdb\xb4\xc6\x0e\xda\x97\xe0\x9c\xed\x6c\x2f\xa4\x6d\xdb\xcb\x13\x39\x61\xf7\x50\x6a\x7e\xa6\x8e\xd7\x4e\x6a\xde\x61\x68\x96\x82\xc8\xf5\x67\x11\x13\xef\x66\x2c\x9a\x95\xb9\x1e\x4b\x41\x11\x91\x2f\xc9\xcf\x6f\xdc\x6d\x6b\x59\x56\x27\x2b\xae\x1d\x75\x2d\x40\x9b\xdb\xd9\xaf\xfa\xc6\x4b\x9d\x0c\xa9\x22\x94\x9c\x5d\x5e\xff\xfe\xf6\xe4\x3f\xcf\xdf\x0e\xc9\xcd\x8c\xd9\xd6\x41\xe1\x40\xe7\x9c\xfd\x4f\x0e\x84\xa6\xc2\xf0\xcc\xa4\xec\x62\xef\xa3\xe8\x5f\xfa\x02\xe5\x94\x76\x9d\xf1\x35\x0f\x1b\xb6\x5d\x6d\x1e\x72\x80\xcd\x5b\x3f\x7d\xc4\xc1\x53\xb7\xa3\x08\xed\xf4\xcc\x0b\x97\xdb\x51\x50\xc2\x41\x9b\x93\x67\xb9\x85\x6d\x4f\xc2\xf8\x34\x29\x33\x8a\x7a\xe4\xaa\xa9\xbc\xd3\x54\xda\x19\x14\x6f\x30\xaa\x2b\xf4\xb4\xd2\x16\xa3\x58\x43\x4b\xc5\xe4\x0b\xaa\xed\x59\xbc\xed\xf6\xe7\x59\xbc\xed\x0f\x76\x31\x22\x34\x8e\x25\x28\xe5\x4e\x7d\xba\xd4\x54\x0a\x6f\xb6\x86\xb6\x3e\x79\x4d\xfe\x46\xee\xc9\xdf\x90\xe5\xff\xa5\x69\xe9\xfd\xa6\xcc\xb8\xb9\xca\x61\x25\xcd\x8b\x51\x4b\x10\xff\x69\x46\x35\xce\x68\xa0\x6a\x54\x40\xc6\x63\xd7\x66\x51\x83\xe4\x34\xf1\x3b\xf1\xa4\x4d\x0b\xcc\x02\x3f\x23\x9a\x59\x7b\xda\xc5\xa4\x5c\xd5\x5b\xef\x88\x68\xe6\x76\x23\xbb\x5f\x3a\x2a\x54\xad\x11\x5e\xcc\x96\x52\x1d\xcd\xaa\x64\xcc\x08\x18\xaa\xc2\x9c\x62\x81\x64\xdc\xc6\xa6\xcc\x58\x03\xef\xe0\xfe\xa0\x71\x33\x87\x51\x65\x3f\x1f\xda\xa9\x25\xa1\x1e\xf9\xbc\x13\x0c\x4a\xb5\x05\x32\x11\x0f\xc9\x39\x8d\x66\xb8\xac\xb8\xc4\x33\x8c\x5a\x85\x93\xcd\xe8\xdc\x6c\xbc\xbb\xd7\xd6\xd4\x47\x69\x25\x98\x51\x10\x97\xcc\x79\x8a\x28\xb7\x5d\xad\x26\x20\xa5\x0d\x27\x1a\x2f\x88\xeb\x68\xde\x78\xf3\x1a\x9d\xa4\x4c\x0a\x2d\x22\xd1\xa0\xaf\xc2\x72\x64\x23\x4e\x87\x40\xb0\x06\x09\x6f\x07\xfa\xf1\x6c\xd4\x27\x37\xa7\x23\x2c\x88\x7f\x7d\x7a\x33\xaa\x4a\xd8\xaf\x6e\x4e\x47\x0d\xfa\x73\xb7\xa2\xcf\x38\x15\xfa\xd8\x2c\x73\xe7\x49\x24\xd0\x98\x75\x31\xa2\xdb\x8f\x2e\x46\x74\xf3\xe8\x62\x44\xbb\x18\xd1\x2e\x46\xf4\xe1\xd1\xc5\x88\xba\xf1\xf4\xa6\x1e\xd2\xc5\x88\xd6\x1c\x2f\xcb\x4f\xd1\xc5\x88\xee\x34\xba\x18\xd1\xd5\xd1\xc5\x88\x6e\x18\x5d\x8c\xe8\x86\xd1\xc5\x88\x76\x31\xa2\x5d\x8c\x68\xe7\xed\x7e\x74\xae\xfd\xf4\x76\x93\x2e\x46\xd4\x8d\x2e\x46\xf4\x45\xf8\xfd\x49\x17\x23\xba\xd5\xe8\x62\x44\xbb\x18\xd1\x3a\xa3\x8b\x11\xc5\xd1\xd9\x5e\xba\x18\x51\x3f\xba\x18\x51\x3b\xbe\x1c\xa9\xb9\x8b\x11\x7d\x11\xb2\xa2\x6f\x84\xd1\x3c\xc0\xf1\xca\xcf\xb4\xbd\xcb\x9c\x9c\xaf\xf9\x16\x55\x26\x95\x99\x49\x64\x31\x65\x22\x81\xc6\x0b\x9c\x32\x42\x93\x6b\x41\x40\x9f\xa1\xe7\x3d\x61\x29\xab\x17\x53\x4a\x56\x0e\xcd\x5b\x9c\xab\x64\x9e\x35\x60\x49\xe9\x3d\x1e\x00\x9a\x8a\xdc\xf6\xdd\x88\x44\x9a\xe5\xba\x0a\x53\xdc\x9e\x3a\x2d\x33\x26\x6c\x9a\x4b\x6c\xc4\x71\x64\xbb\x7b\x0c\xdc\xf4\x83\x30\xfd\x20\xec\xe8\xd1\x13\xca\x28\x34\xf6\x1e\xe6\x51\x0b\xe2\x42\x46\xb5\x06\xc9\x8f\xc9\x7f\x1d\xfc\xfa\xcd\xc7\xc1\xe1\xb7\x07\x07\xbf\xbc\x1e\xfc\xf5\xb7\x6f\x0e\x7e\x1d\xe2\x1f\xff\x7a\xf8\xed\xe1\x47\xff\xe1\x9b\xc3\xc3\x83\x83\x5f\x7e\x78\xf7\xfd\xcd\xe8\xfc\x37\x76\xf8\xf1\x17\x9e\xa7\xb7\xf6\xd3\xc7\x83\x5f\xe0\xfc\xb7\x2d\x27\x39\x3c\xfc\xf6\xeb\xda\x4b\x6e\xcc\xd3\xda\xe3\x68\x2d\xf1\xb3\x4f\xc2\xcd\x9c\x7b\xa7\xa5\x23\x79\xe5\x66\x5b\x3e\x94\x8e\x2b\x3d\x74\x28\xbd\x50\x8d\xe1\x8a\x61\x1e\xa6\x88\x48\x99\xd6\x8e\x98\xd2\x72\x60\x07\xd3\x15\xa9\xd2\x91\x03\x6c\x56\x44\xb5\xed\x06\x14\x82\x22\x4a\x41\x79\x42\xcf\x40\xde\x31\xe5\xbb\x2c\x05\x85\x03\x8f\xf5\x20\x86\x09\xe3\xe0\x0c\xd9\x1d\x89\xd8\x7a\x74\x24\xe2\x25\x92\x08\x05\x51\x2e\x99\x5e\x9c\x0a\xae\xe1\xbe\x96\xa6\x54\xb5\x0f\x57\xe7\xf3\x71\x52\x2f\x30\xc6\x10\x5f\x69\x24\xd9\x9c\x25\x30\x85\x73\x15\xd1\x04\x89\x42\x3b\x84\xf6\x64\xc3\xec\x08\x33\x29\x12\x45\xee\x66\x80\x4d\xc8\xa8\x79\x13\x54\x3c\x23\xca\xc9\x94\x32\x4e\x52\x43\xd3\x32\x7f\xb3\x21\xd1\x86\x0c\x6a\x45\x8c\xec\xc9\xb5\xbf\xc1\xa5\x34\x8c\x85\x48\x5c\xe0\x5c\xb2\x28\xe6\x77\x4d\xe1\xb8\xf8\x9d\xc3\xdd\xef\x66\x36\x45\x26\x09\x9d\xda\x0e\x6a\x63\xc0\x18\x82\x65\x5d\xb7\x98\x7a\xe3\x0b\x60\x54\x5a\x0e\x84\x26\x77\x74\x81\xaf\xb1\x3c\x07\x53\xc7\xe4\xcd\x21\xc6\xd6\x51\x45\xc2\x1c\x31\xf9\xe3\x21\x5a\xd2\x4f\x4f\x46\xbf\x5f\xff\x7c\xfd\xfb\xc9\xd9\xbb\x8b\xcb\x66\xf4\xd5\xbc\x3b\x50\x5e\x6b\x8e\x88\x66\x74\xcc\x12\xd6\x84\xac\xae\xf8\x5a\xcb\x93\x22\xff\x8a\xe3\xa3\x58\x8a\xcc\xc2\x49\xe6\x9c\x33\x3e\xad\x68\x1a\x67\x4b\x86\x17\xc7\x32\xed\xf6\x4c\xaa\x13\x4e\x25\xe5\xe8\x83\x58\x2c\x81\x5c\xe6\xdc\xa8\x9e\xcf\x3c\x2c\x95\xc6\xed\x85\xa4\x9e\xc4\x31\xc4\x15\xe8\xbd\xb8\x10\x98\x53\xff\x72\x8b\x22\x9b\x8d\x8c\xde\x5f\x5f\xfc\x9f\x25\x34\x5c\x64\xcd\x3c\xfe\xed\x44\xd0\xcb\xfa\xfd\x3b\xc9\xaa\x4a\x9f\x8a\x79\xb7\xbf\xfb\xb2\xbf\x81\x57\xb5\xe3\x67\xba\xca\x79\x99\x9d\xf0\xd2\xfc\x24\x15\x31\x0c\xc9\xc8\xb2\x29\x50\x4b\xbf\x96\xb3\x74\x25\x10\x73\x09\xd7\x0c\x1b\x85\x1a\xf5\x65\x4e\x13\xb0\x81\x84\x18\x4a\x5e\xc9\xe1\x2a\xd3\xe1\x09\x4d\x54\x43\x62\xda\x84\x33\x19\x26\xfc\xce\x68\x62\xad\x40\x33\xcc\x46\x62\xe0\x42\x3b\x95\xcf\xac\x12\xd3\xda\xa4\x88\x88\x55\xfb\x4a\x41\x01\x15\xee\xe2\xda\xc7\x7a\xc6\xc4\x94\x87\xd5\x28\xcc\x6c\xed\xa0\xb9\x02\xb5\x9e\x31\x15\x8a\xa0\x99\x5d\x02\x8d\x31\x23\x23\xa3\x7a\x66\x7d\x7a\x29\x55\xb7\x10\xdb\x2f\x9c\x5c\xe3\x14\x4e\xe5\x5a\xc9\xba\x47\xdd\x98\x75\x4f\x80\xea\x5c\x82\x95\x67\xac\xa7\x11\x38\x1d\x27\x50\x3b\xfe\xb3\xf1\x11\x30\xef\xf4\x9e\x27\x8b\x2b\x21\xf4\x77\x21\x13\xa1\x95\x0d\xfc\xc9\x49\x8a\x98\xad\x56\x0d\x4a\x40\x17\x5c\x3c\x40\x60\x22\x4a\x97\x93\x20\xce\x8a\x0d\x7b\x62\x84\x96\x39\x3f\x51\xdf\x4b\x91\xb7\xd3\xc1\xd9\x60\xe3\xf7\x17\x67\x78\x8e\x73\x7b\x86\x81\x6b\xb9\xc8\x04\x5b\xd7\xca\x37\xc8\xb4\x3f\x1a\xfc\x5c\xc2\x48\x23\x27\xe7\x5c\x81\x1e\x92\x77\x74\x41\x68\xa2\x84\x17\x8e\x19\x27\x23\x8c\x54\x28\x6b\x44\x43\x82\x39\x84\xf6\xe7\xb1\xd0\xb3\x15\x95\xc9\xa0\xf3\xea\x7d\x36\xcf\xc5\x9a\xfd\x8b\xca\x04\x8c\xaf\xdc\xae\xe9\x2d\x28\x92\x49\x88\x20\x06\x1e\x35\xdc\xb5\xd6\x2c\xf8\x7f\xf9\x73\xfd\x9d\xbf\x14\xdc\x1c\x8b\x56\xf6\xfe\x82\xc7\x2c\xa2\x96\x8a\x51\xbd\xb4\xd3\xe8\x7b\x73\x7a\x07\xc5\x04\x19\x3c\x14\xb9\x02\x89\x66\x2b\xa3\xb8\xd8\x8d\xf8\x21\x1f\x43\x02\xda\x2a\x43\x98\xa1\x4b\xb5\xcd\x4c\x62\x29\x9d\x02\xa1\x3a\x20\x8a\x16\x04\xb8\xca\xb1\xa7\x35\xd5\x68\xd5\x12\x50\xa4\x0f\x51\x45\x7e\xbc\x38\x23\xaf\xc9\x81\x79\xd6\x21\x6e\xff\x84\xb2\x04\xc3\xb4\x35\x95\xcb\x6b\x64\x13\x3f\x05\x2e\x09\x71\x8f\x08\x69\x8f\x68\x9f\x70\x61\xdb\x86\xbb\x35\x19\x8d\xcb\x2b\x6c\x2e\x9a\x05\x0d\xe3\x2f\x10\x55\x1b\x13\x98\x1f\x15\xc8\xd6\xe8\xcb\x8f\x35\xe8\x4b\x59\x84\x30\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\xee\x14\x39\x87\x2f\x71\x4b\x9f\x9a\xfa\x28\x78\xcb\x78\x7e\x6f\xc3\x1f\xda\x53\xf2\xaf\xcf\x71\x5a\xdb\xa2\xff\x5e\x3b\x09\x84\x66\x59\xc2\x0a\xff\x5f\x29\x7e\xe0\xa2\xb2\xd5\xcb\x1d\xed\x3d\x9d\xc1\x63\xee\xdd\x88\x86\xb3\x53\x1e\x8b\x74\xe5\x61\x68\x82\xa3\xd1\xac\xfc\x80\x17\x89\x3c\x4f\x6e\x8e\x48\x60\x0e\x0d\xb2\xdf\x97\x10\xe7\xad\x99\xcd\xc8\x62\x7e\x43\x71\x7a\x92\xd0\x31\x24\x96\xb3\x58\x04\x52\xab\x08\xf4\xd4\x31\x38\x52\x24\xed\x45\x20\x5f\x89\x04\x03\x1f\x68\x00\x84\x99\xfe\x59\xc0\x01\x27\x69\x0b\x0e\xa8\xc8\x54\xe0\x80\x2a\xd9\x73\x80\x43\xde\x80\xd1\x92\x65\x38\x18\xae\x5d\x85\x03\xb2\xce\x7d\x87\x83\x82\x28\x12\x69\x36\x92\xc2\xa8\x5c\xad\xb1\x16\x37\x2d\x11\x96\x65\x79\x9d\x1c\x0d\xbe\x65\xed\xcf\xd6\x9c\x59\xba\x98\xa2\xdb\x40\xcc\x59\x0c\xb1\x91\x60\x91\xc6\xfb\x60\xbe\xff\x55\x62\x39\x48\x7a\x96\xf9\x90\x9f\x45\xcc\x41\x4a\x9f\xa7\x6f\xee\x74\x3f\x3c\xf3\x64\xda\x06\x56\xb2\x56\x98\x89\x88\x68\x82\xc5\x89\x9a\x61\x0c\x59\xc6\x9a\xe5\x89\x09\x0b\x1a\x12\xba\x96\xf0\x3b\xef\x34\xc7\x3a\x35\xf8\x8d\xb3\x7d\x71\x11\x43\xa9\x06\x46\xae\x8c\x28\x7a\x63\xe3\xd9\xf0\x3a\x1f\xce\x68\xb8\xba\xf3\x9d\x43\x5c\xb9\x5b\x0b\x57\xff\xe0\x5d\x28\x79\x64\x16\x08\x3c\x66\x7c\x8a\x16\x9d\x3e\x91\x90\x50\x0c\x17\x77\x67\xf8\xd6\xaa\x5f\x3d\xc4\x68\x3f\xa9\x47\x67\xff\x68\x94\x84\x98\xe0\x6e\x66\x34\x72\x78\xf9\x66\x62\xa9\x25\x53\xe4\xd5\x5b\x0f\x80\x06\x35\x62\xf6\x91\x41\xbc\xb2\x6f\x18\x76\xd3\xda\xd8\x6e\x19\x8f\x5d\x1c\x62\x05\x58\x5e\x49\x74\x52\xe8\x90\x7c\xc0\xb2\x53\x25\xd2\x70\x4c\x7e\xe5\x24\x00\x8b\x0c\x6a\xa3\xc7\x95\x15\x58\xbd\x79\x69\xf0\xb0\xc9\x2f\x3c\x64\x79\x9a\x1f\x39\xee\xbd\x79\xee\xc0\xa8\xbd\xab\xd7\xf9\x77\x79\xf5\x94\xfb\x7a\xc7\x78\x2c\xee\x54\xdb\x3a\xc4\x4f\x76\x5a\x2f\x50\x47\x06\xad\x35\xe3\x53\x55\xd6\x23\xaa\x95\x28\xd7\x2b\x12\x7e\x87\x27\x52\xd8\x44\x97\x55\x01\x3e\x20\x87\x05\x7c\xa7\x04\xec\x30\xa6\xa9\xa2\xa7\xd2\xbc\x8a\x66\x34\xb9\xce\xea\x17\x26\x22\xcb\x68\xf0\xfd\xbb\xeb\x93\xea\xd4\x86\x9e\xdd\xcd\x40\x5a\xde\x6b\x7e\x27\x34\x4e\x99\x52\x68\x06\x82\xf1\x4c\x88\x5b\x72\xe0\xe3\x9c\xa6\x4c\xcf\xf2\xf1\x30\x12\x69\x29\xe4\x69\xa0\xd8\x54\x1d\x39\xa4\x1d\x98\xd5\x1f\x12\xc6\x13\xc6\x4b\xa6\x79\xac\x7a\xe9\xcc\x18\xf8\x90\x28\xac\x02\xf7\xd6\x55\x36\x73\x5e\xe6\xd5\x65\xda\x5a\x66\x0c\x92\xa7\x2f\xb7\xb0\xba\x3d\x97\x0d\x33\xc7\x1f\xd9\x22\x7c\x77\x57\xe7\xa8\x9c\x44\xb0\x16\x8e\x56\x7a\x7b\x72\x20\x05\xeb\x58\xab\xb0\x41\x2b\x99\x9b\xd4\x10\x02\x4f\xd1\x9a\x58\xcd\xcc\x25\x9f\xca\x72\xf6\x3c\xc8\x1e\x69\xba\xe9\x2e\x3b\xae\x2b\x35\xb7\xdd\xe8\x4a\xcd\x6d\x1e\x5d\xa9\xb9\xae\xd4\x5c\x57\x6a\xee\xe1\xd1\x95\x9a\x73\xe3\xe9\x33\xc6\x48\x57\x6a\xae\xe6\x78\x59\xe9\xce\x5d\xa9\xb9\x9d\x46\x57\x6a\x6e\x75\x74\xa5\xe6\x36\x8c\xae\xd4\xdc\x86\xd1\x95\x9a\xeb\x4a\xcd\x75\xa5\xe6\xba\xa2\x19\x8f\xce\xb5\x9f\x45\x33\x48\x57\x6a\xce\x8d\xae\xd4\xdc\x8b\x28\x1f\x42\xba\x52\x73\x5b\x8d\xae\xd4\x5c\x57\x6a\xae\xce\xe8\x4a\xcd\xe1\xe8\x6c\x2f\x5d\xa9\x39\x3f\xba\x52\x73\x76\x7c\x39\x52\x73\x57\x6a\xee\x45\xc8\x8a\x4a\xc7\xac\x56\xdd\x8f\x6d\xd2\x34\x9d\xd7\xb7\x94\xd8\x31\xce\x27\x13\x90\x28\x6c\xe0\x93\x57\x3c\x8c\xa1\x9c\x03\xe6\xac\x99\xe9\x9c\x0f\x51\x81\xee\x63\xc6\xa7\x0b\xf7\xda\x70\xbb\xcb\x24\xc1\xfa\x1c\x12\x14\x66\x39\x72\x72\xfe\xfe\xbb\x76\x72\x42\x9b\xa5\x6b\xe1\x9a\xdf\xf3\xa8\x79\x70\x42\x01\xf0\x75\xe1\x87\x0e\xee\x51\x22\x94\xf5\x03\x5b\x60\x45\x33\xca\x39\x78\xc1\x90\x69\x54\xb8\xc6\x00\x9c\x88\x0c\xb8\x8d\x7a\x0a\xed\x7f\xa9\xd6\x34\x9a\x0d\xcd\x93\xb8\x07\xb6\x2b\x7f\x52\xcc\xa8\xb4\x04\x9a\x5a\xa0\x4b\x48\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x38\x97\x8d\xe6\x0b\xc0\x40\xd7\x31\x58\x47\x2d\x26\x29\x86\xa7\xb9\x65\x89\x72\x4a\x3c\x8a\xa5\x7d\x2c\xa1\x95\x66\x7a\x41\xcc\x2b\x27\x36\xda\x80\x49\xa5\x49\x94\x30\x94\x9a\xf0\x89\x36\x72\x1e\xe7\xeb\xa3\x50\xab\xb1\x14\x09\xae\x54\xb9\xa5\xf2\x18\x59\x52\xa6\x15\xc1\x10\x9b\x62\x42\x37\x55\xcc\x94\x63\xe1\xaa\x4f\xa8\x4f\xf8\xb6\x80\xf6\x2b\x45\x50\xc7\x38\x99\x9f\xdd\x7d\x55\x9a\xae\x54\x25\xc6\xe0\xa6\xd5\x74\x0b\x44\xc7\x8c\x6e\x8f\x9c\xfd\x72\x3d\x31\x1f\x30\xe4\x33\x3f\x57\x8e\x01\x6e\x00\x87\xb9\xc1\x01\x88\xc0\x68\x0c\x74\x03\xd6\x7f\x76\xa4\xd7\x54\x4e\x41\x87\xd6\xad\x75\xe3\xb0\x56\x5a\x99\x82\x0b\x50\x2a\xcb\x18\x05\xc4\x10\x38\x23\x11\x63\x68\xa1\x4b\x97\x35\x38\xb3\xa6\x59\xba\x5d\xa0\xcb\xf4\x5f\x77\x81\x0f\x21\xb5\x61\x0c\xe1\xa1\x2a\xa3\x11\x28\x72\x70\x31\x3a\xed\x93\xd1\xc5\x99\x8b\x55\x10\x93\x75\xf9\x0a\x8e\x84\x59\x04\xdc\xd4\xb6\x9d\x29\xff\x8c\xbb\x19\xd5\xb8\x9d\xa5\x07\x51\x69\x4e\x36\x95\x2e\x08\x29\x34\x64\xbd\x14\x1a\xd6\x65\x04\x7b\x6a\x80\xa2\x92\xd3\x2f\x1c\xa6\xd9\x1a\x02\x9f\xbd\x69\xbb\x06\x99\x32\x8e\x81\xed\xef\x40\x29\x3a\x85\x51\x4d\xe3\xf4\x26\xc1\x1b\xed\xd3\xc5\x19\x45\xaa\x90\xd8\x38\xfd\xf0\x4d\x11\xcd\xd2\x53\xe5\x25\x91\xd4\xae\x29\xec\xf7\x9d\x64\x5a\x03\x9e\x6f\xac\x12\x81\xfe\xad\xe5\x4c\x9c\xde\x52\x4c\xcc\x3b\x3f\x49\x71\xb3\xe1\xef\x3c\x76\x1d\x6e\x81\x8c\x25\x83\x09\x99\x30\x0c\x7b\xc1\x40\x94\xbe\xcd\x7b\xa6\x56\x71\x54\xca\xa8\x35\x82\xfb\xb0\x07\xbf\xae\x21\xf9\xc9\x2d\x4c\xcb\x9c\xdb\x82\xab\x2e\x4e\x15\x63\xd5\xd9\x84\x4c\x31\x90\x45\xda\xaa\x59\x7f\x7e\xfd\xd7\xbf\x90\xf1\xc2\x48\x37\x88\xda\x5a\x68\x9a\x84\x97\x4c\x80\x4f\x0d\xac\x2c\xa5\xae\x46\x5b\x07\x08\x60\x49\x54\xbb\xf0\x37\x7f\xbc\x1d\x57\xc5\xad\xa3\x18\xe6\x47\x25\xf8\x0d\x12\x31\x1d\x92\x53\xca\x0d\xae\x8f\x81\xe4\x59\x8c\x56\xba\x3a\xc2\x51\xdb\x68\x26\x12\x16\x2d\x9a\x93\x1d\x97\x90\x40\x66\xe2\xce\x56\x12\x59\x83\x3d\x45\xa8\x5b\x26\xb2\x3c\xb1\x86\xca\xef\x42\x9e\x42\xae\x60\x35\x18\x79\xed\xb9\x40\xd3\x9a\x9b\x62\xe9\x68\xbb\xf8\x25\xff\x48\xe1\xe2\x3a\x9d\xf1\x27\xe4\xe1\x9b\x33\x4e\xbe\xa3\x49\x32\xa6\xd1\xed\x8d\x78\x2b\xa6\xea\x3d\x3f\x97\x52\xc8\xea\x5a\x12\x6a\x18\xe7\x2c\xe7\xb7\xb6\xfe\x65\xc8\x95\x12\x53\x23\x65\x67\xb9\xf6\x25\xd5\xd6\xbd\xb0\xcd\xbc\xf1\xfc\xd8\x71\xd9\xd2\x2c\x70\x8f\x38\x74\xc7\x0c\xba\x71\x02\xe6\xf9\x16\x23\xcb\xf3\xab\x32\xb2\xfd\xf1\xf5\x9f\xff\xdd\xa2\xae\xd1\x22\xff\xfd\x35\xc6\xb8\xa9\xbe\x3d\xc4\x48\x17\x8d\xcc\x90\xd2\x24\x31\xe4\xb5\x8c\x94\x06\xd0\xeb\x90\xf0\xb3\xe3\xa0\x6e\x8e\x6e\x5b\x4b\xd5\x37\x37\x3f\x23\x4b\x60\x5a\x41\x32\xe9\xdb\x88\xe0\x50\x43\xa6\x87\x32\x42\xcf\x51\x1f\x23\x62\xed\x83\x2c\x3c\x17\x49\x9e\xc2\x19\x60\xb3\xef\xc6\xa0\xaa\xcc\xe6\x03\x24\x13\xa6\x30\xf8\x7a\x9c\x88\xe8\x96\xc4\xee\xc7\x52\xb4\xc2\x72\x2d\xb9\xfa\x50\xa8\x1b\xb7\xd1\x20\x5e\x63\xe3\xfb\x57\x22\x35\x52\x9a\x65\x8c\x4f\x0d\x18\x28\x91\xf4\xae\x02\x0c\xdf\xdb\x9d\x36\x4d\x2c\x6d\x6c\x4d\x6c\x6a\x4b\x1c\xb8\x37\x32\x74\xb3\xf6\x14\xb5\x23\x15\x9a\x9b\x22\x8b\xd5\xb7\xd4\x72\xbe\x98\xd0\x9f\x86\x0c\xff\xb6\x51\xb8\x2b\xe2\x72\x10\x1f\x03\x62\x58\x01\xc0\xa0\x0f\x92\xe4\x27\xed\x41\xdf\x2c\x4c\xa5\x02\x17\x1e\x8c\x87\x29\xd5\x4e\x20\xf4\x1a\x04\x25\x19\x48\xc5\x94\xe1\xcb\x1f\xf0\x40\x9d\x26\x94\xa5\x5e\xe6\xcf\x44\xfc\x34\x40\xb0\x87\x1b\x4b\x80\x35\xa7\x94\x23\x11\xbb\x09\x91\x14\xda\xf2\x67\x6b\xc4\xda\xaa\x54\xdb\x22\x43\x7d\x6a\x52\xf9\xa1\x80\x66\x95\x52\x9a\x6f\x02\xa9\xb4\x57\xbd\x24\x02\x89\xef\xf7\x5c\xe9\x63\x58\x7c\x4b\x64\x00\x09\xa3\xdb\xdc\x2a\x25\xac\x28\x8f\xf6\xa0\x94\x44\x7a\xa7\x07\x0e\x89\xf5\x9c\x9a\x33\xe1\x6e\x25\xbd\xe3\xde\x93\x12\x49\x0b\x22\x29\x32\x3a\x6d\x54\xcc\x79\x09\x52\xcb\xd3\x92\x18\xac\x12\x00\x0a\xd5\x20\xfc\x3d\xd4\x5f\xc0\xab\x20\x2e\x32\x72\x31\xdf\xda\x3a\xc1\x3c\x80\x9d\x82\x80\xb5\xee\xc9\x1d\x5d\x10\x2a\x45\xce\x63\x67\x6a\x0c\xb6\xde\x77\x4b\x0f\xbe\x14\x1c\xd5\x0c\x9f\xa7\x6f\x44\x57\x8c\xb5\x63\x8a\x8c\x41\x53\x43\xa6\xdf\x0c\xdf\xbc\x7e\x29\x9c\x0a\xdf\x70\x89\x53\x5d\x06\x4e\x65\xe9\xd3\x93\xbe\xab\x2f\xfb\xd8\xd2\xfb\xbe\x73\x26\x96\xa2\xaa\x23\xf3\x55\xeb\xf0\xab\x3b\xc9\x34\x94\x3a\x24\x1c\xa0\xe2\x62\xf4\xc3\x52\x46\xe4\x61\x8b\xc5\x4c\xdb\x28\xce\x46\x88\xca\xc7\x9f\x90\x6e\x39\x02\x85\xc7\x6d\x9d\x85\x4b\x3d\x40\xc2\xca\x80\x7a\xf5\x8a\x1c\xd8\x2b\x7b\x36\x01\xec\xf0\x49\x51\xcb\x01\xed\xfc\x3e\x6b\x50\x6c\xa7\x02\xb8\xf3\xfb\x8c\xa2\x0d\x2e\x6b\x11\x82\xff\x09\x33\x3a\x07\x4c\x7c\x63\x09\x95\xc9\xc2\x80\xf2\xda\xae\x9d\x8c\x73\x4d\x80\xcf\x99\x14\x1c\xe3\x38\xe6\x54\x32\x3a\x4e\x80\x48\x98\x80\x04\x6e\x74\xd1\xaf\x0f\x3e\x9c\x5c\xa1\xdf\xfa\xd0\x16\xed\xf5\xab\xcc\x15\x46\x0a\x2e\xad\xa4\x34\xdd\xa3\xdb\xe7\xd7\x61\x60\x88\x34\xd7\xaf\xcb\x3c\x27\xcd\x75\x6e\x2b\x03\xdf\x47\x49\xae\xd8\xfc\xa9\x28\x89\xcb\x48\x3c\x63\xb5\xf6\x79\x29\x3b\xb2\x00\xd4\x4a\xa2\x63\x61\x83\x7f\xa4\x14\x5d\x4f\x85\xe2\x1d\xe5\xca\x11\xce\xf4\x44\x52\x36\x9d\x69\x17\x72\xe5\x6b\xb7\xac\x88\x10\x98\xb3\xfd\xb4\x46\x28\xc3\x76\x4f\x12\x46\xd5\xae\x22\xd7\x4a\x36\x91\x9b\x05\xcb\x54\x71\x57\x71\x83\x26\xc1\xb6\x62\x1e\x64\x0d\x8e\x17\x23\xe7\x9d\xf2\x70\x63\xdc\x48\xbb\x65\xa3\x79\x26\xe2\x9e\x72\xb7\x58\xab\xe1\xa4\x9c\x0f\x7c\xe3\xdc\xbd\x48\xfc\xb1\x08\x28\x5a\xb5\xb8\xe0\x03\x73\xcf\x25\x68\xb3\xaf\x66\x96\x1d\x33\x6d\xea\x2a\x1e\xb5\x54\x8e\xf5\x10\x24\x33\x91\xc4\xbe\x0d\x98\x35\xc9\x8c\x41\xdf\x01\x70\x72\x31\x42\xf8\x99\x57\x44\x6f\xcf\x06\x28\x5a\xef\x00\x96\x15\x28\x69\xa4\x15\x78\xee\x8a\x60\x0d\xb4\x92\x26\x22\x7d\x78\xd3\xc6\x67\xfe\xef\x01\x66\xde\x23\x46\xc7\x62\x0e\x08\xd2\x38\x96\xa0\x1a\xa4\xe5\x3f\x81\x9e\xda\x88\x94\xb2\x5a\x05\xa6\xab\xfe\x8d\x00\x36\x6f\x21\x42\xf1\x1d\x8f\x2a\x22\xde\x67\xa6\x60\x17\xa3\xd3\x06\xd4\xab\xf7\xa3\x73\x6f\x98\xa9\x7a\x3d\x45\x58\x16\x15\xfe\xd4\x21\x29\xbc\x86\xa5\x68\x65\x2b\x31\xee\xe6\xb2\xaa\x2b\x26\x96\x88\x5a\x43\x22\x4d\xb8\x9d\xc6\x90\x15\x97\xa9\x18\xbc\xc4\x4c\x59\x37\x71\x05\x1a\xca\xdf\x51\x06\x88\x0f\x44\xb0\x44\xde\x85\x65\xf4\x43\xf0\xde\x12\x61\x42\x0b\xba\x0f\xc3\x2b\x51\xf1\x15\x60\x7e\x36\x58\x8e\x2e\xce\xda\x44\x97\x8c\xc5\x7b\x87\x2e\xbb\xeb\x97\xd5\xbc\x94\x6a\x3a\xb7\x9b\xd0\x1f\xf6\x91\x88\x37\x88\x49\x05\xa3\xc1\xeb\xcb\x6d\x94\xb4\x20\x94\x58\x33\xe1\x52\x7f\xba\x1a\x40\xd9\x99\x4a\xa0\xa8\x35\xca\x93\xe4\x1a\x22\x09\xbb\x9a\x47\xab\xfb\x7f\xb1\x34\xd7\x26\x91\xa7\x24\xbf\x63\x8e\xb0\xbb\xd8\xb2\x64\x65\xe0\x13\xb0\xa6\x9c\x01\x94\xe5\x49\x82\x71\xe0\x7c\xe1\x01\x8e\xab\x57\x25\x5f\x14\x53\x3e\x66\xc5\x86\x48\x55\x76\x41\x41\x78\x58\x28\x8b\x4e\x95\xb2\x1e\x53\xc6\x63\x36\x67\x71\x4e\x13\x7c\x10\x4a\xa1\xe5\xde\x81\x81\x43\xa6\xbe\x32\x13\xf9\x4e\x48\x02\xf7\xd4\x5c\xd6\x0f\x42\x2c\x55\x88\x0e\xb1\x88\x6e\x41\xf6\xad\x28\x76\x86\x1f\x4e\x51\xe2\xb5\xb5\x07\xfd\x3a\x8c\x2e\x31\x13\x5c\xc8\x7a\x1d\x4b\x5d\xb8\xc1\x91\x85\xc3\x57\xf6\x75\x17\x8c\x4f\x07\xf8\x8d\x79\x11\xf7\xa4\x81\xe0\x03\x3a\x30\x68\xf8\x4c\x04\x3f\x2c\x36\xf8\x1e\x25\xab\x2b\x8f\x2f\x5e\x45\x30\x8a\x9c\xc8\xa7\x33\x04\x96\x4c\xa9\x2f\x79\x93\x80\xc6\x6a\x26\xce\xaf\x6b\xd3\xce\xdd\xbd\xb1\x13\xd3\xca\xd5\x5d\xaa\xb8\xf6\x4c\x84\xbf\xba\x16\xb2\xa5\x48\xe1\x12\xd9\x72\x30\xd2\x3b\x63\xa0\x98\x83\x9c\x33\xb8\x3b\x72\xac\x73\x70\xc7\xf4\x6c\x60\x21\xa2\x8e\x10\xb0\x47\x5f\x59\xf1\xd2\x26\x65\x9c\xc4\xb1\x33\x5b\xe6\x0a\x26\x79\x62\x0d\x90\x6a\x48\x68\xc6\x3e\x80\x54\x4c\xf0\x3e\x56\xa9\xec\x93\x9c\xc5\xdf\x7e\xc6\xc0\x17\xc6\x59\x11\x62\xd7\x88\x0a\xbe\x75\x54\xce\xe5\x02\xb2\x7f\x16\xbd\xfb\x5c\x70\xd0\x18\x12\xc1\xa7\xa5\x4c\x46\x14\x2f\x2e\x38\xd3\x2b\x3d\x88\x6c\x45\x22\x54\x91\x85\x8c\x31\x90\x91\x09\x59\xb1\x07\x9b\xf9\xb0\x4e\x4b\x29\x1c\xd2\x90\x48\x56\x99\x0f\xc3\x59\x54\x60\x46\xc4\x06\x44\xf8\xa4\x27\x2d\xc8\x8c\xba\x3a\x31\x2e\x0a\x93\x29\x32\xa3\x3c\xc6\x8f\x51\x24\x64\xec\xd6\xcb\x74\x88\xbd\xb4\x41\x41\x36\x12\x05\xd9\x1a\x76\x71\xe5\xcb\x4f\x46\x0d\x54\xa6\x95\x40\x3d\x2f\xf6\xe4\x9c\xfd\x4f\x0e\x84\xa6\xc2\x10\xf6\xe5\x8a\x95\x4b\x10\x49\xe9\x02\x79\x2b\x2e\xf5\x6d\xc8\xe2\xb1\x89\x42\xaa\x4f\xae\x80\xc6\xac\x94\xec\xd8\x27\x6f\xab\xd9\x8f\x7d\xb3\x96\x6b\x9b\x96\xe5\xbe\xb2\xab\xf7\xcd\x5b\xaf\xac\x93\x28\xf5\x71\x45\xab\x2f\x63\x76\x45\xd3\x5b\xe0\x56\x29\x37\xa0\x41\x3f\x58\x2e\x71\x0f\xa2\x19\xc4\x39\x72\xa9\xf1\x82\x4c\x98\x2d\x63\x8b\xa2\x02\x9b\xce\x40\x69\x2f\x5c\x1e\x61\xac\x4e\x51\x8f\xdf\x2f\x00\xd1\xb7\x14\x69\x5b\x98\xb1\x52\x7a\x6f\x56\x24\x5c\x07\x5c\x1b\x98\xef\x74\x36\x95\xa7\xfe\x2c\x2f\x43\x5a\x0d\x7d\xef\x5c\xb3\xf2\x52\x79\x50\xb6\x04\x5c\x74\xd2\x39\x3b\x1c\x99\x50\x35\xc3\xe2\xb9\xcb\x5b\x10\x59\x93\x4c\x94\x4b\x43\x30\x6c\x4d\x5d\x8a\xdd\xf2\xb0\x35\x13\x36\x56\x5b\x67\xb8\x69\x98\x3c\x60\x16\x3b\x28\xf1\xbb\xe7\xc2\xc4\x4e\x42\x30\xb8\x01\x7c\xb4\x44\x09\xec\x4e\x1a\x86\xe5\xeb\xc6\xc8\x9c\x17\x1e\xd3\x1a\x4d\xe0\x1b\xb0\xa4\xfa\xfe\xd1\x5a\x7e\xcd\x26\x1c\x90\xca\x69\x73\xcb\x47\xef\x44\x4e\x73\x7b\xd0\x1d\x15\x2e\x0a\x4e\xba\x9e\x65\x28\xb5\x59\x19\xd3\xa8\x33\xa7\xef\xce\xbc\xfb\xcc\x46\xf3\x15\xb9\x15\xbe\x70\xfa\x90\x7c\x68\x6a\xa4\x5e\xb6\x52\x1b\x6a\x5e\x98\xbe\xa3\x70\xb2\x0c\xc5\x48\xe6\x5e\xbf\x08\x4f\xf3\x72\x28\xe3\x59\xae\x1d\x1b\x2c\x34\x4e\x1e\xcd\x28\x9f\xfa\x32\xdd\xe5\x75\xa9\x05\xd7\xf4\x1e\xdb\xc8\x8e\x81\x80\x8a\x68\x16\x42\x0e\x49\x2c\x72\xf3\xf0\xaf\xbf\xee\x13\x06\xc7\xe4\xeb\xd2\x8d\x43\x72\xee\xae\x2d\xbd\x70\x29\x9a\x7e\x5c\xbc\x6e\x9f\x48\x98\x52\x19\x27\xce\x3c\x72\x57\x4a\xc1\x08\x2f\x08\xf7\x4c\x69\x65\x79\x86\x6e\x40\x49\x34\x55\xb7\x86\x6e\x98\x93\x30\x88\xa9\xa6\x83\xd2\x11\x3c\xb2\x7a\xd6\xc0\x95\xde\x1b\x50\x87\x0a\xa5\xd6\xdd\x5f\xb9\x76\xab\x03\x1a\xae\x62\x46\x82\xc6\x22\x78\xf5\xe5\x92\xe7\x66\x13\x6b\x50\x81\xb1\x7a\xda\xce\x8b\x6a\xae\x08\x03\x8c\xba\x2f\xe4\x9b\x40\xf4\x5c\x91\xc1\x75\xe7\xef\xfc\xf2\xe6\xea\xe7\xd1\xfb\x8b\xcb\x9b\xee\x18\x76\xc7\xf0\x8b\x3a\x86\xc0\xe7\x8d\x8f\xa0\xd7\x4b\xd6\xb9\x54\x97\x8b\xb5\x95\x52\x6f\x5e\x50\xe0\xda\x39\x9f\x7f\xa0\xb2\xe8\x87\xeb\xfc\x41\x6b\x3c\xcc\xbe\x61\x2e\x92\xa4\xd3\x67\x1f\xb9\xf6\x84\x71\x67\x2d\xc6\xf3\x94\x4d\x16\xeb\x76\xad\xdc\x44\xe4\xf4\xf7\x8b\xb3\xf3\xcb\x9b\x8b\xef\x2e\xce\xaf\x9e\x34\x10\xa3\x61\xb1\xb4\x2a\x13\xad\xc9\xd5\x32\x09\x73\x26\x72\x15\x5a\x75\xac\x27\x01\xab\x91\x7c\x3c\x46\x4b\x82\x02\x89\x31\xcd\x6b\x6f\xfb\xd2\x59\x63\x35\x8a\xa4\x41\x21\x8a\xb6\x90\xed\x3b\x29\x6a\xb7\x0e\x5e\xf6\x76\x58\x9b\x84\x77\x0d\xaf\xdb\xff\x9e\x72\xce\x8a\x32\xa3\x70\xa2\x59\x28\x1e\x60\xbe\xc7\xe4\xa6\xa6\x47\xb1\x61\x31\xcb\x76\xea\x3e\xda\xc8\x95\x77\x34\xfb\x01\x16\x57\xd0\xb0\xde\x45\x15\xde\x90\x40\x64\xd8\x12\xb9\x85\x85\x0d\x53\x3c\xf5\x0f\x6b\x52\x97\x63\x2f\x6b\x81\xde\x42\x93\x3a\xad\x6d\x16\xf1\xbc\x85\x06\x21\x98\x7e\xac\x94\xb3\x34\x5b\x88\x52\x95\xd9\xd3\x66\xbb\x47\xda\x2d\xe0\xf9\x09\x8a\x96\xbe\x5c\x7f\x42\x75\xb4\xb8\x0b\xde\x2d\xda\xf2\x4e\x58\x0f\xf5\xa2\xc2\xbb\x02\x11\x21\x36\xc7\x11\x71\xd3\x9b\xe0\x9d\x50\xd0\x12\x68\x9a\xc5\xfa\x9a\x81\x5b\xd8\x2e\x5d\xed\x15\x84\xd5\x46\xbc\x87\x8a\x4a\xf1\xb1\x4f\xec\x57\xa1\x47\xcc\xd0\x60\x58\xbf\xfa\x11\x1d\x84\x7d\xf2\x8f\xf0\x25\xb6\x98\x54\xbf\xf4\x7a\x7f\xfb\xe1\xfc\xe7\xff\xe8\xf5\x7e\xfb\x47\xf9\x57\x64\x85\xd6\x6d\x5c\xbd\x44\x65\x10\x0d\xb9\x88\xe1\x12\x9f\x81\x1f\x9d\x78\x75\x62\x5d\x09\xee\x07\xcc\x4f\x1e\xda\x18\x9e\xf0\x31\x13\xf1\xf2\x27\xd5\xa8\xf4\xd5\x5e\x32\x06\xdc\xa2\x06\x79\x36\x76\xb4\xc7\x1e\x0a\x5a\xd2\xf2\x51\x75\xb3\x7a\x6c\xc4\x12\xaa\x14\xff\xfc\xce\x83\x00\x9b\x7a\xf9\x42\x08\x1c\xb3\xc7\x8d\x64\x5a\xad\x83\xf6\x6a\xfe\xa6\x51\xfb\x42\x3b\x5a\x24\x6d\x61\x07\x5b\x06\x18\x42\xc4\xb7\xc6\xc1\x83\x1c\x18\x6c\x08\x1f\x09\x7d\x96\x4e\x46\x17\x64\x6e\x21\xbc\x37\xc0\xf1\x6e\xbe\xef\x3e\x29\x8d\x0b\xce\xc4\xe5\x2c\xd5\x63\x1b\x8e\xe2\x7f\x77\x15\x03\x94\xab\xba\x83\x8e\x49\x45\x0e\xec\x97\xc3\x28\xcb\xfb\xee\x82\x61\x0a\xa9\x90\x8b\xf0\x31\x94\x5e\x19\x28\x2d\x24\x9d\x62\x86\x89\xbd\xdd\xde\x16\x3e\xd9\x1b\x2b\x0f\x58\xbd\xdb\x2a\xae\x85\x4f\x31\x94\x72\x7c\x79\xb4\xcd\x83\x7e\x4f\x48\x5b\xd4\xb4\xa8\x50\x75\x54\x11\x32\xd8\xcd\xac\xc0\x19\xa0\x88\xfa\xa4\xcb\xa0\xed\x17\xd1\x61\xe8\x0b\xe7\x73\xa3\x59\xd6\x2e\x07\x57\x8c\x16\xa9\x59\xcc\xe6\x4c\x89\x46\x4d\xab\xdd\x44\x9b\x23\x09\x5d\x11\x0f\x1b\xcd\x14\x8c\x5c\xf7\x19\x56\xc0\x0a\xe7\x75\x89\xec\xbf\x69\xd2\xdb\xd4\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3a\xf8\xf5\x9b\x8f\x83\xc3\x6f\x0f\x0e\x7e\x79\x3d\xf8\xeb\x6f\xdf\x1c\xfc\x3a\xc4\x3f\xfe\xf5\xf0\xdb\xc3\x8f\xfe\xc3\x37\x87\x87\x07\x07\xbf\xfc\xf0\xee\xfb\x9b\xd1\xf9\x6f\xec\xf0\xe3\x2f\x3c\x4f\x6f\xed\xa7\x8f\x07\xbf\xc0\xf9\x6f\x5b\x4e\x72\x78\xf8\xed\xd7\x8d\x97\xde\x42\xb1\x49\x3b\xda\x2c\x39\x59\x9d\xb1\x15\xf4\xfb\x84\x45\xdb\xed\xf0\xe8\xd5\xf6\xf9\xbf\xf2\x54\xb3\x14\xdd\xe2\xd9\xf5\xde\x1c\x70\x1b\x1e\xf9\x39\x2c\x39\xf6\x49\xd5\xcc\x93\xa0\x5a\xbc\x34\x3e\xf7\x25\x18\x77\xbc\xd8\x6e\xf7\xb5\x90\x44\x27\x52\xa4\x3e\xbf\x1d\x9d\x11\x36\x13\xcb\x5d\x77\x0b\x8d\x9a\xdf\xd9\xd1\x19\x83\x3a\x63\xd0\x86\xf1\xa8\x31\xc8\x06\xe7\xef\xaf\x25\x08\xf8\xbc\xae\x0b\x63\xad\xbf\xdb\xeb\x3a\xe5\x62\x70\xdb\x39\xc0\x86\xfe\xa8\x17\x9e\xb3\x22\x4e\xc5\x32\xb4\x74\xbd\xc7\x91\x9c\x60\x2f\x4e\x7b\xf0\x71\x82\x50\x02\x13\x5c\x95\x7a\x97\x8d\x38\x37\x4b\xb8\xf3\x35\x2d\x2b\x95\x2c\x31\xc6\x96\xf1\xa9\xab\xeb\x60\x59\x89\xf3\x3e\x31\x5e\xd4\x86\x0d\xc2\x61\xd1\x6d\x98\x2a\x25\x22\x6c\xf1\x61\x1d\x64\xa1\x46\x9d\x5b\x36\xae\x46\xd3\x5b\x28\x37\x1d\x26\x1f\xcc\xbd\xc5\xbb\x8e\x17\x58\x03\x95\xcf\x83\x93\x2d\xb7\xa1\x1b\x96\xfc\xad\x9f\xe3\x65\x85\x0b\x18\x44\x74\x4e\xb0\x52\xd4\x00\x52\xfd\xa0\x61\x53\x0c\x9c\x10\x93\xc2\xca\x5a\xaf\x6d\x5b\x63\x2e\xde\x9c\x67\x06\xcf\x56\x23\x61\x68\x85\x59\x16\xe6\xe7\x2a\x93\x7c\x09\xce\xc0\xe6\xec\xf3\x8b\x63\x9d\x2d\xb1\xcd\x76\x58\xe6\x0e\xbe\x93\x36\xd9\x64\x1b\xce\x92\x4c\xc2\x84\xdd\xb7\x74\x4e\x4f\x4a\x79\x7a\x2c\x06\xae\xd9\x84\xd9\xce\x94\x99\x84\x0c\xb8\xed\x0e\x4d\xa3\x19\xd2\x7e\xc7\x29\x0b\xe7\xf4\x3e\x86\xde\x58\x81\xbb\x5d\x52\x76\xbd\x4e\xd8\xef\xe8\x18\xe9\xe8\x58\xed\xf1\x99\xe8\x98\xc3\xdc\xfd\x21\x62\x18\xd7\xdd\x3c\xb0\xfc\xac\x14\x25\x8e\x58\xdc\x3c\x8f\x76\xa9\x36\x5a\xa0\x8b\x5a\xd8\xbe\xc5\x36\x99\x4b\x92\x04\xe6\x90\x38\xa1\x89\xa4\x94\xd3\xa9\x6d\x38\xa5\x45\x28\x81\x23\x24\x31\x48\x2c\x59\xbc\x52\xdf\x06\x85\x78\x9f\xe7\x84\x3f\x4a\x91\x24\x20\x15\x49\xd8\x2d\x90\x33\xc8\x12\xb1\x48\x5d\x98\x6a\x4c\xae\x35\xd5\x06\xa5\xaf\x41\xd7\xf3\xf9\x36\xab\x8d\xe1\x53\xbb\x5b\x2a\x04\x6e\x73\xc5\x31\xd3\x9a\x64\x2e\x8d\xf0\x3d\x47\x8a\x71\x82\xbd\x47\xfa\xe4\x12\xe6\x20\xfb\xe4\x62\x72\x29\xf4\xc8\x8a\xde\xd5\x68\x3b\x7b\x21\x61\x13\x72\x6c\x94\x3a\xa5\x89\xb6\xfd\x1f\x4a\x59\xdf\x42\x56\x26\x28\xaa\x9f\xb5\x91\xa4\xb6\x9a\x80\x8d\x33\x85\xf4\xeb\x5a\x6e\x8c\x46\xdb\x14\x1a\xec\x34\xde\xa0\x13\x9b\x54\x59\xd4\xb5\x2d\xe1\xb7\x2d\x56\xe0\xeb\x79\xa1\x0a\xc8\x38\x91\xa0\x32\xc1\x15\x54\x8b\x15\x16\xcd\xd6\x50\xd5\x55\xad\x6a\x88\xb5\x39\x67\x53\x9e\x99\x09\xa5\x31\x8f\xb4\x9d\xb6\x4d\x23\x3f\x1d\xa6\xe5\xd2\x24\x81\x98\xb0\x34\x85\xd8\xa8\xf0\xc9\xc2\xf5\x9b\xa1\x55\xf3\x40\x84\xad\x0a\x7c\xfb\x13\x70\xd9\xba\x95\x44\xdf\xca\xf5\xbe\xf2\x7c\xe8\xb2\xe2\x3b\x85\x6e\x4a\xef\x2d\x0e\x26\x32\x91\x12\x02\xac\x54\x3f\xc6\x9a\xd8\xaa\xd4\xaa\x65\x26\xc4\x2d\x89\x44\x9a\x25\x78\x74\x1a\x9c\xac\xa2\x53\x54\x40\xa5\x01\x76\xfe\x3b\x2a\x35\x91\xc2\x2f\x9e\xb0\x93\x5f\x1b\x32\x18\xdc\x43\xd4\x5a\x07\x39\x43\x4b\xcd\x2e\xa3\xbf\x5f\xf0\x20\x8a\x4d\x84\x61\x60\x98\xaa\x1c\xaa\xf1\x95\x4a\xcf\x9c\xdf\x43\x54\xea\xc2\x88\xf5\xa0\x22\x5f\x5d\xc1\x1c\xf4\xe6\xdd\x75\x1b\xbb\x29\xda\x72\x0d\x34\x48\x6d\x2b\x8f\xa5\x12\x7a\x38\xa7\xaf\x18\xee\x1e\x81\xcd\x17\x50\x7f\xb2\xe9\x6e\xe5\x12\x14\x01\x87\xed\x89\x5d\xa9\xbb\x17\x82\xaf\xfd\x5c\xd8\xe3\x46\x08\x4d\x0e\x7a\x47\xbd\xc3\x15\x9b\xe5\x52\xd9\xe9\x9b\xd2\x9d\x0c\xeb\x2c\x66\x58\xb4\x10\xa2\x5e\xdc\x27\x4c\xfb\xe8\x6c\xdb\x35\x07\x57\xe5\x72\xf0\xfa\x44\x09\xa2\x25\x8d\x99\x93\x7e\xf0\x5b\x73\x91\x96\xb9\x63\x0e\x07\xbd\x8f\x3d\xd7\xb4\xe7\x4e\xf0\x9e\xc6\xe5\x0f\xc9\x8d\xad\xd9\x12\x26\x5a\x88\x9c\x70\xb0\x69\xe7\x70\x9f\x25\x2c\x62\x3a\x59\x20\xa1\x23\x22\xb7\x7d\xab\x0c\x9b\x71\xb9\x7f\xe7\xf7\x4c\xfb\x06\x1d\x62\x42\x5e\xdb\xb6\x59\x40\x9d\xd5\x34\x61\x73\x38\x9a\x01\x4d\xf4\xcc\x06\x96\x70\xc1\x07\xff\x04\x29\x30\x2b\x90\xbb\x5f\x9a\xfa\x58\x9a\x99\x20\xcb\xa3\x81\x39\x72\x75\x41\x0d\xb5\x0d\x43\x7b\xbf\xaf\xdf\xb7\x95\xac\x94\xce\xba\xb9\x19\x7d\x5f\x69\xdc\x8a\xc4\x5f\xeb\xcc\x87\xfb\x94\xda\x1b\xef\x01\xed\x68\xc7\xc1\xd9\xa8\xeb\x2a\x69\x91\x84\x35\xed\xbe\x4a\xd6\x97\x42\xdb\xbe\xed\xea\xff\xcf\xde\xff\x77\x37\x6e\x5b\xfb\xc2\xf8\xff\xf7\x55\x60\xb9\xe7\x7e\x6d\xa7\x92\x66\x26\xc9\x49\x7b\xe6\xe6\xdb\x2e\xc7\xf6\xa4\xbe\x99\xf1\xf8\x58\x9e\xe4\xe9\x93\xe9\x69\x21\x12\x92\x50\x93\x00\x03\x80\xf2\xa8\x27\xe7\xbd\x3f\x0b\x7b\x03\x20\x28\xc9\xb6\x4c\xd2\x23\xd9\x11\xbb\x56\x33\x96\x28\x10\xdc\xd8\xd8\xd8\x3f\x3f\x9b\xfc\x55\x96\x00\xa4\x41\x47\xd9\x3c\xa0\x18\x68\x66\xc8\x9e\x1d\x6a\xcf\x8a\x27\xcb\x0d\x7f\x61\x34\x45\x90\x09\x6d\x18\x6d\xa4\xf1\xc5\x57\x67\x81\xb7\x68\x6e\xdd\x9e\x03\xa5\x36\x32\x27\x53\xf7\xda\xf5\xe2\x4a\xb7\x33\x06\xb0\x7b\xd0\xa2\xb4\x3a\x57\x81\x12\xce\xfd\xe6\xd9\xc9\xaf\x25\xb9\x81\x74\xaf\x75\x10\x48\x62\xb2\xc5\x7d\x66\xb8\x40\x62\x21\x66\x4b\x47\xb2\xb4\x83\x84\x09\xd2\x61\xd2\x04\x69\x57\xaa\xb9\x38\x10\x04\x02\xdb\xe7\x87\x75\x96\x87\x41\x3a\xcb\x35\x20\xab\x1c\xb3\x8e\x67\xd0\x69\xd3\x11\x11\x3b\x8d\xf0\x93\xf6\xc5\xa0\xf1\x75\x37\x01\xba\x59\x7c\xd2\x25\x05\x8a\x0e\xd2\xc1\x97\x93\xc1\x97\xda\x61\x83\x98\xd0\x4c\xcd\x9a\x96\x6b\x57\x57\x77\xaf\xde\xb2\x37\x38\x59\x5d\x09\xad\x88\x08\xed\x9e\xcd\x93\xe8\x0f\x4e\xba\x4b\xdb\xec\x3a\x69\xb3\xd3\x94\xcd\x47\x4d\xd8\x84\x32\x91\xd6\x52\xa4\x1e\x2f\x80\x21\x63\xac\x4d\xa7\xfb\x45\x18\x75\x56\xd7\xac\xfb\x5f\xed\x56\xdb\x8a\x3d\x66\x92\x62\x28\x93\xeb\x0e\xed\x9a\xfd\xab\xe3\x0b\x1c\x32\x32\x6d\xa8\xf0\xce\x10\x2e\x66\x32\x9b\x01\x16\x29\xb9\x3a\xbe\x80\x9d\x37\x80\x7f\x81\x23\x0a\x2c\xea\x39\x33\x55\x21\x83\x0b\x4f\x05\x44\x51\x28\xd2\xa0\x19\xd7\x86\x27\xf0\xbb\xca\x4d\x6a\x47\x68\x13\x97\xda\x59\x4a\xab\xae\xce\x2d\xa5\xa8\x65\xee\x43\x8d\xa6\xb6\x89\x87\x5b\x7c\x2e\xb9\xf3\x48\xd5\x7a\x4a\xef\xce\xa5\x0e\xc6\xdb\xde\x73\xa9\x50\x6c\x68\x64\x23\xec\x7c\xb2\x1c\x09\xc1\xc1\x6e\x89\x83\x8c\xd8\x58\x2a\xb6\x18\x08\x89\x02\x1b\x69\x09\x9b\x90\x0a\xa8\xfe\xf3\x2e\x28\x59\x0b\x5e\x60\xca\xa5\xef\x17\x9d\x39\x84\xd0\x17\x3a\x86\x05\xf5\xcd\x7f\x7b\xf6\xed\x58\x0e\xb3\xeb\x55\x65\x0c\xae\xf5\x30\x7c\xc8\x4c\x82\x6e\x56\x1f\x7f\x71\x1e\x55\x3f\xfd\xc5\x50\x49\xa2\xa8\x9e\x62\x5b\x5e\xf6\x89\x9b\x00\x40\x4a\xb5\x14\xe8\xec\x8d\x3a\x04\x73\x1d\x21\x54\x47\x41\x1e\xfc\xd1\x85\x4c\x17\x3b\x70\x4f\x14\x4d\x18\x29\x98\xe2\x32\x25\x50\x4f\x9c\xca\x1b\x41\x46\x6c\xc2\x85\xf6\xf4\x03\xa8\x72\x47\x68\x7b\xdc\x30\xf0\x0d\x7b\x2c\xb6\x01\xb9\xac\x81\xa0\xb8\xf2\xa4\x44\x56\x3b\xda\xcd\x62\x31\xc8\x04\x19\xa1\x40\x5e\xec\x8d\x13\x16\x26\x6e\x17\x74\xcf\xa4\x3b\x88\x36\x61\x47\x2b\xff\xdd\xad\xd4\xe1\xda\x52\x3d\x99\xb6\x0b\xfc\xee\xc2\x53\x6b\x5e\xbb\xf0\xd4\xc3\xae\x5d\x78\x6a\x17\x9e\xba\xfd\xda\x3a\xf7\xee\x2e\x3c\xb5\x33\xba\x16\xaf\x5d\x78\x6a\x17\x9e\xba\xe5\xda\x3a\xf9\xb5\x0b\x4f\xad\x71\xed\xc2\x53\x6b\x5e\xbb\xf0\xd4\x2e\x3c\xb5\x0b\x4f\xed\xc2\x53\xbf\x21\x37\xa0\xbf\x76\xe1\xa9\xa5\x41\x76\xe1\xa9\x88\x18\x3b\x4b\x69\xc5\xb5\x0b\x4f\xad\xb8\x76\xe1\xa9\xe8\xda\x9d\x4b\x0d\xce\x25\x1f\xdc\xb9\xb0\x76\x59\xfb\x9a\xb5\x0b\x08\x1c\xf0\xc4\xc5\x88\xe4\xb8\x56\xe7\x84\x8f\x1a\x54\xed\x22\x22\xcc\x0f\x5f\x6a\xe3\xa2\x41\x55\x8c\x69\x65\x3d\x54\xcb\x66\x69\x85\x4c\xab\x60\x44\x14\x85\x40\xeb\xb4\x79\x4d\xda\xc6\xaa\xad\xda\x84\x1e\xb6\x3a\xec\xb0\x25\xa1\x9d\x0e\x42\x0d\xbb\x30\xc3\xb3\x0b\x33\x74\xe3\xa2\xeb\xc0\x3d\xd7\xfa\x84\x71\xc1\xfc\xab\xa9\x62\x7a\x2a\xb3\xc6\x8c\x5e\x63\xf2\x77\x5c\xf0\xbc\xcc\xa1\x8b\xaa\xe5\x67\x3e\x0b\x59\x03\xa1\x55\xb4\x13\xf4\xe8\x29\x8c\xda\xad\xfa\x36\xab\x50\xd6\x39\xa5\xa0\xaa\xeb\x32\x49\x18\x4b\xa3\x06\xf0\xa0\x98\x7d\x35\x08\x4f\x0a\xed\x34\x5e\xb5\x93\x37\xed\xce\x7e\x84\x28\x85\x51\xbe\xfa\xb2\xd1\x18\x2d\xa3\x3c\x9f\x3f\xc2\xd3\x81\x98\x6e\x6f\xaf\xb4\xb2\x55\xba\x38\x25\xda\xda\x28\x4f\x2d\x92\xd3\x59\x44\xb3\x83\x08\xce\x16\x45\x6f\xb6\xe6\x58\xd8\x96\x88\xcd\x16\xa2\xaf\x76\x10\x60\xe8\x22\x42\xd3\x5d\x74\xe6\x11\x40\x4a\x1f\x27\x2a\xd3\xa1\x35\xdc\x51\x34\xe6\x73\x44\x62\x3a\x79\xeb\xb6\x11\x98\xcf\x17\x7d\xe9\xe6\x75\x5b\x7a\xb7\x9e\x45\xc4\xa5\x03\xaf\x56\x97\x1e\xad\xce\xbc\x59\x8f\x16\x61\x69\x1f\x5d\xd9\x82\xc8\x4a\x6b\x22\x73\xc1\x0d\xa7\xd9\x09\xcb\xe8\x7c\xc8\x12\x29\xd2\xc6\x27\xcc\x02\x6a\x5d\xd8\x3f\x1a\x87\x75\x36\x5a\x3d\xff\x78\x4a\x1d\x38\x2f\x4b\x7d\x4a\xb5\x77\xff\x39\x85\x02\x1a\x9a\xe0\x2c\xb7\xd2\xa1\x47\xb6\xc6\x18\xc4\x64\xec\x2e\x17\xf1\x2f\xf2\x86\xc8\xb1\x61\x82\x1c\x70\xe1\xd7\xf1\x30\x32\x03\x2b\xcb\x3c\xb0\xb5\xfd\xf6\xd5\x4b\x7f\xf3\xf3\x33\xb9\xc1\xb9\xa0\xf5\xe3\x7b\x40\xdc\x83\xee\x77\x81\xb8\x1b\xc7\x65\x56\x77\x83\xa0\x6b\xa4\x2e\x6f\x5e\x55\xf0\xa2\xaf\x60\xdc\xb0\xdb\xa8\x48\x89\x2b\xdc\x78\x7e\x8b\xd6\x3a\x6e\xfc\x1c\x62\xc6\x3b\xdf\x0b\xe9\xda\xf7\xb2\xa1\xd8\xf0\x16\x6a\xcd\x4f\x34\x1e\xbc\xd3\x9a\x1f\x70\x19\x9e\x33\x59\x9a\xcf\xa2\x26\xde\x4c\x79\x32\x8d\x4f\x3d\x9e\x33\x4d\x64\xb9\xa0\x3f\xbf\x72\x3f\x5b\x79\x64\xed\x74\xc5\x95\x57\x53\x0f\xd0\x0a\x33\x79\xb1\x9c\xb0\x6a\x19\x49\x35\xa1\xe4\xe4\x7c\xf8\xf7\xb7\x47\xdf\x9d\xbe\x1d\x90\x53\x9a\x4c\xe3\x5a\x53\x41\x28\x48\x42\xd8\xd4\x53\x3a\x63\x84\x92\x52\xf0\x5f\x4a\x44\x1e\x26\x07\xe1\xb7\x87\x9d\xe2\x9c\x36\xdc\x59\xd0\xd6\xb6\xb3\x3e\x2a\xd8\x24\x17\x83\x97\xd2\x5a\x8b\x4a\xe6\x8b\xa2\xf1\xd4\x7e\x85\x4a\x04\x88\xd1\x29\x53\x8c\x4c\xf8\xcc\xc5\x65\x1c\x70\x2c\x4d\x43\x38\xd5\xf2\xb9\x65\x0b\xab\x82\xd0\x11\x84\x41\xa7\x8c\x08\x66\x2c\x5b\x07\x63\x54\x0a\x5d\x2b\xfa\x2d\x35\xd3\x3d\x32\x2a\x21\x70\x5b\x28\x9e\x53\xc5\xb3\x79\x3c\x18\xcd\x06\xe4\x5c\x7a\x55\x67\xbe\x38\xa5\x93\xf7\xa7\x43\x72\xfe\xfe\x8a\x14\x0a\xcb\x81\x21\xf2\x0a\xdf\xc3\x6b\x8d\x98\xfd\x85\xeb\xbf\x37\x20\x47\x62\x8e\x5f\xe2\x06\xe7\x9a\x58\x3d\x87\x09\x7b\x93\x3b\x1f\x3c\xe0\xf3\xde\xcb\x01\xfc\x6f\xcf\xbe\xa5\xb2\x07\x48\x08\x28\x27\x4b\x89\x21\x78\xc4\xf0\x51\x16\x51\xd3\xbd\xfb\xb3\xea\xa4\x12\x52\x62\x2e\x2c\x11\xa3\x4e\x2a\x34\x2c\x35\x90\x17\x3b\xeb\x70\x31\xc9\x62\xae\x6a\x26\xf6\xdb\xea\x8d\x6d\xb5\xc6\x7e\xf5\x06\x17\x4d\x95\xc7\x4e\x3a\xba\x54\x73\xe8\xa8\x0f\x42\x75\xfa\x79\x55\xc9\x49\x04\x19\xb7\xb6\x3b\xbb\xf0\x3b\x60\x80\x78\xea\xf9\x42\x3f\x34\xf8\x31\x3a\x2c\x7b\xe4\x25\xf9\x96\x7c\x22\xdf\x82\xea\xf4\x4d\xdb\xae\x11\x6d\x95\x9a\xf6\xa6\x1b\x6a\xec\x67\x17\x1d\x51\xfc\x27\x2b\x9d\xec\x88\x96\xaa\xd6\x94\xe6\x22\x75\x1d\x42\x0d\x53\x56\x8e\xba\x95\xd8\x68\xbf\x0d\x3b\xc1\xcf\xc8\x66\xe8\x97\x3c\x1b\xc7\x70\xef\xe6\x81\x8c\x66\x7f\x6e\x6d\xa0\x73\x27\x85\xea\xe0\xf1\xd5\x68\x39\x35\xc9\xb4\x2e\xc6\xac\xa2\xa6\x4d\xb5\xc1\x34\x49\x25\x58\xc9\x98\xe3\x33\xe5\x2d\xa2\xac\xdb\xc3\xc6\xed\x02\x6f\xb5\xf5\xbc\x6b\xa5\x16\x8c\x23\xf0\xeb\x38\xc5\x2a\x82\x8e\x28\x64\xea\x74\x32\x3b\xad\x34\x3a\x33\xee\x50\xca\x9c\x1d\x16\xdc\x51\xc0\x4b\x76\x3f\x25\x54\x60\x72\xe6\x98\x29\x85\x69\x59\xa3\x39\x71\xcd\xf8\x5b\x2f\x5e\xab\x9d\x54\x28\x69\x64\x22\x5b\xb4\x04\xa9\x07\xc3\xdc\x70\x40\x04\x74\xec\x78\x7f\xda\x87\x93\x8b\x1e\xb9\x3a\xbe\x80\x4e\x09\xc3\xe3\xab\x8b\xba\xa5\xb2\x77\x75\x7c\xd1\xa2\xb5\x7c\x27\x76\xa1\xd3\xac\x5e\xdb\x69\x36\x18\xa4\x66\x54\x5a\xb5\xad\x9f\xd3\xa2\x7f\xcd\xe6\x0d\xcf\xd4\x2e\xce\xf5\x7e\x58\xe1\x4e\x5e\x08\xc9\x9c\xd3\xe2\xc1\xa3\x29\x46\x53\xfe\x99\x32\xa4\xdd\xce\xaa\x9e\xb9\x3a\x55\x3a\x97\x33\x96\xa2\x3a\xec\x7f\xc1\x44\x5a\x48\x6e\xf5\xc5\x5d\xfe\xf4\xc3\x7f\xbd\xcb\x9f\xbe\xeb\xda\xe5\x4f\xef\xf2\xa7\x77\xf9\xd3\x77\x5f\xbb\xfc\x69\x77\x6d\xde\x0d\x4a\x76\xf9\xd3\x0d\xaf\xe7\x15\xc3\xdb\xe5\x4f\x3f\xe8\xda\xe5\x4f\x2f\x5f\xbb\xfc\xe9\x5b\xae\x5d\xfe\xf4\x2d\xd7\x2e\x7f\x7a\x97\x3f\xbd\xcb\x9f\xde\x65\x82\xdc\x3b\xd6\x76\x66\x82\x90\x5d\xfe\xb4\xbb\x76\xf9\xd3\xcf\x22\x27\x86\xec\xf2\xa7\xd7\xba\x76\xf9\xd3\xbb\xfc\xe9\x26\xd7\x2e\x7f\x1a\xae\x9d\xef\x65\x97\x3f\xed\xaf\x5d\xfe\x34\x5e\xbf\x1d\xad\x79\x97\x3f\xfd\x2c\x74\x45\xdf\xbb\xa6\x7d\x3e\xf0\xfe\xb1\xcc\x8b\xd2\x30\x72\xe9\x87\x0c\x27\x04\x19\xcd\x31\xb1\x27\xda\xed\xed\xc3\xf3\x89\x14\x63\x3e\x29\x15\x24\xf6\xbe\xc0\xc6\x30\xfd\x04\x27\xd1\x0f\xef\xd5\x0f\xcf\x7c\xf1\x04\x43\xf4\x19\xcf\x79\xb3\x5c\x6d\xb2\xb4\x3e\x6f\x61\xac\xc8\x8f\x6b\x37\x54\x4e\x3f\xc1\x4e\xa1\xb9\x2c\xb1\xa7\x8e\xa3\x60\xc5\x19\xe8\xed\xde\xd6\x05\x22\xdd\x28\x33\x55\xee\xf9\x45\x07\x7a\x45\x41\x8d\x61\x4a\xbc\x26\xff\x75\xf0\xf1\xf7\xbf\xf6\x0f\xff\x7c\x70\xf0\xf3\xcb\xfe\x7f\xfc\xed\xf7\x07\x1f\x07\xf0\x8f\x2f\x0e\xff\x7c\xf8\xab\xff\xe3\xf7\x87\x87\x07\x07\x3f\xff\xf0\xee\xfb\xab\x8b\xd3\xbf\xf1\xc3\x5f\x7f\x16\x65\x7e\x8d\x7f\xfd\x7a\xf0\x33\x3b\xfd\xdb\x9a\x83\x1c\x1e\xfe\xf9\xdf\x1a\x4f\xb9\xf5\xe1\xd7\xdd\xd1\xd7\xd1\xc1\xf7\x28\xc7\x9e\x8b\x03\x75\xb4\x25\x2f\xdd\x68\x8b\x9b\xd2\x1d\x5f\x77\x6d\x4a\x2f\x5b\x21\x57\x35\x8c\xc3\x35\x91\x39\x37\xd6\x8e\xb0\x06\x1d\x8d\x33\x40\xb8\xa9\xa9\x9f\x4e\x1c\x40\xea\x14\x35\xd8\xe9\x2b\x64\x4f\x44\x19\x99\xd2\x4c\x99\xba\xe1\xda\x77\x50\x0b\x96\x09\x6c\xeb\x7e\xca\xc6\x5c\x30\xe7\xf1\xde\x89\x88\xb5\xaf\x9d\x88\x78\x8e\x22\x42\xb3\xa4\x54\xdc\xcc\x8f\xa5\x30\xec\x53\x23\x93\xaa\x2e\x21\x86\x6e\x40\x22\x0b\xcc\x8a\xf2\x56\xa3\xcb\xa8\x53\xa5\x80\x54\xe8\x07\xef\xbc\x42\x66\x3c\x99\xbf\xf0\x13\x86\x2d\xc6\x3e\x99\x17\x6b\x8e\x63\xa8\xbe\xae\xb6\x2f\xeb\x5b\xfd\xb8\xda\xa5\x4b\xa3\x3e\x41\xd5\x0b\xb4\x9e\x0b\xc5\x67\x3c\x63\x13\x76\xaa\x13\x9a\x81\x94\xea\x46\xf2\x1f\xdd\x32\x3a\x08\x6c\x25\x33\x4d\x6e\xa6\x0c\x3a\x1e\x52\xfb\x26\x60\x32\x27\x54\x90\x09\xe5\x82\xe4\x76\x89\x0a\xff\x63\xcb\x13\x56\x2e\x1b\x4d\x0a\xaa\x98\x30\xfe\x07\xae\xc0\x66\x24\x65\xe6\x52\xfe\xb2\x79\x35\xbe\xcb\x99\x15\xf2\xef\x82\xdd\xfc\xdd\x8e\xa6\xc9\x38\xa3\x93\x90\x73\xab\x99\x59\xb2\xd2\xab\xa1\x6f\x7d\x01\xc8\xa7\x2b\x19\xa1\xd9\x0d\x9d\xc3\x6b\x2c\x8e\xc1\xf5\x6b\xf2\xea\x10\x58\x97\x6a\x12\xc6\x48\xc9\x97\x87\x10\x03\x38\x3e\xba\xf8\xfb\xf0\xaf\xc3\xbf\x1f\x9d\xbc\x3b\x3b\x6f\x27\xf0\xed\xbb\x33\x2a\x1a\x8d\x91\xd0\x82\x8e\x78\xc6\xdb\xc8\xf9\xa5\x28\x71\x3c\x28\x1c\xa8\x69\xfa\x22\x55\xb2\x40\x3a\xa9\x52\x40\xf1\x60\x55\x3d\x52\xb7\x70\xe3\x8a\x42\x58\x9e\x71\x7d\xc0\x89\xa2\xc2\x78\x7b\x2b\x26\xb9\x2a\x85\x35\x9a\x9f\x78\x42\x2d\x4d\xbb\x4b\xa6\x3d\x4a\x53\x96\xd6\xa8\xf7\xec\x92\x77\x8e\xfd\xcb\xcd\xab\xda\x4a\x72\xf1\x7e\x78\xf6\xff\x2c\xb0\xe1\xbc\x68\x97\xab\xd0\x4d\x3d\x87\x6a\xde\x2c\x98\x2c\xbe\xfa\xa5\xab\x17\xd8\xad\xef\x56\xac\x6f\x38\xab\xba\x89\x90\x5d\x96\xa2\x5e\x7e\x5f\x8d\x4f\x72\x99\xb2\x01\xb9\xc0\x63\x8a\xe9\x85\x6f\xa3\xb2\x3c\xaa\x18\xb1\xb7\x08\xc3\xa1\x2b\xb1\xb5\xa7\x66\x34\x63\x98\x02\x09\x49\xf0\xb5\x8a\xc2\x58\x0e\x8f\x69\xa6\x5b\x0a\xd3\x36\x27\x93\x3d\x84\xdf\x59\xd3\xb0\x13\x6a\x86\xd1\x48\xca\x84\x34\xce\x06\xb5\xb3\x84\x22\x4b\x25\x13\x82\x76\x68\x94\xce\x50\x3b\x5d\x5c\xaf\x6a\x7f\x30\x71\xed\x69\x75\x11\x46\x46\x0f\x6e\xa9\x99\x5e\x7d\x30\x55\x96\xa9\x1d\x5d\x31\x9a\x42\x2d\x49\x41\xcd\x14\xa3\x91\x39\xd5\xd7\x2c\xc5\x0f\x9c\x5e\xe3\x2c\x60\xed\xfa\x56\xbb\x47\x5d\xd9\x79\x8f\x19\x35\xa5\x62\xa8\xcf\x60\x8c\x94\x09\x3a\xca\x9a\x15\xcb\x93\x2e\xb6\x80\x7d\xa7\xf7\x22\x9b\x5f\x4a\x69\xde\x84\x1a\x8a\x4e\x16\xf0\x27\xa7\x29\xd6\x5d\xac\xa0\x4a\x41\xf0\x30\xed\x03\x31\x81\xa5\xe3\xf2\x8d\x93\x6a\xc1\x36\xcc\xd0\xaa\x14\x47\xfa\x7b\x25\xcb\x6e\xda\xc5\x5b\x6e\xfc\xfe\xec\x04\xf6\x71\x89\x7b\x98\x09\xa3\xe6\x50\x2d\xb6\x0c\xf4\x11\x74\xda\x0f\x96\x3f\x17\x38\xd2\xea\xc9\xa5\xd0\xcc\x0c\xc8\x3b\x3a\x27\x34\xd3\xd2\x2b\xc7\x5c\x90\x0b\xc8\xb1\x88\x4d\xbe\x01\x81\x8a\x56\xfc\x7a\x24\xcd\x94\x2c\xdc\x00\xec\xbc\xfc\x3b\xac\xd0\xc1\x80\x45\x85\x3c\xc2\xc5\xd2\xcf\x0d\xbd\x66\x9a\x14\x8a\x25\x2c\x65\x22\x69\xb9\x6a\x9d\xc5\x1e\xbe\xf9\xba\xf9\xca\x9f\x4b\x61\xb7\x45\x27\x6b\x7f\x26\x52\x9e\x50\x94\x62\xd4\x2c\xac\x34\x44\x0d\x9d\xdd\x41\xa1\xb4\x07\x36\x45\xa9\x99\x02\x3f\x9a\x35\x5c\x70\x21\x7e\x28\x47\x2c\x63\x06\x8d\x21\xa8\x17\xa7\x06\x6b\xaa\x78\x4e\x27\x8c\x50\x13\x18\xc5\x48\xc2\x84\x2e\xa1\x81\x3e\x35\xe0\x66\x93\xac\x2a\x7c\xa2\x9a\x7c\x38\x3b\x21\x2f\xc9\x81\x7d\xd6\x21\x2c\xff\x98\xf2\x0c\x12\xcc\x0d\x55\x8b\x73\xe4\x63\x3f\x04\x4c\x09\x78\x8f\x48\x85\x5b\xb4\x47\x84\x24\xba\x4c\xa6\x7e\x4e\xd6\xe2\xf2\x06\x9b\xcb\xc3\x01\x4f\xfd\x33\x64\xd5\xd6\x02\xe6\x83\x66\xaa\x33\xf9\xf2\xa1\x81\x7c\x89\x55\x08\xcb\x73\x75\xea\x21\x63\xe5\xcc\xd0\x94\x1a\xea\xe4\x4e\x55\x2d\xf9\x1c\x97\x74\xd3\xd2\x47\xb3\xb7\x5c\x94\x9f\x30\x71\xa3\x3b\x23\x7f\x78\x0a\xc3\x92\xc4\x13\x0d\x16\x8d\x16\x45\xc6\xb1\x4e\x71\x21\xf3\xe1\xac\xb6\xd4\xbd\x5b\x54\x24\xd8\xe6\x34\xcb\xa4\x15\x6f\xf6\x64\xa7\x22\x95\xf9\xd2\xc3\xac\x02\xc5\x6a\x00\x55\x03\xf2\x2c\x99\x67\xe3\xee\x88\x8c\xcd\x58\x0b\x2c\x86\x45\x3c\x2d\x3b\x9a\xd5\xc5\xfc\x82\xc2\xf0\x24\xa3\x23\x96\xe1\xc9\x82\x0c\xa4\x97\x19\x68\xd3\xd9\x43\x4a\x66\xdd\xe5\x4e\x5f\xca\x0c\x52\x36\x68\x20\x84\x1d\xfe\x49\xd0\x01\x06\xe9\x8a\x0e\x60\xc8\xd4\xe8\x00\x26\xd9\x53\xa0\x43\xd9\xe2\xa0\x25\x8b\x74\xb0\xa7\x76\x9d\x0e\x70\x74\x6e\x3b\x1d\x34\x4b\x12\x99\x17\x17\x4a\x5a\x93\xab\xb3\xa3\xc5\x0d\x5b\x85\x83\xd0\x26\x5f\x91\x60\x03\xa2\xbc\x7e\x33\x85\xb0\x81\x9c\xf1\x94\xa5\x56\x83\x05\x19\xef\x03\x4a\xff\xbf\xb8\x6b\xa1\x15\x3d\x8b\xe7\x90\x1f\x45\xce\x98\x52\x1e\x61\xc0\xfe\xd2\x7d\xf1\xc4\xcb\x80\x5b\x78\xc9\x3a\x39\x4c\x64\x42\x33\x80\xca\x6a\xc7\x31\x64\x91\x6b\x16\x07\x26\x3c\x58\x48\x10\x5a\x82\xcf\x7c\x14\x1f\x50\x93\xe0\x13\xe7\xfb\x12\x32\x65\x11\x7a\x47\x09\xb8\x87\x57\x98\x89\x07\xf7\xf9\x44\x4c\x7b\xaa\xfb\x68\x60\x5a\xfb\xb5\x91\x0e\xb9\xe1\x5d\x00\xe0\xb2\x13\x64\x22\xe5\x62\x02\x1e\x9d\x1e\x51\x2c\xa3\x90\xe8\xee\xf6\xf0\x35\x9a\x5f\xfb\xc0\xd1\x7e\x50\xcf\xce\xfe\xd1\xa0\x09\x71\x29\xdc\xc8\xe0\xe4\xf0\xfa\xcd\x18\xa5\x25\xd7\x64\xef\xad\x27\x40\x0b\xc4\xa2\x6d\x3c\x20\xf6\xf0\x0d\xc3\x6a\xa2\x8f\xed\x9a\x8b\xd4\x65\x50\xd6\x88\x15\xb0\x25\x51\x0b\x1d\x90\x1f\x01\x04\x2d\x12\x0d\xaf\xc9\x47\x41\x02\xb1\x48\xbf\x31\x7b\x5c\xa2\xc2\xea\xdd\x4b\xfd\xbb\x5d\x7e\xe1\x21\x8b\xc3\x7c\x10\xb0\xf6\xf6\xb9\x7d\x6b\xf6\x2e\xdf\xe7\xdf\x65\x6f\x93\xeb\x7a\xc3\x45\x2a\x6f\x74\xd7\x36\xc4\x4f\x38\xac\x57\xa8\x13\xcb\xd6\x86\x8b\x89\x8e\xed\x08\x9a\x65\x35\x37\xec\x2a\x43\xc2\xaf\x70\x40\x12\x5d\x56\xe0\x03\x73\x20\xe1\x77\x46\xc0\x03\xae\x49\xae\xe9\xb1\xb2\xaf\x62\x38\xcd\x86\x45\x73\x48\x25\xb2\xc8\x06\xdf\xbf\x1b\x1e\xd5\x87\xb6\xf2\xec\x06\x90\x6a\x2d\xb1\xed\xf7\x84\xa6\x39\xd7\x1a\xdc\x40\x6c\x34\x95\xf2\x9a\x1c\xf8\xb4\x8d\x09\x37\xd3\x72\x34\x48\x64\x1e\x65\x70\xf4\x35\x9f\xe8\x17\x8e\x69\xfb\x76\xf6\x87\x84\x8b\x8c\x8b\xc8\x35\x0f\x18\xac\xce\x8d\x01\x0f\x49\xc2\x2c\x60\x6d\x1d\xce\x9e\x8b\x32\x2f\x4f\x13\x91\xf5\x38\xcb\x36\x0f\x14\xb1\xbc\x3c\xe7\x2d\x6b\xde\xef\x59\x22\x78\x77\x87\xd0\x14\x97\x3f\xac\xa4\x23\x6a\x6f\x1b\x27\x52\xf0\x8e\x75\x4a\x1b\xf0\x92\xb9\x41\xad\x20\xf0\x12\xad\x8d\xd7\xcc\xde\xf2\x58\x9e\xb3\xa7\x21\xf6\x48\xdb\x45\x77\x75\x7d\x1d\x21\xfb\x0d\xa3\xd1\x22\x5d\x24\xf8\xde\x2f\x64\x8a\x75\xbd\xa1\x2e\x11\x00\xb9\xa1\xce\x98\xff\xcb\x9f\x36\xd5\x89\x25\x24\x26\x9c\xc6\x05\xbf\x0e\xd8\x2c\x25\x56\x71\xc8\xbc\xa1\x93\x17\x99\x95\x67\xb5\x91\xd1\x89\x3f\xe5\x3a\x86\x02\xec\x85\x89\x2c\x35\x5e\xef\x91\x7f\x5a\xcd\x91\x86\x6c\xa8\x5a\x67\xf8\x50\x34\x09\xe1\x46\x87\x0b\x0a\x30\x27\x46\x7a\x3b\x8a\xa4\x7c\x3c\x66\x3e\xeb\xca\xea\xc1\x54\xd1\x9c\x19\x88\x30\x23\x09\x46\x6c\xc2\x31\xad\x47\x8e\x09\xb5\x13\xd9\xdf\xd7\x55\x19\x5f\x0f\x53\x7f\xb8\x21\x39\x9f\x4c\x91\x51\x08\x25\x99\x14\x13\xe2\xe3\x0b\x99\xa4\x29\x01\xde\x96\x8a\xdc\x50\x95\x13\x4a\x12\x9a\x4c\x21\x58\x41\x05\x49\x4b\x05\x58\x57\x86\xd1\x74\xde\xd7\x86\x1a\x7b\xee\x33\xe5\xd4\x63\x3f\xff\x1d\x1e\xe2\x9d\xd7\x0e\x0f\xf1\xf6\x6b\x87\x87\xb8\xc3\x43\xdc\xe1\x21\xde\x7d\xed\xf0\x10\xdd\xb5\xf9\xb2\x46\xb2\xc3\x43\x6c\x78\x3d\xaf\x9a\xfc\x1d\x1e\xe2\x83\xae\x1d\x1e\xe2\xf2\xb5\xc3\x43\xbc\xe5\xda\xe1\x21\xde\x72\xed\xf0\x10\x77\x78\x88\x3b\x3c\xc4\x1d\xb2\xcb\xbd\x63\x6d\x27\xb2\x0b\xd9\xe1\x21\xba\x6b\x87\x87\xf8\x2c\x30\x6e\xc8\x0e\x0f\x71\xad\x6b\x87\x87\xb8\xc3\x43\x6c\x72\xed\xf0\x10\xe1\xda\xf9\x5e\x76\x78\x88\xfe\xda\xe1\x21\xe2\xf5\xdb\xd1\x9a\x77\x78\x88\xcf\x42\x57\xd4\x26\xe5\x8d\x20\x5e\xd6\xa9\xc8\x75\x51\xdf\xa8\x86\x67\x54\x8e\xc7\x4c\x81\xb2\x01\x4f\x5e\x8a\x30\x06\xe4\x8e\x90\xd9\xe0\x62\x88\x9a\x99\x1e\x14\xf7\xba\xcc\xbe\x5b\x7e\xee\x8a\x86\x00\x8a\x45\x31\x0d\x05\xad\x82\x9c\xbe\x7f\xd3\x4d\xf9\x6f\xbb\xca\x3c\x98\xf3\x7b\x91\xb4\xcf\x43\xa9\x08\xbe\x2a\xd3\xd4\xd1\x3d\xc9\xa4\xc6\x38\x30\x12\x2b\x99\x52\x21\x98\x57\x0c\xb9\x01\x83\x6b\xc4\x98\x20\xb2\x60\x02\x13\xdc\x42\xdf\x71\x6a\x0c\x4d\xa6\x03\xfb\x24\xe1\x89\xed\x90\x6e\xaa\x11\xb5\x51\x8c\xe6\x48\x74\xc5\x72\xca\x71\x28\x42\x13\x25\xb5\x26\x79\x99\x19\x5e\x84\xc1\x88\x66\x90\xb9\x87\x89\x9b\x81\x18\x10\x3a\x66\x18\xa8\x85\x7a\xd4\xf0\x34\x37\x2d\x19\xa3\x1f\x80\x5a\xda\x03\xf8\xb6\xbc\x30\xf3\x90\x23\xc3\xc8\x98\x2b\x6d\x48\x92\x71\xd0\x9a\xe0\x89\x58\x24\x01\xe3\xf5\x40\xa9\x35\x80\x3a\x03\x33\xd5\x6e\xaa\x22\x85\x23\xa9\x30\x1a\x33\x4e\xaa\x01\xdd\x50\x29\xd7\xee\x08\xd7\x3d\x42\x7d\x6d\x3f\x12\xda\xcf\x14\x48\x9d\xc2\x60\x7e\x74\xf7\x51\x34\x5c\x04\x08\x54\xa5\xe4\x54\x8c\x0e\xc5\xfb\x9e\x39\x7b\xb5\x46\xf9\x45\x80\x77\x80\x50\xf6\xd2\x36\x80\x05\x10\x6c\x66\x79\x80\x25\xcc\x5a\x0c\xf4\x16\xae\xff\xec\x4c\x6f\x98\xca\xb9\x80\xcc\x9c\x77\x4c\x6b\x3a\x61\x17\x0d\x3d\x92\xb7\x69\x5b\xe0\x94\xac\x16\x06\x58\x21\xc3\x3c\xfc\xf0\x49\x95\xc2\xb0\xaf\xe3\x29\x91\x1c\xe7\x14\x72\xa5\x6e\x14\x37\xd6\xc8\xe5\x1a\x51\x20\x20\xa8\xb1\x58\x69\xb3\xbf\x90\x08\xf1\xce\x0f\x52\xfd\xd8\x0a\x75\x91\xba\x7e\xca\x8c\x8c\x14\x67\x63\x32\xe6\x90\xeb\x00\xd9\x07\x3d\xac\x6b\xa6\x68\x2d\x68\x6d\x75\x59\x29\x7c\xac\xdb\xcf\x6b\x40\x7e\x72\x13\x33\xaa\x14\x09\x8d\xd0\x8e\x20\x17\x9d\x8f\xc9\x04\xb2\x17\x14\x66\x46\x7d\xfd\xf2\x3f\xbe\x21\xa3\xb9\x3d\xd2\xc0\x2b\x6d\xa4\xa1\x59\x78\xc9\x8c\x89\x89\xa5\x15\x6e\xcf\x7a\x36\x75\xa0\x00\x60\xb0\xe2\xc4\x5f\x7d\x79\x3d\xaa\x9f\xb1\x2f\x52\x36\x7b\x11\xd1\xaf\x9f\xc9\xc9\x2a\x70\xdb\xe6\xe9\x50\x0d\xd5\x9d\x15\x6c\x06\x88\x6f\xad\x19\xcd\x17\xd8\x93\xa9\xbc\x41\xa4\x90\x15\xdc\x53\xe5\x37\x15\xb2\x28\x33\xf4\x4e\xbd\x09\x75\x08\xa5\x66\xcb\xc9\xc6\x2b\xf7\x05\xf8\x53\xdc\x10\x0b\x52\xc3\x25\xad\xf8\x47\x4a\x97\xb7\xe9\x2c\xfe\x50\x67\x5f\x2a\x36\x20\x6f\x68\x96\x8d\x68\x72\x7d\x25\xdf\xca\x89\x7e\x2f\x4e\x95\x92\xaa\x3e\x97\x8c\x5a\x69\x39\x2d\xc5\x75\xbd\x3f\x71\x26\x27\x56\xb5\x2a\x4a\xe3\x93\x04\x57\xbd\x30\x56\xd6\x78\x21\xec\x44\x6b\x34\x0a\xfb\x04\x3c\x74\xc3\x2d\xbb\x09\xc2\xec\xf3\x91\x23\xe3\xf1\x75\xcc\x6c\x5f\xbe\xfc\xfa\x8f\xc8\xba\xd6\x74\xf8\xe3\x4b\x48\x6c\xd2\x3d\xdc\xc4\x20\xdb\xec\x41\x91\xd3\x2c\xb3\xd6\x42\xcc\x94\x96\xd0\xab\x98\xf0\xb3\xf3\xa0\x69\xcf\x6e\x6b\xab\x52\x57\x57\x7f\x05\x3d\x8a\x1b\xcd\xb2\x71\x0f\x33\x7e\x03\x46\xcc\x3e\x1c\x0c\xfb\x4e\xfa\xd8\x73\x75\x1b\x14\xa0\x99\xcc\xca\x9c\x9d\x30\x68\x2d\xdf\x9a\x54\xb5\xd1\x7c\x56\x5c\xc6\x35\x24\x57\x8f\x32\x99\x5c\x93\xd4\x7d\x19\x85\xa8\x17\xb1\xe2\x9a\x53\xa1\x69\xb0\xbe\x45\x90\xfe\xd6\xf7\xaf\x85\xe7\x73\x5a\x14\x21\xff\x56\xd1\x9b\x1a\x31\x60\x4f\x42\x61\x53\xcb\xc2\xd1\xd6\x2e\xa4\xb6\x0e\xa4\xbe\x7b\x23\x2b\x37\x1b\x0f\xd1\x38\x3c\xdd\xde\xff\x54\xcd\xbe\xb9\xd3\xa1\xc6\x10\xd5\x80\x7e\x37\x14\xf0\x6f\x4c\xbd\x5c\xaa\x38\x08\x49\xeb\x81\x31\x50\x01\xb0\xec\x03\x22\xb9\xb9\x33\xa5\x03\xcf\x45\xbb\xdc\x84\x1a\x5d\x44\xf0\x18\xe5\xd4\x38\x85\xd0\xbb\xa6\x28\x29\x98\xd2\x5c\xdb\x73\xf9\x47\xd8\x50\xc7\x19\xe5\xb9\xb7\x2c\x0b\x99\x6e\x86\x08\xb8\xb9\x01\xe2\xab\xbd\xa4\xbc\x90\xa9\x1b\x10\x44\x21\xc2\x9b\xad\x50\x6b\xeb\x5a\x6d\x87\x07\xea\xa6\x45\xe5\x8f\x15\x35\xeb\x92\xd2\x7e\x12\x44\x25\xde\xf5\x9c\x04\x24\xbc\xdf\x53\x95\x8f\x61\xf2\x1d\x89\x01\x10\x8c\x6e\x71\xeb\x92\xb0\x66\x3c\xe2\x46\x89\x54\x7a\x67\x07\x0e\x08\x86\xcb\xec\x9e\x70\x3f\x25\xfb\xaf\xf7\x37\x2a\x24\x91\x44\x4a\x16\x74\xd2\x0a\xac\x79\x81\x52\x8b\xc3\x92\x94\xa1\x11\xc0\x34\x98\x41\xf0\x7d\xc0\x57\x80\xbb\x58\x5a\x55\xdc\x42\x3d\x35\x46\x3e\x3c\x81\x9d\x81\x80\xb5\x4e\x37\x74\x4e\xa8\x92\xa5\x48\x9d\x7f\x29\x38\xf8\xde\x2d\x3c\xf8\x5c\x0a\x30\x33\x7c\x1d\xbe\x55\x5d\x21\xc1\x8a\x6b\x32\x62\x86\x5a\x31\xfd\x6a\xf0\xea\xe5\x73\x39\xa9\xe0\x0d\x17\x4e\xaa\xf3\x70\x52\xa1\x7c\xda\xe8\xbb\x7a\x58\xc7\x8e\xde\xf7\x9d\x73\xb1\x54\xa8\x8d\xdc\xa3\xd2\xc1\x47\x37\x8a\x1b\x16\xb5\x64\x38\x00\xc3\xc5\xda\x87\x51\xc5\xe3\x61\x87\x60\xa5\x5d\x80\xaf\x11\xa2\xcb\xd1\x23\xca\x2d\x27\xa0\x60\xbb\xad\xf2\x70\xe9\x3b\x44\x58\x4c\xa8\xbd\x3d\x72\x80\x77\xee\x63\xd5\xcf\xe1\x46\x59\xcb\x11\xed\xf4\x53\xd1\x02\x4c\xa7\x46\xb8\xd3\x4f\x05\x05\x1f\x5c\xd1\x21\x05\xbf\x63\x53\x3a\x63\x50\xed\xc4\x33\xaa\xb2\xb9\x25\xe5\x10\xe7\x4e\x46\xa5\x21\x4c\xcc\xb8\x92\x02\x82\xf7\x33\xaa\x38\x1d\x65\x8c\x28\x06\x55\x93\xd6\x16\xfd\xb7\x83\x1f\x8f\x2e\x21\x58\x79\xe8\xca\x3d\xdd\x2c\x4b\x0d\xe9\x61\x0b\x33\x89\x86\xbb\x77\xf9\xfc\x3c\x2c\x0d\x41\xe6\xfa\x79\xd9\xe7\xe4\xa5\x29\x11\xf9\xf7\x53\x92\x95\x9a\xcf\x36\x25\x49\x5c\x19\xda\x09\x6f\xb4\xce\x0b\x25\x71\x15\xa1\x96\xaa\xdb\xc0\xb5\x0e\x47\xcb\x3d\x50\x73\xfb\x3a\x80\x73\xc4\xc8\x10\xce\xf5\xe4\xea\x54\x31\xcf\xc6\x63\xb3\x2c\xa9\x10\x50\x93\xbd\x59\x27\x94\x90\x29\x7b\x78\x45\x7b\x3d\x74\xef\x86\x40\x00\xaa\xa8\xd4\x47\x27\x53\x96\x96\x19\x73\xd5\xc6\x32\x25\xd2\x9a\x0f\xb4\xc2\xeb\x10\x00\x44\x7d\x36\x0e\x75\x7f\xa2\x0f\xce\x41\xa4\xb9\xff\xbd\xf2\x55\x82\xfe\x03\xbd\x30\x22\x18\xa5\x76\xac\x1e\xa1\x5a\x97\x39\x6e\x09\xc4\x19\x1d\x73\xa3\x43\x4b\x20\xaf\x1d\xdb\x8d\xf1\xc0\xca\x8b\x16\xf4\x1d\xb2\x0c\x98\xab\x05\x8d\xf7\xcf\xa3\x71\x90\xd0\xda\xff\xe5\x18\xce\x25\x37\x40\xb4\x2d\x24\x7c\x49\xf0\x92\x8e\x39\xe0\x74\x53\x47\xef\xe1\x8a\x5f\xa2\xea\x80\x77\x40\xe9\x35\x1d\xb1\x4c\x2f\x0e\x34\xaa\x16\xc5\xe1\x17\x39\xc2\xb7\x6c\x6a\x44\xb5\xe6\x13\x01\x0d\x52\xec\x68\x0f\x6c\x85\xd2\xd8\x66\xea\xa2\x5b\x51\x43\xbe\x90\x33\xa6\xa6\x8c\x3e\xd0\x4c\x5b\x88\x66\xb9\x31\x2a\x64\x7b\xed\xea\x8e\x1c\xb7\xfb\x87\xd8\x5d\x21\x13\xc8\x7f\x45\xef\xba\xef\xa1\x41\x61\x61\xb1\x0b\xd6\x84\xcf\x98\xf0\xb8\x44\xc7\x19\x0d\xbd\x51\x50\x79\x0e\xd8\x48\xa5\x91\x21\x5e\x61\x8d\xa0\x0a\x5c\x05\xc2\x9b\xce\x55\x1a\x8f\x13\xdd\xe2\x3a\xab\x64\x1e\x4b\x78\x9d\x3b\x21\x64\x80\xc8\xe4\xbd\xea\x95\x72\x6f\x56\xd5\x00\x2b\x48\x02\x81\xad\xd0\x82\x0c\xc3\x07\xf7\x3f\xc2\x45\xa3\x2d\x07\xad\x1a\xc6\xed\x14\x7b\x88\xa3\x49\x12\x08\x9b\x59\x95\x73\x4e\x00\xfb\xfa\x6c\x5c\x7f\x12\xaf\x21\x73\x41\x7e\x24\xec\xbc\xea\x28\xb8\x90\xe9\xb0\x60\x49\x8f\x84\xa5\x8c\x1b\xcb\x38\x57\x0b\x26\xa4\x44\xf0\x52\x78\x88\x28\xc5\x74\x21\x11\x20\x2c\x7e\x6c\xdc\x8d\x8c\x9b\x5a\x9c\x1d\x71\x92\xc1\xae\xaa\xaa\x97\xff\xc5\x94\x5c\xb9\x7d\x27\xdc\x0c\xae\xff\x08\x7b\x97\x89\x29\x15\x09\x8a\xcd\x17\xd7\xac\xd0\x2f\x34\x9f\xe0\x56\xfd\xf2\xe5\xab\xff\x78\xf9\xe5\x97\xdf\xc0\xe6\xf5\x74\x19\xe4\xe9\x82\xe1\x45\xb3\x62\x4a\xfb\x08\xd7\x49\x21\x96\xf5\x43\x90\x0e\x64\xf6\x6a\xf0\xea\x1b\x0c\xb6\x73\x8d\x88\x00\x53\x29\xa4\xeb\x8a\x89\x45\x22\x2e\x8c\x8d\x8c\xe0\x89\x17\xc8\xe6\xc0\xec\x1f\x18\x42\xdc\xa8\xe0\x78\x32\xcd\xcd\x1a\xa6\xb8\xb5\x4d\x6b\x6b\x95\xca\xd6\x61\xfa\x5a\xa1\x98\xd5\x49\xb8\x14\x4d\x82\xc3\x75\xa3\x6c\x61\x28\xef\x71\x77\x7f\x59\x39\xec\x9f\x26\x26\x56\x34\x6b\x14\xd7\x99\xbc\x81\x84\x0e\x2e\x15\x37\xf3\x01\x60\x67\xc8\x31\x39\x67\x33\xa6\x7a\x7e\xd4\xb7\xf6\xa6\x8b\x70\x4f\xac\xf5\xaf\xba\x23\xc2\xec\x5f\x76\x91\xf4\x1d\xb8\xe5\x24\xce\x1d\x38\x97\xe2\x22\xcc\x2e\x0c\xe3\x76\x5e\xdf\xde\xfa\x59\x34\x2a\x4f\x86\x16\xeb\x80\xd8\x8c\xee\x05\x5c\x53\xc6\x1f\xa9\xe2\xb2\xd4\x04\x1d\xd9\x80\x9d\x23\x05\x1c\xa9\x18\xfc\x0e\x24\x02\x7d\xca\xb9\xa6\xc2\x20\x21\x5f\xd5\x7b\xa7\x02\x7d\x8e\xc2\x71\x73\xbc\xfa\x44\xe3\xc6\x2e\xfa\xcc\x3f\x4a\xf9\x24\x1d\x84\xb2\x8b\x9e\x8c\x67\xd9\xca\xe3\xcb\x1f\xc8\x3a\x9e\x28\x0c\xe3\xe7\x01\x47\x83\xd5\xd2\x71\x94\x29\x9f\xf8\x54\x30\x78\x7f\x54\xb8\xa3\x4f\x03\xb3\x35\x58\xd2\x26\x3b\xbe\x69\x46\x62\xb1\xf8\x7e\x2d\xd8\xa2\x8e\xb2\x14\x03\x35\xc1\xca\xee\xeb\x68\x0b\xee\x21\x9f\xc0\x19\xd8\x4f\x14\x37\x3c\xa1\xd9\x1e\x1c\x61\xfe\x2b\x6b\x30\x1b\xa6\xe2\x6f\x15\x23\xe6\x46\xe2\x53\x68\x46\xae\xd9\xfc\x46\xaa\xd4\xab\x17\xfe\x89\xd5\x5a\x68\xe3\x1f\xc9\x99\x93\x05\x88\x91\xa3\x72\xa6\xc8\x88\x79\xdb\x7f\xe1\xe6\xf9\x80\x1c\x89\xb9\x73\x9c\x8a\x38\xf5\xd9\x6b\x11\xa3\x39\xaa\x38\xa8\x04\xd6\x98\xc4\x9d\x87\xfe\x69\x14\x93\xd2\x6f\xb3\x8b\xad\xfe\x18\x76\x81\x57\x5e\xbc\x61\x2c\x15\x41\x18\x14\xd8\x1d\x8a\xa1\x8d\xe7\xbf\xfe\x2c\xd2\xc2\xaa\x67\x5c\x30\xad\xbf\xb7\x4b\xd9\x46\xdb\xae\x73\x07\x05\xad\xca\x8d\x0d\x72\xb2\x4a\x86\x62\x76\x4b\x51\xdf\x5f\xd6\x52\x28\xdc\x39\x20\x47\xf0\x01\x64\xf3\x59\xc5\x11\x70\xad\xec\x60\xd6\x4c\x5d\xe8\xbc\x84\x77\x1c\x9d\x9f\xf8\xac\x2b\x54\x3a\x74\x1d\x44\x0d\x35\xfe\xfa\x4c\x40\x51\x75\xb9\x3f\xec\x97\x92\x42\x23\x8d\xbd\x2b\x55\xb2\xbd\x66\x9a\x1e\x33\x37\x52\x5d\xbf\x78\xf9\xf2\xe5\x1f\x40\xd1\x83\xa9\xfd\xef\x2f\xbf\xfb\xdf\x5f\x7e\x37\xc8\xd3\x26\x5a\xd7\xc3\xa3\x7b\x8d\xe2\x7a\x8b\x21\xcd\xcb\x98\x1f\x3c\xc1\xbd\xd9\xe4\xdc\x6d\x50\x71\x00\xcb\x14\x68\xde\xc8\x28\x6c\x14\xc5\x6b\x1e\xbf\xeb\x57\xd3\xbd\x7a\x38\x4e\x73\x9b\xd0\x5b\xed\xb9\x5d\xf8\xe7\xaa\xd1\x70\x55\xb0\x0d\x64\xf5\x9c\x28\xd2\x8e\xf0\xc7\xee\x63\x48\xe4\x01\xc1\x05\xfe\x0c\x10\x8f\xf3\xa2\x45\xd2\x52\x03\x79\x03\x39\xba\xad\x55\xc5\xfd\x4b\x1c\x88\x14\x95\x6e\xb8\x94\x7b\x19\x7c\xd3\xa0\x77\x38\xad\xf0\x08\x12\xd9\x7b\xe4\xbd\x78\x83\x99\x7d\x3d\x54\x14\x6b\x05\x96\x78\x53\xa7\x05\x0e\x2f\x7e\xe7\xde\xbd\x8f\x53\x6e\x22\x14\x1e\x4e\xee\xc8\xf0\x6d\x79\xfa\xef\x5f\x2e\x8c\x55\x63\xbd\x9a\x61\xef\x4e\x48\x5e\xe1\x3b\x3b\xf1\x49\x26\x4a\x96\x85\xf7\x01\xd7\xc1\x9a\x2b\x4c\x4f\x74\x5d\x62\x27\x11\x21\xeb\x43\x07\xdf\x0d\x30\x30\xab\x30\x52\x53\x92\xa0\x75\xef\x4f\x5d\xcc\xdf\x46\x07\x88\x2a\x45\xbd\x11\x52\xe4\x45\xdd\xcb\xd8\x84\x26\xf3\xbd\xfa\x73\x56\xf9\xac\xb9\xf6\xbd\xcb\x79\xc2\x0d\x3e\xaf\xca\xc6\x84\xa4\x4d\xd0\x1f\x70\xaf\x81\x6a\x10\xba\xd5\xf9\x23\xdf\x97\x13\x4c\xa9\x48\xc1\xcb\xd3\xd8\xb1\xe0\x46\xea\xc3\x34\x82\x43\x01\x5c\x9f\x10\xc5\xf5\xfd\xeb\x56\x7a\x13\xbe\x6e\xe4\x09\x78\x30\xfb\x05\x0f\x75\xa7\x9a\x67\x6d\x85\xad\x3a\xc5\x75\x01\xdc\x80\xee\x90\x70\xf8\x87\xa7\xdf\xa5\x9c\xad\x1e\x24\x34\xc8\x0d\x43\x7c\x16\x72\xb5\xe9\xfc\xbd\xba\xe7\xb7\x87\x8e\x9d\xca\x2c\x85\x6d\xe5\x7c\x4c\xfe\x51\x84\x1a\xa3\xf8\xa8\x04\x28\x7f\x91\x02\xf4\x60\xbd\x36\xc4\x41\x86\x0f\x48\x55\x1c\x10\xdb\xce\xc0\xf7\x03\x42\x86\xcc\xf5\x7b\x8c\xe6\x01\x52\xd9\x93\x12\xec\x28\xe0\x45\xe8\x2c\x84\x26\xdb\x67\xf2\x47\x35\x3f\xbc\xc7\x4d\x5b\x0a\xd6\x61\xf6\x8f\x82\x4d\xa3\xcb\xc2\x55\x21\xd3\x0c\xc5\xe1\x52\x03\x92\x85\x73\x0c\xd2\xa6\x40\x20\x0e\x65\x1e\xe2\xac\x96\x16\x1a\x41\xb3\x80\x97\x7d\xb3\x39\x23\xa1\x26\x69\xe2\x1c\xb1\x37\x76\x88\x29\x2f\xd0\x02\xa7\x26\xfc\x1c\x82\x15\xf6\xeb\xe0\xbf\x28\x64\x0a\xf0\xfd\xaf\xd0\x04\x96\x37\xe0\x02\xff\xfe\xec\x24\xec\x11\x7b\xd7\x9b\x21\x10\x84\x7c\x39\x70\xbd\x44\xcc\x84\xa7\x64\x84\x01\x2a\x2b\x5d\x0f\x04\xbb\xc1\x94\x37\xe7\x25\x0e\x5a\xf8\xcc\xa7\x82\xe1\x68\xe1\xe1\x6e\xc8\x43\xf2\x95\x6b\x0b\xc1\x94\xb7\xe1\x47\xdc\xa5\xc4\xbc\xbf\xdc\xf7\xbe\xf9\x9b\xbe\xba\xe9\xf7\xfb\x7d\x3b\x57\x2f\xd3\x57\x34\xdc\xb3\xfb\x3d\x97\x29\x1f\xcf\x17\x28\x61\xd9\xbc\x7a\x04\x70\x24\x15\x73\x37\xbb\x06\x7d\x00\xda\xb9\xf1\xda\x34\x20\x73\xcc\x79\x0c\xeb\xdd\xb4\x34\xa3\x2e\x37\x56\x0c\xe9\x8c\x62\x4d\x46\x6c\x4a\x67\x5c\x42\x31\x29\xf0\x18\x24\xf9\xdd\x42\x57\xef\xf2\x71\x8b\xee\xb0\x47\xd0\x24\x67\x9f\x0a\x89\xc8\x66\x90\x44\x7b\x21\xd3\xe5\x50\x0a\x78\xb9\xed\xa6\x80\x5c\x80\x1a\xd3\x3b\xed\x01\xab\xfb\x3d\x11\xc8\x88\xda\x21\xc3\x74\x0e\x16\x96\xf9\x70\x40\xce\x1c\x67\x80\xf5\x27\x24\x61\xe3\xb1\x55\x53\xa4\x20\xac\x98\xb2\x9c\x29\x9a\xd5\x1f\xe4\x8a\x89\x5e\x5b\x69\xa9\x2c\x93\x61\xb8\x22\xa7\x05\x0a\x4b\x90\x7d\x29\x57\xbe\x11\x86\x13\x71\x96\x5f\xf7\xde\x43\x3b\xca\x77\x5c\x83\xa2\xe2\x3c\x1f\xa8\x56\xee\xad\x3a\x8f\xfc\x77\x21\x33\xeb\xe1\xd5\x3e\x2d\xfc\xc1\x6d\x9a\xa7\x6e\xa8\x6d\xea\xa6\x1b\xcf\xb9\xd8\x2f\x35\x6d\x52\x5a\x37\x27\x3b\xda\x35\x4d\xdd\xb5\x4b\x5d\xa7\x5d\xea\xa6\x59\xb4\x29\x3f\x36\x4b\xd4\x6b\xd1\x1f\x75\x2b\x3b\xa3\x6e\x7a\xf5\x9e\xb8\x80\x69\xdb\x17\xf5\xe1\x1d\x51\xd7\xe9\x64\xf4\xe8\x2d\x51\x9f\x11\xd7\x34\xac\xb2\x68\x57\xa4\xd0\xa2\x21\xea\x46\x5b\xa1\xb6\x4c\xd6\x6d\xde\xfe\x74\xa3\x8d\x4f\x5b\xbe\x75\xf3\x5e\x76\x1b\x6d\x73\xda\xf2\xad\x9b\xb7\x36\xdd\x68\x53\xd3\x16\x6f\xdd\xb6\x91\xe9\x83\x5a\x98\xb2\x05\xe7\x49\x70\x28\x7f\x5e\x31\xd8\xa6\xd0\xac\x61\x27\xd1\x96\x92\xb7\x93\xee\xa1\xbb\xbe\xa1\x5d\xf6\x0d\xdd\x0e\xf9\xba\xeb\x12\xda\xae\x4b\x68\x1b\xc9\x19\xb9\x8b\xc1\x3f\xd3\x56\x93\x3e\x0a\x68\x0e\xe0\x7c\xae\xb5\x02\xad\x10\x9f\x9c\x51\xe5\xba\x0c\x2d\x28\xbe\x3d\x58\x1d\x97\xe2\xb9\x74\xb8\x60\x1a\x50\x4e\xd5\x9c\x7c\x7f\x76\x82\xfa\x6f\x4d\x0d\x17\xd2\x3f\x3a\x70\x4a\xea\x40\x7d\xa8\x98\xb7\x57\x5b\x9b\xd5\x45\x37\xae\x8a\x6e\x8b\x37\xd7\xca\xc6\x9a\xeb\xc4\x64\x6d\x59\x62\x88\xa3\x40\x8c\x88\xd0\xc0\x1f\x82\xe6\x4c\x17\x34\xb1\xd2\xcf\xdd\x01\x71\xda\xa8\xe6\x61\x60\x2d\x17\x17\x03\x2d\x45\x85\xb7\xea\xef\x3f\x58\x3c\x90\xfd\x96\x3c\x74\x05\x40\xde\x2b\x93\xd1\x52\x24\xd3\x27\xb2\xe2\x2b\x88\x17\x7c\xe4\x94\x5c\x33\x25\x58\x56\xf5\xf0\xf3\x75\x21\xac\x49\xbd\x7a\xcb\x72\xf7\x76\xc5\xee\x2d\x0a\xd5\x9b\xb7\xe4\x68\x5b\xe2\xde\xa6\x70\x78\x45\x9f\x82\x31\x9e\x4d\x76\x4a\x73\xd7\xbe\xa6\xe1\xe0\xad\xab\x39\x5b\x35\xd9\xa8\x23\x37\x80\x5b\x61\x3b\xde\xad\x6d\xeb\xeb\xc7\x6f\x7a\xbd\x0c\x5d\xb1\xaf\x97\xdc\x30\x4f\xab\xfb\xf5\x06\xfd\x3b\x5d\xf5\xba\xde\x75\xb9\x26\xed\x85\x4a\x97\x9d\xad\xb7\xa5\xa7\x75\x5b\x47\x5c\xfb\x3e\xd6\xbb\x0e\xd6\x8f\xdc\xc1\xba\x71\x7a\x95\x9a\xf1\x84\x1d\x25\x89\x2c\x45\xab\xec\xaa\x13\x66\x5f\x81\x1a\x96\x0e\x6b\x63\xa2\x3b\x2e\x85\x6f\xb1\x9c\x94\x66\x9c\x62\x99\x70\xfd\x4e\x2c\x35\xa9\xc6\x01\x77\xde\xc2\x0c\x1d\xcb\x60\x77\xc0\xcf\x93\xaf\xb7\xf4\xfc\x76\x39\x68\xcb\x6f\xb3\x2c\x00\x16\x28\xe8\x3c\x79\x4b\xc9\xa0\xeb\x65\xe2\x1a\xaa\xaf\xab\xe2\x69\x06\xb9\xf8\x61\x33\x45\x9f\xbb\x17\xed\x53\x7c\x6a\xa3\x82\xea\x06\xd4\x35\x7f\x91\xda\xd8\x97\x3f\xd2\x6f\xfe\xf3\xe4\xbc\x5d\x46\x64\xc0\x8d\xc6\x2c\xef\xa9\x1b\x3a\xa8\x22\x71\x6d\x6d\x5c\xa4\x63\x9f\xdc\x23\x8a\x3a\x48\x4c\x8a\x42\x28\x63\x14\x4d\x3e\x72\x10\xe5\xab\x1e\x0e\xc8\x99\x20\x55\x24\x0c\xf5\xa5\x1e\xae\x4b\xce\xa8\xd0\x51\x21\x16\x83\xa1\x7d\xb6\x57\x98\x0f\x26\xf5\xb8\xd5\x76\xd6\xd1\x81\x77\xe9\xd4\xef\xc0\x4e\xc5\xa4\x34\xda\x7e\x8e\x0f\xf7\x02\x73\x8d\xc7\x2b\x36\xe1\xda\x28\x57\xb3\x66\x07\xac\x26\xe1\x8c\xd6\x70\xcb\x35\x9b\x93\xbf\xfc\x70\xfa\xd7\xbf\xbf\x7d\x7f\x7c\xf4\xf6\xef\xef\x8e\x8e\xff\x72\x76\x7e\xfa\xf1\xe3\xf0\xaf\xc3\xab\xd3\x77\x1f\x3f\x1e\x97\x4a\x31\x61\x5c\x51\xda\x90\x99\x8f\x1f\x1d\xa7\xea\x8f\x1f\xaf\x92\x82\x17\x1f\x3f\x5e\x54\x7d\xda\x8d\x84\x97\x07\xf9\x89\xb5\x11\x21\x23\x01\xd2\x8d\x90\xe8\x30\xef\x29\xd5\x55\xf6\x51\x2d\xeb\xbc\x01\xca\x4e\xd3\x80\xbd\x9e\x52\xc5\x2e\xf0\x70\x39\xf7\x86\x7e\xab\xcd\x6e\x07\xac\xa0\xce\xbd\x03\x29\x38\x11\xc8\x88\x99\x1b\xe6\x8a\x79\x16\x8f\xb9\x38\xc9\x11\xca\x03\x3d\x4a\xbd\x3d\x8a\x56\xc0\x29\x63\x8d\xb3\x24\x33\xce\x6e\xb0\x70\x9c\x4f\x04\xcd\x22\x4c\x6f\x28\xee\xc3\x02\xaf\xc5\x68\x00\x23\xda\x72\x44\x21\xd3\x80\x5f\xbe\xe0\xf5\x5a\xf2\x78\xd5\x92\xc9\x11\x8c\x81\xa5\xe4\xe2\xec\x84\xbc\x1a\x40\x63\x12\xfb\x4f\xc0\x86\x59\x45\xd6\xd0\x36\xdf\x1e\xa8\x78\xfa\xae\xc8\xa6\xad\x18\xa0\x89\x30\x6a\xc0\x01\xe5\x28\x95\x39\x7d\x68\xa7\x82\x7b\xf2\xb2\xc7\x65\x96\xcd\xc9\x2f\x25\xcd\x50\x07\xb8\x90\xe9\xb2\x64\xda\xfb\xd6\x7f\xf4\xa7\xc1\xb7\x61\x1e\x7f\x1a\x7c\x6b\xf7\x4d\xe0\x98\x3f\x0d\xf4\x2c\x19\x7c\xeb\xca\x04\x89\xbb\x69\x65\xf2\xdc\x52\xce\x3f\xec\x39\xea\x7e\x03\xcf\xa6\xc6\x72\xde\x67\x49\xe3\x8e\xb0\x9d\xbf\x57\x34\x61\x17\xcd\xfb\x86\xd5\xa8\xed\x59\x86\xa4\x0e\x17\x84\x54\x4d\xc3\x02\x09\x04\x63\x29\x2a\x89\x6e\x16\x8c\x4c\xec\x24\x60\x61\x50\x0b\x84\x0a\xc4\x44\x31\xea\xba\xcb\xa6\x2c\x63\x26\x6a\xc7\x8b\xee\x01\x1f\x5c\x11\x52\xf4\x05\x9b\x60\x88\xc4\xb9\x39\x31\x0c\x83\x52\x16\x2b\x18\x43\x6c\xc0\x0d\xc6\xf3\x9c\xa5\x56\x05\xca\xe6\x15\x1a\x7f\x68\x1d\x22\x78\xd6\xab\x95\x45\xc0\x14\x5d\x83\xb5\x9a\x2d\x1d\xf4\x1f\x78\x62\xed\x36\xa7\x4b\xac\x22\x46\xd5\x09\xaf\x92\x08\x1e\xd3\xa3\x2a\x09\x82\x44\x4d\x8d\xfd\xa0\x62\x3c\x6e\x27\x4c\xbc\x6c\xc0\x2c\x11\x94\x4a\xf1\x80\xf6\xd7\x63\xa9\x12\x3e\xca\xe6\x64\x4a\xb3\x0a\x9b\x9b\x5c\xdb\x37\xc0\x61\x06\x64\xc8\x4c\xfc\xfa\x99\x14\x93\xf8\xe0\x65\x9f\x0a\xc4\xbc\x48\xec\x06\x2e\x0b\x7c\x9e\x3d\xaf\xe6\xb2\xbc\xc5\x00\xf8\xaa\xea\xff\xf6\xf9\xeb\x8f\x1f\xe4\xa5\x36\x32\x63\xb8\x3e\x6d\x38\x7f\x65\xfd\xc7\xbe\x8e\x47\x6f\x42\x88\x4d\xd4\x58\x5e\x79\xb4\x20\xcb\x11\x57\x61\xfe\x60\x39\x60\x7f\x0d\x0c\xc5\xe0\x37\x50\x95\x31\x27\xf6\x14\x32\x18\xd3\x8f\xeb\x9e\x8c\x82\x4e\x20\xdf\x5e\xb3\x79\x0f\xcb\xd4\x51\xa9\xf8\x53\x04\x7b\x16\x0a\xfd\x64\x61\x07\x94\x8a\x7c\xeb\xff\xf5\xa7\x87\x5a\x5f\x2d\xdc\x46\x6d\x9c\x46\xf8\x52\xad\x3d\xf5\xa7\x98\xee\x5d\xaf\x5b\x47\xca\xba\x4c\x70\x23\x91\x5c\x03\x72\x0a\xd5\x5c\xa8\x61\x3a\xe8\xa7\x2c\xab\xdd\xac\x7d\x1b\x97\x5a\xcd\xb3\xbc\x61\xb5\x34\xf0\x73\x39\x74\x15\x44\x80\x43\x31\x66\xaa\xfa\x04\x04\xcc\xb9\x3c\xfd\xc4\x92\xf2\xa1\xd8\x10\x78\xb5\x72\x75\x5c\xb3\xf6\xc0\xfa\x3f\xb0\x80\xd1\x81\xb4\xb1\x5a\x75\x48\x02\xae\x76\x67\x94\x89\x72\x37\x6d\xaf\xd9\x5c\x07\xe4\xa3\x6b\x1c\xdd\xd5\xea\x05\xfe\xf5\x07\xd3\xe9\x27\xae\x8d\xfe\x3f\x1e\xd5\x3f\x1f\x55\xfd\x14\x28\xa6\x84\x54\xa3\xfb\x25\x11\x00\xf7\x8f\x8f\xf9\xdc\x04\xf7\x2f\xd0\x9a\xea\xef\x3d\x25\x22\x5c\x2b\x6a\xdf\x69\x5f\xbb\x64\x06\x29\xa0\x22\x23\x06\x48\xaa\xc2\xf0\xf8\x63\xe4\x4f\xa4\x21\xd0\xe5\xd4\x2a\x6d\xf5\x63\xc6\x7d\xe4\x6e\xe2\x50\x2b\xcf\x67\x34\x63\x68\xa7\xdf\xf0\x2c\x4d\xa8\xc2\x88\xa0\x83\xc9\xd0\x0e\x6d\xce\xd5\x87\xdb\x33\xce\x49\xb2\x6a\x95\xb5\x0b\x3d\x50\x65\x78\x52\x66\x54\x11\xbb\x1f\x27\x52\x3d\x10\x4d\x03\xaf\x76\xdd\x25\x02\x8b\xb6\x68\xba\x56\x97\xef\x8b\x23\x2e\xa2\x8f\x39\xed\xc5\x9a\x40\x90\xca\x5e\xdf\x28\x07\x75\xb4\x3a\x39\xf6\xb2\x29\x08\x8a\x18\xbf\xca\xd4\x90\x69\xf8\x04\x30\xa1\x0e\xa3\xc3\x23\xec\xcc\x01\xf9\x2e\x54\x35\xf6\x02\x9c\xa0\x43\x08\x76\xcf\x74\xdb\xc6\x2d\x57\xb5\xa9\xc7\x52\x41\xab\x90\x83\x54\xc2\x6f\xd8\x8c\x27\xe6\x70\x40\xfe\x5f\xab\xf9\x59\xd6\x09\xea\xa1\xdb\x66\xa1\x5e\xac\x42\xd1\x7a\x49\x0e\xe0\x67\xb1\x62\x78\xe8\xfd\xe2\x0e\x1c\xfd\x89\x05\xdf\x5b\x44\xe4\x56\x44\xe3\x6a\x62\x14\x35\xc5\x05\xd6\x08\x27\xbf\x0c\x12\x32\xc8\x44\xae\xdd\x2e\xad\x79\x62\x43\xfa\x8a\x17\xa1\x81\x71\xfe\x69\xf9\x8b\x12\xc5\x26\xb0\xff\x70\xf7\x7c\xc6\xdd\x67\x64\x21\x33\x39\x99\x0f\x0b\xc5\x68\x7a\x2c\x85\x36\x0a\x44\x43\x1b\xd4\xa2\xdb\xc6\x8c\xd0\xe9\xa7\xf2\x86\x50\x57\x76\x29\xc7\x08\x21\x25\xcb\xc9\x14\xf1\x38\xe1\x87\xbe\x93\x93\x9f\xa2\x33\x22\xf5\x80\x0c\x03\xde\x26\x30\x78\x80\xef\x84\x51\xc0\x81\x71\x43\xe7\x6e\x33\xd1\x11\x4f\x99\x8e\x12\x12\xfd\x64\x06\xe4\xc8\xca\xc1\x5b\xe7\x6a\xa5\xf2\xd1\xf9\xc9\x43\x41\x4e\x37\xa8\xd0\xde\xf2\x2a\x51\xeb\x5e\xe8\xf2\x14\xe8\x1b\x34\x52\xa0\x1b\xcd\xa5\xd3\x54\x11\x60\xd1\x53\xe6\x33\xea\xa6\x6d\x20\x45\x72\xfa\x69\x78\xcd\x6e\x1a\xfc\xd2\xbf\xe8\x0f\xec\xe1\xa9\x2b\x7d\xb0\x47\x3f\x08\x4d\x0d\xd7\x63\x40\x43\xfe\x8c\xfa\x38\x64\x18\x37\x03\x6d\xc5\xab\x9e\xa8\x1f\x8f\xe6\xab\x1f\x03\x8a\x58\x8d\x59\x5c\xba\x51\x65\x07\xe1\x01\x88\x19\xcf\x01\xef\xd5\xee\xa0\xc4\x61\xa0\x1b\x59\xc1\xec\x63\xe4\x21\xb4\x43\xf5\xbb\xd6\x4c\x19\x57\x0b\x78\x91\x0b\x7b\xbf\xb9\x60\x6c\x9c\xb9\xd3\x36\x0d\x06\xc8\x73\xfa\xc9\x6a\x1e\xba\x59\x62\x05\x5e\xf5\x16\x06\x0b\x83\x62\xb8\xcb\xe7\x8b\x2d\x2c\x43\x0d\x4a\x18\xcc\xde\xf8\x93\xa6\x72\xae\xba\xda\x35\x41\x21\xed\x1a\xa1\x90\x15\x69\x95\xb7\xbe\xfe\x02\x1e\x71\x5c\x9c\xe3\x9c\x42\xba\x87\x0a\x3c\x3a\xa4\xa9\xa8\x0e\x76\xd7\x9b\x32\x0b\xda\x9c\x35\x8a\xec\x4d\xf8\xbb\xb6\x68\xe3\xad\x9a\x95\x77\xd1\xae\xdc\xca\xb2\xeb\x06\x12\x30\xfe\xbd\x27\x56\xe3\x41\xba\x68\x7b\xde\xd8\xa0\xae\xae\x1a\x43\x5d\x57\xa6\x35\x72\x56\xcd\xb4\xae\x84\x5d\x65\x58\xb7\x7a\x76\x47\x6d\xb1\xdb\xd8\xb8\xd5\x55\x23\x84\x7c\x80\xb5\x4b\x21\x60\x24\xc7\x7e\x77\xac\xb4\x79\xcf\x44\x8f\x9c\x4b\x63\xff\x13\x99\xbf\x27\x92\xe9\x73\x69\xe0\x93\xad\x20\x25\xbe\x42\x87\x84\x74\xc6\x19\xa2\x18\x81\xdc\x74\x21\x57\x7b\xe2\x79\x82\xad\x30\x2c\xce\x04\x91\xca\x53\x2c\x58\x17\xda\x0d\x11\x87\x09\x1c\x16\xcc\xad\xc6\x89\x1d\x27\xa6\xf3\x1d\xc3\xb9\xa1\x00\x15\x02\xbf\x01\x48\xc0\x22\x83\x7c\xe4\xb4\x54\x88\xcc\x68\x75\x4d\xc3\x26\x3c\x21\x39\x53\x13\xe8\xcd\xd6\x24\x8d\x38\xbe\xda\x9f\x2b\x78\xb5\x3c\x5d\xe2\xc9\xb4\xe0\x25\x38\xb2\x41\xc5\xea\x50\x05\xc0\xf1\xf0\x58\xcb\x29\x58\x52\xff\x1d\x7c\xd0\xff\x43\x0a\xca\x15\x20\x39\xba\x58\x70\xfc\x9d\x8b\xbe\xc4\xc3\xd8\x11\x96\x7c\x4b\x54\x10\x86\x75\x0f\x76\xf4\x45\xc5\xa3\x47\x6e\xa6\x52\xe3\x61\x18\xdc\x1f\x7b\xd7\x6c\xbe\xd7\x5b\x62\xbd\xbd\x33\xb1\x57\x05\x7a\x6b\xcc\x16\x0e\x61\x28\xdf\xd9\x83\xef\xf6\x1e\x4f\x57\x69\x75\xd8\x76\x01\xa9\xbd\x38\xa1\x86\x7c\xe5\x6c\x9e\xf6\xed\xa6\xdf\xe1\x40\x91\x7d\x8e\x31\xc1\x89\x62\x51\xab\x69\x50\xd4\x73\x8c\x5b\x96\x82\xcd\x98\x5d\xac\x94\x6b\x87\x5b\xe5\x53\x06\xfe\xb1\x64\x12\xfd\xff\x4f\xe4\xb9\x34\xde\x6a\xff\x87\x77\x7b\x21\xff\x7d\xe2\x79\x99\x23\x40\x8c\xb1\x96\x42\xca\xc7\x1e\xde\xd2\x67\x2a\xd4\xed\x85\xba\xd9\xea\xf8\xd8\x50\x35\x01\xd0\x25\x67\x2f\x78\x36\x9b\x64\x72\x44\x33\x92\x73\x61\x1f\x33\x20\x6f\xa4\x22\xec\x13\xcd\x8b\x8c\x61\xf5\x0c\xf9\xaa\xff\x2f\x29\x18\x71\xd1\xed\x1e\xf1\xb4\xa8\x1a\xb7\xbf\x42\xae\xad\x60\xae\x43\xea\x42\xcd\x00\x0b\x6e\x0b\x4d\x5e\xbd\x78\xf5\xe2\xe5\x6b\xf2\x2b\xb1\x43\xbf\x72\xff\xfd\xd2\xfd\xf7\x2b\xf2\x2b\xf9\x95\x10\x72\x41\x48\xed\xbf\x04\xfe\xdb\x27\x7c\x1c\xcf\xe1\x95\x9d\x66\x22\x73\xf7\xc2\xe0\xc9\x0d\x45\x6e\xa1\xc5\x85\x91\x6e\x68\xa8\x71\x48\x64\xce\x60\x0e\xaf\xfe\x8f\xbf\x07\x02\xae\x06\xbb\x90\xc0\xa4\x0e\x60\x4a\x87\xe4\x06\x5c\x53\x39\xbd\x46\xb3\xec\x28\x31\x25\xcd\xec\xc3\x0f\xbe\xec\xbf\x3c\x24\x52\xd4\x6f\x9f\x71\x09\xdd\x9b\xdd\x0c\x0f\x5e\x1d\x0e\x96\xa6\xfc\xe5\x8a\x29\x2f\x34\xe4\x70\x25\x46\x76\xd0\xdb\xb9\xc6\x33\xcc\x91\x98\xdf\xd0\x79\x60\x1b\x6f\x96\x4e\xf8\x2c\x20\x41\x47\x65\xf7\x10\xb3\x03\x2e\xe0\x1e\x08\x05\x07\x9d\x13\x6e\x06\xe4\xcc\xec\xef\xfb\xf6\x2f\x56\x63\xf6\x90\xd5\x27\x31\x3a\x1a\x10\x1e\x16\xfd\xa5\xf7\xcf\xba\x98\x52\x8b\xde\xdf\x9d\x38\x47\x1f\x84\x39\xed\x9e\x5e\xf9\x37\x3a\x70\xaa\x87\xb1\xfc\x0e\xb6\xa2\x5f\x8e\xb1\x2c\x10\x9b\xb1\x0c\xa0\xd3\x8e\xa3\xbd\x4b\x00\x41\xd5\xd9\xed\x1e\xae\x83\xf5\xc4\x21\xdd\x38\xa1\x59\x1c\xac\x4b\x24\xe0\x51\xa9\xd0\x60\x3e\x4e\x17\x0a\x7e\x29\xf2\x53\x75\x27\xa6\x09\x41\xfc\x15\x07\xfa\x13\xc2\xdc\xec\x8d\xca\xe4\x9a\x19\x7f\xee\x28\x28\xaf\x28\x4a\x43\x46\x34\xa3\xc2\x6a\x30\x4b\x7e\x08\x23\x71\x30\xfc\x25\x30\xcc\x0a\x7e\xf9\xdc\xf1\x91\xa5\xdd\xd1\x5e\xe8\xff\xb4\x38\x64\x14\x91\x75\x8e\xc2\x94\xd1\xcc\xa7\x52\x00\x1a\x74\xc0\xe7\x11\xfb\xfb\xd5\xbe\x82\xb5\x41\xe1\x57\x39\x58\xad\x5c\xa8\xc9\x7d\x72\xe0\x73\x19\x89\x61\x59\x86\xdc\x53\xb5\x4e\xb2\x9b\x2c\xee\xc5\xc4\x61\x84\xba\x0c\x58\xf9\xc3\x7a\x03\x27\x0c\xea\x5b\xc9\x2e\xe6\xa1\x38\xb8\x47\x08\x74\x2f\x9b\xf0\x99\x15\x4a\x6b\x09\x0d\x14\x8c\x53\x96\x15\x44\xb1\xb4\x4c\x70\x70\x42\xf4\x35\xbb\xb1\x3a\x55\xf5\xa6\xae\x7f\x8a\x67\xd9\xbd\x1a\x51\xf7\x10\x11\x57\xd4\x45\x22\x1f\x03\x43\xfa\xa6\x80\x6c\xc6\xd4\x9c\x14\x52\x6b\x6e\xd7\x01\xf6\x12\x64\xb7\x81\xde\x15\x80\x44\x20\xb3\x0a\xa6\xe5\xc5\xf0\x9e\x13\xbb\x7b\x56\x50\x6b\x59\xdb\x1e\x9f\xe7\xa8\xfb\xca\x1e\x33\x77\x1f\x75\x17\xf0\xbf\xe5\x23\xef\x6c\x4c\x56\xf0\x60\x98\x4b\x8d\x79\x1e\x72\x0a\x7e\x09\x87\xd5\x57\x87\xd1\x61\xf8\xd5\x8b\x2f\x5f\xbc\x3a\xb0\x73\xfd\xf2\xd0\xce\xba\x76\xcc\xbd\x0a\xc7\x5c\xf8\xa5\x9b\x11\xd3\xb5\x83\xce\x1a\x60\xd8\xe3\x53\xaa\xd4\x45\x78\x7c\x56\x9c\x9d\x91\x36\x2e\xde\xc6\x73\x2f\x5f\x7a\xc0\x77\x15\xb3\xde\x48\xd8\x39\x70\xde\x72\x43\xbe\xc8\xa5\x62\x5f\x44\xf7\xdf\x7a\x40\x35\x3f\x77\x1a\x48\x9c\x5a\x57\x92\x8c\x6b\xd3\xcf\x69\xd1\xbf\x66\xf3\x07\x6b\xba\x6d\xdc\xeb\x6d\x9d\xeb\xcb\x6f\x81\x04\xc9\x69\xf1\x80\x71\x5c\x6b\xe9\x36\x29\xb9\x6f\x9d\x63\x36\x74\xa9\x06\xc7\x23\x6a\x45\xae\xf5\x22\x34\x3a\xa8\xf2\x63\x47\x2c\x93\x08\xeb\xe8\x52\x07\x1e\x90\x7a\x1f\x40\xb0\xb5\x91\x8a\x4e\xd8\x0b\xf7\xd8\xa7\x02\x7e\xef\x1a\x55\xd7\xbc\x4c\x58\xbd\xe5\x30\x21\x7d\x8a\xb2\x8f\x3f\x80\x14\xa0\x09\x64\x03\x02\x21\x6b\xd5\xeb\x51\x9e\xe1\x13\x09\x65\x35\x28\xf6\x6d\xe3\x38\xa5\x37\xfa\x34\xa3\xda\xf0\xe4\xbb\x4c\x26\xd7\x43\x23\x55\x07\xda\xc5\xd1\x4f\xc3\xa5\x51\x6b\x6b\x2a\xc8\xd1\x4f\x43\x72\xc2\xf5\x75\x85\x25\x8e\x20\x82\xf5\x04\x3c\x1a\x70\x40\x5c\x6d\x05\xc9\xa9\xb5\xff\x98\xb7\xf1\x44\x80\x31\xed\x6e\xaf\xfc\x8e\xde\x68\x86\xd3\x1f\xd9\xe9\xdb\xaf\x59\x73\x11\xbc\xb1\xba\x71\x7c\x9d\xb3\x93\x0d\x04\xbe\xc6\xba\x69\x93\x05\xb2\xc4\x4c\x6f\x42\xe3\x7e\x44\x74\xa9\x43\xda\x02\xd7\xcc\x65\x49\x6e\x28\xfa\xac\x40\xa6\x0e\xc8\x15\x2f\x5e\x93\xd3\x08\x9e\x12\x0b\x0c\xea\x43\x59\x7d\x23\xc0\x25\xb8\x2c\x01\xe0\x32\x74\x5d\x59\x11\xec\xb2\x62\xc8\x29\x2a\x53\xfa\x35\xd9\x63\x9f\xcc\xd7\x7b\x3d\xb2\xf7\x69\xac\xed\x7f\x84\x19\x03\x98\xac\x43\xa4\xb7\x4a\x9d\x18\x33\x55\x19\x30\xf8\x83\xe5\x52\xc0\xee\x99\x94\x5c\xbd\x3f\x79\xff\x1a\x14\xf8\x54\x92\x1b\xe6\x7b\x36\x11\xa6\x94\xac\x2a\x2f\x22\x32\x40\x85\x46\x22\xf3\x42\xc9\x9c\x47\xe9\xaa\xb0\xc9\x9a\xf0\x3c\xe9\xc2\x5f\x0a\x49\x69\x6d\xba\xbe\xd7\x39\x08\xb2\x7d\xfd\x90\x0b\x38\xd8\xb7\xf1\xcf\xd9\x98\x48\x74\x4a\xd5\x73\xe4\xb9\x0e\x37\x59\x8e\x71\xa3\x60\xf3\xa1\x8a\x47\xac\xfa\xed\xbe\x7a\x91\xb2\xd9\x0b\x9d\xd2\x57\x3d\x78\x0c\x32\x80\xc3\xfa\x0e\x73\xa2\x9a\xec\xbd\xda\x1b\x90\xa1\x6f\xbd\xdc\x8b\xe7\x58\xdd\x67\xad\x01\x3f\x20\xb8\x55\x5f\xee\x91\x03\x4c\x52\x07\x9d\x22\x63\xbe\xf9\x63\x80\x14\x00\x1f\xfe\x61\x23\x15\x92\x74\xe0\xbe\x20\xad\x5d\x18\xa4\x83\xe6\xec\x0b\x55\x52\x6e\x0d\xf6\x0c\xf4\x1a\x32\x12\x2a\x08\x98\x6b\x7e\x89\xa2\xe2\xd2\x3d\xb1\x22\x24\x17\x4e\x3b\x81\xd6\xee\xd8\xa8\x1a\x06\xb8\x93\x59\xf6\xa0\x9a\x68\x6f\x6b\xce\x24\xd2\x49\x23\x78\x7f\xb4\x74\xb3\x1e\x1f\x04\xff\xa5\x64\xe4\xec\x24\x74\xa8\x63\x4a\x73\x6d\xac\xe4\x4a\x6b\x3a\x02\x47\xc5\xe1\xe0\x28\xa7\xff\x92\x82\x9c\x7e\x37\x74\x53\x39\xdc\x42\x02\x37\x14\x80\xf4\x5f\xa5\x62\x56\x35\x6a\xad\x87\x1d\xf9\x91\x16\x75\x2f\xfb\x39\x39\xa1\x86\xa2\x0a\x86\xd2\x4c\x56\x15\xa3\xb0\x13\x46\x90\xf9\xe3\xcb\x81\x1b\x6a\xd1\x64\xf3\x6a\x90\xe5\xa0\xf3\xe6\x10\x3a\xf6\xe7\x1f\x2e\xcf\x36\xa0\x44\x25\x70\x0a\x4f\xde\xc9\xb4\x23\x4d\xea\x2f\x76\x69\x8f\x71\x54\x92\xdb\x61\xc9\xb9\x14\xac\x07\xc2\x8e\x58\x69\xe7\xfe\xf9\x93\xe2\xe6\xa1\x15\x90\xd5\xd5\xfa\xf8\xf7\x2b\xd6\xc9\x5b\xdb\xc3\xff\x3c\xaa\x74\x07\x58\x06\x90\x2a\x4e\x11\x18\x65\x72\x44\x9c\x34\xd8\xe4\x1b\x7f\xb8\x3c\xeb\xec\x85\x3f\x5c\x9e\x6d\xef\xcb\x76\x68\x1c\x2c\xda\x06\x95\xfe\x56\x41\x4d\x2e\x2a\xfd\xeb\x6b\xfc\x83\xae\x74\xfd\x4d\x51\xfa\x9a\x8b\xc6\x59\x61\x75\xd1\x71\xea\xeb\x23\x5d\xa4\x06\x4a\xac\xd3\xd7\x24\x2f\x33\x03\xe5\x6f\xc0\x58\x96\xd3\xb4\x3d\xbd\x3d\x8b\x11\x07\xed\x40\xc8\x09\xc3\xf0\x42\xfa\xda\x27\x24\x84\x5f\xac\xfe\xc1\x3b\x2a\xe8\xc4\xde\x0e\xe7\x21\xc9\xf1\xcf\x88\xa3\x0f\xd0\x81\x2e\xc2\x57\x74\x46\x79\x46\x47\x3c\xe3\x06\x7a\x9d\x1f\x0e\xbc\x22\x06\xca\x1a\x14\xdb\x3f\xb0\x0b\x64\x75\xb5\x5e\x8b\x4e\x55\xd8\xb8\x3e\x08\x14\x4c\x72\x60\xc7\x7f\x71\x63\x05\xf7\xe1\xa0\xd2\x5e\x01\x7c\x09\x12\xe5\x51\xc5\xad\xa9\xb6\x1e\xb5\x61\x41\xb3\x6d\xc7\xae\x4d\xd5\x4a\x58\xe6\x37\x0d\x11\x6f\x97\xd5\x1e\x3b\xd2\x4a\xb5\x07\xbe\x70\x20\x12\xcf\x5c\xf3\xc1\x86\x39\x2d\x74\x1f\xd8\x32\x0d\x7f\xdf\x56\xfb\xd9\xed\x97\xfb\xaf\x6a\x81\x3b\xa1\x52\x0c\x0a\x84\x43\x2f\xa4\x49\xe3\x0e\x1a\x3a\x51\xed\xc1\x82\x40\xbb\xb2\xfb\xa6\x49\x11\x05\x5e\xad\xa5\x6b\xe0\xd4\x4e\x08\x81\x30\x2a\x8d\x37\x4e\xcb\xf7\x49\x58\x31\x1d\xb7\xaf\x81\x3c\x66\xc5\xf4\xcd\xb0\x1e\x4a\xb1\x9f\x91\x37\xc3\x15\x72\x0f\x73\x65\xec\x7b\x6b\x0c\xb0\xec\x6b\x92\xf1\x31\x33\xbc\x11\x11\x36\x2c\xf9\x72\x29\xb8\x91\x4a\x6f\xa2\xe6\xc3\x3d\xba\x1b\xbd\xeb\xd2\x13\x82\xbc\x73\xe3\x62\xc2\x67\x22\xb3\x8c\x25\xc6\xb5\x78\x83\x65\xf5\x0f\x5e\xe5\x08\x71\xa9\x00\xda\x77\x34\x75\x4e\x8f\x17\xc8\x6a\x2f\x2e\x4f\x8f\x4e\xde\x9d\x0e\xf2\xf4\x77\x53\x79\xd3\x37\xb2\x5f\x6a\xd6\xe7\xa6\x9d\xae\xb4\xc1\xa2\x90\x0e\x1c\xd0\x66\xda\xcd\x02\x56\x08\x43\x1f\x74\x85\x01\xe6\x03\xbf\x4a\x4a\xb3\x8c\x02\x36\x2e\xb3\x0c\xd7\xd4\x28\xc6\x7a\xb1\x3b\xf1\x81\x18\x69\xd5\xb5\x5d\xfa\xeb\xfe\xea\x36\xa6\xdd\x1f\xcd\xdb\xb2\x19\xda\x9f\xf2\x4d\x55\x63\x72\x07\xed\x87\x61\x64\x9f\xd0\x67\x19\xdf\xae\xc4\x35\x9b\x13\xc8\xee\x1f\x4b\x05\xc8\x99\x75\x2e\x64\x26\x01\x72\xbd\x80\x0e\x72\x4e\x57\xd8\x12\x52\xb7\xd1\x22\xe0\x45\x2e\xd9\xf8\x71\x08\x7d\xc9\xc6\x58\x40\x11\xb5\xf0\xb7\x44\xa7\xa5\x99\x62\x26\x24\x22\x1f\x21\x39\x57\x52\xde\x55\x64\x6c\x09\xa9\x5b\xe5\xd2\x77\x51\xef\xd5\x06\x67\x9c\x2c\xad\x57\xec\x26\x74\x8b\x64\x1e\x1c\x57\x90\x33\x6b\x5b\xb2\x1b\x68\x43\xcf\xc5\xa4\x7f\xc3\xcd\xb4\x8f\x94\xd2\x2f\x00\x57\xed\xc5\xef\xe0\x3f\x2e\x5a\x7b\x94\xa6\x2e\xb3\xac\xd4\x6c\x5c\x66\x98\xf3\xa5\x07\x84\x16\xfc\x47\xa6\x34\xa4\x30\x5e\x73\x91\xf6\x48\xc9\xd3\x3f\x37\x5d\x31\xd2\xc5\x06\x69\xde\x34\xe9\xce\x73\x51\x79\xf1\xa3\x68\x2a\x35\xa2\xea\x5a\x12\xd5\x58\x9f\xa6\x39\x17\xdb\xc2\xf9\x4d\x55\x7b\x2e\xd2\x66\x14\xac\x53\xef\x18\xc6\xa9\xeb\xf6\x38\xb6\x8f\x19\x87\x2c\x1a\xea\x7d\x19\xd8\x94\xc7\xe5\xd3\xd4\xb3\x69\xd6\x12\x28\xf9\x5c\xff\x92\xf5\xf1\x29\xfd\x22\xad\xe8\xba\x4b\x8d\x79\xc8\xf5\x98\xa9\x31\xdd\xba\xbf\x3f\x43\xc2\xcb\xa3\xf2\x18\xd9\xa9\xbd\x1b\xa0\x75\x7b\x4d\xf7\x11\xf4\x2f\xc0\x75\xd7\xbe\x38\x19\xd4\x2b\x94\x3d\xde\xb7\x85\x8d\xc8\x02\x90\xb0\x2f\x33\x4a\xa4\x10\x0e\x93\xee\x7d\xc1\xc4\xd0\xd0\xe4\xba\x65\x5c\x74\xa7\x33\xfd\xc6\x74\xa6\x6e\x73\x65\x7c\x1a\x74\x1a\x78\x14\xab\xa8\x5c\x4a\x59\x95\x25\x8d\x1b\xfb\x09\x4a\x5d\x44\x4c\x7f\x47\x1b\x34\xc1\x5f\xf4\x80\xfa\x91\x16\x14\xa5\xf0\xb1\x73\x7a\x42\x55\x4d\x21\x8b\x32\x43\xc8\x35\xae\x1d\x1d\x3f\xbf\x62\xd3\x76\x83\x3b\x7d\xb9\xbb\x9c\x91\x4a\x86\xe6\x32\x65\x64\xc4\x4d\x25\x1d\x35\x33\x58\xbb\xeb\x80\x68\xa4\x20\x89\x03\x9b\x03\xad\xc3\x6a\x18\x6e\x42\x91\x46\x22\x88\x4c\x8c\xaf\xf9\x0b\x65\xbe\x2f\x5f\xbe\x7c\x89\x45\x97\x7f\xf8\xc3\x1f\x88\x54\xd0\xc1\x21\xe1\xf9\xf2\x8d\x70\xd7\xbf\xbf\x7a\x35\x20\x7f\x3d\x7a\xf7\x16\x72\xff\x0b\xa3\x11\xd7\x1b\x47\xb6\x37\xd4\x7e\xac\x7b\xe4\xff\x0e\xdf\x9f\x7b\xb5\x51\x2f\x7c\x0b\xa6\x76\x78\xbd\x3a\xfa\xe2\xcb\x6f\xbe\xfe\x7a\x40\x4e\xb8\x82\xda\x27\xce\x42\x27\xa2\xe0\x2d\xa1\x8a\x61\x91\x28\x40\x04\x7a\xbd\x8a\x07\x50\x7c\x87\x9f\x80\xad\xd6\xb0\x9e\xd1\x72\x60\xc6\x13\x83\x65\x56\x28\xc8\x42\x13\x55\x00\x6e\x74\x50\xa8\x2e\x59\x17\x26\xd7\x23\x19\xbf\x66\x64\xac\xa1\x03\x61\x55\x4c\xaf\x98\xb6\x16\x92\x2b\x29\xc1\xc1\xaa\xb5\xd2\xcc\x3c\xf1\xdc\xcf\x56\xbe\xe0\x45\x00\xe3\x5a\x7f\x29\x28\xf5\xbc\x66\xf3\x3e\x72\x58\x41\x79\x28\x18\x81\xe4\xb8\x5a\xcf\x84\xe0\xb5\x49\x23\xb9\xe2\x31\x16\x0b\x25\xff\x89\x8b\x0f\x35\xa4\x91\x24\x86\x4a\x54\xec\xc8\x09\x60\x09\x22\x6a\xc0\xe1\xeb\x60\x5d\x0f\x23\xff\xb1\x43\x0a\x5d\x86\x5b\xce\xb8\xb6\x8f\xb8\x66\x73\x7d\xd7\x93\xab\xde\x2f\x96\x3f\x35\x72\x4a\x29\x96\x7e\xed\x90\xf4\x9d\x64\x74\x4d\x13\x1c\xe2\x4d\x35\x06\x96\xff\xbb\x42\x68\x77\xaf\xa7\x52\x20\x44\x2d\x5d\x59\x33\x53\x3a\xd2\x40\xde\xb9\x7d\x36\x00\xfa\xc3\x1b\xe6\x54\x5d\x33\xdf\x88\x94\x66\x03\x72\x61\x27\x19\x20\x47\x42\x1f\x58\xb0\x5b\xe9\x1c\x1e\xeb\x94\x34\x78\xc8\xfe\x60\xb0\x8f\x1b\x4f\x2a\xa2\x0d\x55\x6e\x17\xd9\xcf\x9f\x07\x8a\xd5\x3b\x5a\x68\x44\x55\xb1\x5a\x29\x20\x0e\x49\x40\x6a\x35\xd3\xaa\x0d\x1a\xd2\x7a\x87\x3c\x45\xfa\x40\x98\xc6\x03\x6c\x23\xea\xd4\x95\x93\x0d\x46\xfa\xed\xbd\x15\x58\x48\x79\x0b\xa5\x02\xaf\x56\xaa\x85\x83\xd9\xcd\xd8\x93\xd2\x25\x56\xb7\xc9\x70\x92\x32\xd2\xd6\x16\x7a\x17\x3e\x55\x95\x01\xaf\x2e\x14\x07\xbc\xda\xab\x0f\x78\xb5\x09\xe8\xe2\xb5\xb4\x43\xc3\x49\x85\x87\xd1\xb8\x22\x3d\x80\x9e\x17\xe1\x88\x37\x12\x3b\x7e\xf8\xce\x35\x82\xd0\x91\x96\x59\x69\xf0\xa7\xd5\x97\xf1\x31\x07\x83\x7a\xf0\x25\x38\xdb\xc2\x6d\xd1\xa1\x07\xc7\x3d\x9e\x13\x6d\xce\x3f\xbc\x5a\x8b\x89\xce\xba\xbe\x3e\x6f\xaf\x42\x6b\x3a\x7b\xdd\xa9\x9b\x5c\x27\x57\x0c\x75\x33\x65\x2e\x0b\x21\xd2\xeb\xac\xf0\xb4\x22\x01\x94\x46\xaf\xa2\xb9\xee\xf0\x1b\xf1\x12\x26\x9a\xb7\x77\x0b\x0c\xcf\xc8\xc1\x71\x28\x11\xf7\xe9\x6c\x67\xc2\x30\x35\xa6\x09\x3b\x8c\xdd\x05\xac\x98\xb2\x9c\x29\x9a\x85\x0c\x65\x5f\xa7\x3c\xa5\x22\xcd\x5c\xf1\x3e\x53\xb0\x71\xd9\x27\xc3\x94\xa0\x19\x3c\x22\x55\x7c\xc6\x94\x26\x07\xdf\x31\x6b\x4b\x30\x6a\x4a\xc5\x0e\x9f\x60\x1a\x29\xbe\xc8\x26\x9c\x19\xf0\xe0\x6e\x12\x40\x61\xa8\x55\x9d\x0f\xab\xa5\xf2\x98\x45\x76\x59\x75\xec\x06\x1a\xd8\x0d\x01\x27\x26\x08\x5d\xe8\x08\x84\xd1\x48\xdf\xd0\x0e\x80\x8b\x13\x83\x03\x53\xed\x1a\xdc\x01\x22\x8c\x93\xe7\x0e\x2a\x64\x63\xa5\x00\x9f\xa5\xe8\xe2\xae\x92\x89\xb1\x33\x20\xe5\x8c\xa7\x5e\x0d\x82\x6c\x86\x0a\x75\xab\xa0\x3a\xaa\xe4\xa7\x5a\x4b\xd7\xbf\x33\x5a\x23\x34\x47\x41\x59\xaa\x63\x4a\xfb\x48\x71\x1c\xef\x92\x80\xcc\xda\xa8\xa1\x05\xe9\xe4\x40\x94\x29\xbb\x28\x47\x19\xd7\xd3\x61\xa7\xa1\x8d\xf3\x15\x03\x63\x62\xe0\x52\x72\xc9\xad\xe1\x0e\xcd\x84\xe6\xae\x9f\x18\xaa\x59\xdc\x6a\xd9\x12\x96\xc1\xff\x3a\xde\x1d\x12\x0a\xc5\xa1\xb1\x98\xff\x2a\x9a\x87\x43\xee\xc0\x76\x3a\x29\xfb\x20\x8a\xda\xe7\x09\xcd\x32\xed\xf4\xda\x00\x16\xe9\x0f\x32\xd4\x4c\x3d\x9a\x07\x72\x05\xb7\x0c\xe3\x67\x0f\x59\x33\x28\xc5\x02\xb2\xe9\xca\x17\xd3\x24\x97\x58\xf1\x2f\x88\x14\xfe\x26\xe8\x0a\xe4\x7f\x10\x28\x84\x78\x63\xc8\x74\x1b\xc4\x94\xdc\xc5\x74\x9e\x5e\x4c\xa7\xd3\xa8\xf0\x30\xb4\x68\xa0\x30\x70\x1f\x0a\x9b\x7c\xe3\x58\x1a\x0a\xff\x2b\xc3\x71\x70\x5f\xf8\x78\x63\x11\x5c\x9c\xdf\x91\x71\xb0\xa0\xdd\xf8\x6d\x7f\x5c\x18\x14\x54\x31\x6b\x79\x83\x60\xea\x3b\xdb\x3a\x89\x76\x92\x33\x89\xc3\xf6\x5e\x16\x67\xd5\x99\x0e\xc7\x39\x7e\xb8\xaf\x49\x2a\x93\xd2\xda\x5c\x15\xd9\xab\x84\x89\x76\x68\xef\xcf\x0b\x7e\x36\x95\x37\xe2\x86\xaa\xf4\xe8\xa2\x51\xd5\x6a\x5d\x39\xab\xc6\x8a\x55\x6f\xff\x08\x62\x3f\xa7\x23\x59\x9a\x00\xf1\xb7\x0b\xdc\xad\x1c\xe2\x3e\xef\x9a\x6b\xeb\xbd\x5e\x9c\x8e\xec\x42\x7f\xbb\xd0\xdf\xb3\x09\xfd\xd9\x91\xea\x9d\x52\x6a\xe2\xc5\x39\x64\x2d\xc5\x9f\x45\x0c\x29\x12\xa9\x78\x7a\x2e\xd6\xc3\x2e\xe8\xfc\xb8\x79\x2b\xae\x8b\xec\x04\x2f\x73\x41\x1d\x7b\x0e\xf1\xa6\x2d\x88\x17\x01\x2d\x5b\x18\x83\x78\xdd\x56\x2a\x86\x48\xad\x18\x78\x8e\x22\xd8\x85\x4c\x5f\x23\x70\x2a\x74\x42\xc7\x9e\x1d\x3d\x87\xdb\xdc\x73\xbe\x0b\x11\xf5\xfe\xc6\xd6\xcc\x5e\xfd\xe9\x24\x26\xd0\x92\x01\x48\x47\x4c\x40\x80\x11\x80\x3a\x17\x6d\xb8\x81\x74\xc6\x11\xf6\xaa\x0c\x9d\xb6\x23\x2d\x2a\xd0\x38\xaa\x67\x04\x9d\x4c\x59\x4e\xe1\x9f\x6f\x3c\x09\xac\x6c\xb4\xc6\x83\x61\x88\x90\xc6\x54\xae\x89\x1c\xf7\x6a\x10\x0a\x7b\xb3\x57\x7b\xed\x62\x0c\xa4\xbb\x70\x24\xf1\xfb\xe8\xa2\x75\x6c\x87\x2c\x12\xec\xa2\x16\xd2\xb1\x7b\x08\x74\x9e\x0c\x5b\x17\x2f\x64\x59\xc0\xf9\x81\x14\xde\x1a\xe2\x6c\x4b\xac\xb6\x17\xa2\x06\x4f\x40\xf9\xdb\xc5\x6a\x9f\x63\xac\x36\x3a\x18\xbd\xa0\x73\x84\x8d\xe3\xb7\x71\x48\xc0\x07\x71\x47\xcc\x1b\x35\xce\x86\xf1\x11\x5c\x1f\xbe\x95\xaa\x9e\x9a\xb4\x3f\x18\xec\xef\xfb\xa0\xae\xe3\xfb\xd2\x8c\xfb\x7f\x24\x4c\x24\x32\x45\x66\xb1\xe3\x2b\x6d\x40\xdd\xab\xbc\x6c\xf1\x5c\x72\xff\xac\x38\xbd\x09\xc6\xee\x62\xa9\x5b\xcb\x16\x8f\xc6\xf7\xe6\x11\x94\x98\x4a\x75\x09\x98\x7f\x8e\x44\x01\xd3\xd9\xe9\x30\xfe\x7b\x4d\x32\x9e\x73\xd7\x3f\xcc\x6e\x74\xa6\x8d\x26\x07\xf8\xe1\x20\x29\xca\x9e\xbb\x61\x90\xb3\x5c\xaa\x79\x2f\xdc\x64\xbf\xac\xfd\xca\xdd\x71\x88\x7d\x28\x4a\xa5\x98\x30\xd9\xfc\x39\x6b\x40\x9e\x88\x5b\xa2\x00\x85\x35\x6e\x83\xe4\x51\x5d\x0b\x35\x73\x21\xe2\x0b\xde\xf2\x08\x63\x3f\x80\xb5\xea\x5e\x08\x49\xc0\xa7\x4c\xcc\xc8\x8c\xaa\x07\xa2\xa7\xaf\xba\x3a\xd4\x79\x52\x3e\xe3\xba\x6d\x73\x3f\x72\xbb\x13\x1a\x5a\x77\x95\xa6\x28\x8d\x93\xe8\x7e\x07\x7a\xa4\xed\xb0\xf3\x16\x94\xc3\x57\x7b\xad\xa7\x54\x50\x63\x98\x12\xaf\xc9\x7f\x1d\x7c\xfc\xfd\xaf\xfd\xc3\x3f\x1f\x1c\xfc\xfc\xb2\xff\x1f\x7f\xfb\xfd\xc1\xc7\x01\xfc\xe3\x8b\xc3\x3f\x1f\xfe\xea\xff\xf8\xfd\xe1\xe1\xc1\xc1\xcf\x3f\xbc\xfb\xfe\xea\xe2\xf4\x6f\xfc\xf0\xd7\x9f\x45\x99\x5f\xe3\x5f\xbf\x1e\xfc\xcc\x4e\xff\xb6\xe6\x20\x87\x87\x7f\xfe\xb7\xd6\x53\xa7\x62\xfe\xbe\xa5\x28\xc4\xab\xdf\xe1\x91\x5c\x1f\xb1\x13\xf6\x5b\x68\xad\xc0\x85\xe9\x4b\xd5\xc7\xa1\x5f\x13\xa3\xca\x76\xc2\xa4\x3a\x5e\xba\xde\xff\x95\x1a\x50\x41\xce\x7b\xa5\x7e\xc3\x1b\x1c\x22\x9e\x27\xbc\x83\xc2\xe0\x53\x37\x52\xbd\xe2\xc5\xb0\xbc\x90\x8a\xaa\x39\x49\x9d\x37\x73\xbe\x02\xf0\x27\x42\xfc\x69\x8d\xa6\x0b\x6f\x94\x72\xb5\x81\xda\xe0\xd6\x00\x3e\x2c\xe5\x65\xde\x8d\x13\xfe\x27\x40\x9e\x77\xa8\xf5\x3e\x81\x08\x1f\xe0\xc3\x17\x23\x9a\x5c\xa3\xbd\x14\xd6\x06\xb5\xc4\x18\x44\x7a\xcf\xe5\x3d\xe4\x8c\x8a\xe0\xc6\x87\x4c\x16\x99\x32\xbb\x70\xfe\x66\x1c\xbb\xe6\x72\xc7\x70\xba\xcb\x12\xac\xda\x30\x49\x45\xde\x81\xba\xb3\xd1\xb5\x26\x9d\xc0\x76\xf0\x7f\xb1\xb7\x56\xc7\xeb\x08\x2e\x5e\x82\x31\xe9\x30\xb2\xc6\xd0\x48\xaa\x4a\xff\xaa\xa9\x0d\xb0\x6e\x61\xcf\xf9\xe0\xac\x5d\x3d\x3b\x27\x54\x3c\xc1\xeb\x9c\x69\xcc\x45\xe1\x09\x34\x3a\x02\xc3\x13\xa8\x1f\x56\xec\x2a\x6a\x88\x58\x6a\xfb\x24\x29\xea\xf7\x54\x0f\xc2\x3e\x50\x23\x64\x01\xd7\xde\x70\xc1\x5c\xb6\xdf\x0c\x3d\x5d\x22\x67\x05\x94\x13\x7b\xdb\x52\x97\x60\x81\xb8\xa7\x38\x3d\x5a\x8e\x21\x5b\x22\x6a\x48\xe3\x7b\xae\x2c\xf1\xa5\xe0\x59\x9d\x31\x7d\xa3\x85\xf0\xe2\xa5\x70\xd9\x82\x4b\x5c\xb6\x9a\xc9\x4a\xcd\x54\x7f\x52\xf2\xb4\x3b\xf6\x7a\x72\x3a\x45\x4b\x4d\xa2\x2b\xfd\xa1\x13\xad\xa1\x73\x5d\x21\xe4\x63\xb6\x3e\x2b\xf7\x4e\x43\x6a\x67\xed\xb0\x8c\x1b\x43\xd4\xd3\x3c\x69\x68\xf8\xe5\x85\x81\x4b\x8d\x3a\x38\xca\x8a\x69\x94\xe3\x09\xfb\x04\xc7\x71\x87\x6a\x32\x4f\x1c\xc8\x12\xaf\xf5\xaa\xc1\xc7\xe0\x1e\x81\x0a\xa9\xbe\xfd\x3f\xef\x5f\xf2\x21\xd5\x11\x1b\x63\x56\x13\xfe\x06\xdc\x02\xae\xae\x2b\x65\x19\x33\x50\xa6\xc5\x44\xd5\x01\x4f\x13\xc5\x72\x39\xb3\xdb\xee\xa3\x20\x1f\xb4\x0b\x8e\xf3\xf1\x6b\x42\x0f\x6b\x85\xc2\xae\xed\xae\x60\x2c\xc5\x62\xaf\xa8\x91\x9e\x2a\x85\xee\x91\xd1\xa1\x7f\x31\x8d\xbd\x1e\x15\x78\xd0\x5c\x3b\x2b\x70\x5a\x29\x66\x09\x02\x70\x51\x4a\xe6\x44\x0b\x5a\xe8\xa9\x34\xe0\x1f\xa1\x05\x4d\xb8\x99\x5b\xf2\x1b\x45\x93\x6b\x68\x19\xad\x98\x7b\x62\x8f\x24\x87\x2e\x8b\xbd\x46\xd1\x5a\x09\x9a\x99\x2a\x59\x4e\xa6\x50\x13\x85\x77\x25\x19\xd5\x9e\x00\x2b\x7f\xef\x6c\x76\x4d\xd2\xb9\xa0\x39\x4f\x42\x2b\x0d\x25\x67\x5c\x73\xe9\x22\x5b\x38\xae\xdd\x73\xe4\x22\xf4\x1c\xc0\x80\xd9\x71\x46\x79\x4e\x0e\x34\x63\x24\x30\x0a\x7e\x33\x44\xe5\x11\x9d\x87\x8a\xd9\x9f\xc7\xd1\x34\x87\xaa\xe8\xa0\x03\xec\x27\x95\x4c\x0e\x09\x0a\xa8\x14\xc0\x66\x4f\x57\x3f\xfa\x30\x2c\xdd\xea\x99\x49\x05\x09\x6e\xbe\x1b\x0e\x13\xa9\x8c\x52\x61\x8e\x2e\xce\x74\x6c\xd8\xba\x1e\x82\x38\x12\x7c\x91\x49\x31\x89\x41\xe7\x2a\x2e\xb5\x07\x80\x80\x7e\x90\x33\x9e\x96\x34\x43\xd1\xef\x26\x73\x3c\x3c\xc3\x9f\xf3\xc9\xd4\xf4\x6f\x18\xb8\x3d\xf1\x84\xac\x52\xa5\xfd\x43\xf9\x52\x8a\x2d\xd7\x70\x54\x18\xe7\x5e\x43\x17\x32\x74\x5c\xa4\x73\x40\xac\x75\xc9\x9c\xb5\x2c\x1c\x8f\xdc\x8e\x43\x04\xba\x47\x44\x87\xe9\x1d\x85\xee\x80\x56\x3b\x02\xbf\xb0\xa5\x32\x70\xed\xf2\xdc\xa0\xd5\x61\xd5\x67\x22\x7c\x6c\xa2\x6e\xa3\x56\x13\x6e\x62\xd4\x6e\x58\x83\xdd\x65\xa7\xdd\x72\xcd\xaa\xfd\x73\xc5\xf2\x22\xa3\xa6\x9b\x64\x9b\xbd\x9f\xa2\x80\x40\x14\x4e\xb7\x02\x8b\x8a\xb4\x4f\x33\xbb\x55\x2f\x7e\x3c\x76\x25\x7d\x28\x82\x6a\x24\xbb\xaa\x9a\x97\xa2\x46\x85\xaa\xe5\x4a\xc9\x03\x38\x70\x23\x96\x82\xc4\x76\x4f\x06\xaf\xcd\x8d\xc0\x6e\xb6\xf6\x8f\x8b\x1f\x8f\x7b\x84\x0f\xd8\xc0\xff\x15\x6e\xf5\x47\x86\x91\x13\x2c\xf9\x08\xa5\x44\xb0\xd1\x61\x2a\xb1\x3b\x3c\xfe\xed\x3f\xbe\xb5\x93\xb4\xdf\xfe\xa9\xff\x6d\xd4\xfc\xe8\x4f\xff\xb0\x27\x90\xb2\x37\xd4\x3f\x8d\x33\xee\xe1\x70\xb0\x7f\xfd\xe3\x42\xa6\x96\xaf\x06\xf8\x5a\xfa\x1f\xae\x15\x3c\x13\xc6\xda\x23\x17\x12\x72\xed\x78\x8a\xdc\x05\xcf\x56\xec\x9f\x3e\x64\xe2\x7a\xa8\x3a\x21\x9b\x50\xc3\x04\x9c\x92\xbe\xb4\x5a\x48\x83\x3f\xc7\xee\xab\x30\xff\x83\x71\xdc\x10\xd5\x48\x09\xf2\x0f\x65\xec\x91\x20\xec\x13\xd7\x00\xa4\x83\xef\x0a\xe4\xa0\x2e\x9d\xdf\x2b\x02\x76\x58\x4b\xe1\x00\x9c\x04\x1d\x59\xed\xdc\xbe\x10\xd2\x7c\x11\x96\xdf\x6f\x06\x38\xdd\x25\xa1\x33\x09\x60\x1d\x70\xee\x09\x52\x0a\xf0\xf5\x57\x0d\x0d\x47\x73\x92\x73\x6d\xe8\x35\x1b\x90\xa1\x3d\xd8\xe3\x9c\x0b\xa4\x9e\x20\xd0\x92\x86\xa5\xa4\x14\x86\x67\xf0\x6d\x35\x8e\x9d\x72\x7c\xe0\x9f\x8d\x89\x2e\x13\xe8\xda\xab\x58\xdf\xab\x10\xee\xae\x25\xe1\x5b\xbd\x4b\x2f\x2c\xf6\x94\xa2\x8d\x59\xa4\xf0\x53\xec\x01\x2c\x1c\x7b\x2d\x25\x98\xdb\x79\x4a\x91\x54\x6a\x03\x10\x13\x1a\x41\x5b\x4d\x21\xf3\x29\x51\x68\xee\xba\x10\x8a\x60\x09\xd3\x9a\xaa\x39\xf6\x48\xe5\xa1\x95\xa3\xcb\xfd\x05\x75\x26\xa7\xa2\x84\x01\x14\xc3\x86\xbb\x65\x02\xd4\xa1\x64\xa4\xe4\x35\x13\xa1\xa8\xc2\xae\x62\x3d\xb3\xbc\x92\x54\x90\xd1\x20\x49\x32\xa5\x62\xc2\xaa\xba\xf9\x9c\xa6\x40\xfb\x1f\x82\x7a\xea\xdf\xc7\x52\x80\x8e\xad\x96\xc7\x0d\x90\x62\x64\xcf\xee\x10\x08\xfa\x28\x88\xf7\x24\xf5\xaa\x48\x8d\x7d\x25\x9e\x35\x3a\x2c\x48\x37\xa1\x81\xf6\x41\x81\x3e\xa8\x5c\x1b\xcc\x62\xcf\x99\xa1\x29\x35\xb4\xb3\x4c\xf6\x77\x34\xf4\x02\x75\x69\x2e\xc0\x0e\x51\xfa\x8b\x53\x3e\xbc\xbe\x2d\x0b\x1e\x23\x29\x80\x34\x98\xfa\xd5\xc7\x36\xfa\x96\xaf\x5d\x18\x16\x13\xd4\x41\x9b\x75\x1d\xe2\x61\x78\x3f\x1a\x8a\x2c\x96\x92\xb4\x04\xdd\xb8\x12\x69\x6d\xd2\x04\x3a\x89\x22\xd9\x85\xee\x8c\xca\x57\x55\x36\x44\x52\xd7\x07\x56\x6a\xae\x78\xd6\x31\x61\x38\x76\x7b\xf7\xd0\x17\x8e\xf8\xa5\xc0\xad\xba\xb0\x0c\xb0\x4e\x13\x66\x74\x95\x67\x8a\xa7\x89\x15\x91\xee\x2c\x77\x9e\x17\x38\x6a\xdc\xd2\x38\xe7\xc5\x6a\x15\x1a\x17\x4e\x4b\x77\x5a\xd8\xf3\x6b\xe3\x2b\xd3\x5d\x38\x0d\x9b\xe2\xbe\x93\x69\xfb\xb8\xdc\x42\x77\xd7\x6a\xe0\xaa\xec\x06\x4b\xb0\x34\x78\xc6\xf0\xc9\x90\xa5\xa0\x6b\xc0\x20\x78\x04\x4c\xe9\xac\xb9\x83\xb9\x52\xd9\xfb\xa1\x73\x1b\x3c\xae\x0f\x8f\xeb\xbf\x6a\xeb\xca\x6f\x9f\xc7\xe9\xaf\x96\xf9\x9c\xf5\x09\x75\x10\xbb\xb1\xa2\x75\xd8\x49\x68\x65\xb1\xbd\x66\x38\x79\x5d\x96\x4a\xc8\x0c\x72\xb5\xc5\x8c\x5b\x79\xf9\x9a\x7c\x51\xd3\xb5\x9c\x4e\x1b\x9c\x05\x58\xc8\x75\xe0\xbd\x07\x03\xb7\xe4\x1e\xa5\xac\x7e\xfb\xe1\xc2\x60\xa0\xe4\xad\x36\xa4\x17\xee\x4c\x4a\x6d\x64\xbe\xd8\x77\xd8\x2a\x86\x39\x96\x1d\x50\x43\x7d\x51\x81\x15\x66\xe8\xdc\x39\x84\x06\xf0\x2a\xc5\x42\x38\x6b\x60\x2e\x8d\x03\xb6\x66\x7d\xb4\xc5\xc1\x50\xc7\x3a\x12\x73\x9c\xdf\x49\x58\x11\xef\x62\x21\x13\x6b\x37\xf8\x9c\x29\x26\xe8\x28\x8b\x4a\xde\x82\xe9\x60\xd5\x7c\x05\xce\x7d\x5f\x71\x6c\x37\xa2\x92\x59\xe6\xbb\xd1\xa3\xff\x63\x21\x53\x0d\x66\x83\xd3\xed\x05\x3f\x53\xb0\x55\x04\xbb\x09\x4a\x29\xd5\x08\x17\xeb\x33\x2f\x80\x32\x3e\x7d\x70\xd5\x78\x2d\x73\x23\x3a\xcc\x8e\xe8\x2e\x3f\x02\xc0\x69\xb8\x68\x9e\xf4\x5c\x0d\xd3\xa0\xad\xf7\xe2\xd5\x5d\x9a\x05\x64\x9a\x42\x9a\x59\x17\xf1\xea\x7a\xef\xa5\x8b\x33\x18\xd8\xdb\x7d\x13\xf8\xc3\xeb\x03\x61\xaf\x8c\x98\xdd\x89\x15\xa4\x16\x70\x78\xfc\xdb\x15\x79\x78\x15\xdb\xfd\x00\xfd\x99\xdc\x1e\xf1\xf5\xd5\xf6\x38\x39\xba\x38\xc3\x27\x0e\xa0\x03\x2f\x15\x73\xa7\xa9\x99\x29\x57\x69\xbf\xa0\xca\xcc\x71\x9f\xf6\x6a\x4f\x0b\xb5\xa5\x1d\x90\xa3\xd3\x50\x7b\x9b\x06\x6e\xf1\x55\x5b\x23\x20\x9f\x5b\x1f\x1f\x9b\xbc\x75\x65\xb6\x8d\x22\x6d\x2b\x5d\xfd\x55\x2f\xa7\x8e\x40\xd9\xbc\xe7\xe3\x49\x50\x24\xa4\xe2\x74\x7b\xa2\x5f\x86\xdc\xba\x28\x32\x12\xc7\x1a\xab\xe4\xbb\xc7\x57\xef\xc2\xb3\xb6\xe8\x84\xe9\x52\x16\x63\xd8\xb5\x73\x9e\xde\x7f\x8b\xe1\x5c\xfc\x70\xe4\x96\xca\x47\x98\xab\xe8\x76\x22\xf3\xa2\x34\x2c\x5a\x52\x67\xcb\x3e\x78\x0d\x6b\x3e\xe1\x17\xd8\x95\xb1\xef\x86\xef\x87\xe1\xfb\x21\xb0\xdc\xb8\x97\x4d\x7c\x75\xb8\xa8\xa4\xf3\x0a\xdb\xf8\x7a\x72\x61\xe8\xfa\xd5\x59\x7a\x1b\x79\x94\x14\x37\xd2\x7d\x9a\x1b\x79\xfc\x54\x37\x12\x52\x8f\xbb\xdf\xfe\x97\x3e\x15\x7a\x41\x00\x38\x09\x7e\x97\x00\xa8\x41\x6d\x84\x71\xb8\xf6\x4d\xee\x9d\x5f\x3d\x6c\x64\xb0\x25\xe2\x54\x50\x27\x7a\xc0\x49\x8f\xce\x73\xf6\x29\x34\x0b\x88\xd4\x3a\x50\xce\x6e\xb8\x06\x5f\x32\x15\x95\xdd\x04\x22\xa4\xef\x52\x47\x3c\x20\xea\x4e\x1c\xed\xc4\x91\xbf\x76\xe2\xa8\x73\x71\x84\x99\xb0\xed\x13\xcb\xeb\xf6\x20\xfa\xdd\xc9\x2f\x25\x53\x73\x22\x67\x2c\xca\x48\x80\xf6\x0a\x9a\xa7\x2e\xa6\x3f\xe2\x22\xe5\x62\xd2\xd6\x06\xdb\x52\x2d\x2f\xa7\x26\x99\x9e\x7e\xb2\xda\x34\x54\xc9\x75\x2e\xf0\x17\x1f\x50\x2f\x76\xc7\x55\xf0\x4b\xec\x25\x3c\x38\xbc\x06\x0e\xcd\xb2\xfa\x04\x1c\xe3\x47\xe7\x27\x5d\x1a\xc4\x5d\x38\x54\x49\x77\x4e\x55\x72\x1b\xa3\xae\x22\x11\x92\x32\x7c\x53\xef\x89\xeb\x0b\x0d\x01\x3a\xbb\xe7\xe2\x4b\xae\x9f\x8e\xbf\x19\x43\xb5\x75\xd0\xef\x76\x60\x32\xf5\xab\xe3\x53\xa7\x4b\x0f\x1a\x5e\x6d\x41\x9e\xeb\x63\x79\xe2\x76\x73\x10\x76\x7c\xb0\x76\x00\x06\x1d\x5f\x35\x26\x75\xe0\xec\x90\xae\x05\xdc\x0a\xf0\xb2\x3e\xe9\x36\x30\x28\x24\x1a\x83\x84\xed\x86\xbd\x48\xd7\x4e\x1c\xbc\xfc\x32\x3e\x12\xb1\xc2\x16\xac\x65\x77\x5e\xb3\xf9\xbe\x76\xf5\x96\x52\xe8\x29\x2f\x7c\x57\x20\x90\x93\x6e\x57\x92\x1f\x21\x22\xe8\x87\x40\x89\x78\x26\x7a\xe4\x5c\x1a\xfb\x9f\x53\x48\x71\x80\x7d\x7c\x22\x99\x3e\x97\x06\x3e\xd9\x6a\x72\xe3\xab\x3d\x12\xb1\x5d\x41\x35\x87\x46\xfb\x98\xcc\x03\x15\x0f\x3e\xf0\x0d\x44\x75\x51\x8c\xb0\x30\x5c\x63\x50\xc5\x53\x35\x34\x3f\xd0\x6e\x08\xef\xe3\x15\x52\xf4\x5d\xe7\xcb\x15\x63\xb8\xc5\x90\xaa\xb6\x16\x77\x0c\xe7\x86\x82\xb8\x15\x7e\x03\x3e\xe0\x22\xa3\x49\x15\xad\x07\x00\x7e\x6a\xd8\x84\x27\x24\x67\x6a\x02\xb5\xb9\xc9\xb4\xeb\x25\xee\xea\x5c\xc4\xab\xc3\xd3\x11\xaf\x4e\xf9\x10\x54\x94\xb7\x90\x87\xf1\x38\xea\x0f\x8e\x8d\xc7\x75\x4e\x0b\xcb\x82\xff\x6d\x4f\x65\xe0\x82\xff\x81\x06\x1f\x7a\x40\x8e\x88\xe6\x62\x92\xb1\xda\x77\x2e\x8c\x10\x0f\x63\x47\xb0\xa6\xeb\x2f\x25\x9f\xd1\x8c\x61\xde\x14\x15\x01\x95\x5b\x8e\x97\x94\xae\x9e\xeb\xf2\x61\xe5\x72\xc8\x45\xda\xbb\x66\xf3\xbd\xde\x12\xdb\xee\x9d\x89\xbd\xaa\xcc\xbf\xc6\xa8\x41\xb9\x80\x0c\xa6\x3d\xf8\x6e\xef\xf3\xe8\x69\x4f\xc0\x74\xed\x8c\x27\x9d\xd3\xf9\x38\xa3\x5a\x77\x51\x71\x7c\x3b\x8a\xe6\x30\x7a\x52\x55\x41\xe4\x72\xef\x12\xcc\x8a\xe9\xce\x63\x0e\xd9\xf1\x5d\x65\x42\x74\x40\xe7\x99\x6b\x4d\xd8\x16\x92\x64\xf1\xcc\x09\xc3\x86\x02\x8a\x9b\xb8\xde\xae\x2a\x71\xb8\x85\xe2\x3f\x42\xc5\x94\x1c\xc7\x88\xc6\x5c\x83\x17\x8a\xfb\x92\x0a\x21\x0d\xe1\x22\xc9\xca\x14\xb1\x9c\xe1\xa7\xe0\xc3\xea\xc6\x50\xed\x8c\xbc\x9d\x33\xf0\x8f\x61\x58\xaf\x73\x3a\x0b\x7d\x39\x05\x74\x31\xef\x02\x8a\x1a\x31\x8f\x95\x6b\x47\xed\x4d\x52\x6b\xdc\x28\xd9\xad\x0e\x7a\x7d\x5c\xd7\x23\xdf\xf0\x91\x62\xe4\x78\x4a\x85\x60\xd9\x62\x32\x89\xae\xda\xef\x82\x72\xe9\x9a\xee\xee\xd7\xbb\xee\x7a\xd9\x2f\x42\x65\x7d\x95\x51\xbb\x01\x98\xf8\xdf\x4e\x63\xdb\xdb\x41\xca\x1f\xda\xd2\x16\x91\x8b\xa7\xf2\x86\xa4\x92\xdc\x40\x2f\xad\x99\x55\x0d\xa0\xef\x95\xf6\x4a\x45\x34\x53\x48\x5a\x4c\x64\x5e\x28\x99\x73\xed\x53\xbd\x1d\x43\x6c\xac\x80\x36\x2b\x1b\x23\x8e\xdd\x06\x13\xf5\xe6\x98\x18\xaa\x26\xcc\xd8\xc1\x89\x28\xf3\x11\x6b\x59\x20\xbc\x69\x30\xca\xa7\xd9\x09\x78\x73\xcd\x7c\x71\xf9\x7f\xfa\xe9\xbc\x1b\x04\xcf\x95\xbc\x75\x23\x55\x96\xde\xf0\x14\xd3\x36\x34\x39\xb0\x8f\x3b\x6c\xf7\xce\x1b\x84\xf0\x6c\xbd\x91\x6f\x6e\x78\xfa\x18\xe4\x76\xaa\x14\x90\x9b\x00\xbd\x5d\xd7\x59\x0e\x1d\x4e\xe0\xb1\x87\xe4\x94\x63\x39\x91\xfd\x0b\xb1\xb1\xf2\x11\x17\x55\x0d\x5f\x60\x08\x38\xf9\xac\x5c\xf0\x16\xb9\x66\x06\x0b\x41\xa0\x96\x42\x9a\x29\xd1\x3c\x2f\x33\x43\x05\x93\xa5\xce\xe6\x2d\xd9\xf8\xa9\x2e\xe9\x38\x63\x9f\x70\x37\xb7\xd7\x5f\xc2\x50\x75\x3d\x66\xc2\x04\x53\x55\x7d\xec\x92\x22\x53\xa5\x9c\xa6\x2f\x82\x52\x13\xaa\x99\xd8\x27\x96\xb8\x64\xd1\x22\x2b\x27\xbc\x51\x65\xc3\xae\xbd\x4d\xa3\x5f\xaf\xd7\xde\xa6\x6a\xde\x51\x6a\x56\x61\x56\xb4\x6b\x1f\xf9\x34\xba\xd1\x3c\xaa\xaa\x78\xb5\xba\xe5\x4c\xca\x0a\x26\x52\xc0\xc0\x8c\x76\x1c\x4e\x77\x63\xd4\x76\xd8\x93\x5d\x9f\x0b\xa7\x9f\x8c\xa2\x56\xc8\xe7\x56\x9c\x7b\x80\x4b\x3e\x26\x54\xb4\x15\xd8\xcf\xa5\x4b\x02\xd9\xe9\x8d\x0f\xbe\x74\xa7\x9d\x92\x22\x82\xd5\x3a\x25\x75\xdc\x27\x09\x4f\x3f\xb7\xd1\x7d\x9f\xa3\xdb\xfb\x19\xb9\xa7\xc4\x28\x17\x6d\xfb\x1a\xe9\x15\xed\x4e\x16\x66\xb5\xc1\x3d\xb9\x6b\x72\xf4\xb4\x9a\x1c\x8d\xa1\xe0\xbc\x3d\x20\xdd\x1b\x1c\x67\xc1\x77\xe6\x3e\xf4\x2d\xd2\xd7\xf0\x95\xb9\x1d\x15\x1d\xaf\x80\x5e\xee\x06\x72\xc5\x4f\x44\xdb\xd5\xa8\x52\xf6\x4b\x21\x9a\x09\xed\x4d\xf7\x82\xa1\x86\x6a\x66\xda\x78\x74\x97\xcb\x1b\xbc\x3e\x88\x63\x63\x0b\xa5\x94\x50\x1d\xaa\xae\x49\xff\x4f\x4e\x73\x14\xb5\x3b\xad\xce\xe8\x09\xed\x31\xeb\x58\x48\xdd\xc2\x31\x52\xbb\xbc\x09\x35\x2d\xbb\x82\xb6\x38\x65\xdd\x6c\x3f\x7c\x38\x3b\xe9\x84\x66\x76\xa0\x05\x9a\x39\x1e\x04\x54\x33\xfe\x4b\x19\xdb\xc0\x80\x99\x13\xa8\xe4\xee\xdf\x04\x29\x26\x09\xab\x9c\xf1\x27\x5c\x5f\xb7\x87\x94\xfc\xfe\xf8\xb4\x3e\x64\x7d\x33\x7f\x7f\x7c\x4a\xdc\xa7\x6b\xf9\xc0\x1f\xe2\x04\x6f\x8b\x4c\x38\x49\x58\x15\x1e\x4b\xb9\xbe\xde\x00\x1c\x65\x5b\xf3\xb4\x48\xcf\x9b\xd5\x0e\x6e\xb3\x3f\xdf\xa3\x56\x45\x50\x6b\x73\x59\x92\x1b\x07\x4e\xe2\x0c\xb8\x2b\x5e\xbc\x26\xa7\x42\x97\x8a\x55\x59\x4e\x8b\xb6\x9c\xd5\xa1\xd6\x36\xe7\x00\xff\x45\xbf\xee\xcc\xff\xdf\x35\x7f\x3e\x97\x80\x42\x41\x95\x01\x1b\xac\x23\x44\x4e\x68\xb8\xe5\x86\xf4\x44\xb8\x87\x79\xce\xc6\xbe\x5c\xa1\x47\x4c\x1d\xb6\xd2\xdf\x64\xd9\x25\x42\x2b\x8a\x19\xe4\x4d\x80\x4e\x23\x2f\x52\x36\x7b\xa1\x53\xfa\xaa\x07\x8f\xf1\x35\xed\xa6\x36\x27\xaa\xc9\xde\xab\xbd\x01\x19\xf2\x9c\x67\x54\x65\xf3\x5a\xef\x88\xea\x3e\x7b\x98\xfa\x01\x21\x09\xe4\xe5\x1e\x39\x90\x0a\x46\x4e\xa8\x20\x19\xa3\x33\xe6\x6b\xbd\xed\xf6\x9d\xa3\xf9\x70\xb8\x1d\xb2\x90\x6c\x4d\x34\x06\xc5\x62\x37\xec\xf5\x01\x8f\xf3\x1a\xe6\xd5\x49\x75\x9e\x71\x61\x0f\xb9\x01\xf9\xe0\x4e\x27\x77\xec\x23\x0b\xc0\xae\xf5\x77\x6c\xd7\x12\x6d\x8d\xcf\xa2\x9d\x27\x62\xd9\xd1\xb1\x6d\x84\x6e\xea\xed\x98\x70\x73\xc9\x0a\xd9\x81\x8a\x86\x03\x2d\x78\xf6\xb9\xb1\x1f\x48\xcd\x01\xef\x9b\x1a\x42\x51\x10\x25\x65\x46\xad\x45\x86\x7e\xfd\x01\x39\x39\xbd\xb8\x3c\x3d\x3e\xba\x3a\x3d\x79\x4d\xfc\x48\x3c\xd6\xe9\x07\xe4\x2a\x86\xad\x8b\x2a\xbf\x1c\x36\x58\x78\x56\xcf\x09\x56\x2a\x2a\xb0\x62\x80\xf1\xa1\x82\x9c\x09\x6e\xaa\x1e\x0c\x98\x44\x9f\x49\xe1\xd2\xe2\xed\xaf\x5d\x5c\x61\xc2\x31\x79\x53\xb8\xc1\xec\xd7\xf5\xd1\x60\x87\x22\x62\x79\x98\x4a\x23\xef\xc6\x86\x75\xbb\x6a\x79\x36\x61\x65\x7a\xb8\xf1\x4e\x36\xf9\x15\x06\x64\x2b\x7c\x79\x3c\x51\x43\xdb\x1c\x0f\xc3\x25\x55\xad\xab\xcd\x60\xb0\x3f\x20\xf6\xac\xde\x1f\xec\x7b\x55\x2e\x5b\x6a\xbd\x14\x06\x8d\xd1\x0e\xeb\xfc\x3d\x20\xe4\xbd\xaf\x26\xec\x59\x3d\x6d\x75\x17\x27\x44\x3c\x89\x7a\xf6\x2c\xec\x12\xdf\xdc\xab\x1c\xc5\x0f\x75\xf0\x88\x13\x3e\x63\x02\x5f\x6c\x73\x82\xd9\x4f\xb5\x93\x55\xbb\xac\xde\xfc\xc3\xe5\xdb\xcd\xbd\x14\x4a\x96\x4e\x5e\xe9\x58\xe6\x39\x02\xf7\x4d\x03\xee\x48\x05\x1d\x12\xa4\xde\x46\x8c\x73\x84\x2b\x1c\x37\xda\xb0\x0b\x12\xdf\x0f\xb5\x60\x8c\x87\x8f\x5d\x79\xaf\xa8\xec\xa1\x87\x37\x7c\x70\x78\x99\xda\x23\x30\xb9\xe3\xf3\x45\x78\x8f\x17\x97\xa7\x47\x27\xef\x4e\x07\x79\xfa\x04\x85\x2f\x13\x69\x21\xb9\x30\xba\xa9\x61\xde\xac\x71\x64\x5b\xb1\x1d\xa6\xdd\x8d\x6e\x76\xea\x87\x8b\x13\x3d\xfd\x33\x22\x00\xd4\x94\x19\xca\x33\x1d\x71\x98\x91\x85\xcc\xe4\x64\x75\xff\x88\x07\xb0\xce\xef\x10\x80\xaa\x4f\xfb\x96\x27\x37\x67\xb1\x36\x6f\x3a\x57\xa7\xa8\x6f\x32\x67\x09\x59\x51\x2b\x58\x82\xd0\x1b\xee\x19\x10\xec\x33\x9a\x08\x4b\x54\x44\x9f\x0c\x88\x38\x8f\x4f\x5b\x01\xbe\x46\xad\x28\xd7\xb5\x1d\x36\x43\xfc\xa6\x66\x83\x95\xe6\x4d\x7b\x9e\xd6\xa9\xfe\x17\x37\x52\xfd\x10\x29\x14\xeb\x07\xb4\x3c\xe8\x85\x28\x55\xa4\x83\xc5\x67\x8a\x77\xe2\x7a\x97\x2f\xde\x95\xcd\x17\x9d\xb9\x95\x96\x1e\x7c\xe8\x90\x78\x04\xe8\xbe\x01\x35\xd9\xb9\xb4\xe8\x04\xd1\xe6\x94\x8b\x94\x15\x8a\xcf\x78\xc6\x26\x00\x15\xcf\xc5\xc4\x37\xd1\x8c\x60\x57\xa1\x91\x13\x5b\x9a\x97\x5d\x6c\x6d\xe2\x56\x26\xc0\x59\xe7\xef\xaf\xa0\xfd\x00\xa4\xc2\xb4\x36\x26\xed\x03\xa1\x6d\x63\xbf\xdf\x07\xff\xdd\xc1\x3f\xad\x55\x93\x66\x87\xe4\x27\xe6\x9e\x23\xa1\x45\x82\x82\x9e\xa0\x53\x19\x30\xea\x61\xae\x15\x65\x81\xa1\x31\x39\xce\xdd\xf5\xc2\xde\x69\xd5\x67\x3c\xce\x6b\xf7\x03\x24\x3b\x22\x1d\x63\xcc\xff\x29\x5a\x40\x1b\x3a\x44\x3b\x96\xf6\x3e\x4e\xb4\x6a\x8f\x54\xe0\x8d\xee\x5c\xa0\x44\xcf\xf3\x8c\x8b\xeb\x0a\x82\x71\x2c\x2d\x1f\xbb\x36\x0c\xe2\xda\xef\x1a\xc5\x68\x76\xfb\x89\xd1\x84\x47\x37\x76\x5a\x98\xce\x42\x09\x57\xf3\x02\xf3\xd8\x82\xf0\x72\x49\x56\xb1\xa8\xdf\xdb\x7b\xd2\x14\xe3\x3a\xd1\xbc\xbd\x78\x3f\x1b\x1e\x0f\xcf\x6a\xb2\x5d\x10\xfc\xec\x73\x06\xec\x6e\x3b\x5c\xe1\x25\x9f\xb4\x05\xc1\x7f\x69\x96\xe1\xd4\x27\x59\xd9\xf4\x97\x98\x44\x7d\x21\x95\xa1\xd9\x06\x04\x67\x32\xa5\xc5\x51\x69\xa6\x27\x5c\x27\x72\xc6\x3a\x72\x43\xdc\x4c\xb1\x11\x85\x47\xad\xe5\x9e\x49\xf1\x19\xe4\xf8\x2f\x47\x17\x84\x96\x96\xeb\x8c\xc3\x18\xdf\x58\x7a\x9a\xa7\xc0\x10\x4b\x7e\x1f\xf1\xfd\xdd\x13\xb6\xea\xed\x77\x41\xe1\x47\x0f\x0a\x83\x5c\x7c\x2e\x81\x60\x2e\xb8\xe1\xd4\xc8\x56\x1d\x9d\xeb\xfe\x3d\x84\xdd\xc6\x2d\x72\xe6\x87\x87\x1c\x27\x50\xb5\x6a\x4f\xac\xf7\x11\x03\x43\x11\xc8\x7b\x26\xac\x59\x47\x13\xb6\x50\x67\xd2\x03\x10\x6c\x1c\x9b\x87\x7b\xbe\x75\xd5\x46\x05\x48\xdd\x3f\xbd\xae\xb5\xb8\x59\x6a\xd6\xe6\x9d\x8e\x55\x03\xb0\x8d\x79\x8b\xf9\x2f\xdd\xc8\x27\xe7\xdc\x47\xba\xfc\x67\x49\x33\xa4\xe7\xf9\x26\x3d\xe1\xf5\x75\xec\xe4\x35\x3d\x4f\xf9\x75\x3f\x0f\xde\xaf\x52\x43\xc7\x30\x77\x87\x51\x54\x68\xcb\x0c\x75\xff\xc2\xbe\x4b\x31\xd8\x27\x07\x26\x29\x5a\xb6\xb9\xda\x82\x6a\x4e\x7c\x59\xb7\xf6\x6f\x43\x15\x67\xbb\xf7\xda\x78\xde\x00\xec\xe1\x6e\x9c\xa7\x35\x02\xa1\x4a\x46\xde\x72\x6d\x7c\x37\x2f\xf8\x80\x6b\xd7\xfe\x00\xb4\xef\x0b\x22\x15\xe1\xc5\xdf\x69\x9a\xaa\xd7\x78\xd6\x3b\xeb\x10\xfe\xad\x03\x5e\x39\x15\x21\x63\xe5\xc0\xcc\x0b\x9e\x80\xab\xe4\xea\xf8\x82\x60\x5f\xc3\x3f\x7e\xf3\x12\x34\xf1\xaf\xbe\xfc\xe6\x65\x4b\x56\x7b\xaa\xd5\x71\xa4\x6b\x2f\x64\xe7\x79\x0a\xcf\xa4\x86\x02\x14\x50\xac\x9e\x80\xd3\xcd\x49\x41\xe4\x7b\xcb\x84\xe1\xcc\xed\x52\x4d\xdd\xd5\x1b\xfc\x86\xea\x0d\x48\x28\x18\x47\x39\xfa\x58\xf2\x19\x45\xf3\xc5\x53\x11\xcd\x0d\xa9\xd9\x94\x73\xeb\x1c\x8b\xd2\x6d\x7f\x5f\xc7\xb9\x1c\x50\x4f\x79\x72\x3e\xfc\xfb\xdb\xa3\xef\x4e\xdf\xc2\x7b\xba\x6c\x78\xcb\x8a\x5c\x34\xce\xdd\x5e\x9f\xb5\x9b\x7b\x8a\x9a\x92\xb3\x8b\x88\xfd\xf9\x9b\xe1\x82\x2b\xce\x7e\xf2\xc0\x30\x7d\x5b\xdb\x52\x8c\x5b\x50\xef\xa9\x05\x09\xa0\xa3\x21\x53\x9b\x29\xee\xee\x38\xc2\x10\xe1\xa8\xd7\x9c\x1a\x96\x87\xf0\x1d\x5b\xfb\x1d\x1a\xf2\x06\xd9\x3a\x35\xee\xee\x60\xb2\xa5\x18\x52\xb1\xf3\x30\xf2\x67\xa5\x76\x3b\xf5\x50\x75\x85\x3c\xb0\x3f\x84\xb1\x7c\xc2\x83\x15\x61\x98\x47\xad\xec\x89\x6a\xcf\x52\xa6\x43\xe7\xb0\x67\xc0\xad\xc5\xaa\x16\x73\xed\x4f\x87\x95\x9d\xeb\x6a\x4d\x9f\x6b\x21\xfa\x5a\xf5\xf2\x6d\xed\x2d\x7d\x2e\x23\x75\xae\x2a\x5d\xd0\xa4\xd3\xce\x3c\xd5\x47\xf8\x09\x00\xbd\x3d\xc5\x03\x06\x26\xbe\xa1\x32\xab\xf0\xec\x6e\xb6\xe3\xb1\x1f\x6e\x11\x0c\xe4\x41\x5c\x42\xa8\x0e\xed\x9c\x4b\x1d\x90\xfc\x7c\xb3\xf2\x6d\x64\x21\xb2\x75\xe7\xd0\x4f\x0d\x1d\x08\x9b\x74\x1e\x14\x53\x69\xa4\xe8\xb8\x84\xf4\x62\xc5\xa0\x75\x79\x86\x77\x1c\x57\x3d\x2c\x2b\xbe\xc0\x0a\x9b\x10\x9a\xb6\x06\x87\x3f\xb1\xa5\xf0\x41\xea\x7a\x88\xfa\xe9\x09\xa0\x22\x3d\x3b\xd9\x80\xec\x79\xfa\x30\x3c\x0f\x0d\xce\x6d\x2c\xbd\x34\xed\xa8\x2e\xfd\xec\xc4\xd9\x02\xbe\xf6\x5c\xbb\xcd\x43\x6e\xdf\x3d\x1b\xd1\x93\xa4\x32\x37\x52\x75\x05\x5f\x76\x51\x1b\x6e\x21\x5f\xd1\x7d\xb7\x84\x27\xf1\x3c\x65\x05\xbe\xe5\x93\x97\x17\x43\x48\xe4\x5a\xe8\x2f\xb9\x28\x21\x42\xa5\xee\x23\x08\x91\xa7\x23\x3c\x3a\xd5\x4a\x1e\x17\x36\x6a\x63\x26\xad\xdf\x15\x9d\xd0\xe8\x47\x37\x98\x73\x6d\x5a\xfe\xa8\xc4\x2d\x0d\xc2\xc8\x3d\x74\x23\xe2\x55\x49\x2b\x7e\x9a\x49\x91\xfa\x81\x62\x58\xae\xb1\xa3\x5f\x96\xd9\xf5\x94\x22\xee\x05\xe8\xc0\xa5\x7a\x04\xdb\xe9\xe5\xb4\xd0\xd8\xb4\x20\x95\x37\xe2\x86\xaa\x94\x1c\x5d\x9c\x7d\x7e\x21\xda\xba\xf8\x11\x77\x41\x1b\x4c\xfa\x1a\x15\x01\x85\x7e\xc4\x8d\xae\x7a\xdf\x33\x13\xfb\x90\xec\x01\x14\x32\x44\xac\x08\xb3\xe2\xca\xcd\x22\xd2\x91\x04\x91\x89\xa1\x19\xb6\x83\x20\x23\x66\x6e\x18\x13\xe4\xe5\xcb\x97\x18\x52\x78\xf9\x87\x3f\xfc\x01\x3a\xbf\x93\x94\x25\x3c\x5f\xbe\x11\xee\xfa\xf7\x57\xaf\x06\xe4\xaf\x47\xef\xde\x12\x9a\x80\x05\x86\x90\xaa\x38\x32\xac\x5d\xfc\x63\xdd\x23\xff\x77\xf8\xfe\xdc\x9f\x4b\x7a\xe1\x5b\x60\x8d\xdc\xbf\xde\x80\x9c\x44\xe9\xe7\xb1\xcb\x9f\x9a\x29\xa4\xe4\x0b\x69\x08\x1d\x8f\x81\x39\x51\x24\x73\xed\xc5\x85\xc7\x45\xe3\x93\xa9\xef\xdd\x6d\xd9\x2a\x83\xbc\x78\x6e\xa7\x08\x21\x16\x0f\x25\x88\x69\xfe\x30\x56\x38\x1d\x60\x2a\x3d\x92\xf1\x6b\x46\xc6\x1a\x3a\x78\x57\x4d\x34\x14\xd3\xd6\x7e\x4a\xa8\xb0\xa3\xe3\x60\x61\xea\x76\x12\x4f\x3b\x77\xa1\x65\xaf\xe7\x1a\xc3\xfa\xc6\x70\xbe\x2e\x09\xe5\x89\x25\xfb\x53\xcd\x25\xa8\xeb\x8b\xe1\x7d\x90\x8b\x1c\x14\x5f\x10\x9b\x84\x66\x52\x4c\x62\xa6\xab\xf4\x08\x9f\x80\x38\x2f\x58\x53\x62\x74\xd4\x4d\xa5\x9b\xde\x64\x28\xb9\xdf\xd1\x96\xdd\xfe\xeb\xa1\xd5\x08\x0a\x91\x8e\x64\x69\x7c\xca\x1b\x3e\x09\x20\xb0\x00\x23\x11\x09\xde\xea\xc1\x9d\x35\xa6\xe9\xae\xd5\x5b\x47\x7d\x96\xea\x07\x71\x4d\xd9\xec\x11\x46\x93\x29\xb9\x66\xf3\x3e\x8a\xf8\x82\x02\xfa\x01\xd0\xf9\xc4\x52\x17\xfb\x0b\xd5\x33\x0a\x12\x96\x5a\x3b\xd0\x2d\x82\xcf\x4c\xac\xb8\x3e\xa0\x27\x78\x53\x49\x3b\x8d\xda\xf5\x2d\x12\x91\xe3\xd0\x37\x2a\x4c\xa4\x30\xae\x09\x62\x68\x54\x04\x99\x96\x0b\x15\xf6\x56\xa2\xb0\xd4\xfe\x4c\xdf\xf5\xe4\x2a\x1d\xd3\x1e\x19\x4e\x99\x28\xc5\xd2\xaf\x01\x09\x1c\xf2\x5e\x35\x73\x78\x3e\xd4\x37\xc0\x8b\x52\x3a\xa7\x3c\x81\xaa\x1a\x7b\xbb\xbb\xd7\x53\x29\x10\xa2\x86\x00\xa0\x99\x29\x1d\x69\x20\x97\xd6\x3e\x9b\x69\x4d\x38\xbc\x61\x4e\xd5\x35\xf3\x60\xb6\x34\x1b\x90\x0b\x3b\xc9\x80\x53\x8e\x7d\xe3\x66\x58\x04\x61\x65\x4a\x0c\x6d\x60\x1f\xb2\x3f\x18\xec\xe3\x59\xb8\x02\xe8\xa0\x35\xbf\x74\xd9\x32\xac\xb3\x56\x61\x75\x3d\x88\x16\x1a\x5b\xa7\x59\xeb\x00\xda\x13\x4a\xc0\x1d\x31\x53\xaf\x2d\xd0\x96\xe0\xd3\xf1\xd5\x71\xcf\xaa\x6e\xdb\x5e\x76\xd7\xf4\xb2\x45\x08\xbc\x7e\x75\xdd\xec\xb2\xc3\x56\x97\xf5\x84\x63\x27\x7f\xaa\x13\xa4\xab\xbe\x7b\x9d\x37\x56\xcc\x3b\x68\x6b\xe5\xaf\xdb\x90\x8b\xf3\x75\xac\x0b\x50\xb4\xad\x2c\x7f\x52\xe6\xc4\xd9\x18\x64\xe8\x6a\xb4\x96\xc8\x4a\x0b\x47\x8a\xa5\xc0\xe6\xed\x88\x2e\x7a\xc5\x93\x8e\x0c\x8b\xc5\xab\xbd\xa1\xb1\x78\xb5\x49\x66\x59\xbc\x96\xf6\x79\x38\x53\x8b\xa8\x94\x16\x96\xc8\x48\xe8\xc1\x68\x82\x30\x18\x90\x77\xee\xcc\x45\xe6\xa6\x23\x2d\xb3\xd2\x04\x58\x85\x15\x07\x32\x0c\xea\x3b\x36\x22\xdc\x90\xbf\x2d\x3a\x9e\x41\x31\xc1\x33\xab\x9b\x93\x1a\xaf\x0e\x85\x4d\xdb\x64\x54\xbc\x7e\x63\x29\xa9\x78\x75\xb8\x0a\x5e\x2f\xec\x78\x25\x86\x0e\x53\xd2\xd7\x01\xd6\xb4\x57\x48\x4b\x35\x1a\x55\x63\xaf\x88\x62\xc3\xc3\xa6\x68\xcb\xd5\xd5\xde\xf1\xea\x5e\xc7\x79\x03\x8f\x2e\xce\x1e\xdd\xca\x8c\x9e\xb5\xb3\x33\xd7\xba\x56\x38\x7c\x01\x88\xc0\x3b\x81\x4e\x2a\x8a\xba\x00\x9b\x95\xbf\xbf\x01\x73\x65\xe9\xc5\xdf\xd8\x73\x27\x0a\x4a\x2d\xb4\x7c\x40\x0f\x6e\x75\x42\x45\x6d\x22\x7c\xba\x0c\x48\xb3\xe7\x6f\xda\x6c\xa9\x41\x02\xd4\x6f\x51\xf7\xb2\x78\x2d\x26\x96\x3a\x22\x92\x21\xf4\xda\x47\xef\x49\xe4\x86\x29\x64\xfa\x1a\x9b\x36\x53\x21\xa4\xc1\x1e\xf3\x3d\x6c\xd6\xaf\x7b\xe8\x5e\xb1\x4a\x66\x94\x68\xa5\xa2\x10\x66\xc7\x6a\x65\x67\xcc\x43\x3a\x67\x20\x02\x4c\x04\xb4\xbb\xe8\x86\x93\xc8\x23\x70\x93\xbd\x2a\xad\xa4\xcb\xbe\xea\xf5\x70\x23\x8e\xef\x99\x48\x27\x53\x96\x53\x6c\x70\xe1\x09\x64\xe5\xf5\x8d\xe2\xc6\x30\xc4\xbf\x66\x2a\xd7\x44\x8e\x7b\xde\x44\x42\xd4\x93\xd9\xab\xbd\xee\xfa\xd3\x3f\x82\xad\x4c\xfc\x0e\x6d\x0a\x5f\x75\xdb\x55\xf7\xfd\xd7\xec\x08\xbb\x3b\xc1\x60\xce\xa0\xe3\x8e\x58\x70\x42\x5a\x25\x62\x86\xf4\xdf\x6a\xd2\x6d\x9f\x9b\xa1\x17\x94\xd1\x9d\x9b\x61\xe7\x66\xe8\x62\xc4\x47\x73\x33\x44\x07\xb7\x17\xa6\x6e\x01\x62\xd7\x43\x8c\xff\xee\xfd\x0f\x15\xae\x43\x84\x65\x6c\x59\xde\x7b\x1e\xa4\xaa\xfb\xff\xf7\x07\x83\xfd\x7d\xef\x8f\x70\xfb\xa3\x34\xe3\xfe\x1f\x09\x13\x89\x4c\x91\xa9\xec\xf8\x4a\x1b\x50\x6a\x2b\x03\x3c\x9e\x4b\xee\x9f\x15\xc7\x10\x60\xec\x6e\x59\xa2\x43\x09\xe5\x73\x46\xde\x3c\xaa\x0a\x56\x29\x5e\x01\xbe\xca\x11\x30\xa0\xfc\x39\x0d\xac\xca\x61\xc9\x78\xce\x1d\xae\x9e\x15\x17\x4c\x1b\x4d\x0e\xf0\xc3\x41\x52\x94\x3d\x77\xc3\x20\x67\xb9\x54\xf3\x5e\xb8\xc9\x7e\x59\xfb\x95\xbb\xe3\x10\xb4\xb6\xa4\x54\x8a\x09\x93\xcd\x7f\xbb\xfa\x9b\x27\xf1\x16\xab\x6f\x81\x2b\xda\x94\x58\xac\xba\x16\xca\x2e\x02\xb0\x3d\x38\xea\x02\xb5\xe1\x1c\x72\xc5\x0e\xbd\xe0\x3e\x82\x4f\x99\x98\x91\x19\x55\x8d\x8b\x1d\x56\x5d\x8f\xa2\xb1\xa5\x7c\xc6\xb5\x6c\x5c\x2e\xb6\x72\xc8\x65\xef\x17\x77\x8d\x00\x64\x69\x8a\xd2\xb8\xd3\xc5\xef\x6d\x0f\x35\x17\xf6\xf4\x82\xe2\xfb\x6a\xaf\xc3\xc9\x15\xd4\x18\xa6\xc4\x6b\xf2\x5f\x07\x1f\x7f\xff\x6b\xff\xf0\xcf\x07\x07\x3f\xbf\xec\xff\xc7\xdf\x7e\x7f\xf0\x71\x00\xff\xf8\xe2\xf0\xcf\x87\xbf\xfa\x3f\x7e\x7f\x78\x78\x70\xf0\xf3\x0f\xef\xbe\xbf\xba\x38\xfd\x1b\x3f\xfc\xf5\x67\x51\xe6\xd7\xf8\xd7\xaf\x07\x3f\xb3\xd3\xbf\xad\x39\xc8\xe1\xe1\x9f\xff\xad\xc3\x97\xa0\x62\xfe\xbe\x33\x11\x8c\x57\xff\x51\xd4\x88\xfa\xd8\x1d\xb3\x2e\x21\x9f\xfa\x95\xf3\xba\xcf\x85\xe9\x4b\xd5\xc7\x87\xbc\x26\x46\x95\x5d\x89\xae\xea\xf8\x7b\x3c\x19\x53\x29\x31\x15\x72\xa3\x37\x6c\xb6\x50\x88\x60\xe6\xe8\xa3\x7b\x83\x5d\xbb\xd4\x9d\x23\x78\x9d\xeb\x51\x12\x8e\x1c\x32\xcc\x6f\x3c\xdb\x68\xe8\x3a\xf2\xee\x52\x8d\x96\xae\x5d\xaa\xd1\xf2\xb5\x4b\x35\x7a\xe0\xb5\x4b\x35\xda\x42\x1f\xe0\x2e\xd5\x68\xe7\x03\x7c\x22\x3e\xc0\x5d\xaa\xd1\xba\xd7\x2e\xd5\xa8\xf1\xf5\x34\x53\x8d\x9c\x02\x5f\xe5\x19\x6d\x6d\x9a\x91\x6b\xf0\x7f\x94\x24\xb2\x14\xe6\x4a\x5e\xb3\x96\x51\xd9\xb5\x0c\xcc\xa5\x67\x6e\xa7\xb5\xd9\x95\x4a\xd9\x81\x0a\xd8\x9d\xf2\x47\xcb\x94\x5b\x33\xb3\xe3\x6d\x70\xe4\x86\xf5\x76\xa6\x3d\x16\x45\xca\xd2\xf0\x3c\x2f\xac\x8c\x5d\xef\x01\x39\x22\x8a\x25\xbc\xe0\x56\xb4\x03\x98\x0e\x7c\x8e\xfb\x24\xf4\x03\xe6\x46\xb3\x6c\xec\x7a\xa2\x8a\xaa\x66\x58\x45\x26\xa4\x3b\x2b\x56\x3e\x06\xb5\x02\xe9\xdb\x58\x12\x3d\x95\x65\x96\x12\xc5\xfe\xe9\xd5\x09\x37\x9b\xab\x78\x84\xd8\x11\x0a\xaf\x52\x3d\xd6\x0d\x4e\x0b\xee\x50\xb7\xb6\x49\xc0\xb1\x4f\x05\x57\xb0\xd9\x86\x2c\x91\x22\xed\xda\xbd\x71\xba\x38\xbe\x5f\x6b\x17\xcd\x61\x29\x49\x4b\xbc\x01\x0a\x21\x69\xc6\x53\x6e\xe6\x21\x0b\x03\xb7\xbd\x55\x44\xb1\x0b\xad\x63\x04\x5d\x2d\x04\xa1\x45\xa1\x24\x4d\xa6\x4c\x47\x6f\x83\x6a\xa5\x03\x9b\x08\xf5\x95\x59\x39\xe1\x02\x35\x4b\xf8\x8d\x55\x43\xb2\x39\x51\xd2\xf8\x84\xb2\x5b\x1e\x78\x15\x0d\x06\x3f\x47\x5d\xc2\xa8\x39\x64\x9d\xc9\x78\x08\x9c\x15\x1f\xc7\x7f\x68\x22\xb3\xd4\xe3\x96\xfe\xf1\xa5\x55\xe5\x13\xc7\xc5\x56\xda\x03\xaa\xa4\x91\x24\xb3\x6a\x91\x3d\x01\x6e\xff\xf1\x97\x5f\x93\xa9\x2c\x95\x1e\xc4\x10\x02\xaf\xe0\x33\x74\x52\x78\x53\xc0\x90\x8c\x51\x6d\xc8\xab\x97\x24\xe7\xa2\xb4\x67\x79\x47\x8c\xd7\x95\xf6\x1a\xe9\xad\xdf\x7c\xdd\x72\xb4\x6e\x34\xd6\xe5\x0c\x16\xc7\xad\x05\xf6\x67\x73\x8a\xab\xdb\xe3\x08\x8a\x81\x3d\x1a\x17\xd4\x58\x77\x24\xc5\xab\x28\x8c\xdc\xf0\xce\xff\xa5\x94\xa3\xb9\x69\x0f\x03\xf3\x9f\x38\x4e\x1d\xff\xc5\x7f\xb8\x0e\x96\x6a\x05\xa5\xda\x60\x2a\x1b\xef\x16\x3d\xe1\xda\x34\xea\x15\x5d\xe1\xc6\x34\xf8\x71\xdb\xc3\x7c\x62\x2d\xde\x4e\x8a\xd6\xc1\x76\xf6\xb6\x9a\x77\x2a\x27\x09\xd3\x20\x8a\x3c\x7c\x1a\xf8\x67\xf1\xa9\x0d\x1f\xba\x5d\x88\x2d\x77\x22\xb2\x78\xe6\xef\xa0\x33\x66\x2b\x62\xb5\xd1\xed\x3d\x63\x77\x44\x2d\x1c\xac\x2e\x23\x34\x17\x13\x6c\x64\x99\x97\x99\xe1\x45\x56\x51\x2e\xfc\xc0\x1d\xc0\xb1\xc3\x9f\x46\x1e\x66\x8a\xc0\x51\x08\x0d\x0e\xc1\x91\x83\x30\x16\x13\x06\xfb\x31\x2a\x7b\x8e\x17\x54\xd1\x40\xfe\x44\xe6\x39\xd5\x87\x2e\x76\x40\x21\x77\x05\x25\xbb\x3d\x86\x15\xcd\xc2\xeb\xc7\xb9\x02\x9b\x62\x5c\xc3\x04\x15\x8d\x83\x76\x75\x87\x0b\x0c\x45\xe4\x4d\x48\x8f\xc7\xfe\xe9\x0b\x1c\xeb\x14\xe2\xef\x68\x72\xcd\x44\x4a\x3e\x68\x4f\xb8\x74\x2e\x68\xee\xc0\xd5\x0b\x25\xb1\x6f\x37\x4b\x17\x7e\xaf\x7b\xce\x91\x88\x28\x23\x1e\x04\x0a\xf5\xad\x4d\x51\xb1\xd4\x1d\xa1\xeb\x7e\xd0\x56\xf9\xba\x5b\xde\x69\x74\xd2\x2a\x3e\x4b\x98\xd7\x1d\xed\x04\x36\xf5\xf2\xb3\xc6\x88\x6f\x64\x35\x0e\x93\x6b\x9a\x89\xbb\x10\x8e\xf4\x10\x7c\x04\x1c\x75\x9a\x59\x11\x37\x0f\xf0\x3a\x0b\x0c\x36\x9a\x6f\xae\x65\xbf\x1a\xb5\x07\x68\xda\xbf\xfc\xee\xa4\x2e\xcc\x2e\x69\x2a\x35\xf9\x2e\x93\xc9\x35\x39\x61\x60\x34\x3c\x66\xbb\x77\x35\x4a\x9f\x76\x9b\xc6\x9c\x4e\x9a\xe5\x79\xf4\x49\x2e\x05\x37\x52\x35\x91\xc7\x5b\x04\xb6\xb7\x6b\xb5\xb7\x1a\x44\x5c\x8d\xd2\x67\xd3\x68\xcf\x32\x79\x47\x1d\x76\xa7\x8c\x28\x10\x31\x30\xa8\xef\xfe\xd1\x50\x60\xfc\x6e\x2a\x6f\xfa\x46\xf6\x4b\xcd\xfa\xbc\x71\x9e\x52\x6b\xfa\x5c\xb3\x39\x24\x7d\x75\x42\xa1\x1f\x70\xb0\x9a\x89\x6e\x24\x78\xce\xe1\x73\xab\xc8\x5d\x7e\x77\x62\x4f\xef\x41\x6c\x96\xbc\x60\x26\x79\x91\xb0\x62\xfa\xc2\x4d\xe7\xc9\x93\xd5\xcb\xc7\x6e\xe8\x7a\x44\x12\x99\x65\x0e\xb7\x4b\x8e\xc9\x31\x2b\xa6\xe1\x11\xdb\x41\xab\xa7\xdc\x2c\xad\x90\xb2\x9b\xc6\x4a\x91\x88\xb0\x63\x3a\x09\x11\x31\xba\x1a\x3d\xac\x17\xf4\x36\xb2\xf6\x67\xec\x49\xd2\xa4\xb7\xdc\x56\x90\x77\x7b\x7a\xd4\xed\x0f\xfd\x70\xe0\xff\x89\xc2\xcd\xf5\x96\x74\x3e\x5f\xb4\x26\xa2\xcf\xc6\x68\x61\xa6\x2c\x25\x72\xc6\x94\xe2\x29\xd3\x24\xc8\xe8\xd8\xb1\xc4\xb3\xed\xa0\xfc\xae\x3b\xde\xd3\xca\x0f\xd8\x1e\x9f\x42\x24\xbc\xed\x98\xcb\xc2\x9b\xa6\x39\x17\xdb\xc1\xe5\x0d\xe9\xa5\x13\x9a\xb1\xb3\xf7\xad\x4d\xef\x21\x8e\x53\xb7\xbe\xfd\x87\x11\xc8\xfe\x3d\xc0\xf3\x3f\x04\x9e\x25\x42\xa6\xcd\xa2\x61\x1b\xb6\xa1\x27\xd4\xb0\x9b\x86\x8a\x4f\xbf\x12\xf5\x4d\x7f\x0f\x96\xd7\xd3\xb6\xc1\x37\xd4\x20\x23\xda\xd7\x88\x7a\xbf\x29\x75\xca\x71\x50\x37\xae\x65\x4f\x8a\x85\xfe\x62\x7e\x6b\x1e\x5d\x9c\x91\xef\xf1\x79\x9b\xeb\xf8\xa1\xa4\x41\x4b\xe6\x44\xe6\x94\x77\xd4\x88\x3d\x6a\xe8\x14\xbf\xf0\x45\x78\x18\xc1\xa7\xc5\x5d\xe8\xc7\x7c\x52\x2a\x96\x12\xe7\xfd\xd8\xb5\x31\xd8\xe2\x36\x06\xdd\x2a\xc5\x95\x4e\x1c\x79\xcc\x7d\x65\x4c\xa5\x07\x7b\x2e\x02\x75\x20\xa4\x20\x11\xcd\x84\xe6\x90\x75\x10\x25\xc6\x81\xb2\x0c\xf9\xdf\xa1\x0c\x06\x15\xe7\x1e\x79\x2b\x27\x5c\x78\xe9\x24\x5d\xb2\xcb\x98\xf2\xac\x1d\x39\x77\x9a\xee\x6f\x4c\xd3\xd5\x3a\x3b\x15\x74\x94\x35\xcf\x64\xac\x1f\xbc\x19\x85\x3c\x29\x06\x63\xbe\x48\xb9\xb6\xff\x25\xc3\xe1\x5b\x88\xcd\x96\xc2\x5b\x86\x10\x75\x74\xc7\x46\xa8\x2f\x46\xe1\xb2\x39\x79\x80\x32\xbb\xb3\x3e\x15\x67\x22\xb5\xaf\xcb\x74\x2d\x01\xd8\x3d\x05\xbb\x80\x84\xea\x35\xcc\x3e\x1c\x31\x72\x35\xe5\xc9\xf5\x45\x14\x82\x95\xca\x7e\x26\xa2\x8f\x6a\x8a\xc6\xe2\x77\x9b\x3a\x70\xdc\x6b\x5d\x74\xe5\xf6\xba\x8a\x4e\xdc\xa1\x23\x99\x1d\x9c\x50\xad\x65\xc2\xab\x98\x3f\x38\x85\xab\x23\x39\x85\x23\x79\x73\x64\x00\x2d\xf1\x51\xf4\x0f\xcf\x38\x4e\x69\xa5\x3a\xd6\x37\xb8\xf0\xd4\xda\xd8\xab\x23\x2b\x77\xd6\x5d\xf3\xaa\xd6\x4f\xd3\x5b\x7d\x0b\xe1\x67\x5f\x0f\xea\x18\xc5\xeb\xf3\xae\x81\xf3\x32\xab\x84\xbe\x9a\xae\xbf\xc7\x46\x88\xd5\xbc\x58\x7b\x95\x17\x6e\x21\xf7\x06\x3f\x73\x01\x69\x10\x2a\x85\x2c\xca\x0c\xb3\x56\xdb\xb7\x15\xf5\xd1\x3c\x7c\xce\x06\x02\xd4\xdb\xd6\x8c\xe8\xa1\xe5\x7c\xcf\xa3\x2f\x51\x64\x10\xbc\xfc\xe6\xeb\xaf\x9f\x7a\xa7\xa2\x76\x8e\xb3\x4d\xb7\x2a\x6a\x15\xea\xda\xa1\x14\xec\x50\x0a\xee\xba\x36\x1e\x89\xfd\xfc\x38\x04\x9d\x14\x89\x75\x51\x20\xd6\x16\x69\xa0\x65\x71\x59\x37\x85\x65\xad\xb1\x04\x1e\x15\x41\xa0\xa3\x1a\xab\xf6\x68\x01\x3b\x8c\x80\xdf\x06\x46\x40\x77\xb5\x55\x5d\xe1\x01\xb4\xaf\xa9\x7a\xfe\xb5\xff\xad\xc5\x44\xdb\x0a\xf3\x87\xd7\x95\x77\xd5\xbf\xa2\x2b\x3f\x7b\x67\x8e\x81\x9a\x57\xd7\xd9\xbb\x9e\x33\x30\xf3\xba\x42\x7c\x37\xd2\x0a\x8d\x0d\x5a\xbb\xa4\xb5\xb3\x00\xa7\x22\x1b\x9d\xc1\x75\xae\xc1\x91\xde\x0f\x17\x42\xec\xe1\xe3\xed\x8f\xac\xef\x42\xcc\xbb\x36\xea\xbb\xf8\x63\xb8\x6e\x89\x3f\xea\x1a\xc6\xab\xf7\x08\x82\x24\x04\x15\x4c\x8e\xe2\x3e\x2a\xd5\xfe\x3f\xba\x38\x23\x89\x62\x00\x69\x40\x33\x3d\x20\x2b\x34\x34\x1f\xa9\x71\x1a\x9d\xd7\xcc\xa8\x31\x2c\x2f\x4c\x5b\x86\xdb\x85\x1f\x7f\x63\xe1\xc7\x8e\x63\x06\x3f\x86\xe1\xbc\xb7\x68\x5a\xe6\x54\xf4\xad\xb4\x80\x40\x64\x2d\x9f\x63\xe1\xe0\x1b\x10\x5f\x03\x87\xd4\xa4\x8a\x21\xb8\x79\x29\xf8\x2f\x25\xab\xfc\x0b\x41\xbd\xd8\x82\x50\x0b\xcc\xa3\x63\xda\xa1\xea\xb4\x20\x45\x12\xb9\x54\xca\xe4\x08\x12\xe8\xe8\x05\x46\xa4\x7f\xd5\x7c\x65\x66\xca\x50\x4d\xbb\x00\x70\x80\xea\xae\xba\x7d\x87\x06\x1e\xcd\x32\x79\x83\xcf\x8e\x15\x0f\xbb\x7e\x76\x2e\x0e\x8f\x63\xc4\x48\xce\x95\x92\xca\x85\x78\xe2\xe9\x60\x5a\x8e\xb5\x13\x99\x42\x83\x4b\xb9\xac\x8a\x21\x33\x31\xab\x18\x49\xa8\xc0\xc2\x45\xfb\x6f\x9f\x94\x8c\xfd\xcf\x9c\xbc\x1b\xb1\x29\x9d\x71\x59\x2a\xfc\xb5\x91\x64\xcf\x7d\x05\x47\xee\x5c\x96\xc1\xcd\x5d\x42\x9d\x52\x78\x3b\xbd\x82\x4e\xe7\xd5\x97\x60\xa0\xa6\xd2\xfb\x0f\xfb\xec\x13\xd7\x66\xf9\x5d\x3c\x89\x7c\x83\x84\x4d\x70\xde\x4c\x17\xf6\x80\xfd\xb1\x71\xcd\x69\x9d\xdf\xe2\xd1\xea\x2a\xe9\x6c\x08\x5f\xdd\xa7\x90\x3a\xa4\x16\x2c\x15\xf7\x45\x61\x4f\x2f\xdd\x13\xdf\xb2\x61\x67\xa6\x9d\x46\xfc\x54\x34\xe2\x90\x20\x91\xf1\x64\x7e\x76\xd2\x8d\xce\x17\x12\x23\xec\xa0\xe4\x3b\xaa\x59\x4a\xde\x51\x41\x27\xe8\x1c\x39\x18\x5e\x7c\xf7\xee\xd0\x32\x09\x38\x5f\xce\x4e\x56\x66\x4f\x0c\xe3\x99\x9d\x6f\xaa\x7c\x9b\x2c\xd2\xa8\x33\xad\xe0\x81\x54\xda\x58\x01\x3b\x09\x27\x7b\x9b\x96\x5d\xcb\xe0\x46\x98\x0e\xe1\x91\xca\xf4\xa2\x78\x9d\xe5\xe9\xf5\x63\xbe\x6e\xe4\xab\xbe\xeb\x9d\xd6\x0b\x34\xad\x11\x4c\x5a\x58\x7b\x45\x0d\x9b\xcc\x4f\x58\x91\xc9\xb9\x5d\xee\x8b\xc8\x75\x8e\xb7\x8e\xf0\xa8\x57\x23\x9a\x10\x55\x66\x0c\xbb\xd7\x2c\x42\x84\x09\xc6\xd2\x4a\x4e\x71\xa1\x0d\x05\x80\x30\x1c\xff\xce\x19\xad\x7d\xc0\xac\x7b\x94\xf4\x71\x9e\xf7\xde\x55\x87\x53\xb4\x1b\xea\xce\x9f\xac\x7f\x98\xc0\xe3\xef\xe7\xd0\x87\x04\x0f\xd7\x0e\x13\xd6\x19\x1c\xf6\xf4\x65\x99\xd9\xa3\x23\x4b\x17\x9a\x88\x82\x6e\xe5\xd6\x18\x91\x19\x40\x02\xd8\xd9\xf7\xc8\xa8\xb4\x8a\x17\xd3\x35\xff\xf2\x32\x2c\xe5\xcd\x14\xe3\xc6\xf6\x47\x84\x16\x45\xc6\x31\xaf\x57\x2a\x17\xfc\x8d\xbc\x8d\xcb\xb7\xad\x23\x48\x1e\xa8\x7f\x3c\x4c\xdf\xe8\x93\x19\x53\xa3\x75\x30\x15\x1e\xaa\x4a\xd0\x82\x43\xec\x64\x6d\xcd\xa3\x0e\x0a\x79\x71\x86\xbf\xf6\x96\x5a\x6c\x9a\xf9\x2f\x71\x05\xdd\xda\x78\x40\x41\xd7\x95\x06\xad\x8d\x80\x0a\x74\x74\x71\x86\x30\x54\x0e\x18\xa8\x72\x59\x58\xdd\x9e\x62\x72\x60\x85\x46\x48\x27\x76\x44\x43\xa4\x08\x0f\x65\xa2\xcc\x19\x82\x09\x55\xed\xac\xac\xc1\x27\xe6\xd5\xe8\x95\xc7\xc3\xda\x27\xeb\xab\x13\x0f\x0f\xa3\x3f\x30\x6c\xfe\xe0\x93\x47\x48\x71\xe9\x5e\xf3\xc3\xe5\xdb\x66\x8b\x78\x5e\x1f\xc3\x81\xc7\x30\xc0\xc9\x2b\xa8\x32\x9c\x66\xa4\x54\x99\x0f\xc3\x61\xd2\xbb\x4b\x4b\x9b\xd2\x59\x04\xb0\x33\x20\xe4\x0b\x5c\x39\x47\x58\xdc\x9f\xd8\xde\x15\x57\x7e\x5c\x66\x59\x8f\x8c\xb9\xa0\x56\xec\xb2\x82\xc4\xe1\xa0\x21\x17\x89\x35\xbf\xac\xad\xef\xfa\xb5\xc0\x8c\xbc\x51\x16\x36\x29\x44\x19\x21\x5a\xca\xb2\x14\x40\x17\xe1\x11\x76\xc3\x26\xe0\x22\xb0\x56\xe3\x71\x56\x6a\xc3\xd4\xa5\xb4\x87\x41\x94\xd7\x02\x70\x14\x34\xfe\xfa\x3b\x2e\x52\x48\x61\xba\x84\x83\x23\xa1\x82\x30\x0e\xce\x17\x3b\x24\xc4\xa9\x2d\xef\x54\x0c\x75\xa0\xcb\x64\x6a\x5f\x69\xaf\x90\xa9\xde\xb3\x62\x64\x0f\x5d\x74\x7a\xef\xd0\xfe\xb5\xf8\x0e\x98\xa6\x12\xfd\xee\x05\x2d\xf8\xde\x61\x8f\x00\x81\x20\x70\x26\xcd\xf4\xe9\xf2\xa1\x7f\x57\xb0\x89\x1b\x71\xe1\x65\x3c\x02\xf0\xa0\xa8\xba\x7f\xdd\x4c\xb9\x61\xa1\xf9\x36\x7a\x76\x02\xbe\xca\xa2\xb0\x26\xe4\x48\x10\x96\x17\x06\xbc\xc5\x24\x67\xd4\x87\x90\xd9\x8c\xa9\xb9\xb5\xc9\x01\x88\xe2\xc9\x6f\xfe\xc0\x8f\xad\x08\xbe\xd0\xd9\xbc\x62\x72\xd8\x61\xcb\xc4\xf5\xbf\x3b\xca\xb2\x9a\xc1\x0f\x7f\x7a\xb1\xfe\x64\x69\x0a\xe7\x6c\x23\x7a\xfe\x68\x7f\x59\xa7\x25\x7e\x84\x62\x33\x08\x92\xb7\x6f\x5d\x44\x03\x69\xf5\x03\x17\x29\xea\xaa\x47\xc6\x28\x3e\x2a\x0d\xbb\x64\x76\xc2\x09\xe6\x3e\xf8\x76\x7c\x2e\x4d\xda\x2d\xc9\x80\xc0\xe0\x2b\xd6\xe0\xda\x8e\xf7\x14\xe9\xbf\xac\xe6\xae\xab\x9a\xde\x31\xbc\xd7\xec\x6f\x1b\xea\xce\x01\x9c\x79\xf0\x4e\xa6\xab\xb7\xd8\x42\x9d\x48\x75\xb3\x53\x5c\xa2\x3e\x97\x7e\x2c\xa7\xd2\xce\x8b\x95\x7a\xff\xdd\xcb\x71\x07\xe9\x6f\x9b\x49\xe5\x29\x00\x79\x1a\x7d\x73\x35\x2f\x98\xc3\xdd\x26\xe3\x8c\x4e\x2a\x36\x02\xe9\x88\xca\xd4\xf1\xf0\x47\xff\x0a\x9a\xf0\xd5\x6a\xed\xbd\x7a\xef\x7d\x9a\x6e\xbf\xa2\xd2\xad\x77\xd8\x87\xac\xfc\xf2\x7e\x75\x37\x0c\x7e\x3b\x37\xad\x13\x04\x34\x77\x3a\xd8\x6e\xa3\xff\x95\xc3\xfb\xa2\x11\x27\x78\x38\x31\x6f\x7c\x42\x5e\x12\xe8\x2b\xc3\x1f\x6b\x6c\x72\xcf\x7c\x6f\x61\xda\x6b\x36\xbf\x91\x6a\x35\x36\x78\x63\xfe\xba\xf3\x89\xd8\xab\xff\xde\x0d\xf2\x8e\x16\xf6\xb5\xab\xac\x4f\x94\x7a\x2e\x06\x89\x36\x02\xe6\x6b\xf9\x1c\x39\xa9\x26\x54\xf0\x7f\x61\xaa\x6c\x62\xf7\xb1\x54\xf6\xcf\x03\x8c\x63\xa0\x7d\x9f\xb1\xc4\x1c\x3a\xfe\x5b\x29\xf7\xee\x61\x50\x9a\xa6\x1c\xb5\x8c\x8b\x7b\x78\xe9\x6e\x22\x70\x71\xfd\x18\x34\xbf\x63\x63\xdd\xcf\xfb\x77\x07\x42\xd7\x90\xcd\xa5\xba\x23\xd7\xe9\xce\xdf\xe7\x94\xbb\xfe\xae\x5b\x47\x15\x96\x53\xde\xf4\xb5\xf0\x6a\x41\xd7\x9c\x9a\x52\x71\xb3\xf2\x40\xba\xfb\x87\x5c\xfc\x50\x8e\x98\x8b\xfd\x3e\xf8\xe7\x02\x52\xf9\x8e\x2e\xce\xba\x5d\x8e\x65\xb0\x69\x37\x41\xab\xd6\x90\x52\xd0\x7c\xc4\x27\xa5\x2c\x75\x36\x8f\x9d\x97\x14\xd4\x14\x6b\xfc\xa3\xf7\x46\xec\x1b\x42\x85\x14\xf3\xdc\xdd\x2a\x92\xac\x4c\x59\x6d\x44\x88\xf0\xcd\x24\x4f\x09\x2d\x8d\xcc\xa9\xe1\x09\x49\x24\x7e\x57\x1f\xa9\xd4\x8c\xd0\x5b\x7e\x9b\x94\xda\xc8\x9c\xe4\x54\xe9\x29\xcd\xb2\xdb\xd6\xb8\x83\x53\xed\x2e\x38\xed\x3e\xbc\xff\xad\x5f\xce\x70\xd6\x0d\xf9\xfb\x1e\xf4\xf0\x35\xf8\xdb\x4e\xae\xd5\x00\xb3\xdb\xb9\x74\x8d\x31\x5c\x81\xfc\x4a\xf0\x9e\x7b\x16\xe6\x3e\xea\xdc\xb5\x73\xef\x7d\xaf\x3b\xa4\xe1\x9d\xbf\x55\xac\xc8\xe8\x2d\x66\xda\x1d\xd5\x92\x56\x1f\x00\x85\x5f\x0a\x16\xc6\x18\x90\x21\x7a\x5e\x72\x6a\x12\x8c\xfc\xfc\x23\x67\x86\xa6\xd4\xd0\x81\x55\x9a\xff\x51\xaf\xe7\x91\x59\x6a\x07\xba\xfd\x60\xbc\x65\xce\x78\xb0\xae\xee\x61\x5d\x9b\xf3\x5b\x7b\xfa\x87\xdb\x41\x91\x81\xc4\xe1\xd8\x01\xd7\xe0\x58\xbe\x6f\x21\xe1\xf5\x4f\x3f\x59\x9d\xf5\xce\xa0\x44\x6d\xae\x8b\x3f\xaa\x5b\x6b\x59\xfd\x4d\xdc\x0e\xcf\x19\xc0\xc9\x5d\xb9\x36\x28\xfe\x13\xf0\x49\x1d\x9d\x9f\xdc\xee\x3f\xb8\xdf\xb6\xba\xc7\x96\xaa\x7b\x5a\xef\x98\x9e\xf7\xd8\xb9\x6f\xea\xee\x56\x9f\xd3\x0f\x65\x4f\x98\x21\x4f\x3d\xe6\x84\xbf\x19\x17\xac\x5e\xb0\x85\xbf\xbb\xdd\x90\x5c\xcb\xdf\xbd\x8e\x97\xfb\xbe\xfa\x98\x7e\x98\xec\xad\x37\xad\xe7\xf4\xbe\xb7\x86\xa5\x46\x70\x57\x24\x06\x35\x69\x40\x79\xc8\x74\xf7\x3e\xa7\x40\xec\x75\x83\x04\x6b\x1a\xc2\xfe\x55\x1f\x30\xd1\xb0\x94\xb5\xec\x8b\x6b\x36\xdf\xd7\x2e\x85\x5f\x0a\x3d\xe5\x05\x16\x59\x39\xbf\xae\x5b\x5d\xf2\x23\xcd\x78\x1a\x86\x40\xae\x3e\x13\x3d\x72\x2e\x8d\xfd\xcf\xe9\x27\xae\x0d\xea\xe9\x27\x92\xe9\x73\x69\xe0\x93\x4e\x5e\x15\xa7\xf0\x80\x17\x75\x96\x02\xba\x06\x61\x5f\x45\xf6\x84\x7f\xa1\x33\x27\xf6\x3c\x51\xb8\x26\x67\x82\x48\xe5\xdf\x28\x14\x1f\x6a\x37\x84\xcf\xaf\x17\x52\xf4\xc1\x69\xb8\x72\x0c\x47\x08\xa9\x6a\x74\xb8\x63\x38\x37\x14\x66\x41\xc1\x37\x5c\x7b\x21\x0e\x6d\x94\xa0\x41\x82\xf7\x4f\xf0\x84\xe4\x4c\x4d\xc0\x0d\x9e\xdc\xe3\x06\x5e\xd7\x67\xb3\x96\xa7\xe6\xde\xb5\x02\x91\xf9\xf6\x56\x0b\x6f\x69\x91\xa2\xfb\x51\x2c\xe5\x68\xf6\xfd\xb7\x95\x3e\x40\xa9\xff\x81\x0a\x54\x3d\x20\x47\xbe\xc7\x44\xfc\x9d\x0b\x07\xc4\xc3\xd8\x11\xb8\x26\x56\x94\xcc\x68\xc6\x10\x70\x9b\x8a\x50\x3c\x22\xc7\x4b\x82\xbd\xe7\x2a\x51\xed\x9e\x0d\x31\x82\xbd\x6b\x36\xdf\xeb\x2d\x2d\xed\xde\x99\xd8\xab\x2a\x87\x6a\x8b\x19\x84\x28\x84\x17\xf6\xe0\xbb\xbd\xe6\x67\xc1\x9d\xc2\x72\x7d\x3b\xf4\xde\x75\xbb\x43\xfb\xaa\xad\xd5\x7b\x47\x05\xaf\x24\xc3\x7a\xdd\x28\x5a\x14\x4c\x11\xaa\x64\x09\x06\x76\x3e\x63\x6a\xe0\x6f\xc1\x60\x69\xf0\x09\x25\x52\x29\x96\x18\xaf\x4e\xbb\x7c\x3e\x2c\x35\x13\x29\xd4\x91\x3d\x58\xf3\xb8\x61\xa3\xa9\x94\xd7\x50\xef\x02\x14\x79\x44\x8b\xe5\x27\x7c\xd6\x49\xf5\x99\x57\x3e\x35\x49\x99\xa1\x3c\x83\x28\xf1\xfb\xb7\xef\x5c\x1c\xd9\x1f\x68\x7e\x96\xab\x43\xb2\x1d\x58\x0f\x34\x75\xf9\x0d\x97\x6c\xc6\xd9\x8d\xa3\xff\x6d\x11\xe0\x3e\x99\x30\x01\x61\xcf\x3b\xd2\x03\xfa\x44\xf3\x94\x9d\x42\x19\xdd\xed\x03\xb5\x70\xb5\xdd\x32\xe7\xfb\xb8\xf8\x6e\x51\x76\xaf\x18\x5b\xe3\xb8\xf1\x3e\x74\x75\x21\xd5\x1d\x90\x1d\xeb\x55\xf5\xad\x57\xb1\xe7\xf2\x4a\x5f\x93\xaf\xbf\xfe\xea\xd6\x9b\x72\xfa\x89\xe7\x65\xfe\x9a\x7c\xf3\xef\xff\xfe\xd5\xbf\xdf\x7e\x1b\x17\x78\xdb\xab\xdb\xdf\xcf\xed\xf9\xe3\xcb\x93\x2d\xa0\x77\x1a\xf2\x74\xee\x76\xe3\xaf\x31\xd4\x98\xf2\xac\x54\x2e\x99\xac\xd5\x48\xf1\x0e\x69\x35\x10\x1c\x36\xf7\x4d\x68\xc1\xf5\x19\x7e\x01\x1e\xe1\x7a\x56\xb6\x77\x08\xa3\x45\x87\xd9\x2d\x6d\xe6\x87\x72\x67\x78\x87\x01\xb7\x62\x8a\x4b\xf6\x05\x9a\x46\xf0\xd9\x2f\x25\x53\x73\xc8\xa8\xae\x14\xc8\x28\x83\xe3\xaa\x2a\xb8\xf5\x6f\xe1\x4e\x6e\x84\x38\x58\xb0\xb9\xaa\xc3\xb2\x8a\xd3\x2e\x3c\x1b\x7e\xc3\x30\x9e\xe5\x3d\xbb\xe4\x88\x88\x32\xcb\x6e\xbb\x55\xc8\xbb\x7c\xc0\x31\xed\xee\x31\x59\xd6\xb3\x25\xd6\x35\x3f\x57\x50\xfa\xb3\x1a\xa1\xf1\x8b\x77\xa4\x32\x6e\xb7\x59\x1a\xbf\xf0\x5a\xc9\x58\xeb\x27\x62\xad\x07\xe4\xb0\x86\xb9\x8a\xd7\x43\x32\xb5\xd6\x84\x5f\x78\x4c\x03\x16\xaf\x07\xc5\xd3\xd7\x33\x66\x57\x4c\x7d\xeb\x4c\xda\x06\x2f\xbf\x8e\x79\xbb\xe2\xd5\x77\x46\xee\x12\xc1\xd7\x4d\x4f\x78\x40\x6a\xc2\x9a\x2b\xb9\x86\xf1\x8b\xd7\xce\x04\x7e\xd0\x49\xb4\x86\x60\x7e\x98\x39\xbc\xf6\xaa\x2a\xc6\xc5\x4c\x22\x7c\xe9\x83\x54\xb8\xcb\xa5\x1f\x2e\x68\x72\x37\x20\x59\x9d\x2a\xe7\x52\x94\xa1\x99\x86\x37\x8a\x88\xb5\x17\x49\xa9\xef\x77\xaa\xde\xfd\x06\x77\x27\x6d\x77\xa2\xe2\xd7\xdf\xbc\xcc\xd8\x4f\xdc\x4c\xdf\x7b\x98\x62\xc7\xd5\xa6\x2c\x32\x78\xd9\xe8\x0b\xcb\x42\x97\x95\x66\x78\x86\xad\x6d\x58\x22\xf3\x1c\x9b\xc5\x03\x72\xc8\x35\x23\x55\x87\x34\xab\xe3\x81\x16\x0c\xc3\xb1\x4f\x05\x15\x95\x9e\x08\x2d\xc6\xef\xe2\xa8\x35\xf9\x69\xdd\xb3\x76\xed\x6c\xe8\xbb\xb3\xa0\xa3\x34\xe6\x5a\xb6\x33\x19\xb1\x4c\x82\x8f\x64\x40\xf6\xbf\xd8\x77\x49\x88\xee\x56\x10\xc9\xee\x53\x77\xea\x39\x48\x34\x26\x26\x15\x00\x8b\xce\xa0\x7b\xa1\x93\xc0\x52\xb0\x01\xb9\x74\x2a\xcc\x7a\x5a\xd1\x3a\xe2\x74\x4d\x51\xba\xf6\x81\x58\x15\x2d\x3f\x98\xb2\xfe\x77\x31\x6d\x67\xfe\xb3\x75\xa8\xeb\x6f\x7e\xce\xf4\x0d\x10\xe2\x0f\x23\x6f\x7d\x4b\x57\xa7\x42\xa0\xed\x82\xf0\x4a\xb0\x37\x26\x78\xc2\xfa\xe4\xf8\xf2\xf4\xe8\xea\xb4\x47\x3e\x5c\x9c\xc0\x7f\x4f\x4e\xdf\x9e\xda\xff\x1e\xbf\x3f\x3f\x3f\x3d\xbe\xb2\x7a\xc4\x17\x08\x90\x6c\xcd\x38\x4b\x5d\x7b\x1e\xc9\xba\xb4\xa0\x62\x4e\xc6\xa5\xb1\xe2\xa0\x7a\x58\x6d\x16\x56\x46\xc0\xb7\xa9\x35\x19\x9f\xef\x1a\xae\x9d\xcd\x5b\x5b\xc2\xbd\x86\x69\xbc\x1f\x05\x79\x23\x15\x71\xfd\x69\x5e\x93\xfd\x42\xa6\x7a\xdf\x25\x4b\xdb\x7f\x0f\xf0\xa3\x17\x99\x9c\xec\x87\x1c\x6a\x46\x32\x39\x21\xba\x1c\x85\xdc\x76\x38\xec\xe0\xee\x2f\xfc\x6d\xb5\x4c\xe0\x5e\x48\x70\x8f\x7e\x15\x06\xaf\xfd\x26\xbe\x21\x1e\xf7\x05\x34\xa7\xa9\xdd\x69\x3f\x58\x1c\xf0\x8b\x17\xab\x67\xe0\xf5\x1a\xae\x16\x7e\xf1\x51\x58\x6e\xba\xe1\x59\x9a\x50\x95\x2e\xb1\x14\x9c\x3d\x98\xaf\x09\xd4\x43\xbc\x47\xec\xed\x59\x0d\xee\x8a\xbe\xe5\x8c\xa9\x8c\x16\x98\x51\x09\x80\x9b\x00\xde\x00\x0f\x39\x61\x05\x83\xfa\x02\xdf\x6d\x96\x89\x24\x93\x50\x5f\x8e\x07\x57\xaf\xfe\xea\x88\x8a\xe6\xc1\xb4\x5c\x92\x7a\xc5\xc0\x7b\x5b\xcb\xc1\x90\x96\xf7\x20\xee\xc5\x44\xbe\x5b\x41\x0a\x42\xb2\x33\xda\x74\x41\x31\x65\x64\xcf\x55\x6f\xec\xf5\xc8\x5e\xa8\xc3\x4f\x9d\x12\xbb\xf7\xc5\x5e\x75\x43\x9c\xff\x0f\x3a\x6c\x82\x5f\xf4\xe1\x39\x71\x95\x10\x2c\xb0\x4f\xab\x08\x8f\xae\xb0\x14\xec\xc9\xe3\x7c\x4c\x30\x87\xfa\x40\x83\xda\x44\x96\x9e\x5a\x95\xae\xdc\xfb\x44\x3b\xfd\xe8\xe7\x06\xca\x3c\xb1\x04\xc6\x11\x47\x45\x09\xe2\x03\x32\xac\x31\x4f\x48\x0b\x89\xc1\x1e\xb8\x22\x05\x55\xd6\x52\xf0\x77\xd6\xfb\xdc\x7c\x71\x6f\x97\x9b\x35\x98\x20\x8a\x2e\xb4\xf2\xaf\x1a\xaa\x26\xcc\xdc\xed\xaa\xa7\x62\xfe\xfe\x4e\xc4\x9d\xfe\xda\x18\x7d\xfd\xf5\x18\xfc\x53\xbf\xc2\x77\xe9\x73\x61\xfa\x52\xf5\xf1\x27\xaf\x89\x51\xe5\x6d\x41\x17\xc3\x73\x26\x4b\x33\x64\x89\x14\xab\x93\x72\xdd\x7d\x9d\xc5\x1e\x1e\x90\xa9\xec\xc2\x5f\x47\xfe\xe0\xf5\xe9\xca\xb1\x57\xba\x3a\x95\x7d\xc8\xab\x5e\xef\xff\xfe\xed\xbb\x36\x8b\x4d\xa0\x62\xef\xee\x95\xfc\xd1\x49\x62\x31\x09\x33\x75\x33\xbf\xf3\x67\xef\x4a\xf3\xf0\x1f\x1d\x87\x50\xca\xdd\x77\x3b\x62\xdc\x5d\xe3\x7d\xeb\xfb\x6b\x43\x4d\xb9\xc4\x0d\xb5\xb5\x71\xf2\x6b\x88\x55\x11\x4e\x0b\x1e\xc2\xef\x62\xb7\xd8\x72\xa9\x2b\x42\x26\xc2\x7d\x90\x46\x56\xc8\x74\x40\xdc\x0f\x73\x3a\x27\x46\x51\x8e\x26\x17\x4d\x4c\x09\x65\x78\xd4\xb8\x94\x33\x87\xd4\xf0\xbf\x56\xbd\xc6\x4a\x23\xeb\x2e\xc3\x2a\x61\xca\xe8\xb7\x54\x9b\x0f\x45\x4a\x6f\x49\xc0\x5f\x48\x25\xd3\x06\x36\x0c\xaa\xa2\x37\x82\xa5\x56\xe8\x3a\x12\xe0\x78\xe4\xc6\x4a\xc3\x12\x47\x7c\x68\x68\xb9\xda\x40\xf6\xe7\x7d\xfb\xa8\xd5\xb3\xbe\x94\x96\x26\x47\x2b\x05\x50\x3d\x63\xef\xbe\xd9\x5a\x09\xaf\x60\x34\x22\xd8\xa7\x55\x36\x6a\xfb\x19\x4b\x91\xde\x1e\x28\xaf\x53\xd8\x69\x87\xd5\x4f\x7a\x84\x92\x29\xd7\x46\x2a\xe7\x68\x84\x1e\x03\x8a\x42\x23\xa3\xd5\x01\xe7\x6e\x42\xef\xc7\x61\x0a\x56\x2f\x65\x34\x60\x92\x3b\xde\x05\x50\x71\xc5\x12\xa9\xd2\x95\x13\xf3\xca\xd4\xca\x7d\xd2\x2c\x2a\x7f\xbf\x97\x20\xa3\xda\x5c\x85\x39\xd8\xc5\x5f\x53\xd2\xd6\x59\xdb\xbd\x62\xf5\x36\xbe\x2a\x55\x8a\xea\x4b\x49\xa8\x40\x25\xb2\x9d\x7c\xbd\x9f\x81\xaa\x77\xc3\x9d\xda\xe8\xbd\x6e\xc2\xae\x8c\x5e\xf1\xf3\xcc\x3c\x67\x5a\xdf\xd9\xcb\x7d\x21\x64\x05\x70\x62\x24\xc0\x89\xb9\x9f\x13\x8e\x9d\x7e\xac\x5e\xee\x73\x3f\x3c\x78\xc0\xfc\x76\x56\xb3\xe7\xa5\xaf\xcc\x0b\xdb\xaa\xd5\x92\x15\x53\xaa\xd7\x7d\x99\xb0\x8b\xbc\xe9\xbb\xfe\x76\x58\x73\x36\x8a\x51\x7d\x57\x26\xf7\x02\x6d\x47\x8a\xb3\x31\x39\xa6\x39\xcb\x8e\xa9\xee\x92\xb8\x20\x01\x06\x84\x0d\x26\x03\xb2\x7f\x19\xf9\x9e\xcf\xa5\x79\x77\x17\xae\xeb\x3d\xc5\x4b\xeb\xec\xe8\x47\xdd\xcb\xad\x0f\x80\xfb\x77\x6e\xcb\x3d\xdb\x7a\x86\x77\xec\xd0\xad\xd8\x9b\x77\x97\x23\xdc\xb6\x1f\xeb\x3b\xb1\x54\x60\x60\x25\x4d\x77\xe4\x3d\x25\x04\xb7\xed\xc2\x6d\xde\x7f\xf7\xbc\x52\x18\x62\xb8\x52\x1d\x5e\x7a\xbb\xab\x9a\x66\x0b\x5e\x96\x38\xdd\x00\x1b\x78\x72\x4d\x8e\x87\x3f\x76\xa9\xb6\x6c\xb6\x16\xc8\x2d\xe0\xad\xdf\x8b\x3b\x13\xfe\xee\x3a\x85\xdb\xd6\x19\xa5\xe0\xd7\xb2\x1c\xf0\x39\xc3\x51\x27\xfe\xa9\xce\xa4\x71\xe6\xaa\xe3\x8b\xb1\x6b\x86\xe0\xee\xa9\xf1\xc7\x01\xb4\x9b\x60\x33\x6c\xee\x02\xd9\xa5\x56\x29\xd7\x76\x53\x1c\xb6\x8f\x31\xad\x97\x48\x72\x37\x2f\xf8\x7b\xee\xe0\x08\x7f\xcb\x3d\x0a\x16\xb9\x77\x81\xf1\x5a\x37\x32\x76\x4f\x51\x19\x5e\x6b\x7b\x0a\xef\x2e\x30\x7b\xe0\x60\xf7\xaa\x7f\x0f\x1c\x6f\xb5\x71\xbe\x78\x2d\x00\x94\xd9\x9f\x5c\x82\x90\x46\x3f\x7c\x62\x25\x70\x02\x20\x75\x28\xbb\x43\x7f\xe1\xd8\x36\xbf\x5c\x94\x81\x90\x7c\x51\xe7\xf0\xae\x5e\xab\x2c\x79\x77\x34\xbf\xb7\xc0\x6f\xed\xf1\xb6\xa0\x5a\xf1\x5e\x06\x7a\xdc\x92\x60\xbc\xee\xe3\xba\xcd\xf3\xdb\x3a\xf5\xe2\x77\xf2\xd8\x23\x15\x8e\x6a\xa6\x66\x2c\xad\x79\x61\x1d\x04\x65\xfd\xb3\xc8\x4d\x5e\x8d\xef\xc8\x4e\xfe\xfb\x7f\xfe\xd7\xff\x17\x00\x00\xff\xff\x0e\xdb\x1b\x21\x55\x02\x07\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -119,12 +119,12 @@ func operatorsCoreosCom_clusterserviceversionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_clusterserviceversions.yaml", size: 710613, mode: os.FileMode(436), modTime: time.Unix(1607975192, 0)} + info := bindataFileInfo{name: "operators.coreos.com_clusterserviceversions.yaml", size: 459349, mode: os.FileMode(436), modTime: time.Unix(1607977323, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x4b\x73\xdc\x36\xf2\xbf\xeb\x53\x74\x29\x07\x25\x55\x9a\x99\xd8\xff\xff\x61\x6b\x6e\x5a\x79\xb3\xa5\x5d\xc7\x56\x69\x64\x5d\xbc\x3e\x60\xc8\x9e\x21\x22\x10\x40\xf0\x18\x79\x36\x95\xef\xbe\xd5\x00\xc9\x21\x39\x7c\xe9\x95\x38\xb8\xd8\x43\x02\x8d\x7e\x77\xff\x00\x8a\x69\x7e\x87\xc6\x72\x25\x97\xc0\x34\xc7\xaf\x0e\x25\xfd\xb2\xf3\xfb\xbf\xd9\x39\x57\x8b\xdd\x9b\x93\x7b\x2e\xd3\x25\x5c\x7a\xeb\x54\x7e\x83\x56\x79\x93\xe0\x3b\xdc\x70\xc9\x1d\x57\xf2\x24\x47\xc7\x52\xe6\xd8\xf2\x04\x80\x49\xa9\x1c\xa3\xc7\x96\x7e\x02\x24\x4a\x3a\xa3\x84\x40\x33\xdb\xa2\x9c\xdf\xfb\x35\xae\x3d\x17\x29\x9a\x40\xbc\xdc\x7a\xf7\xe3\xfc\xff\xe7\x6f\x4e\x00\x12\x83\x61\xf9\x2d\xcf\xd1\x3a\x96\xeb\x25\x48\x2f\xc4\x09\x80\x64\x39\x2e\x81\x4b\xeb\x98\x10\x5a\x30\x69\xe7\x4a\xa3\x61\x4e\x19\x3b\x4f\x94\x41\x45\xff\xe4\x27\x56\x63\x42\x7b\x6f\x8d\xf2\x7a\x09\x9d\x73\x22\xb5\x92\x45\xe6\x70\xab\x0c\x2f\x7f\xcf\x40\x89\x3c\xfc\x2f\x0a\x7e\x15\xb7\xbc\x16\x4c\x86\xa7\x82\x5b\xf7\xef\xf6\x9b\xf7\xdc\xba\xf0\x56\x0b\x6f\x98\x68\x32\x1a\x5e\xd8\x4c\x19\xf7\xe1\xb0\xed\x0c\xb8\x8e\x2f\xb8\xdc\x7a\xc1\x4c\x63\xcd\x09\x80\x4d\x94\xc6\x25\x84\x25\x9a\x25\x98\x9e\x00\x14\x0a\x0b\x24\x66\xc0\xd2\x34\x98\x80\x89\x6b\xc3\xa5\x43\x73\xa9\x84\xcf\x65\xb5\x41\x8a\x36\x31\x5c\xbb\xa0\xe2\xdb\x0c\x61\xc3\x8d\x75\x70\xb9\xba\x03\x2e\xc1\x65\x18\x64\x01\xb5\x81\x44\x78\xeb\xd0\xac\xd0\xec\x78\x82\x85\x47\x84\x9d\x03\x29\x80\x5f\xac\x92\xd7\xcc\x65\x4b\x98\x93\x82\xe7\xfd\x0b\x3e\xff\xf8\xa5\x58\x13\x2d\x76\xb9\xba\x2b\x7e\xbb\x3d\xc9\x63\x9d\xe1\x72\xdb\xc7\x21\xd3\xda\xa8\x1d\x13\x90\xab\x14\x7b\xf6\x2e\xe7\x34\xb6\xb9\x68\x3e\xec\xd8\xab\x9b\x4c\x50\x6b\x9b\x4c\xf5\x30\x92\x59\x2b\x25\xb0\xb0\x7e\x9c\xb6\x7b\xc3\x84\xce\xd8\x9b\x68\xc0\x24\xc3\x9c\x2d\x8b\x25\x4a\xa3\xbc\xb8\xbe\xba\xfb\xbf\x55\xe3\x31\x34\x65\xad\xb9\x0e\xa4\x14\x4b\x68\x83\x41\x0a\x17\x08\x31\x40\x86\x61\x60\x31\x58\xe8\xe0\xc7\x15\xc1\xc8\x9c\x5a\xff\x82\x89\xab\x1e\x1a\xfc\xd5\x73\x83\xe9\x61\xdf\x19\x94\x11\x5a\x7b\x44\x1a\xa8\x7e\x6a\x43\xd4\x5d\x15\x01\x71\xd4\x52\x43\xed\x69\x4b\x8e\x33\x12\x35\xce\x6a\xc8\x51\x38\x2a\xa6\x85\x76\x48\x04\x97\x71\x0b\x06\xb5\x41\x8b\x32\x66\x89\x06\x61\x08\x02\xcb\x42\xa2\x39\x90\x73\xa1\xb1\x14\x39\x5e\xa4\x94\x4a\x76\x68\x1c\x18\x4c\xd4\x56\xf2\xff\x56\xb4\x2d\x38\x15\xbd\x99\x39\xb4\xae\x45\x33\x04\x86\x64\x02\x76\x4c\x78\x3c\x07\x26\x53\xc8\xd9\x1e\x0c\xd2\x2e\xe0\x65\x8d\x5e\x98\x62\xe7\xf0\xb3\x32\x64\x8a\x8d\x5a\x42\xe6\x9c\xb6\xcb\xc5\x62\xcb\x5d\x99\x12\x13\x95\xe7\x5e\x72\xb7\x5f\x84\xec\xc6\xd7\x9e\xec\xb2\x48\x71\x87\x62\x61\xf9\x76\xc6\x4c\x92\x71\x87\x89\xf3\x06\x17\x4c\xf3\x59\x60\x5d\x86\xb4\x38\xcf\xd3\xef\x4c\x91\x44\xed\x59\x83\xd7\x23\x9f\x8d\x23\x64\xa1\x01\x0b\x50\x2e\x02\x6e\xc9\x55\xc2\xd2\x28\xc5\x41\xd1\xf4\x88\xb4\x73\xf3\x8f\xd5\x2d\x94\x5b\x07\x63\xb4\xb5\x1f\xf4\x7e\x58\x68\x0f\x26\x20\x85\x71\xb9\x41\x13\x8d\xb8\x31\x2a\x0f\x34\x51\xa6\x5a\x71\xe9\xc2\x8f\x44\x70\x94\x6d\xf5\x5b\xbf\xce\xb9\xb3\xc1\x2f\xd1\x3a\xb2\xd5\x1c\x2e\x43\x9d\x80\x35\x82\xd7\x29\x73\x98\xce\xe1\x4a\xc2\x25\xcb\x51\x5c\x32\x8b\xaf\x6e\x00\xd2\xb4\x9d\x91\x62\xa7\x99\xa0\x5e\xe2\xda\x93\x5b\xf1\x07\x50\x16\xa0\x1e\x7b\xd5\x22\x7f\xa5\x31\xa9\xa2\xa6\x8a\xf4\x0b\xad\x05\x4f\x62\x06\xa8\x3c\x05\x9c\x6a\x29\x76\x5d\x25\x8b\x2a\x5b\x0d\xb2\xd5\x95\x1a\x20\xe4\x82\x56\x3e\x6d\x3e\x6e\x11\x9f\x8d\x97\x8a\x38\xba\x73\x0a\x84\xbc\x12\xb7\x6b\x3f\x6f\xe9\xa9\x4c\xe8\xe4\xda\xe4\x5d\xde\xa2\x39\x94\x07\xad\x04\x4f\xf6\xb0\x51\x86\x32\x46\x4d\xa7\xf3\x23\xaa\x00\x57\x0e\x72\x6f\x83\xbf\x29\x89\xa4\xe3\xd3\x0b\xef\x54\xce\x1c\x4f\x4e\x41\x19\x38\xfd\x99\x49\xcf\xc4\xe9\xf1\xe2\x1e\x87\x38\xc8\xd1\x56\x27\x74\x56\x8d\xc3\xe8\x57\x5f\x1f\x1d\x66\x0c\xdb\x1f\xbd\xe3\x0e\xf3\x8e\x25\x83\x1c\x6f\x51\x52\x11\x39\xca\xe8\x87\x65\x94\x2c\xb7\x68\xda\x31\x1c\x7c\xb0\x6f\x4d\xe7\x56\x71\x49\xd5\xbb\x4c\x5e\x6b\x1d\x73\xde\x0e\x84\xcf\x69\x3d\x7e\xc2\xe4\x5a\xc2\x2a\x4a\xe8\x46\x99\x3c\xc6\x0f\x5b\x2b\x1f\x93\x53\x24\x7c\x5c\x6f\xac\x43\x6d\xab\xd0\xa0\x4a\x92\xa8\x5c\x0b\x74\xcd\x5a\x3c\x87\xff\x48\x28\xf6\xa3\x64\xe8\x0c\xe3\x82\x08\xb7\x9d\x22\x71\x9e\x89\xb0\x1b\x16\xf5\x7b\x6f\x1d\xe6\xf3\xd3\xe7\xc5\x68\xc2\x1c\x13\x6a\xbb\x8a\xd9\xa0\xf5\x52\x67\xcc\xe2\xd4\xe8\x73\x0e\xa5\xa7\x9c\x5b\xb8\xe0\x45\x92\x28\x2f\xdd\x0d\x6e\xc6\x02\xb2\x7f\x25\x18\xdc\xa0\x41\x99\x14\xd5\xdf\xc6\x09\xc0\xe2\x8c\x2e\x2f\xcd\x98\xa3\xc8\xf6\x36\x2a\x3d\x55\xb1\xdf\x4d\xab\x46\xa7\x54\x7f\x5f\x4c\x76\x28\x6f\x58\x72\x18\xe8\x69\xba\x05\xbe\xbe\x2a\xfb\x98\xd8\xbe\x60\x29\xa7\xeb\xca\x32\x83\xf1\x40\x63\xc3\x51\xa4\xa1\x03\x1d\xdf\xfb\xec\xaa\x50\x6a\xa8\xe8\x4e\x01\x03\xcd\x31\xc1\x46\x8b\x14\x54\x84\x2c\x05\xb5\xe9\xa4\x48\x78\x0c\xa8\xec\x19\x2c\x56\x9c\xc7\xfa\x5d\x34\x0a\x87\xc6\xca\x31\x2e\x81\x51\xe7\xc0\x53\xf8\xd7\xea\xe3\x87\xc5\x3f\xdb\xf5\xa6\x21\x05\x59\x16\xad\x8d\x7e\x9e\xa3\x74\xe7\x60\x7d\x92\x01\xb3\x24\x06\x39\x30\xc5\x0a\xce\x73\x26\xf9\x06\xad\x9b\x17\x7b\xa0\xb1\x9f\xdf\x7e\xe9\xd6\x1e\xc0\x4f\xca\x00\x7e\x65\x14\x7e\xe7\xc0\xa3\xc6\xab\xa6\xa4\x70\xb0\x50\x0e\x48\x1d\x15\x45\x78\xe0\x2e\xe3\xed\x3c\x5b\x69\x00\xb4\x4a\x0b\xb1\x1f\x82\xb8\x8e\xdd\x53\x1d\x88\xe2\x7a\xc2\x40\xf7\xb8\x84\xd3\x08\x6b\x2a\x36\x7f\xa3\x46\xff\xf7\xd3\x1e\xaa\xdf\x3f\x64\x68\x10\x4e\x69\xd2\x69\x64\xae\xea\x42\xe9\x59\xe9\x2f\x07\x26\x83\xc3\x3b\xc3\xb7\x5b\x34\xad\x9a\x7a\x18\xa1\xa5\xa2\x46\xe5\x07\xaa\x4a\x7c\x03\x52\xd5\x48\x04\xc2\x64\x3d\x8d\x09\xdf\x70\x4c\x8f\x98\xfe\xfc\xf6\x4b\x2f\xc7\x4d\x7d\x01\x97\x29\x7e\x85\xb7\x11\x08\x72\x4b\x5a\xfa\x61\x0e\xb7\xc1\x3b\xf6\xd2\xb1\xaf\xb4\x53\x92\x29\x8b\x7d\x9a\x55\x52\xec\x49\xe6\x8c\xed\x10\xac\xca\x11\x1e\x50\x88\x59\xec\x67\x52\x78\x60\x7b\xd2\x42\x69\x38\xf2\x37\x06\x9a\x19\x37\xe8\xad\x65\xef\x7f\xfb\xf1\xdd\xc7\x65\xe4\x8c\x1c\x6a\x2b\x89\x1d\xea\x19\x37\x9c\x7a\x79\x6a\xe2\x63\x27\x1a\xbc\xf1\xa8\x95\x2d\x87\xf5\xd1\x7d\x28\xad\x67\x4c\x6e\xb1\x04\xbe\x1b\x4f\xbd\xe1\xfc\xec\x29\x71\x7c\xdc\x90\x97\xa3\xa3\x31\x6f\x27\x8e\x3f\xad\xb5\x9d\x28\x5c\xc0\xb7\x13\x84\xfb\x50\xf3\xf2\x41\xe1\xee\xfd\x1a\x8d\x44\x87\x41\xbe\x54\x25\x96\x44\x4b\x50\x3b\xbb\x50\x3b\x2a\x14\xf8\xb0\x78\x50\xe6\x9e\xcb\xed\x8c\x5c\x73\x16\x7d\xc0\x2e\xc2\x19\xcd\xe2\xbb\xf0\xcf\x93\x65\xe9\x69\x3f\xba\x05\x0a\x93\xff\x08\xa9\x68\x1f\xbb\x78\x92\x50\x25\x24\x98\x5e\xc7\xce\x56\x31\x61\x24\xed\xb5\x14\x16\x0f\x19\x4f\xb2\x12\x9a\x17\x39\xb6\x27\x98\x38\xb5\x3e\x69\x4c\xcd\x4c\xee\x5f\xdd\x95\x49\xa1\xde\x10\x47\xfb\x59\x71\x8e\x38\x63\x32\xa5\xff\x5b\x6e\x1d\x3d\x7f\x92\x06\x3d\x9f\x14\xbe\x9f\xae\xde\xfd\x31\x0e\xee\xf9\x13\x62\x75\xed\x65\x2a\xf0\xbd\x52\xf7\x5e\x77\xb4\x3a\x0d\x51\xfe\x5e\x9f\x5b\xe2\xa9\x02\x6d\x72\x39\xd3\x46\x6d\x0d\x55\xf3\x1a\x46\x07\x1d\x4f\x5d\xdb\x83\x12\xaf\x97\x9a\x25\xf7\x6c\x8b\x05\x13\xa1\x44\xa1\x74\x65\x01\x2c\x20\x4e\x5f\xe3\xf6\x48\x3c\xd3\x2b\x49\x3c\xf3\x28\x78\x2e\x59\x6e\x31\x78\xdc\xa0\xc7\x51\x72\x1c\x3a\xf4\x42\x8a\x31\xee\x47\x1a\xcf\xbe\xde\x3d\x8e\x56\x07\x7f\x83\x5d\x35\x70\x06\x3c\x25\xff\xdf\xf0\x23\x08\x16\x5f\x6b\xe6\xb2\xce\x17\x06\xb5\x60\x6d\x60\x10\xc7\x70\x43\x0c\x47\x7c\x75\xcf\x6a\xd9\xe1\xb2\xb5\xa8\xb4\x45\xd9\xa4\x15\xba\x6c\x4c\xeb\xa1\x1b\xbb\x9e\xc2\x06\x24\x20\x3c\x30\x1b\x32\x95\xd8\x61\x1a\x8e\x9a\xfa\xfa\xc5\x11\x7b\x4c\x91\x1e\x26\x80\x82\x0e\xf9\x1f\x0d\x0d\xea\x0c\xf7\x26\xa6\x38\x46\x60\x42\x07\x37\x8f\x02\x0b\x03\x44\xcb\x03\xd8\x47\x43\x86\x41\x9a\x05\x9c\x78\x4d\xe0\x10\xc7\xd3\xe0\xc3\x20\xc9\x08\x2d\x5e\x09\x44\xc4\xf1\x34\x28\x31\x48\xb2\x82\x19\x8f\x05\x14\x83\x54\xbb\xc0\xc6\x34\x58\x31\x48\xb6\x13\x72\x4c\x00\x17\x63\x7e\xdc\x09\x3c\x06\x21\xc6\x20\xc5\x61\xf8\xd1\x0b\x34\x06\x69\x0e\x82\x90\x38\x26\x65\x8c\x7e\x40\x12\xc7\x5f\x01\x96\x3c\x42\xdc\x7e\x88\xd2\x25\xee\x37\x01\x54\x1e\x29\xdd\x00\x68\xe9\x13\xf1\x9b\x80\x2e\x8f\x10\x73\x12\x8c\xe9\x12\xf6\x85\xc0\x4c\x1c\x7f\x19\x48\xf3\x08\xcd\xf6\xc2\x9b\x2e\x6d\x7e\x03\x20\x67\xa2\x68\x89\x92\xf1\x6b\x87\xde\x4e\xae\xd9\xa1\x56\xd3\xdb\xf7\x03\xc4\x2e\x13\x8d\x33\xfa\x3a\xac\x18\x6e\x36\xbb\xc1\x4b\x1c\xbd\x10\xa6\x4e\x60\xb0\x5b\x1d\xc6\x10\x71\xcc\xba\xaf\x32\xea\x13\x68\xa7\xde\xd7\x53\x3a\x62\x00\xc1\xac\xbb\x35\x4c\x5a\x5e\x7e\x8d\x33\x34\xbb\xa5\xfb\xf7\x8c\x00\x19\xcf\xb1\x6c\x5c\xa2\x25\xc0\x55\x04\x8b\xc6\x7e\x90\x24\x84\xcb\xba\x28\x6c\xe8\xd9\xa4\x72\x59\x37\x30\x3b\x8c\x49\x11\x42\x23\xde\x11\x2d\x21\x65\x0e\x67\xc4\xeb\x88\x32\x3e\x85\x8b\xea\x17\x52\x04\x21\x1c\x6d\xd4\x1a\xd3\x3f\x41\x9a\x1c\xad\x65\xdb\xc7\x88\x71\x01\x99\xcf\x99\x04\x83\x2c\x65\x6b\x81\x25\x09\xea\xf6\xc2\x4d\xb5\xdc\x42\x8a\x8e\x71\xd1\xef\x95\x71\x1c\xee\xe3\x0e\xbe\xf0\x22\x2a\x30\xc8\xec\x70\x15\x81\xe3\x8f\x8d\xe2\xa2\x70\x89\xdc\xb0\xcf\x99\x0d\x26\x7f\x69\x1e\xbb\xee\x36\x07\x79\x2c\xee\x1b\x0f\x00\x20\xb2\x77\x5e\xde\x62\xdf\x1a\x8f\xe7\xf0\x13\x13\x16\xcf\x47\x14\xff\x49\xde\x4b\xf5\xf0\x32\x72\x84\x69\x8f\xd0\xf4\x5e\x07\x6e\x2b\xfe\x9f\xc9\xc4\xe1\x8c\x64\x52\x21\xb8\xaa\xa6\x97\x27\x5f\xc5\x89\xc7\xcc\x4b\xfe\xab\x6f\x82\xac\xf2\xf2\xb1\x97\xc3\xef\xdb\xb0\xec\x72\x75\x17\x1c\x28\x1e\x60\xd8\x78\xcf\x53\xc2\xe3\xcb\xd5\x9d\xfd\x61\xb0\x9e\x0c\xc8\xa9\x07\x8e\x00\x1a\x12\x5e\x33\x97\xb5\x80\xa3\x50\x49\xed\x13\xb2\xc3\x01\x97\xf6\x5d\x17\xaa\xe5\xb8\x72\x67\x96\xf8\xe2\x09\x13\x62\x4f\x58\x89\xe7\x14\xe6\x55\x2f\x35\x5c\x1b\x87\x64\x19\x2d\x3a\x47\xc1\x89\x9b\x0d\x26\x8e\xef\xb0\xb6\xb8\x54\x7a\x3c\xe0\xc3\xb4\x90\xec\xc9\x6c\x95\xc7\x66\x93\x98\xba\x29\x26\x97\x6e\x54\xf7\x82\x83\x86\x0b\x92\x01\x0d\x0f\x9e\x78\x51\x0c\x6f\x94\x97\x29\x30\x17\x4c\xf8\x04\x29\x9a\x5f\x05\xbc\xfe\x07\x24\x43\x3d\xd8\xf3\x0f\x77\x6b\x5f\x76\x54\xdd\xdb\x50\xf3\xd6\xd3\x03\x15\x26\xc1\xaf\x98\xf8\x2a\x06\x46\xbf\x11\x1a\xe9\xce\xc6\x1c\x78\x7a\xbf\x34\x21\xc9\x4e\xab\xe6\xd3\xba\x92\x17\xdb\x6e\xa4\x6d\x98\x10\x6b\x43\x15\xba\xbb\x77\xbf\x89\x05\x3a\x1c\x2e\x27\x2c\x47\x91\x30\x8b\x69\xab\x6e\xf7\x46\x59\x6c\xf0\xc7\x8b\xf8\x28\xeb\xc3\x85\x7b\x74\xf9\x50\xbd\x1c\x0d\x80\x50\x3d\xe3\xac\x75\xf9\x75\x4d\x01\x5c\xfa\x0f\xb4\x1b\xde\x4e\xf9\x85\x41\x82\x26\x94\xa4\xf8\xb9\x26\x23\x8d\x3e\x64\xea\x49\xb9\x33\x7c\x6e\x34\x72\xe5\x54\xdb\xff\x9a\xa6\x57\xb5\x37\xa0\x5f\x57\xb6\xf5\xa1\x3c\xb5\x3f\xb0\x6f\x09\x33\xc0\xea\x10\x93\x82\xf5\x7e\xe5\xf6\x9c\x24\xb5\x72\xa8\xdb\x49\xa9\x26\x8c\x0c\x3d\xf1\x8e\xa7\xf1\x2b\x30\xd4\xd0\xf3\x65\xca\xb3\x33\xd2\xf0\x6d\x53\xbc\x3f\xe9\xf6\xc8\x59\x75\x74\xd2\xf9\xb2\x37\xb5\x8e\xe5\xc0\x6a\xcf\x67\xe4\x88\xbe\x4f\x0d\xe3\x38\xb2\x44\xf9\xe7\x28\x03\x16\x19\x12\xb6\x60\x4b\xc1\x3a\xe4\x89\xd8\x52\xec\x27\xd8\x06\xa6\xe1\xf9\x31\x34\x3f\x8b\x7f\xa5\xd2\xfb\xf6\x9e\xcb\xbe\x33\xf9\x59\xe8\x3f\x7a\x5f\x1e\xbe\xbf\x9c\x30\x25\x9c\xe9\xf5\xce\x2b\xee\xb9\x7a\xde\x4f\x39\x4e\x88\x7f\x8a\xf3\xda\xa7\xdc\x93\x88\x94\xf7\x4a\xcf\x26\x34\x76\x08\x3d\x89\xc8\xc1\x04\x2f\x48\x6a\xf4\xf0\x78\x12\xbd\xdd\xf8\xb9\xec\x33\xeb\xe6\x51\x30\x17\x70\x77\xa0\x52\x68\x66\x1c\x4f\xbc\x60\xfd\x00\xad\xfa\x03\x87\x90\x8a\x47\x6a\x4b\xa7\x14\x16\xcd\x0e\xd3\x25\x38\xe3\x63\x50\x58\xa7\x0c\x75\x3e\xb5\x27\x7e\x5d\x7d\x99\x5f\x8a\x57\x08\x0b\xbf\xfd\x7e\xf2\xbf\x00\x00\x00\xff\xff\xc6\xcb\xa7\x60\x55\x37\x00\x00") +var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x73\xdb\xb8\x11\x7f\xf7\xa7\xd8\xf1\x3d\x38\x99\xb1\xa8\x4b\xda\x87\x8e\xde\x5c\xa7\xd7\x71\x9b\x4b\x3c\x96\xe3\x97\x34\x0f\x2b\x72\x25\xe1\x0c\x02\x3c\xfc\x91\xa3\xde\xdc\x77\xef\x2c\x40\x52\xa4\x44\x52\xb4\xe3\xe4\x32\x9d\xe3\x4b\x22\x72\x01\xec\xff\xfd\x2d\x00\x63\x21\xee\xc8\x58\xa1\xd5\x0c\xb0\x10\xf4\xd9\x91\xe2\x5f\x36\xb9\xff\x9b\x4d\x84\x9e\x6e\x5e\x9d\xdc\x0b\x95\xcd\xe0\xd2\x5b\xa7\xf3\x1b\xb2\xda\x9b\x94\xde\xd0\x52\x28\xe1\x84\x56\x27\x39\x39\xcc\xd0\xe1\xec\x04\x00\x95\xd2\x0e\xf9\xb5\xe5\x9f\x00\xa9\x56\xce\x68\x29\xc9\x4c\x56\xa4\x92\x7b\xbf\xa0\x85\x17\x32\x23\x13\x26\xaf\x96\xde\xfc\x98\xfc\x35\x79\x75\x02\x90\x1a\x0a\xc3\x6f\x45\x4e\xd6\x61\x5e\xcc\x40\x79\x29\x4f\x00\x14\xe6\x34\x03\xa1\xac\x43\x29\x0b\x89\xca\x26\xba\x20\x83\x4e\x1b\x9b\xa4\xda\x90\xe6\x7f\xf2\x13\x5b\x50\xca\x6b\xaf\x8c\xf6\xc5\x0c\x3a\x69\xe2\x6c\x15\x8b\xe8\x68\xa5\x8d\xa8\x7e\x03\x4c\x40\xcb\x3c\xfc\x3f\x8a\x7e\x15\x17\xbd\x96\xa8\xc2\x5b\x29\xac\xfb\xf7\xfe\x97\xb7\xc2\xba\xf0\xb5\x90\xde\xa0\x6c\xb3\x1a\x3e\xd8\xb5\x36\xee\xdd\x6e\x61\x5e\x48\x14\xf1\x93\x50\x2b\x2f\xd1\xb4\x46\x9d\x00\xd8\x54\x17\x34\x83\x30\xa8\xc0\x94\xb2\x13\x80\x52\x69\xe5\x24\x13\xc0\x2c\x0b\x86\x40\x79\x6d\x84\x72\x64\x2e\xb5\xf4\xb9\xaa\x17\x61\x9a\x8c\x6c\x6a\x44\xe1\x82\xb2\x6f\xd7\x04\x4b\x61\xac\x83\xcb\xf9\x1d\x08\x05\x6e\x4d\x41\x26\xd0\x4b\x48\xa5\xb7\x8e\xcc\x9c\xcc\x46\xa4\x54\xfa\x46\x58\xbf\x9e\x0e\xe0\x17\xab\xd5\x35\xba\xf5\x0c\x12\x56\x77\xd2\x3f\xe8\xe3\x8f\x9f\x1a\xe3\xa2\x0d\x2f\xe7\x77\x8d\x77\x6e\xcb\x12\x5a\x67\x84\x5a\x0d\x71\x8c\x45\x61\xf4\x06\x25\xe4\x3a\xa3\x01\x5e\x2a\xba\x83\x65\x2f\x0e\x3f\xf4\xac\xdd\x3d\x65\x50\x7e\xd7\x94\xad\x0f\x71\xca\x85\xd6\x92\x4a\x6f\xa9\x88\x37\xaf\x50\x16\x6b\x7c\x55\xbe\xb4\xe9\x9a\x72\xdc\x19\x49\x17\xa4\x2e\xae\xaf\xee\xfe\x32\xdf\xfb\x00\x6d\x5d\x34\x5c\x0e\x32\x8e\x42\xb2\xc1\x80\xa5\xe3\x84\xe8\x61\x43\x22\x58\x0a\x16\xdd\x45\xc0\x01\x9b\x7a\xf1\x0b\xa5\xae\xf1\xda\xd0\xaf\x5e\x18\xca\x9a\xab\xb3\x46\xaa\x18\xdf\x7b\xcd\xda\x69\xbc\x2a\x0c\xaf\xe5\x1a\x91\x14\x9f\x46\x92\x69\xbd\xdf\x93\xec\x8c\xc5\x8f\x74\x2d\xc9\x4a\x87\xa7\xac\xd4\x19\x0b\xe5\xd6\xc2\x82\xa1\xc2\x90\x25\xe5\x76\x42\xab\x52\xa6\x04\xd8\x19\xc9\x58\x8e\x3a\x2f\x33\x4e\x44\x1b\x32\x0e\x0c\xa5\x7a\xa5\xc4\x7f\xeb\xd9\x2c\x38\x1d\x23\x00\x1d\x59\x07\x21\x84\x14\x4a\xd8\xa0\xf4\x74\x0e\xa8\x32\xc8\x71\x0b\x86\x78\x5e\xf0\xaa\x31\x43\x20\xb1\x09\xfc\xac\x0d\x1b\x60\xa9\x67\xb0\x76\xae\xb0\xb3\xe9\x74\x25\x5c\x95\x42\x53\x9d\xe7\x5e\x09\xb7\x9d\x86\x6c\x28\x16\x9e\xad\x31\xcd\x68\x43\x72\x6a\xc5\x6a\x82\x26\x5d\x0b\x47\xa9\xf3\x86\xa6\x58\x88\x49\x60\x56\x85\x34\x9a\xe4\xd9\x0f\xa6\x4c\xba\xf6\x6c\x4f\x7d\x9d\xfe\x0b\x55\xde\x1a\xd4\x35\xe7\x2f\x10\x96\xdd\x24\x0c\x8f\xb2\xec\x54\xca\xaf\x58\x2b\x37\xff\x98\xdf\x42\xc5\x40\x54\x7b\xd4\xf0\x8e\xd4\xee\x94\xcd\x8a\x12\x6a\x49\x26\x52\x2e\x8d\xce\xc3\x2c\xa4\xb2\x42\x0b\xe5\xc2\x8f\x54\x0a\x52\x0e\xac\x5f\xe4\xc2\xd9\xe0\x73\x64\x1d\xdb\x21\x81\xcb\x50\x41\x60\x41\xe0\x8b\x0c\x1d\x65\x09\x5c\x29\xb8\xc4\x9c\xe4\x25\x5a\xfa\xea\xaa\x66\x8d\xda\x09\xab\x6f\xbc\xb2\x9b\x05\xf0\x70\xc0\x41\x8c\x01\x54\x25\xaa\xd7\x3a\x8d\x18\x9f\x17\x94\xd6\xd1\x50\xc7\xf4\x45\x51\x48\x91\x46\xb7\xaf\xbd\x83\x1d\x79\x51\x27\x82\x56\x56\x1a\x64\xa7\x2f\xec\x21\x96\x97\xc3\xb4\xd9\xfe\x74\xb0\x10\x7f\x1a\x55\x46\x60\x20\x67\x40\xc8\x1b\x71\xe9\xc3\x2f\x7b\xfa\xaa\x52\x3b\x3b\x34\x7b\x98\xb7\x64\x76\x05\xa3\xd0\x52\xa4\x5b\x58\x6a\xc3\xf9\xa1\xa1\xdb\x04\xae\x1c\xe4\xde\x06\x7f\xd3\x8a\x58\xb3\xa7\x17\xde\xe9\x1c\x9d\x48\x4f\x41\x1b\x38\xfd\x19\x95\x47\x79\x9a\x74\xb0\xd0\xeb\x10\x3b\xde\xbb\x54\xda\x5d\x23\x76\x4f\xbf\xea\xfa\xe7\x42\x63\x70\xdb\xf1\x55\x38\xca\x3b\x87\x1d\xe1\x7e\x45\x8a\x8b\x46\x47\xc6\xde\x0d\xe5\x44\xb9\x22\x73\xf0\x3d\x7a\x63\xff\xb8\x9e\x25\xe3\xb0\x1a\xe9\x3c\x6a\xbc\x75\xe8\xfc\x81\x9c\x2d\x17\x39\x6d\xc6\x54\x20\x6f\x24\xb0\xb2\x80\x2e\xb5\xc9\x63\x4c\xe1\x42\xfb\x98\xac\xe2\xd4\xec\x19\xd6\x51\x61\xeb\x50\xe1\x60\x4b\x75\x5e\x48\x72\xed\xda\x9b\xc0\x7f\x14\x94\x2b\x70\x3a\x74\x06\x85\x0c\x53\x61\xea\x3c\xca\x30\x23\x95\x15\x7a\x6b\x1d\xe5\xc9\xe9\xf3\x44\x6a\x8a\x0e\xa5\x5e\xcd\x63\x36\xe8\x20\x28\xd6\x68\xe9\x31\xf1\xe7\x1c\x29\xcf\x59\xb8\x74\xc6\x8b\x34\xd5\x5e\xb9\x1b\x5a\x1e\x0f\xc9\xfe\xb1\x60\x68\x49\x86\x54\x5a\xd6\x77\x1b\x09\x00\x23\x05\xb8\x35\x3a\x8e\x64\x6f\xa3\x9a\x33\x1d\x71\x70\x56\x43\x99\x4a\xe1\xfd\x51\xd9\xa9\xbc\x63\xf2\xc2\x20\x56\xe9\x16\xf3\xfa\xaa\xc2\x27\x11\x96\x50\x25\x9d\xeb\x62\x0e\x8e\x45\x01\x3f\x4b\x41\x32\x0b\xf8\x73\x0c\x07\x67\x57\xa5\x42\x43\x15\x77\x1a\x10\x0a\x41\x29\xb5\xe0\x50\x50\x18\x61\x56\xbe\xe4\x82\x67\xa8\xfc\x76\x1e\x6b\x75\x09\x03\x76\x70\xc9\xa1\x50\x80\x8c\x0b\x44\x06\xff\x9a\xbf\x7f\x37\xfd\xa7\x8e\xbc\xb1\xa5\xc8\xda\xe8\xc9\x39\x29\x77\x0e\xd6\xa7\x6b\x40\xcb\xac\xb1\x7b\xb2\xff\x53\x92\xa3\x12\x4b\xb2\x2e\x29\x67\x23\x63\x3f\xbe\xfe\x94\xc0\x4f\xda\x00\x7d\x46\x0e\x9e\x73\x10\x51\x6b\x35\xa8\x28\x5d\x23\xa4\x72\x16\xa6\x1e\x0b\x0f\xc2\xad\x03\x4b\x85\xce\x4a\xa6\x1f\x02\xb3\x0e\xef\x39\x7f\x47\x66\x3d\xf7\x32\xf7\x34\x83\xd3\xd8\x9a\xd4\x4b\xff\xc6\x30\xfc\xf7\x53\x78\xf1\xb0\x26\x43\x70\xca\x3f\x4f\xe3\x82\x35\x06\xe4\x77\x95\x1d\x77\x0b\x07\x87\x74\x46\xac\x56\x14\x22\x9f\x01\x0d\x83\x86\x97\x5c\x21\xc4\x12\x94\x6e\x10\x87\x29\x58\x9f\x05\xa5\x62\x29\x28\x3b\x60\xe4\xe3\xeb\x4f\xa7\xf0\xa2\x2d\x17\x08\x95\xd1\x67\x78\x1d\xdb\x31\x61\x59\xc6\x97\x09\xdc\x06\xcb\x6c\x95\xc3\xcf\x3c\x67\xba\xd6\x96\x14\x68\x25\xb7\xcc\xf1\x1a\x37\x04\x56\xe7\x04\x0f\x24\xe5\x24\xa2\x84\x0c\x1e\x70\xcb\x32\x54\xaa\x64\xab\x22\x14\x68\xdc\x1e\x42\xbe\x7d\xff\xe6\xfd\x2c\xae\xc6\x66\x5b\x29\x5e\x82\xd1\xd7\x52\x30\xfe\x65\xe0\x1b\x51\x5c\xb0\x39\x33\xe2\xa3\x91\x38\xf5\xad\x51\xad\xa8\x6a\x1e\x97\x9e\xf1\x54\xb2\x8f\x98\x46\x7b\x7c\x17\x5c\xed\x76\xf6\x00\x5b\xf7\x03\xed\x0f\x04\x85\xa3\x45\x0c\x3d\xe0\x28\x11\xdf\x35\x7c\x70\x50\xc4\x7b\xbf\x20\xa3\xc8\x51\x90\x32\xd3\xa9\x65\x01\x53\x2a\x9c\x9d\xea\x0d\x27\x55\x7a\x98\x3e\x68\x73\x2f\xd4\x6a\xc2\x4e\x36\x89\x96\xb7\xd3\xb0\xfb\x31\xfd\x21\xfc\xf3\x45\x12\xf5\x96\xea\x6e\xb1\x02\xf9\xb7\x90\x8d\xd7\xb1\xd3\x27\x8b\x56\x41\xea\xc7\x54\x82\xb3\x79\x0c\xf8\x74\x7f\x34\x87\xcb\xc3\x5a\xa4\xeb\xaa\x69\x6d\x64\xb8\x1c\xb3\x98\x02\x51\x6d\xbf\xba\x1b\xb3\x02\xbd\xe1\xb5\xb7\x93\x72\x5f\x6e\x82\x2a\xe3\xff\x5b\x61\x1d\xbf\x7f\xb2\xc6\xbc\x18\x19\xc0\x1f\xae\xde\x7c\x1b\xe7\xf6\xe2\x89\xd1\xba\xf0\x2a\x93\xf4\x56\xeb\x7b\x5f\x74\x82\x84\x96\x40\x7f\x6f\x52\x57\xfd\x47\xd9\xa5\x09\x35\x29\x8c\x5e\x19\xae\x95\x8d\x2e\x17\x0a\x2f\x63\x7a\xf5\xaa\xc0\xf4\x1e\x57\x54\x2e\x1a\xca\x08\xf7\xc6\x65\x39\x2a\x5b\x81\x7e\x98\xf3\x04\xdc\xdf\xcb\x7d\xdc\x0d\x28\xf9\xec\x61\xb3\xaa\x8b\xcc\x63\x40\xb0\x25\xdf\xc7\xf9\x3d\x0a\xcc\x86\xb0\x6d\x7c\xf6\x10\xee\x0d\x2d\x7b\x09\x45\xc6\x7e\xbf\x14\x1d\xed\x49\x45\x52\xa0\x5b\xf7\x7e\x34\x54\x48\xec\x02\xd1\x30\x02\x42\xc2\x01\x9f\x7d\x74\x7b\xd6\xb8\xdc\x1b\x56\x59\xa4\x4a\x18\xa5\x96\x5b\x64\xe1\x4d\x69\x05\x16\x09\x1e\xd0\x86\x0c\x24\x37\x94\x85\x0d\x98\x3e\x1c\x3a\xc2\x22\xe3\xa4\x85\x51\xb0\xb9\x43\xde\x27\x80\xe7\x26\xe3\x03\xe9\x28\x3e\x47\x81\x74\x07\x4f\x7f\xc2\xe9\x3f\xe1\xf4\x77\x0e\xa7\x1f\x15\x03\x43\xd0\xba\xcb\xfd\xbf\x57\x80\xfd\x28\xa1\x87\xc0\x76\x97\xd0\xdf\x09\xe4\x7e\xb4\x8c\x83\xf0\xbb\x4f\xd0\xef\x04\x84\x3f\x4a\xd8\x91\x80\xbc\x4b\xe4\xff\x67\x58\xfe\x28\x1d\x0e\x40\xf4\x2e\xbd\x7d\x17\x40\x7d\xb4\x80\xa9\x56\xf1\x14\x7c\x00\xa5\xb4\xb1\x56\x3d\x60\x7f\x1f\x98\x99\x46\xd9\xda\xa7\x6d\xc2\xe4\x63\x70\xaa\x0f\x92\xc7\x67\x00\x98\x37\x27\x39\x82\xc9\x8e\x63\xe5\xf8\x4c\xca\xed\xeb\x23\x44\xbc\xe6\x00\xc9\x38\x04\x08\x20\xd1\xba\x5b\x83\xca\x8a\xea\x06\xc7\x30\xfd\x9e\x45\xde\x22\xb7\x1d\x22\xaf\xbb\x8c\x68\x1f\x70\xf5\x94\x25\xa0\x0d\x47\x35\xe5\xbe\x3c\x63\x1a\xa5\xdd\xba\xaf\xe9\xd8\x3d\x23\xa3\x84\x9f\x78\x0e\x30\x83\x0c\x1d\x4d\x98\xa3\xa3\x62\x7f\x08\x87\x95\xcf\x26\x32\x63\xf8\xc2\xe8\x05\x65\x7f\x98\x54\x39\x59\x8b\xab\xc7\x89\x73\x01\x6b\x9f\xa3\x02\x43\x98\xe1\x42\x52\x35\x09\xa3\xb1\x70\x5a\xa9\x56\x90\x91\x43\x21\x6d\xe3\x84\x65\x67\xdf\x67\x13\xd6\x10\xda\x63\x55\x02\x0e\xaf\x98\xc4\x61\xe1\xa0\xb0\x65\x8f\x33\x1b\x8c\xfc\x35\x38\xed\x3e\xb9\x1a\xe4\x74\x5e\x9f\x48\xb5\x98\x3c\xaf\x4e\x30\x6f\x8d\xa7\x73\xf8\x09\xa5\xa5\x73\xf8\xa0\xee\x95\x7e\x78\x3e\x7e\x03\xe1\xa3\xf4\xba\x2d\x02\x57\x35\x9f\xcf\xc0\xca\xae\xbb\x1f\x99\xec\xaf\xea\x01\xd5\x0e\x4d\xd9\xa1\x4f\xbc\x12\xbf\xfa\x76\xa3\x52\x1f\x32\xbd\xd8\x6f\x61\x2e\xe7\x77\xc1\x39\x62\xbb\x6d\x63\x23\x53\xb5\x76\x97\xf3\x3b\xfb\xf2\x48\x6d\x18\x94\xaa\x18\x6c\x54\x5b\xf2\x70\x4f\xbb\xd7\x6a\x49\x9d\x36\xae\xfe\xec\xb6\x65\x0a\x2f\x65\x02\x57\xee\xcc\x32\x0f\x22\x45\x29\xb7\xdc\xb5\x88\x9c\x03\xb3\x46\x3d\xc7\xaa\xda\x30\xe7\x23\x0a\xc4\x41\xb0\xd1\x72\x49\xa9\x13\x1b\x6a\x0c\xaf\x14\x1d\x37\x9c\x28\x2b\xe5\xf8\x22\xe6\xaa\xad\x9c\x91\xac\xdd\x94\xe4\x95\xa3\x34\xed\xbf\xd3\x6a\x39\x69\xec\x35\x83\xd3\x28\x82\xa5\xf6\x2a\x03\x74\xc1\x3c\x4f\xe4\xb9\x7d\x86\xfb\xed\x0e\xfc\x87\xf1\xd3\xf3\x6c\x36\x36\x4e\xe0\x6b\xf4\x35\x04\xbe\x76\x49\x8e\x3e\x53\xea\x1b\x77\xbc\x9a\x77\x38\x9e\xb6\xd7\x78\xdc\x65\x1f\x83\x66\x46\xa5\xcf\xb1\xf5\x77\x2c\x9e\x78\xd6\x45\x8f\x96\xfb\x51\x91\x36\x5c\x75\xbb\xf1\xf7\x4d\x2c\xba\x61\xab\x33\xc5\x9c\x64\x8a\x96\xb2\xfd\x5a\x1c\xc1\xf8\x98\x02\x3c\x82\xd1\x63\x45\x77\xc4\x14\xc3\x75\xf0\xa8\xdb\x87\xaa\x18\xa9\x16\xd5\x2d\x88\xba\xdd\x68\xf9\x37\xe7\x13\x84\x94\x4c\x28\x32\xf1\x12\x1d\xb2\xae\x1e\xd6\xfa\xc9\x99\x31\x5c\x04\x39\x7a\xb4\xd1\xe0\xe2\x9a\x07\xd4\xb5\x33\x74\xab\xae\x11\xa3\xd8\xe6\x78\x90\xbd\x61\xc6\x24\x0e\xdc\x38\xfa\xd2\x04\x34\x77\x54\xec\x27\x9c\x86\x10\x2a\xe0\xd4\x8d\xc8\xe2\x2d\x1d\x2a\x40\xa8\xe7\xc9\x36\xc7\x4f\x36\xe2\x8e\x7d\xbf\xbf\x4d\xea\xed\x8b\x5e\x82\x81\x56\xef\x78\xb6\xab\xd7\xff\xc2\x0c\xd0\x7f\xf9\x2b\x3e\x07\xf6\xa8\xfe\xa0\x60\xc0\x2e\x8d\xeb\xa7\xe1\x82\xa3\x33\x25\x38\xd8\x8e\xb2\x0e\x8c\xed\xaa\xc7\xf4\xd4\x93\xf8\x77\x05\x83\x14\xf7\x42\x1d\x5e\x89\x6c\x12\x30\xa6\x18\x24\xd8\xdd\x85\x1b\x49\x16\xf6\xda\x06\x69\xcb\x73\x96\x2f\x3c\xe6\x89\x7f\x54\xf1\x6d\xf6\xa5\x47\x4e\x54\x9d\x8a\x3c\xcb\x64\xc7\x37\x8e\x47\x4e\xb4\x33\xcd\x33\x4f\x37\x62\xcb\x77\xe4\x9c\x9b\x31\x7b\xa9\xcf\x50\x4d\x0f\x42\xbe\x6c\x60\x07\xaa\x49\x81\xc6\x89\xd4\x4b\x34\xbb\xd8\x0f\xe9\xf9\xe0\x4f\x71\x46\xf2\x6c\xc9\x6c\x28\x9b\x81\x33\xbe\x0a\x13\xeb\xb4\x61\xc4\xd3\x7a\xe7\x17\xf5\x6d\xea\x9d\x40\xa5\x80\xf0\xdb\xef\x27\xff\x0b\x00\x00\xff\xff\x9c\x07\x2b\xc2\x2f\x35\x00\x00") func operatorsCoreosCom_installplansYamlBytes() ([]byte, error) { return bindataRead( @@ -139,12 +139,12 @@ func operatorsCoreosCom_installplansYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_installplans.yaml", size: 14165, mode: os.FileMode(436), modTime: time.Unix(1607975192, 0)} + info := bindataFileInfo{name: "operators.coreos.com_installplans.yaml", size: 13615, mode: os.FileMode(436), modTime: time.Unix(1607977323, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\xeb\x6f\x1b\xc7\x11\xff\xae\xbf\x62\xc0\x16\xb0\xe4\x92\x47\xd3\x09\xdc\x84\x80\x61\x18\x4e\x5d\x18\xb6\x13\xc3\x52\xf3\xa1\xa2\x5a\xcf\xdd\x0e\x8f\x1b\xdf\xed\x5e\xf6\x41\x89\x09\xf2\xbf\x17\xb3\x7b\x0f\x3e\xee\x28\xb5\x4e\xd0\x2f\xdc\x2f\x12\x77\xf7\x66\xe7\xf9\x9b\x07\x56\xf2\x47\x32\x56\x6a\x35\x07\xac\x24\xdd\x39\x52\xfc\xcb\x26\x9f\xbf\xb1\x89\xd4\xd3\xf5\xec\xec\xb3\x54\x62\x0e\xaf\xbc\x75\xba\xfc\x48\x56\x7b\x93\xd1\x77\xb4\x94\x4a\x3a\xa9\xd5\x59\x49\x0e\x05\x3a\x9c\x9f\x01\xa0\x52\xda\x21\x6f\x5b\xfe\x09\x90\x69\xe5\x8c\x2e\x0a\x32\x93\x9c\x54\xf2\xd9\xa7\x94\x7a\x59\x08\x32\x81\x78\xf3\xf4\xfa\x49\xf2\x75\x32\x3b\x03\xc8\x0c\x85\xcf\xaf\x64\x49\xd6\x61\x59\xcd\x41\xf9\xa2\x38\x03\x50\x58\xd2\x1c\x74\x45\x06\x9d\x36\x99\x56\x22\x3c\x6f\x93\x66\xcb\x26\x99\x36\xa4\xf9\x4f\x79\x66\x2b\xca\x98\x83\xdc\x68\x5f\x75\x9f\xed\xdc\x89\x34\x6b\x46\xa3\x90\x3f\xd4\xf7\x5e\x35\xe4\xc3\x59\x21\xad\x7b\xdb\x7f\xfe\x4e\x5a\x17\xee\x54\x85\x37\x58\xf4\x31\x18\x8e\xad\x54\xb9\x2f\xd0\xf4\x5c\x38\x03\xb0\x99\xae\x68\x0e\xdf\x33\x3b\x15\x66\x24\xce\x00\x6a\xdd\x04\xf6\x26\xb5\xf4\xeb\x59\x24\x96\xad\xa8\xc4\xc8\x37\x30\x41\xf5\xf2\xc3\x9b\x1f\xbf\xba\xdc\xd9\x06\x10\x64\x33\x23\x2b\x17\x34\x7c\xc0\x39\x48\x0b\x58\x5b\x15\x1a\xb3\x82\x5e\x82\xdb\x54\x04\x9f\x0e\xee\x7f\x6a\xe9\x02\xdc\xae\x64\xb6\x62\x02\xde\x92\x00\xa7\xd9\xcc\x6b\xda\x80\x54\x4b\x6d\xca\x60\x40\xde\xfd\xe1\xdd\x7b\xc0\x54\x7b\x07\x6e\x45\x60\x1d\xba\xf0\x00\xaa\x56\x09\x49\x4b\x94\x5f\x9d\x83\x4e\x7f\xa2\xcc\xb5\x9b\x86\x7e\xf6\xd2\x90\xe8\x64\x9a\x40\xe3\x6e\xed\x56\x65\x98\x9a\x93\x8d\x25\xe3\xda\x72\xec\xad\xdd\x3d\xa5\x3c\x62\xbd\xc5\x5b\x20\xd8\xa3\xc9\x06\x56\x6b\xdd\x93\xa8\x55\x1d\xd4\xb2\x92\x16\x0c\x55\x86\x2c\xa9\xe8\xe3\x3b\x84\xa1\x11\x2d\x88\x90\xc0\x25\x19\x26\x03\x76\xa5\x7d\x21\xa2\x86\x8c\x03\x43\x99\xce\x95\xfc\xa5\xa5\x6d\x59\x53\xfc\x68\x81\x8e\xac\xdb\xa3\x29\x95\x23\xa3\xb0\x80\x35\x16\x9e\xc6\x80\x4a\x40\x89\x1b\x30\xc4\xaf\x80\x57\x5b\xf4\xc2\x15\x9b\xc0\x7b\x6d\x28\x98\x62\x0e\x2b\xe7\x2a\x3b\x9f\x4e\x73\xe9\x9a\x80\xce\x74\x59\x7a\x25\xdd\x66\x1a\x62\x53\xa6\x9e\xe3\x62\x2a\x68\x4d\xc5\xd4\xca\x7c\x82\x26\x5b\x49\x47\x99\xf3\x86\xa6\x58\xc9\x49\x60\x5d\xc5\x60\x2b\xc5\x9f\x4c\xed\x2b\xf6\xd1\x0e\xaf\xd1\x80\xd6\x19\xa9\xf2\xad\x83\x10\x57\x47\x2c\xc0\x71\x15\x5d\x31\x7e\x1a\xa5\xe8\x14\xcd\x5b\xac\x9d\x8f\x7f\xbb\xbc\x82\xe6\xe9\x60\x8c\x7d\xed\x07\xbd\x77\x1f\xda\xce\x04\xac\x30\xa9\x96\x64\xa2\x11\x97\x46\x97\x81\x26\x29\x51\x69\xa9\xa2\x7b\x66\x85\x24\xb5\xaf\x7e\xeb\xd3\x52\x3a\x1b\x1c\x91\xac\x63\x5b\x25\xf0\x2a\xa0\x1c\xa4\x04\xbe\x12\xe8\x48\x24\xf0\x46\xc1\x2b\x2c\xa9\x78\x85\x96\xfe\x70\x03\xb0\xa6\xed\x84\x15\xfb\x30\x13\x6c\x03\xf4\xfe\xe5\xbd\x80\x03\x68\x80\x73\xc0\x5e\x07\xb0\x70\x59\x51\x06\x58\x14\xfa\x96\x6d\x98\x15\xde\x3a\x32\x80\xa2\x94\xaa\x1f\x18\xf6\x34\x7c\x1c\x1f\x6a\x14\x19\x43\xa5\x1d\x6b\x00\x8b\x62\x03\x7a\x4d\xc6\x48\xc1\x9e\x11\xbe\xd9\xa3\x68\xa8\xd2\xc6\x91\x80\x74\x13\xe8\x1e\x62\xcd\x11\xf1\x87\xe0\x24\x2a\xa2\x2a\xf4\xa6\x64\xdf\xda\x3f\x6a\xe8\xa1\x31\xb8\x39\x38\x93\x8e\xca\x9e\x4f\x06\x0d\xc6\xab\x16\xf2\x90\x8b\xff\xf1\xa9\x1d\x2b\x8e\xba\x2c\xc0\x3e\x88\x52\x59\x10\xe4\x50\x16\x16\x96\xda\x80\x56\x04\xc8\x9e\xe0\x22\xf2\x11\x64\xde\x98\xc3\xf0\x88\xab\x35\x5c\x88\xae\x97\x1f\xde\xb4\xe9\x24\x81\xc9\x64\x02\x57\xbc\x6d\x9d\xf1\x99\xe3\x48\x67\x48\x53\x82\x44\x78\x49\x48\xb3\x6f\x80\x66\x79\xcb\x4c\xb0\x37\x04\x51\x01\xa3\x9b\x2c\x25\x15\x02\x2a\x74\x2b\x48\xf8\x65\xcf\xc9\xbc\x2d\x06\x00\x5e\x6b\x03\x74\x87\x65\x55\xd0\xb8\x97\x6e\xc8\x6f\xaf\xb5\xbe\x0c\x1f\xd7\x8c\xfd\x1a\x8e\xa6\x53\xf8\xd8\xe2\x47\x74\x9e\xd4\x92\x59\xc7\x8a\x26\xf8\x66\x2f\xc9\xa5\xd6\x8f\x6c\xa3\xa3\xa8\x8f\xa4\x21\xf8\x56\xe9\x5b\xd5\xc7\x6a\xe0\x03\x0d\xf5\x59\x0b\x60\x31\x7a\xb9\x46\x59\x60\x5a\xd0\x62\x34\x86\xc5\xe8\x83\xd1\xb9\x21\xcb\x85\x04\x6f\x70\x22\x58\x8c\xbe\xa3\xdc\xa0\x20\xb1\x18\x35\xcf\xfd\xa5\x42\x97\xad\xde\x93\xc9\xe9\x2d\x6d\x9e\xf3\x23\xfd\xf4\x77\xee\x5f\x3a\x83\x8e\xf2\xcd\xf3\x92\x3f\x6c\x69\x71\xe1\x73\xb5\xa9\xe8\x79\x89\xd5\xce\xe6\x7b\xac\xee\xa7\xde\x3a\x99\x85\xeb\x1b\x06\xa1\xf5\x2c\xe9\x1c\xef\xd3\x4f\x56\xab\xf9\x62\xd4\x69\x64\xac\x4b\x76\xdf\xca\x6d\x16\xa3\x5e\xaa\x3b\xac\xce\x17\xa3\xc0\xec\x62\x04\x3b\x22\xcf\x17\x23\x66\x8b\xb7\x8d\x76\x3a\xf5\xcb\xf9\x62\x94\x6e\x1c\xd9\xf1\x6c\x6c\xa8\x1a\x73\x29\xf5\xbc\x7b\x75\x31\xfa\xd4\x2f\x82\x6a\x24\xd6\x6e\x45\x26\xfa\x9d\x85\xdf\xfa\x58\x1b\x04\x93\xb8\x0e\xcb\x98\x6e\x4d\xa0\x40\xeb\xae\x0c\x2a\x2b\x9b\xc2\xb7\xf7\x5a\x49\xd6\x62\xde\x7f\x66\x08\xed\x01\xb2\xc6\xa3\xe8\x77\xbd\x47\x03\xd6\x1b\x06\xc0\xb8\x0e\xf9\xed\xbf\xb7\x87\x39\x87\x9f\x31\x18\xc4\xc2\xc7\x3a\x70\xbc\x11\x90\x66\xa7\xf4\xee\x5b\xae\xa5\xc2\x20\xc2\xc9\x9c\xf1\x2a\x0a\xca\x09\x03\x55\xb0\x58\x52\x03\x4f\xac\xbf\x52\x82\xdb\x15\x1d\x21\xba\x22\xf0\x4a\x90\x29\x36\x9c\x58\xb2\x0e\x20\x57\xa8\x72\xce\xf1\xf0\x86\x11\x0e\x03\x86\x71\xfe\xff\xcc\x81\x3d\xe6\x0f\x87\xa9\x7a\xdb\xd4\x2f\x41\x3e\xe6\x20\xfc\x62\x90\x8c\x40\x56\x93\x0f\x25\x50\x96\x51\xe5\x38\xe2\x93\x01\x82\x47\xf2\x45\xb3\x62\x9e\x9d\x03\x17\x26\x13\xd7\xef\x4c\xd0\x38\xd3\x83\x0c\x57\xdf\x8d\x45\xda\xca\x97\xa8\xd8\xdf\x04\xf3\xd9\x9d\x29\x21\x33\x74\xc3\x6c\x41\x9b\x5f\xba\x84\xdf\xd9\xb1\x36\x15\xd7\x69\x29\x31\xe2\x07\x14\xa8\x05\xfd\x02\x65\x94\x78\xf7\x8e\x54\xee\x56\x73\xf8\xea\xe9\x5f\x9f\x7d\xd3\x7b\x2d\x42\x3c\x89\xbf\x93\xe2\x42\xe1\xa0\x63\x18\x50\xcb\xe1\x67\x5b\xb5\x67\x90\x2f\x69\x0a\xaf\x24\x6f\xef\x1c\xf1\xbf\x3a\xbf\x75\x9e\x77\x8b\x16\x2c\x39\x48\x91\xbb\x2c\x5f\xb1\x9e\x38\xbb\x49\x65\x1d\xaa\x8c\xc6\x20\x97\xff\xdd\x23\xb2\x4d\x52\xc5\x06\x66\x4f\xc7\x90\xd6\xa6\x38\x4c\x4f\xd7\x77\x37\xc9\xa1\x88\xc7\x28\x7f\x3b\xde\xe3\x5f\x5a\x60\x53\xeb\x65\x70\x46\xb8\x95\x6e\xc5\x15\x7c\x28\x2b\xea\x9e\xe7\x58\x59\x01\xbb\xa5\x05\xb5\x72\x1f\x77\x08\x2e\x2f\x72\x32\xf7\x84\x87\x54\xee\xd9\xd7\x43\x5e\x23\x95\x2c\x7d\x39\x87\x27\xbd\x17\x22\xd8\x3e\xc8\x47\xe2\xd5\xae\xc6\x42\x06\xd7\xdc\x60\xc9\xa5\x70\x06\x52\x70\x4d\xbb\x94\x64\x1e\x12\x40\xac\x82\x9a\x20\x57\x4e\x3b\xba\x7e\x64\x6b\x14\xdd\x0a\xa9\x0f\x46\x0b\x9f\x91\xe9\x03\xff\xb8\xf4\x32\x94\xfb\x72\x29\xb3\x2d\xb3\x85\xf6\x22\xc4\x62\x6c\x89\x81\xee\xd8\x64\x6d\x83\xc9\xa5\xc7\x20\xc9\x92\x50\x49\x95\xdb\x9a\x45\xee\xb6\x18\xe6\x62\xbd\x72\xbb\xa2\x90\x4a\x43\x8b\x5d\xd3\x32\x41\x0a\x2b\x05\x19\x1a\x26\x8b\x90\x7b\x34\xa8\x1c\x91\x60\xf0\x64\xc0\xa8\x69\x6c\x01\x3c\x76\x4d\xd8\x3d\xd8\x01\x11\x70\x22\x04\xb3\xa8\x75\x43\x17\x70\xe7\xf7\x01\x9c\xd9\x93\xa7\x47\x1c\xac\xbd\x35\x70\xa5\x42\xc7\x8d\xff\x1c\xfe\x75\xfd\x72\xf2\x4f\x9c\xfc\x72\x73\x5e\xff\xf3\x64\xf2\xed\xbf\xc7\xf3\x9b\xc7\x5b\x3f\x6f\x2e\x5e\xfc\x79\xb0\x32\xf7\x03\x69\x7c\xcf\x55\xeb\xf4\xd9\x94\xfb\x8d\x37\x8c\x43\x6e\xd5\x4b\xb8\x32\x9e\xc6\xf0\x1a\x0b\x4b\x63\xf8\x87\x0a\xc9\xef\x0b\x14\x45\xca\x97\x43\x7c\x4d\x60\xc4\xaf\xf5\xd7\x80\xe1\x38\xb0\x31\x7c\x5e\xb3\x37\x58\xfd\x3f\x48\x21\xa1\x3c\xd7\xcb\x6d\x3c\xdb\x6a\xf2\x21\xe0\x30\x17\xfe\x49\xdd\x6c\x24\x99\x2e\xa7\xdd\x10\x60\xd0\xf1\xb8\x23\x7a\x8f\x6a\x03\x1d\xd8\xc6\x56\x60\x3f\x22\x2c\x77\xbc\x80\x99\xd1\xd6\xb6\x93\x8f\xe1\x60\x2e\xe4\x67\x82\xb6\x67\x88\xd0\x9e\x52\x86\xa1\x8d\x32\xa9\x74\x06\xcd\xa6\x93\xc6\x42\x86\x2a\xcc\x30\x2c\x2d\x7d\x31\x48\xf6\xdc\x12\x41\xa2\xb4\xa0\xc3\x1c\x71\x11\x11\x1f\x53\x59\x48\xb7\x61\x4c\x17\x94\x69\xb5\x2c\x64\xe8\xf4\x86\x93\x45\xc9\x1d\x3a\x2a\x17\xc3\xd8\x50\x4e\x77\x20\x1d\x94\x5c\xc7\x93\xe5\xc4\x71\x2e\x94\x9d\xcd\x9e\x7e\x75\xe9\x53\xa1\x4b\x94\xea\x75\xe9\xa6\x17\x2f\xce\x7f\xf6\x58\x30\x62\x8a\xef\xb1\xa4\xd7\xa5\xbb\xf8\x7d\x8a\x83\xd9\xb3\x7b\xe3\xf0\xfc\x3a\x46\xdb\xcd\xf9\xf5\xa4\xfe\xef\x71\xb3\x75\xf1\xe2\x7c\x91\x1c\x3d\xbf\x78\xcc\xdc\x6f\xc5\xf0\xcd\xf5\xa4\x0b\xe0\xe4\xe6\xf1\xc5\x8b\xad\xb3\x8b\xfd\x70\xe6\x3c\x2c\x33\x7a\x99\x65\xda\xff\xe1\xe3\x87\x3e\xd4\xb8\x67\x08\x14\xc1\xa3\x19\x03\xed\xce\x6f\xee\x1d\x01\x49\x67\xeb\x44\x1f\xa7\x3d\xd1\x2b\x6a\x40\x62\x70\x76\x06\x65\x11\x5d\x2d\x73\x1e\x8b\xad\x51\x11\xd8\x8d\x75\x54\x7e\xf1\x6c\xa7\x73\xea\xd3\xbc\xe5\x34\x6f\x39\xcd\x5b\xc2\x3a\xcd\x5b\x4e\xf3\x96\xd3\xbc\xe5\x34\x6f\x79\xb0\x32\x4e\xf3\x96\xdd\x75\x9a\xb7\x9c\xe6\x2d\x5b\xeb\x34\x6f\x39\xcd\x5b\x4e\xf3\x96\x6e\x9d\xe6\x2d\x87\xeb\x34\x6f\xf9\xff\xcd\x5b\x62\xf6\x9d\x83\x33\x3e\x96\x71\xd6\x69\xc3\x65\xdb\xd6\x8e\x4f\x5b\xd7\x68\xdc\xba\x8e\x7a\xf8\xf5\xb7\xb3\xff\x04\x00\x00\xff\xff\xc2\x2a\x06\x93\x4f\x29\x00\x00") +var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\x1b\x37\x12\x7f\xf7\xa7\x18\xe8\x0e\x88\x9d\x93\x56\x51\x5a\xe4\xda\x05\x82\x20\x48\xcf\x87\x20\x71\x1b\xc4\xbe\x3e\x9c\xe5\xbb\xcc\x2e\x47\x2b\xd6\xbb\xe4\x96\x7f\x64\xab\x45\xbf\xfb\x61\x48\xae\x56\xb2\xfe\xc4\x40\x72\x7d\xd2\xbe\xc4\x22\x87\xc3\xe1\xcc\xfc\x7e\x33\x13\x6c\xe5\xcf\x64\xac\xd4\x2a\x07\x6c\x25\xdd\x3b\x52\xfc\xcb\x66\xb7\xdf\xd9\x4c\xea\xf1\x62\x72\x72\x2b\x95\xc8\xe1\x8d\xb7\x4e\x37\x1f\xc9\x6a\x6f\x4a\xfa\x81\x66\x52\x49\x27\xb5\x3a\x69\xc8\xa1\x40\x87\xf9\x09\x00\x2a\xa5\x1d\xf2\xb2\xe5\x9f\x00\xa5\x56\xce\xe8\xba\x26\x33\xaa\x48\x65\xb7\xbe\xa0\xc2\xcb\x5a\x90\x09\xca\xbb\xab\x17\xcf\xb2\x6f\xb3\xc9\x09\x40\x69\x28\x1c\xbf\x92\x0d\x59\x87\x4d\x9b\x83\xf2\x75\x7d\x02\xa0\xb0\xa1\x1c\x74\x4b\x06\x9d\x36\xa5\x56\x22\x5c\x6f\xb3\x6e\xc9\x66\xa5\x36\xa4\xf9\x9f\xe6\xc4\xb6\x54\xb2\x05\x95\xd1\xbe\xed\x8f\x6d\xc8\x44\x9d\xc9\xd0\xf8\xc8\x9f\x92\xdc\x9b\x4e\x7d\xd8\xab\xa5\x75\xef\x76\xef\xbf\x97\xd6\x05\x99\xb6\xf6\x06\xeb\x5d\x06\x86\x6d\x2b\x55\xe5\x6b\x34\x3b\x04\x4e\x00\x6c\xa9\x5b\xca\xe1\x47\x36\xa7\xc5\x92\xc4\x09\x40\xf2\x4d\x32\x6f\x94\xde\xbf\x98\x84\x9f\x7c\x64\x4e\x0d\xe6\xe9\x17\xb0\x5a\xf5\xfa\xc3\xdb\x9f\xbf\xb9\x7c\xb0\x01\x20\xc8\x96\x46\xb6\x2e\x78\x7a\xeb\x05\x20\x2d\x60\x8a\x2e\x74\xe1\x05\x3d\x03\xb7\x6c\x09\x3e\x6d\xc9\x7f\x82\xbb\xb9\x2c\xe7\x7c\xcc\x5b\x12\xe0\x34\x07\x79\x41\x4b\x90\x6a\xa6\x4d\x13\xc2\xc7\xab\x3f\xbd\xbf\x00\x2c\xb4\x77\xe0\xe6\x04\xd6\xa1\x0b\x6a\x51\xad\x5c\x90\xad\x19\xc9\xb7\xe5\xa0\x8b\x5f\xa8\x74\x6b\xcb\x86\x7e\xf5\xd2\x90\x58\x7f\x0f\x7b\xa3\x4b\xba\xb5\xe5\xd6\xb0\x5e\x27\xbb\x88\x76\xdf\x5a\x8a\x6f\xac\x3f\x70\xcc\x13\xf6\x5e\x94\x03\xc1\xd9\x4d\x36\x18\x9e\xe2\x40\x22\xb9\x3c\xb8\x66\x2e\x2d\x18\x6a\x0d\x59\x52\x31\xdf\xbb\xa7\x85\x07\x64\x70\x49\x86\x0f\x82\x9d\x6b\x5f\x8b\xe8\x21\xe3\xc0\x50\xa9\x2b\x25\x7f\x5b\x69\xb3\xec\x29\xbe\xa6\x46\x47\xd6\x81\x54\x8e\x8c\xc2\x1a\x16\x58\x7b\x1a\x02\x2a\x01\x0d\x2e\xc1\x10\xeb\x05\xaf\xd6\x34\x04\x11\x9b\xc1\x85\x36\x14\x9c\x9f\xc3\xdc\xb9\xd6\xe6\xe3\x71\x25\x5d\x07\xe0\x52\x37\x8d\x57\xd2\x2d\xc7\x01\x8b\xb2\xf0\x8c\x83\xb1\xa0\x05\xd5\x63\x2b\xab\x11\x9a\x72\x2e\x1d\x95\xce\x1b\x1a\x63\x2b\x47\xc1\x58\x15\xc1\xd5\x88\xbf\x98\x94\x13\xf6\xc9\x03\xf7\xc5\x90\x59\x67\xa4\xaa\x36\xb6\x02\x96\x0e\xfa\x9a\xd1\x14\x13\x2f\x1e\x8f\x6f\xe9\x5d\xca\x4b\xec\x95\x8f\xff\xb8\xbc\x82\xce\x80\xe8\xf6\xe8\xe1\x5e\xd4\xf6\xce\x66\x47\x49\x35\x23\x13\x25\x67\x46\x37\x41\x0b\x29\xd1\x6a\xa9\x62\x22\x96\xb5\x24\xe5\xc0\xfa\xa2\x91\xce\x86\x04\x23\xeb\x38\x0e\x19\xbc\x09\xfc\x05\x05\x81\x6f\x05\x3a\x12\x19\xbc\x55\xf0\x06\x1b\xaa\xdf\xa0\xa5\xff\xbb\xab\xd9\xa3\x76\xc4\xee\x7b\xbc\xb3\xd7\xe9\x77\xfb\xc0\x16\xa0\x00\x3a\x6a\xdc\x1b\x9d\x2d\xc8\x5f\xb6\x54\x02\xd6\xb5\xbe\xe3\x88\x95\xb5\xb7\x8e\x0c\xa0\x68\xa4\xda\x03\xff\xc3\xb8\x4f\xec\x30\x84\x56\x3b\x7e\x3d\xd6\xf5\x12\xf4\x82\x8c\x91\x82\x23\x1f\xcf\x18\x6a\xb5\x71\x24\xa0\x58\x06\x4d\xbb\x58\xe3\xe0\x43\xf7\x53\x42\x7c\x72\x5b\xeb\x65\xc3\x19\xb4\xbd\xd9\x69\x45\x63\x70\xb9\x63\x57\x3a\x6a\x76\x1e\x3b\x10\x28\xfe\xd2\x23\x77\xd9\xf3\x05\x57\x6e\x44\x6f\xd0\x33\x3b\x67\x21\x4a\x65\x41\x90\x43\x59\x5b\x98\x69\x03\x5a\x11\x20\xe7\x80\x8b\x4c\x46\x50\x7a\x63\x02\x24\xba\x50\x05\xf4\xbc\xfe\xf0\x76\x55\x0e\x32\x18\x8d\x46\x70\xc5\xcb\xd6\x19\x5f\x3a\xc6\x2e\x53\x95\x12\x24\x82\x56\x21\x4d\xe0\x27\xcb\xca\x39\xd6\xe1\x19\x80\x31\x09\x66\x92\x6a\x01\x2d\xba\x39\x64\x7c\x8b\xe7\x02\xbc\x2a\xe0\x00\xe7\xda\x00\xdd\x63\xd3\xd6\x34\x8c\x75\xe7\x5c\xeb\xcb\x20\x98\x2e\xfc\x3d\x3c\x74\x3c\x86\x8f\x2b\xdc\xc7\xa4\x28\x2c\x99\x45\xec\x38\x42\x96\xc1\x4c\xeb\x27\x76\xf3\x4d\x59\x77\xf8\x9d\xd2\x77\x6a\x97\x09\xe1\x4e\x34\x94\xc3\x74\xf0\x7a\x81\xb2\xc6\xa2\xa6\xe9\x60\x08\xd3\xc1\x07\xa3\x2b\x43\x96\x0b\x38\x2f\x30\x21\x4f\x07\x3f\x50\x65\x50\x90\x98\x0e\x3a\xd5\x7f\x6b\xd1\x95\xf3\x0b\x32\x15\xbd\xa3\xe5\xcb\xa0\x70\x63\xeb\xd2\x19\x74\x54\x2d\x5f\x36\x2c\xb3\xda\xe3\xde\xe2\x6a\xd9\xd2\xcb\x06\xdb\x8d\xc5\x0b\x6c\x37\x14\xad\xc2\x6a\xe1\xfa\x86\x41\xbf\x98\x64\x7d\xa8\x3f\xfd\x62\xb5\xca\xa7\x83\xfe\x4d\x43\xdd\x70\xca\xb4\x6e\x39\x1d\xc0\x86\x05\xf9\x74\x10\x6c\xe8\xd6\x3b\xa3\xf3\xe9\x80\x6f\xe3\x65\xa3\x9d\x2e\xfc\x2c\x9f\x0e\x8a\xa5\x23\x3b\x9c\x0c\x0d\xb5\x43\x6e\x41\x5e\xf6\x37\x4c\x07\x9f\x60\xaa\x3a\xa3\xb5\x9b\x93\x89\x91\xb6\xf0\xc7\xe0\x00\x36\x76\x42\x35\x7e\xbb\xcb\x7d\xff\x71\xe1\xb7\x16\x2b\xda\xbb\x6f\x08\x6d\x6a\xdb\x76\x6d\xc7\xd0\xef\xdd\x66\x03\x77\x6e\x1e\x62\x92\xf8\xd5\x68\xdd\x95\x41\x65\x65\xd7\xbf\xee\x93\x7c\x00\xd8\xed\x83\x8c\xae\xd8\x13\x58\x07\x8e\x17\x02\x4c\x57\xc1\x76\x2b\x69\x46\x1f\x57\x39\x06\x75\x7c\x1a\x73\x2b\xaa\x10\x8c\x2c\x21\x36\xb6\x20\x05\xc1\xdd\x9c\x54\x50\xe5\x95\x20\x53\x2f\x99\x6b\x7b\xad\xe5\x1c\x55\xc5\x25\x0f\xde\x32\x05\x60\x00\x39\x97\xc3\x5b\x46\xcd\x90\x0f\x2a\xf0\xb6\x2b\xcd\xc1\xae\x95\x46\x66\x8b\x88\xf2\xa4\x26\x54\xf7\xb2\xa4\xd6\x31\x94\x1e\x72\x76\xff\x1d\xa4\xcb\xee\x8b\x85\x25\x07\xae\xc9\x23\xbe\x78\x8f\x64\x4a\x8e\x47\x3a\x3e\x49\xc7\x3e\x64\xee\x1b\x54\x9c\x3d\x82\xed\xed\xf7\x94\x90\x25\x86\x7e\xa4\x23\xd1\xbe\xb6\xf5\x71\x48\xae\xe6\x06\xa4\x20\xa6\xbf\x00\xbc\xf4\xac\x2f\x7c\x7c\x83\xf7\xef\x49\x55\x6e\x9e\xc3\x37\xcf\xff\xfe\xe2\xbb\x3d\x82\x91\x09\x49\xfc\x93\x14\xd7\xc9\x1d\xed\xee\x1e\x37\x6c\x1f\x5c\x6b\xae\xc2\x3b\xb3\xae\xc7\xc8\xaa\x5e\x26\x64\xc8\x66\x5e\xde\xa1\x05\x4b\x0e\x0a\xe4\xc1\xc0\xb7\xec\x17\xa6\x76\xa9\xac\x43\x55\xd2\x10\xe4\x6c\xb7\x32\xb9\x62\xec\x7a\x09\x93\xe7\x43\x28\x92\x8b\xb7\xb9\xfa\xfa\xfe\x26\xdb\x61\xb2\xb4\xf0\xfd\xf0\x81\x3d\xdc\x2d\xfa\x50\xe6\x38\x71\xe0\x4e\xba\x39\x37\x93\xa1\xf6\xa5\xb6\x7b\x47\xed\xa3\x95\xbd\x9f\x0b\x1c\x57\xc0\x8a\xcc\x67\xd3\x56\x2a\xf7\xe2\xdb\xfd\xf1\x95\x4a\x36\xbe\xc9\xe1\xd9\x1e\x91\x48\x69\x8f\x8c\x66\x14\xee\x4b\x3f\x32\x75\x55\x06\x1b\xee\xcc\x4a\x90\x82\x1b\xae\x99\x24\xb3\x9e\xda\xfc\xe8\x74\x90\x8b\xf9\x86\x17\x9f\xd8\xc4\x43\x6b\xc9\xfe\xc1\x68\xe1\x4b\x6e\xb9\xf5\x2c\xf4\x93\x72\x26\xcb\x75\x82\xe2\x3e\x36\xa0\x21\x4e\x52\x40\xf7\xec\xf4\xd5\xcc\x12\xc7\x1a\x42\x25\x55\x65\xd3\x95\xdc\xb0\x33\x81\xc4\x12\x7b\x37\xa7\x50\x4f\xc2\x04\x96\xce\x98\x60\x95\x95\x82\x0c\x09\x40\xa8\x3c\x1a\x54\x8e\x48\x30\xfd\x30\x04\x93\xec\x1a\xe5\x61\xdf\xbd\x77\x68\x8c\x50\x8d\x64\xc5\x26\xa6\x8e\x3f\x20\xf6\xeb\x41\x75\xf2\xec\xf9\xc1\x90\xaf\xe4\xf6\x0a\xb5\xe8\x78\x16\xcc\xe1\x3f\xd7\xaf\x47\xff\xc6\xd1\x6f\x37\xa7\xe9\x8f\x67\xa3\xef\xff\x3b\xcc\x6f\x9e\xae\xfd\xbc\x39\x7b\xf5\xd7\x3d\x9a\x22\x82\x1e\x99\x3e\xa9\x88\x74\x9d\x61\x17\xd1\x61\xa8\x30\x7a\x06\x57\x86\xa7\xd2\x73\xac\x2d\x0d\xe1\x5f\x2a\x94\x86\x2f\x74\x1a\x29\xdf\xec\xb7\x8e\xab\xf2\x80\x6f\xdd\xdd\x51\xac\x44\x82\x49\x87\x65\x92\xb9\x7b\x64\x82\xad\x8f\x73\x52\xe8\xc9\xf4\x6c\x9d\x69\xd6\xa6\x44\x08\x8c\xc7\x7d\x68\x96\x7a\xda\xac\xd4\xcd\x78\x6d\x8a\xe4\x66\xfa\x02\xd5\x12\x7a\x5a\x8b\x1d\xe8\xc3\x4c\xb7\x3c\x1e\x01\x96\x46\x5b\xbb\x1a\x83\x2d\xd4\xf2\x96\x60\xd5\xa6\x46\xb2\x2c\xa8\xc4\xd0\x7d\x9b\x42\x3a\x83\x66\xd9\x5b\x67\xa1\x44\x15\x86\x5a\x4b\x33\x5f\xc3\xa9\x25\x82\x4c\x69\x41\xdb\xec\x7a\x16\x39\x14\x0b\x59\x4b\xb7\x64\x96\x14\x54\x6a\x35\xab\x65\x6a\xfa\x1b\x1e\xca\x50\xb9\x08\x37\x43\x15\xdd\x83\x74\xd0\x70\x23\x49\x96\x45\x4e\x85\xb2\x93\xc9\xf3\x6f\x2e\x7d\x21\x74\x83\x52\x9d\x37\x6e\x7c\xf6\xea\xf4\x57\x8f\x35\x33\x8f\xf8\x11\x1b\x3a\x6f\xdc\xd9\xd7\x2b\x8b\x93\x17\x8f\x40\xd1\xe9\x75\xc4\xca\xcd\xe9\xf5\x28\xfd\xf5\xb4\x5b\x3a\x7b\x75\x3a\xcd\x0e\xee\x9f\x3d\xe5\x37\xac\x21\xf0\xe6\x7a\xd4\xc3\x2f\xbb\x79\x7a\xf6\x6a\x6d\xef\x6c\x1b\x8c\x5c\xb1\x64\x49\xaf\xcb\x52\xfb\x3f\x6d\xe6\xdc\x8d\xfd\xcf\x4c\xfb\x91\x02\xba\x79\x7f\x73\x6c\xdf\x31\xeb\x4b\x67\x53\xf9\x8c\x63\x7d\xcc\x8c\x44\x24\x4c\xb0\xce\xa0\xac\x63\x5a\x95\xce\x63\xbd\xf6\x7f\x02\x60\x97\xd6\x51\xf3\x95\x46\xfa\x3e\x8d\x8f\xe3\xf5\x71\xbc\x3e\x8e\xd7\x5b\xdf\xe7\xc7\xeb\xed\x61\xf4\x38\x89\x1f\x27\xf1\xfe\x3b\x4e\xe2\xc7\x49\xfc\x38\x89\x3f\x2a\x9a\xc7\x49\xfc\x38\x89\x6f\x7e\xc7\x49\x3c\xc9\x1c\x27\xf1\xe3\x24\xfe\x67\x4f\xe2\xb1\x4e\xe5\xe0\x8c\xef\x9a\x16\xeb\xb4\xe1\x26\x65\x63\xcd\x17\xab\xf0\xf6\x49\x98\x90\x0b\xbf\xff\x71\xf2\xbf\x00\x00\x00\xff\xff\x62\xf8\xf1\x09\x32\x25\x00\x00") func operatorsCoreosCom_operatorconditionsYamlBytes() ([]byte, error) { return bindataRead( @@ -159,12 +159,12 @@ func operatorsCoreosCom_operatorconditionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operatorconditions.yaml", size: 10575, mode: os.FileMode(436), modTime: time.Unix(1607975192, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operatorconditions.yaml", size: 9522, mode: os.FileMode(436), modTime: time.Unix(1607977324, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x5f\x73\xdb\xb8\x11\x7f\xf7\xa7\xd8\xf1\x3d\xf8\x32\x63\x4a\x4d\xda\x87\x8e\xde\x3c\x49\x7a\xe3\x36\xe7\x78\x6c\x5f\x5e\x6e\xee\x61\x45\xae\x44\x54\x20\xc0\x02\xa0\x64\x35\x93\xef\xde\x59\x80\xff\x45\xd2\x4a\xda\xbb\xf4\x81\x7c\xb1\x45\x02\x8b\xfd\xfb\xdb\x5d\x2c\xe6\xe2\x13\x19\x2b\xb4\x5a\x01\xe6\x82\x9e\x1d\x29\xfe\x65\x17\xbb\xbf\xda\x85\xd0\xcb\xfd\xeb\x8b\x9d\x50\xc9\x0a\xde\x16\xd6\xe9\xec\x81\xac\x2e\x4c\x4c\xef\x68\x23\x94\x70\x42\xab\x8b\x8c\x1c\x26\xe8\x70\x75\x01\x80\x4a\x69\x87\xfc\xda\xf2\x4f\x80\x58\x2b\x67\xb4\x94\x64\xa2\x2d\xa9\xc5\xae\x58\xd3\xba\x10\x32\x21\xe3\x89\x57\x47\xef\xff\xb4\xf8\xcb\xe2\xf5\x05\x40\x6c\xc8\x6f\x7f\x12\x19\x59\x87\x59\xbe\x02\x55\x48\x79\x01\xa0\x30\xa3\x15\xe8\x9c\x0c\x3a\x6d\xb6\x46\x17\xb9\x5d\x54\x3f\xed\x22\xd6\x86\x34\xff\xc9\x2e\x6c\x4e\x31\x9f\xee\xd7\x34\x5b\x3a\x6b\x02\xbd\x8a\x49\x74\xb4\xd5\x46\x54\xbf\x23\xd0\x32\xf3\xff\x05\xd1\x3f\x96\x14\x7e\x62\x82\xfe\xbd\x14\xd6\xfd\xe3\xf4\xdb\x07\x61\x9d\xff\x9e\xcb\xc2\xa0\xec\xb3\xeb\x3f\xd9\x54\x1b\x77\xd7\x1c\x1e\x81\xde\x86\x0f\x42\x6d\x0b\x89\xa6\xb7\xeb\x02\xc0\xc6\x3a\xa7\x15\xf8\x4d\x39\xc6\x94\x5c\x00\x94\xaa\xf3\x44\xa2\x52\x39\xfb\xd7\x81\x50\x9c\x52\x86\x81\x3a\x30\x31\x75\x73\x7f\xfb\xe9\xcf\x8f\x9d\xd7\x00\x09\xd9\xd8\x88\xdc\x79\x03\x74\xc4\x00\x61\xc1\xa5\x04\x85\x12\x0e\xf4\x06\xb2\x42\x3a\xe1\x48\xa1\x8a\x8f\xb0\xd1\x06\x3e\x7e\xf8\x19\x32\x54\xb8\xa5\xa4\xa5\xde\x9a\x32\xc0\xad\x63\xcb\x5b\x67\x50\xa8\x40\x4b\x28\xeb\x50\x4a\x6f\x5c\xa6\x59\x6f\x03\xa1\x40\x38\x1b\xec\xc1\xd2\x81\xd3\x80\xc0\x46\x14\x1b\xe1\x65\xad\x1e\x4b\x9e\x1d\x87\x66\x4b\xae\xd9\xd0\x3a\xd9\x1d\x59\x51\x7a\xfd\x4f\x8a\x5d\xfd\xd2\xd0\xbf\x0a\x61\x28\x69\x44\x8f\xa0\x72\xda\xfa\x55\x6e\x98\x23\x57\xfb\x40\x78\x5a\xe1\xd1\x7a\xdb\xd3\xdd\x15\xab\x37\xac\x82\x84\xe3\x82\x82\xc8\xa5\x89\x28\x29\x2d\xe2\x79\x4f\x85\x05\x43\xb9\x21\x4b\x2a\x44\x4a\x87\x30\xf0\x22\x54\xa5\x08\x0b\x78\x24\xc3\x64\xd8\x6b\x0a\x99\xb0\x52\xf7\x64\x1c\x18\x8a\xf5\x56\x89\x7f\xd7\xb4\x2d\x6b\x8d\x0f\x95\xe8\xc8\xba\x1e\x4d\xa1\x1c\x19\x85\x12\xf6\x28\x0b\xba\x06\x54\x09\x64\x78\x04\x43\x7c\x0a\x14\xaa\x45\xcf\x2f\xb1\x0b\xf8\x59\x1b\xb6\xda\x46\xaf\x20\x75\x2e\xb7\xab\xe5\x72\x2b\x5c\x05\x0b\xb1\xce\x32\x76\x8f\xe3\xd2\x47\xb8\x58\x17\x6c\xcb\x65\x42\x7b\x92\x4b\x2b\xb6\x11\x9a\x38\x15\x8e\x62\x57\x18\x5a\x62\x2e\x22\xcf\xba\xf2\xd0\xb0\xc8\x92\x1f\x4c\x09\x24\xf6\xaa\xc3\x6b\x30\xa0\x75\x46\xa8\x6d\xeb\x83\x8f\xc3\x09\x0b\x70\x2c\xb2\xd7\x62\xb9\x35\x48\xd1\x28\x9a\x5f\xb1\x76\x1e\xde\x3f\x3e\x41\x75\xb4\x37\x46\x5f\xfb\x5e\xef\xcd\x46\xdb\x98\x80\x15\x26\xd4\x86\x4c\x30\xe2\xc6\xe8\xcc\xd3\x24\x95\xe4\x5a\x28\xe7\x7f\xc4\x52\x90\xea\xab\xdf\x16\xeb\x8c\x5d\x9c\x1d\x91\xac\x63\x5b\x2d\xe0\xad\xc7\x4a\x58\x13\x14\x79\x82\x8e\x92\x05\xdc\x2a\x78\x8b\x19\xc9\xb7\x68\xe9\x77\x37\x00\x6b\xda\x46\xac\xd8\xf3\x4c\xd0\x86\xf9\xfe\xe2\x5e\xc0\x01\x54\x10\x3c\x62\xaf\x0e\xda\x3c\xe6\x14\x57\x88\xc3\xfb\x3c\xc2\xa0\xea\x41\x52\x65\xb4\xc5\x39\xc7\x8f\x85\xb3\x67\x8d\x24\xc5\x4e\x9b\xfe\xfb\x1e\x8b\x8f\xe5\xb2\x72\x7d\x60\xaf\xc3\xd2\x95\x9d\x42\xa2\x17\x39\x9c\xe6\xd2\x6b\x1c\x5d\x9c\xbe\x7f\x66\x4f\xb4\x4d\x46\x9d\xe4\xba\xbf\x25\xc4\x04\x67\x2b\xc6\x15\x89\x6b\x92\xb5\x02\x2a\x5c\xcc\xbc\x9b\x0f\xd2\x06\x78\x4a\xa9\xb3\x0e\xd0\x10\xdc\xdc\xbd\xa3\x64\x78\x47\x10\x17\x8d\xc1\xe3\xe0\x77\xe1\x28\x1b\x11\xa4\x27\xca\xcd\x04\xbb\x65\xa8\x57\x5f\x5c\x8a\xa7\xba\xad\x1e\x0e\x0f\x9f\x85\x02\xb0\x5d\x03\xc2\x8e\x8e\x01\x03\x19\x68\x4b\x93\x7a\x22\x60\xc8\xe3\xa7\x37\xf6\x8e\x86\x45\xe0\x87\x37\x97\x40\x39\xb2\x66\xd2\xee\xe1\x39\xcd\x4b\xdd\x27\x9a\x60\x21\xaa\x19\x1f\x59\x30\xed\x5a\xe1\xd9\xd1\x71\xfc\x63\xcf\x1c\x3b\x3a\x56\x41\x1a\xec\xc2\x2f\xbc\xce\x7c\xdc\x56\xa6\xc0\x3c\x97\x82\xfa\xa8\xda\x7d\x9c\x1e\x53\x1a\x8c\xc3\x4f\xf7\xa9\x84\x3f\x9b\xfd\xda\xcc\x0d\xb2\x07\x47\xb8\xb2\xc1\xe8\x1c\x2d\xa9\xc8\xc1\xe9\x49\xde\xb1\x2a\x42\xaa\x34\xf9\x09\xa5\x68\x15\x41\x3e\x3e\x6e\xd5\x35\xdc\x69\xc7\x7f\xde\x3f\x0b\xeb\xa6\xd5\xc1\xbe\xf4\x4e\x93\xbd\xd3\xce\xaf\xfe\xaf\x95\x13\x58\x3b\x5b\x35\x61\xb9\x0f\x29\x15\x22\x97\xe5\x6b\xe7\x51\xbb\x80\x5b\x2e\x5d\x68\x52\x8e\x5a\xc5\xc2\x72\x26\xd3\xa6\xd2\x81\xaf\x85\xc2\x21\x81\x7c\x56\x58\x9f\xf8\x94\x56\x11\x65\xb9\x3b\x4e\x89\x0c\xe5\xd9\x1d\xfa\x41\xad\x7c\x46\x5b\x73\xed\xa3\xa6\x55\xde\x61\x23\xb0\x00\x4f\x9c\xd5\xc3\x97\x50\xa3\x49\x2e\xb5\x21\x29\xbc\x22\x7c\x65\xc1\x7d\x82\x88\x27\x49\x67\x64\xb6\x04\x39\xe3\xf0\xcb\x86\x1c\xc7\xc9\xf0\x4c\xa2\x65\x9b\xd0\xa8\x47\xf8\x84\xf0\x81\x03\xf6\xec\xf4\x11\x56\x07\x88\xcd\x30\x67\x67\xf8\xcc\x88\xe9\xf5\xfa\x05\x72\x14\xc6\x2e\xe0\xc6\xf7\x2b\x72\xcc\x25\xda\x3b\x84\xf2\x76\x69\x13\x67\xba\xc2\x02\x03\xe0\x1e\x25\x23\x3a\x17\xfd\x0a\x48\x7a\x7c\x1f\x21\xca\xad\x48\x2f\xc1\x5d\xc3\x21\xd5\xd6\x83\x35\x6c\x04\x49\x5f\x05\x5e\xee\xe8\x78\x79\xdd\x71\x9a\x11\x8a\xbc\xf8\x56\x5d\x86\x6c\x70\xe2\xa7\x75\xea\xd0\x4a\x1e\xe1\xd2\x7f\xbb\x5c\x9c\xe4\xc4\x11\xda\x67\x65\xca\x89\x04\x81\x49\xe2\x1b\x6c\x94\xf7\x2f\x62\xf9\x84\x17\x58\x32\x7b\x11\xd3\x4d\x1c\xeb\x42\xf9\xc6\xf3\xc5\xca\xa7\xbf\xa1\x02\x7e\x4c\x32\xa1\x9a\xce\xac\x22\x0d\x18\x96\x0e\xf0\x76\x48\x45\x9c\xc2\x41\x48\xe9\x0b\x5d\x4b\x09\x1b\x3a\xa1\x5c\xea\x63\x6d\x9b\x1f\xed\xab\xe0\x23\xc2\x36\x41\xee\x7b\xdf\xb1\x72\x6a\x58\x50\x6e\xa7\xe2\x7b\xa3\xf7\x22\xa1\xe4\xe6\xfe\x76\x40\x5b\x5d\x41\xfd\x06\x70\x24\xa5\xf5\x2d\x2d\xd7\xe3\x4e\x97\xf5\xf8\x60\xc1\x97\xb7\xa8\x0f\x88\xdb\x5c\x7f\x8c\x30\xbe\xd6\x5a\x12\xf6\xbf\x86\x32\xb2\x6e\xef\x5f\xe2\xfb\xa9\xb7\xbc\x84\x6e\x7a\xce\xa5\x88\x85\xab\x32\x54\x53\x95\x0e\x27\xb5\x70\xaa\x87\x76\xe1\x2b\x2a\x4b\xee\xba\xa9\x7b\x85\x05\xb1\x55\xda\x0c\xf9\xef\x14\x7a\x8d\x62\xd6\x24\x52\x3d\x47\xbb\x62\x4d\x46\x91\x23\x1b\x71\xbd\x1a\x95\xcb\xa9\xd3\x56\x38\x74\x85\x3d\xbb\xb1\xf0\xab\xeb\xd6\x22\xfc\x1a\x6a\x2e\x1e\xbe\xae\xb7\x18\xae\xdb\x22\x90\x68\xdd\x2f\xa1\x97\x3b\xb3\x17\x69\xed\x78\xc1\xe6\x1f\x9a\x95\x01\x99\x5d\x75\x41\x16\x6e\x15\xc8\xd3\xf2\x6f\x87\x1c\x77\xc0\x1c\xa5\x3e\x0e\x68\xa1\x24\xfc\x55\xd1\x06\xac\xc9\x0c\xdd\x0a\x78\x6f\xc4\x07\xf7\x56\xa8\x73\xfd\xb9\xeb\xc9\xa1\x9c\x1c\xbe\xe8\xf1\xd6\x3b\x11\xef\xff\xc7\x3f\xe1\x04\x6f\x1f\x68\xf3\x55\x70\xfb\x40\x1b\x30\xb4\x21\x43\x2a\xa6\x4a\x19\x1d\x94\x1d\x4f\x19\x35\x30\xff\x4f\xbb\xd0\xb1\x2b\xb0\x41\x61\x6e\xee\x6f\xab\x6b\xaf\xca\x2f\x4b\x69\x46\xca\xda\x17\xca\x17\x9f\xd2\xef\xd1\xa5\x67\x9c\x7d\x75\x5b\xaa\xce\xd7\x6b\xfe\x12\x31\x17\x14\x53\xe7\x46\xcd\xdf\x43\x12\x26\xa0\x37\x63\x69\x5b\x01\x29\x27\x0c\x95\x3b\xae\x43\x62\x2a\xeb\xe1\xe6\x1e\x8e\x2b\x03\x40\x2e\x18\x44\x02\x7f\x7f\xfc\x78\xb7\xfc\x69\xac\x75\x08\x85\x09\xc6\x31\x59\xeb\xe3\xce\xd7\x0d\xd7\x60\x8b\x38\x05\xb4\x2c\x06\xe3\x09\xe3\x15\x2d\x32\x54\x62\x43\xd6\x2d\xca\x33\xc8\xd8\x5f\xdf\xfc\x36\x56\x4b\xfe\x4d\x1b\xa0\x67\xcc\x72\x49\xd7\x20\xca\x42\xb9\xba\xc3\x2a\xdd\xc8\x47\x15\xab\xa3\xa6\x08\x07\xe1\x52\x71\x9a\xa4\x4a\x0d\x40\xae\x93\x52\xec\x83\x17\xd7\xe1\x8e\x40\x97\xe2\x16\x04\x52\xec\x68\x05\x97\xec\x70\x2d\x36\x3f\x73\xa0\x7e\xb9\x1c\xa1\xfa\xe3\x21\x25\x43\x70\xc9\x8b\x2e\x03\x73\xf5\xa5\x25\xbf\xab\xfc\xa5\x61\x32\x74\x97\x46\x6c\xb7\x64\x7a\x90\xda\x3c\xfe\x06\x6e\x4f\xca\xbd\xe2\x6e\x40\x6c\x40\xe9\x16\x09\x55\x56\x2f\x4d\xcd\xd2\x67\xfa\xd7\x37\xbf\x8d\x72\xdc\xd5\x17\x08\x95\xd0\x33\xbc\xa9\x6b\x95\x5c\x27\xaf\xca\xb6\xc1\x1e\x95\xc3\x67\x3e\x29\xe6\x72\x74\x4c\xb3\xbe\x8e\x74\x1a\x52\xdc\x13\x58\x9d\x11\x1c\x48\xca\x28\x5c\x1a\x27\x70\x08\xad\x57\x65\xb8\xd0\x76\xe4\x68\xdc\xa4\xb7\x56\x57\xc5\x4f\x1f\xdf\x7d\x5c\x05\xce\xd8\xa1\xb6\x8a\xd9\xe1\x92\x66\x23\x14\xca\xb2\xc2\x15\xb6\x2e\x93\x47\x28\xda\x22\xb8\x8f\xd3\x10\xa7\xa8\xb6\x54\xd5\xef\x9b\xc2\x15\x86\x16\x57\xdf\x12\xc7\xa7\xf7\xb7\xd5\x33\x70\x8f\xdb\x07\x8e\xef\x76\x13\x7a\xa6\x70\x6a\xb0\xa6\x3e\x15\xee\xae\xe5\xe5\x93\xc2\x35\xa9\x86\xe5\x4b\x74\x6c\x59\xb4\x98\x72\x67\x97\x7a\xcf\xe9\x80\x0e\xcb\x83\x36\x3b\xa1\xb6\x11\xbb\x66\x14\x7c\xc0\x2e\x7d\xaa\x5c\xfe\xe0\xff\x7c\xb3\x2c\x3e\xd7\x9e\x2b\x50\x18\xd9\xfc\x01\x52\xf9\x02\x60\xf9\x4d\x42\x55\x77\xc7\xe7\xe7\xb1\xab\xc7\x00\x18\x71\x7f\x2f\x87\x45\x68\x6a\xca\x49\x4e\x89\xb1\xe3\xfd\x65\x86\x49\x80\x66\x54\xc7\xdf\xdd\x95\x59\xa1\x85\x61\x8e\x8e\x51\x39\x7a\x8d\x50\x25\xfc\xbf\x15\xd6\xf1\xfb\x6f\xd2\x60\x21\xce\x0a\xdf\x5f\x6e\xdf\xfd\x31\x0e\x5e\x88\xb3\x63\x95\xcb\x27\x4a\x56\xe0\x4c\x11\xac\x64\x9d\x36\xb8\xa5\xf6\x9b\x62\x5d\x8f\xa3\x2a\x31\xcb\x56\x03\x3e\x7f\xe9\x0c\x58\x51\xe6\x29\xbe\x09\xbb\xe6\x31\xeb\x3c\x66\xed\x3c\xf3\x98\x75\x1e\xb3\xce\x63\xd6\x92\xb5\x79\xcc\x3a\x8f\x59\xe7\x31\x2b\xcc\x63\xd6\x79\xcc\x3a\x8f\x59\xe7\x31\xeb\x3c\x66\x9d\xc7\xac\xf3\x98\x75\x1e\xb3\x7e\xaf\x31\xeb\x3c\x3a\x9d\x47\xa7\xdf\x63\x74\x3a\x8f\x43\xe7\x71\xe8\x90\x14\xf3\x38\x74\x1e\x87\xce\xe3\xd0\x93\x67\x1e\x87\xce\xe3\xd0\x79\x1c\x3a\x8f\x43\xbf\xc3\x38\x74\x83\xd2\x9e\x35\x0f\xfd\x4f\x00\x00\x00\xff\xff\xea\x89\x94\xf1\x34\x3c\x00\x00") +var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x4d\x73\x1b\xb9\xd1\xbe\xeb\x57\x74\x71\x0f\xb2\xab\x44\xf2\xb5\xdf\x1c\x52\xbc\xa9\x6c\x67\x4b\x89\x57\x56\x59\x5a\x5f\xb6\xf6\xd0\x9c\x69\x72\x10\x62\x80\x09\x80\x21\xc5\xb8\xfc\xdf\x53\xdd\xc0\x90\xc3\xe1\x87\x28\x25\xde\xf5\x61\xe6\x22\x11\x1f\x8d\xfe\xc2\x83\x07\x68\xac\xd4\x17\x72\x5e\x59\x33\x01\xac\x14\x3d\x06\x32\xfc\xcb\x8f\x16\x7f\xf5\x23\x65\xc7\xcb\x37\x17\x0b\x65\xf2\x09\xbc\xab\x7d\xb0\xe5\x67\xf2\xb6\x76\x19\xbd\xa7\x99\x32\x2a\x28\x6b\x2e\x4a\x0a\x98\x63\xc0\xc9\x05\x00\x1a\x63\x03\x72\xb3\xe7\x9f\x00\x99\x35\xc1\x59\xad\xc9\x0d\xe7\x64\x46\x8b\x7a\x4a\xd3\x5a\xe9\x9c\x9c\x08\x6f\x96\x5e\xfe\xdf\xe8\x2f\xa3\x37\x17\x00\x99\x23\x99\xfe\xa0\x4a\xf2\x01\xcb\x6a\x02\xa6\xd6\xfa\x02\xc0\x60\x49\x13\xb0\x15\x39\x0c\xd6\xcd\x9d\xad\x2b\x3f\x6a\x7e\xfa\x51\x66\x1d\x59\xfe\x53\x5e\xf8\x8a\x32\x5e\x5d\xc6\x6c\xa7\xec\x8c\x89\xf2\x1a\x25\x31\xd0\xdc\x3a\xd5\xfc\x06\x18\x82\xd5\xa5\xfc\x1f\x8d\xff\x94\x64\xfc\xcc\x22\xa5\x5d\x2b\x1f\xfe\xb1\xdf\xf7\x51\xf9\x20\xfd\x95\xae\x1d\xea\xae\xc2\xd2\xe5\x0b\xeb\xc2\xed\x76\x79\x59\x6e\x1e\xbb\x94\x99\xd7\x1a\x5d\x67\xde\x05\x80\xcf\x6c\x45\x13\x90\x69\x15\x66\x94\x5f\x00\x24\xf7\x25\x31\xc3\xe4\xa2\xe5\x9b\x24\xd5\x67\x05\x95\xd8\xac\x01\x2c\xd2\x5c\xdf\xdd\x7c\xf9\xff\xfb\x4e\x07\x40\x4e\x3e\x73\xaa\x0a\x12\x8c\x1d\x83\x40\x79\x08\x05\x41\x6d\x54\x00\x3b\x83\xb2\xd6\x41\x05\x32\x68\xb2\x35\xcc\xac\x83\x4f\x1f\x7f\x81\x12\x0d\xce\x29\x6f\xb9\x1a\x6e\x02\xc7\xde\x07\x87\xca\x44\x09\xca\xf8\x80\x5a\x4b\x78\x59\xd2\x66\x30\x28\x03\x2a\xf8\x18\x11\xb6\x0d\x82\x05\x04\x0e\xa3\x9a\x29\xca\xc1\x93\x2c\x1d\xd0\xcd\x29\x6c\x87\xf9\x51\xcb\x82\xb0\x66\xf7\xd8\xe9\x3f\x29\x0b\xad\x66\x47\xff\xaa\x95\xa3\xbc\x6d\x2c\xbb\xaa\x49\xda\x56\x73\xe5\x58\xa3\xd0\xca\x82\xf8\xb5\xb6\xc8\x4e\x7b\xc7\x6b\x97\xec\xda\x38\x0e\x72\xde\x1d\x14\xcd\x4e\x41\x62\x33\xc4\xed\x62\x49\xa1\x3c\x38\xaa\x1c\x79\x32\x61\xe3\x11\x34\xc9\x80\x11\xdc\x93\xe3\x89\x9c\x2b\xb5\xce\xd9\x95\x4b\x72\x01\x1c\x65\x76\x6e\xd4\xbf\x37\xd2\x3c\xfb\x8a\x97\xd1\x18\xc8\x07\x50\x26\x90\x33\xa8\x61\x89\xba\xa6\x2b\x40\x93\x43\x89\x6b\x70\xc4\x72\xa1\x36\x2d\x09\x32\xc4\x8f\xe0\x17\xeb\x38\x3a\x33\x3b\x81\x22\x84\xca\x4f\xc6\xe3\xb9\x0a\x0d\x00\x64\xb6\x2c\x39\xf8\xeb\xb1\xec\x65\x35\xad\x39\x66\xe3\x9c\x96\xa4\xc7\x5e\xcd\x87\xe8\xb2\x42\x05\xca\x42\xed\x68\x8c\x95\x1a\x8a\xb2\x46\x40\x60\x54\xe6\x3f\xb9\x04\x19\xfe\xb2\xe3\xbe\x18\x32\x1f\x9c\x32\xf3\x9d\x2e\xd9\x73\x27\x7d\xcd\x3b\x8f\x33\x13\xd3\xf4\x68\xcb\xd6\xa5\xdc\xc4\x5e\xf9\xfc\xe1\xfe\x01\x1a\x05\xa2\xdb\xa3\x87\xb7\x43\xfd\xd6\xd9\xec\x28\x65\x66\xe4\xe2\xc8\x99\xb3\xa5\x48\x21\x93\x57\x56\x99\x20\x3f\x32\xad\xc8\x04\xf0\xf5\xb4\xe4\xa4\xe5\x04\x23\x1f\x38\x0e\x23\x78\x27\xf8\x07\x53\x82\xba\xca\x31\x50\x3e\x82\x1b\x03\xef\xb0\x24\xfd\x0e\x3d\x7d\x77\x57\xb3\x47\xfd\x90\xdd\x77\xbe\xb3\xdb\xf0\xbd\x3f\x61\x6f\x43\x01\x34\xf0\x7a\x34\x3a\x3b\xf8\x71\x5f\x51\xd6\x60\x08\xcf\x14\xcc\x40\xd3\x01\x99\x26\x44\xa3\x73\x95\x38\xbe\x5d\x45\x45\xd2\x94\x05\xeb\xf6\x7b\x3a\xaa\xde\xa7\x81\x69\x46\x54\x73\x47\xb5\x4b\x7f\x1a\x77\xce\xd0\xf4\x29\x6d\x25\x0a\x18\xb2\xe2\xc3\x23\xe7\x64\x0b\xd2\x9f\xd0\xbe\x3b\x29\xee\x08\x3e\x99\x18\x4d\x34\x4e\x49\x6f\x5c\xd1\x20\x61\x19\x53\xfe\xa1\xa0\x9d\x16\x40\x47\x70\x7d\xfb\x9e\xf2\x43\xc6\x6d\x0d\x44\xe7\x70\x7d\x64\x84\x0a\x54\x1e\x55\xbc\xa3\xfa\xf5\x09\xf5\xd2\xc6\x6e\x7a\x42\x81\x72\x96\x04\x39\x49\x22\x68\x5d\x01\xc2\x82\xd6\x11\xdf\x18\x36\x53\xc8\xe2\x60\x47\x82\x86\x12\xcc\x05\xad\x65\x50\x02\xbb\xa3\xda\x3d\x11\xbf\xf8\x1d\x3e\x4d\x76\xbf\x21\x2f\x79\xb2\xbf\x51\xf6\xe8\xa0\xa7\x92\x25\x7e\x0b\x5a\x9f\xea\xee\x38\x9c\xfd\x90\xb6\x61\xf4\x3c\x37\x88\xb7\x64\x67\x36\xce\xc6\xaa\xd2\x8a\x04\xcd\x4e\xca\x3e\x0a\x27\xbb\x5f\x63\xea\x33\x14\xdd\x84\x72\x8b\xd0\x31\xd8\x97\x3e\x06\x96\x33\xbd\x50\x55\x22\x09\x91\x1a\x34\x47\xd9\x17\xd4\xaa\x45\x43\x24\xab\x6f\xcc\x15\xdc\xda\xc0\x7f\x3e\x3c\x2a\x86\x6a\xce\x87\xf7\x96\xfc\xad\x0d\xd2\xf2\x3f\x31\x35\xaa\xf0\x0c\x43\xe3\x04\x49\x76\x13\xf7\x15\x5b\xd2\x3e\xcf\x98\x46\xcd\x24\x3e\x1b\xa7\x28\xcf\x27\x8a\x75\x8d\x45\xc2\x30\xa2\xa0\x28\xa2\xac\xbd\x1c\x40\xc6\x9a\x21\x95\x55\x58\x1f\x94\x91\x1c\x61\xdd\x8e\x1f\x4e\x88\x4b\xa2\x1e\xf8\x5c\x8c\x3d\x91\xc1\x68\xa6\xa2\x90\xd7\xa2\xb4\x9c\xc6\xcc\xa5\x55\x06\x25\xb9\x39\x41\xc5\x08\x75\x8e\x7b\x4f\xe1\x4a\xfc\x9e\x40\x97\x33\x63\x25\x90\xf9\x91\x37\xc0\x33\x20\x36\x8e\x8f\xb0\x54\x62\xc5\x61\xfa\xca\xe8\x23\x9e\xfa\x06\x15\x2a\x66\xbc\xd7\xc2\xde\x35\xed\xf4\x29\x23\x3e\x6d\x8b\x61\x09\xca\x03\x43\xc9\x12\x35\xe3\x1d\x67\xb2\x01\xd2\x11\xfd\x98\x64\x77\x80\xfd\x0a\x56\x85\xf5\x11\xcc\x66\x8a\xb4\x70\x9f\xc1\x82\xd6\x83\xab\xbd\xd0\x0e\x6e\xcc\x20\xe2\xe2\x5e\x30\x37\x20\x6a\x8d\x5e\xc3\x40\xfa\x06\x2f\x3f\x0b\x4e\x82\x25\xe6\xb9\x5c\x0f\x51\xdf\x9d\x81\x66\x27\xe3\xe6\xc9\x2d\x55\x46\xd7\x59\x66\x6b\x23\x17\xa7\x33\xce\xf5\xee\x94\x06\xfc\x30\x2f\x95\xd9\xb9\x5b\xc8\x48\xc0\x38\x14\x56\x85\xca\x0a\x58\x29\xad\x85\xc6\x79\xca\x39\x3c\x39\x55\xda\xae\x37\x7e\x7e\xe5\x5f\xc7\xc8\x32\x9f\x6c\x7c\x2f\x37\xb5\xe3\xd4\xe0\x98\x71\x4c\xff\xb3\x3b\x67\x97\x2a\xa7\xfc\xfa\xee\xe6\xa0\x97\x76\x8d\x93\x29\x10\x48\x6b\x2f\xd7\x2f\xe6\x9c\xc1\x26\xce\x79\x90\xc2\x54\x2d\xf9\xad\x4b\xfa\x51\x65\xa7\xd6\x6a\xc2\xfd\xfe\x48\x85\x36\x97\xd0\xa7\x75\x7d\xe8\x4c\x48\x70\x47\x8f\x95\x56\x99\x0a\x0d\x7e\x6f\xb9\x95\xdc\x67\x64\x92\x00\x97\x12\x36\xe0\x29\x5c\x6d\xb9\x9a\xf2\xa0\xe6\xc6\xba\xc3\xf9\x79\x1a\x4f\x4e\xa0\xc8\x13\xd8\xf1\x38\x5c\xd4\x53\x72\x86\x02\xf9\x21\x73\xac\x61\x9a\x40\x1d\x7a\x1c\x30\xd4\x7b\x4b\x9c\x20\xc8\x32\x7e\x43\x91\xe3\xaf\x43\x24\xf9\xf3\xf3\x39\xf2\x71\xbe\x32\x04\x8d\x3e\xfc\x1a\x6f\x29\xcf\x60\xd6\xad\x59\x4f\xc6\xfe\xe3\x76\x6c\xc4\xce\xd0\x3c\xea\xc4\x3b\x30\x89\x34\x69\x3d\x98\xb4\xc9\x17\x2b\xf4\x90\xc4\x3c\x7b\x77\x01\x7b\xb2\xc4\x30\x01\x9e\x3f\xe4\xa5\xf6\xc6\x98\xf3\xb3\x79\x37\x8f\x23\x71\x3a\xfc\x34\x21\x11\xdc\x33\xea\x47\xcc\x57\xd8\x43\xd8\xcf\x34\x7b\x26\xc0\x7e\xa6\x19\x38\x9a\x91\x23\x93\x51\xe3\x98\x5d\x5c\x4d\xd7\xee\x0d\xf0\x7e\x87\x3b\xd4\xf1\x87\x9a\x83\x26\x5c\xdf\xdd\x34\x8f\x33\x4d\x3e\x26\x1b\x8e\x12\xc2\x27\xe9\x85\x1c\xce\x77\x18\x8a\xb3\x34\xb8\xbc\x49\x6e\x13\xf6\x24\x7c\xb6\x52\x94\xd1\xce\x5b\x90\xbc\x9b\x11\xe6\xa9\x91\x6f\xfb\x8e\x52\xdf\x55\x3c\x82\x12\x67\xdc\xbe\x15\xf1\x29\x0f\xc8\x87\xbf\xca\xe1\xef\xf7\x9f\x6e\xc7\x3f\xdb\x44\x1c\x30\xcb\xc8\xc7\xbd\x25\xa7\xfd\x15\xf8\x3a\x2b\x00\x3d\xab\xc6\x58\xc1\x78\x44\xa3\x12\x8d\x9a\x91\x0f\xa3\x24\x8d\x9c\xff\xed\xed\xef\x23\xf8\x9b\x75\x40\x8f\x58\x56\x9a\xae\x40\x25\x62\xd9\xbc\xa8\xa4\x04\x90\xbd\xc1\xc6\x6c\xe6\xc2\x4a\x85\x42\x54\xaa\x6c\x9e\x94\x5e\x89\xb2\x01\x17\x04\x36\x29\x5b\x13\x68\xb5\xa0\x09\x0c\x38\x4d\x5a\x4b\x7f\xe5\x8d\xf5\x6d\x00\xaf\x56\x05\x39\x82\x01\xff\x1c\xc4\x05\x37\x0f\x60\xdc\xd6\xc4\x71\xbb\x70\xbc\xe1\x38\x35\x9f\x93\xa3\x48\x89\x68\x49\x26\xbc\x66\xee\xab\x66\x60\x6c\x6b\xb0\x49\x3c\x61\xcb\x0e\xba\x8a\xfc\xf6\xf6\xf7\x01\xbc\xda\xb5\x0b\x94\xc9\xe9\x11\xde\x6e\x18\x41\x65\xf3\xd7\x89\x2a\xfb\xb5\x09\xf8\xc8\x32\x33\x26\x70\x26\x32\xaf\x60\xa1\xc0\x25\x81\xb7\x25\xc1\x8a\xb4\x1e\xc6\x07\xc3\x1c\x56\xf1\x12\xd0\xb8\x32\x92\xea\x0a\x5d\xe8\x3c\x0f\x3e\x7c\x7a\xff\x69\x12\x57\xe3\xb0\xcd\x0d\x2f\xc1\x34\x60\xa6\x0c\xea\xc4\xfe\x94\xdf\x92\x45\x5f\xc7\x20\x05\x0b\x59\x81\x66\x4e\x0d\x33\x9d\xd5\xa1\x76\x34\xea\x3e\x17\x9d\x9d\xf1\x87\xde\xea\x0e\x27\xbb\xbc\xd9\x75\x37\xda\x9f\xf8\x22\x76\xb6\x89\xe6\x08\xe3\xdc\x37\xf1\xb6\x95\x83\x27\x4d\xdc\x42\x33\x5b\x99\xdb\xcc\xb3\x81\x19\x55\xc1\x8f\xed\x92\xa1\x93\x56\xe3\x95\x75\x0b\x65\xe6\x43\x4e\xb2\x61\x8c\xbc\x1f\xcb\x11\x33\xfe\x49\xfe\xfc\x57\x16\xc9\x39\x75\xbe\x59\xf1\x61\xfe\x0f\xb0\x4d\x8e\xcf\xf1\x8b\x4d\x6b\x5e\x12\x9f\x73\x12\x5c\xde\xc7\x0d\x9f\x75\x67\xf3\x76\x89\x17\x82\xf4\x62\xdf\x42\xb8\x12\xf3\x08\x81\x68\xd6\xdf\x3d\x8d\xd9\x81\xb5\xe3\xb5\xd7\xc3\x54\x52\x1b\xa2\xc9\xf9\x7f\xaf\x7c\xe0\xf6\x17\x7b\xac\x56\x67\x6e\xe0\x5f\x6f\xde\xff\x31\xc9\x5d\xab\x67\xed\x56\xa6\x1a\x94\x4f\x20\xb8\xba\x61\x77\x3e\x58\x87\x73\xda\x6d\xab\xa7\x9b\x52\xc4\xd6\xe0\x44\xd7\xe1\xeb\xb7\x4e\x11\x0d\x75\x55\xe0\xdb\xbe\x94\xb6\xf9\xfa\x52\x5a\x5f\x4a\xeb\x4b\x69\x7d\x29\xed\x88\xaa\x7d\x29\xad\x2f\xa5\xb5\xcd\xeb\x4b\x69\x7d\x29\xed\x85\xa6\xf6\xa5\xb4\xbe\x94\xd6\x97\xd2\x36\x5f\x5f\x4a\x3b\xd3\xb8\xbe\x94\xf6\xa3\x97\xd2\xfa\xe2\x58\x5f\x1c\xfb\xf3\x8b\x63\x7d\xb9\xab\x2f\x77\xf5\xe5\xae\xbe\xdc\xf5\x82\x8c\xef\xcb\x5d\x7d\xb9\xab\x2f\x77\xf5\xe5\xae\x1f\xb4\xdc\x35\x43\xed\xcf\xae\x77\xfd\x27\x00\x00\xff\xff\x7a\x78\xa8\xab\xfc\x37\x00\x00") func operatorsCoreosCom_operatorgroupsYamlBytes() ([]byte, error) { return bindataRead( @@ -179,12 +179,12 @@ func operatorsCoreosCom_operatorgroupsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operatorgroups.yaml", size: 15412, mode: os.FileMode(436), modTime: time.Unix(1607975192, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operatorgroups.yaml", size: 14332, mode: os.FileMode(436), modTime: time.Unix(1607977324, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5a\xcd\x92\xdb\xb8\x11\xbe\xcf\x53\x74\x69\x0f\xb3\x5b\xa5\x9f\xd8\xc9\x21\xa5\xdb\xd4\xd8\x9b\x52\xb2\xb1\x5d\x9e\xb1\x2f\x5b\x7b\x68\x91\x2d\x11\x11\x09\x70\xd1\xa0\x34\x8a\xcb\xef\x9e\x6a\x80\xa4\x48\x4a\x22\x39\xf1\x78\x17\x97\x91\x20\xa0\xd1\x5f\xff\x37\x30\x98\xab\xcf\x64\x59\x19\xbd\x04\xcc\x15\x3d\x39\xd2\xf2\x8d\xe7\xbb\xbf\xf3\x5c\x99\xc5\xfe\xd5\xcd\x4e\xe9\x78\x09\xf7\x05\x3b\x93\x7d\x24\x36\x85\x8d\xe8\x0d\x6d\x94\x56\x4e\x19\x7d\x93\x91\xc3\x18\x1d\x2e\x6f\x00\x50\x6b\xe3\x50\xa6\x59\xbe\x02\x44\x46\x3b\x6b\xd2\x94\xec\x6c\x4b\x7a\xbe\x2b\xd6\xb4\x2e\x54\x1a\x93\xf5\xc4\xab\xa3\xf7\x7f\x99\xff\x6d\xfe\xea\x06\x20\xb2\xe4\xb7\x3f\xaa\x8c\xd8\x61\x96\x2f\x41\x17\x69\x7a\x03\xa0\x31\xa3\x25\x98\x9c\x2c\x3a\x63\x79\x7e\xfa\x14\x19\x4b\x46\xfe\x64\x37\x9c\x53\x24\x07\x6f\xad\x29\xf2\xe6\xea\xc6\x9a\x40\xaa\xe2\x0f\x1d\x6d\x8d\x55\xd5\xf7\x19\x98\x34\xf3\x9f\x02\xea\xf7\x25\x05\x3f\x95\x2a\x76\xff\x6a\x4d\xff\xa2\xd8\xf9\x9f\xf2\xb4\xb0\x98\x36\x4e\xf4\xb3\xac\xf4\xb6\x48\xd1\x9e\xe6\x6f\x00\x38\x32\x39\x2d\xe1\x3e\x2d\xd8\x91\x4c\x94\x52\xf0\x1c\xcc\x4a\x9c\xfb\x57\x81\x40\x94\x50\x86\x81\x35\x10\x22\xfa\xee\xc3\xea\xf3\x5f\x1f\x5a\xd3\x00\x31\x71\x64\x55\xee\xbc\x2c\x2b\xde\xc0\x52\x6e\x89\x49\x3b\x06\x84\x28\x1c\x57\x33\x32\xaf\x37\xbb\xa3\xb0\x63\xd6\xff\xa1\xc8\xd5\x93\xb9\x95\x85\xae\x96\x4b\x18\x0d\x6b\x69\xcc\x76\xce\xbf\x15\x16\xc3\x2a\x88\xc5\x4c\x88\xc1\x25\x54\xc1\xa4\xb8\x44\x05\x66\x03\x2e\x51\x7c\xe2\xd3\x6b\xbe\x45\x18\x64\x11\xea\x92\xbb\x39\x3c\x90\x15\x32\xc0\x89\x29\xd2\x58\xac\x6b\x4f\xd6\x81\xa5\xc8\x6c\xb5\xfa\x6f\x4d\x9b\xc1\x19\x7f\x68\x8a\x8e\xd8\x75\x68\x2a\xed\xc8\x6a\x4c\x61\x8f\x69\x41\x53\x40\x1d\x43\x86\x47\xb0\x24\xa7\x40\xa1\x1b\xf4\xfc\x12\x9e\xc3\xbf\x8d\x25\x50\x7a\x63\x96\x90\x38\x97\xf3\x72\xb1\xd8\x2a\x57\x79\x49\x64\xb2\xac\xd0\xca\x1d\x17\xde\xe0\xd5\xba\x10\x1b\x58\xc4\xb4\xa7\x74\xc1\x6a\x3b\x43\x1b\x25\xca\x51\xe4\x0a\x4b\x0b\xcc\xd5\xcc\xb3\xae\xbd\xa7\xcc\xb3\xf8\x07\x5b\xfa\x15\xdf\xb6\x78\x0d\xba\x61\x67\x95\xde\x36\x7e\xf0\xb6\xd9\xa3\x01\x31\x52\x50\xa2\xf6\xb0\x35\xa0\x38\x09\x5a\xa6\x44\x3a\x1f\xdf\x3e\x3c\x42\x75\xb4\x57\x46\x57\xfa\x5e\xee\x0d\x4b\x3a\xa9\x40\x04\xa6\xf4\x86\x6c\x50\xe2\xc6\x9a\xcc\xd3\x24\x1d\xe7\x46\x69\xe7\xbf\x44\xa9\x22\xdd\x15\x3f\x17\xeb\x4c\x39\xd1\xfb\xef\x05\xb1\x13\x5d\xcd\xe1\xde\x87\x0e\x58\x13\x14\x79\x8c\x8e\xe2\x39\xac\x34\xdc\x63\x46\xe9\x3d\x32\x7d\x77\x05\x88\xa4\x79\x26\x82\x1d\xa7\x82\x66\xd4\xeb\x2e\xee\xf8\x12\x40\x15\x96\xae\xe8\xab\xf2\xd8\x87\x9c\xa2\x96\xcb\xc4\xc4\xca\x8a\x51\x3b\x74\x24\xae\xd0\x0a\x47\x43\x87\x3a\x74\x05\x8f\x39\xd6\x2f\x6c\x1d\x6c\xd6\x2c\x6a\x6e\x9c\x8c\xfa\xf2\xe1\xe0\xbd\x47\xd4\x19\x99\x2c\x37\x5a\x8c\x64\x0c\x77\xd7\x42\x0c\xf8\xa4\x51\x51\xea\xfe\xd2\x41\x70\x5f\x2f\x2c\xe7\xd7\xc4\xb5\x3d\x0b\x12\x74\x81\x18\x53\x80\x75\x16\xfc\x06\xb9\x94\x21\x86\x2a\x7a\x38\xe7\x66\x06\x29\xae\x29\x7d\xa0\x94\xa2\x73\xc9\xf4\x61\x94\xd1\xda\x7b\x69\x41\x07\xee\x2f\xcd\xf5\xc1\xbf\x3d\x09\xf8\xbd\x20\x7b\x04\xb3\x27\x2b\x2e\x4f\x4e\x14\x56\x8b\xe1\x22\x5d\x80\x82\x29\x96\x28\xc9\x9e\x5e\x4b\x3c\xb7\x57\x95\x39\x4a\x5c\xc3\xc0\x65\x64\xe8\xa2\xe4\xed\x93\x04\x16\x3e\xd5\x0b\x83\x32\xe8\x6e\x2b\xc5\xa0\xd8\x83\x0e\xe2\xe0\x6b\xea\x38\x8d\x52\xa5\x59\x88\x69\x8f\x09\xb5\x66\x00\x2d\xc1\xdd\xbb\x37\x14\x9f\x5b\x4a\x5b\x04\x68\x2d\x1e\xaf\xae\x51\x8e\xb2\x1e\x60\x1d\x68\x77\x1d\xf6\x9b\x2c\x95\xd1\x7c\x18\x18\x54\x56\xaf\x1d\x2a\xcd\x65\xfe\x9a\x02\xc2\x8e\x8e\x21\xd5\x49\x3e\xad\x6a\x04\xbf\xd8\x92\x4f\x93\x03\x54\x49\x28\x78\x02\x65\x4e\xec\x59\x3f\x68\x1f\x61\x5c\x77\xac\xd3\x98\xc9\xb1\xbd\xbf\x9b\xcb\x71\xa9\x39\x86\xcd\x31\x8c\x1d\x1d\xfb\x17\x74\x54\x26\x12\x51\x5c\x56\x1a\xa2\x3b\x99\xf0\x32\x95\xa9\x51\xea\x02\x5f\x57\xe5\xa9\x22\x9f\x08\x07\xd6\x5e\xc9\x46\xe7\xa3\x12\xca\xb3\xe0\x98\x8b\xa5\xe3\x8e\x8e\xb7\x1c\x8c\x44\x3c\x2e\x51\xf9\x20\x20\x67\x4e\x81\xa8\xaa\xa0\x3e\x63\xaa\xe2\x53\x81\xec\x7d\x6c\xa5\xa7\xf0\xce\xb8\x95\x9e\x0e\x92\x7c\xfb\xa4\xa4\x56\x10\xfb\x7b\x63\x88\xdf\x19\xe7\x67\x5e\x4c\x60\x81\xcd\x67\x89\x2b\x6c\xf1\xae\xa9\x43\x24\x10\xbc\xcd\x92\x8b\xe7\xb0\xda\x0c\x4b\xab\x11\x7b\x85\xda\x4a\x83\xb1\xa5\x5c\x42\xe9\x1c\x0e\x0a\x47\x64\xc5\x59\x41\x7b\x3e\xd6\x04\xda\xe8\x19\x65\xb9\x3b\x0a\x0f\x67\x67\x94\xe2\x34\xb6\x25\xcd\x61\x35\x5c\x64\x47\x8e\x2b\x8f\x7a\x94\x62\x30\xfc\x12\x4a\xfb\x14\x23\x8a\x07\xc9\xc6\x85\x17\x9a\x2f\x58\xa5\x25\x53\x11\x64\x64\xb7\x04\xb9\xc4\xfb\x71\x4a\xee\x8f\xc5\x61\x0c\x46\xe4\x26\xc1\x5e\xab\xf1\x89\xc8\x67\xe4\x67\xa5\xae\xb0\x23\x84\xf3\x0c\x73\x31\x98\x2f\x12\x99\xbd\x4c\xbf\x42\x8e\xca\xf2\x1c\xee\x7a\x38\x94\xa6\x32\xa5\xd6\x2e\xa5\xbd\x5e\x9a\x07\x08\x6d\xc5\x20\x01\x76\x8f\xe9\x79\x11\xde\x42\x6b\xc4\x80\x29\x0d\x99\xc6\x6c\xce\x92\xec\x14\x0e\x89\xd4\x50\x12\xdd\x36\x8a\x52\xdf\x5c\x4c\x76\x74\x9c\xf4\x19\x4c\xd7\xe4\x26\x2b\x3d\x09\x19\xe8\xcc\x88\xea\x74\x65\x74\xda\xa7\xc2\x89\xdf\x35\xf9\x96\x8c\x3d\x90\x94\x30\x8e\xfd\xb5\x06\xa6\x1f\x46\xe5\x8c\x01\x4b\xb1\xb4\xb9\xb2\xbd\x65\x1a\x1f\x69\x13\x20\x34\xca\xb7\x0d\x59\xd2\xbe\x8c\x35\x57\xab\xb3\x2b\x8c\xd5\xb5\xdf\xb4\xcc\x41\x14\xc3\x41\xb9\xa4\x5d\x41\x5e\x96\xd4\x90\x2f\xf5\x7a\x50\x1b\x94\x8a\x92\x8f\x15\x8c\x60\xf1\x35\xaa\x90\x21\x2a\x3e\xa7\x40\xda\xaa\x28\xe9\x09\x14\x9e\x7d\x69\x33\x42\x5b\x23\x16\x13\x14\x75\xb5\x0e\x19\xa1\xee\x31\x65\xc1\xb5\x3b\x8f\x1e\xe0\x77\x1f\x56\xd5\x6d\x47\xb8\xe4\xa0\x0a\x78\x6f\xba\x1a\x95\xaa\x4e\xb8\x47\xb3\x73\x5f\x6f\x69\xe6\xf5\xd3\xed\xc8\xa9\xc9\x73\x09\xf5\x86\xc6\xda\xee\x86\x61\x0c\x05\xe3\x11\x81\xf8\x32\x88\x13\x86\x26\x04\xdc\xa3\x4a\x71\x9d\xf6\xf3\x0f\x65\x63\x1b\x0a\x99\xb2\xad\xad\x41\xdd\x06\xe3\xa2\xfe\x6c\x33\xb2\xb4\x1d\x57\xdc\x4a\xf9\x1a\x0c\x7a\x60\x91\x9c\xda\xbb\x64\x6c\x85\x2b\x5d\x27\xbb\x47\x8b\x9a\x55\x75\xd1\x3a\x9c\x0f\x3b\x6d\x28\x3b\x70\x2a\x0b\x3d\x75\x6d\x90\xe0\x6a\xa2\x23\x12\x3e\x84\x1b\x23\xa3\xa9\xf2\x68\x9f\x85\x8c\x4b\xe8\x4a\x60\x6a\x8e\xd1\x55\x9d\x3f\xc8\xd8\x0c\xdd\x12\x62\x74\x34\x13\xbe\x47\x08\xe8\x93\xbf\x84\x7a\x41\xe1\x1c\x90\x45\x47\xeb\x11\xa2\xf9\xae\xe0\x32\x62\xc6\xed\x73\x51\xdd\x41\x52\x64\x28\xbe\x87\xb1\x78\x59\x45\x06\x94\x8e\x55\x84\xfe\x42\x31\x26\x87\x2a\xed\x37\xe4\x30\x70\x6d\x8a\xe0\xbd\x27\x93\x79\x51\x9d\x5b\x42\xee\x8f\xd7\x17\x30\x86\x92\x42\x36\x8a\x50\xdb\xea\xbb\x65\x6f\x15\xdf\x8b\xdf\x4b\x57\x75\x83\xfc\x96\xd7\x76\x65\x82\xa9\x59\x9d\x7a\x9f\x32\x1b\x78\xb4\x05\x0d\xd7\xf3\x00\x3f\x63\xca\x34\x85\x4f\x7a\xa7\xcd\xe1\x65\x71\xf9\xa5\xcf\xd4\xc2\x31\xf7\xdc\xd7\x78\x5e\x88\x21\x5f\xb6\x7e\x40\x97\x8c\x4e\x9b\xb7\xab\xb2\x0a\xf3\x9d\x89\xaf\x57\x72\x45\x11\xb5\x9e\x24\x40\x69\x76\x84\xfd\x4e\x1d\x36\x90\x76\xca\x52\xb9\x6f\x1a\x6e\xcd\xcb\x5e\xf1\xf4\x9c\x21\x55\x30\xa0\x14\xc7\xaa\x9f\xe6\x3f\x1f\xde\xbf\x5b\xfc\xc3\x94\xe5\x38\x46\x11\x71\x99\xbe\xa4\x1e\x9e\x02\x17\x51\x02\xc8\xd5\x15\xf2\x83\x4f\x6c\x19\x6a\xb5\x21\x76\xf3\xf2\x24\xb2\xfc\xeb\xeb\xdf\xfa\x25\xfc\xb3\xb1\x40\x4f\x98\xe5\x29\x4d\x41\x95\x8d\x64\xf5\x2c\xd0\x28\xee\xbc\x80\x6a\xba\xbd\x24\xa5\x96\xf3\x30\x73\x13\x97\x82\x38\x78\x01\x38\xdc\x11\x98\x52\x00\x05\x41\xaa\x76\xb4\x84\x09\xe7\x14\x35\x58\xfe\xa2\x31\xa3\xaf\x93\xde\x23\x7e\x3c\x24\x64\x09\x26\xb2\x74\x12\x18\xad\x0b\x69\x99\x6b\xb8\x4d\xa0\xea\x6f\x6d\xfa\x13\xbf\x55\xdb\x2d\x59\x0a\xed\x0b\xed\x49\xbb\x9f\xa4\x7f\x56\x1b\xd0\xa6\x41\xc8\x93\x17\xdd\xe6\x14\xa9\x8d\x1a\x08\xf8\x5d\x70\xbf\xbe\xfe\x6d\x02\x3f\x9e\xa8\x85\xba\x57\xc7\xf4\x04\xaf\x43\x9f\xa7\x58\xe4\xf6\x53\xbf\xd6\x7c\x1b\xce\x47\xed\xf0\x49\x78\x89\xa4\x7d\xd3\xbe\xbb\x12\x29\x24\xb8\x27\x60\x93\x11\x1c\x28\x4d\x67\xe1\xe6\x3f\x86\xc3\x40\xfb\xdc\x68\x4b\x42\xb3\x9e\xa3\x75\x9d\x17\xba\xc7\xf7\x6f\xde\x2f\x03\x97\x62\x7a\xdb\xee\x7b\x5e\x7b\x28\x06\x6d\x1c\x6c\x94\xc6\xb4\xec\x0c\x15\x9f\x5a\x4c\x2e\x82\xa1\x39\x03\x51\x82\xda\xe7\x9b\xc1\x22\x75\x53\xb8\xc2\xd2\xfc\xf6\x5b\x2b\xed\xf3\x47\xb6\xf6\xb8\xf0\xe4\xd6\x2d\xf6\xff\xb4\x47\xab\xff\x03\xae\x7f\x77\x1e\x0d\xf7\x5d\xc3\x87\x7a\xe1\xee\x8a\x35\x59\x4d\x8e\x3c\xe2\xd8\x44\x2c\x60\x23\xca\x1d\x2f\xcc\x9e\xec\x5e\xd1\x61\x71\x30\x76\xa7\xf4\x76\x26\xc6\x3e\x0b\x96\xc4\x0b\xff\x4a\xbf\xf8\xc1\xff\x79\x11\x74\x9c\x63\xf4\x4c\x88\x7e\xcb\x1f\x81\x53\xce\xe1\xc5\x37\xc3\xac\x1a\xea\xe7\x76\xac\xb7\x0f\x21\x58\x45\x5d\x0a\xe2\x7a\x87\x44\x45\x49\xf5\x54\x5f\x46\xfc\x21\xaf\xce\x30\x0e\xe9\x02\xf5\xf1\xbb\xbb\x81\x08\xba\xb0\xc2\xd7\x71\x56\xfe\xc3\xc9\x0c\x75\x2c\x9f\x59\xb1\x93\xf9\x6f\x96\x6c\xa1\x9e\x11\x0c\x3e\xad\xde\xfc\x31\xce\x51\xa8\x67\x7a\x7e\x78\xd6\x5d\x82\xb3\x45\xd0\x21\x3b\x63\xa5\x1f\x68\xcc\x14\xeb\xfa\xfe\xa8\x82\x5c\x16\xa8\xf0\xe5\xeb\xcd\xff\x02\x00\x00\xff\xff\x6a\x2b\xc9\xf4\x32\x24\x00\x00") +var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x73\xdb\xb8\x11\x7f\xf7\xa7\xd8\xd1\x3d\xf8\x6e\x46\x7f\x9a\xb4\x0f\x1d\xbd\x79\xec\x5c\xc7\xed\xd5\xc9\xc4\x4e\x5e\x6e\xee\x61\x45\xae\x44\x54\x20\xc0\xc3\x82\x92\xd5\x4c\xbe\x7b\x67\x01\x50\x22\x25\x59\xa2\x52\xe7\x5a\xbc\x48\x04\x81\xc5\xfe\xfd\xed\x2e\x88\x95\xfa\x4c\x8e\x95\x35\x53\xc0\x4a\xd1\xb3\x27\x23\x4f\x3c\x5e\xfe\x95\xc7\xca\x4e\x56\x6f\xae\x96\xca\xe4\x53\xb8\xad\xd9\xdb\xf2\x23\xb1\xad\x5d\x46\x77\x34\x57\x46\x79\x65\xcd\x55\x49\x1e\x73\xf4\x38\xbd\x02\x40\x63\xac\x47\x99\x66\x79\x04\xc8\xac\xf1\xce\x6a\x4d\x6e\xb4\x20\x33\x5e\xd6\x33\x9a\xd5\x4a\xe7\xe4\x02\xf1\xe6\xe8\xd5\x9f\xc6\x7f\x19\xbf\xb9\x02\xc8\x1c\x85\xed\x4f\xaa\x24\xf6\x58\x56\x53\x30\xb5\xd6\x57\x00\x06\x4b\x9a\x82\xad\xc8\xa1\xb7\x8e\xc7\xbb\x7f\x99\x75\x64\xe5\xa7\xbc\xe2\x8a\x32\x39\x78\xe1\x6c\x5d\xb5\x57\xb7\xd6\x44\x52\x0d\x7f\xe8\x69\x61\x9d\x6a\x9e\x01\x46\x60\x75\x19\xfe\x47\xb9\xdf\x27\x1a\x61\x4a\x2b\xf6\xff\xe8\x4c\xff\xa2\xd8\x87\x57\x95\xae\x1d\xea\xd6\x99\x61\x96\x95\x59\xd4\x1a\xdd\x6e\xfe\x0a\x80\x33\x5b\xd1\x14\x6e\x75\xcd\x9e\x64\x22\xe9\x21\xf1\x30\x4a\xb2\xae\xde\x24\x96\x38\x2b\xa8\xc4\x86\x41\x10\x52\xe6\xe6\xc3\xfd\xe7\x3f\x3f\xee\xbd\x00\xc8\x89\x33\xa7\x2a\x1f\xb4\xda\xf0\x08\x8e\x2a\x47\x4c\xc6\x33\x20\x64\xf1\xd8\x2d\x43\xe3\xd6\x76\xbf\x11\xc6\xec\xec\x5f\x94\xf9\xd6\x74\xe5\x64\xb1\x6f\x69\x29\x8e\x96\xf7\x74\xe6\xf7\xf8\xb8\x16\x66\xe3\x3a\xc8\xc5\x71\x88\xc1\x17\xd4\x88\x4d\x79\x92\x10\xec\x1c\x7c\xa1\x78\xc7\x6f\xf0\x05\x99\x46\x93\xb8\x1a\xc3\x23\x39\xd9\x08\x5c\xd8\x5a\xe7\xe2\x61\x2b\x72\x1e\x1c\x65\x76\x61\xd4\xbf\xb7\xd4\x18\xbc\x0d\xc7\x68\xf4\xc4\x1e\x94\xf1\xe4\x0c\x6a\x58\xa1\xae\x69\x08\x68\x72\x28\x71\x03\x8e\x84\x2e\xd4\xa6\x45\x21\x2c\xe1\x31\xfc\xd3\x3a\x02\x65\xe6\x76\x0a\x85\xf7\x15\x4f\x27\x93\x85\xf2\x4d\x6c\x64\xb6\x2c\x6b\xa3\xfc\x66\x12\xdc\x5c\xcd\x6a\xb1\xfb\x24\xa7\x15\xe9\x09\xab\xc5\x08\x5d\x56\x28\x4f\x99\xaf\x1d\x4d\xb0\x52\xa3\xc0\xac\x09\xf1\x31\x2e\xf3\x1f\x5c\x8a\x26\xbe\xde\x53\x5f\xb4\x03\x7b\xa7\xcc\xa2\xf3\x2a\xf8\xe4\x49\x5d\x8b\x7b\x82\x12\x43\xc7\xed\x51\x96\x9d\x4a\x65\x4a\xb4\xf2\xf1\xdd\xe3\x13\x34\x0c\x44\xb5\x47\x0d\xb7\xbc\x65\xa7\x6c\x51\x94\x32\x73\x72\x71\xe5\xdc\xd9\x32\x50\x21\x93\x57\x56\x19\x1f\x1e\x32\xad\xc8\x78\xe0\x7a\x56\x2a\x2f\x56\xfc\xbd\x26\xf6\x62\x87\x31\xdc\x06\x68\x80\x19\x41\x5d\xe5\xe8\x29\x1f\xc3\xbd\x81\x5b\x2c\x49\xdf\x22\xd3\x77\x57\xb5\x68\x94\x47\xa2\xbe\xfe\xca\x6e\x23\xdb\xe1\x86\x83\x28\x01\x68\xe0\xe7\x45\xeb\x34\x11\xf9\x58\x51\xd6\x09\x85\x9c\x58\x39\x71\x5d\x8f\x9e\xc4\xe1\x3b\xb0\xd3\xe7\x68\x8f\xbe\xe6\x7e\x87\x87\xa5\x9d\xe3\xed\x8c\xc5\xd0\xad\xf3\xd1\xec\xe0\x43\x22\x45\x0c\x9a\xd9\xb2\xb2\x46\x1c\xa3\x2f\x57\x2f\x43\x07\x84\xe4\xd0\xd0\x3b\x7c\xb7\xc7\xfb\xed\x76\x69\x9a\x9f\x11\x6f\xbd\x57\x64\x40\x1f\xc9\x31\x45\x81\x8e\x80\x5b\x0f\x6e\x65\x88\xdb\x8a\x2d\x8e\xf1\x24\xe0\xac\x71\x46\xfa\x91\x34\x65\x87\xe6\x39\x27\xb1\x8c\xce\xfe\xe3\x4b\xf6\x84\xff\xa5\xbd\x23\xc6\x76\x20\x02\xbf\xd7\xe4\x36\x60\x57\xe4\x24\xdc\xc9\x8b\xe1\x76\x4a\xa9\x99\x72\xc1\x40\x0e\x3b\x3b\x6a\xb9\x3e\x61\xcc\x9e\x6a\xea\x23\xaa\x8c\x12\x7d\x56\xbc\x7b\x16\x48\x69\xe5\xb8\x1e\x52\xef\x6f\x4c\x82\x2b\x0e\x62\x46\x05\x70\xa3\x94\x64\xb4\x32\xa2\xd6\x53\x41\x9d\x19\x40\x47\x70\xf3\x70\x47\xf9\x31\x7f\xe8\x0a\x8c\xce\xe1\xe6\xc4\x2a\xe5\xa9\x3c\x29\xc4\x9e\x18\x37\x27\x58\x4d\x38\xdd\xbc\x49\x5e\x6c\x3c\x2a\xc3\x29\x07\x0d\x01\x61\x49\x9b\x98\xae\x24\x0b\x36\x41\x19\x16\x3b\x0a\xc9\x2d\xd8\x76\x49\x9b\xb0\x28\xe5\xae\x93\x1c\xf6\xb0\x6d\x1c\xa7\x83\x61\x37\x46\x72\xfc\xd9\x35\xf6\x38\xa8\x75\x47\x1f\xa7\x8a\x63\x49\x9b\x73\x4b\xf6\x8c\x21\x3a\x52\x9c\xaa\x02\xb1\x8a\x4c\x04\x4d\xca\xd4\xd6\x10\x58\x55\x5a\x51\x48\x5c\x67\xe9\xbf\x98\x3d\x0e\x47\x23\xfe\x85\x4c\xdb\xa3\x65\xdc\x92\x36\xd7\x1c\x1d\x40\xa2\xa3\x50\x95\xc4\xfa\x16\x06\x9a\x0a\xe6\x33\x6a\x95\xef\x8a\xd2\x10\x09\xf7\x66\x08\x0f\xd6\xcb\xcf\xbb\x67\x25\x19\x5a\xfc\xe6\xce\x12\x3f\x58\x1f\x66\x5e\x55\xec\xc8\xca\x85\x42\xc7\x4d\x21\x40\x4c\x8c\x49\x91\xaa\x5d\xd2\xf0\x18\xee\xe7\x1d\x54\x93\xd5\xf7\x06\xac\x6b\xa4\x0b\x45\x66\x24\x14\x49\x94\x35\x87\x1a\xc4\x58\x33\xa2\xb2\xf2\x9b\xa3\x34\x92\x52\xac\xeb\xe8\xe4\x04\xb9\x44\xea\x49\x4a\xa3\xf8\x26\x16\xb1\x1a\x33\xca\x21\xaf\x03\xd3\xa1\x20\x93\x76\x43\x65\x50\x92\x5b\x10\x54\x82\x70\x7d\x55\x7d\x0e\x97\xe2\xe8\x81\x4e\x6d\xa2\x67\xec\x17\x20\x38\x64\x9f\x0b\x61\x3b\xee\x89\xf0\x56\x62\x25\xa6\xfb\x22\x28\x16\xb4\xf7\x15\x2a\x54\x8e\xc7\x70\x13\xda\x23\x4d\x9d\x77\xca\x04\x3d\xb7\xc9\x08\x05\xc5\x20\x50\xb4\x42\x2d\xb8\x29\x9e\x6e\x80\x74\x44\x51\x3b\x3f\x48\x16\x43\x58\x17\x52\x0b\x48\x7c\xcf\x15\xe9\x50\x12\x0f\x96\xb4\x19\x0c\x0f\xcc\x3d\xb8\x37\x83\x88\xaf\x07\x06\xde\x82\xb1\x35\x7a\x03\x83\xf0\x6e\xf0\xdf\xe5\x97\xb3\xa0\x8b\x79\x1e\x1a\x6b\xd4\x1f\x7a\x22\xe1\x59\x5b\x3a\x9a\xbf\x48\xa2\x63\xbc\x8f\x34\x8f\xc2\xb4\xca\x89\x39\x39\x32\xa1\xc8\xb2\x2f\xd6\x10\xbb\xaa\x63\x98\x50\x94\x72\x58\x2b\x5f\x74\x6b\x97\x97\xb4\x73\xde\xc3\xcf\xf8\x75\x57\x08\x95\x15\x1f\x1b\xb6\xa3\x0f\x6e\xa5\x88\x18\xd9\x70\x3b\x04\x32\x4e\x65\x45\xc3\xac\x14\xb9\xb1\x90\x16\xcb\x47\x33\x9c\xc8\xa4\xbd\x0c\xda\x2f\x9d\xbd\xdc\x49\x9f\x10\xf4\xe6\xc3\x7d\xd3\x43\xc7\xd6\x99\x1a\x41\xcf\x00\x78\x4f\xf0\xde\xe9\xe0\x02\xa6\x6e\xb7\x9b\xda\xf9\xaa\xd5\x87\x6f\x5b\x8c\xd0\x32\x36\x1e\xd4\x87\xe1\xf3\x10\xd8\x0b\xfe\x8e\xb3\xbb\xe3\xb6\xcd\x2c\xae\x50\x69\x9c\xe9\xa6\x45\x8a\xc9\x36\x35\x48\x5b\xe6\xaf\xa3\xdb\xd0\x39\x2c\xef\x5d\x76\xf5\x2f\xbc\xa4\xac\x8a\x2e\xdb\x63\xa1\x9c\x7f\x66\x59\xff\xea\x4b\x3a\x19\xf6\x4f\x0e\x0d\xab\xe6\xca\xae\x4f\xe6\xd9\x6b\x6d\xd8\x83\x57\x25\x25\x6f\x68\x8c\xe1\xb7\x64\x29\x8f\xb7\x0d\xd6\x50\x13\x9b\x01\xfd\xad\x2f\xe8\x45\x40\x69\x8f\x0b\x2a\x15\x19\x73\xeb\x4a\xf4\x53\xc8\xd1\xd3\x48\x38\xeb\xa5\x86\x4f\xe1\x52\xe3\x55\x55\xb0\x46\x16\x6b\xcc\x28\xff\x7f\x10\xb2\x24\x66\x5c\x5c\x2e\xdd\x0d\x14\x75\x89\x12\x5d\x98\x87\x38\x4a\x84\x40\x99\x5c\x65\x18\xae\xa3\x72\xf2\xa8\x34\x03\xce\x6c\x1d\xa3\x6f\x67\xfe\x57\xb7\xb0\x23\xe4\x73\x28\x7b\x44\x8e\x98\xf2\x65\xab\x28\xaf\x6b\xaa\x6b\x0e\x3e\xf0\x3d\xb9\x3e\x7e\xbd\x73\x96\xeb\x74\xd5\xb3\x05\xdb\xc4\xf0\x30\x44\x93\x9d\xc3\x93\xab\x69\x08\x3f\xa3\x66\x1a\xc2\x27\xb3\x34\x76\xfd\xfa\xbc\x87\xc5\x17\xeb\x7b\x53\x05\x0e\xb7\x3c\xbf\x22\x5b\xa1\x20\xfc\x80\xbe\xb8\x20\xad\x5d\xdf\xa7\x5a\x28\xd4\xf2\xa1\x8a\xa8\x14\x65\xd4\xb9\x9c\x06\x65\xd8\x13\xe6\x69\x92\x8c\x57\x8e\xd2\xbb\x61\xbc\x39\x4d\x1d\xcc\xee\xf2\x5a\xea\x4b\x40\x29\x3b\x55\x0e\x7f\x7f\x7c\xff\x30\xf9\x9b\x4d\x25\x2b\x66\x19\x71\x4a\x2d\x52\x67\x0e\x81\xeb\xac\x00\xe4\xe6\xba\xf0\x31\x24\x9d\x12\x8d\x9a\x13\xfb\x71\xa2\x46\x8e\x7f\x7d\xfb\xdb\x18\x7e\xb6\x0e\xe8\x19\xcb\x4a\xd3\x10\x54\x6a\x73\x9a\x2b\xde\x56\x79\x14\x84\xd9\xee\x0d\x95\x50\x60\xa9\xb2\x79\x62\x7a\x1d\x98\xf5\xb8\x24\xb0\x89\xd9\x9a\x40\xab\x25\x4d\x61\xc0\x15\x65\xad\xa3\xbf\x18\x2c\xe9\xeb\x00\x7e\x5c\x17\xe4\x08\x06\xf2\x38\x88\x07\x6e\x4b\x48\x99\x6b\x39\x65\x3a\x38\xf6\xe1\x4e\x2d\x16\xe4\x28\x16\xe3\xb4\x22\xe3\x7f\x92\x4e\x4c\xcd\xc1\xd8\xd6\xe2\x40\x42\xf4\x59\x51\xa6\xe6\x8a\xf2\x03\x46\x7e\x7d\xfb\xdb\x00\x7e\xec\xca\x25\xa8\x43\xcf\xf0\x36\x76\x19\x8a\x45\xc6\x9f\x52\xe3\xc6\x1b\xe3\xf1\x59\x68\x66\xd2\x3a\x98\x58\xf3\x7b\x0b\x05\xae\x08\xd8\x96\x04\x6b\xd2\x7a\x14\xef\x4d\x73\x58\xc7\x96\xb4\x51\x65\x6c\xf1\x2a\x74\x7e\xef\x7b\xc5\xd3\xfb\xbb\xf7\xd3\x78\x9a\x98\x6d\x61\xe4\x08\x63\x3d\xcc\x95\x41\x9d\xfa\x0e\xc5\xbb\x36\x85\xeb\x68\x24\x6f\x21\x2b\xd0\x04\xac\x0c\xda\x98\xd7\xbe\x76\x34\xde\xbf\xbf\xfe\xa6\x18\x38\xf6\x21\xe1\x94\xfb\x87\xcf\x0a\xfb\x45\xe6\xff\xf0\xd2\xfe\x9b\x84\x0e\xdf\xd5\x2e\x10\xfa\xa1\xe5\xa7\x27\x85\x5e\xd6\x33\x72\x86\x3c\x05\xb9\x73\x9b\xb1\x88\x9c\x51\xe5\x79\x62\x57\xe4\x56\x8a\xd6\x93\xb5\x75\x4b\x65\x16\x23\x71\xc4\x51\xf4\x0e\x9e\x84\x6f\x91\x93\x1f\xc2\xcf\xab\xc9\xc8\x15\x66\x17\x0b\x1a\x36\xfd\x11\xd2\xca\x39\x3c\x79\x15\x61\x9b\x46\xee\xf2\xde\xe9\xfa\x31\x02\x47\xb6\x4f\x43\xc2\x6e\x5d\xa8\xac\x68\x3e\x45\xb6\x90\xb2\xc4\x3c\x42\x29\x9a\xcd\x77\x77\x7e\x51\x69\xed\xe4\xec\xcd\x28\x7d\x46\x1f\xa1\xc9\xe5\x3f\x2b\xf6\x32\xff\x2a\x3a\xac\xd5\x45\x40\xf0\xe9\xfe\xee\x8f\x09\x89\x5a\x7d\x43\xd4\xc7\xcf\x58\x53\xf0\xae\x6e\x6a\x5a\xf6\xd6\x49\xe5\xda\x99\xab\x67\xdb\x1b\x8b\x9d\xf0\xa9\xc8\x82\x2f\x5f\xaf\xfe\x13\x00\x00\xff\xff\x90\x55\x76\xc2\x18\x21\x00\x00") func operatorsCoreosCom_operatorsYamlBytes() ([]byte, error) { return bindataRead( @@ -199,12 +199,12 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_operators.yaml", size: 9266, mode: os.FileMode(436), modTime: time.Unix(1607975193, 0)} + info := bindataFileInfo{name: "operators.coreos.com_operators.yaml", size: 8472, mode: os.FileMode(436), modTime: time.Unix(1607977325, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xdc\xb8\x95\x28\xfe\x7f\x3e\x05\x4a\x49\x95\xa4\x44\xdd\xb2\xb3\x73\x93\x5c\xdf\x54\x52\x1a\x49\x4e\xb4\x63\x7b\x74\x2d\xd9\x53\xfb\x9b\xcc\xdd\xa0\x49\x74\x37\x22\x12\xe0\x10\x60\xcb\xbd\x9b\xfd\xee\xbf\xc2\x39\x00\x48\xf6\x83\x00\x5a\x2d\xd9\x93\x11\xfe\x48\xc6\x2d\xf2\x10\x8f\x83\xf3\x7e\xd0\x8a\x7f\x64\xb5\xe2\x52\xbc\x22\xb4\xe2\xec\x93\x66\xc2\xfc\x4b\x8d\xef\xfe\xa0\xc6\x5c\x9e\x2e\x5e\xfe\xe2\x8e\x8b\xfc\x15\x39\x6f\x94\x96\xe5\x7b\xa6\x64\x53\x67\xec\x82\x4d\xb9\xe0\x9a\x4b\xf1\x8b\x92\x69\x9a\x53\x4d\x5f\xfd\x82\x10\x2a\x84\xd4\xd4\xfc\xac\xcc\x3f\x09\xc9\xa4\xd0\xb5\x2c\x0a\x56\x8f\x66\x4c\x8c\xef\x9a\x09\x9b\x34\xbc\xc8\x59\x0d\xc0\xdd\xa7\x17\x2f\xc6\x5f\x8d\x5f\xfe\x82\x90\xac\x66\xf0\xfa\x2d\x2f\x99\xd2\xb4\xac\x5e\x11\xd1\x14\xc5\x2f\x08\x11\xb4\x64\xaf\x88\x6a\x26\x2a\xab\x79\x05\x9f\x18\xcb\x8a\xd5\x54\xcb\x5a\x8d\x33\x59\x33\x69\xfe\xaf\xfc\x85\xaa\x58\x66\x3e\x3e\xab\x65\x53\xbd\x22\x1b\x9f\x41\x70\x6e\x8e\x54\xb3\x99\xac\xb9\xfb\xf7\x88\xc8\xa2\x84\xff\xc2\x95\xdf\x74\xbe\x09\x3f\x17\x5c\xe9\x6f\xd6\xfe\xf4\x86\x2b\x0d\x7f\xae\x8a\xa6\xa6\xc5\xca\x5c\xe1\x2f\x6a\x2e\x6b\xfd\xae\xfd\xf2\xc8\x3c\xd3\xfe\x97\x7d\x88\x8b\x59\x53\xd0\xba\x0f\xe0\x17\x84\xa8\x4c\x56\xec\x15\x81\xf7\x2b\x9a\xb1\xfc\x17\x84\xd8\x1d\x04\x78\x23\x42\xf3\x1c\xce\x84\x16\xd7\x35\x17\x9a\xd5\xe7\xb2\x68\x4a\xe1\xbf\x96\x33\x0f\xef\x15\xb9\x9d\x33\x52\xd1\xec\x8e\xce\x98\xfb\xd2\x84\xe5\x44\x4b\x78\x98\x90\x7f\x28\x29\xae\xa9\x9e\xbf\x22\x63\xb3\xa5\x63\xb3\x63\xf6\x4f\x78\x16\xd7\xf8\xb2\xfd\x4d\x2f\xcd\xe4\x94\xae\xb9\x98\x6d\xfb\x5c\x46\x35\x2d\xe4\x8c\x20\x0e\x91\xa9\xac\x89\x9e\x33\x62\xc0\xf3\x29\x67\xb9\x9b\xcf\x96\x19\xe0\x6b\xbd\x39\xdc\x74\x7f\x8a\x9a\xc2\x9c\x0a\xc1\x0a\x22\xa7\xa4\xa9\x72\xaa\x99\x22\x5a\xb6\xeb\xdf\xbe\x7c\xfb\x62\xef\xeb\xe7\xbd\xdf\xd6\x3e\x8f\x0f\x2d\x5e\xd2\xa2\x9a\xd3\x97\x78\xb8\xd9\x9c\x95\xf4\x95\x7d\x43\x56\x4c\x9c\x5d\x5f\x7d\xfc\xb7\x9b\xde\xcf\xa4\x3f\xed\x2e\x92\x91\x3b\xc6\x2a\xd5\x22\x35\x69\x2a\x33\x7f\xb3\x10\x32\x59\x12\x5d\xd3\xec\x8e\x8b\x19\x2c\x73\x06\x6b\xf3\x30\x09\x39\xc7\xed\x57\x63\xff\x1b\x4e\x59\x4e\xfe\xc1\x32\xed\x7f\xac\xd9\x8f\x0d\xaf\x59\xde\x4e\x67\x44\xdc\x25\xef\xfc\x64\x76\xc5\xff\xb3\xaa\xcd\x94\xb4\xbf\x43\x38\x3a\xd4\xa5\xf3\xeb\xca\xf2\x0e\xcd\x0e\xe0\x53\x24\x37\x64\xc5\x4c\x7b\xce\x1c\x6a\xb3\xdc\x6e\x9a\x39\x32\x3d\xe7\x8a\xd4\xac\xaa\x99\x62\x02\x09\x4d\x0f\x30\x31\x0f\x51\x61\x57\x34\x26\x37\xac\x36\x60\xcc\xc5\x6b\x8a\xdc\x50\xa3\x05\xab\x35\xa9\x59\x26\x67\x82\xff\x97\x87\x0d\x48\x60\x3e\x5a\x18\x8c\xd0\x2b\x30\xe1\x2a\x09\x5a\x90\x05\x2d\x1a\x76\x42\xa8\xc8\x49\x49\x97\xa4\x66\xe6\x2b\xa4\x11\x1d\x78\xf0\x88\x1a\x93\xb7\xb2\x66\x84\x8b\xa9\x7c\x45\xe6\x5a\x57\xea\xd5\xe9\xe9\x8c\x6b\x47\x55\x33\x59\x96\x8d\xe0\x7a\x79\x0a\x04\x92\x4f\x1a\x73\x98\xa7\x39\x5b\xb0\xe2\x54\xf1\xd9\x88\xd6\xd9\x9c\x6b\x96\xe9\xa6\x66\xa7\xb4\xe2\x23\x98\xba\x40\xb2\x57\xe6\xbf\xac\x2d\x1d\x56\x87\xbd\xb9\xae\xa1\x20\x0e\xa0\x63\x03\x27\x60\x88\x19\xe1\x8a\x50\xfb\x2a\xae\xa2\xdd\x68\xf3\x93\xd9\x9d\xf7\x97\x37\xb7\xc4\x7d\x1a\x0e\x63\x75\xf7\x61\xdf\xdb\x17\x55\x7b\x04\x66\xc3\xb8\x98\xb2\x1a\x0f\x71\x5a\xcb\x12\x60\x32\x91\x57\x92\x0b\x0d\xff\xc8\x0a\xce\xc4\xea\xf6\xab\x66\x52\x72\xad\x00\x2f\x99\xd2\xe6\xac\xc6\xe4\x1c\x58\x0d\x99\x30\x7b\x8d\xf3\x31\xb9\x12\xe4\x9c\x96\xac\x38\xa7\x8a\x3d\xfa\x01\x98\x9d\x56\x23\xb3\xb1\x71\x47\xd0\xe5\x92\xab\x0f\xaf\xdc\x3f\x42\x1c\x0b\xdb\x72\x5e\x5d\x82\x70\x53\xb1\xcc\x5f\x1b\x2a\xc8\x59\x55\x15\x3c\x83\x9b\x41\xf4\x9c\x6a\x92\x51\x61\x76\x89\x0b\xa5\x69\x51\x00\xd3\x08\x7e\x7f\x13\x0d\x20\x70\xe9\x3b\x4c\xc0\xfd\xd4\xa3\xca\xfd\x1f\x3d\xab\xea\xfd\x75\x33\xad\x30\xc3\xd2\xd8\xd5\x9f\xb7\x6e\x2a\x41\x09\x63\xca\x67\xeb\xaf\x6c\xdd\xb1\x73\x78\x01\x24\x13\xca\x85\xb2\x00\x9a\x1a\xf7\xac\xe5\x45\x53\x59\xaf\x01\x25\xe6\x8a\x74\x60\x8d\xb7\xcc\x74\xc3\x8e\x0e\xaf\xdc\x0c\x26\x16\x9b\x7e\x5e\x59\xca\xa5\x58\xe0\x55\x35\x52\x88\x21\x77\x4c\x2c\x78\x2d\x45\xc9\x84\x26\x0b\x5a\x73\x3a\x29\x2c\x53\x63\x9a\xf0\x55\xfa\xe8\xe7\x69\x6e\x1b\x6e\x01\xab\x37\x5d\xa7\x8d\xef\xe1\xea\x68\x5d\xd3\xe5\xc6\xbf\x73\xcd\xca\x8d\x6b\xdb\xb4\x8c\x8f\xb4\xee\x50\x0a\x83\xbc\x9b\x96\x42\xec\x03\x5b\x80\x1a\xea\x4c\x28\x39\xf7\x4b\xd9\xb6\xde\xa1\x73\xc1\xb1\x19\xe7\xdb\xb1\x01\xfb\xdb\x31\x7c\xb4\x38\x40\x1e\xd8\xfa\xd7\x95\x0d\x32\x77\x07\x59\x1e\xdb\xb8\x2f\x63\xf2\xb6\x51\x70\x62\x74\x00\x24\x21\xe7\xff\x79\x75\x71\xf9\xee\xf6\xea\xf5\xd5\xe5\xfb\x6d\x9b\x43\x86\xaf\x58\x3b\x80\x2f\x44\x2f\xe1\xf0\xa3\x3b\xc3\x9a\x4d\x59\xcd\x44\xc6\x14\xf9\xd5\xd1\xc7\xb3\xf7\xff\xf9\xee\xec\xed\xe5\x31\xa1\x35\x23\xec\x53\x45\x45\xbe\x42\x97\x56\x47\xa3\x1c\x0b\xaa\x6a\xb6\xe0\xb2\x51\x96\xe6\xe5\x5b\xd0\x9f\x1b\xea\xb7\xed\xac\x70\x78\xec\x07\x7e\x4e\xc5\x92\x28\x56\x2f\x78\xb6\x79\xbb\xd5\x98\x5c\x4d\x03\x5b\xed\x51\x36\xf3\xb7\xc9\x30\xcb\x62\xc1\xf2\x13\x98\xbc\xdf\x06\x3b\x3f\xc2\x45\xd5\x6c\xc7\x6c\x33\x2c\x43\xbe\xe7\x45\x01\xb7\x53\xa0\x64\x97\x8f\x41\x9a\xed\x6e\xa6\x5a\x0a\x4d\x3f\x59\x7a\x3f\x08\x93\xa9\x8c\x56\x2c\x27\xf7\x5c\xcf\x09\x25\xb9\x6c\xcc\xa4\x7f\xf5\xab\x13\xc2\xd9\x2b\xf2\xab\x0e\xd0\x31\xb9\xb4\xcf\xb6\x27\x38\x08\x1a\xe6\x29\xd8\x82\xd5\x66\xb6\xee\x6c\x4f\x48\xcd\x66\xb4\xce\x0b\xa6\x94\xc1\xe9\xfb\x39\xd3\x73\x86\xc2\xbf\xdb\xb4\xe1\x19\x7f\xe2\x86\xf1\xcb\x9a\x08\xa9\xc7\xe4\x82\x4d\x69\x53\x80\x24\x40\x0e\x0e\xc6\x87\x7b\x41\xeb\xd7\xb5\x2c\xa3\x51\xfb\xa6\xaf\xc1\x6c\xc2\x98\x43\x85\x70\x87\x2e\x1d\xe9\x12\x5e\xc5\x72\xc2\xa7\x56\xf6\xe2\xca\x2c\x95\xb0\xb2\xd2\xcb\xf0\xb5\x1d\xa4\x6b\x24\x92\x3c\x11\xcf\x4d\xdf\xd2\xea\x1b\xb6\x7c\xcf\xa6\xc3\x0f\xaf\xee\x09\x2b\x58\x66\x08\x39\xb9\x63\x4b\x10\xc4\xc9\xb9\x03\x37\xbc\x09\xd1\xcb\x20\x11\x64\xda\x8d\x91\x99\x46\xe0\x99\xd8\x6d\x31\xe3\x8e\x2d\xc3\x0f\x91\x75\x8d\xd3\x6c\x06\x70\x63\xb3\x3b\xa1\x7d\x20\xb1\x28\xeb\x46\x88\xa7\x6c\x9c\xd6\x61\x97\xb9\xd8\x9b\xad\x37\x8a\xcc\x77\xcd\x84\xd5\x82\x69\x06\x52\x73\x2e\x33\x65\x04\xe6\x8c\x55\x5a\x9d\xca\x85\xa1\x97\xec\xfe\xf4\x5e\xd6\x46\xe9\x1c\x19\x7a\x32\xc2\x33\x54\xa7\x60\x60\x39\xfd\x25\xfc\x5f\xc4\xfc\x08\xb9\xfd\xf6\xe2\xdb\x57\xe4\x2c\xcf\x89\x04\xe2\xd0\x28\x36\x6d\x0a\x32\xe5\xac\xc8\xd5\xb8\xa3\x4b\x9e\x80\x3e\x73\x12\x05\xb4\xe1\xf9\x9f\x87\xc8\x83\x1b\x49\x7b\x2e\x2b\x34\xb2\x24\xef\xfb\x0d\x08\x97\xcb\x1e\xfd\xf3\x57\xc4\x50\x37\xae\xe3\xf6\xca\xe0\x54\x69\xd9\xbf\x65\x84\xd1\x8b\x9c\x48\x59\x30\xba\x4d\x2e\xc4\x01\x9b\x9e\x7a\xff\x0f\x5b\x02\x00\xef\x3b\x04\xab\x64\xfe\x8a\xa8\xa6\xaa\x64\xad\x95\x57\x84\xc0\x9e\x14\x3e\xc4\xde\xe3\xa0\x4b\x9c\x90\xbf\xfb\x1f\x0b\x3a\x61\x85\xfa\xfe\xf0\xf0\x8f\xdf\x5c\xfe\xc7\x9f\x0e\x0f\x7f\xf8\x7b\x18\x62\xfb\x76\xc7\x5a\xd9\x03\x41\xd0\xde\x25\x73\x50\x60\xc2\x10\xd1\x38\x85\xc2\xc3\x59\x96\xc9\x46\x80\x91\xef\x84\x28\x4d\x75\xa3\xc6\x73\xa9\xf4\xd5\xb5\xff\x67\x25\xf3\xab\xeb\x08\xa8\x9d\xa7\xd5\x20\x8f\x23\x8f\x45\x40\xe1\x18\xaf\xa9\x9e\xef\x91\x8c\x6e\xb3\x09\x6d\x1e\x3d\x04\x73\x56\x22\x8b\x57\xd6\x2c\x64\xfe\xf3\x75\xe4\x44\x71\x70\x45\xee\x6b\xae\x35\x13\x20\x87\xb1\xba\x34\x52\xc9\x89\xb9\x49\xad\x58\xb1\x78\x79\xb0\x77\x62\xed\xf7\x33\x79\xe9\xe6\x25\xb7\x6e\xbc\x5c\x9e\xa5\xc4\xc8\xba\x6e\xb4\xda\xed\xd9\xf5\x95\xb3\xb0\xed\x75\x99\xce\x3a\xf4\xfa\x81\x14\xc4\x5b\x99\xec\xa2\xbd\xb4\xfe\x8a\x48\x51\x84\xf8\x7a\x3b\x0f\x45\x0a\x0e\xd6\x23\x23\xe4\x7b\x0b\xd2\x11\xfe\x38\xce\xaa\xe6\xc4\x3e\x30\x2e\x59\x29\xeb\x65\xf8\x5e\xda\xc7\x59\x35\x67\x25\xab\x69\x31\x52\x5a\xd6\x74\xc6\x4e\x3c\x78\x04\xeb\xff\x85\x80\xc3\x17\xa3\x33\xc1\x75\xe8\xa8\x2c\x65\x4d\x6d\x58\x75\xb1\x74\xf4\x94\xe5\x9f\x87\x32\xb8\xed\xdd\x23\x61\xf0\x27\xfc\x6e\x27\x91\xc6\x5b\x00\xac\xd9\xdd\xad\x05\x64\xf4\x85\x2c\x9a\x92\xa9\x38\x99\xc1\xb1\x77\x78\x93\x89\x85\x91\xe8\xd5\xde\x85\x88\x9c\x2f\xb8\x92\xf5\x8e\x32\x04\xb7\x46\x72\xd9\xe8\xaa\xd1\x66\xa6\x25\xd5\xf6\xae\x44\x2d\x92\x7d\xaa\xa4\x02\xbd\xce\xde\x93\x15\xf2\xf7\xf2\x20\x02\x4c\x45\xb5\x66\xb5\x78\x45\xfe\xdf\xd1\xdf\x7e\xf3\xcf\xd1\xf1\x9f\x8f\x8e\xbe\x7f\x31\xfa\xdf\x3f\xfc\xe6\xe8\x6f\x63\xf8\x8f\x5f\x1f\xff\xf9\xf8\x9f\xee\x1f\xbf\x39\x3e\x3e\x3a\xfa\xfe\x9b\xb7\x7f\xb9\xbd\xbe\xfc\x81\x1f\xff\xf3\x7b\xd1\x94\x77\xf8\xaf\x7f\x1e\x7d\xcf\x2e\x7f\x88\x04\x72\x7c\xfc\xe7\x5f\x45\x4c\x8e\x8a\xe5\xb7\x41\xf2\x43\x00\x9b\xf1\xe0\xb8\xd0\x6c\xc6\x36\x19\xfd\xb6\xbd\x11\x79\xd4\x84\x7c\x1a\xb5\x82\xf4\x88\x0b\x3d\x92\xf5\x08\x5f\x7e\x45\x74\xdd\x84\x8f\xcc\x1d\x53\xfa\xbd\x78\xef\xee\x74\xc7\x70\xef\x58\xc7\x5e\x91\x5a\xb1\xac\x66\x7a\x3f\x7a\x23\xc2\x72\x56\x92\x4a\xe6\x87\x61\xb9\x58\x6c\x34\x36\x6f\x5b\xd0\xbf\xac\xaa\xe9\x84\x23\xdc\xc1\x56\x4a\x98\xd6\xb2\x1c\x13\x30\x1a\x46\x11\x88\x09\x23\x94\x2c\x68\xc1\x73\x07\xeb\x8e\x0d\x5a\x22\xdc\x78\x56\x5f\x7f\x4e\xea\xeb\x0d\xe2\x06\xea\xae\x11\xd7\x00\xc7\xfe\x75\x57\x26\x16\xdb\x0d\x78\xab\x9e\x07\xf3\x64\xdf\x89\xe2\x84\x45\x2d\x49\x25\xab\xa6\xa0\xba\x67\xd4\xdb\x32\xc1\x55\x7b\x73\xd7\xa3\x62\xef\x63\x6b\xa8\x36\xe8\x05\xbe\x8a\x41\xc9\xc9\xed\x0c\xed\x1b\xee\xc9\x59\x51\x10\x2e\xf0\x3e\x02\x58\x67\x11\xae\x19\xca\x81\x84\x6e\xc3\x53\x2a\x08\x5b\x30\xa1\xcd\xb9\xad\x4c\xd3\x6c\x82\xd2\xb4\xd6\x5c\xcc\xc6\xe4\x3b\xf3\x77\xa4\xc2\xd6\xe0\xba\xd5\x7d\x54\x36\x85\xe6\x55\xc1\x88\x97\x1e\xd0\x96\x5b\x34\x8c\x50\xa5\x64\xc6\xa9\x76\x16\x66\xf4\xab\x2b\x3d\xbc\x70\x58\x8f\xa6\x77\x60\xe2\xcf\x58\xce\x44\xc6\xc6\xe4\x23\xb8\xd3\xfd\x1e\x4e\x96\x66\x35\x97\x62\xe1\x6d\xd7\x0d\xba\x3b\xb7\x41\x35\x6b\xd9\x0c\xf9\xaa\x2c\x1b\x0d\x8e\x94\xc7\xf7\x74\x19\x7c\xb3\x16\xe3\x8e\xc3\x0b\xc8\xb4\x57\x72\x28\xf8\xeb\xe4\x74\xeb\x5d\xf0\x86\xa2\x6d\xe7\x1c\xc1\xd8\x62\x98\x90\x37\x01\x07\xf8\xf8\x1a\xf7\x69\x2d\x59\x7d\xae\xf3\x74\xd6\xeb\x18\x6e\xf2\x65\x73\x92\x54\x2e\x12\xc5\x21\xa2\xb9\x43\x2c\x67\x48\x30\x6a\xa6\x51\xfa\x38\x0b\x65\x55\xb3\x29\xff\x14\x8d\x9b\x67\xa2\x55\xe9\x78\xce\x84\x36\xea\x53\x0d\xa4\xbe\x66\x15\x13\x60\x4b\x61\x34\x9b\x07\xd9\x97\xa5\xf2\xad\x57\xa3\xf5\xc1\xee\xd7\xcf\x8a\x12\x57\xea\x05\xbc\xd9\x24\xf3\x3d\xdf\xbe\x9f\xdd\xed\xb3\x78\xb0\xdf\xab\x27\x64\xce\x50\x53\xdb\x66\xb4\x58\x39\xdb\xce\xf3\x36\xb6\xcc\xfd\xeb\x7e\xce\xb3\xb9\x9f\x9e\xd1\x7f\xb7\x04\xdb\x10\x1b\xa8\x52\x49\xb8\xa3\x53\xae\x89\x34\x12\x8a\x99\xcb\x98\xdc\x6c\x80\x57\x52\x9d\xcd\xed\x13\x87\x5b\x95\x46\x74\x1b\x78\xef\xad\x05\x3f\x41\x93\x72\xde\x14\x2c\x27\x2e\x7c\x0a\x3f\xd5\xa2\xe4\x16\x88\x31\x88\xda\x0b\x34\x3a\xa5\x4a\xf1\x99\x18\x55\x32\x1f\x99\x6f\x9c\x6e\x46\xa3\xe0\x15\xed\x86\xfc\x86\xae\x69\x00\x13\xbd\x29\x28\xe6\x78\xdf\x7b\xfb\x6a\x47\xa2\xc9\x64\x59\x35\x9a\x75\x8c\xaf\x4e\x83\xde\x32\xa3\xc9\x12\xa3\x01\x3b\x72\x73\x2b\x97\xa5\x12\x82\xfe\xfe\x96\x54\xd0\x19\x1b\xd9\x29\x8d\xfc\x94\x46\xfe\x5b\xbb\x6e\x79\x98\x1e\xa2\x89\x78\xfb\x3d\xee\x6f\xe5\x1b\x34\x50\xe3\x8f\x13\x6b\xd8\x2b\xe9\x27\x5e\x36\x25\xa1\xa5\x6c\x04\xa8\x28\x76\x25\x03\xd7\xb8\xdd\x76\x5a\x14\xf2\x9e\xe5\x9f\x6b\x0b\xa3\xb6\x91\x24\x62\x2f\xf9\x52\x0d\x8e\x41\x43\x63\xbc\x81\x31\xda\xb0\xb8\xa3\x41\xd1\xf9\x17\x62\x51\xf3\xbd\x73\x98\xac\x20\x27\x17\x0f\x40\x4e\x47\x13\x20\xa2\xca\x7f\x81\x2b\x22\x4b\xae\xb5\xb5\xd8\xd3\x96\x26\x0c\x99\x4a\xb8\xee\x99\xad\xed\x55\xe2\x53\x24\xde\x5c\x11\xf6\xc9\x28\x88\x1c\x5c\x26\xce\xf9\x75\x82\xec\xfd\x9e\xab\xa1\x09\x6b\x69\x74\x4d\x5e\x56\x05\x2b\x5d\xb0\xf9\xc8\x29\xa2\x18\xd9\xf3\x7c\xbd\x9e\xaf\x97\x1b\x2a\x5e\x36\xea\x8a\x45\x68\x1c\x99\xb0\xa2\x15\x8f\x0c\xfa\x57\x32\x57\x56\x26\x71\x48\xb3\x2d\x26\x97\x90\xcb\x4f\x5c\x41\x8c\xfe\x7b\x06\xd6\x90\x1b\xa6\x15\xb9\x9f\x4b\xc5\x10\x0e\xad\x99\x85\x8e\x26\x14\x60\xb9\xd6\x7e\x34\x20\x75\x49\x08\x29\x9f\x4e\xfb\xef\xe5\xac\x2a\xe4\xb2\x04\x49\xfd\x4a\x77\xa5\x2e\x2b\x4a\x6d\x83\xc8\xca\xaa\xa0\x9a\x1d\x2a\x2b\x7e\x0d\xd9\x5d\x1e\xc4\x7d\x61\x36\x97\x9f\x8c\x54\xa2\xda\x4c\xb4\x4d\xa3\x77\x2a\xab\xaf\xf5\x0d\x84\xfd\x33\x1a\xa4\x73\x40\xdd\x4a\xcc\x7e\xb8\x05\xcd\xa6\xfd\x05\xce\xe2\xec\xdd\xc5\xf6\xc3\x0c\x9b\x9e\x48\xc8\xfc\xb4\xb6\xb4\xb3\x55\x14\xeb\x4c\xa9\x2f\x9b\x0f\x2a\x09\x98\x4f\xe0\xe2\xe6\x31\xd3\xe5\x04\x0d\x86\x27\x36\x88\xd6\x67\x26\xe1\xc3\x35\x83\x84\x9a\x00\x54\x74\x5c\x18\x00\x36\x7b\xe6\xe1\x3a\x6b\x8c\xe7\x26\xe4\xb5\x19\xf9\xc5\xec\x41\x39\x8e\x70\xe9\xf4\x8e\xcc\xec\x48\x8f\x3c\x40\x18\xa1\xd9\x53\xf4\xee\x44\x1c\x17\x81\x68\x9b\xaa\x00\x5f\xb1\x8c\x8b\xc0\x8c\x52\x53\x71\x53\x92\x96\xe3\xd1\xa2\x1b\xf0\x6f\xd6\x74\xa8\x10\x49\xcc\x8d\x9b\xf3\x2a\xb8\x20\xc3\x95\xad\xa5\xd4\xe7\x5a\x7d\x04\xab\x78\x9b\x13\x67\xee\xd8\x95\x38\x21\xef\xa4\xbe\x12\x61\x47\xcb\x25\xda\xba\x0d\xfe\x5d\x48\xa6\xde\x49\x0d\xbf\xec\x6d\xc3\x70\x9a\x49\xdb\x85\xaf\xc0\xd5\x14\x48\x09\xc0\x49\xd1\x49\xce\x82\x78\xf4\xf0\x6e\x19\x32\xee\xb6\x9e\x2b\x72\x25\x88\xac\xed\xbe\xb4\x16\x7b\x65\x3f\x51\xc6\xf8\x06\x27\x8c\x08\x29\x46\x18\x98\x6c\x24\xb8\xd5\x6f\x5c\xfa\x58\xed\xee\x6e\x86\x8f\x61\xe3\x74\x20\x8a\x1c\x3f\x75\x6b\xb8\x0f\xfe\x05\x93\x00\x0b\x9b\x03\x1b\xd8\xd7\x06\x36\x0d\x52\xdb\xa8\x66\x33\x9e\x91\x92\xd5\x33\x66\x84\x9d\x6c\x1e\x77\xc8\xc3\xb4\x18\x47\x90\x22\x77\x01\x0e\x62\x0d\x30\xa2\x37\xc0\x23\x53\x58\x17\xbe\x81\xe4\xbc\xa4\x95\x41\x98\xff\x36\x94\x19\xf6\xf4\x7f\x48\x45\x79\xad\xc6\xe4\x6c\x60\x86\x8a\x8b\x59\xc1\x7a\x6f\x59\x8b\x67\xf7\x03\x06\xb6\x11\xac\x7f\x6c\xf8\x82\x16\x43\x99\x39\x4e\x86\x66\x28\x41\x9b\x19\xad\x32\xd9\x13\x2b\xa7\x18\xea\x86\x71\x6d\x5c\x91\x83\x3b\xb6\x3c\x18\x42\x98\x55\x94\x3b\xb8\x12\x07\xc8\x81\xd6\x90\xc8\xb3\xab\x40\xd4\xd8\x01\xbc\x75\xf0\x10\x8e\xbd\x67\x61\x3c\x80\x29\x5a\x16\xac\xee\xa6\xda\xaf\x8e\xbe\x79\xb8\x7d\x1a\x16\xe4\xc3\x2a\xba\x70\x1e\xdb\x13\x76\xeb\x6c\x6d\xe6\x26\xb7\x33\x02\x94\xd5\x9a\x66\x73\x48\x3f\x77\x33\x1a\x10\x1b\xa8\x58\x12\x73\xaa\x1a\x39\x22\x20\x95\x55\x4d\x75\x0d\x6e\xc9\x3f\x7a\x1c\x3e\x61\x20\xc1\xfe\x09\x73\x88\xb6\x1f\xa1\xc3\x72\x43\x2c\x3c\x6e\xfd\xd1\xfd\xd7\x9f\x1e\x90\x57\x16\x23\x22\xe0\x24\xa3\x05\xba\x4b\x78\x9c\x70\x91\x83\xf3\xd3\x2e\x1d\x76\x04\x21\x99\x7d\x2c\xc3\x04\xee\xd2\x90\x56\x52\x32\x2a\x94\x33\x9d\x82\xaf\xb4\x05\xa4\xac\x5b\xb8\xa3\x3c\x5b\xe3\x52\x04\xcf\x03\x54\x7b\x27\x6f\xac\x55\xf5\x84\x5c\x83\x95\xbf\xfd\x05\xee\xec\x3b\x79\xf9\x89\x65\x8d\x1e\xcc\x94\x89\xe2\xb6\x01\x21\xab\xb7\x85\xdf\xb4\x02\x16\xae\xb7\x27\x60\xb5\xb7\xc2\x89\x50\xc3\x32\xac\x1c\x0f\xee\xe5\x1d\x5b\x2a\xcf\x2c\xad\x68\x07\x6c\x6d\x98\x2d\x7a\x3c\x74\xac\x10\x79\xeb\xff\x71\x46\xd3\x72\xc2\x05\x4e\x12\x3f\xeb\x0e\x7d\x10\xa8\x99\x95\x3b\x1e\x23\xb3\x17\x05\x4e\xef\xa1\x9b\x1f\x23\x17\xf6\x4e\xe0\xdb\x48\x99\xb0\x5f\xc4\x60\xc3\xec\x1c\xcd\xdf\x2c\x09\x76\xc4\xbb\xcb\x1f\x1b\x5a\xb4\xe9\x63\x81\x23\x75\x8f\x5b\x00\x3d\x9e\x67\xfe\x7c\xcf\x8b\x3c\xa3\xb5\x8d\x30\x05\x5a\x33\x08\x51\x49\xc4\x2f\x0a\x44\x30\xa3\xc2\x53\xba\x16\x53\x14\x86\x02\x54\xb4\xd6\x3c\x6b\x0a\x3a\x2c\xe1\xdb\xca\x25\x11\x09\x62\x81\xb3\x6b\xd1\xfd\x86\x65\x52\xe4\xf1\xaa\xe5\xed\xea\x9b\xab\x11\x0e\x15\xab\xb9\xcc\x87\x02\x1b\x60\x02\xbc\x64\xab\x17\xef\xa8\xef\x27\x92\x53\x47\xdb\x3c\xc1\x08\xdc\x1e\x67\xe4\xb3\x15\x07\x9c\x78\xc1\x67\x42\xd6\x2c\x3f\x6e\x19\x4d\x4b\x05\x86\xc9\xe5\xd7\x4b\x67\x6d\x3c\x21\x5c\xbb\x1c\x3d\xc5\xf4\x89\xf3\x41\xd9\x6b\x68\x8f\xd5\x83\x1d\x84\x3a\x95\x35\x24\x4c\x1e\xe5\x12\x73\xfe\x16\x3c\xd3\xc7\x63\xf2\xff\xb1\x5a\x02\xda\x0a\x36\xa3\x9a\x2f\xbc\x64\x73\xcf\x8b\x62\x10\x22\x78\xd5\x18\xc5\xa8\x20\xf2\x82\x1c\x01\x48\xc2\xcb\x92\xe5\x9c\x6a\x56\x2c\x8f\xd1\x9e\xc3\x88\x5a\x2a\xcd\xca\x30\x02\x85\x8d\x6b\x18\x83\x0c\x4f\xfe\xee\xab\xad\xcf\xa5\x65\x10\x7f\x74\xb9\x90\x2d\x99\xc6\x18\xa3\x15\x54\xb1\x12\x40\x90\x46\x6f\x55\x57\xba\xf1\x4b\xb6\x58\x88\xd3\x3c\x62\x91\xec\x1f\x06\x4f\x29\xa9\x19\x54\xef\xb1\x37\xee\x01\x37\x13\x63\xd6\xdf\xca\x46\x6c\xb3\xd7\xf7\xb6\xea\x8d\x35\x54\x7d\xec\xbc\xd6\x56\x01\x58\x89\x4e\x7b\x64\x41\xaf\x33\x87\x8e\xe7\x80\x12\x70\x17\x80\x80\x65\x88\x1c\x3e\x65\xe3\xe2\xb6\xcb\x7a\xa1\x69\xef\x29\xb7\x1f\xe6\x36\x90\x42\xf4\xe0\xec\x7f\xff\x81\x68\xec\x87\xa4\x1f\x1b\x36\xd8\x0f\xdb\xa3\xda\x12\x1c\xc0\x5a\xd8\xc7\x61\xd6\xe3\x51\x1a\x66\xc1\x72\x1b\x09\x0c\xf4\xc6\x82\x25\x87\xaf\x0e\x1f\xcc\x48\x70\x91\xb5\xac\xe8\x0c\x6e\x66\xf4\x5a\x57\x5f\x24\x39\xd3\xac\x2e\xa1\xac\xc9\x5c\xde\xe3\xdf\x81\xa1\x0f\x2e\xb4\xb2\x10\x58\xde\x56\x98\x99\x4b\x05\xfc\xba\x9f\xf0\x0f\x74\x00\x42\x26\xee\x03\xba\x3d\xad\x65\x23\x72\x2b\x07\x7b\x82\xff\x76\x65\xc2\xef\xa4\x00\x4a\xd5\x28\x4c\xce\x5f\xab\x8d\xd3\x1f\x9e\x1b\x4d\x98\xa6\xe6\x82\xbe\x1c\xbf\x7c\xf1\xe0\xed\x4f\xaa\x30\x01\x06\x95\x15\xfb\xbd\x8b\xc8\x71\xb7\xf3\xc1\x33\xaa\x19\xcd\xbf\x15\x45\xbc\x5c\xfe\x16\x11\x14\x5e\x1c\x19\xa5\x1d\xbc\x79\x75\x03\xf9\x55\x34\x1f\xdd\xd7\x5c\xb3\x28\x07\x1e\x21\x47\x53\x5a\x28\x46\x64\x4d\x1a\xe1\x15\x98\xe3\x7e\xfd\x00\x78\x24\xbc\xcc\x50\x4c\x9a\x6a\x26\x0f\xba\xdb\x78\x89\x11\x69\xdb\xab\xed\x51\x36\x90\xff\x60\xdf\xde\x70\xcd\xfb\xa5\x12\xc8\x11\x3e\x69\x24\x6c\x29\xf5\xf1\xc3\x03\xd5\x70\xd9\x97\x9f\xaa\x78\xb9\xff\xd2\x56\x85\x20\x55\x68\x0f\x82\x62\x7f\x67\x7f\x06\xf6\xe0\x6b\x36\xa7\x0b\xa6\x88\xe2\x25\x2f\x68\x1d\xc8\x1e\xd4\x92\xdc\xe0\xaa\xc8\xa4\xd1\x9b\x6b\xd2\x6c\xae\x67\x12\xa0\x22\x6d\x3d\x8c\x4e\x3d\x93\xee\x0a\x3a\x9f\x8a\x57\x52\x36\x1c\xaa\x9b\xbf\x39\x15\xa0\x75\x6e\x3d\x66\x0e\x65\xa3\x1b\x5a\x04\xf6\x80\x7d\xca\x8a\x46\xf1\xc5\x43\xee\xbf\xcd\xb9\x4b\x16\x5d\x56\xa5\x96\x4a\xe6\x37\x15\xcb\x9e\x46\x66\xe9\xeb\xa2\x86\x9c\xe6\x0e\xb1\x20\x76\x1f\xcd\x57\x74\xbb\x40\x5f\xd2\x25\xc4\x83\x66\x19\x53\xca\x45\xac\x2f\xbb\x11\xf7\x7e\x55\x5f\x72\xa9\x22\x7a\xaf\x2e\x0b\xaa\x34\xcf\xbe\x2e\x64\x76\x77\xa3\x65\x9d\x50\xf7\xe7\xec\xbb\x9b\xb5\xb7\x57\x4a\x3d\x9d\x7d\x77\x43\x2e\xb8\xba\x1b\x44\xc3\x4e\xa9\x39\x8c\xe6\xe8\x9a\x09\x29\xb9\x6b\x26\xac\x60\xfa\xf0\x50\x21\x8f\x2f\x69\x36\xe7\x62\x98\x25\x58\xd6\x2f\x7c\x02\xa4\x2d\xfc\x67\xce\x23\x35\x9c\xc3\xa6\xe6\x9e\x5a\x4c\xff\x25\xbd\x57\x0c\x97\x3d\x31\xcb\x36\x7f\x66\xe1\xda\x34\x7b\xf2\x65\xe2\x24\xae\x2e\xf6\xe0\xab\x9c\xaa\x5b\x33\xb3\x14\x87\xd5\xe1\x6b\x5e\x30\xd4\x25\x61\x59\x2e\xaa\xd7\xde\x1d\x38\xbf\xa5\x6c\x82\xee\x91\x7b\x8a\xb6\x15\xa0\xdd\x63\x72\xcb\xab\x57\xe4\x52\xa8\xa6\x66\xad\x6d\x6e\xda\xff\x54\x10\x26\x57\x6d\xb6\xb4\x53\x7b\x01\x5f\x50\x0d\x34\x94\xd8\x6a\xc1\xe4\xf2\x13\x2d\xab\x22\x26\x45\xef\x80\x7d\xd2\x5f\x1d\x9c\x90\x83\x4f\x53\x65\xfe\x4f\xe8\xa9\x3a\x18\x93\xab\xd2\x87\x1b\x41\xb1\xc3\x9a\xb9\xd0\x52\x7c\x21\x3c\xd9\x69\x57\x56\x79\x14\x94\x0c\xce\x01\xc3\xa0\x8d\xd4\x9d\x4b\x72\x8f\x35\xb7\x0c\xfb\x63\x75\x2d\x6b\x9f\xeb\xd4\x39\x86\x40\x9c\x39\x8e\x4c\x96\x55\x2d\x4b\xee\x59\x9f\xbd\xae\x7b\x8b\x9f\x06\xa3\x59\x48\xe9\x20\x6b\x98\x8b\x75\x70\xed\xab\xa4\x2f\x8a\x38\xbc\x05\xbc\x0c\xfb\xf6\x3c\xde\x5e\x4d\x5d\x30\x1b\x1a\x16\xac\xd5\x08\x2c\x19\xf6\x21\x83\x89\x11\x9a\x1b\xb1\x52\x7d\x07\x37\xc9\x6b\x9f\xd1\x4e\x4e\x73\xb6\x38\x55\x39\x7d\x79\x02\xd3\x44\xc4\x09\xe7\xe0\xe9\xde\x9a\xa9\x22\x07\x2f\x0f\xc6\xe4\xc6\xc9\x47\x27\xdd\x3d\xf0\xcf\x05\xa1\x4e\x65\xed\x27\x04\x6e\xb9\x17\x07\xe4\x48\xd6\x30\xb3\x8c\x0a\x52\x30\xba\xb0\xae\x27\xa4\x44\xe1\x89\x82\x05\xe6\x38\xb2\xc6\x41\x5c\x02\x77\xc7\x4e\xf5\x6f\xbf\x0d\xb0\x9f\xb0\xee\x42\xd6\x6b\x58\xd8\x88\xfc\x03\xa3\xb4\x1c\x80\x8a\x21\x0d\x0f\x33\x9c\xc7\x88\x35\x50\x48\xd5\x42\x0e\xae\xdf\x6d\x94\xc1\xcb\x55\xcb\x0e\x7e\x60\x0d\xd9\x82\x30\x3b\xc8\x78\x00\xda\xcf\xc1\x93\x73\x3e\x92\x54\x8d\xc8\xb1\xb6\xb4\x73\xf8\x20\xf8\x8f\x0d\x23\x57\x17\xbe\x0e\x11\xab\x15\x57\xda\x50\xb2\x9c\xab\xbb\xd8\x1a\x16\x90\xf6\x63\xc4\x95\xa3\xb3\x92\xfe\x97\x14\xe4\xf2\xeb\x1b\x3b\xa5\xe3\xcf\xb8\x71\x01\x82\x48\xff\xab\xa9\x99\x11\xb0\xe2\x83\xc4\xdc\x1b\xab\x92\x9a\xf9\x9d\x5c\x50\x4d\x41\x60\x43\xea\x35\x6c\x13\x15\x2d\x8f\x35\x58\x3f\xe1\x22\xb7\x44\xaf\x23\x6d\x3d\x95\x60\x64\xce\xfa\xdd\x76\x69\xb8\x7d\xe8\xc3\xfb\xab\x3d\x08\x4f\x19\x70\xb5\xd9\x5b\x99\x27\x4a\x50\x7f\x35\xdb\x75\x8e\x6f\x93\xd2\xbc\x4e\xde\x49\xc1\x4e\x80\x58\x10\x43\x2d\xf0\x3f\x83\xe8\xfa\x5d\xcd\x35\x8b\x24\x99\x11\x6c\xd5\xed\x5f\xd2\x6a\x6e\x3b\xb6\x24\x60\x80\x06\x7d\xe0\xd6\x59\x06\x3b\x29\xe4\x84\xd8\xdb\xb0\xcf\x99\x7e\x78\x7f\x95\x3c\xd1\x0f\xef\xaf\x9e\x6e\x92\x3b\x08\xd7\xab\xb2\x75\x2b\x67\xb4\xe9\x87\xad\x34\x16\x66\xfe\x06\x46\xbc\x44\x3c\x76\xb2\x6e\x58\x26\x4e\x93\x85\x09\x0f\x07\xb0\x75\x65\xe1\x7d\x9d\xc0\x7a\x35\xf4\xf5\xd1\xbf\x9a\x97\x9f\x2a\x0c\x82\xb6\x0e\xb8\x9b\x39\x85\x8a\x2a\x3e\x0b\xde\x20\x4a\x98\xef\x72\x75\xa7\x0c\x17\x72\x28\x45\x28\x16\x8b\x23\xe4\x82\x61\x20\x47\xfe\xca\x05\x61\x45\x43\xdc\x0c\xf0\x2d\xe4\x16\xe4\xaf\x90\x0f\x10\x4c\x35\xc8\x49\xaf\x84\xff\x20\xd4\x23\x34\xbd\x0a\xff\x2a\x5d\x50\x5e\xd0\x09\x2f\xb8\x5e\x1a\x39\xe6\x78\xec\x33\x2f\x62\x04\x63\x05\x5b\xb6\x37\xa2\xb4\x93\x68\xb6\x66\xf6\x25\x47\x06\xce\x29\x98\x94\x8f\xc7\xf1\x52\xd9\x9c\xd5\x0c\x03\xe8\x51\xb4\xeb\x8a\x74\x66\x6f\xe0\x06\xad\x48\x6c\x71\xe8\x1b\x12\x87\xe0\x38\x0d\x3d\x48\x63\xeb\xe6\x8d\x8d\x6c\x1d\xfe\x70\x83\xa5\x0b\x07\x27\x68\x33\x7d\xbe\x28\xce\x8e\x59\xd2\x41\xde\x0e\xa8\x17\x78\x2a\x96\xbb\xff\x5c\xf1\x8e\xf8\xa4\xf4\x64\x51\xc0\x4c\x52\x58\x51\xc0\x55\x25\xea\x25\x12\x00\x26\x06\xd7\x7e\x63\x49\x9c\x2d\xb0\x89\xd2\x85\xc1\xc1\x6f\x82\x35\x67\xe2\x4b\x58\x39\x4c\x49\x4b\xc1\x9e\x43\x98\xdb\x30\x82\x45\xcf\x23\x63\xd5\x7c\x1a\x1f\x7f\x73\xce\xaa\xf9\xeb\x9b\xbe\xd9\xda\xfc\x46\x5e\xdf\xac\xdf\xd9\x80\x3f\x85\x6a\xdc\x01\x85\x86\xee\x43\x45\x0a\x3e\x65\x9a\x0f\x2e\x6c\xaf\x37\xba\x94\x82\x6b\x59\x0f\x71\x94\xd8\x9b\xea\x40\xa5\x71\xfa\xb6\x5a\xda\x5b\xfb\x3e\x06\x54\x67\xb2\x28\x58\xa6\xb1\xfa\x68\x10\x57\xe1\x00\xdc\x04\x36\xa9\x88\xcc\xda\x72\x7c\x97\x2d\x54\x07\x4f\xf1\xf0\x4f\xdf\x5f\x9e\x5d\xbc\xbd\x1c\x97\xf9\x2f\xe7\xf2\x7e\xa4\xe5\xa8\x51\x6c\xc4\x83\xe5\xda\x3e\x47\xb0\x3a\x8e\x2a\xa2\xa6\x69\x7f\xa3\xbf\x75\xc5\x0e\xc8\x07\x85\x61\x4a\x60\x12\x74\xce\x5f\x29\xf5\x09\xa9\xa9\x9e\x47\xd4\xe3\xd3\x73\x6a\x2d\x92\x4d\x51\xe0\xde\xeb\x9a\xb1\x93\xae\xa1\x63\x20\x93\x32\x71\xa9\xbb\x19\x85\xda\xe5\x06\x98\x41\x70\xb5\x9e\xde\x3f\x06\x33\x20\x4f\x8d\xac\xf1\x7c\x27\x24\xf4\x90\x81\x3d\xbf\xf1\x10\x5c\x2c\x19\xb8\x9e\xb5\x8c\x2a\x58\x06\xf9\x23\x53\x59\x1b\x4c\xad\xfb\x58\xc5\x74\x06\xdb\x70\xda\x28\x56\x8f\x2d\x77\x7b\x1b\x63\x63\x7f\xba\x2d\x8e\x2e\xdd\x98\x5c\xad\x77\x75\x83\xdf\xb3\x29\xa6\xe6\xb8\x2e\x17\x28\x13\x06\xf7\x82\x36\x7a\xce\x84\x76\x6d\x8b\xec\x36\x6e\xdc\xf1\x60\x3f\x04\x1c\x4f\x8c\xc5\x51\xc5\x24\x53\x0a\x40\x3e\x97\x45\x1c\x1c\x7b\x2f\x8b\x68\xae\xef\x03\xf8\x97\xcf\xe4\xae\x69\x2e\x21\x04\x0c\xab\x10\x87\x57\xd3\x41\x6d\x9a\x97\x5c\x3c\x35\xe6\x86\x84\x51\x2e\xf2\xe1\x9d\x59\x29\xc2\x0c\xcf\xf7\xa5\x51\x84\xe1\xbc\x49\xce\x83\x3f\x38\x3b\xea\xb4\x4a\x2c\xc4\x63\xfd\xfc\x7d\x2f\xff\x46\xc4\x5e\xdd\xaa\x72\xa9\x7e\x2c\x46\x38\x83\x51\x95\xb7\x7b\xf5\x73\x75\xcb\x3f\xad\xe9\xf0\x27\xe0\x4c\xdf\x0b\xc6\x90\x67\x01\xd2\x8f\xc7\xdf\xe3\x78\x99\xf1\x01\x12\x0d\xf4\xa4\x54\x2e\xdd\x1c\x6b\xdc\x62\x73\x4b\x6b\xb7\x88\xa9\xb4\x5b\xd1\x9a\x96\x4c\xb3\x1a\xc3\x82\x6d\x10\xb2\xb0\xf9\x79\xdf\x56\x4c\xdc\x68\x9a\xdd\xed\xb3\x84\xff\xb3\x94\xf1\xe5\x4a\x19\xbb\xf9\xb1\x5d\xf8\x61\xee\x71\xc8\x16\xb1\x5c\xc6\x46\xff\x13\xf4\x61\xe3\x85\xfb\x02\xa8\xa0\xaf\x30\x1b\x6f\xe5\xf2\xf5\x44\xfb\xa2\x45\x5b\x71\x16\x8d\x57\xb2\x29\x86\x25\x0b\x5f\xdc\x19\x52\xc2\x82\x7b\xb7\xe7\x0a\x99\x56\xda\x4b\xf7\x0d\xb7\x74\xa9\x94\x39\x23\x13\xae\x5b\x8a\xa2\x98\x26\x15\xab\x4b\x8e\x19\xf5\x41\x4c\x90\x02\xbb\xac\xb3\x1c\x39\xbf\xe1\xe2\x76\x62\x1d\xa9\x40\x10\x99\x69\xd7\xf2\x38\x08\x73\xc2\xf4\x3d\x63\x82\xbc\x78\xf1\xe2\x05\x48\x6f\x2f\x7e\xff\xfb\xdf\x13\x28\xe3\x95\xb3\x8c\x97\x0e\x50\xfb\x60\x58\x29\x14\x39\xf9\x5f\x2f\x5f\x8e\xc9\x7f\x9c\xbd\x7d\x03\xf1\xb4\x95\x56\x64\x22\xf5\xdc\xce\xcc\x3c\xd0\x03\x1e\xd1\xde\xe3\xdf\x6f\xbe\x7d\xe7\x04\x37\xb5\xf2\x36\x28\x9c\x7e\x7b\x23\x03\xb0\x09\x7a\xb7\x5e\xfc\xee\xab\xaf\xc6\xe4\x82\xd7\x50\x95\x85\x43\x8e\x9e\x0f\x6b\xaf\x5c\xe8\xb5\x90\xda\xd7\x53\x0a\x6f\xa9\xad\xb7\x64\x19\xb1\xad\x7f\x51\xf2\xd9\x5c\x63\x3f\x5f\xc0\xfe\x82\x67\x1a\x6b\x61\xcb\x28\x5b\x19\xd6\x18\x55\x36\x11\xd5\xa6\x8a\xdb\x60\x3e\x58\xfc\x09\x29\xf8\x1d\x23\x53\xf5\x97\x5a\x36\x15\x14\x55\x88\x30\xc0\x41\xc9\x47\xa3\xc7\xd8\x6e\xc3\x48\x85\x5b\x5c\x55\x4c\x7f\xa6\x18\xae\x28\x4b\x67\xef\xb2\x5d\xf5\x84\xc6\x13\x5f\x19\x78\x84\x18\x5c\x51\x5e\x6f\xaf\x8b\xde\x59\xce\xdc\x06\xcd\xf4\x7a\xa1\x79\xdb\x48\xde\xa1\x69\xc3\xa5\xb8\xda\x51\xd5\xf2\x1f\xe8\x87\xe6\xc2\xba\xdb\x9c\x56\xa5\xac\x1c\x6f\xcb\x69\x80\xbf\x25\x90\x81\x44\x56\x6a\x2f\x19\xb9\xc6\xd6\x83\xea\x64\x54\x5f\x4d\xbb\xa9\xff\x31\xd6\x9c\x82\x2b\x33\xc5\x5e\x91\xfa\x0d\x33\xef\x36\xfd\xd7\xf3\x88\xbb\x6b\xe6\xd8\x88\x35\xe8\xb6\x7b\xa6\xe5\x0a\xd8\xa5\xd5\xa6\xd8\x07\x41\xb6\x73\xc0\x94\x1b\x9b\xd0\x6b\x61\xad\x95\x7b\x8e\x5b\xbf\xcb\x43\x61\xba\xb1\x47\x0b\x71\xb3\x66\xee\x4c\x29\x9b\x37\x5c\xd2\xfa\xce\x28\xb7\x96\xae\x87\xc5\xea\x6b\xb3\x49\x3e\x17\x1a\xd3\xe3\x17\xcc\xb7\xa2\xef\xe6\xf1\x99\x39\x1f\x8e\x83\xf7\x0d\xad\xf6\x86\x48\x43\x07\x00\xa4\x22\xe6\xbd\x27\xaf\x89\xd3\xcf\xff\xa2\x55\xa7\x11\xbd\x6d\x9e\x49\x7b\xb9\x42\xe1\x10\x06\x77\x0a\xe1\x7d\x4d\x10\xad\xe3\xfb\xc1\xc4\x75\x84\x31\x4f\x55\x31\x3d\xeb\x52\x64\xfa\xe8\xe6\x31\xdb\x3b\x95\xda\xcb\x1a\xd3\xeb\x25\xb1\xf3\x08\xc1\xb8\xb6\xf4\xd9\x85\x04\xa0\x28\x88\xa4\x2b\x26\xa1\x5b\x14\xca\x02\xf4\x7a\x69\xa7\xc9\x3d\x38\x52\xa5\x9f\x48\xb0\x2f\x92\x64\xa0\x48\xa0\xae\x6a\x5f\x94\x24\x14\xbb\x7e\x90\x97\xae\xa6\x98\x1c\xdb\xe3\x16\x8e\x1a\x76\x24\xdf\x48\xa0\xbe\xe3\xb5\xcf\xa7\xdd\x2e\xfc\x44\x82\x44\xa9\x24\x52\x04\x8a\x84\xd9\x15\x94\xc2\x82\x50\x24\xd0\x18\x71\x09\x47\x6a\xe7\xb2\x14\xd1\x09\x47\x8c\x6b\x17\xc7\x1a\x3d\xf1\x5c\xaa\xea\x75\xaf\x2c\x58\xa8\xa2\x4b\x3b\x4a\xd0\xed\x1c\x69\x1a\x93\xb7\x96\xd7\xe1\x55\xa5\x13\x25\x8b\x46\xe3\x07\xe2\xe8\x15\xf1\x20\xba\xec\x12\x26\xe8\xca\x94\x01\x0f\x74\x8f\xc5\x9e\x58\xcb\x42\x41\xb8\x41\xee\x15\xc3\x4d\x71\x44\x93\xd1\xe7\x26\x0b\x0f\xdb\xbf\x47\x68\x71\xd2\xf6\xbe\x0a\x2f\xfe\x31\xda\xa1\x64\x8a\xc7\x1b\x52\x6e\xae\xc8\x51\xdb\x2a\xd3\x05\x55\x5d\x09\xcd\xea\x29\xcd\xd8\x71\xc7\xc0\x32\x38\x39\xdf\xa0\xd4\xc7\x9e\xba\x1c\xcd\x39\x15\x79\x81\xce\x81\x8c\xd5\x70\xc5\xd8\x27\xcd\x6a\x11\xe0\x51\x66\x6a\x79\xcd\x17\xac\x56\xe4\xe8\x6b\x66\x34\x27\x46\x75\x53\x0f\xdb\xb4\xf7\x9b\x2a\x00\x9f\xdf\x87\xa1\x07\x00\xa5\x05\x09\xc2\x2b\x4e\xfb\x12\x9d\x4b\xdb\x6e\xcc\x70\xea\xb1\x1b\x78\x00\xaa\x6b\xe2\x1a\x1b\x74\x05\xbe\x04\x24\x6a\x29\x9b\xda\xfa\x1b\x6d\x0f\x8c\x20\xd0\x4c\xd6\xb5\xe1\x94\x30\x31\xaa\x48\xcd\x66\x46\x13\xab\x41\xa5\xc3\x4c\xf6\xa2\x31\x3f\xec\x2d\x4c\x7b\xaf\x81\xf2\x9d\x30\x76\xeb\x65\x0a\x3b\xa5\x9c\x17\x6a\x6a\x95\x42\xb9\xe0\xb9\x13\x6b\x20\x0e\xc1\x4a\x75\x5c\x91\x8a\x2a\x15\x61\xd3\xb1\xaa\x6f\xa7\x41\x5a\xe7\x6c\x51\x05\x05\xb1\xc7\xd7\x3e\x89\x52\xe0\x9d\x0f\xb9\x9b\x17\x2b\xa1\x6c\x5d\x30\x52\x22\x9e\xed\xc8\x9c\x5d\x37\x93\x82\xab\xf9\xcd\x4e\xae\x95\x77\x1b\x00\x60\x68\x5d\x37\x5c\x24\x6a\xbd\xdb\xdc\x31\x44\x31\xa1\x38\x08\x1c\x86\xb1\x19\x31\x27\x26\x6b\xd1\x68\x3c\x54\x29\x77\x38\xdd\xdb\x26\x21\x69\xb5\x60\xb6\x94\x97\xf9\x53\x67\x1d\x1f\xe3\x2c\xef\x58\xe2\x30\x67\x1f\x44\xd5\x7d\x8f\x64\xb4\x28\x94\x95\x6c\x7d\x35\x18\xc7\x9e\xe2\xcc\x21\xae\xda\x00\x62\x23\x37\x88\xea\x5b\xa7\xae\xf4\x59\x88\xb9\xe3\x1b\x37\x56\x91\x52\x62\xf6\xb5\x20\x52\xb8\xdd\x87\x2a\x90\xf6\xbf\x23\xd4\x66\x5f\x2d\x83\xd6\xcc\x5e\x96\x38\xd4\x7c\xf6\x79\x6d\x1d\x3f\x0d\x9f\xd7\x4e\xde\xee\xb6\xc7\x35\xed\xd4\x01\xea\x75\xcf\x18\xe8\x18\xd5\x99\xa5\x57\x40\x37\xd4\xfc\x49\x72\x9b\xa7\x26\xab\x9e\x69\x5d\xf3\x49\xa3\x13\xeb\x7e\x7f\x5c\x79\x19\x84\x2b\xa3\x9f\x03\x41\x1a\x59\xdd\x3a\x4b\xb0\x18\x59\x35\xd7\x5f\xbb\x75\x32\xe7\x65\x83\x20\x54\x10\x1b\xf0\xa5\x43\x45\x72\x99\x35\xbe\x31\x0a\xc8\x11\x6d\x60\x48\xb8\x8e\x3f\x49\xbb\xe2\xa9\xc5\x93\xbb\x1f\x08\x60\x69\x2e\xef\xc5\x3d\xad\xf3\xb3\xeb\xc1\xcc\xc1\xbe\xb0\xd6\xbe\xd3\xf5\x48\x3a\x50\xc4\xfc\x4e\x27\xb2\xd1\x41\xba\xeb\x0a\xca\xb8\xba\x45\xff\x42\x0e\x4a\x2d\x0d\x4d\xea\xf8\x1b\x83\xe7\x35\xe0\x8f\x24\xdb\x2c\x80\x31\xfc\x7d\xc5\x45\x1a\x76\x81\x46\x38\x3c\x57\x4c\x85\x11\x46\xc0\xb0\xe7\xa0\x0f\x28\xca\xfc\x17\x61\x5c\xef\xb9\x48\xf7\x64\xf8\xeb\xbb\x48\xa3\x5c\xa0\x61\x89\x66\xc5\x45\x1a\x76\x81\x46\x68\x2d\x6b\x2e\xd2\x08\xfb\x5f\x84\x8b\x6b\xc5\x45\xba\x07\xcb\xdf\x4f\xca\x45\x6a\xde\xe8\xf7\xc7\xe9\x91\xbe\xc8\x98\x14\xb3\xe3\x9f\xd5\xd7\xd4\x21\xe3\xc8\x79\x57\xf3\x24\x53\xf4\x08\xa0\x34\x48\x56\x5a\x7c\xea\x68\x27\xae\xd3\x24\x08\x68\x9f\xcf\x2f\xf5\x08\x1e\x27\x58\x51\x84\x42\x88\x63\x5b\xc2\x15\x76\xc5\x42\x47\x76\xeb\x31\x8f\xf5\xec\xc8\xfc\x15\xb4\x78\x20\x54\x08\x89\x32\x89\x3a\xb1\x9d\xa6\x4e\xac\xd5\x42\xe4\xf0\x1f\xaa\xa2\x11\x45\x3f\x70\x40\xeb\x2c\x27\xd6\x24\xd9\xe4\x23\x8f\x8e\x24\x1d\x1f\x81\x23\x84\xfd\x19\x28\x55\xdb\x1f\x69\x67\x49\xa0\x69\x90\x53\x1d\x62\xdf\x58\x15\x63\xf1\x6d\xa7\x31\xa9\x6c\xce\x4a\x0a\xff\xf9\x3a\x69\xea\x38\xb8\x22\x46\x48\xd7\x0c\xab\x33\xb1\xba\x54\x44\x4e\x4f\x7a\x8d\xff\x0e\x16\x2f\x0f\x62\x1d\x00\xc9\x4e\x4b\xe2\x70\x3c\x54\xe1\xb3\x3f\xd6\xeb\x7d\x7a\x17\x88\xc1\xef\xb6\x4d\x73\x04\x23\xeb\xcc\xbd\x17\x3b\x01\xd4\x16\x77\xfb\xd1\x96\xff\x65\xfa\x6c\x4f\xbc\x2d\xfd\xd9\x67\xfb\xec\xb3\x7d\xf6\xd9\x76\xc7\x8e\x3e\xdb\x0e\x33\x06\x72\xc5\x95\x8b\xed\x43\x3f\x6e\xec\x8d\x35\xef\x76\x1d\x18\xd6\xe5\x0b\xcd\x2c\x51\xed\x1a\xfb\xea\xe3\xd1\xd7\xb5\x75\xf6\xca\xba\x1f\xea\x74\x38\x1e\x1f\x1e\xa2\x0b\x38\x4e\x79\xf3\x20\x1b\x3d\x1d\xfd\x81\x30\x91\xc9\x1c\x11\xd6\xcc\xb5\x56\x1a\x84\xc9\xd6\xde\x97\xbe\xfa\xd2\xd5\x56\xef\x86\x56\xc1\x3c\x53\x50\x24\x9a\x42\xbb\x4a\x66\xaf\x1f\x20\x88\xb5\xe2\x97\xaf\xba\x6a\x37\xc0\xd7\xae\x8d\x65\x7d\x20\x87\xb5\xfd\x7e\xb1\x1b\x36\x5c\x36\xd7\x7f\x98\x1c\xe1\x8f\xe3\xac\x6a\xe2\x0c\x93\xae\xa9\xf6\xb8\x64\xa5\xac\x97\x27\x1e\x94\x01\xd1\x83\x6d\x9f\x18\xae\xc6\xdc\x0e\x23\xe1\x65\x4d\x5d\x33\x01\x3d\x82\xbf\x34\x59\x2f\xba\x48\x1d\xd9\x49\xd4\xf3\x67\x1b\x53\xf5\xa2\x1d\x2b\x59\x7f\xde\x9f\x0c\xd6\x75\xbf\xc6\x28\x1b\x6d\x3b\x6c\x5e\xe3\x89\x77\x82\x00\x4f\x63\x62\x41\x16\xb4\x56\x71\xe7\x41\x76\x93\xee\x72\xbe\xe0\x2a\xdc\xd2\xb2\xf3\xc2\x66\x73\x35\x34\x15\x68\x74\xd5\x68\x4b\xb3\x63\xaa\x45\x74\x66\x3e\x67\xbe\x2e\xb1\xbf\x3f\x2b\x82\xee\xcb\x70\xda\x9b\x1b\x5f\x64\x3b\xe7\xfe\x08\x36\x77\xee\x8f\xf8\x56\xcf\x9b\xdf\x4b\x42\x8a\x9d\xbb\xac\xaf\x0e\x77\x94\xbb\xde\xaf\x96\x2d\xb7\x05\xb1\x9d\xf2\xb0\xe7\x6b\x01\x9e\xc4\x0b\x9e\x90\xf2\x7b\x69\xdf\xe8\x67\xe6\x68\x56\x56\xb2\xa6\xf5\x92\xe4\xd6\x22\x18\x28\xba\xbf\x56\x7c\xa6\x53\x7d\xe6\xc1\x55\x36\x61\x55\x39\xaf\xf7\x90\xf5\x1b\x5d\x7e\x86\xe5\xbc\x29\xd3\x8c\xe8\xdf\x41\x85\x6b\x5b\x3d\xdb\x85\xd5\x20\x20\xdf\xd6\x80\x66\xc3\x25\xd3\x71\x33\xb9\x6a\xf7\x1d\xe5\x9a\x6e\xd1\xd7\x83\x95\x6e\x55\x46\x5e\x8f\xf2\xa5\x09\x99\x33\x73\x30\x0e\x18\xce\xad\x17\x3d\x8b\xae\xe8\xc8\x7b\x76\x64\x01\x1d\x1b\x99\xee\x2d\xb0\xed\x27\x39\x6b\x92\x54\x1c\x83\xff\x17\x7b\x63\x64\x8f\xc4\xb2\xd2\x12\x94\x3d\x5b\x83\x69\x4a\x0a\x99\x75\x82\xa5\x1c\x8b\x0c\xdb\x48\x21\x3e\x87\x2b\xe2\xef\x99\x73\x68\x9a\x53\x35\x73\x43\xc1\x08\xac\xb1\x85\xc2\xb8\x0f\x9e\xd1\x49\xd0\xb4\x8a\xb0\x51\x58\xf2\x27\x79\x0b\x75\xb9\x3f\xf1\xb2\x29\x49\xa3\xcc\x4c\xa1\xb9\x60\xe7\x99\x20\x54\x3f\xd1\x7b\xd7\x88\x03\x2a\xfb\x70\x01\x40\xfb\x3e\x0e\xf3\x97\x1b\xb7\xbf\x61\x13\xb9\x37\x7b\x40\xea\xb2\xd3\xde\x54\x03\xb2\xba\x9d\xa5\x95\x36\xe5\x94\xd0\x40\x97\x34\xd2\x95\x7f\x94\xef\xef\xb0\x76\x5f\x04\x2f\xba\x17\x26\xe2\xa6\xd8\x42\xf5\xfe\x60\x1a\x61\xe3\xfd\xd6\xb0\x7b\x33\x72\x37\x8a\xd5\xa3\x59\xc3\xf3\x74\xb4\xfe\x62\x79\x7e\x14\xa7\x4f\xe3\xef\x49\x5c\x7d\x67\x5e\xee\x23\x1d\xa3\x79\xe2\xc1\xa5\x0f\x8e\xec\x31\xc5\x6e\x51\xf9\x36\x50\x72\x70\xde\x93\x25\xa1\x2e\xb2\xce\x13\x0f\x1b\x9e\x74\x74\x56\x54\xf3\x4e\x94\x24\xe0\xad\x6b\x05\x33\x08\xd5\x30\xd6\x6c\x99\xd9\x72\x48\xbc\xd7\x05\x03\xa7\x87\xf8\x0a\xd9\x4a\x23\xf3\x3f\x31\x2d\x07\x9d\x4b\x75\xc2\xa6\xb2\x6d\x31\x8c\x2a\xb0\x3a\xb1\x76\xaf\x82\x69\x48\xb7\xc2\xcb\x1f\x74\x8d\x43\x18\x53\x29\x17\xe6\xea\xfc\x4d\x90\x0f\xae\x99\x23\x9f\xbe\x22\xf4\xb8\x6b\xad\xe2\xc1\x16\xcf\x84\x08\xc6\x72\x4c\xf6\x2a\xda\xf9\xd5\x8d\x50\x27\x64\x72\xec\x36\x12\x68\x87\x30\xd2\x7b\xe1\x54\x92\xc0\x66\xde\x81\x05\x49\x4b\x2c\x14\x55\xcb\x92\x28\x41\x2b\x35\x97\x1a\x6c\x15\xb4\xa2\x19\xd7\x4b\xf3\xac\xae\x69\x76\x07\xed\xc8\x03\x25\xa2\x70\xa6\x27\x24\x3b\xb6\xf1\xe4\xbd\x93\xe7\xaa\x43\x0b\xf5\xbc\x96\xcd\x6c\x0e\x39\x53\xe1\x4a\xc5\x59\x41\x95\x3b\x8c\x8d\xb0\xad\x06\xac\x48\xbe\x14\xb4\xe4\x59\x8c\x33\x0f\x62\x23\x15\x97\xd6\xcf\x85\xf3\x81\xde\x7d\xd7\xbe\xe6\x3a\x3a\xd8\xce\x0b\xca\x4b\x72\xa4\x18\x23\xfe\x92\xe0\x5f\x6e\xc2\x6a\x2e\x9a\x38\x6b\x46\x6c\xfd\x2c\xeb\x99\x73\x15\x0e\x6d\x69\x05\xf3\x4b\xcb\x5f\x02\x59\x80\xee\x4a\x1a\xa1\xcb\x06\xd5\x6d\x9c\xf2\xb1\x47\xbf\x8d\x7f\x1e\xfc\x86\xac\x21\x70\xce\x75\x44\x61\x22\x97\x6d\x28\x0f\x39\xbb\xbe\x42\xe3\xed\xc2\x75\x3f\x32\xf7\xcf\xd6\xaa\x0f\x6e\x47\x21\xc5\x0c\xe3\x82\x85\x65\x39\xee\x66\x1b\x06\x28\xa0\x43\xf4\x82\xe7\x0d\x2d\x90\xb5\xfd\x6d\xd8\x90\x6d\x16\x78\x7e\x73\x85\xa0\xf9\x6c\xae\x47\xf7\x0c\x0c\xb8\x28\xbd\xb4\x41\xdf\x6e\xb2\x3c\xec\xa4\xeb\x04\x54\x72\x05\x2c\x54\x5b\x63\x20\x3a\x03\xcc\x72\xef\xe9\x12\xea\xb9\xe2\xad\xec\x45\x16\x0d\x6f\xad\xad\x2e\x8e\xe0\x3d\x7e\x74\x90\x03\xce\xed\xcc\x77\xdc\x6d\x14\x03\x5b\xfc\xb0\x32\xb2\xac\x90\x0a\xac\xaf\xd7\x20\x48\xa7\x8f\x80\xff\x39\x1c\xe8\xa3\xa8\xc1\x33\xa3\xcd\x0c\x29\xf0\x7b\xd6\x42\x7e\xa6\xd1\x77\x70\x27\x6f\x59\x59\x15\x54\xa7\x05\x32\x1d\x7c\xd7\x71\x61\x74\x1c\xfa\x86\xb8\x52\x91\x8f\x68\x61\xae\xf2\xf5\xc7\xf3\xf0\xea\x65\x4b\x16\x7b\x5b\xe1\xba\xe0\x73\xe1\x1b\xfd\x19\xf1\x3e\x99\x1a\x12\x74\x8d\xb2\x72\xc2\x72\xe0\x6a\x76\xe6\x60\x83\xba\x17\xac\x76\xb7\xe3\xfa\xe3\xf9\x09\xe1\x63\x36\x8e\xf2\xa7\x5f\x7f\x3c\xf7\xa0\x1c\xbb\xd6\x72\x86\x89\x2f\x3e\xc1\x09\x88\x09\x2c\x65\xa0\xd1\x58\x3b\xda\x99\x78\xd8\x7f\xff\xa3\xd9\x04\xf3\xf6\x9f\x46\x7f\xb4\x64\x18\xfe\xf5\x77\x23\x1d\x44\x54\x50\xfc\xfb\xca\x5b\xdd\xcc\x09\xdf\xfb\xf3\xef\xd7\xb6\x7b\x9c\xed\x2d\xf7\xf7\x20\x58\x88\x35\x21\x4c\x68\xa3\x8b\x5e\x4b\x88\x65\xe4\x39\x62\x3d\xcc\xbd\x66\xff\x70\xee\x27\x38\xc6\xb0\x81\xcf\x32\xa7\x8c\x6a\x26\x40\x42\xb2\xe9\xf9\xe0\x21\x00\xf0\x40\xba\x28\xec\xcf\x51\xcc\xd5\xb2\xf5\x5a\x4e\x88\x96\x12\x78\x00\xf2\xa7\x33\x41\xd8\x27\xae\xa0\x70\x13\xee\x35\x1c\x17\xd5\x71\xa7\xe4\x04\x53\x33\x2d\x83\x41\xbe\xc0\x97\x59\x27\xac\xfd\xd7\x42\xea\x5f\xfb\xeb\x11\x4b\x04\x40\xaa\x94\x84\x2e\x24\x77\xad\x0f\x0d\x29\x16\xe0\x59\x69\x1b\xec\x4d\x96\xa4\xe4\x4a\xd3\xbb\x88\xb4\xed\x1b\x23\x54\x76\xa3\x6a\xf0\xf4\x05\x81\x36\x2a\x2c\x27\x8d\xd0\xbc\x80\xbf\xfa\xef\x44\xa1\x7e\x57\xe0\xbc\x9a\x12\xd5\x64\x46\xb2\xaa\x6a\x36\x72\xe2\xad\x7d\x0a\x18\x59\x0c\x15\x70\xbb\xd5\xee\xe5\x89\xbf\x0c\x73\x8a\xf6\x97\x2a\x07\xd0\x51\x7e\x51\x2a\xec\xf5\x5e\xad\xb3\x09\xfb\x20\x45\xd6\x8a\xb6\x80\x0c\x11\x35\xbb\xde\x81\xb4\x5b\xb8\x70\x3b\x34\x35\xd9\x34\x4b\xc1\x32\xa6\x14\xad\x97\x27\xd0\x0e\x93\x6b\x52\x06\x63\xb1\x88\x5d\xf4\xb4\x29\x50\xd4\x2f\xa9\x80\xa6\x93\xa4\x66\x99\x14\x4a\xd7\x4d\x06\xa7\x47\xc9\xa4\x96\x77\x4c\xc4\x26\x0f\x11\x83\xe5\xfd\x8c\x89\x96\x43\x41\x7c\x8f\x24\xd9\x9c\x8a\x19\x53\xd1\x55\x35\x4a\x9a\x03\xee\x7d\xe3\xd5\x43\xb7\x9f\xe6\x84\xe8\xd4\x68\x5e\x5c\xc3\x51\x4d\x8c\x4c\xe9\x5c\x98\x31\x53\x75\x96\xdb\x93\xd6\x23\x68\xb6\x94\x17\x83\x42\x00\x49\x73\x2c\xc5\xba\x94\x46\xa0\x34\x84\xec\x07\x09\x2e\xa4\x92\x69\x9a\x53\x4d\x93\xf3\x29\xde\x52\xdf\x11\xd3\x86\x68\xc1\xe1\x75\x42\xb7\xe2\x9c\x6f\x20\x3a\x5a\x7e\x92\xc9\x8a\x77\xeb\x8b\x00\xfd\x9b\xbb\xf3\x8a\xb5\xfa\x73\x3d\x26\xef\xa4\x0d\x01\xc0\x54\x0a\xf0\x10\xd2\xa2\x90\xf7\x2c\x87\x69\xba\x2f\x22\x23\x88\xa0\x2b\xb0\xfe\x06\xb4\xc3\x96\x99\xc4\x84\xeb\x24\x79\x17\xcd\xe1\x26\x9f\xc4\x6d\x1b\x4d\x94\xb5\x81\xfc\xb0\x7f\x9b\xf4\x9c\xb8\x18\x23\x03\x94\x09\xcd\x6b\xd6\x2d\x2a\x63\x0f\xa8\x11\x78\x41\xdb\xa3\x8a\x82\x69\x8e\x13\xce\x7b\xc6\xb4\x6a\xa3\xb7\x91\xcf\x1b\xe2\x6f\xa5\x3d\x90\xaf\xa2\x20\x82\x40\xee\x8e\xd8\x9a\xff\x36\xab\xab\x21\x65\xdd\x0d\xb0\xbf\x22\x3f\x37\x12\xcc\xde\x4f\x38\xdd\xc1\x8b\x6d\x68\xdf\xca\x3c\xde\x23\xbc\xd2\xc9\xb5\x05\xd0\x26\x84\x61\xd2\xa1\x8a\xb2\x5f\xf7\x67\x02\x51\x35\xaa\x6b\xb6\xb1\xcc\x66\x4e\x17\xd6\xcd\x13\x0d\x31\xdd\x45\xd0\x2a\x6e\x23\xdf\x7f\x0d\xa6\x35\x82\x69\x8d\x5e\xc6\x3a\xd3\xe2\xa3\x92\xfd\x64\xe3\xa2\x93\xfb\x1f\x48\xf0\x56\x1a\x32\x7c\x93\xe4\x64\x5c\x6d\x82\xe9\x79\xaa\x8d\x82\xf2\x91\x7a\x91\x2d\x25\xdd\x60\xdc\xd0\xce\x57\xe4\xd7\x3d\x69\xd4\x6a\x35\xde\x2c\x16\x1f\x30\x61\xc6\x91\xb3\xa7\x8d\xed\x51\xba\x3a\x85\x7d\xb0\xc7\xe4\xd7\xd1\x20\x57\x45\xe5\xa3\xcd\x66\x9f\x1d\x21\x66\x8d\xd2\xb2\x5c\xed\x5f\x6c\x44\xf6\x32\x98\x59\xdf\x1d\xd0\x91\xcc\xa6\x04\x19\xe2\x8c\x26\xdf\x63\x72\x25\x88\xac\x73\x4c\x51\x6d\x14\xb3\xdf\x8b\x06\xdb\xce\x0b\x2c\x1d\xfd\xd9\xad\x7e\x34\x36\x3e\x07\x65\xfd\x33\xb1\xc4\xfd\xbb\xf0\x18\xe9\x0c\xab\x64\x66\x34\xe9\x32\x3e\x42\x0b\xc4\x48\x26\xe8\xa4\x68\x93\x58\x5b\xa5\xda\x28\xb8\x35\xb8\x1c\x63\xaa\x0b\x74\x87\x21\x64\xb5\x2c\x0a\x56\x03\xb2\x5b\x8b\xe7\x4a\x64\x6d\x54\xab\x2c\x37\x70\x3b\x4f\x9c\xa5\xbc\xb5\x1a\x08\x76\xef\xd5\x1b\x1a\x93\xad\xe4\x46\x6b\xd3\xd4\xe0\x3d\x70\xa1\xd4\xbd\xf9\xd9\xef\x46\xc6\x2a\xed\x10\xad\x94\x1a\xaf\x04\x85\xaf\x78\x44\x56\x92\x7b\x38\x4a\x2f\xc5\x91\x1e\xdc\x04\x91\xec\x10\xea\x19\xff\xc6\x6a\xf7\xac\xeb\x2b\x00\xe0\xac\x0b\x33\xf8\x47\x6c\xd1\x84\xee\xf0\x77\x6e\xc2\x0c\x85\x68\x0b\x01\x02\x66\xbb\xef\x24\x81\xb4\xaa\xfa\x4a\xf4\x6e\x8b\x22\xdf\x40\x77\xae\x94\xfb\x46\xf0\xce\xb9\x8a\x0e\xb2\x66\x10\x61\x0e\xab\x1e\x43\xdf\x61\x2a\x96\x91\xa5\x26\xbb\x43\xcf\x79\x9d\x8f\x2a\x5a\xeb\x25\xd2\x9c\x93\xde\xce\xfa\x4c\xf5\x04\xa0\x3b\x05\xf4\xc4\xb4\xfe\xeb\x8e\x1e\x2e\xc0\x76\x5a\x3c\x70\x51\x1a\x49\xe1\x79\x6e\xac\x62\xc0\x63\xaf\x3a\x36\xe7\xdd\x8d\x7e\xe1\x06\x6b\xab\xea\x56\x25\xf9\xe2\x57\xed\x83\xe7\x76\x93\x86\xde\xfb\xd8\xd5\x8e\xff\xb6\x13\xc5\x90\xcc\x68\x87\x45\x5e\x14\x65\xa3\x81\x3e\x50\xe4\xf5\x73\x7a\x44\xae\xb1\x0b\xad\xc6\xc0\x8d\x9d\xf1\xf4\xf0\x0d\x06\x7e\xe0\x8f\x13\xbb\xe5\x36\x96\x25\x09\x51\xdb\x98\x9d\x4c\x96\x55\xa3\x59\xe7\x18\xad\x1d\x20\x51\x55\x21\x49\xea\x4a\xcf\xd3\x72\x8a\xfd\x37\x47\x76\x2a\x23\x3f\x95\x91\x0f\x5d\x09\xf6\xb6\xea\x8e\x1d\x0e\x93\xec\x9c\x7f\xdf\x1d\x5f\x6c\x60\xca\xca\x42\xd3\x02\x52\xc9\x03\x82\x52\xc9\xee\x81\xa9\x64\x7f\xc1\xa9\xc4\x07\xce\xef\x7e\xf5\xde\xbb\xb0\xfe\x95\xcb\x97\x48\x2d\x49\xe0\xf2\xed\x22\x26\x10\x23\x5d\xf9\xf9\x71\xe5\x5a\xe5\x5b\x8f\x8b\xbf\x44\xf1\x5a\x0e\x01\x75\xbe\x17\x94\x6d\x49\x0f\x38\xc3\xd1\x85\xc2\x3e\xb9\xd6\x25\x49\x70\x3b\xa2\x1c\x08\x59\xf7\x5c\x81\x75\x9f\x8a\x56\x3f\x03\xb2\x30\x8a\x2b\x20\xd7\x1f\xb6\xa4\x73\x62\x80\xe5\x33\x39\x7a\x26\x47\x11\x63\x2f\xe4\x08\x63\xda\xe3\x13\x31\xfa\xba\x1a\xfa\x12\xc8\x8f\x0d\xab\x97\x44\x2e\x58\x27\xa6\x06\x1a\xaf\x28\x9e\x27\xec\x87\x21\x10\x13\x2e\x72\x2e\x66\xb1\x04\xe7\x89\x24\xa5\x92\xea\x6c\x7e\xf9\xc9\x48\xa6\x90\x17\xbb\x33\xe1\x5e\x05\xd4\x96\x74\x48\x3a\x7a\x39\xb5\x3b\xef\x8e\xcf\x51\x6a\x30\x76\x8d\x6d\x2d\xd8\xf6\x97\xb4\x1b\x60\x74\xd0\x77\x17\xbb\x28\x87\x29\x06\x5a\x92\x6e\xa4\x25\xdb\x10\x70\xd3\x36\x24\x41\x25\x78\x10\x1e\x4e\xbf\x5f\x72\x6c\xb3\x8b\xfe\x80\xa2\xf8\x27\xd6\xcf\x66\xbb\x75\x39\xd0\xe8\x20\x4f\x3b\x97\x7e\xf3\x80\xb8\x82\x4f\x2b\xef\xef\x46\xfb\xd3\x6d\x52\x38\xe2\x4a\xb2\xf7\xdf\x70\xdb\x94\xc6\x5a\x76\x64\x49\x09\xa5\xdb\xbb\xa3\x87\x82\xd8\xf8\x00\x43\x01\x01\x17\x53\xd7\x8c\xc3\x87\xb0\x7b\x14\x84\xb4\x02\xa0\xa4\x69\x87\x4c\x76\x35\x5a\xe0\x70\x07\xf0\xc0\x6d\xf1\xe8\xde\x8d\xc7\xde\x61\x5f\xee\xd8\xf2\x50\xd9\x8c\x60\x29\xd4\x9c\x57\xae\x43\x18\x88\xac\xbb\xdc\x02\x1c\x1f\xc1\x6b\xe8\xa6\x89\x3e\xe7\x2b\x71\x42\xde\x49\x6d\xfe\xef\x12\x02\x39\x76\x80\x6b\xee\xe6\x85\x64\xea\x9d\xd4\x00\xe3\x49\x0f\x0f\xb7\xe3\x81\x47\x67\xcb\x1b\x18\x82\x28\x6c\x70\x56\x52\x4e\xa5\x1b\xb6\x24\xb7\x3d\x22\xe7\x4d\xf0\x88\x11\xd1\x2d\x64\x7d\x80\x1b\xc6\x9d\x91\x6f\x9a\xa2\xec\x34\x93\x2d\xaf\x38\x26\x8c\x08\x29\x46\xd8\xe9\x76\x3f\xf3\x44\xf4\x31\x73\xed\xe2\x42\x77\xca\xbb\xa0\x96\x5f\xa4\x2f\x41\x6a\x6b\x3e\xa4\xf2\x5d\x37\xc0\x12\x5c\x15\x34\x63\xb9\x8b\x97\x80\x46\x20\x54\xb3\x19\xcf\x48\xc9\xea\x40\x70\xfb\xe6\x51\x19\x29\x67\x57\xc4\xdf\x6d\x2d\x3b\x48\x12\xdd\x8f\x26\xde\x36\x10\xe3\xde\x40\x1c\xcd\xc3\x44\x41\x84\x81\xc2\x47\x49\x2b\x43\xd2\xfe\xdb\x48\x0d\x80\x23\xff\x93\xa8\x5f\xf1\x5a\x8d\xc9\x19\x51\x5c\xcc\x0a\xd6\x85\xe3\xdc\x0b\x9d\x4f\x26\x81\x36\x33\x33\x2a\xf6\x8f\x0d\x5f\xd0\x82\x61\x38\x39\x15\xbe\x7e\xbf\x9c\xae\x09\xb6\x69\xc2\x12\xf6\x50\x32\xac\xd4\x47\x99\x1d\xdc\xb1\xe5\xc1\x49\xef\x2a\xa6\xba\x6a\x0e\xae\xc4\x41\x5b\x72\xa4\x47\x29\x9c\x68\x97\x26\x75\x8b\x62\x49\x0e\x00\xce\xc1\xba\x8c\xfd\x10\xb9\xf9\x33\xa8\xe3\xc9\x78\x6f\x0d\xdc\xe7\x05\x55\x2a\xa5\x76\xc1\xf6\xba\xbe\x37\x1d\x88\xf1\xf9\x99\x6e\xd8\xe8\xce\x0c\xa2\xa4\x76\xcd\x61\xdd\x60\xad\x87\x7c\x9d\xd4\xc8\x94\x84\x7d\x5c\xd8\xe6\xae\xb1\x25\x9e\x56\xb9\xb3\x7f\xdd\xa7\x8c\xdd\x77\xb2\x98\xa3\xb7\xaf\x4d\xe2\xf2\xc5\x23\xfa\x3b\xfa\x11\xf2\x46\x13\x20\x76\x6a\xc1\x73\x05\xd6\x33\xee\x12\xcf\x84\xd4\x84\x8b\xac\x68\x72\x88\x42\x8b\x8f\x1b\x80\x68\x30\x55\xb1\x2c\xcd\x20\x90\x7c\x1c\x3b\x23\xf4\x47\xff\xba\xd3\x02\xac\x05\xa3\xf5\xbb\xc5\x47\x73\xc8\x8d\x71\x80\x90\x82\x8e\x91\xd7\x5c\xd9\xd3\xd9\xe7\x6e\x4c\x07\x83\x18\xfb\xe5\xfe\xcf\xfb\xf9\x95\xaf\xf9\xa4\x66\xe4\x7c\x4e\x85\x60\x45\x3f\xf8\x66\x70\x86\x86\xdf\xd9\xb6\xe4\x28\xce\xdb\x86\xe3\x87\xfd\x8e\xe3\x8e\x76\x0b\x57\xa3\x63\x10\x68\x1b\x93\xbd\x87\xf6\x15\xff\xba\x2d\xc2\x7d\x5b\x86\x20\xe0\xc4\xe6\xe0\x31\x89\x19\xbd\xe6\xe0\x58\x4f\x7d\x2e\xef\x49\x2e\xc9\x3d\x74\x14\x5c\x18\x71\x02\xba\xf7\x29\x2b\xb4\x04\x41\x76\x9a\x30\x40\x70\x6a\x26\xcb\xaa\x96\x25\x57\x2e\x59\xc1\x22\xd3\xde\xca\x13\x14\x4d\xb0\x4a\xe3\xb6\xb2\x7c\xaf\xcf\x89\xa6\xf5\x8c\x69\x03\x84\x88\xa6\x9c\xb0\xc8\xb2\x09\xfb\x2e\x41\xfb\xd3\xee\x89\xbe\xbf\xb6\xe5\x78\x1c\xdf\x7d\xf7\x2e\xad\x1e\xef\xc6\x33\xbd\x97\x75\x91\xdf\xf3\x1c\xc3\x36\x14\x39\x32\x60\x8f\xe3\xe6\xba\xc7\x82\xbb\xd1\x88\x7c\x7f\xcf\xf3\x87\x2c\xdb\x8a\x10\xb0\x6c\x02\xeb\xb6\x7d\xb2\x39\xab\xc3\x92\xf5\x11\x7c\xfe\x98\x5c\x72\x4c\x74\x33\xff\xc2\x4a\x73\xe5\x84\x0b\x9b\x67\x3c\xed\x1c\x50\x10\xa2\xe1\x16\xe6\x5e\x39\x0d\x59\x31\x8d\x29\x34\x90\x05\x22\xf5\x9c\x28\x5e\x36\x85\xa6\x82\xc9\x46\x15\xcb\x48\x34\x7a\xea\xa3\x99\x16\xec\x13\x62\x7b\x3c\x5f\xf6\xaf\xf4\xf9\xf3\x8c\x09\x56\xfb\x8c\xf2\xb8\x28\x22\xe7\x50\x6d\xc3\x3e\xf3\x53\xcf\xac\x7d\x2e\x19\xfb\xc4\x32\x0c\xb0\x24\x55\xd1\xcc\xf8\x60\x76\xc5\xcf\xa0\x65\x54\xdb\xc0\x26\xa6\xb4\x8f\xaf\x31\x13\xd7\x34\xf5\xf3\x74\x70\xfa\xa2\x85\x91\xdb\xcd\x6d\x98\x72\x56\x31\x91\x43\xdd\xda\xf6\x4e\x04\x61\xe3\x76\xec\xed\x14\x6c\xed\xd4\x5d\x29\xeb\xe5\x27\x5d\x53\x43\x06\x4b\x43\xd0\x5c\x21\x56\x3e\x25\x54\xc4\x92\xac\xcf\xdd\xe1\x83\x3c\x4b\x18\x7e\xa8\x9d\xba\x77\x75\x36\xa2\xd7\xbd\x6b\x35\x05\x35\x8c\xdb\x49\xbd\xbb\x62\x3a\x82\x75\x7b\x77\x21\xed\xb7\x17\xc8\xf5\xd6\x5a\xef\x91\x95\x38\xcb\x6e\xb5\x15\x6f\x90\xdf\xdc\x2b\x2b\x08\x39\xd4\x4b\x4b\xad\xb7\xea\x09\xef\x40\x7f\xd5\x7b\xbc\x93\xcf\x8d\xb5\xbe\xcc\xc6\x5a\x53\x48\x72\x8f\x2f\xd2\xf8\x1a\x9f\x5f\xb1\x96\xd8\x1f\xad\x34\xe6\x84\xaa\x90\x51\x63\x9b\x75\xc4\xde\xb6\x0e\xcb\x83\x7a\xff\xf8\x91\x41\xa0\x36\x1d\x87\x28\x73\x8a\x6d\x82\x44\x23\xc4\x30\x51\xdf\x77\xef\x23\xaa\xa9\x62\x3a\xc6\xf6\xb6\x1e\x20\xef\xe4\x2e\x84\x81\x6d\xbb\x72\x42\x95\xcf\x91\x0e\x1e\xfd\xe8\x4f\x56\x82\x13\x3d\x48\x46\x36\x73\x27\xe5\x6a\x40\x32\x1f\xcc\x14\x61\xa0\xa6\x70\x26\x35\xcb\x22\x4a\x20\x44\x73\x53\x3b\xbb\x0f\x1f\xae\x2e\x92\xf6\xca\xbc\xb0\xb2\x57\x16\x6f\xa0\x4a\x1e\xff\xb1\xe9\x6a\x6d\xc1\xb5\xc9\x69\x07\x8f\x2d\xbc\x7d\x2c\x71\x96\xb1\xd6\xec\x79\xc1\xd5\x5d\x7c\x39\xd4\xbf\x9c\x5f\xf6\x5f\xed\x5f\xba\xbf\x9c\x5f\x12\xfb\x6b\x82\xf2\xb3\xd9\x3a\xb9\xcd\x3c\x39\x08\xd2\x95\x17\xee\x98\x27\x1f\x5a\x71\x73\x96\xb1\xd6\x71\x91\x73\x75\xb7\x87\x32\xab\x71\xca\x57\x95\xbf\x1b\xce\x1f\x7b\x4a\xbb\xa9\xab\xef\xd5\x29\xf2\xb7\x94\x4d\x10\x87\xef\x6d\x3d\x2c\xab\xe6\xdc\xf2\xea\x15\xb9\x14\xaa\xa9\x59\x1b\x85\x33\xed\x7f\x2a\x08\xd3\x48\x2c\xd1\x4a\x0f\x54\x92\x89\x60\xf0\xfd\xf6\xb9\xd1\x76\xd8\xf0\x64\xa7\x7d\x3b\xec\xbe\xb1\x31\x38\x81\x28\xc3\xef\xaa\x61\x37\x08\xf5\xd1\x0d\xbf\x15\xad\x35\x68\x4c\x89\x75\x69\xa1\x1d\x9b\x7d\xd5\x2d\x6e\x05\x69\x01\x29\xc3\xba\x97\x47\xda\xab\xa9\x0b\xab\x3f\x21\xba\x5f\x3c\xd5\x3d\x64\xd0\x30\xb2\x2d\x98\x61\x83\x1d\xc4\x84\xb4\x43\x3b\xc1\xd3\x9c\x2d\x4e\x55\x4e\x5f\x9e\xc0\x34\x63\x73\xd3\x75\x6f\xcd\x54\x91\x83\x97\x07\x63\x72\xc3\x4b\x5e\xd0\xba\x58\xf6\xba\x9e\xf8\xe7\xa2\xcc\x26\x6e\x42\xe0\xe0\x7f\x71\x40\x8e\x64\x0d\x33\xcb\xa8\x20\x05\xa3\x0b\xe6\x72\x96\x0d\x19\x0a\x4f\x14\x94\x94\xe3\xa7\xa5\xc8\xe4\xd1\xac\xfa\x48\x9e\xd3\xd0\xf3\x03\x0a\x01\x5d\x63\xd6\xf5\x45\xeb\xcb\xe3\xc2\xb0\xd0\xb0\xba\xfd\xc1\xf2\x38\x2b\x4c\x20\x09\x34\x3b\xe1\x20\x7c\xa6\x2d\x7e\x34\x4b\x45\x94\x7d\x21\x42\xf1\xdd\x6c\x7f\x58\x37\x7f\x24\x65\x2e\x3e\xe1\x06\x87\x6c\x20\x33\xae\xdf\xb3\x6a\x70\xce\x2b\x02\x1d\xbe\xb0\x62\xc9\xe6\xda\xfc\x20\x15\xd7\xb2\x5e\x12\xaa\x09\x45\xc2\x91\x35\x05\x1d\xbe\x40\x35\x43\x3b\xf6\x98\x5c\x5c\x5e\xbf\xbf\x3c\x3f\xbb\xbd\xbc\x78\x45\xdc\x57\x78\x57\x5a\x1f\x93\xdb\x4e\x11\xc1\x41\xa8\x9d\x4c\x26\xac\xfa\xd6\xce\xf1\xc4\x12\x60\x2a\xda\xd2\xdc\x50\x7a\x27\x60\x29\xba\x12\x5c\xb7\x9d\x3d\x30\x04\xbd\x90\xc2\xe6\x76\x19\xc8\xd6\xfe\x3e\xe3\x18\x4a\x28\xf0\x43\x01\x89\x96\xad\xcc\x02\x6e\x38\xd6\xfb\xf7\x4b\x18\xb4\x61\xec\x55\x82\x6c\x0f\x71\x1f\x1a\xa4\x2b\xb9\x9f\x74\x75\x6f\xd1\x5d\xe7\x5f\xb6\xfc\xcf\x35\x48\x72\xbb\x12\x56\x86\xea\x5e\xb7\xa1\xf1\xf8\x70\x0c\xc9\x6f\x87\xe3\x43\x27\x10\x16\x2b\x2d\xbe\x82\x30\xdb\x49\x75\xab\x4b\xf6\xb1\x7f\x4c\xc8\xb7\x2e\x57\x2d\x6c\x0b\xe1\xd3\x2d\xdd\xc6\xb0\x6e\x46\xa7\xaf\x53\xff\x2b\x61\xc0\xc2\x16\x83\x9f\x74\x27\x6d\xcb\x55\xce\xf8\x82\x09\xdc\xd8\xfd\x91\x69\x37\xb5\xa4\xd3\x7e\xdf\x52\x8d\x0f\xef\xdf\xec\x6f\x32\x48\x23\x92\xa6\x72\x2e\xcb\x12\x0b\xdb\xcd\x7d\xd5\xaf\xb6\x78\x84\xa7\x53\x7b\x51\xa8\xb1\xbc\xdf\x74\xf0\x02\xad\xd0\x5d\xf7\xca\x8a\x02\xed\x7f\xb6\x89\xa2\x01\x87\xba\xd3\x7c\xd2\x1b\x8c\xd8\x1a\x9b\xca\xd5\x1a\xb2\x8c\xe9\xd4\xaf\xe5\xf4\xfd\xe5\xd9\xc5\xdb\xcb\x71\x99\x3f\x19\xb9\x62\x22\xaf\x24\x1f\x4e\xa1\x0a\xb6\x78\x8d\x25\x67\xfe\x63\x69\x92\xc8\xa5\x7b\xad\x1b\x86\xe6\x60\xa1\x60\x17\x8c\xc8\x42\xa8\x9a\xf2\x42\x75\x4e\x5c\xcb\x4a\x16\x72\xb6\xb9\x47\x48\xc2\x71\xfd\x12\xcb\xf3\x8c\xe8\xc8\xe0\xc1\xfe\xf4\xb1\x70\xd3\xbd\xfe\x4e\xb9\x26\x7b\x66\x83\xda\x55\x7a\x3d\x04\xfa\xd9\xc5\x94\x19\xf8\xc2\x36\xe2\x11\x04\x58\xbf\x3b\xc1\xbd\x70\x9a\x2c\x58\x20\x80\x44\xd8\xba\xaa\x9d\x42\xa1\x9d\x96\xa2\xad\x64\x1b\xa3\xee\xae\x49\xbe\x4f\xb4\xe9\x21\xa1\xd6\x50\xb8\x50\x6f\xda\xfe\x6e\xff\xd5\xbe\xd1\x27\xae\x55\xcd\x46\xbe\x86\x19\x74\x6d\x0c\x84\xb9\xb7\xac\xd6\x9a\xad\x7b\x06\x49\x67\xbe\xc4\xa7\x8a\x65\x4a\xdc\x64\x2b\x0b\x7a\xfb\x30\x84\x8f\x40\x15\x59\x57\x7d\xd8\x5a\xb1\x08\x9d\x05\xd3\x4a\x65\x6d\xbd\x39\x55\xcd\x17\xbc\x60\x33\x28\x3d\xcf\xc5\xcc\x35\x15\xed\x14\xf9\x84\xe6\x5a\x2c\xe8\x7b\xeb\x7b\x3f\xde\x9a\x7f\x75\xda\xc9\x00\x06\xbf\xfb\xf6\x16\x5a\x39\x40\x78\x45\xc4\x6d\xde\x5d\x1f\x35\x93\x09\xb6\xf6\x1e\x8d\x46\x60\xed\x3a\xfa\x87\x91\xe3\xf3\xe2\x98\x7c\xc7\xec\xfc\x24\xb4\xb0\xa8\xa1\x3b\xeb\x5c\xfa\x5a\xf9\x06\x6c\x24\x06\xc0\x65\xc3\x42\xae\x16\xc2\xa9\x81\x62\x44\x58\x64\xd5\xb0\x5f\xee\x79\x1e\x70\xc6\x51\xac\xec\x8b\xfe\xf5\xa7\xd3\x07\xf6\xc4\x3a\x77\xe4\x05\xce\x33\xb2\xe9\x56\x8d\xc9\x55\x5c\xa5\xf1\xca\x72\x15\x4a\xd4\xb2\x2c\xb8\xb8\x6b\xcb\xd2\x4d\xa5\xc1\x70\xdb\x28\x42\xdc\xc5\xb8\xd7\x51\xd7\xa3\x45\x87\x1f\xed\x01\x4b\xf7\xc6\x6b\x74\xb2\xd9\xfe\x76\x59\x31\xa0\x1d\x9e\x04\xda\x50\xb5\xae\x89\xe3\x20\x6c\xb6\xfe\x92\x76\x82\xab\x4c\xf1\x78\xe2\x7f\x75\x73\x7e\x73\xd5\xa3\xfc\x82\xe0\x6f\x3d\xd7\xd4\x03\x02\xe7\xf7\x15\x39\x9f\xc2\x6a\x61\x13\x3e\x83\x4c\xce\x7f\x1c\x52\x41\x46\xa4\x68\x86\xff\x8e\x21\xa5\xd7\xb2\xd6\x83\x25\x2c\x63\x49\x4f\x36\xa7\xd5\x59\xa3\xe7\x17\x5c\x65\x72\xc1\x12\xd5\xd3\xfb\x39\x36\x7a\x70\x35\x31\xb9\x43\x0b\x84\x45\xce\xff\x7a\x76\x4d\x68\x63\xce\x52\xdb\x8a\xd1\x7b\x91\x60\xba\x33\xbf\xc1\xa4\xbd\x3d\xcc\xdb\x42\x7a\xd4\x59\x3f\xbb\x0e\xff\x65\x5c\x87\x40\x41\xfe\x55\xdd\x85\x5c\x70\xcd\xa9\x96\x51\x9d\x9e\xfb\x76\x22\x2c\x66\x8c\x57\xea\xca\x81\x81\xb8\x17\x70\xfd\xf5\x20\x47\x21\x98\x37\x32\x81\x62\x06\xdb\x7e\x25\x8c\x9a\x44\x33\xb6\x12\x15\x7f\x42\x04\xbb\x0f\x03\x85\xb9\x71\x0f\xe3\x8f\x36\x07\xa2\x02\xaa\xfa\xa7\x57\xbd\x56\x31\xe1\x66\x76\xa4\xdf\xd0\xce\x19\xc7\xda\x06\x63\x7b\xb3\x22\xf2\x1f\xd3\xe8\x9c\x35\x16\xe3\x7a\xff\x6f\x43\x0b\xdc\xc7\x77\xfb\xb4\x6c\xf6\xcf\x23\x69\x7a\x0e\x47\xdc\x39\xbc\x73\xd6\x1e\xa3\x4c\x80\x9c\x01\x4f\x84\xa5\xce\x9a\x0a\x65\x0e\xaf\xef\x79\x3a\xb4\x8e\xe5\x43\x72\xa4\xb3\x2a\xb2\x6d\xd4\x23\xe4\x50\xe1\x32\xed\x59\xbc\xf1\xb9\x53\x71\xf3\xd9\xbb\x97\x15\x70\x3c\xcd\x48\xd7\x5b\x00\x8a\x1e\xe4\x0d\x57\xda\x75\xa7\x82\x1f\x22\x4a\x4d\x60\xb1\x77\x90\x1f\xaf\x8d\x8a\xcd\xab\xff\xa4\x79\x5e\xbf\x42\x1e\x6c\x0b\x76\xc3\x7f\xab\xc8\xaa\xc1\x10\x1b\xeb\xe2\x07\x8e\xf4\xb2\xe2\x19\xa8\xfc\xb7\xe7\xd7\x04\xfb\x12\xfe\xe1\x77\x2f\x40\x9e\xfc\xb7\xdf\xfe\xee\x45\x24\x0a\x7c\x8e\x74\xa6\x9d\xac\x60\x49\x51\xe2\x31\x2e\x91\x90\x17\x77\x6f\x62\xd0\x6e\x71\xe5\x20\x98\x61\x44\x39\x50\x59\xc4\x4b\x4b\xbc\xcd\x21\x7b\xde\x12\x5c\xec\x0e\xe2\xdd\x73\x0c\xf4\xd6\xf1\xe5\xc7\x40\x13\x9f\x2e\x89\xf4\xeb\xa1\xf4\x0f\x49\xdf\xb5\x23\x7d\x96\xb4\x85\xd1\x2e\x9a\xf4\xf5\x48\x5b\x10\xee\xbe\x48\x5f\x60\x17\x43\x18\xdb\xc7\x54\xa4\x26\x46\xbb\xef\xf8\xa8\x21\x27\xeb\xe2\xdd\xcd\x7f\xbe\x39\xfb\xfa\xf2\x0d\xcc\x0f\x23\x79\x07\xe7\x67\xd0\xd3\x8a\xca\xbb\xc4\xa0\xc6\xa3\x7b\xd8\x0e\x10\xda\xa2\x14\xaf\xe5\xbb\xd7\x37\x2b\x86\x15\xf3\x8b\x73\x55\xf6\xdd\x91\xc3\xf4\x74\x8b\xab\xf2\xa1\x3a\x8e\x98\x46\xec\xc8\xd3\x18\x53\x47\x10\xf1\xbf\x97\xe4\xc9\x1d\xed\xad\x9d\x6a\xbd\x3d\x85\xd7\x9c\x19\xce\x2d\x1c\x69\xf6\xb8\xe7\x41\x3e\xb3\xe3\xcd\xec\x04\xee\x4e\x8c\x7f\xec\x49\x5d\x6e\x8f\xb2\xcb\x71\xa2\x4e\x9d\x9a\xa9\x7b\x78\x03\xef\x38\x67\xaf\x21\x01\x18\xe1\x58\x1b\xee\x61\xf8\x06\x53\x2a\xa6\xba\xcd\x0a\x76\x7e\x29\xd8\x57\x6d\x6a\x9e\x14\x4f\x35\x37\xf6\x5e\xea\x36\xc2\xed\xd0\xd4\x61\xaf\x51\x3f\x23\x71\x5b\x43\x37\x17\x2b\x44\xad\x49\x40\x55\x34\x0b\xc8\xc2\xfb\xab\xe8\xd4\xfe\x84\xbf\x40\x09\x9d\xa7\x23\xca\xf0\xb9\x3d\xa5\x4d\x78\x58\x69\x97\xe1\xdc\xbd\xb6\x9a\xba\xbe\xe5\xbc\x62\x14\x9d\xf5\xf3\x24\x54\xf9\x46\xa8\x8d\xf2\x15\x8b\xe2\x72\xdc\x3f\xef\x81\x93\x47\xa7\xfa\xdf\x25\x26\x20\x07\xb7\xeb\xc2\x65\xbf\xef\x4f\xad\xac\xe6\x52\x4b\xb1\x63\x22\xd6\xf5\x86\x97\xfb\xc1\x0e\xf8\xc4\xb9\xef\x05\x36\x2c\x60\xb4\x3d\xdf\x21\x8a\xdc\xbb\xbd\x8c\xb8\xeb\x78\x9e\x14\xce\x01\xa6\xc2\x8e\x73\x6b\xdf\x7d\x32\x59\x2c\xbf\xba\xd8\xc3\x8d\xff\xf9\x94\x74\xd8\x77\x7d\xa9\x7d\x5d\x77\x73\x90\x49\xfb\x7f\x75\x61\xe5\x5c\x97\x57\xa9\x2c\xea\x93\x16\xf7\x3b\xf8\x1d\x5c\x54\x44\x4e\x55\x9c\xcc\x20\x6b\x7d\x2f\xeb\xd4\xe2\x32\xd7\xbd\xd7\x56\xe2\x97\xec\xdf\x62\xc2\x9b\xa3\x6e\xf0\x53\xdf\x52\x9c\xf7\x67\xbb\xa9\x37\x10\x1c\xb1\xd2\xf3\x6a\xba\x76\x7f\x83\x28\x82\xfa\xee\xa6\xeb\x3d\x70\x7d\x83\x50\x07\xaf\x37\x5e\xdf\x8d\xd7\x36\x52\x73\xf1\xd7\xfa\x51\xae\xed\x4e\x5c\x3a\x50\x74\x24\x3e\xaf\x67\xa7\xa2\x23\x7b\x53\x98\x1c\x56\x27\xad\xfd\xa3\x7d\xc9\x1a\x93\xcc\x79\xb6\x04\x8c\x7a\x32\x10\x5c\x7a\x54\xa6\x43\x1c\xc1\xaa\x25\x36\xfc\x8e\xa6\x55\x57\x9a\x95\x0a\x3b\x0d\x15\x85\xd9\x5f\x29\xba\xfd\x8c\x6c\xc9\x8f\x13\x82\x2d\x76\x4a\x5a\x05\x0a\x15\x1b\x52\x95\xcb\x7b\x71\x4f\xeb\x9c\x9c\x5d\x0f\xf9\xd1\xf6\x5d\x1c\x01\x31\x31\xa6\x4e\x6c\xbf\xd3\xbb\xcc\x19\x99\x70\xad\xda\x7e\xc2\x4c\x77\xad\x01\x86\xe4\x5a\x3f\x6b\xf0\x28\x81\x8c\x18\x92\x61\x67\xd3\x91\x20\x04\x91\x99\xa6\x05\x96\x55\x26\x13\xa6\xef\x19\x13\xe4\xc5\x8b\x17\x2f\x22\x2c\xb8\x39\x79\xf1\xfb\xdf\xff\x1e\xba\xc9\x92\x9c\x65\xbc\x5c\x07\x04\x4f\xfd\xaf\x97\x2f\xc7\xe4\x3f\xce\xde\x86\xd2\x36\xb0\xdb\x75\xa5\x15\x96\x79\xc3\x99\xc1\xd9\x75\x81\xab\x13\xf2\xef\x37\xdf\xbe\x73\x9c\x21\x6c\x0d\xe9\xbf\x0d\x68\x55\xba\xed\x1d\x93\x8b\x36\xb0\xb2\x63\x5c\x0d\x02\x85\x68\x41\x5a\x33\x88\xd3\xa4\xd3\x29\x20\x38\x92\x65\xae\x1c\x69\x70\x95\x74\xf8\x6c\x1e\x26\xd3\xd8\x3f\xd4\xa0\x74\x01\xd1\xa4\xdc\x6c\x01\x18\xc0\x5d\xf1\x28\x0c\xb8\x85\x6f\x45\xd7\xd4\x84\xa5\x9e\x90\x82\xdf\x31\x32\x55\xd0\x39\xb4\x2d\xa6\x5d\x33\x65\x74\x0f\xdb\xb9\x3a\xce\xd1\xe8\xb7\xce\x2c\xf2\xf3\x78\x6e\x23\x7b\x54\xf6\x2e\x54\xc1\x15\xb6\x9a\xb0\x59\x02\x48\x93\xcc\xb6\x3e\xb5\x27\xb4\x2f\x95\xf9\x79\xe0\xe9\xda\xa2\x4b\x9e\x64\x12\x5a\xc8\xa8\x12\xc8\x1d\x74\x69\xa5\x04\x17\x18\xb5\xac\x22\xae\x49\x52\x0d\xf3\xb4\x5e\x2d\x48\xa7\xdf\xd2\xc8\x7e\xc2\x7d\x97\x53\xa7\xac\x15\x9d\xc8\x46\xbb\x90\x12\x84\x98\xd2\x6f\x5a\x4b\xb7\xb1\x51\x2f\x24\x17\x75\x4f\x6f\x60\x93\xd8\xef\xa0\xcf\x24\x7b\x02\xd7\x09\x61\x34\x9b\x93\x3b\xb6\x1c\x01\x9d\x8b\x86\x89\x2d\x07\x9c\x29\xe8\x82\x6a\x6a\xab\xf7\xf7\x3d\xab\x69\x8d\x67\xcf\xfd\xf1\xb8\xfc\xc7\x16\xa3\x7d\xf6\x6a\x64\x2e\x65\x3b\xa8\xb2\x32\xb1\xed\x34\x20\x3a\xa6\x30\xd7\x50\xc9\x36\xfe\x4e\x80\x6a\x01\xd8\x26\x7f\x57\x6b\x79\x96\x86\x72\xb0\xdc\x7c\x20\xa5\xcf\xc0\xc0\xba\xdb\x30\x2e\xc3\x44\x92\x7a\x2c\xa0\x93\xb0\x33\x23\xfc\x0e\x54\x46\x85\x88\x3a\xc5\x44\x5c\xc4\x7b\x07\xa6\x6b\x7e\xd4\x09\x2f\x9b\xf3\x6c\xee\xda\x64\x5b\xa8\x29\x3b\x8a\xb8\xe4\x91\xa0\x97\xaf\xaa\x98\x6e\xaa\xb8\x50\xb2\x76\x40\x8c\xa0\x59\x39\x53\x8a\x70\xf0\x3d\x95\xb4\xbe\x63\xae\xb0\x22\x2d\xc6\xe4\xda\x6c\x66\x02\x4c\x57\x5f\x16\xbb\x12\x2d\x30\xd8\xda\xd0\xdf\x4e\xf2\x70\x62\xb7\xf2\xc3\xf1\xf8\x10\x25\x83\x0d\x49\xc5\xd1\x70\x76\x69\xa0\x92\xdc\x38\xa5\x2f\x6d\xd2\x4a\x61\xcb\x18\xa3\xcf\x18\x74\x00\x27\x40\x30\x2f\x66\x75\x58\xf9\x89\x46\x1b\x8b\xdb\xb1\x63\x07\x8d\x5d\x5a\x9a\xa5\x36\x34\x0b\x3a\x64\x57\xc7\xae\x8d\xcc\x76\x68\x63\xd6\x0f\x72\xb4\x74\xb0\xe5\x73\xa9\xdd\x7b\x76\x6e\x5a\x55\x26\x34\xc2\xd8\x38\xf7\x4e\xa5\xcc\xb2\xa7\xfb\x24\x02\x25\x5b\x74\x25\x10\xcb\x0d\xef\x40\xe5\x27\x19\xea\xb0\xb2\x64\x68\x47\x32\xc8\xa0\xf2\x94\x0c\xb1\xa7\x6c\x6d\x51\xa6\x92\x81\x0e\x2a\x5f\xee\xaf\xc9\x50\x37\x2b\x63\x57\x53\xa0\xbe\x2d\x07\x4e\x3f\xfd\x96\xd3\x74\x74\x6f\xcf\x8e\x0d\x46\xa5\xb7\xb4\x6a\xb5\xb8\xed\x5a\x5a\x32\xd0\x2d\x5a\x5d\x47\x6b\x4b\x06\x19\xa1\xe5\xa5\x4f\x13\x74\x8a\xbe\xd6\x97\xd2\xa9\x98\x24\xaa\x81\xab\x23\x5e\x2d\x5c\x1d\x31\xc1\x2d\xab\x63\x8d\x9e\x7a\xe9\xa0\x6a\x13\x0d\x93\xf7\x10\x8e\x54\x4b\xe8\xc0\xa5\x3d\x91\x1e\x93\xb7\x56\xda\xd8\xe1\x58\xa8\xd1\x86\x94\x2c\x1a\xed\x53\xde\xfb\xa2\xcb\x4e\x37\x07\x16\xe9\xfa\x81\x61\x29\x14\x07\x16\xc4\x99\x64\xa0\xbe\x92\x88\x95\x2d\xd2\x24\x21\x3b\xb1\x74\xa6\x14\x1b\x50\x8a\x23\x2d\xac\x34\x61\xf6\x9f\x21\x00\x15\x47\x7c\x18\x6a\x02\x50\x08\x58\x8d\x0e\x46\xc5\xb1\xc3\xd9\x39\x89\x7e\xc7\xf3\xbb\xc1\xda\x76\x3e\xb3\xad\xa7\x89\x24\xac\x56\xd6\xc4\x90\x3b\x50\xb2\x9c\xaa\x90\xda\x3c\x3e\xde\xd4\x6f\x17\x62\x6d\xd4\x67\xd7\x57\x7b\xb3\x94\x74\x60\x46\xce\x3b\xa7\x9a\xfe\xab\xd9\x4a\xc0\xa1\xe0\xbb\x74\x9b\xeb\x7d\xd1\xee\x4b\x64\x7f\x81\x76\x18\x7a\xfe\x05\xab\x73\x6b\x4b\x7b\x6d\xf8\x4f\x64\x28\xd8\xda\x54\x7a\x65\xe5\xad\xcf\xa1\x15\x54\xda\x52\xf4\x49\x50\x5d\x80\x11\x50\xa4\x2f\x55\x4d\x7c\x22\xb5\x0f\xf6\x20\x22\x03\x64\x75\xac\x86\xa3\xda\x25\x92\x1b\xe8\x3d\x8d\xb6\xb2\xb4\xdd\xc5\x21\x5d\x10\x7e\xfe\x0a\x9b\x65\x52\x21\xa4\xc6\xce\xcd\x27\xd8\x1e\x3b\xb9\x8b\x3a\xb2\x64\x10\x49\x3b\x81\x66\x75\xc7\xa5\xbd\xa3\x50\xb9\x43\x1b\xf4\x5d\x1b\xa1\x1b\x94\x80\x1d\xbd\x4e\xb5\x8b\x3c\xa4\xb7\x39\xe9\x70\xeb\x5d\x3a\xe3\xf6\x9d\xc3\x08\xc7\x1d\xb1\xca\xe6\xac\xdc\xa5\x9f\x37\x5e\xe0\xd7\x6e\x33\x0c\x65\xbd\xaf\xb9\xd6\x0c\x2b\xe3\xb2\xba\xdc\xa5\x33\xb2\x41\xbd\x13\xa7\xb6\x61\x3d\x89\xc5\xcb\x83\x5d\xda\x82\x3f\xa0\xf9\x36\x69\xcf\xf8\xc1\xdb\xdd\x2d\x4e\x82\x46\xf5\x88\x20\x90\x4d\x03\xdb\xc9\xfb\x78\x4d\x6f\xa8\x3d\xbb\xbe\x22\x0b\x3c\xd3\x27\xdd\xa6\x9f\x8e\xb9\xe7\x64\xb7\x76\xe2\xcf\xe6\x9e\x67\x73\xcf\xb3\xb9\xe7\xe7\x65\xee\xe9\x88\x50\x8e\xa9\xed\x64\xed\xe9\x9b\x8c\xba\x15\xb9\xad\x1d\x68\x17\x6a\x64\x63\x7d\x3a\xf5\x6d\x0d\x89\x72\x16\xa0\xc4\xae\xea\xc4\x76\x8f\x71\x25\x63\x0f\x0f\xc7\xe3\xc3\x43\x67\x47\xb2\xca\x6e\xa3\xa7\xa3\x3f\x24\x83\x65\x22\x93\x39\x94\x60\x86\xf5\xd6\x4a\x83\x32\xd3\x1a\x54\x70\x6f\x92\xe1\xc2\x5e\x96\x6e\xed\x5d\xdf\x1a\xcc\x7d\x37\x14\xdd\x81\xf3\xb9\x28\xb4\xd7\x7b\x11\xda\x5b\x51\xdd\x17\x8f\x4a\x68\xd5\xed\x46\xaf\xee\x9f\x95\xd9\xdb\x68\xb9\x82\x97\x3c\x51\xe7\x23\x96\xb9\x18\xb2\xcf\x94\x56\xe4\x08\x81\x8c\xb3\xaa\x39\xb1\x00\xc7\x25\x2b\x65\xbd\x4c\xa7\x5a\x0e\xa8\x01\xd6\xfb\x8a\x85\x78\x9c\x3e\xd5\x9a\x91\xac\xa9\x6b\x26\x74\xb1\xfc\xa9\x69\x14\x51\x0d\x6d\xd6\xc7\x43\x14\x0a\x8f\x2b\x29\xfd\xd2\xbb\x63\x25\x2d\xc9\x17\x3b\x07\xb3\xab\xdf\x8b\x9d\x24\xdd\xa9\x6f\x5a\xa1\x4e\xbc\x29\x10\x7e\x65\x62\xb1\x13\xc4\x05\xad\x83\x49\x43\x9b\xc6\x83\x74\x88\x9c\x2f\xb8\x92\xc1\x64\xc7\x8d\xaf\xae\x5b\x33\xb9\x2d\x1e\x2f\x1b\x5d\x35\xe9\xc2\x2c\xf1\x7c\xd5\x91\x61\xd7\xcd\xc8\x53\x89\xf4\x6b\x4c\xda\xe8\x56\x54\xd5\x5e\x86\xeb\x4e\xad\x8f\x8a\x6a\xcd\x6a\xf1\x8a\xfc\xbf\xa3\xbf\xfd\xe6\x9f\xa3\xe3\x3f\x1f\x1d\x7d\xff\x62\xf4\xbf\x7f\xf8\xcd\xd1\xdf\xc6\xf0\x1f\xbf\x3e\xfe\xf3\xf1\x3f\xdd\x3f\x7e\x73\x7c\x7c\x74\xf4\xfd\x37\x6f\xff\x72\x7b\x7d\xf9\x03\x3f\xfe\xe7\xf7\xa2\x29\xef\xf0\x5f\xff\x3c\xfa\x9e\x5d\xfe\x10\x09\xe4\xf8\xf8\xcf\xbf\xda\x61\xb2\x54\x2c\xbf\x4d\x26\xf8\x04\x8b\xd5\x3d\x40\x24\xea\x42\xd8\x11\x1d\x09\xf9\x34\x6a\x9d\x10\x23\x2e\xf4\x48\xd6\x23\x04\xf6\x8a\xe8\x3a\x29\x5e\x0c\x87\x43\x9d\x87\xd3\x8f\x56\xec\xda\x91\x16\xe2\x00\x45\xd0\xb0\xd3\x27\xb8\xec\x18\x81\xbe\x37\x1b\xbd\x6d\x8a\xf9\x1c\xca\xf8\x05\x86\x32\xda\x2a\x3b\xcf\x71\x8c\x3f\xdb\x38\xc6\x1b\xdb\x6d\x76\x63\x10\x23\x86\x26\x26\x00\x8d\x08\x62\x4c\x35\x59\x45\x04\x31\x82\xe3\x3d\xe9\x22\x3d\x07\x31\x3e\x07\x31\x3e\x07\x31\xa6\xcd\xfd\x39\x88\xf1\xd9\xaa\xfd\x6c\xd5\x7e\xb6\x6a\xaf\x8d\xe7\x20\xc6\x8d\xe3\x39\x88\x71\x68\x3c\x07\x31\x3e\x07\x31\x76\x82\x18\xad\x22\x9a\xa4\x6c\xd8\x08\xc6\x27\x0b\x60\x54\x06\x0d\x32\x76\x96\x65\xb2\x11\xfa\x56\xde\xb1\xc8\x98\x95\x28\x23\xc9\x1a\xec\xc8\x75\x3c\x49\x40\x63\x9a\x10\x9f\x20\x8e\xa7\x0b\xe2\xb4\xc9\x39\x13\x29\xa6\xb9\xde\xf6\x9f\xd9\xd7\x9d\x45\xc1\xb0\x3c\x91\xb3\xdc\xc3\x4d\x40\x40\x4b\x82\xb4\x39\xad\x31\x39\x23\x35\xcb\x78\xc5\x0d\x61\x86\xb2\x65\xf0\x7b\xaa\xba\xeb\x7b\x13\x73\xad\x58\x31\xb5\x7d\x5b\x45\x5b\xe7\xa2\x6e\x65\xaf\x74\x6d\xdf\x2d\xb2\x37\x75\x94\x43\xa4\x6b\xd7\x99\x00\x55\xcd\x65\x53\xe4\xa4\x66\xff\x70\xa2\x91\xdd\x8b\xdb\xee\xb7\xf2\xd8\xca\x8e\xed\xb0\x46\x98\xce\xa2\xed\x84\x69\xc5\x63\x6b\x70\x7a\x58\xe9\x04\x8e\x7d\xaa\x78\x0d\x57\xf4\x86\x65\x52\xe4\xbb\x9a\xfe\x2e\x57\xe1\x38\xac\xb3\x5e\xc1\xa4\x23\xcc\x1b\x04\x05\x89\xfe\xb4\xe0\x39\xd7\x4b\x1f\xeb\x86\xe4\xc3\x28\x14\xc1\x6e\xbb\xfd\xe1\x90\x57\xb5\xc7\x47\x68\x55\xd5\x92\x66\x73\xa6\x3a\x3b\x91\xc2\x87\x40\x82\xc2\x92\x49\xbe\x26\x41\xd1\xcc\xb8\x40\x29\x1f\xa0\x1b\x91\x2d\xa2\x48\x4d\x3b\x6a\xa9\x5d\x70\xee\xca\x72\xbb\x58\x67\x3f\x9b\x6a\x04\x44\x53\x90\xae\x97\x50\x12\x50\x76\x3f\x86\x7b\x12\x51\xd8\xab\xbf\x7e\xfb\x9a\x22\xb2\xc8\x5d\x9d\xe7\x3f\xbc\x30\x4a\x6f\x66\x29\x44\x9a\xe3\x1a\xea\xfc\x6a\x49\x0a\x23\xea\xca\xda\x55\x93\xde\xf0\x99\x04\xa0\xbf\xfd\x8a\xcc\x65\x53\xab\x71\xb7\xa8\xd0\x4b\xf8\x0d\x8d\x6d\xc8\x5a\x53\x0c\x95\x9a\x14\x8c\x2a\x4d\x5e\xbe\x20\x25\x17\x8d\x91\xa8\x12\xaf\x6a\xaa\x16\xd2\xd1\x3f\x7e\xf7\x55\xe4\x5b\x69\x9a\xc7\x7a\xdc\xa3\xbd\xc7\x15\x76\x4b\xb4\x0a\x48\x52\xf0\x0b\xb4\x73\x01\xec\xc5\x1e\xa8\xfd\x28\x1a\xc7\xce\x13\x95\x19\x8b\x0d\x42\xcb\x3d\xd3\xc7\x1f\x1b\x39\x59\xea\xf8\x82\x6c\xff\x17\x9f\xef\x57\x62\x73\x3f\xae\x55\xbe\x1e\x9c\xeb\x7a\x93\xde\xb6\xf0\xf5\xc0\x8b\x7b\xee\x08\x3e\xe3\x4a\x0f\x36\x9c\x1e\x85\x5d\x25\xb1\xc2\xce\xac\x96\x4d\xb0\x9a\x48\x6f\xbb\xc1\x9e\xe0\xf4\x57\x4b\x71\x69\x96\x31\x05\x17\xda\x95\xe1\x8c\xe8\xdd\x21\x24\x7e\x3d\xf0\xe0\x67\x6c\x78\xe1\x90\x28\xd2\x31\xf5\x98\x05\xa8\xa3\x36\x29\x46\xbf\x70\xe8\x95\xb8\x4b\xf8\x52\xff\x8e\x29\x2e\x66\xd0\xa2\x95\x94\x4d\xa1\x79\x15\x91\xcb\xe3\x76\xd4\x03\xb4\xec\xb5\xeb\x6c\xa2\x1d\xef\x03\x0d\x6f\x91\xb9\xd4\xd8\xf4\x00\x9c\x96\x47\x6e\x2e\x84\x09\x0d\xc5\xa8\x20\x3b\x82\x55\xb4\xa6\xee\x58\x82\x30\x33\x59\x96\x54\x1d\x5b\xbf\x17\x85\xc8\x32\xa4\xc2\x86\xa1\xd6\xb4\xf0\xdb\xd8\x8d\xb3\xd9\x17\x22\x6b\x26\xa8\x08\x3a\xc5\xfb\xc6\x29\x78\x85\xc8\x7b\xe1\xda\x77\x61\xc7\xf9\x44\x0c\xb6\xa2\xfb\xd7\x34\xbb\x63\x22\x27\x1f\x94\xc3\xe3\x7c\x29\x68\x69\xdb\x41\x54\xb5\xc4\xce\xec\x2c\x77\xf0\x83\x80\x7d\x24\x12\x1a\xb5\xb1\xb2\x97\x2b\xbe\x88\xf2\xda\xbe\x76\xaf\x51\x89\xb5\xd1\x3f\x28\x23\xcc\x0c\xd3\x33\x15\xc3\x70\x15\xab\xf9\x22\x63\x4e\x52\x34\x13\xd9\xd7\xa2\x16\xc1\x1a\xa5\x6b\xcb\xb2\xf5\x49\x79\xe7\x36\x01\x7b\xf3\xce\x7b\xe8\x0e\x41\x0b\x43\xa2\xc2\xb2\xb1\x6b\x45\xd6\x47\x28\x73\x82\x62\x5f\xad\xbf\xea\x49\x7c\x61\xc3\xc3\xf7\x5f\x5f\xf4\x89\xd1\x7b\x9a\x4b\x45\xbe\x2e\x64\x76\x47\x2e\x18\x88\xec\x65\x50\x3f\x59\xed\x88\x11\xd5\xa0\x7f\x10\x62\xa8\x49\x68\x3d\xc9\x3f\x47\x8b\xd0\x92\xce\x86\x2e\xe9\x88\x94\x52\x70\x2d\xeb\x21\x1a\xf6\x88\x85\x5f\x9f\x1b\x52\x7e\x99\x0d\x29\xeb\x49\xd8\x6a\xf0\x53\x6d\x47\x69\xae\x44\x62\xe7\xe6\x39\x23\x35\x90\x19\x78\xd9\xf5\x20\x8a\xef\x10\xdc\xbb\xfc\xbf\x9c\xcb\xfb\x91\x96\xa3\x46\xb1\x11\x0f\xc6\xda\x45\xaf\xeb\x8e\x2d\x21\x18\x31\x69\x65\xdf\xe0\x4b\x3d\x55\x53\x4b\xb0\x78\xc3\xef\x46\xc8\x79\xff\xf5\x85\xe1\x94\xf1\x95\xf8\xb9\x22\xa7\x4c\x67\xa7\x19\xab\xe6\xa7\x76\x5a\x5f\xdc\x76\x39\xba\x97\xb6\x5f\x67\x24\x93\x45\x61\xeb\x4d\xca\x29\x39\x67\xd5\xdc\x83\x4a\x72\x0f\x3d\xfa\x1e\x7c\x8e\xd6\x83\x95\x94\x69\xed\xd0\x3a\x57\xcb\xbc\x6b\x6f\x56\x07\x91\xea\x89\x25\x66\x11\x22\xec\x97\x82\x5a\x8f\xd0\x0d\x29\xba\xde\xf6\xb6\x92\xda\x1b\x3a\x30\x7e\x51\xd8\xfa\x78\x9d\x1e\x0f\x6f\xdc\x6b\x10\xc7\xd8\x71\xeb\x26\x35\x6e\x74\x9f\xef\x91\x44\x72\x35\x45\xad\x28\x67\x39\x91\x0b\x56\xd7\x3c\x67\xca\x91\xe2\x24\x8a\x29\x78\xf1\xb4\x34\xf2\xb9\x07\xe5\xd6\xf1\xd3\xe8\x41\x99\xac\xef\x76\x88\xad\x79\x77\x9d\xd8\xd2\xbc\xe4\x11\x69\xf0\x5f\x10\x27\x57\x19\x2d\xd8\xd5\xb7\xd1\xea\xe3\x0d\x3e\xdf\xd7\x20\xdd\x8f\x9d\x56\x3b\x0f\x68\xe3\xf1\x8d\xc7\x53\x22\x64\x3e\xec\x99\xd8\xab\xae\x37\xa3\x9a\xdd\x0f\xb2\xfc\x51\x4b\x42\x87\x9f\x0a\x35\xc4\x79\x6e\xda\xb3\xaa\xc0\x75\x6e\x11\xf6\x03\xd9\x97\x30\x61\x4f\x35\xcd\x28\xe8\x96\xd8\xf6\xf7\xc3\x00\x18\x8b\xe8\x67\xd7\x57\xe4\x2f\x08\x77\x7f\xdd\x81\x6a\xa9\x51\x2e\xbe\x90\x25\xe5\x89\xcd\xe5\x3b\xad\xd8\xba\x13\xbd\xf6\x40\x09\x42\x0d\x1e\x4b\xa7\x63\xfe\x94\xcf\x1a\xa3\x47\x5b\xdd\xf6\xb9\xa1\x4a\x60\xe9\x8f\x27\x82\xb5\x12\x58\xc7\x06\xe9\x72\x60\xbc\x54\x15\x5c\xba\xc3\x0a\x60\x5e\x3e\x9c\x84\x28\x26\x14\x07\xdf\x68\x27\xec\x09\x44\x33\x3d\x8f\xf0\x46\xf9\xe4\x16\x14\xe3\x4e\xc8\x1b\x39\xe3\xc2\x51\x07\x69\xc3\x09\xa6\x94\x17\x71\xdb\xf8\x2c\x57\x6d\x1d\x3f\x0d\xb9\x4a\xa9\xe2\x52\xd0\x49\x11\x8e\x44\xeb\x33\xae\x82\x42\x54\x07\x83\x77\x4f\x73\xae\xcc\xff\x93\x9b\x9b\x37\xe0\x55\x6a\x44\xac\x9e\x01\x7e\x17\x4b\x9e\x7d\x31\x27\x24\x1a\xfb\xbb\xc7\x48\x13\x93\xbb\xea\x5c\x89\xdc\x2c\x83\xa9\x5e\x60\xa5\x85\x86\xfd\x86\x62\x5d\x4e\x36\xae\x6b\xc2\xc8\xed\x9c\x67\x77\xd7\x1d\xe7\x92\xac\xcd\x6f\xa2\xf3\x93\x67\xb0\x31\xd7\x79\xf5\xdd\x7d\x11\x7e\xbb\xcc\xeb\x54\x23\xc7\x6d\x87\xa3\xdd\xd8\xad\x32\x40\x08\x55\x4a\x66\x3c\xde\x3b\x09\x26\xba\x96\x25\xe6\xc0\x12\xf7\xb7\x3c\x90\x82\x1e\xc4\xb7\x1d\x22\x58\x01\x8e\xaa\x0e\x1f\x8e\xf1\x41\xda\x5d\xda\xdb\x92\x10\x15\x93\xfb\xc4\xde\xf6\x3a\xc3\x3a\xd7\x20\x3a\xcc\xbc\x43\x2c\x42\x18\xe9\x8a\x32\x4e\xa6\xb5\x8d\xbf\x57\x8e\xbe\xdb\x21\x36\x7c\x73\x20\xc5\x7b\x2f\x9b\x14\x4e\xc3\xde\x64\x4b\x59\x89\x06\xc0\xdf\xac\x1b\x0d\x2e\x75\x25\xab\xa6\xa0\x01\xf7\x70\xb7\x29\xee\x43\xfd\x15\x38\x87\x3d\xb8\xd5\x1e\xbb\x2d\xd9\xd6\x04\xb7\x0d\x09\x6b\x41\x44\x68\x3b\x98\x45\x77\x28\x0b\xc2\x5c\xcd\x67\xdb\x43\x7e\x5a\x4c\x3e\xda\x6a\x7e\x59\x10\xe8\xc6\xfc\xb3\x6d\x1d\xca\x12\xa2\x6e\x5e\xfc\xee\xab\xaf\xb6\xf5\x34\xdb\xdc\xb3\x2c\xbc\xa5\xdb\x7b\x9a\x3d\x20\x91\x2c\x9c\x38\xb6\x9e\x08\x16\x45\xb1\x36\xf4\x34\x4b\x4c\xfc\x7a\x9c\xa6\x65\x51\xce\x8a\x84\xaa\x08\xae\xd6\x41\xd4\xa6\x0c\xd5\x42\xd8\x5a\xe1\x20\x82\xe5\xf5\x2a\x20\xc4\xd4\x35\x88\x70\xa0\x42\xdd\x83\xbd\x56\x33\x48\xa8\x61\xd0\xab\x4c\x10\x04\x3c\x54\xb9\x60\x6b\x3d\x82\x78\x95\x0e\x60\x45\x55\x21\x08\xc2\x8c\x6e\xa0\x14\x1d\xcf\x1c\x55\x71\xa0\x5f\x47\x20\x4e\x77\x88\xc9\xae\x7b\xdc\xa6\x7c\x03\x95\x04\x7c\x75\x80\x08\x95\x2d\xb6\x7e\x40\x52\xaa\x51\x7c\x9a\x51\x5c\x85\x80\xc8\x44\xa4\xb4\x24\xa4\xe8\x1a\x00\x7b\xc9\xfc\x4f\xcc\x5e\x89\xcf\xf2\x4f\x12\x7d\xa2\x20\x92\x40\x46\xff\x0e\x12\x0f\x8e\x54\xb9\x27\x12\xec\x8b\x24\xe9\x27\x12\xe8\x60\x0e\xfe\xaa\x0c\x14\xbb\xfe\xcd\x99\xf7\x5b\x32\xe9\x23\x81\xf6\xf2\xed\x03\x62\x4f\x24\xc8\xc1\x86\xae\xab\xc2\x4f\x24\xcc\x98\xb6\xae\x2d\xce\x46\x02\x8d\xcf\x90\x4f\xcf\x48\x49\xcd\x86\x8f\xcf\x44\x89\xca\x7c\x4f\x2c\xc3\xba\x3d\xdf\x7d\x3d\x7f\x3d\x12\xe4\xdb\x0d\xec\x72\x7b\xd6\x7a\xec\x89\xb5\xa5\x7a\x76\xca\x55\x8f\x26\xa3\xb1\xb9\xcd\xf1\x19\xcd\xbe\xd3\x4a\x70\xa2\x69\x89\xcc\xa9\x9e\x81\x64\x53\x4b\xcf\x4e\x6d\x2d\x09\xee\x3c\x31\x12\xd7\x77\x3b\x88\xd1\xde\x1a\xf5\x14\xb6\x04\x12\x6d\x5e\x41\xd0\x72\x90\xe7\xf7\x4f\x19\xdf\xf8\xf6\x66\xc5\x45\xed\x7f\x76\x9a\x82\xf5\x3e\x0f\xbb\xa8\x1f\xdd\x33\xfd\xec\x08\x4e\x8d\xe4\x8d\x49\xf2\xec\x46\xf2\x3e\x7b\x2d\x87\x97\xfe\x14\x5e\x4b\xd5\xab\x21\xeb\xec\x9d\x40\x6d\xa2\x1c\x97\x72\x62\x3b\xfc\x20\xd1\xf6\x77\xf9\xec\xfa\x8a\x64\x35\x83\x04\x74\x5a\xa8\x31\xd9\xa1\xf2\x91\xf3\x0f\x59\xa9\xcf\x49\x5c\x54\x6b\x56\x56\x3a\x16\x81\x9e\x9d\x96\x5b\xc7\x4f\xc3\x69\xb9\xa3\xa7\xe3\xa3\x7f\xcd\xd9\x8b\xe6\x4d\x49\xc5\xc8\xdc\x72\x70\x5f\x5a\x37\x48\x9c\xab\x63\x85\x49\x8d\x89\xcb\x45\x82\xdd\x06\xc3\x29\xa4\x44\x36\x82\xff\x18\xa1\x98\xf9\x3a\x82\x5e\x04\x78\x04\xc7\x10\xc0\xdd\x71\xcf\xb0\x09\xd3\x0a\x75\xc8\x64\x15\xbd\x63\x96\x99\xdb\x85\xfa\xfd\x73\x84\xa0\xd3\xe9\xa9\x6b\x05\x8b\x01\x8d\x22\xd4\x35\x24\x32\xb7\x50\xfa\xfa\x18\x2a\x64\xb4\x28\xe4\x7d\x84\x69\x7c\xce\x7a\x02\x84\xc1\x0b\xb3\x56\x5b\xcb\x60\xc2\x48\xc9\xeb\x5a\xd6\xd6\xa1\x15\x61\x56\x6d\xd1\x05\x82\x76\x8c\x5e\xc8\x6a\x54\x83\x6a\x1b\xc3\x71\xc3\x74\x67\xbb\x63\x04\x40\x2a\x30\x31\xcd\xfc\xb7\x0b\xc8\xc5\x2e\x7e\x96\x4e\x4e\xd8\x9c\x2e\xb8\x6c\x6a\x80\x1e\x03\xf2\xc0\xbe\x6a\x58\x37\x59\xca\xc6\x3b\x00\x1a\xc8\x51\xf1\xbb\xab\x92\x17\x3e\x26\xef\xda\x97\x41\x95\xcd\xa5\xb3\x5c\x8e\xd8\x27\xae\x74\xfa\x5e\xba\x23\x76\xed\x2e\xf6\x71\x63\x16\xaa\x32\x0c\xfc\x63\x30\x17\xb1\x7f\x4f\xba\x6f\xf5\xc5\xd9\xc5\x0d\xfc\xe9\x21\xc2\xac\xad\xc1\xa1\x50\x84\xb3\x49\x42\x0f\x17\x68\xe3\x42\x2d\x71\xde\x81\x2e\x66\xcf\xb2\xf1\x4f\x45\x36\xf6\x81\x1d\x05\xcf\x96\x57\x17\x69\x52\xa2\x0f\xe8\x30\x2f\x93\xaf\xa9\x62\x39\x79\x4b\x05\x9d\xa1\x21\xe2\xe8\xe6\xfa\xeb\xb7\xe1\x8e\x1c\x55\x2d\xc1\xa8\x72\x75\xb1\x21\x34\xc0\xb3\x56\xfc\xc8\xbb\x7d\x25\xde\xae\xad\x3d\x59\x7e\xd8\xf3\xea\xf7\x96\x52\x4c\x3c\x8f\x8f\x69\x43\xb7\x5e\x7a\x05\xc3\x34\x5c\x65\x28\xb5\x4a\xb0\x16\x65\x7e\xb7\xfb\x34\xb9\x50\x9a\x16\xc5\x75\x41\xc5\x59\x55\xd5\x72\xb1\xc9\x12\xd4\x2f\x28\x66\x1f\x73\x42\x1a\x46\x40\xba\x1f\x2b\xdc\x7c\x88\xbe\x12\xe4\xaa\x85\xbe\x69\x2b\xaf\xb4\x37\x01\x49\x01\xc2\xf6\xc1\x59\xa3\x65\x49\x35\xcf\x0e\x88\xac\xc9\xc1\x5b\x2a\x1a\x5a\x6c\x88\x60\x1e\x58\xd2\x66\x71\x7f\xe0\x85\x6d\xad\x0f\x82\xaf\x0c\xc8\x6c\x43\xef\x6a\x5a\x1b\x2a\x76\x7e\xf3\x31\xfa\x3d\xa5\xa9\x6e\x56\x68\xf7\x56\x2e\xb2\x99\x6f\x8c\x48\x41\x95\xfe\x50\xe5\x74\xd5\x19\xba\x9d\x39\x64\x54\xd3\x42\xce\xfe\xca\x68\xb1\x09\x73\x7b\x78\x71\xde\x7d\xd6\x19\x43\x11\x45\x6e\x9a\x89\x7f\xf0\x50\x11\xa3\x10\x6d\xaf\x07\x55\xb3\x82\x2d\xa8\xd0\x0e\xe0\x0d\xf6\x34\x39\xb4\x7b\x30\x36\x58\xc3\x5b\x67\x4d\xce\x34\xab\x4b\x2e\xfa\x5f\xb9\x81\x67\xcf\xa5\xc8\xb9\xde\x12\xbe\x02\xc6\x64\x84\xd1\xff\xd2\x36\x64\xdb\xec\xa0\xdc\xea\x92\xec\xd3\xa6\xce\xdc\xfa\x1b\x85\x8f\x4d\xac\xc4\x3e\xc7\x1f\xe5\x74\x8b\x4f\xb2\x37\xd3\xb5\xbd\x25\x77\x42\xde\x2b\xac\xb2\xb8\xe9\xbe\x05\xe4\x8e\x21\x79\x63\xe4\x70\x01\x3f\xbd\x39\x6b\x63\x64\xe7\xbf\xc9\x06\xb3\x1d\xfd\x70\x84\x24\x94\xd5\xcf\x6f\xa3\xa3\x9b\x70\xd2\xbf\x84\x85\x28\x7c\xb4\x04\x7a\x82\x7b\x0f\x6d\xa3\xf8\x11\x22\x5b\x8c\x8c\x15\xd7\xfd\xb5\x4f\x6f\xdb\xae\xa0\x6b\xe6\x88\xa0\x8c\x19\x60\x4d\x51\xcd\x51\xfb\x66\x91\x2b\x1b\x38\x5f\x5b\x65\x8b\x92\x8a\x33\x2c\xb0\x48\x85\xdd\x20\xe0\x2a\x8c\x0e\xcb\xd0\xf8\x82\xe1\x6a\x46\x15\x87\xf7\x4e\x6c\x6c\x12\x3a\x3b\x6c\xfc\x9e\x73\xab\x50\x2c\x02\x38\x08\xf3\xdf\x6f\xbe\x7d\x77\xfa\x17\x69\x83\x63\x6c\x01\x15\x43\x37\x40\x02\x38\x21\xaa\xc9\xe6\x84\x2a\xb3\x24\x83\xe8\x86\x4a\xb0\x71\x49\x05\x9f\x32\xa5\xc7\xbe\x93\x96\xfa\xfe\xb7\x3f\x0c\xb3\xfe\xd7\xb2\x26\x36\xcf\xec\xc4\x55\xa6\xb3\x6b\x6f\xb1\x8b\x2b\xdc\x20\x0f\x77\x10\xa4\xb7\x30\x54\x32\xb7\x1b\x71\x0f\x1b\xa0\xe9\x9d\xe1\x8f\xb8\x01\x0d\x03\x67\xe2\x2b\x72\x60\x44\xcf\xce\x94\xff\xdb\xb0\xbd\xff\x19\x2e\xce\x70\x74\x0f\x82\xc3\x81\x79\xf4\x00\x27\xea\x73\x1f\xba\xa1\xb3\x1e\x2a\xc8\x1e\x83\x20\x75\xcd\x67\x33\x06\xc2\xf3\x9c\x11\x28\xba\x70\x6c\xab\xf5\x09\xd9\x01\xe4\xa2\x87\xe2\x0c\x07\xab\x8b\xfb\xfe\xb7\x3f\x1c\x90\xa3\x16\x1a\xc8\xa2\x5c\xe4\xec\x13\xf9\x2d\xba\x68\xb8\x32\xfb\x76\x3c\x7c\x6a\x60\x63\x50\x4b\xa1\xe9\x27\x33\x97\x6c\x2e\x15\x13\x68\x06\xd2\x92\xcc\xe9\x82\x11\x25\x4b\x46\xee\x59\x51\x8c\xac\x53\x8a\x0c\xa7\xb1\x01\x1e\xbb\x23\x87\x62\x51\xa4\xa2\xb5\xee\x5d\x87\xb1\xb5\xdb\xc1\x2c\x0d\xea\xcd\x86\x95\x68\x1b\x32\x34\xe5\xc2\x7a\xe4\x6d\x5c\x81\xc1\x69\x28\x04\x82\x88\xa6\x25\xc9\xe6\x54\xcc\x98\x75\x52\x0d\x2b\x76\x8d\x6e\x6a\x36\xe8\x04\x8e\xa2\x18\x77\x5c\x24\x14\xc8\xf9\x86\x8b\xd5\x18\xb5\xcd\x36\xd4\x19\xd7\x2e\x5d\xd3\x26\x28\xe8\xe5\xa9\x39\xef\x9a\x4f\x1a\x2d\x6b\x75\x9a\xb3\x05\x2b\x4e\x15\x9f\x8d\x68\x9d\xcd\xb9\x66\x99\x59\xd0\x29\xad\xf8\x28\x93\xc2\xe0\x1d\x54\x35\x2b\xf3\x5f\x9a\x75\xa8\x91\x99\xe8\x60\xa7\xb8\xa8\xe5\x86\x4c\xc7\x9f\xd5\x64\xbc\x97\xd5\x05\x6d\x8e\xeb\x4b\x44\xfb\xdd\x13\xac\x13\x8c\x51\xa7\x0f\x5e\xa6\x6b\x44\x96\xca\x79\x0f\x6d\xbf\xbe\x6c\x15\x82\xb9\x7a\x58\x95\x0d\x6e\xa6\xa7\xf8\xa1\x5b\x5d\xd2\x1c\xd9\x05\x15\xcb\x47\xbf\x06\x66\xa3\xa1\x8d\x66\xb6\x1c\x01\x08\x59\x8c\xa8\xc8\xcd\x7f\x63\x66\x71\xb6\x7c\xf0\xce\x36\x3c\x81\x18\x7c\xb8\xba\x78\x9a\xcb\xd1\xf0\x07\xde\x7c\x2b\xc5\x46\x89\x98\x28\xc6\x43\x68\xa8\xae\x1b\xe6\x84\x81\xbe\xa0\xce\x95\x83\xf9\x7f\xb6\xcb\x62\xe0\xd3\xf4\x55\xa9\x87\x05\xd1\x21\x4f\x63\x47\xce\x8e\x5a\xc1\x9b\xf6\xf9\xae\x65\x14\xe2\x72\xa9\xd2\xb6\x10\xaf\xab\x5c\xd5\x5b\x18\x2e\x7e\xeb\x92\x90\x3d\x6d\x63\xf5\x11\x18\xe6\x62\x8b\xcc\xe4\x46\x1b\xea\x9f\x66\x5e\xc1\x0b\x29\xa7\xfe\x41\x54\x01\x0a\xae\x7c\x05\x5a\xa3\x06\x2a\x4d\xe8\x82\xf2\x02\xfc\x4c\x72\xa2\x58\xbd\xa0\xdb\x14\x47\x2c\x62\x4f\x57\xb5\x5a\xdb\xb3\x16\xc5\xcd\x47\xd7\x21\xdd\x7a\xd6\x4f\xac\xbf\x98\x8d\x1b\xdb\x5d\x20\xe6\x15\xad\xac\x65\xcb\x1a\x1e\xa8\x41\xa2\x02\xbf\xf1\x4f\x5b\x8a\xa0\x85\x54\x2a\x83\x9f\x7f\x65\xb4\xd6\x13\x46\xf5\x2d\xdf\xce\xab\xd7\x10\xbe\xf7\x96\x33\x65\xb5\xe8\x7e\xcf\xc8\x4c\x6a\x23\xc2\x35\x70\x33\xb6\xa2\x38\xc8\xe5\x58\xe6\xd2\x23\xe3\xe3\xe1\x7b\xbb\xea\xdb\x9a\x42\xa6\xb1\x14\x49\xcb\xee\xbf\xb6\xbe\x6e\x2b\xfd\x0f\xae\xc3\x08\xfd\x00\x05\x8a\xa8\x81\xe5\x0e\x4f\x16\x7d\x5e\x43\x19\x23\x7b\xdb\x82\x92\x29\x35\x50\x3a\xad\x1f\x00\x8e\xcf\xe2\xc5\x5f\x71\x29\x97\xee\x6f\x98\x4b\x3a\xc4\xeb\x72\xa6\x29\x2f\xac\x75\xc5\x6e\x99\xdf\xcd\x61\x6a\x3d\xb0\xe0\x9a\x51\xb5\x5d\x24\x59\xad\x12\xac\xa4\xc0\x65\x48\xc1\x46\xf7\xb2\xce\xc9\x39\x2d\x59\x71\x4e\x15\xb3\x90\xba\x45\x07\xf0\x14\x0f\xb7\xfb\x53\xf7\xb5\x88\x4d\xd6\xc9\x2d\x8b\x40\xc3\x9c\x43\x3c\x8b\x37\xad\xda\x89\x53\x3e\x71\xe6\xe0\xdb\xba\x19\xe8\x39\xf5\xda\x70\xcc\x13\xf2\x41\xdc\x09\x79\xbf\xfb\xec\xf5\x80\xc7\xab\x1f\x82\xba\xac\xfc\x95\x71\x05\x22\x7b\xe6\x37\xbf\x80\x1d\xe6\x62\xd9\xc7\x46\xa3\x70\x9f\x95\xf9\x07\xdd\x5c\xcc\x7f\xae\x99\x02\x8d\x42\x5c\xcb\x59\xcd\x94\xda\xbc\xf0\x4d\x25\xd3\xe3\x1c\x05\x7f\x61\xc2\xd6\x23\x08\x4c\xf5\x6a\xd3\x3b\x6e\xd6\x8e\x5f\xce\xda\xbf\x6c\xed\x65\x65\x3f\x5e\x15\x1b\x44\x9e\xa1\x88\xe5\xce\xa4\x37\x9a\x0c\xb7\xcd\x76\xb3\xa9\xb0\xc3\x5f\x3b\xcf\x6e\xda\x5a\x23\x2c\x0d\x59\xc0\xdd\xda\xcf\x6f\x3e\x6e\x3b\x84\x2d\x3c\x76\x98\x23\x86\xcc\x8b\x0f\x33\x2c\x06\x6e\x52\xc0\x98\xb8\xbb\x19\x71\x7b\x04\xcb\x2e\x06\x44\x67\x24\xdc\xc6\x7f\x1e\xcf\x74\xb8\x9b\xd1\x70\x38\xec\xe2\x71\xcc\x85\xbb\x19\x0a\x5b\x63\xe0\x36\xf2\x97\x66\x22\xdc\x68\x06\xdc\x36\xe3\x18\xe3\xe0\x66\x03\xe0\x16\x88\x61\xb3\xe0\x56\xd3\xdf\x76\x6c\xdd\x6a\x10\x0c\x18\xfd\xb6\x40\xdc\x66\x0a\x1c\x36\xf7\x05\xee\xf1\x76\x13\xdf\x4f\xc1\xb8\x17\x58\xdc\x76\x83\xde\x17\x68\xca\x8b\x58\xcb\x80\xf9\xee\x0b\x35\xdc\x05\x16\x15\x65\xac\x7b\x14\x33\xdd\x4f\xc6\x40\x17\xd8\xc1\xad\x46\xb9\x2f\xce\x1c\x17\x16\x37\x59\x1e\x16\x88\xaf\x3a\x8f\x76\x45\x62\x2b\x64\x41\x80\x97\x7d\xc2\x85\x93\x75\xc5\xb1\x5d\xa4\x60\x23\x88\x06\x66\x75\x68\xa7\x15\x2d\x47\x3a\x41\x78\x23\xf7\x74\x5a\x5d\x6f\xe2\xe4\xe2\xf2\xfa\xfd\xe5\xf9\xd9\xed\xe5\xc5\xaa\xf4\xba\xbe\xdf\x83\x52\xe5\x76\xbb\xcd\xa8\x23\x53\x6e\xf8\xa3\x21\xc4\x1b\x7e\x16\x9b\x22\x64\x47\xa4\x69\x36\xf8\x6f\x1f\x26\xd1\xee\xcc\xcb\x76\xe6\x13\xa1\xdb\x17\x77\xfd\xcc\xed\x03\xcc\xc0\x98\x49\x23\x3d\xcd\x65\x91\x2b\x1b\x8f\x4e\xae\x2e\x7c\x66\x2d\x17\x59\xd1\xe4\xdb\x4d\x13\x1f\x3e\x5c\x5d\xa8\x31\x21\x5f\xb3\x8c\x36\x0a\x6c\x57\xb9\x14\x87\x9a\x7c\xfb\xee\xcd\x7f\x40\x5e\x08\x3c\x61\x85\x44\x6e\x3b\x6e\x70\x3a\xd0\x4e\x04\x57\x07\x30\x51\xb0\x81\x59\x66\xb4\x32\xb4\x4c\x61\x0f\x49\x0d\x52\xca\x9c\x15\x95\xa1\x9b\x77\x8c\xf8\x0e\x07\xdb\xe6\x79\x75\xa1\xe0\x1d\x8c\xc0\xb7\xe1\xc5\x33\xa6\x31\xf7\x76\x7b\x84\xf0\xc0\x8e\x0f\xda\xba\x1f\x60\xe5\xee\xde\xb3\x0d\x73\xb2\x76\x8b\x7b\xaa\xac\x7d\x70\xc3\xcc\x07\xf1\x24\x64\xe5\xda\x66\x16\xda\x62\x10\x42\x22\x0e\xff\x5a\x33\x04\x98\x49\xb6\x36\x9e\x8d\xd4\x45\x4b\xc8\xd9\x8c\xb2\x60\x6f\x0b\x69\xdb\xd4\x2b\x6d\xcd\xf2\xc3\x56\xb7\xbe\xf7\x49\x5f\x71\x73\x68\xf3\xd7\x66\x01\xed\x31\xf3\x57\xe0\x7d\xc1\x1f\x30\x0e\xb4\xfb\x4b\x33\x71\xa2\x81\x27\x32\xd6\x66\x45\xfe\xfb\x7f\x7e\xf1\xff\x07\x00\x00\xff\xff\xa4\xcc\x5d\xeb\xff\xf9\x01\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\xb1\xe8\xf7\xfd\x15\x28\x27\x55\xb6\x73\x24\x79\x26\x67\x4f\x92\xeb\x93\x4a\xca\x63\x7b\x12\x9d\x9d\xf1\xf8\x8c\x3c\xb3\x95\xbb\xc9\x4d\x20\x12\x92\xb0\x26\x01\x2e\x00\xca\xa3\x3c\xfe\xfb\x2d\x74\x03\x20\x48\xbd\x48\x59\x7e\xec\xc6\xfc\xb0\x3b\xa6\x00\x10\x68\x34\xba\x1b\xfd\xa4\x05\xff\xcc\x94\xe6\x52\x9c\x12\x5a\x70\xf6\xc5\x30\x61\xff\xd2\x83\xdb\xdf\xe8\x01\x97\x27\xf3\xd7\x5f\xdd\x72\x91\x9e\x92\xf3\x52\x1b\x99\x7f\x64\x5a\x96\x2a\x61\x17\x6c\xc2\x05\x37\x5c\x8a\xaf\x72\x66\x68\x4a\x0d\x3d\xfd\x8a\x10\x2a\x84\x34\xd4\xbe\xd6\xf6\x4f\x42\x12\x29\x8c\x92\x59\xc6\x54\x7f\xca\xc4\xe0\xb6\x1c\xb3\x71\xc9\xb3\x94\x29\x18\xdc\x7f\x7a\xfe\x6a\xf0\xf5\xe0\xf5\x57\x84\x24\x8a\x41\xf7\x1b\x9e\x33\x6d\x68\x5e\x9c\x12\x51\x66\xd9\x57\x84\x08\x9a\xb3\x53\xa2\xcb\xb1\x4e\x14\x2f\xe0\x13\x03\x59\x30\x45\x8d\x54\x7a\x90\x48\xc5\xa4\xfd\x5f\xfe\x95\x2e\x58\x62\x3f\x3e\x55\xb2\x2c\x4e\xc9\xca\x36\x38\x9c\x9f\x23\x35\x6c\x2a\x15\xf7\x7f\x13\xd2\x27\x32\xcb\xe1\xdf\xb8\xf6\x51\xf4\x55\x78\x9d\x71\x6d\xbe\x59\xfa\xe9\x1d\xd7\x06\x7e\x2e\xb2\x52\xd1\xac\x31\x5b\xf8\x45\xcf\xa4\x32\x57\xd5\xb7\xed\xb7\x74\x39\x8e\xff\xed\x1a\x72\x31\x2d\x33\xaa\xea\x83\x7c\x45\x88\x4e\x64\xc1\x4e\x09\x8c\x51\xd0\x84\xa5\x5f\x11\xe2\xe0\xe8\xc6\xec\x13\x9a\xa6\xb0\x37\x34\xbb\x56\x5c\x18\xa6\xce\x65\x56\xe6\x22\x7c\xd3\xb6\x49\x59\x18\xf5\x94\xdc\xcc\x18\x29\x68\x72\x4b\xa7\xcc\x7f\x6f\xcc\x52\x62\x64\xe8\x40\xc8\xf7\x5a\x8a\x6b\x6a\x66\xa7\x64\x60\x41\x3c\xb0\x10\x8c\x7e\xc6\xfd\xb9\xc6\x41\xa2\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x09\x35\x34\x93\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\x4b\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\x69\xd4\x7c\xdd\x7a\x4a\x33\x2a\x04\xcb\x88\x9c\x90\xb2\x48\xa9\x61\x9a\x18\x59\xc1\x67\x33\x78\x5c\xe7\xa5\xd9\x9c\x2f\xbd\x5f\x31\x1d\x6c\x3a\x7f\x4d\xb3\x62\x46\x5f\xbb\x97\x3a\x99\xb1\x9c\x56\x7b\x28\x0b\x26\xce\xae\x87\x9f\xff\x73\xd4\xf8\x81\xd4\x97\x12\xa3\x28\xb9\x65\xac\xd0\xd5\xa1\x20\x65\x61\xd7\x64\x17\x47\xc6\x0b\x62\x14\x4d\x6e\xb9\x98\xc2\xd2\xa7\xb8\xde\x73\xdc\x18\x3d\x58\x9a\xb2\x1c\x7f\xcf\x12\x13\xbd\x56\xec\x87\x92\x2b\x96\xc6\x53\xb1\x90\xf5\x24\xa2\xf1\xda\xc2\x29\x7a\x55\x28\x3b\x2d\x13\x9d\x43\x7c\x22\x1a\x55\x7b\xdf\x58\xe6\xa1\x85\x05\xb6\x23\xa9\x25\x4f\x76\xfa\x33\xe6\x0f\x07\x4b\x1d\x00\xed\x76\x9a\x19\xd7\x44\xb1\x42\x31\xcd\x04\x12\x2c\xfb\x9a\x0a\xb7\xa6\x01\x19\x31\x65\x3b\xda\x03\x5b\x66\xa9\xa5\x63\x73\xa6\x0c\x51\x2c\x91\x53\xc1\xff\x1e\x46\x03\x10\xd9\xcf\x64\x16\x3f\x0c\x81\xe3\x26\x68\x46\xe6\x34\x2b\x59\x8f\x50\x91\x92\x9c\x2e\x88\x62\x76\x5c\x52\x8a\x68\x04\x68\xa2\x07\xe4\xbd\x54\x8c\x70\x31\x91\xa7\x64\x66\x4c\xa1\x4f\x4f\x4e\xa6\xdc\x78\x0a\x9c\xc8\x3c\x2f\x05\x37\x8b\x13\x20\xa6\x7c\x5c\xda\x8d\x3b\x49\xd9\x9c\x65\x27\x9a\x4f\xfb\x54\x25\x33\x6e\x58\x62\x4a\xc5\x4e\x68\xc1\xfb\x30\x59\x81\x24\x32\x4f\x7f\xa6\x1c\xcd\xd6\x87\x0d\xf0\xad\x3c\x07\xc4\x53\xbd\x8d\xb0\xb6\xc4\x8f\x70\x4d\xa8\xeb\x8e\x6b\xa9\x40\x6a\x5f\x59\xa8\x7c\xbc\x1c\xdd\x10\x3f\x01\x04\x3b\x42\xb8\x6a\xaa\x2b\x60\x5b\x40\x71\x31\x61\x0a\x5b\x4e\x94\xcc\x61\x14\x26\xd2\x42\x72\x61\xe0\x8f\x24\xe3\x4c\x18\x7b\x0c\x73\x6e\x34\xe0\x1c\xd3\xc6\xee\xc3\x80\x9c\x03\x03\x22\x63\xe6\x0e\x6c\x3a\x20\x43\x41\xce\x69\xce\xb2\x73\xaa\xd9\x83\x83\xda\x42\x54\xf7\x2d\xf8\xda\x03\x3b\xe6\x9f\xcb\x1d\x96\xce\x18\x21\x9e\xc1\xad\xdd\x9d\xf8\xc0\x8f\x0a\x96\x84\xe3\x40\x05\x39\x2b\x8a\x8c\x27\x88\xf1\x66\x46\x0d\x49\xa8\xb0\xf0\xe2\x42\x1b\x9a\x65\xc0\x4e\x5a\xcd\x62\xdd\x69\x27\x70\xb4\x1b\xcc\xc1\xbf\x5e\xa2\xd0\xf5\x1f\x02\x53\x6b\xb4\x58\x47\x19\xec\xe3\xe8\xec\xf2\x0f\x1b\x40\x4e\x50\x32\x99\xf0\xe9\xaa\x6e\x6b\x61\x79\x0e\x5d\x40\xa6\xa1\x5c\x68\x37\x44\xa9\x10\x9a\x15\xa7\xb2\xbc\x8b\xd6\xf8\xf6\x60\xed\xec\x56\x42\x76\xdb\x9a\xed\xc3\xc4\x7c\xf5\x0f\x8d\x05\x5c\x8a\x39\x1e\x54\x2b\xb3\x58\x22\xc7\xc4\x9c\x2b\x29\x72\x7b\x88\xe6\x54\x71\x3a\xce\x1c\x63\x63\x96\x7c\xe1\x19\xc3\x25\x32\xb5\xea\x48\xad\xf9\x2a\xae\x87\x2a\x45\x17\x6b\x5a\x70\xc3\xf2\x35\xab\x59\x35\xed\xcf\x54\x45\x54\xc2\x22\xef\xaa\xa9\x13\xd7\xc0\x4e\x9d\x92\xf3\x30\xf1\xb5\x9f\xd9\x02\x77\x7c\xd6\xe3\x76\xf5\xac\xc1\x72\xff\x6c\xdb\x40\x7c\x80\xd3\x6f\xf8\xbd\x01\x16\x7b\x42\x90\x81\xb1\x95\xd0\x18\x90\xf7\xa5\x86\xdd\xa2\xe4\xfc\xaf\xc3\x8b\xcb\xab\x9b\xe1\xdb\xe1\xe5\xc7\xf5\xe0\x20\xdb\x0e\x4a\xf5\x00\x8d\xef\x30\xd9\xc3\xcf\x7e\x8f\x14\x9b\x30\xc5\x44\xc2\x34\xf9\xf9\xd1\xe7\xb3\x8f\x7f\xbd\x3a\x7b\x7f\x79\x4c\xa8\x62\x84\x7d\x29\xa8\x48\x59\x4a\x4a\xed\x99\x46\xa1\xd8\x9c\xcb\x52\x3b\xba\x95\xae\x41\xd9\x26\xae\x02\xaf\xa5\x62\x41\x34\x53\x73\x9e\xac\x06\x90\x1e\x90\xe1\x84\xd0\x0a\x7d\x92\x80\xdf\x96\x4d\x65\x73\x96\xf6\x60\xd8\x30\x65\xff\x1d\x2e\x8a\xd2\x78\x76\x77\xc7\xb3\x0c\xce\x84\x40\x49\x29\x1d\x80\xc4\x18\x2f\x4e\x2f\x84\xa1\x5f\x3c\x7d\x65\x3a\xa1\x05\x4b\xc9\x1d\x37\x33\x42\x49\x2a\x4b\xfb\xf1\x9f\xff\xbc\x47\x38\x3b\x25\x3f\x8f\x3a\x0e\xc8\xa5\x6b\x1b\x41\x0d\xbe\x27\xd8\x9c\x29\x18\xcc\xc1\xac\x47\x14\x9b\x52\x95\x66\x4c\x6b\x8b\x15\x77\x33\x66\x66\x0c\x05\xe7\xb0\x40\xf6\x85\x5b\xf6\x28\x15\x11\xd2\x0c\xc8\x05\x9b\xd0\x32\x03\x7e\x49\x0e\x0e\x06\x4d\x36\xb5\x3b\x62\xbc\x55\x32\xef\x80\x1c\xa3\xba\x9c\xbf\x6a\xaf\x0e\x35\x8e\x5c\x23\x42\x9a\xa5\x84\x4f\x9c\xbc\xc1\xb5\x5d\x14\x61\x79\x61\x16\x6d\x50\x7c\xcb\xa9\x27\xad\x8f\x2d\x09\x1c\xe4\x3d\x2d\xbe\x61\x8b\x8f\x6c\xb2\xad\x79\x73\xfd\x2c\x63\x89\x25\x6b\xe4\x96\x2d\x40\xf8\x24\xe7\x7e\xc0\xcd\x4b\xe9\xb4\x1c\xd2\x92\x98\xf9\xa7\x6f\xa7\xb3\xb5\x5d\x7b\x20\xd9\xe7\x96\x2d\xda\x34\x23\xcb\x37\x30\x0b\x1a\xe0\x4c\x16\x56\xdb\xa1\x42\xda\xa3\xac\x7f\xb6\xd3\xdf\x95\x93\x3b\x8c\x09\xb1\x3b\xa7\x66\xa5\x78\x79\x5b\x8e\x99\x12\xcc\x30\x90\x30\x53\x99\x68\x2b\x5c\x26\xac\x30\xfa\x44\xce\x2d\xa5\x62\x77\x27\x77\x52\xd9\x6b\x57\xdf\x52\x87\x3e\xee\xaa\x3e\x01\x15\xc5\xc9\xcf\xe0\x7f\xe4\xe6\xc3\xc5\x87\x53\x72\x96\xa6\x44\xc2\x11\x2f\x35\x9b\x94\x19\x99\x70\x96\xa5\x7a\x10\xdd\x91\x7a\x20\xbd\xf7\x48\xc9\xd3\xdf\x6f\x3e\xdc\x3b\x42\x4c\x16\xa8\x5a\xd8\x01\x6a\x23\x10\x91\x16\x35\x3a\x15\x90\xde\x52\x28\x2b\xd0\xdb\x3d\xcf\x1d\x13\x73\x0c\xa0\xc3\x32\xc6\x52\x66\x8c\x8a\x2d\x3d\x00\x6c\xdd\xcf\xec\x61\x75\x68\x61\x04\x8f\x00\x85\x4c\x4f\x89\x2e\x8b\x42\x2a\xa3\x83\x40\x0f\x1a\x92\x5e\xfd\x4f\x90\x6e\x7b\xe4\x6f\xe1\x65\x46\xc7\x2c\xd3\xdf\x1d\x1e\xfe\xf6\x9b\xcb\x3f\xfd\xee\xf0\xf0\x2f\x7f\x8b\x7f\x8d\xf4\x69\xf5\x26\xa8\x81\x91\x29\x88\xcc\xee\x4f\xc7\xf6\xce\x92\x44\x96\xc2\xb8\x1f\x0c\x35\xa5\x1e\xcc\xa4\x36\xc3\xeb\xf0\x67\x21\xd3\xe6\x5f\x7a\x0b\x27\x20\x0f\x4b\x74\x00\x9c\xd7\xd4\xcc\xf6\x4c\x7a\xd6\xeb\x0e\x56\x3f\xb5\xed\xf6\xda\x04\xb7\xcb\x4e\x7d\x60\xff\xf9\xd6\x4f\xd7\x72\xa0\x3b\xc5\x8d\x61\x02\xe4\x04\xa6\x72\xcb\x89\x7b\x16\x73\x2b\x36\x3b\x7f\x7d\xf0\x20\xc4\x2b\x40\x6d\x87\xc5\xc1\xec\xdd\xca\x10\x99\x03\xa1\xf5\x12\x4f\x75\xa3\x39\xbb\x1e\x7a\x3d\xca\xde\x17\xe2\xb5\x03\x6f\xef\x7d\x26\x83\x9e\xc1\x2d\x2b\x48\x86\xa7\x44\x8a\x6c\x11\x7e\xd7\x24\xe3\xa0\x3b\xb0\x02\x63\xd0\x1f\x1c\xe1\xcb\x41\x52\x94\x3d\xd7\x60\x90\xb3\x5c\xaa\x45\xf8\x93\x15\x33\x96\x33\x45\xb3\xbe\x36\x52\xd1\x29\xeb\x85\xee\xd8\x2d\xfc\x85\x1d\x6b\x1f\x58\xee\x8d\x02\x70\x52\x2a\xcb\x3c\xb2\x85\xa7\x20\x2c\x7d\xda\xb3\xe8\xc1\xb4\xe7\xa3\x18\x76\xe3\x6a\x47\x96\x1b\xee\x76\x4e\x3d\xea\x57\x05\x32\xe4\x5c\x66\x65\xce\x74\x2f\xb0\x27\x78\xcb\xc4\xdc\x4a\x93\x4b\xca\x98\xd5\x4f\xc7\xd3\x97\xf2\x39\xd7\x52\xed\xcc\x07\xb9\x53\x50\xca\xd2\xd8\x9b\xc5\x44\xaa\x9c\x9a\x70\xb9\xfb\x52\x48\x0d\x77\x00\x87\xb3\x0d\x92\xf2\xfa\xa0\xd5\x67\x0b\x6a\x0c\x53\xe2\x94\xfc\xbf\xa3\x3f\xff\xc7\x3f\xfb\xc7\xbf\x3f\x3a\xfa\xee\x55\xff\xff\xfc\xe5\x3f\x8e\xfe\x3c\x80\x7f\xfc\xe2\xf8\xf7\xc7\xff\xf4\x7f\xfc\xc7\xf1\xf1\xd1\xd1\x77\xdf\xbc\xff\xc3\xcd\xf5\xe5\x5f\xf8\xf1\x3f\xbf\x13\x65\x7e\x8b\x7f\xfd\xf3\xe8\x3b\x76\xf9\x97\x96\x83\x1c\x1f\xff\xfe\xe7\xad\xa6\x47\xc5\xe2\x43\x8b\x03\x8f\x4f\xdf\x6d\x10\x17\x86\x4d\x99\xea\xd8\xab\xf5\xb6\x12\xf2\xa5\x5f\x09\x6d\x7d\x2e\x4c\x5f\xaa\x3e\x76\x3f\x25\x46\x95\xdb\x0f\x46\x45\xd4\x76\xc1\xf3\x8f\xfe\xb4\x46\x8a\x53\x4f\x9a\xf7\x8e\xc8\x9a\x25\x8a\x99\x7d\xdd\x60\x70\x34\xcf\x3f\x0a\x99\x1e\x6a\x22\xd6\x28\xf5\xd6\x4d\xfb\xdf\xe2\x52\xe3\x45\x0a\x84\x57\xc5\x79\x27\x4a\xe6\x03\x12\x29\x71\xe6\x34\xe3\xa9\x6f\x77\xcb\xb6\xdc\x72\xfd\xf3\x72\x09\xfa\x71\x5d\x82\x46\xb8\xbf\x0f\x7e\x03\x62\x62\xbe\x49\x4d\xd3\xd4\xc0\xda\xb6\x75\xe5\xb1\x17\xa0\x8c\x24\x85\x2c\xca\x8c\x9a\x35\x6a\xb6\x15\x9a\x64\x87\xfb\x95\x5a\xcf\x6e\x34\x68\x6d\x1d\x95\xcb\x57\xab\x2e\xc9\x59\x96\x11\x2e\xf0\x24\xc0\x00\x5e\xfb\xa6\x18\xca\x4b\x84\xa2\x7a\x78\x6e\xa7\x70\x37\x63\x4d\xc5\x20\xd7\xf6\xae\xa3\x0c\x17\xd3\x01\xf9\xd6\xfe\x8e\x34\xcb\xa9\xc6\xb8\x20\x79\x99\x19\x5e\x64\x8c\x04\x6e\x8b\x3a\xb4\xac\x64\x84\x6a\x2d\x13\x4e\x8d\xd7\xde\xa1\xb5\x4f\x1b\x3f\x6d\x98\x8d\xa1\xb7\xa0\xb8\x4c\x58\xca\x44\xc2\x06\xe4\x33\x18\xf7\xc2\x5a\xc7\x56\x18\x04\x65\xbc\xd7\x00\x96\x68\x88\x41\x7a\xb0\x7a\x8c\x61\x9e\x97\x06\xd4\xba\x8f\xa5\x73\xb7\x3b\xee\x34\x73\x91\xea\x1d\x48\x55\x10\xad\x29\x58\x0a\xe4\xa4\xba\xba\xeb\xfb\x29\xdb\xdb\x11\xde\xa0\x6e\xdb\xca\xa9\x96\x28\x6e\xa5\x63\xa8\x53\xda\xc7\xd6\x18\xb6\xa3\xb3\x3f\x49\x1a\xdb\x81\xbe\xb6\xa7\xad\x1d\x94\x4b\x5d\xe9\x69\x5b\x6d\x52\xa1\xd8\x84\x7f\xe9\x80\x8f\x67\xa2\xba\xa2\xf0\x94\x09\x63\x2f\x02\x0a\x08\xaa\x62\x05\x13\x70\x0f\x67\x34\x99\x01\x5d\x70\x54\xb4\xd2\x0c\x3f\xa4\x7d\x07\xa5\x8c\xee\xc7\x6b\xb4\x4a\x8a\x79\x39\x5b\x3f\xf1\xb3\xe5\x76\x7d\xff\x07\x4b\xc8\x94\xe1\xdd\x62\xfd\xe5\xba\xb1\x8f\x51\x0f\xe7\x95\xe2\xff\xba\x9b\xf1\x64\x16\x26\x69\x6f\x6f\xc1\xe4\x54\x48\x38\x6b\x13\x6e\x88\xb4\x12\x81\xfd\xee\x80\x8c\x56\xf4\xcc\xa9\x49\x66\xae\xc5\xe1\xa1\x26\xa8\xb4\x6d\x0e\x34\x46\x15\x61\x5a\x66\x2c\x25\xde\xbd\x02\x07\xed\x88\x52\x35\xc7\x82\x13\xaa\x35\x9f\x8a\x7e\x21\xd3\xbe\x1d\xed\x64\x1d\x42\xb4\x38\x54\xb1\x63\xe0\xf6\x83\xb5\x15\xaf\x82\x72\xa2\xdd\x36\x7d\x0c\xfa\xb7\x48\xb6\x48\x64\x5e\x94\x86\x45\xca\xb9\xa0\xd7\x19\x2f\xd0\x0f\x28\x92\x21\x2b\x89\xe8\x7e\x30\xcd\xa9\xa0\x53\xd6\x77\x1f\xef\x87\x8f\xf7\xc3\xb7\xee\x03\xe6\x36\x54\x0b\x55\x8a\x9b\xce\x61\x1d\x78\xef\x50\x65\x89\x2f\xc7\x4e\x75\x94\xd3\x2f\x3c\x2f\x73\x42\x73\x59\x0a\x90\xc9\x96\xc1\x49\xb3\x4c\xde\xb1\xf4\xe9\x00\xd6\x12\x68\xa4\x33\x7e\x92\xe7\xab\xe0\x6a\xa5\xd8\xea\xa6\xd0\xea\xa0\xc8\xda\x59\x81\xe5\x75\xd5\xed\xd1\xf2\xa3\x57\x9f\x37\x10\x93\x8b\xad\x88\xe9\xcf\x39\x78\x64\x84\x71\xb8\x26\x32\xe7\xc6\x04\x3f\xaa\x80\x60\x3d\xc2\x4d\x4d\x09\xea\x8e\x04\x9f\x20\xa9\xe5\x9a\xb0\x2f\xf6\x52\xc5\x41\x99\xee\x8d\x17\x3d\x64\xb6\x77\x5c\x83\x1e\x8d\x0a\xc2\xf3\x22\x63\xb9\x77\xfc\xec\xfb\x2b\x9a\xf3\x35\x78\x39\x26\x2f\xc7\x64\xc3\x31\xd1\x5d\x24\x93\x58\x28\x41\xb5\xc1\x98\x65\x95\x70\x62\x11\xbc\x90\xa9\x76\xd2\x83\x47\x25\x7b\x24\x2e\xbf\x70\x0d\x5e\xb4\x1f\x19\xe8\x09\x46\xcc\x68\x72\x37\x93\x9a\x61\x0f\xaa\x98\x1b\x27\x62\x94\x5e\x2f\x02\x56\x05\x70\xf8\x9c\x4c\xea\x2d\x52\x56\x64\x72\x91\x83\x9c\x3b\x34\xb1\x74\x13\x04\x19\x96\x17\x19\x35\x2c\x88\x39\x9b\x75\x0f\xf7\xe6\x83\xf0\xf5\xcb\x2f\x56\x1e\x88\x62\x18\x5a\xc0\xb6\xd9\xb1\xae\xa8\x6a\x40\xda\xd1\x9a\x1c\xfd\x8d\x6f\x40\xde\xaf\xde\x00\x34\xcf\xae\x2e\xd6\x3b\x37\x92\x56\xca\x16\xb2\x5d\xe1\xb2\xb4\x8c\xb3\x0d\x53\x6d\xc8\xb2\xe8\xaf\xeb\xbd\x4f\xd1\x7b\xbc\x87\xaa\xac\x9e\x73\x7e\x0b\x9e\xfd\xd8\x58\xb1\x0c\xc3\x16\x9c\xda\xd9\x36\x72\x5e\xe7\xfb\xb9\x9f\xb5\xd5\xc2\xb7\xd1\xc0\xf7\xc3\xe4\xf7\x74\x25\x6c\xa5\xa2\xaf\x6d\x06\x5c\xb9\xe3\xa3\x0a\x0e\x48\x16\x92\xa8\xad\x77\x1b\x41\x8b\x22\x03\xeb\x9d\x6c\xeb\xa9\xd5\xf2\x72\x86\xcb\xef\x38\xe9\xb0\xe5\xb1\xb3\xac\x9d\xf9\xa1\x46\x04\xb0\xa7\x63\xc6\x41\xf9\x15\x74\x77\x3e\xf6\xe0\x33\x68\x55\xab\x78\x10\x7b\x12\x86\xa2\x47\xae\xa4\xb1\xff\xbb\x44\x0d\xa9\xc5\x9b\x0b\xc9\xf4\x95\x34\xf0\x66\xaf\xcb\xc6\xa9\x74\x5c\x34\x76\x82\x03\x22\xf0\x4c\x82\x7a\x3a\x0a\x46\x40\x4f\x4f\x20\x85\x1e\x40\x5c\x93\xa1\x20\x52\xf9\xd5\x05\x1d\xaf\x76\x43\xf8\x7b\xa2\x90\xa2\x8f\x4e\x85\xab\xc6\xb8\x0c\x1e\x95\x31\x4c\x36\x0c\xe7\x86\xba\xb1\x14\x18\x7f\xc1\xf0\x93\x8c\x26\x2c\x25\x69\x09\x93\x86\x50\x0a\x6a\xd8\x94\x27\x24\x67\x6a\xca\x2c\xd3\x4e\x66\x6d\x41\xbd\x8d\x2e\xe1\xd3\x82\x3a\xc5\x83\x6e\xd9\x3f\x20\xc1\xef\x80\x4b\x74\x23\xdb\xd8\x07\xc9\x5b\x4e\x0b\xbb\x75\xff\xb0\x54\x0c\xa0\xf7\x2f\x52\x50\xae\xf4\x80\x9c\x41\x14\x5c\xc6\x6a\xbf\x39\x8d\x58\x3c\x8c\x1d\xc1\x0a\x7f\x3f\x94\x7c\x4e\x33\x4b\x37\x51\xce\x63\x28\xe5\xd9\xd1\x9b\xcc\xa2\xe7\x78\xa9\x3d\xdf\xe8\xfd\xc2\x35\x39\xb8\x65\x8b\x83\xde\xd2\x76\x1f\x0c\xc5\x01\xd2\xd7\xa5\x0d\x0e\xc4\x18\xfc\x4b\x0e\xe0\xb7\x83\xfb\xf1\x97\x07\x10\xfe\xb6\xee\xa5\x91\x19\x53\x71\xd8\xe6\x96\x3d\xbc\xa9\xda\xc3\xd2\x2a\x63\x6f\x34\xd2\xe3\xd8\x2c\x6e\xbc\xd8\x62\xcf\x56\x35\x2f\x40\x2d\x63\x68\x32\x83\x30\x46\x3f\x2f\x88\x81\x59\x10\xbb\x67\x06\xe9\x3a\x20\x86\xe3\x90\x46\x81\x09\xe8\xb7\x01\xdb\x7a\x0c\xe4\xa7\xdf\x45\xbe\xe9\xd0\xde\xfe\x11\x30\xe4\xb7\xfe\x5f\xbf\xbb\x67\xcc\x41\x3b\xc6\x86\x53\xea\x20\x60\x5c\x42\x07\xc2\x45\x0a\xe6\x26\xb7\x54\x80\x00\x8e\x65\xe1\x03\xcb\x1a\x90\x4b\x4b\xa8\x48\xce\xa8\xd0\x5e\xe9\x05\x76\xa9\xaa\xb1\x76\x06\xb4\xe8\x7a\xe5\x14\x0c\xd5\xc9\x60\xe4\x4a\x8e\x9c\x26\xac\x47\xae\x41\xb3\x5a\xbd\x81\x93\x74\x25\x2f\xbf\xb0\xa4\x34\x6b\x2d\x5b\x31\xdc\xb6\x72\x91\xad\x8c\xbe\x06\x90\x6f\x2a\x26\x8f\x2b\xab\x31\xf9\x0a\x83\x63\x36\xbf\x11\x32\xb7\x6c\x51\x31\x1b\x27\x42\x00\xc9\xef\x55\x58\xe2\x59\x01\xf2\x8e\xff\xf6\x8a\xad\x7c\xcc\x05\x7e\x0c\x87\xf6\x5b\x01\xa3\x7b\x80\x5a\xc9\x2e\xcb\xf0\x33\xfb\x00\x57\x3b\x39\xa3\x06\xb3\x0f\x1d\x64\x8c\x40\x25\x57\x4b\x17\x91\x48\x71\xf9\x43\x49\xb3\x7a\x48\x82\x7b\xe5\x1a\x2d\x51\xf5\x3b\x9e\xa5\x09\x55\xce\xe7\x0b\x43\x2c\xb5\xc4\xdd\xa3\x40\x08\x12\x2a\xc2\x69\xaf\xf6\x48\xa3\xe1\xb2\xa0\xca\xf0\xa4\xcc\xa8\xf2\x51\xdf\xad\xc2\x06\xb6\x42\xb4\x42\x9a\x11\x4b\xa4\x48\xbb\x5c\x00\x6e\x9a\x7d\x9b\x96\xd7\x82\x29\x2e\xd1\xd7\x98\xe7\xac\x89\xa4\x47\x75\x0d\xb7\x9c\xf8\x53\x1d\x8e\x58\x4d\x01\x02\x71\x95\x9e\xe1\xf1\xa9\x90\x8a\xa5\xc7\x11\x79\x0c\xa7\x62\x40\xde\x2c\xbc\xb6\x05\x34\x2f\x2e\xd6\x42\x33\xd3\xf3\xba\x71\x87\xb2\x0e\xd8\xd5\x81\x9a\x48\x05\xa1\x2a\x47\xa9\xc4\xf8\x8c\x39\x4f\xcc\xf1\x80\xfc\x5f\xa6\x24\x6c\xbc\x60\x53\x6a\xf8\x3c\x70\xd3\x70\x71\x55\x8c\x3a\x7b\xfe\x2b\x72\x04\xdd\x08\xcf\x73\x96\x72\x6a\x58\xb6\x38\xc6\x7b\x2c\x23\x7a\xa1\x0d\xcb\xdb\x6c\x5d\x1b\xa5\x01\x7a\xde\x41\xdb\x5f\x7d\xbd\xa1\x65\xd7\xf8\xa7\xcf\x3e\x46\xa5\x82\x0c\x7a\x14\x34\xb6\x30\xf0\x20\xb9\x41\xdc\x8c\x3d\x12\x5c\x50\xb2\x97\x2c\xe3\x0d\xfe\xde\xe2\x01\x25\x8a\x41\xf6\x00\x87\xb9\xf7\xc4\x71\xf4\xad\x7c\x2f\x4b\xb1\x5e\x33\x58\x5b\xf8\x3b\x77\x09\xff\x1c\x75\x5c\x1b\x61\xf8\x28\x62\x42\x34\x93\x48\x53\x49\x09\xa8\x27\x81\x9d\x5b\xf2\x80\xad\x2a\xbf\x94\xad\x93\xdc\x6b\x34\x21\xcc\x65\x8b\x0f\xfc\x5e\x62\x0e\xc3\x87\x3a\xe0\x32\xb8\x8b\x3b\xc0\x34\xa2\xee\x8c\x23\x07\x80\x9f\x08\xc1\x0a\x41\xe1\x5b\x2c\xf5\x3e\x6d\x96\x1a\xb8\xae\xe4\xf0\xf4\x70\x2f\xc4\x17\x97\xa3\x64\x41\xa7\x70\x9e\x3a\xac\xaa\xd9\x95\xa4\xcc\x30\x95\x43\xb0\xf4\x4c\xde\xe1\xef\xc8\xb6\x0a\xd7\x8a\xa5\x55\x5c\xfa\x4c\x6a\xe0\x4a\xf5\x10\x44\x38\xbf\x60\x26\xbd\xa3\x0b\x42\x95\x2c\x45\xea\xa4\xa6\x40\x40\xdf\x37\x3e\x7c\x25\x05\x50\x8a\x52\x63\x28\x61\x4c\xa5\xc7\xcc\x50\x7b\x6c\x5e\x0f\x5e\xbf\xda\x0b\xc0\x3a\xc6\x9c\xc2\x6c\x1a\x9a\x42\x6f\x39\xf7\x67\x66\x2f\xf3\x52\x8c\xa6\x1f\x44\xd6\x45\x96\x7b\x8f\xe8\x05\x5d\xfb\x70\x09\xe3\x13\xd0\xdd\xf6\xf0\xd5\x9d\xe2\x86\x45\xe4\xf1\x68\x42\x33\xcd\xec\xd5\xbd\x14\x41\x84\x3d\xae\x8b\x20\xd0\xa4\xcd\x82\xb6\x7b\x87\xe8\x72\x7c\xcf\x73\xe6\x0e\x14\xa0\x5c\x75\xcc\x02\xc2\x1d\xea\x0d\x47\xae\x1e\xea\x49\x8e\xb0\xa5\x95\xd8\xa4\x34\xc7\xfb\x71\x19\xc1\x05\xda\x9b\x75\x97\x2b\x89\x8f\xf9\x2d\xf6\xb8\xda\x37\x6c\x46\xe7\x4c\x13\xcd\x73\x9e\x51\x95\x41\xe4\xe0\x08\xe7\x47\xc6\xa5\x59\x1d\x3d\xde\x2d\x32\x39\x9e\x49\x34\xdc\x56\x50\xfb\x79\x58\x38\x01\x8d\xf0\xf3\xb2\xdf\xc9\x4b\x53\xd2\x2c\x5b\x10\xf6\x25\xc9\x4a\xcd\xe7\xf7\x3d\x4d\x2e\x16\x62\x07\x56\xdd\xe4\xd2\x85\x4c\x47\x05\x4b\x1e\x93\x47\xd7\x6f\x18\x96\x54\xa5\x7e\xd3\x81\x27\xe3\x65\x1f\x6e\xee\x0b\xf0\x83\x4a\x12\xa6\xb5\xf7\xb0\x5c\xc4\x5e\x9f\x61\x0d\x3f\x96\x64\x00\xf4\x4e\x5f\x66\x54\x1b\x9e\xbc\xc9\x64\x72\x3b\x32\x52\x75\x8a\xb7\x3f\xfb\x76\xb4\xd4\xbf\x91\x42\xe1\xec\xdb\x11\xb9\xe0\xfa\x36\x4e\xca\x82\xb6\xd3\x58\x5d\x42\xc9\x6d\x39\x66\x19\x33\x87\x87\x1a\xb9\x5c\x4e\x93\x19\x17\xcc\x33\x38\x11\x02\x54\xdc\x85\xcf\x42\xb9\xab\xe9\xd4\x85\x41\x9d\x38\x7c\xfd\x19\xbd\xd3\x0c\xa7\x3f\xb6\xd3\xb7\x3f\xb3\x36\xf1\xe9\x7b\xb5\x53\xe0\x64\x86\x17\x7b\xb2\x41\x4c\xf4\x8d\x9d\x63\x37\xe5\xf6\xe1\x5b\x9e\x31\xbc\xe3\xc0\x12\xbd\x8f\x9a\x3b\x07\xb0\x63\x0b\x59\x92\x3b\x8a\xb7\x62\xa0\x81\x03\x72\xc3\x8b\x53\x72\x29\x74\xa9\x58\xa5\xcf\x98\x34\x86\xe2\xba\x8a\x33\xf3\xd7\x29\xd8\x61\xbc\x72\x58\x4a\xe7\x6e\x57\xe4\xf2\x0b\xcd\x8b\x8c\xe9\x53\x72\xc0\xbe\x98\xaf\x0f\x7a\xe4\xe0\xcb\x44\xdb\xff\x09\x33\xd1\x07\x03\x32\xcc\x83\xb9\x1d\xd2\xf6\x28\xe6\x1d\xa1\xb0\x83\x65\xc6\x11\x9f\x7d\x10\x04\x71\x4e\x75\x56\x5a\x4b\x25\xb9\xc3\xec\x11\x96\xc4\x33\xa5\xa4\x0a\x7e\xe8\x11\x18\x80\xbb\x24\x32\x2f\x94\xcc\x79\xa4\xd8\x03\x04\xdf\xab\xb7\x1d\xa8\x1b\xb6\x8b\xa4\xcb\xfb\x8f\xf9\xd8\x5c\x67\x52\x67\x8e\xeb\x76\x7f\x38\xf1\x8e\x13\x78\x55\x74\x77\x77\xb8\x7f\xba\x46\x76\xbf\xdd\x28\x96\x5a\xc5\x3b\xfc\x36\xc4\xd0\x91\x93\x94\xcd\x4f\x74\x4a\x5f\xf7\xe0\x33\xda\xf9\xfe\x99\xda\x9c\xa8\x26\x07\xaf\x0f\x06\x64\xe4\xb9\x6d\x2f\x9e\x63\xd5\x6e\x22\x55\x18\x10\x94\xe9\xaf\x0e\xc8\x91\x54\x30\x72\x42\x05\xc9\x18\x9d\x3b\x05\x32\x9e\xa9\x05\xde\x69\x8f\x5b\xc7\x40\xb6\x0d\x07\x8b\x6e\xf9\xff\xf9\xcb\x2d\xad\xdb\x49\xa2\xcb\xfb\xe6\xfd\x24\x0f\xac\x08\x7a\x00\xc2\xa4\xb4\x34\xd6\x52\x4d\xcb\x56\x21\x25\x96\x1b\xbb\x5a\x30\x17\x4b\x37\x65\x1c\x60\xe3\xa6\x1e\x80\x9c\x7a\xf0\x04\x54\x97\x74\x8c\xb6\xf7\x24\xb5\x2b\x34\x3f\x09\xfe\x43\xc9\xc8\xf0\x22\xc4\xd9\x33\xa5\xb9\x36\xf6\x74\xa7\x35\x1e\xc6\x91\xb1\x1d\x9d\xe5\xf4\xef\x52\x90\xcb\x37\x23\xf7\xd1\xe3\x27\x05\xcf\x56\x22\x41\xff\x5e\x2a\x66\xd9\x71\x17\x87\x01\xdf\xa7\xc9\xd9\xed\x7b\x72\x41\x0d\x45\x06\xef\x3c\xaf\x44\x45\xe1\x2d\x16\x8e\xb9\x48\xdd\x4f\x11\xe7\x7e\x6c\x26\x6b\x77\xef\x6a\x93\xbc\x14\x37\xfc\xf4\x71\xb8\x27\x66\x9c\x00\x8d\x9f\xbe\x97\x69\x67\x8e\xfc\x47\x0b\xc0\x73\xec\x4f\x72\x3b\x00\xb1\x77\xf6\x1e\x1c\x67\x62\xcf\xb3\xfb\xe7\xb7\xf6\xc6\xd9\x9a\x78\xb5\x62\x23\x1e\x5a\x1d\xe7\x7c\x13\xdd\xd3\x81\x76\x58\xd4\x80\x73\xe3\x18\xca\x38\x93\x63\xe2\xf0\x7d\xdf\xf3\xfd\xf4\x71\xb8\xc3\x74\x3f\x7d\x1c\x3e\xee\x54\x77\x12\xcf\x9a\xd2\x59\xc5\x83\xab\xe0\x8c\xa6\xd8\xd5\x5e\xe6\x1a\xec\x4b\xda\xda\x27\x9c\x56\x65\x84\xdc\x02\xa5\xc3\xcb\x2f\x05\x3a\x9f\x39\x25\xff\x68\x46\x21\xaa\x39\xc4\xda\xc1\xa6\xda\x5d\xd6\x96\xb2\xfb\xed\xb5\x37\x3a\xa0\x4f\xe4\x82\xa1\xc9\x32\x3d\xf5\x8e\x00\xa1\xc7\xea\x0e\xef\xc1\xfb\x32\x3d\x45\xba\x4a\xd0\x19\x33\x8d\xb0\xe9\x08\x55\x44\x22\xfc\x44\xe7\x94\x67\x74\xcc\x33\x6e\x16\x96\x43\x1f\x0f\x6a\x1e\xa6\x1a\xa6\xbc\xd7\xc3\xbc\xa3\x68\xb1\xa4\xa0\x22\x47\x76\xa4\x13\x50\x70\x1d\x0f\x2a\xa9\x62\xc6\x94\x0b\x49\x44\xd1\xa3\x26\x72\x68\x66\x00\xdb\x1a\x12\x47\x5b\x54\xd9\xce\xee\x01\xf0\xf6\x7c\x74\x65\x68\xb6\xcf\x4a\x86\x06\x3f\x8c\x5c\x46\xb7\xe7\xcc\xd3\x30\x7a\xaa\x15\x57\x03\xb4\xda\xda\xb2\x3d\x5f\xfb\x69\xe3\x14\x09\xa1\x69\x3b\x30\x41\x3b\x55\xe1\x98\xa0\x8f\xb6\xaf\xb9\x51\x22\x96\x8d\x1c\x29\x71\xc9\x93\x90\x6f\x5a\xdc\xfa\xa6\x45\xe2\x80\x2e\xe9\x16\xfc\xce\x77\x0d\xc0\x9a\x81\x5b\xc5\x76\xe4\x6a\x3d\x9b\x84\x15\xb3\x49\x17\x3b\xf5\x39\x2b\x66\x6f\x47\x75\xf5\x9c\x7d\x47\xde\x8e\x56\x9c\x4b\x00\x32\xac\x56\xa3\xd2\xee\x50\x93\x8c\x4f\x98\xe1\x5b\x96\xf0\x00\x27\x33\x97\x82\x1b\xa9\xd6\x47\x29\x93\x4e\xa7\xcd\x0f\xd7\x95\x1f\x56\x79\x3d\xde\xbb\x11\xd0\x01\x2e\x91\x59\xc6\x12\x9f\x83\x1a\x40\xea\x3f\xb1\xea\xf2\xc2\xdc\x9d\x3d\x64\xe8\xc7\x8b\xca\x09\x6e\xe8\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\xfd\xd9\x4c\xde\xf5\x8d\xec\x97\x9a\xf5\x79\x8b\xc4\x21\x4f\xe7\x46\x88\x4f\xd1\x2a\x8f\x55\x1d\xa4\x1f\x7c\x38\x23\xf9\xa4\xd1\x6d\x00\x54\x39\xde\x28\x24\xa5\xe9\x11\x45\x5d\xc8\x22\x75\x9a\xa0\x32\xcb\x10\xca\x46\x31\xd6\x8b\xaf\xd4\x1b\x63\x33\x3a\x2f\x68\x57\x25\x42\xb5\xa8\x87\x25\xd0\x8f\x8f\x5c\x5d\x68\xfd\x76\x21\x62\x13\xe4\x46\x61\x0c\xef\x7f\x01\xa6\x26\x23\xc1\x3f\x0b\xfc\x6d\x27\x52\x59\xac\x51\x75\x0c\x60\x26\x81\xc5\x9e\x94\x9a\xa9\x81\xe3\x18\x8f\x0e\xa8\x0e\xa9\x7b\x76\xc8\x98\xd6\x04\xd3\x47\x36\x41\x87\x64\x9f\xf1\xd6\x49\x51\xb4\x34\x33\x26\x8c\x4f\x17\xee\x80\xb1\x12\x6e\xce\xc3\xf9\xd1\x01\xd5\x32\x59\x50\xb7\xd4\x3e\x2f\xe9\x70\xba\xa0\xa1\x3d\x28\xf7\xa2\xdb\x21\x3a\x4a\xd1\x54\x82\x0b\x04\x66\x78\xab\x21\x18\x4d\x73\x2e\x9e\xe1\x41\x4c\xb8\x48\xb7\xad\xbf\x91\xc6\x0e\x7a\xd4\xe5\x28\x1c\xc5\x6b\xcf\x83\x25\x8e\xfa\x7b\x0d\x06\x94\x3b\x9b\x5c\xdd\x22\xd7\xea\xd0\xe5\x0b\xfd\x43\xd6\xc7\xaf\xf4\x8b\xb4\x82\xca\x8b\x79\x6d\xff\x0a\x9c\x47\x30\x9a\xed\x69\x7f\xc9\xbf\x9f\x40\x73\x6f\x48\x75\x91\x61\xee\xc5\x9b\xa1\xe2\x89\xf6\x41\x5b\x98\x1f\x0c\x4b\xa7\xb8\xbb\xab\x05\x41\x41\x15\xcd\x99\x61\x0a\x5d\xc7\x9c\x33\x9a\x70\x5e\xfd\x1f\x0a\x26\x46\x86\x26\xb7\xfb\x4e\x28\xfa\xc2\x4f\x1f\x8e\x9f\xee\x6a\x2d\xf3\x4e\x32\x69\xc0\x04\x97\x5e\x68\x11\x5b\x66\xb9\x70\xcc\xe6\x99\xd0\x95\x90\xd5\xab\x8b\x26\x22\x64\x75\xaa\x33\xd1\x2a\xcb\x17\x2a\x1f\xc0\x45\x2c\xa4\xa9\x03\xd7\x77\x84\xc2\x7e\x98\x5e\xfb\x43\xe0\xe4\x98\x5d\xec\x4e\x15\x3d\xc8\x65\xca\xc8\x98\x9b\xea\xa4\x6b\x66\x48\xc1\x54\xce\x5d\x00\xb4\x14\x58\x3f\x8f\xa5\xc8\xbd\x2c\xa7\x72\x9f\x8e\x38\x9b\x20\x32\x31\xbe\x40\x15\x19\x33\x73\xc7\x98\x20\xaf\x5e\xbd\x7a\x05\xf2\xc6\xab\x5f\xff\xfa\xd7\x04\x12\x2f\xa4\x2c\xe1\xf9\x72\x43\x68\xf5\x5f\xaf\x5f\x0f\xc8\x9f\xce\xde\xbf\x03\xff\xab\xc2\x68\x32\x96\x66\xe6\x46\xb6\x0d\x6a\x9d\x75\x8f\xfc\xcf\xe8\xc3\x95\x17\x13\x74\xe3\x57\xb8\x52\x84\xe5\xd5\x9d\xe9\x5e\xfd\xea\xeb\xaf\x07\xe4\x82\x2b\x88\xbc\xe5\x10\x2b\x10\xdc\x05\x0b\xef\x42\x27\xa4\x59\x8e\x75\x77\x6c\xc2\xb9\xd3\xe6\x7c\x3a\x33\x58\xe9\x08\x30\x25\xe3\x89\xc1\x5c\x7c\x78\xd8\x31\x33\x92\x76\xa1\x24\x2e\x30\xca\x39\x8e\xc0\xe4\x7a\x24\xe3\xb7\x8c\x4c\xf4\x1f\x94\x2c\x8b\x2a\x20\x50\x31\x6d\x65\x54\x57\xe7\x03\x07\xab\xf6\x4a\x33\xf3\xa4\x9e\x0c\x2d\x35\x35\x35\xa4\x1b\xd6\x04\x90\x5e\xc8\x46\xd6\x47\x4c\x28\x28\x0f\xce\x75\x60\x6e\xae\xe5\xc2\x0f\xb7\xc8\x34\x3a\xa7\x3e\xbe\xa3\x50\xf2\x7b\xdc\x24\x2e\x7c\xa4\x90\x93\x79\xb5\x93\xb9\x5c\x60\x26\xe8\x6c\x79\x3d\x72\xdd\xf2\x3d\x17\x15\x1f\xc5\x18\x0d\x27\x71\x30\x1a\x84\x6e\x73\x6d\x3f\x51\x4b\x15\xb9\xe2\xcb\x71\x69\x41\x33\xd3\xb8\xa3\xa5\x58\xea\xed\x2a\x8f\x38\x4a\xe3\xea\xc7\xb8\x30\xaf\x6a\x0c\x74\x57\x75\x41\x32\x51\x4d\xa2\x5a\xfa\xb6\x9a\x93\x8c\x66\xa6\x74\xa0\x01\x5f\x25\xfb\x6d\xa6\xb5\x8b\xb5\xc9\xa9\xba\xb5\x62\xbf\x3b\xff\x03\xf0\x0c\xd6\x21\xce\x07\x83\xae\xe6\x2c\x14\x98\x8b\x3d\xeb\xed\x47\x0e\x07\x83\x43\x3c\x20\x52\x61\xf6\x4b\xc4\x76\xfb\xfe\x89\x62\x8a\xeb\x9e\xdb\xb4\x88\xca\xc7\xb9\x42\x1f\xb4\xe6\x11\x4c\x1d\xa4\xda\xe4\xbc\xed\x24\xbe\x74\xcb\x1e\xdc\x36\x7f\x30\xb6\x2c\xda\x14\x31\xe8\x2a\x41\x75\x48\x37\xbc\xbe\x8a\x8a\x3b\x02\xed\x32\x08\x77\xce\x88\x4b\xd0\x2b\x62\x97\x39\x76\x65\x72\x2e\x88\xad\x56\xed\xea\xf9\x73\xb5\xe1\x04\xc3\x3f\xea\xb4\xca\xd1\x82\x48\x42\xa8\x6a\x4b\x55\xb1\x20\xcf\x9a\x79\xc5\xe8\xd2\x2d\x37\x7b\x17\x46\x86\x4f\x3b\x23\x01\x3e\x4b\xe7\x20\xd0\xcc\xa2\x56\xfb\x22\x43\x05\x00\xc8\x8d\xfe\xb0\x0c\xc8\x7b\x47\x53\x11\xb9\xe8\x58\xcb\xac\x34\xd8\xb5\xfa\x31\x26\xb8\x30\xa8\x4f\x39\x00\x54\x36\x34\x8b\xc8\x2f\x30\x1e\xa4\x79\xed\x28\x31\x3e\x1d\x0e\xe3\x4b\x22\xcc\x27\x4b\x32\x5b\xe5\xef\xd6\x0f\x96\x70\x36\xd1\xbc\xcb\x55\x69\x34\x24\x47\x55\xe1\x0c\x6f\xe6\x1e\x0a\xc3\xd4\x84\x26\xec\x38\xbe\x42\x85\x02\x25\xc1\xb3\xc6\xc7\x06\xcc\xa8\x48\x33\x14\xad\x13\xa6\x00\xe5\xd9\x17\x57\xe8\xd6\x7e\x22\x55\x1c\x0a\xb8\x1e\xbd\x61\x56\x1e\x64\xd4\x94\x8a\xb5\x8a\x30\xda\xaf\x5b\x21\x4c\x63\x5f\x97\x36\x18\xac\xab\x4b\x05\x74\xf2\x12\xaa\x88\x8e\x55\x05\x26\x84\x2a\x82\x54\xc7\xd7\xd2\x81\x45\x25\xa0\xc7\x40\x2a\x16\xb2\x54\x4e\xef\xed\x33\x8d\x26\x52\xd9\x8b\x10\x0e\x4c\x35\x51\x6c\x6a\xa5\x55\x05\x62\x2d\xb6\xc8\x4a\xfb\x62\xaf\xce\x5f\x7b\x76\x92\xdb\xe4\xe2\x36\x71\xe2\xb3\x9c\xf3\xd4\xb3\x48\xb0\x2d\x55\x05\xff\x0a\xaa\xa3\xb8\x93\x28\x39\x7b\x04\x61\x14\xc6\x81\x91\x86\x88\xce\x9a\xff\x74\xac\xdd\x95\x90\xe8\xa1\x45\x65\x85\x2e\x44\x58\xa6\xec\xba\x1c\x67\x5c\xcf\x46\x3b\xaa\x02\xaf\x56\x0c\x81\x0e\x03\x4b\x86\xba\xb5\xea\x41\xcd\x84\xe6\xc0\xf2\x2c\x19\xb7\xcc\x16\xea\xfe\x4a\x00\xa2\xef\x1d\x63\xa6\x84\xc0\x88\x8c\xb9\x70\x7e\xfb\x53\x34\x0f\x17\xa1\x85\x09\x3c\x52\xf6\x49\x14\xb5\xf7\x09\xcd\x32\xdd\x8c\x5e\xf5\x84\x16\x65\x0e\x1f\xb5\x85\x7b\xca\xed\x76\x87\xa2\x21\x8d\x8c\x90\x6b\x17\xa6\x49\x2e\x31\xc2\x45\x10\x29\x7c\x23\xc8\x43\xe2\x3b\x44\x51\x7d\x10\xbb\x0b\x28\xb3\xe7\xaa\x8a\x2f\x3a\xd0\x87\xd3\x81\xee\x68\x69\xa8\xea\x2a\xd1\x28\x22\xb8\x5e\xa6\xd9\x93\x52\x4f\x72\xb7\x98\x24\xf6\x6a\x15\xc0\x6f\x9e\x19\x2c\x2d\xde\x39\xe7\xd9\xe7\x46\x77\x60\xd3\xf6\xde\x01\x87\xb7\xef\x6e\x16\x49\x84\x99\xee\x42\x10\x8e\xc0\xf2\x91\xaf\x78\x0e\xb0\x1b\x7c\x79\xa8\x49\x2a\x93\x32\xa4\x48\x05\xa0\x55\x06\xb0\x36\x19\x04\x49\xd7\xe3\xd4\x3d\xad\x55\xfc\x91\xad\x58\x95\xca\x3b\x71\x47\x55\x7a\x76\xbd\xc5\x2f\xbd\xce\xce\xab\x5e\xb1\xa0\xe4\x07\x83\xba\x78\x74\x2c\x4b\x53\xa5\xcf\xfc\x69\xab\x9e\x8d\xb4\x14\xa1\xa5\xa6\x99\xbc\x28\xaf\x5f\x94\xd7\xcd\xe7\xc1\x95\xd7\xb6\x4f\x3d\x17\x6c\xed\xb8\xfa\x14\x03\x3c\x6b\xeb\x4a\xfb\x90\x5a\xd0\x88\xc0\x20\x75\x6f\xfa\xc1\x37\xe4\x36\x3c\x22\xd5\xde\x46\xb2\x9e\xa7\x40\xc0\xaa\x9f\x5e\x63\xfa\x40\x7a\xd0\xf6\x95\x7b\xf1\x59\xe7\x82\xbb\xa9\x92\x2f\x48\x0d\x51\xe9\xdd\x9e\xcb\x84\xdc\x73\xf7\x2e\x91\x56\x45\xed\x30\x11\x73\x87\xc2\x9d\xf8\x74\x04\x3e\xe9\xbc\x01\xa4\x63\x59\x5d\x7c\xba\xee\x06\xd9\xa1\xc4\x2e\x3e\x4f\x5c\x68\x17\x9f\xce\x2a\x6e\xd2\xbd\xe8\xee\x8a\xe5\x3e\x6c\xe9\xdd\x1d\x97\xf6\xf8\xda\xfb\x5e\x55\xf0\xed\xf9\xb3\xf5\x17\xed\xfd\xd2\xf3\x88\xda\xfb\x88\x70\x7b\x62\xe0\x00\x10\x6b\xf4\x63\x75\x9b\x57\xeb\x8f\x99\x17\x2b\x07\x55\x06\x32\x8b\x72\x5e\xa1\x2f\x55\xdd\x6c\x7a\x38\x18\x1c\x1e\x7a\x35\xbf\xc3\xcf\xd2\x4c\xfa\xbf\x21\x4c\x24\x32\xc5\x4d\xb5\xe3\x2b\x6d\x80\xe9\x57\xb7\xf3\x78\x2e\xb9\xff\x56\x6c\x7a\x85\xb1\xbb\x6d\x49\x87\x13\xdc\xbd\x90\xf6\x2a\x48\x3f\x46\x39\xed\xb8\x68\x76\xbd\x46\x36\xb6\xb8\x4f\x61\xec\x18\x78\x0f\xce\x5f\x5b\x97\xca\xc6\x67\x17\xf6\xba\x43\xd9\x6c\x7c\x1e\xb9\x78\x36\x3e\x3b\x71\xd4\x4e\x85\xb4\x57\x2c\xee\xf1\xca\x69\xe3\xf3\x4c\x8b\xa9\xd4\x9f\x4e\xa5\xb5\xf1\xd9\xad\xc0\x76\xbd\x6f\xc7\xad\xdf\x4b\xb1\x6d\x7c\xba\x95\xdc\xc6\x67\xdf\x85\xb7\xf1\x69\x09\x09\xd0\x81\x5f\xf0\x4e\xc1\x03\x97\xae\x4f\xdd\xf3\xd1\xb0\xbc\x90\x8a\xaa\x05\x49\x9d\xae\x61\xb1\x22\x00\x33\x8a\xc0\xbc\x77\x56\x14\x98\x7b\xca\xd5\x9e\xe2\x07\x3a\x04\x5f\xb2\x94\x97\x6b\x0b\x18\xaf\x03\xdb\xb7\x90\x0d\xcb\x65\xd2\xf2\xc6\x4d\x1c\x2a\xa4\x12\xa4\xc9\xad\xab\x91\xe3\x61\x88\x9c\x3e\x4e\xb9\x73\xd0\xc8\x7c\x0c\xca\x30\xb0\xf4\xb9\xca\x80\xbe\x31\x8e\x5d\x53\x5c\xa1\xc9\xc3\xd9\xfe\x8f\x5c\xc3\x63\x2b\x7f\xbc\x07\xa6\xf7\x48\x7b\x42\x3a\x06\x99\xf1\xbf\x33\xa8\xb3\xd5\x39\x85\x95\x04\xb1\x3b\xd4\xff\xca\x64\x12\x19\x96\x6b\xec\x07\xa0\x1e\x30\xdb\x2b\xe6\x2d\xec\xed\xd7\x51\x78\x00\x8d\x4e\xa6\xd1\x56\xc7\x13\xc8\xdd\x08\x22\x3a\xc0\x2e\xc0\xfb\x26\x2a\x8a\x57\x6a\xfb\x25\x48\xad\x1e\xb5\xa9\x3e\x74\xe7\x53\x48\x9a\xa8\x60\x59\xfd\x62\x61\x7f\x19\x79\x08\x44\x97\x32\x08\x4f\xf0\x52\xb8\x2e\x41\x06\x74\x5f\x71\xb2\x90\x9c\x80\x3d\x2a\x70\x6f\x1d\xb2\x17\x2e\x61\x95\xe0\x59\x1d\xad\x7c\xea\xb6\xb0\xf0\x52\x38\x2f\x82\x25\x1c\x59\x8d\x22\xa5\x66\xaa\x3f\x2d\x79\xba\x0b\x72\x3c\x63\xee\xd6\x9a\xa7\x75\xe7\x64\x1d\xf9\xd7\x3d\xb8\x56\xf0\xb2\xe8\x40\xf7\x0f\x2e\x83\x6b\x46\x8d\xf0\xc7\x29\xe1\xea\x6e\x1a\xd4\x7b\x02\x84\x23\xe7\x4c\xbc\x47\x67\x59\x31\x8b\x7c\x34\x00\x1b\x43\xba\x52\xcb\x20\x92\x45\xe2\xc2\x66\x79\x2d\xbf\x23\x7e\x06\x31\x11\xbc\x54\xfb\xf6\x3f\xfe\xbe\xeb\x95\xf7\x63\x36\x91\x55\x49\x10\xbc\xfe\x38\xdf\xda\x94\x65\x0c\xaa\xa8\xfb\x0a\xed\xb6\x01\x98\x7d\x73\x39\xb7\xc8\xfd\x67\x41\x3e\xf9\x24\xf5\x7c\x72\x4a\xe8\x71\x2d\x74\xc1\x95\x59\x11\x8c\xa5\xe8\x70\x9b\x55\xdf\x51\xa5\xd0\x3d\x32\x3e\xf6\x0b\x83\x13\x28\xac\x0c\x98\x79\xf1\x16\x2f\xd1\x8a\x59\x80\x40\x00\xb0\x92\x39\xd1\x82\x16\x7a\x26\xa1\xf6\x7e\x42\x0b\x9a\x70\xb3\xb0\xe0\x37\x8a\x26\xb7\x50\x96\x47\x31\xf7\xc5\x1e\x49\x8e\x9d\xff\x56\x0d\xa2\x35\x37\x60\x33\x53\xb2\x9c\xce\xc0\xb3\x15\x5b\x25\x19\xd5\x1e\x00\x2b\xfb\xbb\xdb\x8d\x26\xe9\x42\xd0\x9c\x27\x21\x89\x9e\x92\x73\xae\xb9\x74\xda\x5d\x1c\xd7\x9e\x02\x72\x1d\xf2\xa0\xa1\xd2\xf8\x3c\xa3\x3c\x27\x47\x9a\x31\x12\x10\x05\x7f\x71\xb5\xdc\x51\x99\xa1\x98\xed\x1e\x6b\x94\x65\x48\xe6\x2d\x5c\x06\x82\x8a\xf2\x05\x93\x15\x32\x4e\x38\x7e\xe9\xea\x4f\x1f\x87\xad\x5b\x3d\x33\xa9\xc0\x50\xef\xb3\x58\x32\x91\xca\xc8\x5c\x79\x76\x3d\xd4\xf1\x35\x04\xf1\xcc\xe5\x7a\x83\x1f\x32\x29\xa6\x71\x08\x7f\x85\xa5\x96\xcc\x0a\xa8\x6d\x32\xe7\x69\x49\x33\x24\xb0\x6e\x32\xe7\xa3\x21\x76\xe7\xd3\x99\xe9\xdf\x31\x50\xc3\x20\x1f\xaa\x5c\x9d\xfc\x47\xf9\x92\x9b\x0e\xd7\x40\x90\x8d\x53\x23\xa0\x4a\xcb\x4e\xed\x8e\x2e\x20\xdf\x8b\x73\x29\xa9\x59\x4a\x7d\xae\x2d\x1c\x22\xc0\x3d\x02\x3a\x4c\xef\x2c\xd4\xaa\xb0\x12\x04\xe8\xa9\x2c\x94\x01\x6b\x97\xe7\x66\x01\x1f\xe5\xbe\x0b\xaf\x5d\x59\x32\x6a\xf7\xc8\x4a\x75\x9b\x2f\x31\x0f\x20\x8d\xfd\xa4\xed\xf4\x80\xbb\x37\xae\x1c\x62\xc7\x15\x1e\x7c\x1b\xa9\x01\x23\xc3\x8d\x25\x0b\x54\xa4\x7d\x9a\xd9\x03\x71\xfd\xf9\xdc\x39\x66\xe3\x41\xaf\x2d\xd8\x57\x36\xe2\x22\xa4\xc2\xb6\x62\xd2\xca\xf3\x0d\x11\xf8\x63\x96\x02\x5d\x8c\x8b\x40\xde\xd9\x1b\xbf\xc3\xc9\xeb\xcf\xe7\x3d\xc2\x07\x6c\xe0\xff\x0a\x4d\x3d\x61\x36\x72\x8a\x6e\x8d\xc1\x55\x15\x8e\x13\x4c\x25\x56\xae\xc5\x7d\xff\xf6\x5b\x3b\x49\xfb\xeb\xef\xfa\xbf\x8d\x92\x8b\xfe\xee\x6f\x96\xce\x2b\xdb\xa0\xfe\x36\xf6\x8d\x0b\x99\xf4\xff\x76\xed\x32\x4d\xbb\x3c\xd4\x7f\x73\x05\xb6\x98\x30\x56\x32\xbe\x96\xe0\x75\xc0\x53\xc4\x0d\xf8\xb6\x62\xdf\x7b\x45\x29\x80\x29\x28\xa9\x12\x6a\x98\x00\x5e\xe4\x83\x48\x84\x34\xd8\xdd\x95\x94\xb5\xf3\x3f\x02\x15\x07\xc6\xbb\xf5\x88\x91\x12\xa8\x0c\x52\xb2\x33\x41\x98\xaf\xbf\x89\x6b\x05\x70\x50\xe7\x78\xe7\xd9\xad\x1d\xd6\x42\x38\x84\x04\xdb\x79\xc0\xdc\x7e\x21\xa4\xf9\x45\xd8\xfe\x46\x9d\x70\x3a\x97\xdc\x27\x15\xb7\x04\x40\x60\x95\xc6\x90\xe6\x7a\xbc\x20\x39\xd7\x86\xde\xb2\x01\x19\x59\xf6\x19\x5b\xf7\x10\x7a\x82\x40\x32\x4a\x96\x92\x52\x18\x9e\xc1\xaf\xd5\x38\x76\xca\x31\x5b\x1d\x4e\x88\x2e\xa1\x80\x79\xa1\x58\xdf\x33\x6a\xd7\x6a\x89\xc4\x55\x6b\xe9\x85\xcd\x9e\x51\xbc\xed\x14\x29\x74\x05\x78\x50\xe1\xd0\x6b\xc9\x1d\xcd\xce\x53\x8a\xa4\x62\xce\x00\x4c\x3d\x20\x57\xc0\x8f\x33\x6f\xe2\xc6\x8b\x97\x53\xc8\x0a\x96\x30\xad\xa9\x5a\xf4\x20\x59\x3b\x0f\x09\xbe\x9d\x07\x12\x08\x0d\x39\x15\x98\x2a\x5d\xb1\x44\x0a\x6d\x54\x99\x18\xac\x9d\x37\x56\xf2\x96\x89\xe0\xfe\x68\x77\xb1\xee\x87\x56\xd1\x19\xb0\xdf\x49\x92\xcc\xa8\x98\x46\xb5\x67\x72\x9a\x02\xec\xbf\x09\x82\x9d\x5f\x8f\x85\x00\x9d\x58\x59\x8a\x1b\x00\xc5\xd8\x72\xc8\xa0\x56\xfe\xb3\x20\x5e\x73\xd0\xab\xf4\xbe\x76\x49\x3c\xdb\x42\x92\x49\x57\x55\x65\x17\x25\x65\x1f\xc4\x92\x3d\xfb\xb1\xe5\xcc\xd0\x94\x1a\xba\x83\x2f\xdb\xfb\xaa\x60\x9e\xaf\xa0\x8f\x45\x4b\x83\xa1\xd5\xb1\x57\x2f\x51\xca\x82\xc7\xf1\x5a\x70\x12\x67\x1e\xf2\x10\x00\x6e\x2c\x4e\x39\xc3\x07\xba\xa8\x81\xbc\xe6\x2b\x92\xd9\xe1\xfd\x68\x48\x2e\xaa\x72\x8b\x15\x39\x69\x67\x56\xeb\xa8\x51\xb6\xa0\xdf\x01\x46\x37\x95\xed\x2f\xa9\xf3\xc1\x95\x92\x15\x72\x09\x26\x0c\x57\x2c\x0e\x8f\x73\xa0\x2b\x05\x22\x79\x03\x88\x00\xe5\x29\x33\xba\xf2\xb8\x41\x3a\x6c\x89\x8b\xe3\x77\xee\xfe\x0d\x44\xda\x01\xd6\x5d\x61\x57\x8b\x78\x08\x76\x2d\x1d\x9d\xb5\x94\xff\x41\xe0\xba\x8b\x12\x1d\x4b\x04\xbc\x97\x69\x17\xbd\x7b\x23\xb3\x7e\x35\x44\xe5\x86\x8a\x0e\xc5\x1a\xf4\x18\xf8\x0d\xb0\xbe\xe9\x5a\x90\x1f\x12\xb9\x19\x9d\xef\xae\x74\xab\x44\xbf\x7e\xc8\x4a\x0c\x9f\xeb\xc3\xe7\xfa\xaf\xdb\x2b\x27\xbb\x78\xb4\xf8\xa7\xb5\x67\x4b\xfd\x23\x9d\x34\xc1\x96\xa4\x8c\x3a\xaa\x6f\x9b\x29\xd3\x03\xb5\x77\xf6\xd0\x60\x83\x76\x31\x1b\x8c\x5b\x3a\x71\x4a\x7e\x51\xe3\xef\x4e\x8e\x0a\xd7\x40\x74\x35\x3e\xf2\xf7\xc2\x81\xdb\x04\x1f\x11\x5f\x6f\x7e\xdc\x18\x0c\x04\x8b\xd5\x57\xa4\x46\xcb\xa4\xd4\x46\xe6\xcd\x2a\x0c\xbe\x30\xbd\xc6\x9c\xa5\xce\x81\x10\xca\xbc\xc1\xb5\xfd\x18\xeb\xd7\xa6\xe8\xaa\x6d\xaf\x0e\x4b\xe3\xc0\x2d\xa2\x3e\x5a\x73\x30\xe4\xeb\x67\x62\x81\xf3\xbb\x08\xb0\xf7\x97\x67\x32\xb5\xb2\x6a\xa8\x5e\x2b\xe8\x38\x8b\x9c\xb2\x83\xb8\x6a\x45\x4b\x05\xaa\x4d\x1f\x0b\x62\x8f\x86\x92\x59\xc6\x14\x6c\x82\xbb\xd9\x36\x3c\x1a\x60\x36\x38\xdd\x5e\xd0\x20\x04\xf9\x58\xb0\xbb\x20\x08\x51\x8d\x89\x6f\xbc\xf5\x91\xb9\x42\x7e\x6b\xc7\x6b\x6d\x1f\xdc\xc9\x42\xb8\x8b\x8d\x10\x82\x47\xb9\x68\xe3\x90\x55\x75\xd8\x58\x4a\xa4\xf9\xec\x62\x54\x04\xaf\x1d\x70\x26\xe8\x66\x21\xaa\xe7\x6d\xbd\x1e\xc2\x10\x5e\xa2\x9f\xc2\x1f\x9e\x5f\x05\x8c\x1c\x33\x8b\xef\x55\x58\x38\xe0\x51\xdc\x77\x85\x5f\x45\xb5\xb9\xdf\x40\x6e\x57\x87\x89\xa1\xf6\x98\x62\xe0\x17\x03\x5f\x1c\x40\xed\x02\x2a\x16\x4e\x0e\x30\x33\xae\xd2\x7e\x41\x95\x59\xe0\x69\xe8\xd5\xbe\x16\x62\x0c\x3a\x2d\x7c\x47\xe3\x56\xbb\xb4\xc9\x6b\x21\x0c\x8b\xf7\xf5\x03\x9d\xf5\x62\x2d\x5c\x1f\x63\x3d\xed\xa3\x18\x56\xae\xe7\x2a\x0a\xea\xf7\xf7\xc9\x27\x5b\x4f\x30\x05\xef\xca\x71\x3e\x06\xff\x87\x46\xc1\x4e\x6f\x4b\xa8\x1c\x24\x1e\x5e\x20\x08\xdf\x7a\x60\x0a\xb8\x1b\xb5\x41\xa3\xc8\x3d\x30\xe7\xf0\x1d\x9a\x55\xaa\xda\x8d\x26\xb2\xf4\x54\x56\xa6\x44\xe6\x45\x69\x58\x04\x7a\x77\x17\xe8\x0c\xeb\x9a\x36\xea\x04\xf3\x85\xf7\xdd\xf0\xfd\x30\x7c\x3f\x18\x78\x5a\xe4\x0e\x8d\x9f\x9d\x80\x4f\xee\x11\x27\x11\x3f\xcf\xd8\xc4\xd3\x58\x6c\x77\x27\x06\x72\x4f\x47\x06\x72\x1f\x67\x06\xb2\x4f\x87\x06\x12\xdc\xa2\xee\x73\x70\x3e\x7a\x87\xac\xc6\xd1\x71\x34\x6a\xd3\xd1\xa9\x85\xe3\x85\x71\xb8\xf6\x25\x69\x9c\x36\x2d\x1c\x01\x90\xe6\x62\xb7\x1a\x77\x68\x41\x35\x87\x2a\x33\xf6\x25\x24\xbf\x8b\x58\x7e\x54\x9f\x18\x0a\xf7\x07\xc9\x15\x0e\x5f\xdf\x19\x3f\x7d\xc2\x97\x97\x83\x1c\x9e\x97\x83\xdc\xae\xff\x53\x1e\x64\xf4\x1f\xea\xe2\xde\x56\x97\xb2\x51\x57\x46\x7e\x28\x99\x5a\x10\x39\x67\x91\x9d\x0c\x92\xfd\x69\x9e\x3a\x4b\xd3\x98\x8b\x74\x6b\xb5\xe7\xf8\x79\x44\x09\x00\x4a\xc7\x5e\x7e\xb1\x72\x12\x78\x82\xdf\x83\xa4\x35\x87\xaa\x07\xfb\x20\xb4\x3c\xd0\x3d\x0d\x83\x4b\xf5\xc0\x65\x01\xa9\xde\x80\xda\xea\xec\xea\x62\xb7\xeb\x40\x37\x35\x0a\xd9\x45\x95\xb2\xb4\xf8\xb3\x0d\x0b\x44\x40\x84\x5f\xea\x75\x0e\xbc\xd3\x3b\xa4\xae\xea\x39\xcd\x6b\x55\x67\x1c\x1a\xa3\x01\xa1\x9e\x74\xab\x6d\xb0\xe7\x2a\x00\xed\x40\x15\x77\xbb\x63\xe3\xd3\x3e\x4d\x53\xbd\x97\x07\x42\x57\xe2\xbb\x33\xd9\xee\x94\xce\x29\x7e\x6a\xa8\xe0\x52\x90\x81\x41\x1c\x70\x02\x52\xd7\x78\xe7\xa1\x80\x06\xe0\x30\x85\xd5\xe5\x77\xf8\xe2\x3d\xe8\x27\x09\x80\xbd\xf7\x52\x03\x9a\xd6\xbc\x5f\x6e\xd9\xe2\x50\x3b\xbf\x7b\x29\xf4\x8c\x17\x3e\x5b\x2a\x50\x02\x87\xb9\xe4\x33\x68\xa4\xfd\x10\x78\xe6\x87\xa2\x47\xae\xa4\xb1\xff\xc3\xf2\xfa\x80\xeb\x17\x92\xe9\x2b\x69\xe0\xcd\xa3\x03\x0b\xa7\x7b\x6f\x50\xb9\xf0\x15\x0e\x25\x74\xd0\x88\x0a\x3e\x8f\xde\xe8\x01\x20\x71\x9a\xbc\x00\x56\xae\x51\xb1\xe8\x61\x12\xd2\xeb\x69\x37\x84\xd7\xc0\x08\x29\xfa\x2e\xd7\xfb\x8a\x31\x1c\x28\xa5\xaa\x41\x72\xc3\x70\x6e\x28\xd0\xdd\xe2\x2f\xa0\xa1\x29\x32\x9a\x54\x96\x1a\x48\x12\x47\x0d\x9b\xf2\x84\xe4\x4c\x4d\x21\xc2\x22\x99\xed\xbe\x41\xdd\xe9\x36\x3e\x3b\x51\xef\xf8\xc3\x9d\x31\x03\x58\xdd\x3b\xb0\x95\xdd\x97\x61\xe2\x28\xc8\x22\x72\x5a\x58\xa4\xf8\x87\xe5\x04\xb0\x2f\xff\x82\xa4\x8e\x7a\x40\xce\x7c\xa5\xad\xf8\x37\xa7\x76\x8b\x87\xb1\x23\x58\x71\xfe\x87\x92\xcf\x69\xc6\xd0\x82\x4c\x45\xc8\x7f\x25\x27\x4b\x6c\xba\xe7\x32\x3b\x5a\x2a\x15\xac\xb2\x07\xb7\x6c\x71\xd0\x5b\x42\xa4\x83\xa1\x38\xa8\xc2\x9c\x6a\xa8\x13\x18\x1a\xd8\x72\x0f\xe0\xb7\x83\x7d\x73\xf6\x27\x12\xe7\x77\xc0\x12\xa7\x12\x3a\xcf\xa8\xd6\xdd\x22\x44\xd6\xe7\x19\x19\x45\x63\x56\x9e\xba\xce\x2f\x20\x41\xbb\xe3\xfe\x34\x57\xe0\x1f\xd7\xdd\x86\xd5\x09\x4a\x73\x97\x26\xbc\x7d\x88\x63\x93\xaa\x86\x01\x82\x03\xe4\x5d\xec\x53\x5e\xb9\x28\xae\x81\xd7\x67\xf0\x2b\x96\x93\x38\x2f\x12\xd7\x70\xd3\xe5\xde\x25\x52\x48\x43\xb8\x48\xb2\x32\xc5\x7c\x4e\xd0\x15\xee\xc9\x5d\x45\xfa\x1d\x80\x73\x0f\xe4\xf9\x1c\x06\xf0\xf2\x88\xbb\x89\x2c\xbb\x86\x34\x6d\x63\xe0\x76\x8f\xfe\x2d\x5c\x3b\x58\xed\x7b\xad\x93\x2d\x86\xf8\x7a\xda\xaa\xf3\xba\x8c\xf1\x96\x8f\x15\x23\xe7\x33\x2a\x04\xcb\xda\x16\x4d\xef\x50\x33\xfd\xb1\x3d\xf6\x9e\x63\xc1\x84\xbd\x55\xbc\x7c\xce\xb5\xc0\xb3\xb2\x73\x15\xf0\x2a\xb0\xfa\xed\x39\x31\x54\x4d\x99\xb1\xc3\x10\x51\xe6\x63\xd6\x3a\xcc\xe3\x39\xd5\xc7\x7e\xac\x4a\x10\xfb\x2d\xe6\x80\xa0\xff\xf6\xdb\xab\xce\x25\xdf\x56\xed\xe0\x9d\x54\x59\x7a\xc7\x53\x34\x81\x69\x72\x64\x07\x3e\x7e\xfe\xf5\xd9\xee\xee\x78\x7a\x3f\x00\x38\x26\x09\x00\x20\x00\x01\x57\xa1\x80\x43\xee\x48\xf8\xc0\x31\xb9\xe4\xe8\x82\x6a\xff\xc2\xe8\xec\x7c\xcc\x45\xe5\x5d\x1d\x36\x03\xe8\xaa\x3d\x0f\xfe\x36\xa1\x99\x41\xe7\x41\xf0\xbf\x93\x66\x46\x34\xcf\xcb\xcc\x50\xc1\x64\xa9\xb3\x45\x6b\xb4\x78\x1a\x20\x4f\x32\xf6\x05\xb1\xb8\x0b\xbf\x0a\x9d\xea\x7c\x6b\xca\x04\x53\x55\x2c\xc1\x12\xe3\xaa\x9c\x38\xd2\x93\xc0\xc4\x82\x4f\x2a\xfb\xc2\x12\xe7\x7e\x51\x64\xe5\x94\x6f\xf1\x91\xfb\x37\x4b\xe5\x59\x25\x4b\x2c\x35\xab\x22\xd8\xda\x26\x2b\xff\x89\x96\xa7\xbe\x59\x9d\x5e\x33\x65\x05\x13\x29\x64\xfe\x88\x70\x15\xa7\xbb\x57\x58\xb9\x2c\x1a\xbb\x53\xa8\xcb\x2f\x46\x51\x4b\x6e\x72\x4b\x58\x7c\x52\x0e\x3e\x21\x54\xb4\x27\x1d\xcf\x23\xdb\x1d\xf9\xb7\xe3\xd1\x0f\x5e\x0c\xf1\x7e\x39\x56\x91\x8a\x3a\xb4\xf7\x39\x52\xd7\xe7\x42\x75\x5f\x89\x23\xcb\xee\x9b\x13\x55\xaf\x48\x03\xd9\x98\xd5\x4b\x91\xa8\x1f\x45\x82\xd4\x09\x84\x7e\x74\x49\x1b\xf0\x16\x7b\x34\x6e\xb6\xee\x65\xb3\xe8\xe0\x86\x9b\xac\xc3\xdb\x88\xa4\x43\x8e\x2e\x37\x90\x73\xfe\x24\xda\x15\x6b\x77\x0e\x5d\xa5\x10\xdb\x88\xd5\x43\xe4\xbd\xa4\x86\xea\x9d\x2a\x86\xc7\x08\xe5\x46\xc1\x44\xab\x50\x5f\xd8\xc7\x3f\x90\xfe\xef\x9c\x4c\x20\x6a\x2d\xad\x34\xe0\x01\xe2\x33\x0b\xb0\x60\xa6\xc5\x31\x52\xbb\x0d\x09\x35\xad\xb3\xc2\xb7\xa2\xf7\x6e\x06\x9f\x3e\x75\x2e\x1d\x66\xbb\x34\x56\xec\x76\x1a\x62\xcf\xf9\x0f\x65\x2c\xa9\x43\xcc\x65\x58\xa3\x6b\xbf\xaf\x85\x4c\x13\x56\xa9\x88\x2e\xb8\xbe\xed\x92\x1c\xe3\x0f\xe7\x97\xf5\xce\x75\x84\xff\xc3\xf9\x25\x71\x6f\x5b\x69\x71\xba\xa8\x71\xee\x9b\xbb\x61\x9a\xb0\x4a\x35\x9a\x72\x7d\xfb\xe8\x85\x39\x8b\x74\x6b\x75\xf9\xc7\xd6\x32\xf9\x78\xe1\x28\xc8\x7d\x21\x4b\x72\xe7\x02\xd6\x9c\x50\x7b\xc3\x8b\x53\x72\x29\x74\xa9\x58\x65\xfd\x6c\xca\xb7\x96\x93\x3e\xa7\x02\x9e\xf7\xc2\x8d\xe7\xac\xe6\x2a\xa8\x32\x20\xd9\x76\xce\x17\x02\x29\x71\x5d\x67\xbf\x84\x2d\x5b\x3f\x9c\x78\x57\xb4\x1e\x31\xf5\xa4\x1a\xbe\x91\xdd\xec\x28\xfe\x34\xde\xde\xb7\x21\xe4\x9c\x9c\xa4\x6c\x7e\xa2\x53\xfa\xba\x07\x9f\xf1\x11\x23\xa6\x36\x27\xaa\xc9\xc1\xeb\x83\x01\x19\xf1\x9c\x67\x54\x65\x8b\x5a\x0e\xc0\xaa\x9d\x65\x01\x7e\x40\x30\x66\xbd\x3a\x20\x47\x52\xc1\xc8\x09\x15\x24\x63\x74\xce\x7c\x24\x85\x3d\x50\x0b\x14\x01\x8f\x1f\x9b\x8a\x90\x07\xd5\x11\x22\x41\xe9\x8a\x06\x9f\x90\xdd\xd4\xa2\x8d\x2f\x2a\x8a\xcd\x85\x25\xe3\x03\x2c\xf7\xdf\x2c\x71\x09\x67\xc3\xb7\x78\x2a\x50\x3e\xe8\xdd\xec\x9e\xf5\x71\x97\x2e\x74\x4f\x07\xa6\xed\xb7\xba\x29\x37\x1f\x59\x21\x3b\x09\x00\xd8\xa5\xa1\x09\xe3\xc6\xbe\x90\x9a\x43\x5e\x2c\x6a\xa0\xca\x9c\x32\x3c\x29\x33\x6a\x65\x62\xd4\x83\x0d\xc8\xc5\xe5\xf5\xc7\xcb\xf3\xb3\x9b\xcb\x8b\x53\xe2\x47\xe2\xb1\xb4\x36\x20\x37\x71\xb0\x7e\xe4\xf9\xea\x22\xa2\xc3\xb7\x7a\x8e\xf8\x50\x51\xa5\x1b\x82\x10\x4c\x2a\xc8\x50\x70\x53\x65\xe3\x43\x27\xad\x4c\x0a\xe7\x76\x65\x7b\x3b\x3d\xdc\x94\xa3\xeb\x84\x70\x83\xd9\x9f\xeb\xa3\xc1\xe9\xc0\xcc\x5e\x61\x2a\x5b\x6e\x71\x0f\x20\x39\x54\xc0\xdd\x97\xec\xee\x13\x70\x75\x3c\x1e\x37\xa8\x60\xaf\x72\xa0\x21\xc5\x0f\x69\x3f\x7d\xf0\xf1\x8a\x82\x88\xc4\xf2\x92\xc3\xc1\xa1\x17\x14\xb2\xa5\x14\xaf\x61\xd0\x38\xbf\x42\x1d\xb7\x06\x84\x7c\xf0\x9e\xcc\x3d\x2b\x05\xac\xce\x16\x8b\xf1\x6e\x51\xce\xd1\x06\x86\xfa\x14\xc0\xe5\x38\xfe\xa8\x4b\xc8\x30\xe5\x73\x26\x70\x61\xfb\x25\x48\xfe\xf3\x1d\x61\xfe\xb1\x9a\xf7\xa7\x8f\xef\xf6\x3b\x25\x3c\x67\x1d\x27\x74\x2e\xf3\x1c\xc3\xf4\x67\x21\x16\xad\x0a\x27\x0b\xa7\x7d\x6f\x17\x16\x4c\x38\x30\xd9\x82\xd4\x0d\x3a\xe5\x3b\x35\x2e\x28\xe1\xb5\x73\xca\x17\x95\x9c\xda\x3d\x9d\x5f\xb3\x96\xb3\x23\xd9\x27\x61\xc6\x6d\xab\x39\x3f\x00\xc9\x60\x22\xc5\xf2\xe6\xdb\xaf\x25\xdb\x92\x97\xb7\x27\x2b\xe1\xa3\x5d\xb9\xee\xa5\xef\x18\xbb\x38\xf8\xd1\xa2\x94\x20\x29\x33\x94\x67\x3a\xda\x47\x23\x0b\x99\xc9\xe9\xea\xdc\x7e\x1d\x36\xe8\x67\x18\x1e\xdb\xa7\x7d\xbb\xf3\xfb\x95\xd7\xdb\xa4\x64\xae\xc3\xc3\xa7\x60\xb6\x60\xa8\xd6\x1a\xe4\x60\xc8\x9c\xfc\x4c\x97\xfb\x20\x82\xd7\x12\x0c\xf0\x36\x08\x87\xd8\x67\x4b\xa9\xd2\x8f\x44\xe9\xd0\xdb\x4a\x64\x0f\x0d\xba\xed\xc2\x98\xa5\x41\xdb\x73\xde\xd7\x61\xf6\x47\xd7\xa7\x4e\xe4\x0a\xc5\xfa\x21\x0a\x1e\xb2\x74\x4b\x15\x71\xd7\x98\xe6\x79\xc5\x8b\x57\xd3\x60\xab\x6c\xd1\x54\xc0\x54\xb2\x4f\xd0\x5a\x81\xf9\x13\x32\xc5\x84\x0c\x3c\xee\x2a\x4c\xa7\x18\x45\xae\x9c\xfe\xb6\x50\x7c\xce\x33\x36\x85\xe4\x5e\x5c\x4c\xa3\x9a\x49\x3e\x8d\x08\x24\x81\x65\x4b\xf3\xb2\x5b\xa5\x4d\x9c\xe2\x11\xf0\xe2\xea\xc3\x0d\x24\x8c\x03\xa3\xe0\xbd\x05\x6c\xfb\x41\x48\x28\xde\xef\xf7\xe1\xde\x7f\xf4\xbd\x95\x15\xd3\xec\x98\x7c\xcb\xdc\x77\x24\x24\xb5\x53\x90\x55\x7e\x26\x43\x56\x31\x98\x6b\x05\x59\x40\x47\x34\x9a\xbb\x56\x27\xb6\xa5\x15\x8c\x90\xdd\xd4\xda\x43\x72\x2e\xcc\x9a\x83\xf6\x9e\xc7\x97\x2b\xf7\x48\xfa\x77\xa6\x72\x5e\x2b\xba\x0a\x3f\xab\x84\x08\x8e\x1e\x52\xa2\x17\x79\xc6\xc5\x6d\x95\xd6\x60\x22\x2d\x0e\xb9\xa4\x75\xe2\xd6\x63\xac\x62\x34\x5b\x4f\x29\x77\xc1\x8f\xbd\x52\x49\xb3\x83\xf2\xee\x66\x51\xa0\x2d\x3c\x1c\x7b\x67\xea\x8d\x49\xdc\xc1\xc1\xb3\x5b\x2f\xd7\xdd\x2a\xaa\x1e\x0e\x47\xe7\xa3\x5a\x35\x30\x7b\xa7\x83\x77\x8f\xa9\x5c\x5e\xc7\x12\x60\x39\x4f\x28\xd9\xf1\x1f\xb6\x59\x6a\xfb\x24\x2b\xb7\xb7\x41\x37\x9f\x6b\xa9\x0c\xcd\xf6\x44\x04\x92\x19\x2d\xce\x4a\x33\xbb\xe0\x3a\x91\x73\xd6\xf9\xaa\xe3\x6b\xfe\xfa\xac\x26\xdc\x6f\x3a\x8e\x46\xce\xff\x78\x76\x4d\x68\x69\x77\xd1\xb8\xec\x4d\x7b\x35\x71\xfb\xf9\x8f\xd0\xa1\x7e\x2f\xb3\x77\x63\x3d\xf8\xdc\x5f\x0c\x02\x7b\x34\x08\xc0\x19\x7f\xce\x46\x00\x2e\xb8\xe1\xd4\xc8\x96\x35\x2b\xea\xf7\x77\x4c\x68\x84\xe8\x39\xf4\x03\x81\x55\x16\x18\x6e\x6d\xec\x7a\xee\x5d\x10\xb4\x01\x38\xa1\xbe\x75\xc3\x03\xb0\x07\xe9\x85\x70\x6c\x1e\xda\xfc\xd6\x79\x66\x16\x40\x6d\x7e\x77\x5a\x4b\x58\xb9\x94\xe0\xb8\xaa\xc5\xec\x93\xe6\xee\x55\x13\xc3\x7f\xe8\x7a\xb2\x9d\xda\x0b\x57\xf5\xbf\x25\xcd\x10\x1a\x57\xfb\xd6\x11\xd5\x21\xdb\x71\x92\x7e\x3f\x3d\xcc\xaf\xc2\xad\xb9\xd4\x90\xe1\xd6\xb5\x30\x8a\x0a\x6d\x37\xa2\x7e\x37\x3a\x74\xa6\x9d\x43\x72\x64\x92\xa2\x75\xba\xd7\x07\xf2\xcc\xc6\xa9\x3a\xb8\xbf\x0b\x1e\xd9\x6d\x67\xf5\x20\xd6\x16\xc0\xdd\xae\xaa\x8d\xda\x42\x90\xd9\x92\x77\x5c\x1b\x9f\x7d\x16\x5e\x70\xed\x52\xa7\x81\xa4\x73\x0d\x55\xee\x8b\xbf\xd2\x34\x55\xa7\xc8\x49\x7c\xe9\x3c\x05\xf2\x8e\xcf\xc2\x44\x45\xb0\xc7\x1d\x99\x45\xc1\x13\xb8\x8e\xdd\x9c\x5f\x13\xcc\x76\xfd\x9b\x5f\x61\xd9\xae\xff\xfc\xe5\xaf\x5e\xb5\xde\xd0\xa7\x73\x7f\xde\x51\x73\xb0\x77\x8b\xcd\xb3\xf0\x9a\x03\x71\x01\xfd\xe5\x80\x1e\xba\xb3\x8b\x78\x64\x37\x35\x50\xe9\xdd\x84\x8a\x17\x0f\xb3\x27\x2f\xc1\x1d\x0b\xe0\xf7\xa7\x2a\x48\x50\xae\x9f\x1f\x41\xd9\x0a\x8b\xed\x58\x53\xc7\x16\x3c\xbf\xf6\x7e\x17\x59\x9f\xc0\xe7\xfa\xe2\x6a\xf4\xd7\x77\x67\x6f\x2e\xdf\xc1\x2c\x9d\x5f\x55\x5c\x10\x78\x07\x3f\xa2\xf6\x68\xd5\xe6\x26\xb8\x1d\x18\xdd\xec\x1c\x57\x6f\x47\x8d\x8b\xb2\x7d\xd3\xd1\xb8\x71\x5f\x69\x59\x4c\x5a\xad\xfd\x71\x55\x57\x90\x9d\x99\xa9\xfd\x85\x38\xec\xac\xe1\x8a\x32\x33\xd5\x2e\x43\x76\xa7\x70\x86\xf7\xbe\xaf\x6c\xdd\x01\xf2\x0c\x94\xf8\x76\xbd\x08\x83\xbd\xab\xef\x1f\x08\x56\x6d\x59\xbc\xea\x1e\xfb\x72\x38\x82\x5e\xde\xc8\x63\x0f\x29\x7a\xe4\x28\x4b\xaf\x2d\xa5\x66\x3a\x64\x62\x7d\xa6\x98\x52\xac\x4a\xc3\xdb\x85\x7a\xad\xcc\xe3\x5b\x2b\xbb\x50\x33\x6c\xd4\x22\x06\xd6\xa5\xc9\xf6\xb6\x7d\xea\xae\x97\x50\x43\x7a\x9f\xd1\xf4\xd5\x2b\x7c\x03\x21\xd5\x8f\x4f\x00\xe1\xb3\x7b\x74\x28\x0d\xe3\x75\x45\xe4\x73\xdf\xb1\x19\xc8\xd5\x69\x87\x08\xd5\xa1\x98\x41\xa9\x43\xbc\xba\x2f\xd5\xf1\xb4\xdb\x47\x1e\x85\x7a\x7e\xbb\xe3\xd5\x65\xdf\xd7\x96\x62\x26\x8d\x14\x3b\x3b\x89\x5f\xaf\xe8\x5e\x3f\xc7\xd8\xe2\xbc\xca\x64\x1d\x55\xde\x01\x0f\xc3\xa0\xd0\xb7\x62\x9c\xe7\x12\x52\x78\xd5\x7e\x5d\xb1\xff\xe8\x92\x47\x3a\xbc\xd8\xd3\x99\xfb\x31\x05\x1f\x76\x55\xc1\xee\xd5\x85\x22\xed\x1c\x71\x31\xbc\x70\x72\x97\x8f\xaa\xd0\x0e\xed\xc8\x7a\xbc\xdb\x1b\x5f\x94\xca\xdc\x49\xd5\x3d\xd4\xf8\xba\xd6\xb1\x61\xd5\x77\xbf\x2d\x45\x13\x3d\xc7\x33\x82\x73\x7c\xe2\x73\x32\x02\x83\x69\x23\x73\x74\xf3\x64\x04\x2f\xf6\x07\x38\x3c\x4f\x7b\x68\x76\xe4\x42\x0f\x1b\x92\xba\x57\xc1\xdb\x63\x59\xc7\x15\x7e\x76\xdd\x9c\x82\xc0\xee\x4d\x45\x24\x68\x38\x84\x6e\xf8\xbd\x11\x05\x25\xb1\x3c\x4e\x07\x7a\x30\x34\x2c\xc7\xc2\x7d\x34\xcb\x2c\x2c\xa5\x88\xb3\x07\xbb\xb0\xd3\x9e\xab\xeb\x96\xd3\xc2\x57\x41\x94\x77\xe2\x8e\xaa\x94\x9c\x5d\x0f\xf7\x73\xf4\x3b\xb8\x16\x23\xfe\xb4\xcb\x04\x55\xaf\x5e\x24\x53\x46\xc6\xdc\xe8\xaa\xae\x08\x33\xf1\x6d\xd0\x92\xb7\x60\x23\xb2\x87\xd4\x1e\x48\xf7\xbd\x5a\x21\x60\x99\x18\x9a\x35\x0a\xcd\xbe\x7a\xf5\x0a\x95\x57\xaf\x7e\xfd\xeb\x5f\x43\x55\x0d\x92\xb2\x84\xe7\xcb\x0d\xa1\xd5\x7f\xbd\x7e\x3d\x20\x7f\x3a\x7b\xff\x0e\xea\xce\x14\x46\x63\xba\x0b\x1c\x19\x4b\x6d\x46\x9d\x75\x8f\xfc\xcf\xe8\xc3\x95\xa7\x90\xba\xf1\xab\xab\x52\xe8\x96\x37\x20\x17\x91\x0b\x50\xac\x9e\xa2\x66\x86\xd5\x30\xa5\x21\x74\x32\xc1\x6a\x4a\x63\x5f\xcc\x0b\x8f\x94\x8f\x6c\x86\x52\x8b\x58\xb1\xc1\x6e\x7f\x06\xbe\x49\xf6\x22\x8d\xca\x3c\x1f\x5c\x8f\xae\x56\x30\x56\xa0\x7f\x30\x95\x1e\x16\xeb\x9c\x68\xa8\xdb\x50\xa5\x82\x53\x4c\x5b\x99\xd2\x55\x78\xc1\xc1\xc2\xd4\xed\x24\x9e\xd2\x06\xd3\xba\x9e\x40\x0d\xb1\x7c\xe2\xda\xaa\xea\xe7\xf7\x68\x56\xdc\xe6\x1c\xfb\x40\x36\x91\x3a\xcf\x0f\xb3\xc1\xbd\x72\x21\xeb\x81\x5c\x10\x9a\x49\x31\x8d\xb7\xb6\xe2\x47\x51\xf5\xd0\xed\x4b\xe9\x9c\x79\xaf\x6b\xf6\x55\xa4\x42\xef\x69\xeb\x8a\x27\x75\x95\x76\x14\xda\x4f\xc7\xb2\x34\xde\x04\x8c\x63\x62\x0d\x1a\x2c\xe5\xd8\x21\x73\xe0\x0e\xc9\x06\x77\x49\x3a\xdb\x39\x6f\x65\x9d\xcc\xd7\x84\x80\x1e\x61\x34\x99\x91\x5b\xb6\xe8\x23\x61\x2a\x28\x44\xa3\x00\x3c\x2e\x2c\x14\x30\xb7\x63\xdd\x5e\x92\xb0\xd4\x4a\xb6\x0e\x58\xde\xa2\x5e\x61\x51\x88\x66\xf1\xe2\xa3\x76\x92\x8e\xcb\x19\x29\xa2\x0b\xbc\x4f\x4c\x1c\x95\x3b\x0b\x49\x22\xb1\xd6\x61\x3d\xea\xc2\x9e\x2f\x96\xda\x6e\x7a\xd3\x97\x2b\x37\x02\x4b\xe8\x1c\xab\x2a\xc5\x52\x6f\x57\xdb\xcf\x89\x6d\xf0\x41\xea\x53\xf1\x46\xae\x08\x50\xb1\xd3\x15\xb7\x71\x6d\x3d\x94\x02\x20\x6a\x51\x21\x9a\x99\xd2\x81\x06\x3c\x38\xec\xb7\x99\x86\x3a\xcb\x90\x2a\x42\xdd\x32\x9f\x94\x84\x66\x03\x72\x6d\x27\x19\x32\x1f\x61\x0e\xdc\x39\xba\x91\xd9\x33\x1a\x87\xbb\xd8\x8f\x1c\x0e\x06\x87\x48\xc1\x57\x04\xbf\x74\xc0\x8c\xdd\x12\xa8\xee\x90\x38\xb5\x51\x39\xb0\xd0\x98\x06\xd6\x4a\x6d\x90\xe6\x58\x42\x14\x97\x99\x79\x0e\x45\x5b\xa7\xdf\x59\x5e\xce\x0e\xd9\x3e\x77\x4d\x52\xbd\x4b\x8a\xea\x56\xe6\x84\xfa\xb3\x7b\x6a\xea\x9d\x12\x53\x2f\x95\x30\x74\x5b\xe4\x8e\x59\xf7\x4c\xbd\xf7\x48\xa4\x9c\x77\x4a\xf2\xe9\x9f\x75\x39\x61\xf2\x36\x52\x9f\xc1\xd2\x73\x19\xfb\x51\x89\x79\xc3\xc9\xaa\xca\x5b\x3e\xdc\xad\x92\x93\x03\xd1\xb4\x10\x78\x7a\xf9\xae\x5b\x75\x0e\xd2\x59\xe0\x6b\x3e\x5d\x04\xc0\xe6\xd3\xce\x28\xd7\x7c\x96\x4e\x53\xa0\xee\x45\xe4\x92\x0e\xa0\x34\x12\x32\x31\x9b\x70\xe4\x06\x50\x65\xd5\xf1\x28\x6a\x65\x15\x2d\xb3\xd2\x84\xb0\x9c\x15\xac\x01\x06\xf5\x79\x9b\x31\x18\xd2\x37\x8b\x18\x05\xb0\x48\xa4\xbf\x5d\x79\x06\x3e\x3b\x1d\xe9\xae\xf5\xc6\x7e\xb2\x8e\x1b\xf7\x80\xa1\x97\x19\x76\x86\xe3\xc8\x65\x43\xf0\x1e\xc4\x35\x19\x06\x9c\x37\x8c\x46\x01\xc9\x8b\x23\xae\x60\x4f\xe7\x95\xb5\x53\xac\xb8\x29\x3a\x2d\xc2\xd9\xf5\x70\x8f\x12\x7d\x34\xea\x4f\x5a\xa6\x07\xd5\x4d\xad\x6e\xca\x45\xb5\x72\xa7\xe0\xb5\x14\xe6\xd9\x8b\x86\x4b\xd3\x7e\x6b\xe9\x62\xa4\x56\x6d\x24\x65\x73\x75\x46\x03\x05\x8d\x12\xb9\x79\x03\x1f\x9c\xd7\xe7\x2e\x46\x3e\xa2\x48\x08\xf0\x68\xe5\x23\xd8\x7c\x96\x2b\x91\xc1\x62\xc9\x08\x6a\x93\xe0\x1d\x2f\xba\x2c\x16\x32\x3d\x25\xae\x44\x7b\xa8\x09\xde\x73\xb5\xc2\x7b\x78\x09\x84\xe2\xed\x95\x59\x56\x45\x0a\xf0\x9d\x45\x83\x9d\xca\xd4\xdc\xa7\x50\x8d\xdd\x40\x58\xf9\x75\xd7\x5d\x24\xf7\xac\x3b\x43\x22\x2e\xb4\x5b\x25\x8b\xba\xb2\x1a\x47\x0a\x35\x79\x93\x19\xcb\x29\x26\x85\xf3\xcb\xb3\x54\xe6\x4e\x71\x63\x18\x66\xf5\x61\x2a\xd7\x44\x4e\x7a\xb5\x42\x71\x07\xf3\xd7\x07\xbb\xd4\xf3\xb8\x67\xc9\x15\x52\xed\xc2\x1e\x80\x71\x5d\x93\xce\x2c\x5e\xc3\x75\x21\x83\x4c\x8e\xa2\xa1\x64\xb0\x0c\x66\x8e\xd0\x7b\xf4\x85\x3f\xe5\x15\xa9\x17\x84\x84\x97\x2b\xd2\xcb\x15\x69\x2f\x57\xa4\x88\xb1\x78\x82\xe3\x00\x15\x5f\x9b\xe2\x8c\x52\xfe\xee\x54\x45\xf5\x44\x59\x62\x2c\x6a\xfa\x5b\x93\x54\x75\x2d\x9a\xbd\xfa\x1c\xfa\xbb\x94\xc3\xe3\xd2\x4c\xfa\xbf\x21\x4c\x24\x32\xc5\xcd\xb7\xe3\x2b\x6d\x40\xb4\xa9\xae\x1f\xf1\x5c\x72\xff\xad\x58\x13\x07\x63\xef\xba\x75\x3b\xd1\x01\x6f\xab\x7b\xbb\x27\x06\x5f\xb1\xf5\x10\x04\xeb\x96\x1f\x62\xe4\x1d\x7f\xaf\xac\x84\x58\x19\x18\x90\xdb\x57\x3b\x25\x47\xf8\x72\x90\x14\x65\xcf\x35\x18\xe4\x2c\x97\x6a\xd1\x0b\x8d\xec\x8f\xb5\x5e\xae\xc5\x31\xc8\x04\x49\xa9\xec\x65\x2f\x5b\xfc\x58\xa5\x03\x0f\xa0\x47\x16\x0e\xc2\x3e\x75\xab\x06\x13\x3f\x0d\xf7\xbb\x90\xe8\x0a\xae\xf2\x55\x75\x9c\x49\x48\xbe\xa7\x7b\xe1\x8a\x0a\x6f\x99\x98\x93\x39\x55\x1d\x0a\x59\xc7\xcf\x3d\xe5\x81\x94\xcf\xb9\xde\xad\x60\xdd\xca\x5b\x33\x77\x69\xbd\x64\x69\x8a\xd2\x38\x4a\xe9\x4f\x85\x0f\xf5\x0e\xa7\xa1\x21\x14\xbd\x3e\xd8\x69\x1a\x3f\x9a\xa2\xb0\xf8\xec\x58\x1a\x16\x9f\xfb\x16\x88\xad\x8f\xb2\x33\xda\xec\xb5\xea\xb3\x7f\x3c\x5a\xec\xe3\x1c\x56\x2c\xb2\xca\x4f\xe0\x85\xd3\x47\x3a\x68\xe8\x0f\xb2\x47\x5d\x8d\x4b\x84\xfe\x53\x56\xd3\xec\xc9\xf4\xea\x22\xf5\xfe\xcd\xed\xae\x23\x97\x13\xff\xc5\xe8\xda\x0a\xf9\x5e\x8c\xae\x2f\x46\xd7\xb6\xcf\x8b\xd1\xf5\x45\xa3\x50\x7f\x7e\xd4\x1a\x85\x17\xa3\xeb\x8b\xd1\xf5\x7e\x30\x7c\x10\xa3\xab\x13\xe3\x2a\x8b\xeb\xa3\x1a\x5c\x5d\x59\x97\xb3\x24\x91\xa5\x30\x37\xf2\x96\xb5\xb6\x20\xb4\x12\xe6\x97\x46\x7f\x3c\xc9\xbe\xbb\x60\xd1\x49\x3c\xd8\x45\x30\xa0\x65\xca\xad\xf0\xbe\x33\x02\x9d\xb9\x01\xbc\x9c\x6e\x49\xb1\x48\x59\x1a\x46\xf6\x87\xd4\x58\x58\x0f\xc8\x19\x51\x2c\xe1\x05\x77\xd5\xbb\x29\xbe\x47\x0c\x0b\x59\xf6\xb9\xd1\x2c\x9b\xb8\x6c\xe7\x22\x2e\x0a\x53\x89\xe0\x8e\xc2\xad\xfc\x0c\xf2\x1c\xe9\x93\x64\xfb\x0a\x39\x8a\x7d\xef\x99\x95\x9b\xcd\x4d\x3c\x42\xac\x14\x81\xa5\xd4\x6a\xd1\xc0\xc7\x0a\xee\x22\x90\x1f\xfa\x60\xb3\x2f\x05\x57\x80\xbc\x23\x96\x48\xd1\xa6\x22\xe6\x9a\x0d\xba\x6c\x8e\xe4\x77\xca\x69\x34\xb1\x00\x7e\xa8\x7b\x39\xa7\x19\x4f\xb9\x59\x04\x5b\x9b\xab\xb2\x44\xf1\xc4\x84\x6d\xd4\x15\x18\x09\x2d\x0a\x25\x69\x32\x63\x3a\x9a\x37\x8a\x1c\x2e\x10\x2b\x78\x9d\x63\x25\x30\x90\x3a\xa0\x8f\x65\x7d\xd9\x82\x28\x69\xbc\xb9\x7c\xcd\x07\x6f\xa2\xc1\xa0\x3b\xf2\x2f\xa3\x16\x60\x53\x97\xf1\x10\x38\x2b\x3e\x89\xff\xd0\x44\x66\xa9\xcf\xef\xf1\x9b\x57\x56\xcc\x4b\x1c\x0e\x5a\x2a\x07\x19\x20\x8c\x24\x99\x65\xc5\x96\xf2\xad\xef\xfc\xcb\xaf\xc9\x4c\x96\x4a\x0f\xe2\x20\xa1\xd7\xf0\x0e\xaf\x68\x5e\x4c\x34\x24\x63\x54\x1b\xf2\xfa\x15\xc9\xb9\x28\x2d\x07\xea\x8c\x36\xdd\x25\x9b\x48\xa6\xf9\xd5\xd7\xad\xfb\x75\x95\x66\x96\x2d\x92\x0e\xab\x0a\xcc\xc4\xeb\x84\x1a\x77\x92\x30\xb8\x0c\xf3\x58\x37\x44\x1c\x47\x74\x63\x68\x0b\x23\x1f\xe0\x7c\xfd\x50\xca\xf1\xc2\x74\x09\x44\xfc\x5f\xec\x51\x8f\x40\xf4\x2f\xdb\x64\x17\xa9\x92\x8b\x6c\xfc\xe8\x83\xd4\x4a\x98\x72\x6d\xb6\x54\x4a\xa8\x62\x14\x37\x36\x6b\xcf\x56\xa6\x56\xde\xef\x18\x96\x02\x77\x04\x2f\xeb\x7a\xf5\x50\x92\x30\xac\x69\x78\x51\x55\xda\x11\x12\xc7\xdf\x3a\xfc\x13\x27\xdb\xf2\x08\xb2\x87\x1c\xdd\x2d\x97\xda\x4e\xba\xf2\x28\xd1\x79\xad\xd8\xad\x7e\x0a\x34\x17\x53\x4c\xa9\x9d\x97\x99\xe1\x45\x56\xad\x3b\x74\x70\x84\x3c\x56\x9b\xd1\x48\xd3\x43\x31\x38\x17\x53\x31\x81\x8a\xf1\x28\x8c\xc5\x84\xc1\xcc\xd0\xca\xf2\x83\x82\x2a\x1a\x80\x07\x75\x53\xf5\xb1\xd3\xc0\x51\xb0\x03\x22\xe5\xb1\xe4\x5c\xd1\x2c\x2c\x34\xb6\xfd\xec\x13\x69\x0c\x13\x54\xb4\x50\x30\xd7\xaf\x7a\xd0\x89\xc8\xbb\xe0\x02\x86\x15\x36\x1a\xd8\xe2\x84\x9a\x37\x34\xb9\x65\x22\xc5\xf2\x43\xb0\xec\x74\x21\x68\xee\x52\x51\x45\x35\x95\x1b\xfd\x75\xcf\xa9\x1a\x30\x52\xce\x87\xea\x22\xd7\xdd\x27\x0c\x4a\xdd\x39\xd7\xcb\x27\x8d\xb5\x8c\x37\x9d\x73\x8d\x4a\x18\xc5\xe7\x09\xf3\xfc\xdf\x7e\x6a\x9f\x53\x9f\xb7\x88\x47\x5f\x9a\xbc\x73\x55\xe4\x11\xfe\x02\xb9\x0f\xca\x6f\xc8\x3a\x45\x33\x7b\xb4\x17\x21\x3c\xb3\xb1\xb9\xe3\xc5\x7e\x0b\xaa\xa8\x71\x97\x30\xda\xc3\x8f\x6f\x2e\xea\x87\xf8\x23\x4d\xa5\x26\x6f\x32\x99\xdc\x92\x0b\x06\x42\xd7\x43\x16\x04\x51\xe3\xf4\x29\x13\x46\xe7\x74\xba\xcd\x3a\xd6\x27\xb9\x14\xdc\x48\xb5\x99\x5e\xbc\xd4\x27\x7c\x92\x74\xc4\x6a\x9c\x3e\xeb\x64\xc4\x16\xc1\x76\xa9\x46\xa8\xe0\x18\x42\x77\x9f\xcb\x6f\xc7\x43\xf5\xb3\x99\xbc\xeb\x1b\xd9\x2f\x35\xeb\xf3\x16\xf6\xd6\x0e\xab\xbb\x65\x0b\x30\x32\x77\x5c\xdf\x37\xd8\xad\x76\x39\x30\x12\x74\x4a\xf0\xde\xb2\xe8\x8f\x6f\x2e\x2c\x6f\x18\xc4\xc2\xde\x09\x33\xc9\x49\xc2\x8a\xd9\x89\xfb\xf0\xb3\x04\x8a\xa7\x16\x5d\xa1\x72\x46\x12\x99\x65\x2e\xde\x59\x4e\xc8\x39\x2b\x66\x61\xb0\xc7\x5e\xe9\xd3\xa5\xba\x2d\xa4\xec\x9a\xf2\x33\x3a\x30\xb6\xb7\x3b\x2f\x11\xe2\xa8\x71\xb7\x3a\x06\x8f\x85\x2a\xcf\xba\x12\xe3\x03\x02\xe7\x81\xab\xea\xd7\x6a\xe9\xc7\xae\x97\xf5\x74\xc0\xde\x87\xa3\x46\x6e\x86\x13\x94\xa4\x53\x96\x12\x39\x67\x4a\xf1\x94\x69\x12\xe8\x4d\x7c\xf5\xe4\xd9\x63\xc3\xed\x25\x33\xf1\x93\x67\x26\xde\xe1\x8e\x13\x91\x27\xdb\x7b\x99\x3c\xd1\x34\xe7\xe2\xd9\x11\x28\x9d\xd0\x8c\x0d\x3f\x74\xb8\x4c\x8c\xb0\x47\xfd\x3e\xe1\x5f\x46\x09\xc5\xb6\xa4\xe9\xfa\x26\xe0\x0b\x11\x32\xdd\xa6\x1f\x7d\x80\x5b\xc1\x94\x1a\x76\xb7\x95\xfd\xf5\x2b\x02\xb5\xbd\x25\xc8\x9d\x4f\x79\x7f\x78\xa2\xd4\x78\x11\x96\x63\xde\xaf\x7d\xb2\x4f\xb7\x4f\x5d\x95\x2e\x7e\x21\x8d\x4c\xb2\x1e\x51\xcf\xae\x87\xe4\x0f\x38\xf2\x7e\x33\xf5\x29\x69\x50\xba\xbb\x90\x39\xe5\x9d\x0b\x6d\xcc\xea\x85\xa9\xfd\x74\xaf\xc3\xb0\x04\xc7\x8d\x6b\x84\x4c\xf8\xb4\xb4\x37\x30\x77\x6b\x7a\x49\xa2\xf6\x28\x02\x48\x25\x7f\x44\x9a\x20\xef\x71\x58\xc9\x1c\x7e\x07\x81\x29\x04\xd3\x24\xd1\x4c\x68\x0e\x76\x92\xc8\x58\xed\xca\xbd\x61\x7d\x41\x74\x2f\x44\x21\xa5\x47\xde\xc9\x29\x17\xfe\x54\x4a\x67\x46\x9b\x50\x9e\xb5\x05\xc6\x8b\x54\xf1\xe4\x52\x85\xd6\xd9\xa5\xa0\xe3\xac\x8d\x17\x40\x9d\xac\x67\x14\xec\x9c\x0c\x7a\x9f\xa4\x5c\xdb\xff\x93\xd1\xe8\x1d\xe8\xc4\x4b\xe1\x65\x5d\xd0\x17\x3b\xb2\x16\x3c\xfd\xf1\x00\xee\xf7\xcc\x20\xa5\xd9\x21\xc7\xdd\x50\xa4\x76\xb2\x4c\xd7\xdc\x4e\xdc\x78\x98\xe9\x2f\x78\xce\xa2\xe5\x7e\xcc\xc8\xcd\x8c\x27\xb7\xd7\x91\xea\x5b\x2a\xfb\x4e\x44\xaf\x6a\x4c\xa8\xf9\xdb\x3e\x09\xa2\x9b\xea\x75\xf7\x0b\xec\x4d\x44\xcf\x47\x6e\xc1\x76\x18\x42\xb5\x96\x09\xaf\xec\x1c\xa0\x2e\xa9\x08\x7e\x0a\x04\x7f\xbf\x8b\x00\x9e\x7e\x4f\xde\xe4\x37\xcd\x57\x3d\xd5\x31\x2f\xe2\xc2\xaf\x75\xaf\x13\x47\xd4\xd8\x21\x4b\xf7\x4d\x2d\x2f\xb7\x97\x4d\x1b\x4a\x7b\xef\xc5\xed\x36\xc9\x4b\x49\xbe\xca\xe2\xd2\x36\x85\xfc\xdc\x2e\x2f\xdf\xde\x96\xda\x26\x90\x61\xd5\x6d\xb8\x61\xa9\xc3\x77\x4e\x8d\x0f\x87\xa9\x90\x45\x99\xa1\xaf\xc4\xfd\x93\x8b\x7b\xed\x2c\x7e\x67\x4f\x6a\xfd\xc7\x48\xb4\xd9\xd5\x11\xf8\xa7\x91\x73\x33\x12\xc9\x5e\xfd\xea\xeb\xaf\x7f\xec\x59\x38\xdb\x5e\x81\x1f\x22\x0d\x67\x4b\x95\xe8\x4b\xa4\xcd\x4b\xa4\x4d\x8c\x8a\x0f\x99\x46\x75\xcf\xb1\x34\x1d\x5d\x5c\xbb\xb9\xb7\xb6\x8f\x96\x69\xed\x04\xdb\xd5\x01\xb6\x43\x3c\xcc\x9e\xa2\x60\x3a\xfb\x82\x76\x89\x78\x79\x89\x73\xf9\xa9\xc5\xb9\xec\xe2\x03\xda\x3d\xa6\xa5\x8b\xef\xe7\x4f\x29\x7e\xa5\xc3\x61\x6c\x1f\x67\xd1\x3d\xba\xa2\x7b\x3e\xbb\xee\x9a\xad\x5d\x4a\x1a\xc5\xfa\x19\x77\x8b\xa8\x2a\x08\xfa\xc2\x83\x98\x1f\xcb\x48\x7b\xb0\x1e\xe5\x0e\x41\x3a\x5c\xa0\x70\x78\xd9\xa5\x96\xa0\xbb\x93\x7f\x18\x35\x4c\x1b\xe1\xf5\xd3\x58\x34\x7e\x9a\x26\x83\x97\xc2\x20\xcf\x5b\xa7\xad\x6b\xb9\x45\xbc\x26\x01\xce\x3a\x30\x62\x39\x8e\x73\x1a\x56\x67\xe4\xec\x7a\x68\xaf\xcb\x10\x3e\x43\x33\x3d\x20\x2b\xf8\xb4\xd7\x4b\x3a\xbe\xee\xf9\x33\x35\x86\xe5\x85\x69\xbf\xd9\x2f\x2a\xed\x27\x57\x69\xef\xac\x8f\xfb\x1c\x3a\x86\x0a\x90\x65\x4e\x45\xdf\x9e\x28\x50\x6e\xd7\xac\x60\x0d\x12\x3c\x20\xde\x2b\x17\x61\x41\x15\xc3\xa4\x4f\xf5\x8a\xb7\x34\xaa\x7f\xf8\x30\x4a\x48\x18\x7b\xe7\x95\x23\x03\x6d\x9c\xb4\x44\x2e\xb9\x7d\xba\xe5\x04\x28\xf8\x43\x15\x71\xe1\xda\xbd\xd9\xcc\x18\x32\xeb\x6b\x08\x44\xa9\x5a\xd5\x25\x61\x14\x85\x69\x96\xc9\x3b\xfc\x76\xcc\xc0\x2c\xf4\xed\x5c\x5c\x84\xd5\x98\x91\x9c\xdb\x4b\xb5\x53\x7e\xc6\xd3\x41\x53\xa4\x95\xa8\x99\x42\x81\x55\x39\x6b\xd6\x88\x99\x78\xa3\xed\x85\x54\xa0\x23\xb4\xfd\xb7\x77\xbc\xc1\xac\xb8\x8e\x26\x8c\xd9\x8c\xce\xb9\x2c\x15\xf6\x36\x92\x1c\xb8\x9f\x80\x25\x2c\x64\x19\x54\x53\x58\x25\x31\xac\x4e\xaf\x80\xd3\x55\xf5\x23\x88\xf2\xa9\xf4\xba\x84\x3e\xfb\xc2\xb5\x59\x5e\x8b\x07\x91\x4f\xda\xb6\x2f\xbc\x99\xeb\xc2\xb2\x85\xce\x15\xd1\x3e\xc7\xfd\xea\x82\xc9\x7c\x04\x3f\xfd\x88\xea\xa1\x6d\xcd\x45\xfa\x22\xeb\xec\x5b\xd6\x09\xe6\xaa\x8c\x27\x8b\xce\x95\xc2\x2a\x33\x95\xed\x4e\xde\x50\xcd\x52\xf2\x9e\x0a\x3a\xc5\x6b\xd9\xd1\xe8\xfa\xcd\xfb\x63\xbb\x6d\x70\xed\x1b\x5e\xac\xb4\x65\x8d\xe2\x39\x5c\xed\x33\x0c\x62\x69\x85\x3b\x70\xa2\x8e\x6b\xdc\x6b\x18\x07\x09\xdc\xa4\x5d\x82\xd8\xe5\xd0\xcb\x66\x8d\xc7\x06\x51\x98\xe7\xe9\x3d\xab\x3a\x72\xa1\x0d\xcd\xb2\xeb\x8c\x8a\xb3\xa2\x50\x72\xbe\xfa\x26\x5c\x0f\x0c\x77\x0d\x3d\x6b\x47\xdf\x07\xff\xb2\x40\x40\x83\xad\x57\x90\x61\x35\xfe\x80\x0c\x4d\xb8\x10\x4b\x01\x6c\xf0\xe0\xac\x34\x32\xa7\x86\x27\x07\xf6\xde\x7c\xf0\x9e\x8a\x92\x66\x2b\x3d\x8c\x36\x2e\x63\x9d\x58\xb7\xb1\xd3\xfa\xe4\x68\x2d\xba\x6d\x94\x0f\x36\xf7\x37\x54\x59\xda\x72\x3e\xfa\xdc\xa9\xaf\x36\xd4\x94\x4b\x94\x73\x03\x35\x5f\x4f\xbf\xfb\x24\xa3\xda\x7c\x2a\x52\x7b\x92\x1b\xbf\x6e\x22\xd2\x09\x35\x34\x93\xd3\x3f\x32\x9a\xad\xc6\xe7\x1a\x9e\x9c\xc7\xad\xbd\xf2\x07\x51\x66\x54\x8e\x43\xc3\x43\x4d\xac\x50\xec\xe3\xb5\x15\xcb\xd8\x9c\x0a\xe3\xbb\x63\xa5\x6c\x7d\xe8\xd6\x0f\x58\xc4\x2b\x85\x67\xca\x0c\x53\x39\x17\xf5\x31\x47\xd0\xf6\x5c\x8a\x94\xa3\xaa\x0f\x94\x59\xd8\xa3\x3e\xee\x7a\x54\x5b\xa7\xce\xdf\xa0\xc0\xaf\x53\x9e\x68\x3e\x75\x50\x60\xb3\xb1\x93\x09\x67\xf8\x12\x2c\xd7\xb5\xb9\x2d\x41\x8a\xdc\x0a\x2b\xcc\x41\xce\x8b\xd5\x44\x6a\x2b\x6f\xdf\xc6\xd3\xfb\x7e\x8f\x71\x0a\xeb\xfd\x22\xfb\x6e\xde\xeb\x14\xfd\x9b\x50\x0c\x9f\xed\xd2\x40\x73\x2a\xeb\x29\xe8\x2a\xbc\x0b\xdd\x30\xb8\xaf\x51\x5d\xbd\xd6\x68\x3d\xc5\x6f\x25\x2c\xb5\x93\x6b\xda\xe6\x4d\xaf\xd3\xda\x2a\xcb\xf7\xd2\xf5\xb3\x85\x94\xb7\x95\x45\xb5\x4c\x5f\x5e\xbf\x0c\x0f\x9d\x53\x9c\x72\xd7\x07\x4a\x0a\xce\x30\x51\x07\x15\x0e\x58\xc0\x59\x18\x4d\xdd\x4b\xcb\xc1\xec\x35\x0e\x7e\xeb\x39\x5b\x33\x2a\x76\x9d\xef\x82\x57\x0e\x53\x4c\x54\x01\xc6\x82\x93\x3f\x48\x67\x28\x75\x01\xa5\x96\x06\x00\xdf\xee\x11\x5d\x26\x33\x42\xb5\x9d\x9a\x45\x68\x7b\xe2\xd9\x20\xa7\x82\x4f\x98\x36\x83\x90\x87\x56\x7f\xf7\xcb\xbf\x0c\xc8\x5b\xa9\x88\xf3\xc3\xee\xf9\x0c\x10\x6e\x9e\x15\x5e\x70\x8d\x8b\x09\x7d\xab\x9b\x66\x21\x53\x37\xe9\x3b\x98\xac\xa1\xb7\x96\x87\xe1\x64\x4b\x06\xe6\x82\x53\x72\x60\x85\xbc\xe8\xd3\xff\xb0\x6c\xe9\x5f\x07\xe4\xe8\x0e\x98\xf6\x81\xfd\xf3\x00\x3f\x18\x7c\x09\xe3\x8b\x70\xf5\x61\x0c\xf3\x53\x7c\x3a\x65\x0a\xaf\x7c\x04\xc2\xe1\x8e\x5d\x06\x0b\x21\xa3\xc6\xde\xf2\x5b\x5d\x11\x9b\x13\xf9\xee\x97\x7f\x39\x20\x47\xf5\x75\x11\x2e\x52\xf6\x85\xfc\x12\x55\xbf\x5c\xdb\x35\x1e\x3b\x03\x8a\x5e\x08\x43\xbf\xd8\x31\x93\x99\xd4\x4c\xe0\xf5\xdb\x48\x32\xa3\x73\x46\xb4\xb4\xb7\x56\x96\x65\x7d\xa7\xd6\x26\x77\x14\xb2\x8a\x78\x50\x42\x10\x38\x29\xa8\x32\x35\x94\x18\x38\xad\x06\x7c\xcd\x6e\xdb\x54\x78\xf3\xef\x84\x0b\x67\x33\x72\xd6\x2a\xbb\xe7\x10\xd2\x88\x9b\x64\x24\x49\x66\x54\x4c\x43\x1c\xf5\xa4\x34\xa5\x62\x5b\xcc\x2d\x2d\xcf\xc0\x2d\x17\x9d\xc2\x6d\xbf\xe1\xa2\x69\xb9\x5f\xad\x0b\x9a\x72\xe3\x9d\xfe\x9d\x23\x9f\x59\x9c\xd8\x5d\x50\x7c\x5c\x1a\xa9\xf4\x49\xca\xe6\x2c\x3b\xd1\x7c\xda\xa7\x2a\x99\x71\xc3\x12\xbb\xac\x13\x5a\xf0\x7e\x22\x85\xdd\x71\xc8\x20\x90\xa7\x3f\x83\x22\x98\x7d\x3b\xd5\x2d\x79\x8d\x5b\x2e\x7a\xbb\x22\xec\x49\x15\x60\x7b\x5b\x63\x0b\x1d\xce\xf2\x42\x51\x9f\xf2\x08\xab\x05\xe5\xc5\xc9\x5e\x16\xeb\xd3\xf2\x76\xe7\x31\x87\x2e\xd3\x74\xd2\x1c\xc3\x1e\x3b\xf4\xd2\x80\x53\x59\xa3\x94\x39\x4d\x91\x94\x52\xb1\x78\x70\xe4\xb7\x20\x85\x84\xec\xc9\xa2\x9f\x60\x7d\xfb\x3e\x15\xa9\xfd\x37\xc6\xa3\x24\x8b\xbd\xc0\xb0\xe4\x9d\x08\xc1\xa7\xe1\xc5\xe3\x1c\x89\x92\xef\xe1\xd4\x3b\x79\xad\xa5\x10\x85\xa2\x2a\xb8\xec\x18\x55\x32\xcf\x34\xeb\x02\x2a\xd7\x7e\xd4\xff\x76\x36\x93\x90\x99\x6b\x9b\x48\xb5\xd9\xd2\x11\xc9\x8e\x2d\xe7\xfb\xae\xea\xd1\xac\x89\x6f\x07\x73\x69\xa0\x7c\xf4\x7c\x6d\x19\xfe\x82\x02\x0c\x66\xbd\x8d\xb6\x15\x0e\x79\x1b\xbd\x9d\x48\x7f\x65\x7e\xa0\x24\x5c\x4a\xb6\x5f\xa0\xaa\xfb\x4b\xad\xd2\x16\x2e\xca\x30\x6d\x08\x9d\x53\x9e\x81\x46\x5d\x8e\x35\x53\x73\x2c\x79\xe4\xd2\xe2\xd1\xe6\x3d\xcb\x55\x35\x40\x31\xea\x91\x6e\x3e\x7e\x0d\xcb\xbb\xb2\x69\x01\x70\x1b\x6a\xcc\x7e\xed\xac\xf7\x72\xef\xc1\xeb\xe5\xda\x9f\xed\x17\x76\xbc\xc6\x58\xfc\xfb\x23\xa3\xca\x8c\x19\x35\x37\x7c\x13\xdf\x5d\x42\xe9\x5a\x3f\xaf\x70\xa9\x10\xfa\x8e\x91\xa9\x34\x56\xc4\x2a\x01\xf7\x51\x26\xc5\x04\x34\x01\xd1\x1e\x1a\xa3\xab\x55\xde\x28\x0a\x71\x2f\x52\x74\x5c\x66\xbd\xe3\xf2\x3a\x9d\x74\xec\x30\xc9\x60\x6b\x4c\x01\x21\x05\x73\x7b\x87\x16\x08\xa0\x40\x8f\xb3\xe4\x9c\x69\xbd\x31\x35\x44\xdd\x85\x0f\x5b\xe3\x51\x6e\x98\xc3\x72\xff\x1b\xc6\x4f\x58\x01\x3a\x65\x86\xf2\xcc\x1f\x65\x04\x45\x80\xd2\x36\xea\xba\x71\x81\x8a\x51\xbd\x49\x40\x68\x66\xc4\xd2\x52\xe0\xa4\xa5\x60\xfd\x3b\xa9\x52\x72\x4e\x73\x96\x9d\x53\xcd\xdc\x58\x71\xb8\x1a\xee\xd1\xa1\xde\xeb\x94\x57\xeb\xbe\xd6\x4c\x19\x95\x3f\x1e\x89\x1c\x6e\x54\x57\x2c\x9c\x60\xcf\xab\x20\x6f\x54\xc9\x7a\xe4\xad\xe5\x5e\x3d\xf2\x49\xdc\x0a\x79\x77\xbf\xb9\x9a\x8d\x96\x8b\xba\x9b\x95\xcb\xdc\x02\x29\xf2\x5c\x42\x98\x9a\xc2\x27\x4c\x77\xc7\x19\x39\x82\xbf\x46\xd5\x58\x67\x36\xa1\xa9\x9f\x91\xfd\xe7\x92\x0a\xca\x5e\x14\x95\x9c\x2a\xa6\x31\xe7\xca\xca\x84\x7e\x6d\x55\xce\x7f\x60\xc2\x45\xbc\x6d\x9d\xde\x70\x55\x2f\x3f\x53\xcf\xd7\xa6\xd5\x2f\x6e\xbf\xdd\xc7\x8a\x6c\xa5\xa8\xb1\xd9\x0b\x2f\x9a\xe8\x1a\xe5\xd3\xba\x19\xae\x56\x3a\x45\x5c\x2f\x6a\x8b\x42\xc9\x26\xed\xa8\x5f\xdd\xf9\xe8\xf3\x7a\x60\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb5\xd4\x7d\x15\x52\x5b\xcf\xcc\x56\x25\xd4\x8b\xfa\xe9\x45\xfd\xf4\x63\x52\x3f\x6d\xc5\xf8\x4d\x2a\xa7\x1f\x87\xb2\x69\xeb\x12\x37\x29\x98\x9e\xa5\x6a\xa9\xd5\x8a\x36\xaa\x93\x9e\xad\x22\x69\xeb\xd2\x5a\x2a\x8f\xfe\x7d\xd4\x46\x5b\x21\xb6\x41\x55\xf4\x0c\x95\x44\x6d\x04\x32\x96\xb6\x11\x13\x87\x51\xe3\x58\x50\xac\x0a\x26\x86\xe1\xbc\x4b\x4d\x2c\xce\xec\x2a\x2d\x5a\x01\x6e\xeb\xdc\x0e\xdd\xe4\xda\xcb\x5e\x4e\x60\x74\xe5\x04\x97\x26\x4b\x2e\x2e\xaf\x3f\x5e\x9e\x9f\xdd\x5c\x5e\x34\xe5\xbb\x55\x90\xde\x22\x89\x6d\xd6\x41\xf4\x23\x49\x6c\x4d\x03\x4b\x90\xd7\xfc\x64\x71\x60\xcd\x4f\x65\xc9\x57\xf5\xba\xbf\x5c\x78\x2f\x2e\x77\x2f\xfe\xb1\xfd\x74\xb6\x3d\x9e\xf6\x74\x02\xb6\xa0\xc7\x98\x95\x7b\x66\x32\x4b\xb5\xf7\x35\x1d\x5e\x84\xe8\x25\x2e\x92\xac\x4c\xad\x70\xf1\xe9\xd3\xf0\x42\x0f\x08\x79\xc3\x12\x5a\x6a\xd0\xc2\xa4\x52\x1c\x1a\xf2\xe1\xea\xdd\x9f\xc0\x87\x1a\x5a\xf4\x42\xb2\x0f\xc8\x20\xcb\x29\x26\xc1\x35\x98\x85\x8c\xbc\x61\x28\xa8\xc0\x97\x13\x5a\x58\x2a\xa6\xb1\xca\x82\x01\x59\x64\xc6\xb2\xc2\x52\xcc\x5b\x46\xaa\xdc\x9f\x76\xe0\xaa\x86\xb9\x77\x79\x9c\x32\x83\x91\x4e\x9b\xbc\x1a\x37\x42\x6d\x8b\xc6\xf5\x1e\xba\xd6\xda\xf5\xd1\xdd\xc6\xef\xa8\x76\x1a\xab\x95\xb3\xdd\xb2\xbf\xdb\xf5\x33\xeb\x55\x1c\x6b\x94\x1b\x48\x9e\xe1\xaf\xa5\x39\xdb\xc9\x56\x7a\x0c\x74\x22\xe1\xa6\xb5\x36\x75\xbd\x1b\xd0\xea\x9c\xf5\x4b\xba\x0c\xd6\x04\x72\xed\xc3\xc1\x8b\x3a\x9a\x72\xbb\xb9\x40\xc1\x8b\xb4\x56\x5d\xd2\x79\xdb\xd5\xdf\x95\xe3\x50\x5f\xb4\x9a\xaf\xd3\xc8\x90\x7f\xfc\xeb\xab\xff\x1f\x00\x00\xff\xff\xa3\x83\x53\x06\x03\xa4\x01\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( @@ -219,7 +219,7 @@ func operatorsCoreosCom_subscriptionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "operators.coreos.com_subscriptions.yaml", size: 129535, mode: os.FileMode(436), modTime: time.Unix(1607975193, 0)} + info := bindataFileInfo{name: "operators.coreos.com_subscriptions.yaml", size: 107523, mode: os.FileMode(436), modTime: time.Unix(1607977325, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/go.mod b/go.mod index e1092ef34..b2f04c729 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/blang/semver/v4 v4.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-bindata/go-bindata/v3 v3.1.3 - github.com/mikefarah/yq/v2 v2.4.1 + github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 github.com/sirupsen/logrus v1.6.0 github.com/spf13/cobra v1.1.1 github.com/stretchr/testify v1.6.1 diff --git a/go.sum b/go.sum index d8830a1c3..91fc4143f 100644 --- a/go.sum +++ b/go.sum @@ -141,6 +141,8 @@ github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -232,10 +234,14 @@ github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/goccy/go-yaml v1.8.1 h1:JuZRFlqLM5cWF6A+waL8AKVuCcqvKOuhJtUQI+L3ez0= +github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -386,6 +392,9 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -401,20 +410,25 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mikefarah/yaml/v2 v2.4.0 h1:eYqfooY0BnvKTJxr7+ABJs13n3dg9n347GScDaU2Lww= -github.com/mikefarah/yaml/v2 v2.4.0/go.mod h1:ahVqZF4n1W4NqwvVnZzC4es67xsW9uR/RRf2RRxieJU= -github.com/mikefarah/yq/v2 v2.4.1 h1:tajDonaFK6WqitSZExB6fKlWQy/yCkptqxh2AXEe3N4= -github.com/mikefarah/yq/v2 v2.4.1/go.mod h1:i8SYf1XdgUvY2OFwSqGAtWOOgimD2McJ6iutoxRm4k0= +github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2BmDXuvNEvMbT7MkAJBu64Yxr7iJ6nk= +github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -721,12 +735,16 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -787,8 +805,6 @@ golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0 h1:s5lp4ug7qHzUccgyFdjsX7OZDzHXRaePrF3B3vmUiuM= -golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -902,8 +918,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/imdario/mergo.v0 v0.3.7 h1:QDotlIZtaO/p+Um0ok18HRTpq5i5/SAk/qprsor+9c8= -gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/tools.go b/tools.go index d45747d17..3837fcb16 100644 --- a/tools.go +++ b/tools.go @@ -6,7 +6,7 @@ import ( // Generate deepcopy and conversion. _ "sigs.k8s.io/controller-tools/cmd/controller-gen" // Manipulate YAML. - _ "github.com/mikefarah/yq/v2" + _ "github.com/mikefarah/yq/v3" // Generate embedded files. _ "github.com/go-bindata/go-bindata/v3/go-bindata" ) diff --git a/vendor/github.com/fatih/color/.travis.yml b/vendor/github.com/fatih/color/.travis.yml deleted file mode 100644 index 95f8a1ff5..000000000 --- a/vendor/github.com/fatih/color/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: go -go: - - 1.8.x - - tip - diff --git a/vendor/github.com/fatih/color/Gopkg.lock b/vendor/github.com/fatih/color/Gopkg.lock deleted file mode 100644 index 7d879e9ca..000000000 --- a/vendor/github.com/fatih/color/Gopkg.lock +++ /dev/null @@ -1,27 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/mattn/go-colorable" - packages = ["."] - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - name = "github.com/mattn/go-isatty" - packages = ["."] - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" - -[[projects]] - branch = "master" - name = "golang.org/x/sys" - packages = ["unix"] - revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e8a50671c3cb93ea935bf210b1cd20702876b9d9226129be581ef646d1565cdc" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/fatih/color/Gopkg.toml b/vendor/github.com/fatih/color/Gopkg.toml deleted file mode 100644 index ff1617f71..000000000 --- a/vendor/github.com/fatih/color/Gopkg.toml +++ /dev/null @@ -1,30 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - name = "github.com/mattn/go-colorable" - version = "0.0.9" - -[[constraint]] - name = "github.com/mattn/go-isatty" - version = "0.0.3" diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md index 3fc954460..42d9abc07 100644 --- a/vendor/github.com/fatih/color/README.md +++ b/vendor/github.com/fatih/color/README.md @@ -1,6 +1,12 @@ -# Color [![GoDoc](https://godoc.org/github.com/fatih/color?status.svg)](https://godoc.org/github.com/fatih/color) [![Build Status](https://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color) +# Archived project. No maintenance. +This project is not maintained anymore and is archived. Feel free to fork and +make your own changes if needed. For more detail read my blog post: [Taking an indefinite sabbatical from my projects](https://arslan.io/2018/10/09/taking-an-indefinite-sabbatical-from-my-projects/) +Thanks to everyone for their valuable feedback and contributions. + + +# Color [![GoDoc](https://godoc.org/github.com/fatih/color?status.svg)](https://godoc.org/github.com/fatih/color) Color lets you use colorized outputs in terms of [ANSI Escape Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It @@ -17,9 +23,6 @@ suits you. go get github.com/fatih/color ``` -Note that the `vendor` folder is here for stability. Remove the folder if you -already have the dependencies in your GOPATH. - ## Examples ### Standard colors diff --git a/vendor/github.com/fatih/color/go.mod b/vendor/github.com/fatih/color/go.mod new file mode 100644 index 000000000..bc0df7545 --- /dev/null +++ b/vendor/github.com/fatih/color/go.mod @@ -0,0 +1,8 @@ +module github.com/fatih/color + +go 1.13 + +require ( + github.com/mattn/go-colorable v0.1.4 + github.com/mattn/go-isatty v0.0.11 +) diff --git a/vendor/github.com/fatih/color/go.sum b/vendor/github.com/fatih/color/go.sum new file mode 100644 index 000000000..44328a8db --- /dev/null +++ b/vendor/github.com/fatih/color/go.sum @@ -0,0 +1,8 @@ +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/goccy/go-yaml/LICENSE b/vendor/github.com/goccy/go-yaml/LICENSE new file mode 100644 index 000000000..04485ce65 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Masaaki Goshima + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/goccy/go-yaml/ast/ast.go b/vendor/github.com/goccy/go-yaml/ast/ast.go new file mode 100644 index 000000000..c36ea7860 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/ast/ast.go @@ -0,0 +1,1533 @@ +package ast + +import ( + "fmt" + "io" + "math" + "strconv" + "strings" + + "github.com/goccy/go-yaml/token" + "golang.org/x/xerrors" +) + +var ( + ErrInvalidTokenType = xerrors.New("invalid token type") + ErrInvalidAnchorName = xerrors.New("invalid anchor name") + ErrInvalidAliasName = xerrors.New("invalid alias name") +) + +// NodeType type identifier of node +type NodeType int + +const ( + // UnknownNodeType type identifier for default + UnknownNodeType NodeType = iota + // DocumentType type identifier for document node + DocumentType + // NullType type identifier for null node + NullType + // BoolType type identifier for boolean node + BoolType + // IntegerType type identifier for integer node + IntegerType + // FloatType type identifier for float node + FloatType + // InfinityType type identifier for infinity node + InfinityType + // NanType type identifier for nan node + NanType + // StringType type identifier for string node + StringType + // MergeKeyType type identifier for merge key node + MergeKeyType + // LiteralType type identifier for literal node + LiteralType + // MappingType type identifier for mapping node + MappingType + // MappingKeyType type identifier for mapping key node + MappingKeyType + // MappingValueType type identifier for mapping value node + MappingValueType + // SequenceType type identifier for sequence node + SequenceType + // AnchorType type identifier for anchor node + AnchorType + // AliasType type identifier for alias node + AliasType + // DirectiveType type identifier for directive node + DirectiveType + // TagType type identifier for tag node + TagType + // CommentType type identifier for comment node + CommentType +) + +// String node type identifier to text +func (t NodeType) String() string { + switch t { + case UnknownNodeType: + return "UnknownNode" + case DocumentType: + return "Document" + case NullType: + return "Null" + case BoolType: + return "Bool" + case IntegerType: + return "Integer" + case FloatType: + return "Float" + case InfinityType: + return "Infinity" + case NanType: + return "Nan" + case StringType: + return "String" + case MergeKeyType: + return "MergeKey" + case LiteralType: + return "Literal" + case MappingType: + return "Mapping" + case MappingKeyType: + return "MappingKey" + case MappingValueType: + return "MappingValue" + case SequenceType: + return "Sequence" + case AnchorType: + return "Anchor" + case AliasType: + return "Alias" + case DirectiveType: + return "Directive" + case TagType: + return "Tag" + case CommentType: + return "Comment" + } + return "" +} + +// Node type of node +type Node interface { + io.Reader + // String node to text + String() string + // GetToken returns token instance + GetToken() *token.Token + // Type returns type of node + Type() NodeType + // AddColumn add column number to child nodes recursively + AddColumn(int) + // SetComment set comment token to node + SetComment(*token.Token) error + // Comment returns comment token instance + GetComment() *token.Token + // already read length + readLen() int + // append read length + addReadLen(int) +} + +// ScalarNode type for scalar node +type ScalarNode interface { + Node + GetValue() interface{} +} + +type BaseNode struct { + Comment *token.Token + read int +} + +func (n *BaseNode) readLen() int { + return n.read +} + +func (n *BaseNode) addReadLen(len int) { + n.read += len +} + +// GetComment returns comment token instance +func (n *BaseNode) GetComment() *token.Token { + return n.Comment +} + +// SetComment set comment token +func (n *BaseNode) SetComment(tk *token.Token) error { + if tk.Type != token.CommentType { + return ErrInvalidTokenType + } + n.Comment = tk + return nil +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func readNode(p []byte, node Node) (int, error) { + s := node.String() + readLen := node.readLen() + remain := len(s) - readLen + if remain == 0 { + return 0, io.EOF + } + size := min(remain, len(p)) + for idx, b := range s[readLen : readLen+size] { + p[idx] = byte(b) + } + node.addReadLen(size) + return size, nil +} + +// Null create node for null value +func Null(tk *token.Token) Node { + return &NullNode{ + BaseNode: &BaseNode{}, + Token: tk, + } +} + +// Bool create node for boolean value +func Bool(tk *token.Token) Node { + b, _ := strconv.ParseBool(tk.Value) + return &BoolNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: b, + } +} + +// Integer create node for integer value +func Integer(tk *token.Token) Node { + value := removeUnderScoreFromNumber(tk.Value) + switch tk.Type { + case token.BinaryIntegerType: + // skip two characters because binary token starts with '0b' + skipCharacterNum := 2 + negativePrefix := "" + if value[0] == '-' { + skipCharacterNum++ + negativePrefix = "-" + } + if len(negativePrefix) > 0 { + i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 2, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + } + i, _ := strconv.ParseUint(negativePrefix+value[skipCharacterNum:], 2, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + case token.OctetIntegerType: + // octet token starts with '0o' or '-0o' or '0' or '-0' + skipCharacterNum := 1 + negativePrefix := "" + if value[0] == '-' { + skipCharacterNum++ + if value[2] == 'o' { + skipCharacterNum++ + } + negativePrefix = "-" + } else { + if value[1] == 'o' { + skipCharacterNum++ + } + } + if len(negativePrefix) > 0 { + i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 8, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + } + i, _ := strconv.ParseUint(value[skipCharacterNum:], 8, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + case token.HexIntegerType: + // hex token starts with '0x' or '-0x' + skipCharacterNum := 2 + negativePrefix := "" + if value[0] == '-' { + skipCharacterNum++ + negativePrefix = "-" + } + if len(negativePrefix) > 0 { + i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 16, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + } + i, _ := strconv.ParseUint(value[skipCharacterNum:], 16, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + } + if value[0] == '-' || value[0] == '+' { + i, _ := strconv.ParseInt(value, 10, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } + } + i, _ := strconv.ParseUint(value, 10, 64) + return &IntegerNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: i, + } +} + +// Float create node for float value +func Float(tk *token.Token) Node { + f, _ := strconv.ParseFloat(removeUnderScoreFromNumber(tk.Value), 64) + return &FloatNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: f, + } +} + +// Infinity create node for .inf or -.inf value +func Infinity(tk *token.Token) *InfinityNode { + node := &InfinityNode{ + BaseNode: &BaseNode{}, + Token: tk, + } + switch tk.Value { + case ".inf", ".Inf", ".INF": + node.Value = math.Inf(0) + case "-.inf", "-.Inf", "-.INF": + node.Value = math.Inf(-1) + } + return node +} + +// Nan create node for .nan value +func Nan(tk *token.Token) *NanNode { + return &NanNode{ + BaseNode: &BaseNode{}, + Token: tk, + } +} + +// String create node for string value +func String(tk *token.Token) *StringNode { + return &StringNode{ + BaseNode: &BaseNode{}, + Token: tk, + Value: tk.Value, + } +} + +// Comment create node for comment +func Comment(tk *token.Token) *CommentNode { + return &CommentNode{ + BaseNode: &BaseNode{Comment: tk}, + } +} + +// MergeKey create node for merge key ( << ) +func MergeKey(tk *token.Token) *MergeKeyNode { + return &MergeKeyNode{ + BaseNode: &BaseNode{}, + Token: tk, + } +} + +// Mapping create node for map +func Mapping(tk *token.Token, isFlowStyle bool, values ...*MappingValueNode) *MappingNode { + node := &MappingNode{ + BaseNode: &BaseNode{}, + Start: tk, + IsFlowStyle: isFlowStyle, + Values: []*MappingValueNode{}, + } + node.Values = append(node.Values, values...) + return node +} + +// MappingValue create node for mapping value +func MappingValue(tk *token.Token, key Node, value Node) *MappingValueNode { + return &MappingValueNode{ + BaseNode: &BaseNode{}, + Start: tk, + Key: key, + Value: value, + } +} + +// MappingKey create node for map key ( '?' ). +func MappingKey(tk *token.Token) *MappingKeyNode { + return &MappingKeyNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +// Sequence create node for sequence +func Sequence(tk *token.Token, isFlowStyle bool) *SequenceNode { + return &SequenceNode{ + BaseNode: &BaseNode{}, + Start: tk, + IsFlowStyle: isFlowStyle, + Values: []Node{}, + } +} + +func Anchor(tk *token.Token) *AnchorNode { + return &AnchorNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +func Alias(tk *token.Token) *AliasNode { + return &AliasNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +func Document(tk *token.Token, body Node) *DocumentNode { + return &DocumentNode{ + BaseNode: &BaseNode{}, + Start: tk, + Body: body, + } +} + +func Directive(tk *token.Token) *DirectiveNode { + return &DirectiveNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +func Literal(tk *token.Token) *LiteralNode { + return &LiteralNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +func Tag(tk *token.Token) *TagNode { + return &TagNode{ + BaseNode: &BaseNode{}, + Start: tk, + } +} + +// File contains all documents in YAML file +type File struct { + Name string + Docs []*DocumentNode +} + +// Read implements (io.Reader).Read +func (f *File) Read(p []byte) (int, error) { + for _, doc := range f.Docs { + n, err := doc.Read(p) + if err == io.EOF { + continue + } + return n, nil + } + return 0, io.EOF +} + +// String all documents to text +func (f *File) String() string { + docs := []string{} + for _, doc := range f.Docs { + docs = append(docs, doc.String()) + } + return strings.Join(docs, "\n") +} + +// DocumentNode type of Document +type DocumentNode struct { + *BaseNode + Start *token.Token // position of DocumentHeader ( `---` ) + End *token.Token // position of DocumentEnd ( `...` ) + Body Node +} + +// Read implements (io.Reader).Read +func (d *DocumentNode) Read(p []byte) (int, error) { + return readNode(p, d) +} + +// Type returns DocumentNodeType +func (d *DocumentNode) Type() NodeType { return DocumentType } + +// GetToken returns token instance +func (d *DocumentNode) GetToken() *token.Token { + return d.Body.GetToken() +} + +// AddColumn add column number to child nodes recursively +func (d *DocumentNode) AddColumn(col int) { + if d.Body != nil { + d.Body.AddColumn(col) + } +} + +// String document to text +func (d *DocumentNode) String() string { + doc := []string{} + if d.Start != nil { + doc = append(doc, d.Start.Value) + } + doc = append(doc, d.Body.String()) + if d.End != nil { + doc = append(doc, d.End.Value) + } + return strings.Join(doc, "\n") +} + +func removeUnderScoreFromNumber(num string) string { + return strings.ReplaceAll(num, "_", "") +} + +// NullNode type of null node +type NullNode struct { + *BaseNode + Comment *token.Token // position of Comment ( `#comment` ) + Token *token.Token +} + +// Read implements (io.Reader).Read +func (n *NullNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns NullType +func (n *NullNode) Type() NodeType { return NullType } + +// GetToken returns token instance +func (n *NullNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *NullNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// SetComment set comment token +func (n *NullNode) SetComment(tk *token.Token) error { + if tk.Type != token.CommentType { + return ErrInvalidTokenType + } + n.Comment = tk + return nil +} + +// GetValue returns nil value +func (n *NullNode) GetValue() interface{} { + return nil +} + +// String returns `null` text +func (n *NullNode) String() string { + return "null" +} + +// IntegerNode type of integer node +type IntegerNode struct { + *BaseNode + Token *token.Token + Value interface{} // int64 or uint64 value +} + +// Read implements (io.Reader).Read +func (n *IntegerNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns IntegerType +func (n *IntegerNode) Type() NodeType { return IntegerType } + +// GetToken returns token instance +func (n *IntegerNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *IntegerNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns int64 value +func (n *IntegerNode) GetValue() interface{} { + return n.Value +} + +// String int64 to text +func (n *IntegerNode) String() string { + return n.Token.Value +} + +// FloatNode type of float node +type FloatNode struct { + *BaseNode + Token *token.Token + Precision int + Value float64 +} + +// Read implements (io.Reader).Read +func (n *FloatNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns FloatType +func (n *FloatNode) Type() NodeType { return FloatType } + +// GetToken returns token instance +func (n *FloatNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *FloatNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns float64 value +func (n *FloatNode) GetValue() interface{} { + return n.Value +} + +// String float64 to text +func (n *FloatNode) String() string { + return n.Token.Value +} + +// StringNode type of string node +type StringNode struct { + *BaseNode + Token *token.Token + Value string +} + +// Read implements (io.Reader).Read +func (n *StringNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns StringType +func (n *StringNode) Type() NodeType { return StringType } + +// GetToken returns token instance +func (n *StringNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *StringNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns string value +func (n *StringNode) GetValue() interface{} { + return n.Value +} + +// String string value to text with quote or literal header if required +func (n *StringNode) String() string { + switch n.Token.Type { + case token.SingleQuoteType: + return fmt.Sprintf(`'%s'`, n.Value) + case token.DoubleQuoteType: + return strconv.Quote(n.Value) + } + + lbc := token.DetectLineBreakCharacter(n.Value) + if strings.Contains(n.Value, lbc) { + // This block assumes that the line breaks in this inside scalar content and the Outside scalar content are the same. + // It works mostly, but inconsistencies occur if line break characters are mixed. + header := token.LiteralBlockHeader(n.Value) + space := strings.Repeat(" ", n.Token.Position.Column-1) + values := []string{} + for _, v := range strings.Split(n.Value, lbc) { + values = append(values, fmt.Sprintf("%s %s", space, v)) + } + block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s %s", lbc, space)), fmt.Sprintf(" %s", space)) + return fmt.Sprintf("%s%s%s", header, lbc, block) + } else if len(n.Value) > 0 && (n.Value[0] == '{' || n.Value[0] == '[') { + return fmt.Sprintf(`'%s'`, n.Value) + } + return n.Value +} + +// LiteralNode type of literal node +type LiteralNode struct { + *BaseNode + Start *token.Token + Value *StringNode +} + +// Read implements (io.Reader).Read +func (n *LiteralNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns LiteralType +func (n *LiteralNode) Type() NodeType { return LiteralType } + +// GetToken returns token instance +func (n *LiteralNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *LiteralNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// GetValue returns string value +func (n *LiteralNode) GetValue() interface{} { + return n.String() +} + +// String literal to text +func (n *LiteralNode) String() string { + origin := n.Value.GetToken().Origin + return fmt.Sprintf("%s\n%s", n.Start.Value, strings.TrimRight(strings.TrimRight(origin, " "), "\n")) +} + +// MergeKeyNode type of merge key node +type MergeKeyNode struct { + *BaseNode + Token *token.Token +} + +// Read implements (io.Reader).Read +func (n *MergeKeyNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns MergeKeyType +func (n *MergeKeyNode) Type() NodeType { return MergeKeyType } + +// GetToken returns token instance +func (n *MergeKeyNode) GetToken() *token.Token { + return n.Token +} + +// GetValue returns '<<' value +func (n *MergeKeyNode) GetValue() interface{} { + return n.Token.Value +} + +// String returns '<<' value +func (n *MergeKeyNode) String() string { + return n.Token.Value +} + +// AddColumn add column number to child nodes recursively +func (n *MergeKeyNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// BoolNode type of boolean node +type BoolNode struct { + *BaseNode + Token *token.Token + Value bool +} + +// Read implements (io.Reader).Read +func (n *BoolNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns BoolType +func (n *BoolNode) Type() NodeType { return BoolType } + +// GetToken returns token instance +func (n *BoolNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *BoolNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns boolean value +func (n *BoolNode) GetValue() interface{} { + return n.Value +} + +// String boolean to text +func (n *BoolNode) String() string { + return n.Token.Value +} + +// InfinityNode type of infinity node +type InfinityNode struct { + *BaseNode + Token *token.Token + Value float64 +} + +// Read implements (io.Reader).Read +func (n *InfinityNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns InfinityType +func (n *InfinityNode) Type() NodeType { return InfinityType } + +// GetToken returns token instance +func (n *InfinityNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *InfinityNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns math.Inf(0) or math.Inf(-1) +func (n *InfinityNode) GetValue() interface{} { + return n.Value +} + +// String infinity to text +func (n *InfinityNode) String() string { + return n.Token.Value +} + +// NanNode type of nan node +type NanNode struct { + *BaseNode + Token *token.Token +} + +// Read implements (io.Reader).Read +func (n *NanNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns NanType +func (n *NanNode) Type() NodeType { return NanType } + +// GetToken returns token instance +func (n *NanNode) GetToken() *token.Token { + return n.Token +} + +// AddColumn add column number to child nodes recursively +func (n *NanNode) AddColumn(col int) { + n.Token.AddColumn(col) +} + +// GetValue returns math.NaN() +func (n *NanNode) GetValue() interface{} { + return math.NaN() +} + +// String returns .nan +func (n *NanNode) String() string { + return n.Token.Value +} + +// MapNode interface of MappingValueNode / MappingNode +type MapNode interface { + MapRange() *MapNodeIter +} + +// MapNodeIter is an iterator for ranging over a MapNode +type MapNodeIter struct { + values []*MappingValueNode + idx int +} + +const ( + startRangeIndex = -1 +) + +// Next advances the map iterator and reports whether there is another entry. +// It returns false when the iterator is exhausted. +func (m *MapNodeIter) Next() bool { + m.idx++ + next := m.idx < len(m.values) + return next +} + +// Key returns the key of the iterator's current map node entry. +func (m *MapNodeIter) Key() Node { + return m.values[m.idx].Key +} + +// Value returns the value of the iterator's current map node entry. +func (m *MapNodeIter) Value() Node { + return m.values[m.idx].Value +} + +// MappingNode type of mapping node +type MappingNode struct { + *BaseNode + Start *token.Token + End *token.Token + IsFlowStyle bool + Values []*MappingValueNode +} + +func (n *MappingNode) startPos() *token.Position { + if len(n.Values) == 0 { + return n.Start.Position + } + return n.Values[0].Key.GetToken().Position +} + +// Merge merge key/value of map. +func (n *MappingNode) Merge(target *MappingNode) { + keyToMapValueMap := map[string]*MappingValueNode{} + for _, value := range n.Values { + key := value.Key.String() + keyToMapValueMap[key] = value + } + column := n.startPos().Column - target.startPos().Column + target.AddColumn(column) + for _, value := range target.Values { + mapValue, exists := keyToMapValueMap[value.Key.String()] + if exists { + mapValue.Value = value.Value + } else { + n.Values = append(n.Values, value) + } + } +} + +// Read implements (io.Reader).Read +func (n *MappingNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns MappingType +func (n *MappingNode) Type() NodeType { return MappingType } + +// GetToken returns token instance +func (n *MappingNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *MappingNode) AddColumn(col int) { + n.Start.AddColumn(col) + n.End.AddColumn(col) + for _, value := range n.Values { + value.AddColumn(col) + } +} + +func (n *MappingNode) flowStyleString() string { + if len(n.Values) == 0 { + return "{}" + } + values := []string{} + for _, value := range n.Values { + values = append(values, strings.TrimLeft(value.String(), " ")) + } + return fmt.Sprintf("{%s}", strings.Join(values, ", ")) +} + +func (n *MappingNode) blockStyleString() string { + if len(n.Values) == 0 { + return "{}" + } + values := []string{} + for _, value := range n.Values { + values = append(values, value.String()) + } + return strings.Join(values, "\n") +} + +// String mapping values to text +func (n *MappingNode) String() string { + if n.IsFlowStyle || len(n.Values) == 0 { + return n.flowStyleString() + } + return n.blockStyleString() +} + +// MapRange implements MapNode protocol +func (n *MappingNode) MapRange() *MapNodeIter { + return &MapNodeIter{ + idx: startRangeIndex, + values: n.Values, + } +} + +// MappingKeyNode type of tag node +type MappingKeyNode struct { + *BaseNode + Start *token.Token + Value Node +} + +// Read implements (io.Reader).Read +func (n *MappingKeyNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns MappingKeyType +func (n *MappingKeyNode) Type() NodeType { return MappingKeyType } + +// GetToken returns token instance +func (n *MappingKeyNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *MappingKeyNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String tag to text +func (n *MappingKeyNode) String() string { + return fmt.Sprintf("%s %s", n.Start.Value, n.Value.String()) +} + +// MappingValueNode type of mapping value +type MappingValueNode struct { + *BaseNode + Start *token.Token + Key Node + Value Node +} + +// Replace replace value node. +func (n *MappingValueNode) Replace(value Node) error { + column := n.Value.GetToken().Position.Column - value.GetToken().Position.Column + value.AddColumn(column) + n.Value = value + return nil +} + +// Read implements (io.Reader).Read +func (n *MappingValueNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns MappingValueType +func (n *MappingValueNode) Type() NodeType { return MappingValueType } + +// GetToken returns token instance +func (n *MappingValueNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *MappingValueNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Key != nil { + n.Key.AddColumn(col) + } + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String mapping value to text +func (n *MappingValueNode) String() string { + space := strings.Repeat(" ", n.Key.GetToken().Position.Column-1) + keyIndentLevel := n.Key.GetToken().Position.IndentLevel + valueIndentLevel := n.Value.GetToken().Position.IndentLevel + if _, ok := n.Value.(ScalarNode); ok { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if keyIndentLevel < valueIndentLevel { + return fmt.Sprintf("%s%s:\n%s", space, n.Key.String(), n.Value.String()) + } else if m, ok := n.Value.(*MappingNode); ok && (m.IsFlowStyle || len(m.Values) == 0) { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if s, ok := n.Value.(*SequenceNode); ok && (s.IsFlowStyle || len(s.Values) == 0) { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if _, ok := n.Value.(*AnchorNode); ok { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if _, ok := n.Value.(*AliasNode); ok { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } + return fmt.Sprintf("%s%s:\n%s", space, n.Key.String(), n.Value.String()) +} + +// MapRange implements MapNode protocol +func (n *MappingValueNode) MapRange() *MapNodeIter { + return &MapNodeIter{ + idx: startRangeIndex, + values: []*MappingValueNode{n}, + } +} + +// ArrayNode interface of SequenceNode +type ArrayNode interface { + ArrayRange() *ArrayNodeIter +} + +// ArrayNodeIter is an iterator for ranging over a ArrayNode +type ArrayNodeIter struct { + values []Node + idx int +} + +// Next advances the array iterator and reports whether there is another entry. +// It returns false when the iterator is exhausted. +func (m *ArrayNodeIter) Next() bool { + m.idx++ + next := m.idx < len(m.values) + return next +} + +// Value returns the value of the iterator's current array entry. +func (m *ArrayNodeIter) Value() Node { + return m.values[m.idx] +} + +// Len returns length of array +func (m *ArrayNodeIter) Len() int { + return len(m.values) +} + +// SequenceNode type of sequence node +type SequenceNode struct { + *BaseNode + Start *token.Token + End *token.Token + IsFlowStyle bool + Values []Node +} + +// Replace replace value node. +func (n *SequenceNode) Replace(idx int, value Node) error { + if len(n.Values) <= idx { + return xerrors.Errorf( + "invalid index for sequence: sequence length is %d, but specified %d index", + len(n.Values), idx, + ) + } + column := n.Values[idx].GetToken().Position.Column - value.GetToken().Position.Column + value.AddColumn(column) + n.Values[idx] = value + return nil +} + +// Merge merge sequence value. +func (n *SequenceNode) Merge(target *SequenceNode) { + column := n.Start.Position.Column - target.Start.Position.Column + target.AddColumn(column) + for _, value := range target.Values { + n.Values = append(n.Values, value) + } +} + +// Read implements (io.Reader).Read +func (n *SequenceNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns SequenceType +func (n *SequenceNode) Type() NodeType { return SequenceType } + +// GetToken returns token instance +func (n *SequenceNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *SequenceNode) AddColumn(col int) { + n.Start.AddColumn(col) + n.End.AddColumn(col) + for _, value := range n.Values { + value.AddColumn(col) + } +} + +func (n *SequenceNode) flowStyleString() string { + values := []string{} + for _, value := range n.Values { + values = append(values, value.String()) + } + return fmt.Sprintf("[%s]", strings.Join(values, ", ")) +} + +func (n *SequenceNode) blockStyleString() string { + space := strings.Repeat(" ", n.Start.Position.Column-1) + values := []string{} + for _, value := range n.Values { + valueStr := value.String() + splittedValues := strings.Split(valueStr, "\n") + trimmedFirstValue := strings.TrimLeft(splittedValues[0], " ") + diffLength := len(splittedValues[0]) - len(trimmedFirstValue) + newValues := []string{trimmedFirstValue} + for i := 1; i < len(splittedValues); i++ { + if len(splittedValues[i]) <= diffLength { + // this line is \n or white space only + newValues = append(newValues, "") + continue + } + trimmed := splittedValues[i][diffLength:] + newValues = append(newValues, fmt.Sprintf("%s %s", space, trimmed)) + } + newValue := strings.Join(newValues, "\n") + values = append(values, fmt.Sprintf("%s- %s", space, newValue)) + } + return strings.Join(values, "\n") +} + +// String sequence to text +func (n *SequenceNode) String() string { + if n.IsFlowStyle || len(n.Values) == 0 { + return n.flowStyleString() + } + return n.blockStyleString() +} + +// ArrayRange implements ArrayNode protocol +func (n *SequenceNode) ArrayRange() *ArrayNodeIter { + return &ArrayNodeIter{ + idx: startRangeIndex, + values: n.Values, + } +} + +// AnchorNode type of anchor node +type AnchorNode struct { + *BaseNode + Start *token.Token + Name Node + Value Node +} + +func (n *AnchorNode) SetName(name string) error { + if n.Name == nil { + return ErrInvalidAnchorName + } + s, ok := n.Name.(*StringNode) + if !ok { + return ErrInvalidAnchorName + } + s.Value = name + return nil +} + +// Read implements (io.Reader).Read +func (n *AnchorNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns AnchorType +func (n *AnchorNode) Type() NodeType { return AnchorType } + +// GetToken returns token instance +func (n *AnchorNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *AnchorNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Name != nil { + n.Name.AddColumn(col) + } + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String anchor to text +func (n *AnchorNode) String() string { + value := n.Value.String() + if len(strings.Split(value, "\n")) > 1 { + return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + } else if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { + return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + } else if m, ok := n.Value.(*MappingNode); ok && !m.IsFlowStyle { + return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + } + return fmt.Sprintf("&%s %s", n.Name.String(), value) +} + +// AliasNode type of alias node +type AliasNode struct { + *BaseNode + Start *token.Token + Value Node +} + +func (n *AliasNode) SetName(name string) error { + if n.Value == nil { + return ErrInvalidAliasName + } + s, ok := n.Value.(*StringNode) + if !ok { + return ErrInvalidAliasName + } + s.Value = name + return nil +} + +// Read implements (io.Reader).Read +func (n *AliasNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns AliasType +func (n *AliasNode) Type() NodeType { return AliasType } + +// GetToken returns token instance +func (n *AliasNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *AliasNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String alias to text +func (n *AliasNode) String() string { + return fmt.Sprintf("*%s", n.Value.String()) +} + +// DirectiveNode type of directive node +type DirectiveNode struct { + *BaseNode + Start *token.Token + Value Node +} + +// Read implements (io.Reader).Read +func (n *DirectiveNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns DirectiveType +func (n *DirectiveNode) Type() NodeType { return DirectiveType } + +// GetToken returns token instance +func (n *DirectiveNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *DirectiveNode) AddColumn(col int) { + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String directive to text +func (n *DirectiveNode) String() string { + return fmt.Sprintf("%s%s", n.Start.Value, n.Value.String()) +} + +// TagNode type of tag node +type TagNode struct { + *BaseNode + Start *token.Token + Value Node +} + +// Read implements (io.Reader).Read +func (n *TagNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns TagType +func (n *TagNode) Type() NodeType { return TagType } + +// GetToken returns token instance +func (n *TagNode) GetToken() *token.Token { + return n.Start +} + +// AddColumn add column number to child nodes recursively +func (n *TagNode) AddColumn(col int) { + n.Start.AddColumn(col) + if n.Value != nil { + n.Value.AddColumn(col) + } +} + +// String tag to text +func (n *TagNode) String() string { + return fmt.Sprintf("%s %s", n.Start.Value, n.Value.String()) +} + +// CommentNode type of comment node +type CommentNode struct { + *BaseNode +} + +// Read implements (io.Reader).Read +func (n *CommentNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// Type returns TagType +func (n *CommentNode) Type() NodeType { return CommentType } + +// GetToken returns token instance +func (n *CommentNode) GetToken() *token.Token { return n.Comment } + +// AddColumn add column number to child nodes recursively +func (n *CommentNode) AddColumn(col int) { + n.Comment.AddColumn(col) +} + +// String comment to text +func (n *CommentNode) String() string { + return n.Comment.Value +} + +// Visitor has Visit method that is invokded for each node encountered by Walk. +// If the result visitor w is not nil, Walk visits each of the children of node with the visitor w, +// followed by a call of w.Visit(nil). +type Visitor interface { + Visit(Node) Visitor +} + +// Walk traverses an AST in depth-first order: It starts by calling v.Visit(node); node must not be nil. +// If the visitor w returned by v.Visit(node) is not nil, +// Walk is invoked recursively with visitor w for each of the non-nil children of node, +// followed by a call of w.Visit(nil). +func Walk(v Visitor, node Node) { + if v = v.Visit(node); v == nil { + return + } + + switch n := node.(type) { + case *NullNode: + case *IntegerNode: + case *FloatNode: + case *StringNode: + case *MergeKeyNode: + case *BoolNode: + case *InfinityNode: + case *NanNode: + case *TagNode: + Walk(v, n.Value) + case *DocumentNode: + Walk(v, n.Body) + case *MappingNode: + for _, value := range n.Values { + Walk(v, value) + } + case *MappingKeyNode: + Walk(v, n.Value) + case *MappingValueNode: + Walk(v, n.Key) + Walk(v, n.Value) + case *SequenceNode: + for _, value := range n.Values { + Walk(v, value) + } + case *AnchorNode: + Walk(v, n.Name) + Walk(v, n.Value) + case *AliasNode: + Walk(v, n.Value) + } +} + +type filterWalker struct { + typ NodeType + results []Node +} + +func (v *filterWalker) Visit(n Node) Visitor { + if v.typ == n.Type() { + v.results = append(v.results, n) + } + return v +} + +// Filter returns a list of nodes that match the given type. +func Filter(typ NodeType, node Node) []Node { + walker := &filterWalker{typ: typ} + Walk(walker, node) + return walker.results +} + +// FilterFile returns a list of nodes that match the given type. +func FilterFile(typ NodeType, file *File) []Node { + results := []Node{} + for _, doc := range file.Docs { + walker := &filterWalker{typ: typ} + Walk(walker, doc) + results = append(results, walker.results...) + } + return results +} + +type ErrInvalidMergeType struct { + dst Node + src Node +} + +func (e *ErrInvalidMergeType) Error() string { + return fmt.Sprintf("cannot merge %s into %s", e.src.Type(), e.dst.Type()) +} + +// Merge merge document, map, sequence node. +func Merge(dst Node, src Node) error { + if doc, ok := src.(*DocumentNode); ok { + src = doc.Body + } + err := &ErrInvalidMergeType{dst: dst, src: src} + switch dst.Type() { + case DocumentType: + node := dst.(*DocumentNode) + return Merge(node.Body, src) + case MappingType: + node := dst.(*MappingNode) + target, ok := src.(*MappingNode) + if !ok { + return err + } + node.Merge(target) + return nil + case SequenceType: + node := dst.(*SequenceNode) + target, ok := src.(*SequenceNode) + if !ok { + return err + } + node.Merge(target) + return nil + } + return err +} diff --git a/vendor/github.com/goccy/go-yaml/lexer/lexer.go b/vendor/github.com/goccy/go-yaml/lexer/lexer.go new file mode 100644 index 000000000..3207f4f22 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/lexer/lexer.go @@ -0,0 +1,23 @@ +package lexer + +import ( + "io" + + "github.com/goccy/go-yaml/scanner" + "github.com/goccy/go-yaml/token" +) + +// Tokenize split to token instances from string +func Tokenize(src string) token.Tokens { + var s scanner.Scanner + s.Init(src) + var tokens token.Tokens + for { + subTokens, err := s.Scan() + if err == io.EOF { + break + } + tokens.Add(subTokens...) + } + return tokens +} diff --git a/vendor/github.com/goccy/go-yaml/printer/printer.go b/vendor/github.com/goccy/go-yaml/printer/printer.go new file mode 100644 index 000000000..bc3d7232e --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/printer/printer.go @@ -0,0 +1,368 @@ +package printer + +import ( + "fmt" + "math" + "strings" + + "github.com/fatih/color" + "github.com/goccy/go-yaml/ast" + "github.com/goccy/go-yaml/token" +) + +// Property additional property set for each the token +type Property struct { + Prefix string + Suffix string +} + +// PrintFunc returns property instance +type PrintFunc func() *Property + +// Printer create text from token collection or ast +type Printer struct { + LineNumber bool + LineNumberFormat func(num int) string + MapKey PrintFunc + Anchor PrintFunc + Alias PrintFunc + Bool PrintFunc + String PrintFunc + Number PrintFunc +} + +func defaultLineNumberFormat(num int) string { + return fmt.Sprintf("%2d | ", num) +} + +func (p *Printer) property(tk *token.Token) *Property { + prop := &Property{} + switch tk.PreviousType() { + case token.AnchorType: + if p.Anchor != nil { + return p.Anchor() + } + return prop + case token.AliasType: + if p.Alias != nil { + return p.Alias() + } + return prop + } + switch tk.NextType() { + case token.MappingValueType: + if p.MapKey != nil { + return p.MapKey() + } + return prop + } + switch tk.Type { + case token.BoolType: + if p.Bool != nil { + return p.Bool() + } + return prop + case token.AnchorType: + if p.Anchor != nil { + return p.Anchor() + } + return prop + case token.AliasType: + if p.Anchor != nil { + return p.Alias() + } + return prop + case token.StringType, token.SingleQuoteType, token.DoubleQuoteType: + if p.String != nil { + return p.String() + } + return prop + case token.IntegerType, token.FloatType: + if p.Number != nil { + return p.Number() + } + return prop + default: + } + return prop +} + +// PrintTokens create text from token collection +func (p *Printer) PrintTokens(tokens token.Tokens) string { + if len(tokens) == 0 { + return "" + } + if p.LineNumber { + if p.LineNumberFormat == nil { + p.LineNumberFormat = defaultLineNumberFormat + } + } + texts := []string{} + lineNumber := tokens[0].Position.Line + for _, tk := range tokens { + lines := strings.Split(tk.Origin, "\n") + prop := p.property(tk) + header := "" + if p.LineNumber { + header = p.LineNumberFormat(lineNumber) + } + if len(lines) == 1 { + line := prop.Prefix + lines[0] + prop.Suffix + if len(texts) == 0 { + texts = append(texts, header+line) + lineNumber++ + } else { + text := texts[len(texts)-1] + texts[len(texts)-1] = text + line + } + } else { + for idx, src := range lines { + if p.LineNumber { + header = p.LineNumberFormat(lineNumber) + } + line := prop.Prefix + src + prop.Suffix + if idx == 0 { + if len(texts) == 0 { + texts = append(texts, header+line) + lineNumber++ + } else { + text := texts[len(texts)-1] + texts[len(texts)-1] = text + line + } + } else { + texts = append(texts, fmt.Sprintf("%s%s", header, line)) + lineNumber++ + } + } + } + } + return strings.Join(texts, "\n") +} + +// PrintNode create text from ast.Node +func (p *Printer) PrintNode(node ast.Node) []byte { + return []byte(fmt.Sprintf("%+v\n", node)) +} + +const escape = "\x1b" + +func format(attr color.Attribute) string { + return fmt.Sprintf("%s[%dm", escape, attr) +} + +func (p *Printer) setDefaultColorSet() { + p.Bool = func() *Property { + return &Property{ + Prefix: format(color.FgHiMagenta), + Suffix: format(color.Reset), + } + } + p.Number = func() *Property { + return &Property{ + Prefix: format(color.FgHiMagenta), + Suffix: format(color.Reset), + } + } + p.MapKey = func() *Property { + return &Property{ + Prefix: format(color.FgHiCyan), + Suffix: format(color.Reset), + } + } + p.Anchor = func() *Property { + return &Property{ + Prefix: format(color.FgHiYellow), + Suffix: format(color.Reset), + } + } + p.Alias = func() *Property { + return &Property{ + Prefix: format(color.FgHiYellow), + Suffix: format(color.Reset), + } + } + p.String = func() *Property { + return &Property{ + Prefix: format(color.FgHiGreen), + Suffix: format(color.Reset), + } + } +} + +func (p *Printer) PrintErrorMessage(msg string, isColored bool) string { + if isColored { + return fmt.Sprintf("%s%s%s", + format(color.FgHiRed), + msg, + format(color.Reset), + ) + } + return msg +} + +func (p *Printer) removeLeftSideNewLineChar(src string) string { + return strings.TrimLeft(strings.TrimLeft(strings.TrimLeft(src, "\r"), "\n"), "\r\n") +} + +func (p *Printer) removeRightSideNewLineChar(src string) string { + return strings.TrimRight(strings.TrimRight(strings.TrimRight(src, "\r"), "\n"), "\r\n") +} + +func (p *Printer) removeRightSideWhiteSpaceChar(src string) string { + return p.removeRightSideNewLineChar(strings.TrimRight(src, " ")) +} + +func (p *Printer) newLineCount(s string) int { + src := []rune(s) + size := len(src) + cnt := 0 + for i := 0; i < size; i++ { + c := src[i] + switch c { + case '\r': + if i+1 < size && src[i+1] == '\n' { + i++ + } + cnt++ + case '\n': + cnt++ + } + } + return cnt +} + +func (p *Printer) isNewLineLastChar(s string) bool { + for i := len(s) - 1; i > 0; i-- { + c := s[i] + switch c { + case ' ': + continue + case '\n', '\r': + return true + } + break + } + return false +} + +func (p *Printer) printBeforeTokens(tk *token.Token, minLine, extLine int) token.Tokens { + for { + if tk.Prev == nil { + break + } + if tk.Prev.Position.Line < minLine { + break + } + tk = tk.Prev + } + minTk := tk.Clone() + if minTk.Prev != nil { + // add white spaces to minTk by prev token + prev := minTk.Prev + whiteSpaceLen := len(prev.Origin) - len(strings.TrimRight(prev.Origin, " ")) + minTk.Origin = strings.Repeat(" ", whiteSpaceLen) + minTk.Origin + } + minTk.Origin = p.removeLeftSideNewLineChar(minTk.Origin) + tokens := token.Tokens{minTk} + tk = minTk.Next + for tk != nil && tk.Position.Line <= extLine { + clonedTk := tk.Clone() + tokens.Add(clonedTk) + tk = clonedTk.Next + } + lastTk := tokens[len(tokens)-1] + trimmedOrigin := p.removeRightSideWhiteSpaceChar(lastTk.Origin) + suffix := lastTk.Origin[len(trimmedOrigin):] + lastTk.Origin = trimmedOrigin + + if lastTk.Next != nil && len(suffix) > 1 { + next := lastTk.Next.Clone() + // add suffix to header of next token + if suffix[0] == '\n' || suffix[0] == '\r' { + suffix = suffix[1:] + } + next.Origin = suffix + next.Origin + lastTk.Next = next + } + return tokens +} + +func (p *Printer) addNewLineCharIfDocumentHeader(tk *token.Token) { + if tk.Prev == nil { + return + } + if tk.Type != token.DocumentHeaderType { + return + } + prev := tk.Prev + lineDiff := tk.Position.Line - prev.Position.Line + if p.isNewLineLastChar(prev.Origin) { + lineDiff-- + } + tk.Origin = strings.Repeat("\n", lineDiff) + tk.Origin +} + +func (p *Printer) printAfterTokens(tk *token.Token, maxLine int) token.Tokens { + tokens := token.Tokens{} + if tk == nil { + return tokens + } + if tk.Position.Line > maxLine { + return tokens + } + minTk := tk.Clone() + minTk.Origin = p.removeLeftSideNewLineChar(minTk.Origin) + tokens.Add(minTk) + tk = minTk.Next + for tk != nil && tk.Position.Line <= maxLine { + clonedTk := tk.Clone() + p.addNewLineCharIfDocumentHeader(clonedTk) + tokens.Add(clonedTk) + tk = clonedTk.Next + } + return tokens +} + +func (p *Printer) setupErrorTokenFormat(annotateLine int, isColored bool) { + prefix := func(annotateLine, num int) string { + if annotateLine == num { + return fmt.Sprintf("> %2d | ", num) + } + return fmt.Sprintf(" %2d | ", num) + } + p.LineNumber = true + p.LineNumberFormat = func(num int) string { + if isColored { + fn := color.New(color.Bold, color.FgHiWhite).SprintFunc() + return fn(prefix(annotateLine, num)) + } + return prefix(annotateLine, num) + } + if isColored { + p.setDefaultColorSet() + } +} + +func (p *Printer) PrintErrorToken(tk *token.Token, isColored bool) string { + errToken := tk + curLine := tk.Position.Line + curExtLine := curLine + p.newLineCount(p.removeLeftSideNewLineChar(tk.Origin)) + if p.isNewLineLastChar(tk.Origin) { + // if last character ( exclude white space ) is new line character, ignore it. + curExtLine-- + } + + minLine := int(math.Max(float64(curLine-3), 1)) + maxLine := curExtLine + 3 + p.setupErrorTokenFormat(curLine, isColored) + + beforeTokens := p.printBeforeTokens(tk, minLine, curExtLine) + lastTk := beforeTokens[len(beforeTokens)-1] + afterTokens := p.printAfterTokens(lastTk.Next, maxLine) + + beforeSource := p.PrintTokens(beforeTokens) + prefixSpaceNum := len(fmt.Sprintf(" %2d | ", curLine)) + annotateLine := strings.Repeat(" ", prefixSpaceNum+errToken.Position.Column-1) + "^" + afterSource := p.PrintTokens(afterTokens) + return fmt.Sprintf("%s\n%s\n%s", beforeSource, annotateLine, afterSource) +} diff --git a/vendor/github.com/goccy/go-yaml/scanner/context.go b/vendor/github.com/goccy/go-yaml/scanner/context.go new file mode 100644 index 000000000..e629a5c2a --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/scanner/context.go @@ -0,0 +1,201 @@ +package scanner + +import ( + "sync" + + "github.com/goccy/go-yaml/token" +) + +// Context context at scanning +type Context struct { + idx int + size int + notSpaceCharPos int + notSpaceOrgCharPos int + src []rune + buf []rune + obuf []rune + tokens token.Tokens + isRawFolded bool + isLiteral bool + isFolded bool + isSingleLine bool + literalOpt string +} + +var ( + ctxPool = sync.Pool{ + New: func() interface{} { + return createContext() + }, + } +) + +func createContext() *Context { + return &Context{ + idx: 0, + tokens: token.Tokens{}, + isSingleLine: true, + } +} + +func newContext(src []rune) *Context { + ctx := ctxPool.Get().(*Context) + ctx.reset(src) + return ctx +} + +func (c *Context) release() { + ctxPool.Put(c) +} + +func (c *Context) reset(src []rune) { + c.idx = 0 + c.size = len(src) + c.src = src + c.tokens = c.tokens[:0] + c.resetBuffer() + c.isSingleLine = true +} + +func (c *Context) resetBuffer() { + c.buf = c.buf[:0] + c.obuf = c.obuf[:0] + c.notSpaceCharPos = 0 + c.notSpaceOrgCharPos = 0 +} + +func (c *Context) isSaveIndentMode() bool { + return c.isLiteral || c.isFolded || c.isRawFolded +} + +func (c *Context) breakLiteral() { + c.isLiteral = false + c.isRawFolded = false + c.isFolded = false + c.literalOpt = "" +} + +func (c *Context) addToken(tk *token.Token) { + if tk == nil { + return + } + c.tokens = append(c.tokens, tk) +} + +func (c *Context) addBuf(r rune) { + if len(c.buf) == 0 && r == ' ' { + return + } + c.buf = append(c.buf, r) + if r != ' ' && r != '\t' { + c.notSpaceCharPos = len(c.buf) + } +} + +func (c *Context) addOriginBuf(r rune) { + c.obuf = append(c.obuf, r) + if r != ' ' && r != '\t' { + c.notSpaceOrgCharPos = len(c.obuf) + } +} + +func (c *Context) removeRightSpaceFromBuf() int { + trimmedBuf := c.obuf[:c.notSpaceOrgCharPos] + buflen := len(trimmedBuf) + diff := len(c.obuf) - buflen + if diff > 0 { + c.obuf = c.obuf[:buflen] + c.buf = c.bufferedSrc() + } + return diff +} + +func (c *Context) isDocument() bool { + return c.isLiteral || c.isFolded || c.isRawFolded +} + +func (c *Context) isEOS() bool { + return len(c.src)-1 <= c.idx +} + +func (c *Context) isNextEOS() bool { + return len(c.src)-1 <= c.idx+1 +} + +func (c *Context) next() bool { + return c.idx < c.size +} + +func (c *Context) source(s, e int) string { + return string(c.src[s:e]) +} + +func (c *Context) previousChar() rune { + if c.idx > 0 { + return c.src[c.idx-1] + } + return rune(0) +} + +func (c *Context) currentChar() rune { + return c.src[c.idx] +} + +func (c *Context) nextChar() rune { + if c.size > c.idx+1 { + return c.src[c.idx+1] + } + return rune(0) +} + +func (c *Context) repeatNum(r rune) int { + cnt := 0 + for i := c.idx; i < c.size; i++ { + if c.src[i] == r { + cnt++ + } else { + break + } + } + return cnt +} + +func (c *Context) progress(num int) { + c.idx += num +} + +func (c *Context) nextPos() int { + return c.idx + 1 +} + +func (c *Context) existsBuffer() bool { + return len(c.bufferedSrc()) != 0 +} + +func (c *Context) bufferedSrc() []rune { + src := c.buf[:c.notSpaceCharPos] + if len(src) > 0 && src[len(src)-1] == '\n' && c.isDocument() && c.literalOpt == "-" { + // remove end '\n' character + src = src[:len(src)-1] + } + return src +} + +func (c *Context) bufferedToken(pos *token.Position) *token.Token { + if c.idx == 0 { + return nil + } + source := c.bufferedSrc() + if len(source) == 0 { + return nil + } + var tk *token.Token + if c.isDocument() { + tk = token.String(string(source), string(c.obuf), pos) + } else { + tk = token.New(string(source), string(c.obuf), pos) + } + c.resetBuffer() + return tk +} diff --git a/vendor/github.com/goccy/go-yaml/scanner/scanner.go b/vendor/github.com/goccy/go-yaml/scanner/scanner.go new file mode 100644 index 000000000..b2d718f63 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/scanner/scanner.go @@ -0,0 +1,775 @@ +package scanner + +import ( + "io" + "strings" + + "github.com/goccy/go-yaml/token" + "golang.org/x/xerrors" +) + +// IndentState state for indent +type IndentState int + +const ( + // IndentStateEqual equals previous indent + IndentStateEqual IndentState = iota + // IndentStateUp more indent than previous + IndentStateUp + // IndentStateDown less indent than previous + IndentStateDown + // IndentStateKeep uses not indent token + IndentStateKeep +) + +// Scanner holds the scanner's internal state while processing a given text. +// It can be allocated as part of another data structure but must be initialized via Init before use. +type Scanner struct { + source []rune + sourcePos int + sourceSize int + line int + column int + offset int + prevIndentLevel int + prevIndentNum int + prevIndentColumn int + docStartColumn int + indentLevel int + indentNum int + isFirstCharAtLine bool + isAnchor bool + startedFlowSequenceNum int + startedFlowMapNum int + indentState IndentState + savedPos *token.Position +} + +func (s *Scanner) pos() *token.Position { + return &token.Position{ + Line: s.line, + Column: s.column, + Offset: s.offset, + IndentNum: s.indentNum, + IndentLevel: s.indentLevel, + } +} + +func (s *Scanner) bufferedToken(ctx *Context) *token.Token { + if s.savedPos != nil { + tk := ctx.bufferedToken(s.savedPos) + s.savedPos = nil + return tk + } + size := len(ctx.buf) + return ctx.bufferedToken(&token.Position{ + Line: s.line, + Column: s.column - size, + Offset: s.offset - size, + IndentNum: s.indentNum, + IndentLevel: s.indentLevel, + }) +} + +func (s *Scanner) progressColumn(ctx *Context, num int) { + s.column += num + s.offset += num + ctx.progress(num) +} + +func (s *Scanner) progressLine(ctx *Context) { + s.column = 1 + s.line++ + s.offset++ + s.indentNum = 0 + s.isFirstCharAtLine = true + s.isAnchor = false + ctx.progress(1) +} + +func (s *Scanner) isNeededKeepPreviousIndentNum(ctx *Context, c rune) bool { + if !s.isChangedToIndentStateUp() { + return false + } + if ctx.isDocument() { + return true + } + if c == '-' && ctx.existsBuffer() { + return true + } + return false +} + +func (s *Scanner) isNewLineChar(c rune) bool { + if c == '\n' { + return true + } + if c == '\r' { + return true + } + return false +} + +func (s *Scanner) newLineCount(src []rune) int { + size := len(src) + cnt := 0 + for i := 0; i < size; i++ { + c := src[i] + switch c { + case '\r': + if i+1 < size && src[i+1] == '\n' { + i++ + } + cnt++ + case '\n': + cnt++ + } + } + return cnt +} + +func (s *Scanner) updateIndent(ctx *Context, c rune) { + if s.isFirstCharAtLine && s.isNewLineChar(c) && ctx.isDocument() { + return + } + if s.isFirstCharAtLine && c == ' ' { + s.indentNum++ + return + } + if !s.isFirstCharAtLine { + s.indentState = IndentStateKeep + return + } + + if s.prevIndentNum < s.indentNum { + s.indentLevel = s.prevIndentLevel + 1 + s.indentState = IndentStateUp + } else if s.prevIndentNum == s.indentNum { + s.indentLevel = s.prevIndentLevel + s.indentState = IndentStateEqual + } else { + s.indentState = IndentStateDown + if s.prevIndentLevel > 0 { + s.indentLevel = s.prevIndentLevel - 1 + } + } + + if s.prevIndentColumn > 0 { + if s.prevIndentColumn < s.column { + s.indentState = IndentStateUp + } else if s.prevIndentColumn == s.column { + s.indentState = IndentStateEqual + } else { + s.indentState = IndentStateDown + } + } + s.isFirstCharAtLine = false + if s.isNeededKeepPreviousIndentNum(ctx, c) { + return + } + s.prevIndentNum = s.indentNum + s.prevIndentColumn = 0 + s.prevIndentLevel = s.indentLevel +} + +func (s *Scanner) isChangedToIndentStateDown() bool { + return s.indentState == IndentStateDown +} + +func (s *Scanner) isChangedToIndentStateUp() bool { + return s.indentState == IndentStateUp +} + +func (s *Scanner) isChangedToIndentStateEqual() bool { + return s.indentState == IndentStateEqual +} + +func (s *Scanner) addBufferedTokenIfExists(ctx *Context) { + ctx.addToken(s.bufferedToken(ctx)) +} + +func (s *Scanner) breakLiteral(ctx *Context) { + s.docStartColumn = 0 + ctx.breakLiteral() +} + +func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { + ctx.addOriginBuf('\'') + startIndex := ctx.idx + 1 + ctx.progress(1) + src := ctx.src + size := len(src) + value := []rune{} + isFirstLineChar := false + for idx := startIndex; idx < size; idx++ { + c := src[idx] + pos = idx + 1 + ctx.addOriginBuf(c) + if s.isNewLineChar(c) { + value = append(value, ' ') + isFirstLineChar = true + continue + } else if c == ' ' && isFirstLineChar { + continue + } else if c != '\'' { + value = append(value, c) + isFirstLineChar = false + continue + } + if idx+1 < len(ctx.src) && ctx.src[idx+1] == '\'' { + // '' handle as ' character + value = append(value, c) + ctx.addOriginBuf(c) + idx++ + continue + } + tk = token.SingleQuote(string(value), string(ctx.obuf), s.pos()) + pos = idx - startIndex + 1 + return + } + return +} + +func hexToInt(b rune) int { + if b >= 'A' && b <= 'F' { + return int(b) - 'A' + 10 + } + if b >= 'a' && b <= 'f' { + return int(b) - 'a' + 10 + } + return int(b) - '0' +} + +func hexRunesToInt(b []rune) int { + sum := 0 + for i := 0; i < len(b); i++ { + sum += hexToInt(b[i]) << (uint(len(b)-i-1) * 4) + } + return sum +} + +func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { + ctx.addOriginBuf('"') + startIndex := ctx.idx + 1 + ctx.progress(1) + src := ctx.src + size := len(src) + value := []rune{} + isFirstLineChar := false + for idx := startIndex; idx < size; idx++ { + c := src[idx] + pos = idx + 1 + ctx.addOriginBuf(c) + if s.isNewLineChar(c) { + value = append(value, ' ') + isFirstLineChar = true + continue + } else if c == ' ' && isFirstLineChar { + continue + } else if c == '\\' { + isFirstLineChar = false + if idx+1 < size { + nextChar := src[idx+1] + switch nextChar { + case 'b': + ctx.addOriginBuf(nextChar) + value = append(value, '\b') + idx++ + continue + case 'e': + ctx.addOriginBuf(nextChar) + value = append(value, '\x1B') + idx++ + continue + case 'f': + ctx.addOriginBuf(nextChar) + value = append(value, '\f') + idx++ + continue + case 'n': + ctx.addOriginBuf(nextChar) + value = append(value, '\n') + idx++ + continue + case 'v': + ctx.addOriginBuf(nextChar) + value = append(value, '\v') + idx++ + continue + case 'L': // LS (#x2028) + ctx.addOriginBuf(nextChar) + value = append(value, []rune{'\xE2', '\x80', '\xA8'}...) + idx++ + continue + case 'N': // NEL (#x85) + ctx.addOriginBuf(nextChar) + value = append(value, []rune{'\xC2', '\x85'}...) + idx++ + continue + case 'P': // PS (#x2029) + ctx.addOriginBuf(nextChar) + value = append(value, []rune{'\xE2', '\x80', '\xA9'}...) + idx++ + continue + case '_': // #xA0 + ctx.addOriginBuf(nextChar) + value = append(value, []rune{'\xC2', '\xA0'}...) + idx++ + continue + case '"': + ctx.addOriginBuf(nextChar) + value = append(value, nextChar) + idx++ + continue + case 'x': + if idx+3 >= size { + // TODO: need to return error + //err = xerrors.New("invalid escape character \\x") + return + } + codeNum := hexRunesToInt(src[idx+2 : idx+4]) + value = append(value, rune(codeNum)) + idx += 3 + continue + case 'u': + if idx+5 >= size { + // TODO: need to return error + //err = xerrors.New("invalid escape character \\u") + return + } + codeNum := hexRunesToInt(src[idx+2 : idx+6]) + value = append(value, rune(codeNum)) + idx += 5 + continue + case 'U': + if idx+9 >= size { + // TODO: need to return error + //err = xerrors.New("invalid escape character \\U") + return + } + codeNum := hexRunesToInt(src[idx+2 : idx+10]) + value = append(value, rune(codeNum)) + idx += 9 + continue + case '\\': + ctx.addOriginBuf(nextChar) + idx++ + } + } + value = append(value, c) + continue + } else if c != '"' { + value = append(value, c) + isFirstLineChar = false + continue + } + tk = token.DoubleQuote(string(value), string(ctx.obuf), s.pos()) + pos = idx - startIndex + 1 + return + } + return +} + +func (s *Scanner) scanQuote(ctx *Context, ch rune) (tk *token.Token, pos int) { + if ch == '\'' { + return s.scanSingleQuote(ctx) + } + return s.scanDoubleQuote(ctx) +} + +func (s *Scanner) scanTag(ctx *Context) (tk *token.Token, pos int) { + ctx.addOriginBuf('!') + ctx.progress(1) // skip '!' character + for idx, c := range ctx.src[ctx.idx:] { + pos = idx + 1 + ctx.addOriginBuf(c) + switch c { + case ' ', '\n', '\r': + value := ctx.source(ctx.idx-1, ctx.idx+idx) + tk = token.Tag(value, string(ctx.obuf), s.pos()) + pos = len([]rune(value)) + return + } + } + return +} + +func (s *Scanner) scanComment(ctx *Context) (tk *token.Token, pos int) { + ctx.addOriginBuf('#') + ctx.progress(1) // skip '#' character + for idx, c := range ctx.src[ctx.idx:] { + pos = idx + 1 + ctx.addOriginBuf(c) + switch c { + case '\n', '\r': + if ctx.previousChar() == '\\' { + continue + } + value := ctx.source(ctx.idx, ctx.idx+idx) + tk = token.Comment(value, string(ctx.obuf), s.pos()) + pos = len([]rune(value)) + 1 + return + } + } + return +} + +func (s *Scanner) scanLiteral(ctx *Context, c rune) { + ctx.addOriginBuf(c) + if ctx.isEOS() { + if ctx.isLiteral { + ctx.addBuf(c) + } + value := ctx.bufferedSrc() + ctx.addToken(token.String(string(value), string(ctx.obuf), s.pos())) + ctx.resetBuffer() + s.progressColumn(ctx, 1) + } else if s.isNewLineChar(c) { + if ctx.isLiteral { + ctx.addBuf(c) + } else { + ctx.addBuf(' ') + } + s.progressLine(ctx) + } else if s.isFirstCharAtLine && c == ' ' { + if 0 < s.docStartColumn && s.docStartColumn <= s.column { + ctx.addBuf(c) + } + s.progressColumn(ctx, 1) + } else { + if s.docStartColumn == 0 { + s.docStartColumn = s.column + } + ctx.addBuf(c) + s.progressColumn(ctx, 1) + } +} + +func (s *Scanner) scanLiteralHeader(ctx *Context) (pos int, err error) { + header := ctx.currentChar() + ctx.addOriginBuf(header) + ctx.progress(1) // skip '|' or '>' character + for idx, c := range ctx.src[ctx.idx:] { + pos = idx + ctx.addOriginBuf(c) + switch c { + case '\n', '\r': + value := ctx.source(ctx.idx, ctx.idx+idx) + opt := strings.TrimRight(value, " ") + switch opt { + case "", "+", "-", + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9": + if header == '|' { + ctx.addToken(token.Literal("|"+opt, string(ctx.obuf), s.pos())) + ctx.isLiteral = true + } else if header == '>' { + ctx.addToken(token.Folded(">"+opt, string(ctx.obuf), s.pos())) + ctx.isFolded = true + } + s.indentState = IndentStateKeep + ctx.resetBuffer() + ctx.literalOpt = opt + return + } + break + } + } + err = xerrors.New("invalid literal header") + return +} + +func (s *Scanner) scanNewLine(ctx *Context, c rune) { + if len(ctx.buf) > 0 && s.savedPos == nil { + s.savedPos = s.pos() + s.savedPos.Column -= len(ctx.bufferedSrc()) + } + + // if the following case, origin buffer has unnecessary two spaces. + // So, `removeRightSpaceFromOriginBuf` remove them, also fix column number too. + // --- + // a:[space][space] + // b: c + removedNum := ctx.removeRightSpaceFromBuf() + if removedNum > 0 { + s.column -= removedNum + s.offset -= removedNum + if s.savedPos != nil { + s.savedPos.Column -= removedNum + } + } + + if ctx.isEOS() { + s.addBufferedTokenIfExists(ctx) + } else if s.isAnchor { + s.addBufferedTokenIfExists(ctx) + } + ctx.addBuf(' ') + ctx.addOriginBuf(c) + ctx.isSingleLine = false + s.progressLine(ctx) +} + +func (s *Scanner) scan(ctx *Context) (pos int) { + for ctx.next() { + pos = ctx.nextPos() + c := ctx.currentChar() + s.updateIndent(ctx, c) + if ctx.isDocument() { + if s.isChangedToIndentStateEqual() || + s.isChangedToIndentStateDown() { + s.addBufferedTokenIfExists(ctx) + s.breakLiteral(ctx) + } else { + s.scanLiteral(ctx, c) + continue + } + } else if s.isChangedToIndentStateDown() { + s.addBufferedTokenIfExists(ctx) + } else if s.isChangedToIndentStateEqual() { + // if first character is new line character, buffer expect to raw folded literal + if len(ctx.obuf) > 0 && s.newLineCount(ctx.obuf) <= 1 { + // doesn't raw folded literal + s.addBufferedTokenIfExists(ctx) + } + } + switch c { + case '{': + if !ctx.existsBuffer() { + ctx.addOriginBuf(c) + ctx.addToken(token.MappingStart(string(ctx.obuf), s.pos())) + s.startedFlowMapNum++ + s.progressColumn(ctx, 1) + return + } + case '}': + if !ctx.existsBuffer() || s.startedFlowMapNum > 0 { + ctx.addToken(s.bufferedToken(ctx)) + ctx.addOriginBuf(c) + ctx.addToken(token.MappingEnd(string(ctx.obuf), s.pos())) + s.startedFlowMapNum-- + s.progressColumn(ctx, 1) + return + } + case '.': + if s.indentNum == 0 && ctx.repeatNum('.') == 3 { + ctx.addToken(token.DocumentEnd(s.pos())) + s.progressColumn(ctx, 3) + pos += 2 + return + } + case '<': + if ctx.repeatNum('<') == 2 { + s.prevIndentColumn = s.column + ctx.addToken(token.MergeKey(string(ctx.obuf)+"<<", s.pos())) + s.progressColumn(ctx, 1) + pos++ + return + } + case '-': + if s.indentNum == 0 && ctx.repeatNum('-') == 3 { + s.addBufferedTokenIfExists(ctx) + ctx.addToken(token.DocumentHeader(s.pos())) + s.progressColumn(ctx, 3) + pos += 2 + return + } + if ctx.existsBuffer() && s.isChangedToIndentStateUp() { + // raw folded + ctx.isRawFolded = true + ctx.addBuf(c) + ctx.addOriginBuf(c) + s.progressColumn(ctx, 1) + continue + } + if ctx.existsBuffer() { + // '-' is literal + ctx.addBuf(c) + ctx.addOriginBuf(c) + s.progressColumn(ctx, 1) + continue + } + nc := ctx.nextChar() + if nc == ' ' || s.isNewLineChar(nc) { + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(c) + tk := token.SequenceEntry(string(ctx.obuf), s.pos()) + s.prevIndentColumn = tk.Position.Column + ctx.addToken(tk) + s.progressColumn(ctx, 1) + return + } + case '[': + if !ctx.existsBuffer() { + ctx.addOriginBuf(c) + ctx.addToken(token.SequenceStart(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum++ + s.progressColumn(ctx, 1) + return + } + case ']': + if !ctx.existsBuffer() || s.startedFlowSequenceNum > 0 { + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(c) + ctx.addToken(token.SequenceEnd(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum-- + s.progressColumn(ctx, 1) + return + } + case ',': + if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(c) + ctx.addToken(token.CollectEntry(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + return + } + case ':': + nc := ctx.nextChar() + if s.startedFlowMapNum > 0 || nc == ' ' || s.isNewLineChar(nc) || ctx.isNextEOS() { + // mapping value + tk := s.bufferedToken(ctx) + if tk != nil { + s.prevIndentColumn = tk.Position.Column + ctx.addToken(tk) + } + ctx.addToken(token.MappingValue(s.pos())) + s.progressColumn(ctx, 1) + return + } + case '|', '>': + if !ctx.existsBuffer() { + progress, err := s.scanLiteralHeader(ctx) + if err != nil { + // TODO: returns syntax error object + return + } + s.progressColumn(ctx, progress) + s.progressLine(ctx) + continue + } + case '!': + if !ctx.existsBuffer() { + token, progress := s.scanTag(ctx) + ctx.addToken(token) + s.progressColumn(ctx, progress) + if c := ctx.previousChar(); s.isNewLineChar(c) { + s.progressLine(ctx) + } + pos += progress + return + } + case '%': + if !ctx.existsBuffer() && s.indentNum == 0 { + ctx.addToken(token.Directive(s.pos())) + s.progressColumn(ctx, 1) + return + } + case '?': + nc := ctx.nextChar() + if !ctx.existsBuffer() && nc == ' ' { + ctx.addToken(token.MappingKey(s.pos())) + s.progressColumn(ctx, 1) + return + } + case '&': + if !ctx.existsBuffer() { + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(c) + ctx.addToken(token.Anchor(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + s.isAnchor = true + return + } + case '*': + if !ctx.existsBuffer() { + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(c) + ctx.addToken(token.Alias(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + return + } + case '#': + if !ctx.existsBuffer() || ctx.previousChar() == ' ' { + s.addBufferedTokenIfExists(ctx) + token, progress := s.scanComment(ctx) + ctx.addToken(token) + s.progressColumn(ctx, progress) + s.progressLine(ctx) + pos += progress + return + } + case '\'', '"': + if !ctx.existsBuffer() { + token, progress := s.scanQuote(ctx, c) + ctx.addToken(token) + s.progressColumn(ctx, progress) + pos += progress + return + } + case '\r', '\n': + // There is no problem that we ignore CR which followed by LF and normalize it to LF, because of following YAML1.2 spec. + // > Line breaks inside scalar content must be normalized by the YAML processor. Each such line break must be parsed into a single line feed character. + // > Outside scalar content, YAML allows any line break to be used to terminate lines. + // > -- https://yaml.org/spec/1.2/spec.html + if c == '\r' && ctx.nextChar() == '\n' { + ctx.addOriginBuf('\r') + ctx.progress(1) + c = '\n' + } + s.scanNewLine(ctx, c) + continue + case ' ': + if ctx.isSaveIndentMode() || (!s.isAnchor && !s.isFirstCharAtLine) { + ctx.addBuf(c) + ctx.addOriginBuf(c) + s.progressColumn(ctx, 1) + continue + } + if s.isFirstCharAtLine { + s.progressColumn(ctx, 1) + ctx.addOriginBuf(c) + continue + } + s.addBufferedTokenIfExists(ctx) + s.progressColumn(ctx, 1) + s.isAnchor = false + return + } + ctx.addBuf(c) + ctx.addOriginBuf(c) + s.progressColumn(ctx, 1) + } + s.addBufferedTokenIfExists(ctx) + return +} + +// Init prepares the scanner s to tokenize the text src by setting the scanner at the beginning of src. +func (s *Scanner) Init(text string) { + src := []rune(text) + s.source = src + s.sourcePos = 0 + s.sourceSize = len(src) + s.line = 1 + s.column = 1 + s.offset = 1 + s.prevIndentLevel = 0 + s.prevIndentNum = 0 + s.prevIndentColumn = 0 + s.indentLevel = 0 + s.indentNum = 0 + s.isFirstCharAtLine = true +} + +// Scan scans the next token and returns the token collection. The source end is indicated by io.EOF. +func (s *Scanner) Scan() (token.Tokens, error) { + if s.sourcePos >= s.sourceSize { + return nil, io.EOF + } + ctx := newContext(s.source[s.sourcePos:]) + defer ctx.release() + progress := s.scan(ctx) + s.sourcePos += progress + var tokens token.Tokens + tokens = append(tokens, ctx.tokens...) + return tokens, nil +} diff --git a/vendor/github.com/goccy/go-yaml/token/token.go b/vendor/github.com/goccy/go-yaml/token/token.go new file mode 100644 index 000000000..054b9f1d0 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/token/token.go @@ -0,0 +1,1036 @@ +package token + +import ( + "fmt" + "strings" +) + +// Character type for character +type Character byte + +const ( + // SequenceEntryCharacter character for sequence entry + SequenceEntryCharacter Character = '-' + // MappingKeyCharacter character for mapping key + MappingKeyCharacter = '?' + // MappingValueCharacter character for mapping value + MappingValueCharacter = ':' + // CollectEntryCharacter character for collect entry + CollectEntryCharacter = ',' + // SequenceStartCharacter character for sequence start + SequenceStartCharacter = '[' + // SequenceEndCharacter character for sequence end + SequenceEndCharacter = ']' + // MappingStartCharacter character for mapping start + MappingStartCharacter = '{' + // MappingEndCharacter character for mapping end + MappingEndCharacter = '}' + // CommentCharacter character for comment + CommentCharacter = '#' + // AnchorCharacter character for anchor + AnchorCharacter = '&' + // AliasCharacter character for alias + AliasCharacter = '*' + // TagCharacter character for tag + TagCharacter = '!' + // LiteralCharacter character for literal + LiteralCharacter = '|' + // FoldedCharacter character for folded + FoldedCharacter = '>' + // SingleQuoteCharacter character for single quote + SingleQuoteCharacter = '\'' + // DoubleQuoteCharacter character for double quote + DoubleQuoteCharacter = '"' + // DirectiveCharacter character for directive + DirectiveCharacter = '%' + // SpaceCharacter character for space + SpaceCharacter = ' ' + // LineBreakCharacter character for line break + LineBreakCharacter = '\n' +) + +// Type type identifier for token +type Type int + +const ( + // UnknownType reserve for invalid type + UnknownType Type = iota + // DocumentHeaderType type for DocumentHeader token + DocumentHeaderType + // DocumentEndType type for DocumentEnd token + DocumentEndType + // SequenceEntryType type for SequenceEntry token + SequenceEntryType + // MappingKeyType type for MappingKey token + MappingKeyType + // MappingValueType type for MappingValue token + MappingValueType + // MergeKeyType type for MergeKey token + MergeKeyType + // CollectEntryType type for CollectEntry token + CollectEntryType + // SequenceStartType type for SequenceStart token + SequenceStartType + // SequenceEndType type for SequenceEnd token + SequenceEndType + // MappingStartType type for MappingStart token + MappingStartType + // MappingEndType type for MappingEnd token + MappingEndType + // CommentType type for Comment token + CommentType + // AnchorType type for Anchor token + AnchorType + // AliasType type for Alias token + AliasType + // TagType type for Tag token + TagType + // LiteralType type for Literal token + LiteralType + // FoldedType type for Folded token + FoldedType + // SingleQuoteType type for SingleQuote token + SingleQuoteType + // DoubleQuoteType type for DoubleQuote token + DoubleQuoteType + // DirectiveType type for Directive token + DirectiveType + // SpaceType type for Space token + SpaceType + // NullType type for Null token + NullType + // InfinityType type for Infinity token + InfinityType + // NanType type for Nan token + NanType + // IntegerType type for Integer token + IntegerType + // BinaryIntegerType type for BinaryInteger token + BinaryIntegerType + // OctetIntegerType type for OctetInteger token + OctetIntegerType + // HexIntegerType type for HexInteger token + HexIntegerType + // FloatType type for Float token + FloatType + // StringType type for String token + StringType + // BoolType type for Bool token + BoolType +) + +// String type identifier to text +func (t Type) String() string { + switch t { + case UnknownType: + return "Unknown" + case DocumentHeaderType: + return "DocumentHeader" + case DocumentEndType: + return "DocumentEnd" + case SequenceEntryType: + return "SequenceEntry" + case MappingKeyType: + return "MappingKey" + case MappingValueType: + return "MappingValue" + case MergeKeyType: + return "MergeKey" + case CollectEntryType: + return "CollectEntry" + case SequenceStartType: + return "SequenceStart" + case SequenceEndType: + return "SequenceEnd" + case MappingStartType: + return "MappingStart" + case MappingEndType: + return "MappingEnd" + case CommentType: + return "Comment" + case AnchorType: + return "Anchor" + case AliasType: + return "Alias" + case TagType: + return "Tag" + case LiteralType: + return "Literal" + case FoldedType: + return "Folded" + case SingleQuoteType: + return "SingleQuote" + case DoubleQuoteType: + return "DoubleQuote" + case DirectiveType: + return "Directive" + case SpaceType: + return "Space" + case StringType: + return "String" + case BoolType: + return "Bool" + case IntegerType: + return "Integer" + case BinaryIntegerType: + return "BinaryInteger" + case OctetIntegerType: + return "OctetInteger" + case HexIntegerType: + return "HexInteger" + case FloatType: + return "Float" + case NullType: + return "Null" + case InfinityType: + return "Infinity" + case NanType: + return "Nan" + } + return "" +} + +// CharacterType type for character category +type CharacterType int + +const ( + // CharacterTypeIndicator type of indicator character + CharacterTypeIndicator CharacterType = iota + // CharacterTypeWhiteSpace type of white space character + CharacterTypeWhiteSpace + // CharacterTypeMiscellaneous type of miscellaneous character + CharacterTypeMiscellaneous + // CharacterTypeEscaped type of escaped character + CharacterTypeEscaped +) + +// String character type identifier to text +func (c CharacterType) String() string { + switch c { + case CharacterTypeIndicator: + return "Indicator" + case CharacterTypeWhiteSpace: + return "WhiteSpcae" + case CharacterTypeMiscellaneous: + return "Miscellaneous" + case CharacterTypeEscaped: + return "Escaped" + } + return "" +} + +// Indicator type for indicator +type Indicator int + +const ( + // NotIndicator not indicator + NotIndicator Indicator = iota + // BlockStructureIndicator indicator for block structure ( '-', '?', ':' ) + BlockStructureIndicator + // FlowCollectionIndicator indicator for flow collection ( '[', ']', '{', '}', ',' ) + FlowCollectionIndicator + // CommentIndicator indicator for comment ( '#' ) + CommentIndicator + // NodePropertyIndicator indicator for node property ( '!', '&', '*' ) + NodePropertyIndicator + // BlockScalarIndicator indicator for block scalar ( '|', '>' ) + BlockScalarIndicator + // QuotedScalarIndicator indicator for quoted scalar ( ''', '"' ) + QuotedScalarIndicator + // DirectiveIndicator indicator for directive ( '%' ) + DirectiveIndicator + // InvalidUseOfReservedIndicator indicator for invalid use of reserved keyword ( '@', '`' ) + InvalidUseOfReservedIndicator +) + +// String indicator to text +func (i Indicator) String() string { + switch i { + case NotIndicator: + return "NotIndicator" + case BlockStructureIndicator: + return "BlockStructure" + case FlowCollectionIndicator: + return "FlowCollection" + case CommentIndicator: + return "Comment" + case NodePropertyIndicator: + return "NodeProperty" + case BlockScalarIndicator: + return "BlockScalar" + case QuotedScalarIndicator: + return "QuotedScalar" + case DirectiveIndicator: + return "Directive" + case InvalidUseOfReservedIndicator: + return "InvalidUseOfReserved" + } + return "" +} + +var ( + reservedNullKeywords = []string{ + "null", + "Null", + "NULL", + "~", + } + reservedBoolKeywords = []string{ + "true", + "True", + "TRUE", + "false", + "False", + "FALSE", + } + reservedInfKeywords = []string{ + ".inf", + ".Inf", + ".INF", + "-.inf", + "-.Inf", + "-.INF", + } + reservedNanKeywords = []string{ + ".nan", + ".NaN", + ".NAN", + } + reservedKeywordMap = map[string]func(string, string, *Position) *Token{} +) + +func reservedKeywordToken(typ Type, value, org string, pos *Position) *Token { + return &Token{ + Type: typ, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +func init() { + for _, keyword := range reservedNullKeywords { + reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + return reservedKeywordToken(NullType, value, org, pos) + } + } + for _, keyword := range reservedBoolKeywords { + reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + return reservedKeywordToken(BoolType, value, org, pos) + } + } + for _, keyword := range reservedInfKeywords { + reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + return reservedKeywordToken(InfinityType, value, org, pos) + } + } + for _, keyword := range reservedNanKeywords { + reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + return reservedKeywordToken(NanType, value, org, pos) + } + } +} + +// ReservedTagKeyword type of reserved tag keyword +type ReservedTagKeyword string + +const ( + // IntegerTag `!!int` tag + IntegerTag ReservedTagKeyword = "!!int" + // FloatTag `!!float` tag + FloatTag ReservedTagKeyword = "!!float" + // NullTag `!!null` tag + NullTag ReservedTagKeyword = "!!null" + // SequenceTag `!!seq` tag + SequenceTag ReservedTagKeyword = "!!seq" + // MappingTag `!!map` tag + MappingTag ReservedTagKeyword = "!!map" + // StringTag `!!str` tag + StringTag ReservedTagKeyword = "!!str" + // BinaryTag `!!binary` tag + BinaryTag ReservedTagKeyword = "!!binary" + // OrderedMapTag `!!omap` tag + OrderedMapTag ReservedTagKeyword = "!!omap" + // SetTag `!!set` tag + SetTag ReservedTagKeyword = "!!set" + // TimestampTag `!!timestamp` tag + TimestampTag ReservedTagKeyword = "!!timestamp" +) + +var ( + // ReservedTagKeywordMap map for reserved tag keywords + ReservedTagKeywordMap = map[ReservedTagKeyword]func(string, string, *Position) *Token{ + IntegerTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + FloatTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + NullTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + SequenceTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + MappingTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + StringTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + BinaryTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + OrderedMapTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + SetTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + TimestampTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + } +) + +type numType int + +const ( + numTypeNone numType = iota + numTypeBinary + numTypeOctet + numTypeHex + numTypeFloat +) + +type numStat struct { + isNum bool + typ numType +} + +func getNumberStat(str string) *numStat { + stat := &numStat{} + if str == "" { + return stat + } + if str == "-" || str == "." || str == "+" || str == "_" { + return stat + } + if str[0] == '_' { + return stat + } + dotFound := false + isNegative := false + isExponent := false + if str[0] == '-' { + isNegative = true + } + for idx, c := range str { + switch c { + case 'x': + if (isNegative && idx == 2) || (!isNegative && idx == 1) { + continue + } + case 'o': + if (isNegative && idx == 2) || (!isNegative && idx == 1) { + continue + } + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + continue + case 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F': + if (len(str) > 2 && str[0] == '0' && str[1] == 'x') || + (len(str) > 3 && isNegative && str[1] == '0' && str[2] == 'x') { + // hex number + continue + } + if c == 'b' && ((isNegative && idx == 2) || (!isNegative && idx == 1)) { + // binary number + continue + } + if (c == 'e' || c == 'E') && dotFound { + // exponent + isExponent = true + continue + } + case '.': + if dotFound { + // multiple dot + return stat + } + dotFound = true + continue + case '-': + if idx == 0 || isExponent { + continue + } + case '+': + if idx == 0 || isExponent { + continue + } + case '_': + continue + } + return stat + } + stat.isNum = true + switch { + case dotFound: + stat.typ = numTypeFloat + case strings.HasPrefix(str, "0b") || strings.HasPrefix(str, "-0b"): + stat.typ = numTypeBinary + case strings.HasPrefix(str, "0x") || strings.HasPrefix(str, "-0x"): + stat.typ = numTypeHex + case strings.HasPrefix(str, "0o") || strings.HasPrefix(str, "-0o"): + stat.typ = numTypeOctet + case (len(str) > 1 && str[0] == '0') || (len(str) > 1 && str[0] == '-' && str[1] == '0'): + stat.typ = numTypeOctet + } + return stat +} + +func looksLikeTimeValue(value string) bool { + for i, c := range value { + switch c { + case ':', '1', '2', '3', '4', '5', '6', '7', '8', '9': + continue + case '0': + if i == 0 { + return false + } + continue + } + return false + } + return true +} + +// IsNeedQuoted whether need quote for passed string or not +func IsNeedQuoted(value string) bool { + if value == "" { + return true + } + if _, exists := reservedKeywordMap[value]; exists { + return true + } + if stat := getNumberStat(value); stat.isNum { + return true + } + first := value[0] + switch first { + case '*', '&', '[', '{', '}', ']', ',', '!', '|', '>', '%', '\'', '"': + return true + } + last := value[len(value)-1] + switch last { + case ':': + return true + } + if looksLikeTimeValue(value) { + return true + } + for i, c := range value { + switch c { + case '#', '\\': + return true + case ':': + if i+1 < len(value) && value[i+1] == ' ' { + return true + } + } + } + return false +} + +// LiteralBlockHeader detect literal block scalar header +func LiteralBlockHeader(value string) string { + lbc := DetectLineBreakCharacter(value) + + switch { + case !strings.Contains(value, lbc): + return "" + case strings.HasSuffix(value, fmt.Sprintf("%s%s", lbc, lbc)): + return "|+" + case strings.HasSuffix(value, lbc): + return "|" + default: + return "|-" + } +} + +// New create reserved keyword token or number token and other string token +func New(value string, org string, pos *Position) *Token { + fn := reservedKeywordMap[value] + if fn != nil { + return fn(value, org, pos) + } + if stat := getNumberStat(value); stat.isNum { + tk := &Token{ + Type: IntegerType, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: value, + Origin: org, + Position: pos, + } + switch stat.typ { + case numTypeFloat: + tk.Type = FloatType + case numTypeBinary: + tk.Type = BinaryIntegerType + case numTypeOctet: + tk.Type = OctetIntegerType + case numTypeHex: + tk.Type = HexIntegerType + } + return tk + } + return String(value, org, pos) +} + +// Position type for position in YAML document +type Position struct { + Line int + Column int + Offset int + IndentNum int + IndentLevel int +} + +// String position to text +func (p *Position) String() string { + return fmt.Sprintf("[level:%d,line:%d,column:%d,offset:%d]", p.IndentLevel, p.Line, p.Column, p.Offset) +} + +// Token type for token +type Token struct { + Type Type + CharacterType CharacterType + Indicator Indicator + Value string + Origin string + Position *Position + Next *Token + Prev *Token +} + +// PreviousType previous token type +func (t *Token) PreviousType() Type { + if t.Prev != nil { + return t.Prev.Type + } + return UnknownType +} + +// NextType next token type +func (t *Token) NextType() Type { + if t.Next != nil { + return t.Next.Type + } + return UnknownType +} + +// AddColumn append column number to current position of column +func (t *Token) AddColumn(col int) { + if t == nil { + return + } + t.Position.Column += col +} + +// Clone copy token ( preserve Prev/Next reference ) +func (t *Token) Clone() *Token { + if t == nil { + return nil + } + copied := *t + if t.Position != nil { + pos := *(t.Position) + copied.Position = &pos + } + return &copied +} + +// Tokens type of token collection +type Tokens []*Token + +func (t *Tokens) add(tk *Token) { + tokens := *t + if len(tokens) == 0 { + tokens = append(tokens, tk) + } else { + last := tokens[len(tokens)-1] + last.Next = tk + tk.Prev = last + tokens = append(tokens, tk) + } + *t = tokens +} + +// Add append new some tokens +func (t *Tokens) Add(tks ...*Token) { + for _, tk := range tks { + t.add(tk) + } +} + +// Dump dump all token structures for debugging +func (t Tokens) Dump() { + for _, tk := range t { + fmt.Printf("- %+v\n", tk) + } +} + +// String create token for String +func String(value string, org string, pos *Position) *Token { + return &Token{ + Type: StringType, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// SequenceEntry create token for SequenceEntry +func SequenceEntry(org string, pos *Position) *Token { + return &Token{ + Type: SequenceEntryType, + CharacterType: CharacterTypeIndicator, + Indicator: BlockStructureIndicator, + Value: string(SequenceEntryCharacter), + Origin: org, + Position: pos, + } +} + +// MappingKey create token for MappingKey +func MappingKey(pos *Position) *Token { + return &Token{ + Type: MappingKeyType, + CharacterType: CharacterTypeIndicator, + Indicator: BlockStructureIndicator, + Value: string(MappingKeyCharacter), + Origin: string(MappingKeyCharacter), + Position: pos, + } +} + +// MappingValue create token for MappingValue +func MappingValue(pos *Position) *Token { + return &Token{ + Type: MappingValueType, + CharacterType: CharacterTypeIndicator, + Indicator: BlockStructureIndicator, + Value: string(MappingValueCharacter), + Origin: string(MappingValueCharacter), + Position: pos, + } +} + +// CollectEntry create token for CollectEntry +func CollectEntry(org string, pos *Position) *Token { + return &Token{ + Type: CollectEntryType, + CharacterType: CharacterTypeIndicator, + Indicator: FlowCollectionIndicator, + Value: string(CollectEntryCharacter), + Origin: org, + Position: pos, + } +} + +// SequenceStart create token for SequenceStart +func SequenceStart(org string, pos *Position) *Token { + return &Token{ + Type: SequenceStartType, + CharacterType: CharacterTypeIndicator, + Indicator: FlowCollectionIndicator, + Value: string(SequenceStartCharacter), + Origin: org, + Position: pos, + } +} + +// SequenceEnd create token for SequenceEnd +func SequenceEnd(org string, pos *Position) *Token { + return &Token{ + Type: SequenceEndType, + CharacterType: CharacterTypeIndicator, + Indicator: FlowCollectionIndicator, + Value: string(SequenceEndCharacter), + Origin: org, + Position: pos, + } +} + +// MappingStart create token for MappingStart +func MappingStart(org string, pos *Position) *Token { + return &Token{ + Type: MappingStartType, + CharacterType: CharacterTypeIndicator, + Indicator: FlowCollectionIndicator, + Value: string(MappingStartCharacter), + Origin: org, + Position: pos, + } +} + +// MappingEnd create token for MappingEnd +func MappingEnd(org string, pos *Position) *Token { + return &Token{ + Type: MappingEndType, + CharacterType: CharacterTypeIndicator, + Indicator: FlowCollectionIndicator, + Value: string(MappingEndCharacter), + Origin: org, + Position: pos, + } +} + +// Comment create token for Comment +func Comment(value string, org string, pos *Position) *Token { + return &Token{ + Type: CommentType, + CharacterType: CharacterTypeIndicator, + Indicator: CommentIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// Anchor create token for Anchor +func Anchor(org string, pos *Position) *Token { + return &Token{ + Type: AnchorType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: string(AnchorCharacter), + Origin: org, + Position: pos, + } +} + +// Alias create token for Alias +func Alias(org string, pos *Position) *Token { + return &Token{ + Type: AliasType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: string(AliasCharacter), + Origin: org, + Position: pos, + } +} + +// Tag create token for Tag +func Tag(value string, org string, pos *Position) *Token { + fn := ReservedTagKeywordMap[ReservedTagKeyword(value)] + if fn != nil { + return fn(value, org, pos) + } + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// Literal create token for Literal +func Literal(value string, org string, pos *Position) *Token { + return &Token{ + Type: LiteralType, + CharacterType: CharacterTypeIndicator, + Indicator: BlockScalarIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// Folded create token for Folded +func Folded(value string, org string, pos *Position) *Token { + return &Token{ + Type: FoldedType, + CharacterType: CharacterTypeIndicator, + Indicator: BlockScalarIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// SingleQuote create token for SingleQuote +func SingleQuote(value string, org string, pos *Position) *Token { + return &Token{ + Type: SingleQuoteType, + CharacterType: CharacterTypeIndicator, + Indicator: QuotedScalarIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// DoubleQuote create token for DoubleQuote +func DoubleQuote(value string, org string, pos *Position) *Token { + return &Token{ + Type: DoubleQuoteType, + CharacterType: CharacterTypeIndicator, + Indicator: QuotedScalarIndicator, + Value: value, + Origin: org, + Position: pos, + } +} + +// Directive create token for Directive +func Directive(pos *Position) *Token { + return &Token{ + Type: DirectiveType, + CharacterType: CharacterTypeIndicator, + Indicator: DirectiveIndicator, + Value: string(DirectiveCharacter), + Origin: string(DirectiveCharacter), + Position: pos, + } +} + +// Space create token for Space +func Space(pos *Position) *Token { + return &Token{ + Type: SpaceType, + CharacterType: CharacterTypeWhiteSpace, + Indicator: NotIndicator, + Value: string(SpaceCharacter), + Origin: string(SpaceCharacter), + Position: pos, + } +} + +// MergeKey create token for MergeKey +func MergeKey(org string, pos *Position) *Token { + return &Token{ + Type: MergeKeyType, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: "<<", + Origin: org, + Position: pos, + } +} + +// DocumentHeader create token for DocumentHeader +func DocumentHeader(pos *Position) *Token { + return &Token{ + Type: DocumentHeaderType, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: "---", + Origin: "---", + Position: pos, + } +} + +// DocumentEnd create token for DocumentEnd +func DocumentEnd(pos *Position) *Token { + return &Token{ + Type: DocumentEndType, + CharacterType: CharacterTypeMiscellaneous, + Indicator: NotIndicator, + Value: "...", + Origin: "...", + Position: pos, + } +} + +// DetectLineBreakCharacter detect line break character in only one inside scalar content scope. +func DetectLineBreakCharacter(src string) string { + nc := strings.Count(src, "\n") + rc := strings.Count(src, "\r") + rnc := strings.Count(src, "\r\n") + switch { + case nc == rnc && rc == rnc: + return "\r\n" + case rc > nc: + return "\r" + default: + return "\n" + } +} diff --git a/vendor/github.com/mikefarah/yaml/v2/LICENSE b/vendor/github.com/kylelemons/godebug/LICENSE similarity index 99% rename from vendor/github.com/mikefarah/yaml/v2/LICENSE rename to vendor/github.com/kylelemons/godebug/LICENSE index 8dada3eda..d64569567 100644 --- a/vendor/github.com/mikefarah/yaml/v2/LICENSE +++ b/vendor/github.com/kylelemons/godebug/LICENSE @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +179,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/kylelemons/godebug/diff/diff.go b/vendor/github.com/kylelemons/godebug/diff/diff.go new file mode 100644 index 000000000..200e596c6 --- /dev/null +++ b/vendor/github.com/kylelemons/godebug/diff/diff.go @@ -0,0 +1,186 @@ +// Copyright 2013 Google Inc. All rights reserved. +// +// 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 diff implements a linewise diff algorithm. +package diff + +import ( + "bytes" + "fmt" + "strings" +) + +// Chunk represents a piece of the diff. A chunk will not have both added and +// deleted lines. Equal lines are always after any added or deleted lines. +// A Chunk may or may not have any lines in it, especially for the first or last +// chunk in a computation. +type Chunk struct { + Added []string + Deleted []string + Equal []string +} + +func (c *Chunk) empty() bool { + return len(c.Added) == 0 && len(c.Deleted) == 0 && len(c.Equal) == 0 +} + +// Diff returns a string containing a line-by-line unified diff of the linewise +// changes required to make A into B. Each line is prefixed with '+', '-', or +// ' ' to indicate if it should be added, removed, or is correct respectively. +func Diff(A, B string) string { + aLines := strings.Split(A, "\n") + bLines := strings.Split(B, "\n") + + chunks := DiffChunks(aLines, bLines) + + buf := new(bytes.Buffer) + for _, c := range chunks { + for _, line := range c.Added { + fmt.Fprintf(buf, "+%s\n", line) + } + for _, line := range c.Deleted { + fmt.Fprintf(buf, "-%s\n", line) + } + for _, line := range c.Equal { + fmt.Fprintf(buf, " %s\n", line) + } + } + return strings.TrimRight(buf.String(), "\n") +} + +// DiffChunks uses an O(D(N+M)) shortest-edit-script algorithm +// to compute the edits required from A to B and returns the +// edit chunks. +func DiffChunks(a, b []string) []Chunk { + // algorithm: http://www.xmailserver.org/diff2.pdf + + // We'll need these quantities a lot. + alen, blen := len(a), len(b) // M, N + + // At most, it will require len(a) deletions and len(b) additions + // to transform a into b. + maxPath := alen + blen // MAX + if maxPath == 0 { + // degenerate case: two empty lists are the same + return nil + } + + // Store the endpoint of the path for diagonals. + // We store only the a index, because the b index on any diagonal + // (which we know during the loop below) is aidx-diag. + // endpoint[maxPath] represents the 0 diagonal. + // + // Stated differently: + // endpoint[d] contains the aidx of a furthest reaching path in diagonal d + endpoint := make([]int, 2*maxPath+1) // V + + saved := make([][]int, 0, 8) // Vs + save := func() { + dup := make([]int, len(endpoint)) + copy(dup, endpoint) + saved = append(saved, dup) + } + + var editDistance int // D +dLoop: + for editDistance = 0; editDistance <= maxPath; editDistance++ { + // The 0 diag(onal) represents equality of a and b. Each diagonal to + // the left is numbered one lower, to the right is one higher, from + // -alen to +blen. Negative diagonals favor differences from a, + // positive diagonals favor differences from b. The edit distance to a + // diagonal d cannot be shorter than d itself. + // + // The iterations of this loop cover either odds or evens, but not both, + // If odd indices are inputs, even indices are outputs and vice versa. + for diag := -editDistance; diag <= editDistance; diag += 2 { // k + var aidx int // x + switch { + case diag == -editDistance: + // This is a new diagonal; copy from previous iter + aidx = endpoint[maxPath-editDistance+1] + 0 + case diag == editDistance: + // This is a new diagonal; copy from previous iter + aidx = endpoint[maxPath+editDistance-1] + 1 + case endpoint[maxPath+diag+1] > endpoint[maxPath+diag-1]: + // diagonal d+1 was farther along, so use that + aidx = endpoint[maxPath+diag+1] + 0 + default: + // diagonal d-1 was farther (or the same), so use that + aidx = endpoint[maxPath+diag-1] + 1 + } + // On diagonal d, we can compute bidx from aidx. + bidx := aidx - diag // y + // See how far we can go on this diagonal before we find a difference. + for aidx < alen && bidx < blen && a[aidx] == b[bidx] { + aidx++ + bidx++ + } + // Store the end of the current edit chain. + endpoint[maxPath+diag] = aidx + // If we've found the end of both inputs, we're done! + if aidx >= alen && bidx >= blen { + save() // save the final path + break dLoop + } + } + save() // save the current path + } + if editDistance == 0 { + return nil + } + chunks := make([]Chunk, editDistance+1) + + x, y := alen, blen + for d := editDistance; d > 0; d-- { + endpoint := saved[d] + diag := x - y + insert := diag == -d || (diag != d && endpoint[maxPath+diag-1] < endpoint[maxPath+diag+1]) + + x1 := endpoint[maxPath+diag] + var x0, xM, kk int + if insert { + kk = diag + 1 + x0 = endpoint[maxPath+kk] + xM = x0 + } else { + kk = diag - 1 + x0 = endpoint[maxPath+kk] + xM = x0 + 1 + } + y0 := x0 - kk + + var c Chunk + if insert { + c.Added = b[y0:][:1] + } else { + c.Deleted = a[x0:][:1] + } + if xM < x1 { + c.Equal = a[xM:][:x1-xM] + } + + x, y = x0, y0 + chunks[d] = c + } + if x > 0 { + chunks[0].Equal = a[:x] + } + if chunks[0].empty() { + chunks = chunks[1:] + } + if len(chunks) == 0 { + return nil + } + return chunks +} diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml index 98db8f060..7942c565c 100644 --- a/vendor/github.com/mattn/go-colorable/.travis.yml +++ b/vendor/github.com/mattn/go-colorable/.travis.yml @@ -1,9 +1,15 @@ language: go +sudo: false go: + - 1.13.x - tip before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover + - go get -t -v ./... + script: - - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) + diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md index 56729a92c..e055952b6 100644 --- a/vendor/github.com/mattn/go-colorable/README.md +++ b/vendor/github.com/mattn/go-colorable/README.md @@ -1,8 +1,8 @@ # go-colorable -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) [![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) +[![Codecov](https://codecov.io/gh/mattn/go-colorable/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-colorable) +[![GoDoc](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) [![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) Colorable writer for windows. diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go index 1f28d773d..1f7806fe1 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_appengine.go +++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -9,7 +9,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -18,12 +18,20 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go index 887f203dc..08cbd1e0f 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ b/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -10,7 +10,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -19,12 +19,20 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go index 404e10ca0..04c4229c4 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ b/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -10,6 +10,7 @@ import ( "os" "strconv" "strings" + "sync" "syscall" "unsafe" @@ -27,6 +28,9 @@ const ( backgroundRed = 0x40 backgroundIntensity = 0x80 backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) + commonLvbUnderscore = 0x8000 + + cENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 ) const ( @@ -78,10 +82,12 @@ var ( procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procSetConsoleMode = kernel32.NewProc("SetConsoleMode") procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") ) -// Writer provide colorable Writer to the console +// Writer provides colorable Writer to the console type Writer struct { out io.Writer handle syscall.Handle @@ -89,15 +95,20 @@ type Writer struct { oldattr word oldpos coord rest bytes.Buffer + mutex sync.Mutex } -// NewColorable return new instance of Writer which handle escape sequence from File. +// NewColorable returns new instance of Writer which handles escape sequence from File. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") } if isatty.IsTerminal(file.Fd()) { + var mode uint32 + if r, _, _ := procGetConsoleMode.Call(file.Fd(), uintptr(unsafe.Pointer(&mode))); r != 0 && mode&cENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 { + return file + } var csbi consoleScreenBufferInfo handle := syscall.Handle(file.Fd()) procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) @@ -106,12 +117,12 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return NewColorable(os.Stdout) } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return NewColorable(os.Stderr) } @@ -414,8 +425,18 @@ func doTitleSequence(er *bytes.Reader) error { return nil } -// Write write data on console +// returns Atoi(s) unless s == "" in which case it returns def +func atoiWithDefault(s string, def int) (int, error) { + if s == "" { + return def, nil + } + return strconv.Atoi(s) +} + +// Write writes data on console func (w *Writer) Write(data []byte) (n int, err error) { + w.mutex.Lock() + defer w.mutex.Unlock() var csbi consoleScreenBufferInfo procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) @@ -500,7 +521,7 @@ loop: switch m { case 'A': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -508,7 +529,7 @@ loop: csbi.cursorPosition.y -= short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'B': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -516,7 +537,7 @@ loop: csbi.cursorPosition.y += short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'C': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -524,7 +545,7 @@ loop: csbi.cursorPosition.x += short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'D': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -557,6 +578,9 @@ loop: if err != nil { continue } + if n < 1 { + n = 1 + } procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x = short(n - 1) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) @@ -635,6 +659,20 @@ loop: } procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'X': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var written dword + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) case 'm': procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) attr := csbi.attributes @@ -650,14 +688,19 @@ loop: switch { case n == 0 || n == 100: attr = w.oldattr - case 1 <= n && n <= 5: - attr |= foregroundIntensity - case n == 7: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case n == 22 || n == 25: + case n == 4: + attr |= commonLvbUnderscore + case (1 <= n && n <= 3) || n == 5: attr |= foregroundIntensity - case n == 27: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case n == 7 || n == 27: + attr = + (attr &^ (foregroundMask | backgroundMask)) | + ((attr & foregroundMask) << 4) | + ((attr & backgroundMask) >> 4) + case n == 22: + attr &^= foregroundIntensity + case n == 24: + attr &^= commonLvbUnderscore case 30 <= n && n <= 37: attr &= backgroundMask if (n-30)&1 != 0 { @@ -978,3 +1021,23 @@ func n256setup() { n256backAttr[i] = c.backgroundAttr() } } + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + var mode uint32 + h := os.Stdout.Fd() + if r, _, _ := procGetConsoleMode.Call(h, uintptr(unsafe.Pointer(&mode))); r != 0 { + if r, _, _ = procSetConsoleMode.Call(h, uintptr(mode|cENABLE_VIRTUAL_TERMINAL_PROCESSING)); r != 0 { + if enabled != nil { + *enabled = true + } + return func() { + procSetConsoleMode.Call(h, uintptr(mode)) + } + } + } + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod index ef3ca9d4c..1e590b819 100644 --- a/vendor/github.com/mattn/go-colorable/go.mod +++ b/vendor/github.com/mattn/go-colorable/go.mod @@ -1,3 +1,8 @@ module github.com/mattn/go-colorable -require github.com/mattn/go-isatty v0.0.8 +require ( + github.com/mattn/go-isatty v0.0.12 + golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect +) + +go 1.13 diff --git a/vendor/github.com/mattn/go-colorable/go.sum b/vendor/github.com/mattn/go-colorable/go.sum index 2c12960ec..cf5b95d97 100644 --- a/vendor/github.com/mattn/go-colorable/go.sum +++ b/vendor/github.com/mattn/go-colorable/go.sum @@ -1,4 +1,5 @@ -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-colorable/go.test.sh b/vendor/github.com/mattn/go-colorable/go.test.sh new file mode 100644 index 000000000..012162b07 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go index 9721e16f4..95f2c6be2 100644 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ b/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -5,17 +5,17 @@ import ( "io" ) -// NonColorable hold writer but remove escape sequence. +// NonColorable holds writer but removes escape sequence. type NonColorable struct { out io.Writer } -// NewNonColorable return new instance of Writer which remove escape sequence from Writer. +// NewNonColorable returns new instance of Writer which removes escape sequence from Writer. func NewNonColorable(w io.Writer) io.Writer { return &NonColorable{out: w} } -// Write write data on console +// Write writes data on console func (w *NonColorable) Write(data []byte) (n int, err error) { er := bytes.NewReader(data) var bw [1]byte diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml index 5597e026d..604314dd4 100644 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ b/vendor/github.com/mattn/go-isatty/.travis.yml @@ -1,13 +1,14 @@ language: go +sudo: false go: + - 1.13.x - tip -os: - - linux - - osx - before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover + - go get -t -v ./... + script: - - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md index 1e69004bb..38418353e 100644 --- a/vendor/github.com/mattn/go-isatty/README.md +++ b/vendor/github.com/mattn/go-isatty/README.md @@ -1,7 +1,7 @@ # go-isatty [![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) +[![Codecov](https://codecov.io/gh/mattn/go-isatty/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-isatty) [![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) [![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod index f310320c3..605c4c221 100644 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ b/vendor/github.com/mattn/go-isatty/go.mod @@ -1,3 +1,5 @@ module github.com/mattn/go-isatty -require golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 +go 1.12 + +require golang.org/x/sys v0.0.0-20200116001909-b77594299b42 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum index 426c8973c..912e29cbc 100644 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ b/vendor/github.com/mattn/go-isatty/go.sum @@ -1,2 +1,2 @@ -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/go.test.sh b/vendor/github.com/mattn/go-isatty/go.test.sh new file mode 100644 index 000000000..012162b07 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-isatty/isatty_android.go b/vendor/github.com/mattn/go-isatty/isatty_android.go deleted file mode 100644 index d3567cb5b..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_android.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build android - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go index 07e93039d..711f28808 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -3,18 +3,12 @@ package isatty -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA +import "golang.org/x/sys/unix" // IsTerminal return true if the file descriptor is terminal. func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 + _, err := unix.IoctlGetTermios(int(fd), unix.TIOCGETA) + return err == nil } // IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go new file mode 100644 index 000000000..c5b6e0c08 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_plan9.go @@ -0,0 +1,22 @@ +// +build plan9 + +package isatty + +import ( + "syscall" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd uintptr) bool { + path, err := syscall.Fd2path(int(fd)) + if err != nil { + return false + } + return path == "/dev/cons" || path == "/mnt/term/dev/cons" +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go index 453b025d0..31a1ca973 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -1,6 +1,5 @@ // +build linux aix // +build !appengine -// +build !android package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go index af51cbcaa..1fa869154 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ b/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -4,6 +4,7 @@ package isatty import ( + "errors" "strings" "syscall" "unicode/utf16" @@ -11,15 +12,18 @@ import ( ) const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 + objectNameInfo uintptr = 1 + fileNameInfo = 2 + fileTypePipe = 3 ) var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") + ntdll = syscall.NewLazyDLL("ntdll.dll") procGetConsoleMode = kernel32.NewProc("GetConsoleMode") procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") procGetFileType = kernel32.NewProc("GetFileType") + procNtQueryObject = ntdll.NewProc("NtQueryObject") ) func init() { @@ -45,7 +49,10 @@ func isCygwinPipeName(name string) bool { return false } - if token[0] != `\msys` && token[0] != `\cygwin` { + if token[0] != `\msys` && + token[0] != `\cygwin` && + token[0] != `\Device\NamedPipe\msys` && + token[0] != `\Device\NamedPipe\cygwin` { return false } @@ -68,11 +75,35 @@ func isCygwinPipeName(name string) bool { return true } +// getFileNameByHandle use the undocomented ntdll NtQueryObject to get file full name from file handler +// since GetFileInformationByHandleEx is not avilable under windows Vista and still some old fashion +// guys are using Windows XP, this is a workaround for those guys, it will also work on system from +// Windows vista to 10 +// see https://stackoverflow.com/a/18792477 for details +func getFileNameByHandle(fd uintptr) (string, error) { + if procNtQueryObject == nil { + return "", errors.New("ntdll.dll: NtQueryObject not supported") + } + + var buf [4 + syscall.MAX_PATH]uint16 + var result int + r, _, e := syscall.Syscall6(procNtQueryObject.Addr(), 5, + fd, objectNameInfo, uintptr(unsafe.Pointer(&buf)), uintptr(2*len(buf)), uintptr(unsafe.Pointer(&result)), 0) + if r != 0 { + return "", e + } + return string(utf16.Decode(buf[4 : 4+buf[0]/2])), nil +} + // IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 // terminal. func IsCygwinTerminal(fd uintptr) bool { if procGetFileInformationByHandleEx == nil { - return false + name, err := getFileNameByHandle(fd) + if err != nil { + return false + } + return isCygwinPipeName(name) } // Cygwin/msys's pty is a pipe. diff --git a/vendor/github.com/mattn/go-isatty/renovate.json b/vendor/github.com/mattn/go-isatty/renovate.json new file mode 100644 index 000000000..5ae9d96b7 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/renovate.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "config:base" + ], + "postUpdateOptions": [ + "gomodTidy" + ] +} diff --git a/vendor/github.com/mikefarah/yaml/v2/.travis.yml b/vendor/github.com/mikefarah/yaml/v2/.travis.yml deleted file mode 100644 index 9f556934d..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - 1.9 - - tip - -go_import_path: gopkg.in/yaml.v2 diff --git a/vendor/github.com/mikefarah/yaml/v2/LICENSE.libyaml b/vendor/github.com/mikefarah/yaml/v2/LICENSE.libyaml deleted file mode 100644 index 8da58fbf6..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/LICENSE.libyaml +++ /dev/null @@ -1,31 +0,0 @@ -The following files were ported to Go from C files of libyaml, and thus -are still covered by their original copyright and license: - - apic.go - emitterc.go - parserc.go - readerc.go - scannerc.go - writerc.go - yamlh.go - yamlprivateh.go - -Copyright (c) 2006 Kirill Simonov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/mikefarah/yaml/v2/NOTICE b/vendor/github.com/mikefarah/yaml/v2/NOTICE deleted file mode 100644 index 866d74a7a..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2011-2016 Canonical Ltd. - -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. diff --git a/vendor/github.com/mikefarah/yaml/v2/README.md b/vendor/github.com/mikefarah/yaml/v2/README.md deleted file mode 100644 index b50c6e877..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/README.md +++ /dev/null @@ -1,133 +0,0 @@ -# YAML support for the Go language - -Introduction ------------- - -The yaml package enables Go programs to comfortably encode and decode YAML -values. It was developed within [Canonical](https://www.canonical.com) as -part of the [juju](https://juju.ubuntu.com) project, and is based on a -pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) -C library to parse and generate YAML data quickly and reliably. - -Compatibility -------------- - -The yaml package supports most of YAML 1.1 and 1.2, including support for -anchors, tags, map merging, etc. Multi-document unmarshalling is not yet -implemented, and base-60 floats from YAML 1.1 are purposefully not -supported since they're a poor design and are gone in YAML 1.2. - -Installation and usage ----------------------- - -The import path for the package is *gopkg.in/yaml.v2*. - -To install it, run: - - go get gopkg.in/yaml.v2 - -API documentation ------------------ - -If opened in a browser, the import path itself leads to the API documentation: - - * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2) - -API stability -------------- - -The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in). - - -License -------- - -The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details. - - -Example -------- - -```Go -package main - -import ( - "fmt" - "log" - - "gopkg.in/yaml.v2" -) - -var data = ` -a: Easy! -b: - c: 2 - d: [3, 4] -` - -// Note: struct fields must be public in order for unmarshal to -// correctly populate the data. -type T struct { - A string - B struct { - RenamedC int `yaml:"c"` - D []int `yaml:",flow"` - } -} - -func main() { - t := T{} - - err := yaml.Unmarshal([]byte(data), &t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t:\n%v\n\n", t) - - d, err := yaml.Marshal(&t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t dump:\n%s\n\n", string(d)) - - m := make(map[interface{}]interface{}) - - err = yaml.Unmarshal([]byte(data), &m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m:\n%v\n\n", m) - - d, err = yaml.Marshal(&m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m dump:\n%s\n\n", string(d)) -} -``` - -This example will generate the following output: - -``` ---- t: -{Easy! {2 [3 4]}} - ---- t dump: -a: Easy! -b: - c: 2 - d: [3, 4] - - ---- m: -map[a:Easy! b:map[c:2 d:[3 4]]] - ---- m dump: -a: Easy! -b: - c: 2 - d: - - 3 - - 4 -``` - diff --git a/vendor/github.com/mikefarah/yaml/v2/apic.go b/vendor/github.com/mikefarah/yaml/v2/apic.go deleted file mode 100644 index 1f7e87e67..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/apic.go +++ /dev/null @@ -1,739 +0,0 @@ -package yaml - -import ( - "io" -) - -func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { - //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) - - // Check if we can move the queue at the beginning of the buffer. - if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { - if parser.tokens_head != len(parser.tokens) { - copy(parser.tokens, parser.tokens[parser.tokens_head:]) - } - parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] - parser.tokens_head = 0 - } - parser.tokens = append(parser.tokens, *token) - if pos < 0 { - return - } - copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) - parser.tokens[parser.tokens_head+pos] = *token -} - -// Create a new parser object. -func yaml_parser_initialize(parser *yaml_parser_t) bool { - *parser = yaml_parser_t{ - raw_buffer: make([]byte, 0, input_raw_buffer_size), - buffer: make([]byte, 0, input_buffer_size), - } - return true -} - -// Destroy a parser object. -func yaml_parser_delete(parser *yaml_parser_t) { - *parser = yaml_parser_t{} -} - -// String read handler. -func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - if parser.input_pos == len(parser.input) { - return 0, io.EOF - } - n = copy(buffer, parser.input[parser.input_pos:]) - parser.input_pos += n - return n, nil -} - -// Reader read handler. -func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - return parser.input_reader.Read(buffer) -} - -// Set a string input. -func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_string_read_handler - parser.input = input - parser.input_pos = 0 -} - -// Set a file input. -func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_reader_read_handler - parser.input_reader = r -} - -// Set the source encoding. -func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { - if parser.encoding != yaml_ANY_ENCODING { - panic("must set the encoding only once") - } - parser.encoding = encoding -} - -// Create a new emitter object. -func yaml_emitter_initialize(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{ - buffer: make([]byte, output_buffer_size), - raw_buffer: make([]byte, 0, output_raw_buffer_size), - states: make([]yaml_emitter_state_t, 0, initial_stack_size), - events: make([]yaml_event_t, 0, initial_queue_size), - } -} - -// Destroy an emitter object. -func yaml_emitter_delete(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{} -} - -// String write handler. -func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - *emitter.output_buffer = append(*emitter.output_buffer, buffer...) - return nil -} - -// yaml_writer_write_handler uses emitter.output_writer to write the -// emitted text. -func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - _, err := emitter.output_writer.Write(buffer) - return err -} - -// Set a string output. -func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_string_write_handler - emitter.output_buffer = output_buffer -} - -// Set a file output. -func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_writer_write_handler - emitter.output_writer = w -} - -// Set the output encoding. -func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { - if emitter.encoding != yaml_ANY_ENCODING { - panic("must set the output encoding only once") - } - emitter.encoding = encoding -} - -// Set the canonical output style. -func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { - emitter.canonical = canonical -} - -//// Set the indentation increment. -func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { - if indent < 2 || indent > 9 { - indent = 2 - } - emitter.best_indent = indent -} - -// Set the preferred line width. -func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { - if width < 0 { - width = -1 - } - emitter.best_width = width -} - -// Set if unescaped non-ASCII characters are allowed. -func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { - emitter.unicode = unicode -} - -// Set the preferred line break character. -func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { - emitter.line_break = line_break -} - -///* -// * Destroy a token object. -// */ -// -//YAML_DECLARE(void) -//yaml_token_delete(yaml_token_t *token) -//{ -// assert(token); // Non-NULL token object expected. -// -// switch (token.type) -// { -// case YAML_TAG_DIRECTIVE_TOKEN: -// yaml_free(token.data.tag_directive.handle); -// yaml_free(token.data.tag_directive.prefix); -// break; -// -// case YAML_ALIAS_TOKEN: -// yaml_free(token.data.alias.value); -// break; -// -// case YAML_ANCHOR_TOKEN: -// yaml_free(token.data.anchor.value); -// break; -// -// case YAML_TAG_TOKEN: -// yaml_free(token.data.tag.handle); -// yaml_free(token.data.tag.suffix); -// break; -// -// case YAML_SCALAR_TOKEN: -// yaml_free(token.data.scalar.value); -// break; -// -// default: -// break; -// } -// -// memset(token, 0, sizeof(yaml_token_t)); -//} -// -///* -// * Check if a string is a valid UTF-8 sequence. -// * -// * Check 'reader.c' for more details on UTF-8 encoding. -// */ -// -//static int -//yaml_check_utf8(yaml_char_t *start, size_t length) -//{ -// yaml_char_t *end = start+length; -// yaml_char_t *pointer = start; -// -// while (pointer < end) { -// unsigned char octet; -// unsigned int width; -// unsigned int value; -// size_t k; -// -// octet = pointer[0]; -// width = (octet & 0x80) == 0x00 ? 1 : -// (octet & 0xE0) == 0xC0 ? 2 : -// (octet & 0xF0) == 0xE0 ? 3 : -// (octet & 0xF8) == 0xF0 ? 4 : 0; -// value = (octet & 0x80) == 0x00 ? octet & 0x7F : -// (octet & 0xE0) == 0xC0 ? octet & 0x1F : -// (octet & 0xF0) == 0xE0 ? octet & 0x0F : -// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; -// if (!width) return 0; -// if (pointer+width > end) return 0; -// for (k = 1; k < width; k ++) { -// octet = pointer[k]; -// if ((octet & 0xC0) != 0x80) return 0; -// value = (value << 6) + (octet & 0x3F); -// } -// if (!((width == 1) || -// (width == 2 && value >= 0x80) || -// (width == 3 && value >= 0x800) || -// (width == 4 && value >= 0x10000))) return 0; -// -// pointer += width; -// } -// -// return 1; -//} -// - -// Create STREAM-START. -func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - encoding: encoding, - } -} - -// Create STREAM-END. -func yaml_stream_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - } -} - -// Create DOCUMENT-START. -func yaml_document_start_event_initialize( - event *yaml_event_t, - version_directive *yaml_version_directive_t, - tag_directives []yaml_tag_directive_t, - implicit bool, -) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: implicit, - } -} - -// Create DOCUMENT-END. -func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - implicit: implicit, - } -} - -///* -// * Create ALIAS. -// */ -// -//YAML_DECLARE(int) -//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) -//{ -// mark yaml_mark_t = { 0, 0, 0 } -// anchor_copy *yaml_char_t = NULL -// -// assert(event) // Non-NULL event object is expected. -// assert(anchor) // Non-NULL anchor is expected. -// -// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 -// -// anchor_copy = yaml_strdup(anchor) -// if (!anchor_copy) -// return 0 -// -// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) -// -// return 1 -//} - -// Create SCALAR. -func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - anchor: anchor, - tag: tag, - value: value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-START. -func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-END. -func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - } - return true -} - -// Create MAPPING-START. -func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } -} - -// Create MAPPING-END. -func yaml_mapping_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - } -} - -// Destroy an event object. -func yaml_event_delete(event *yaml_event_t) { - *event = yaml_event_t{} -} - -///* -// * Create a document object. -// */ -// -//YAML_DECLARE(int) -//yaml_document_initialize(document *yaml_document_t, -// version_directive *yaml_version_directive_t, -// tag_directives_start *yaml_tag_directive_t, -// tag_directives_end *yaml_tag_directive_t, -// start_implicit int, end_implicit int) -//{ -// struct { -// error yaml_error_type_t -// } context -// struct { -// start *yaml_node_t -// end *yaml_node_t -// top *yaml_node_t -// } nodes = { NULL, NULL, NULL } -// version_directive_copy *yaml_version_directive_t = NULL -// struct { -// start *yaml_tag_directive_t -// end *yaml_tag_directive_t -// top *yaml_tag_directive_t -// } tag_directives_copy = { NULL, NULL, NULL } -// value yaml_tag_directive_t = { NULL, NULL } -// mark yaml_mark_t = { 0, 0, 0 } -// -// assert(document) // Non-NULL document object is expected. -// assert((tag_directives_start && tag_directives_end) || -// (tag_directives_start == tag_directives_end)) -// // Valid tag directives are expected. -// -// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error -// -// if (version_directive) { -// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) -// if (!version_directive_copy) goto error -// version_directive_copy.major = version_directive.major -// version_directive_copy.minor = version_directive.minor -// } -// -// if (tag_directives_start != tag_directives_end) { -// tag_directive *yaml_tag_directive_t -// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) -// goto error -// for (tag_directive = tag_directives_start -// tag_directive != tag_directives_end; tag_directive ++) { -// assert(tag_directive.handle) -// assert(tag_directive.prefix) -// if (!yaml_check_utf8(tag_directive.handle, -// strlen((char *)tag_directive.handle))) -// goto error -// if (!yaml_check_utf8(tag_directive.prefix, -// strlen((char *)tag_directive.prefix))) -// goto error -// value.handle = yaml_strdup(tag_directive.handle) -// value.prefix = yaml_strdup(tag_directive.prefix) -// if (!value.handle || !value.prefix) goto error -// if (!PUSH(&context, tag_directives_copy, value)) -// goto error -// value.handle = NULL -// value.prefix = NULL -// } -// } -// -// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, -// tag_directives_copy.start, tag_directives_copy.top, -// start_implicit, end_implicit, mark, mark) -// -// return 1 -// -//error: -// STACK_DEL(&context, nodes) -// yaml_free(version_directive_copy) -// while (!STACK_EMPTY(&context, tag_directives_copy)) { -// value yaml_tag_directive_t = POP(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// } -// STACK_DEL(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// -// return 0 -//} -// -///* -// * Destroy a document object. -// */ -// -//YAML_DECLARE(void) -//yaml_document_delete(document *yaml_document_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// tag_directive *yaml_tag_directive_t -// -// context.error = YAML_NO_ERROR // Eliminate a compiler warning. -// -// assert(document) // Non-NULL document object is expected. -// -// while (!STACK_EMPTY(&context, document.nodes)) { -// node yaml_node_t = POP(&context, document.nodes) -// yaml_free(node.tag) -// switch (node.type) { -// case YAML_SCALAR_NODE: -// yaml_free(node.data.scalar.value) -// break -// case YAML_SEQUENCE_NODE: -// STACK_DEL(&context, node.data.sequence.items) -// break -// case YAML_MAPPING_NODE: -// STACK_DEL(&context, node.data.mapping.pairs) -// break -// default: -// assert(0) // Should not happen. -// } -// } -// STACK_DEL(&context, document.nodes) -// -// yaml_free(document.version_directive) -// for (tag_directive = document.tag_directives.start -// tag_directive != document.tag_directives.end -// tag_directive++) { -// yaml_free(tag_directive.handle) -// yaml_free(tag_directive.prefix) -// } -// yaml_free(document.tag_directives.start) -// -// memset(document, 0, sizeof(yaml_document_t)) -//} -// -///** -// * Get a document node. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_node(document *yaml_document_t, index int) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (index > 0 && document.nodes.start + index <= document.nodes.top) { -// return document.nodes.start + index - 1 -// } -// return NULL -//} -// -///** -// * Get the root object. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_root_node(document *yaml_document_t) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (document.nodes.top != document.nodes.start) { -// return document.nodes.start -// } -// return NULL -//} -// -///* -// * Add a scalar node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_scalar(document *yaml_document_t, -// tag *yaml_char_t, value *yaml_char_t, length int, -// style yaml_scalar_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// value_copy *yaml_char_t = NULL -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// assert(value) // Non-NULL value is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (length < 0) { -// length = strlen((char *)value) -// } -// -// if (!yaml_check_utf8(value, length)) goto error -// value_copy = yaml_malloc(length+1) -// if (!value_copy) goto error -// memcpy(value_copy, value, length) -// value_copy[length] = '\0' -// -// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// yaml_free(tag_copy) -// yaml_free(value_copy) -// -// return 0 -//} -// -///* -// * Add a sequence node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_sequence(document *yaml_document_t, -// tag *yaml_char_t, style yaml_sequence_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_item_t -// end *yaml_node_item_t -// top *yaml_node_item_t -// } items = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error -// -// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, items) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Add a mapping node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_mapping(document *yaml_document_t, -// tag *yaml_char_t, style yaml_mapping_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_pair_t -// end *yaml_node_pair_t -// top *yaml_node_pair_t -// } pairs = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error -// -// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, pairs) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Append an item to a sequence node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_sequence_item(document *yaml_document_t, -// sequence int, item int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// assert(document) // Non-NULL document is required. -// assert(sequence > 0 -// && document.nodes.start + sequence <= document.nodes.top) -// // Valid sequence id is required. -// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) -// // A sequence node is required. -// assert(item > 0 && document.nodes.start + item <= document.nodes.top) -// // Valid item id is required. -// -// if (!PUSH(&context, -// document.nodes.start[sequence-1].data.sequence.items, item)) -// return 0 -// -// return 1 -//} -// -///* -// * Append a pair of a key and a value to a mapping node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_mapping_pair(document *yaml_document_t, -// mapping int, key int, value int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// pair yaml_node_pair_t -// -// assert(document) // Non-NULL document is required. -// assert(mapping > 0 -// && document.nodes.start + mapping <= document.nodes.top) -// // Valid mapping id is required. -// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) -// // A mapping node is required. -// assert(key > 0 && document.nodes.start + key <= document.nodes.top) -// // Valid key id is required. -// assert(value > 0 && document.nodes.start + value <= document.nodes.top) -// // Valid value id is required. -// -// pair.key = key -// pair.value = value -// -// if (!PUSH(&context, -// document.nodes.start[mapping-1].data.mapping.pairs, pair)) -// return 0 -// -// return 1 -//} -// -// diff --git a/vendor/github.com/mikefarah/yaml/v2/decode.go b/vendor/github.com/mikefarah/yaml/v2/decode.go deleted file mode 100644 index 71c366554..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/decode.go +++ /dev/null @@ -1,776 +0,0 @@ -package yaml - -import ( - "encoding" - "encoding/base64" - "fmt" - "io" - "math" - "reflect" - "strconv" - "time" -) - -const ( - documentNode = 1 << iota - mappingNode - sequenceNode - scalarNode - aliasNode -) - -type node struct { - kind int - line, column int - tag string - // For an alias node, alias holds the resolved alias. - alias *node - value string - implicit bool - children []*node - anchors map[string]*node -} - -// ---------------------------------------------------------------------------- -// Parser, produces a node tree out of a libyaml event stream. - -type parser struct { - parser yaml_parser_t - event yaml_event_t - doc *node - doneInit bool -} - -func newParser(b []byte) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - if len(b) == 0 { - b = []byte{'\n'} - } - yaml_parser_set_input_string(&p.parser, b) - return &p -} - -func newParserFromReader(r io.Reader) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - yaml_parser_set_input_reader(&p.parser, r) - return &p -} - -func (p *parser) init() { - if p.doneInit { - return - } - p.expect(yaml_STREAM_START_EVENT) - p.doneInit = true -} - -func (p *parser) destroy() { - if p.event.typ != yaml_NO_EVENT { - yaml_event_delete(&p.event) - } - yaml_parser_delete(&p.parser) -} - -// expect consumes an event from the event stream and -// checks that it's of the expected type. -func (p *parser) expect(e yaml_event_type_t) { - if p.event.typ == yaml_NO_EVENT { - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - } - if p.event.typ == yaml_STREAM_END_EVENT { - failf("attempted to go past the end of stream; corrupted value?") - } - if p.event.typ != e { - p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) - p.fail() - } - yaml_event_delete(&p.event) - p.event.typ = yaml_NO_EVENT -} - -// peek peeks at the next event in the event stream, -// puts the results into p.event and returns the event type. -func (p *parser) peek() yaml_event_type_t { - if p.event.typ != yaml_NO_EVENT { - return p.event.typ - } - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - return p.event.typ -} - -func (p *parser) fail() { - var where string - var line int - if p.parser.problem_mark.line != 0 { - line = p.parser.problem_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } - } else if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line - } - if line != 0 { - where = "line " + strconv.Itoa(line) + ": " - } - var msg string - if len(p.parser.problem) > 0 { - msg = p.parser.problem - } else { - msg = "unknown problem parsing YAML content" - } - failf("%s%s", where, msg) -} - -func (p *parser) anchor(n *node, anchor []byte) { - if anchor != nil { - p.doc.anchors[string(anchor)] = n - } -} - -func (p *parser) parse() *node { - p.init() - switch p.peek() { - case yaml_SCALAR_EVENT: - return p.scalar() - case yaml_ALIAS_EVENT: - return p.alias() - case yaml_MAPPING_START_EVENT: - return p.mapping() - case yaml_SEQUENCE_START_EVENT: - return p.sequence() - case yaml_DOCUMENT_START_EVENT: - return p.document() - case yaml_STREAM_END_EVENT: - // Happens when attempting to decode an empty buffer. - return nil - default: - panic("attempted to parse unknown event: " + p.event.typ.String()) - } -} - -func (p *parser) node(kind int) *node { - return &node{ - kind: kind, - line: p.event.start_mark.line, - column: p.event.start_mark.column, - } -} - -func (p *parser) document() *node { - n := p.node(documentNode) - n.anchors = make(map[string]*node) - p.doc = n - p.expect(yaml_DOCUMENT_START_EVENT) - n.children = append(n.children, p.parse()) - p.expect(yaml_DOCUMENT_END_EVENT) - return n -} - -func (p *parser) alias() *node { - n := p.node(aliasNode) - n.value = string(p.event.anchor) - n.alias = p.doc.anchors[n.value] - if n.alias == nil { - failf("unknown anchor '%s' referenced", n.value) - } - p.expect(yaml_ALIAS_EVENT) - return n -} - -func (p *parser) scalar() *node { - n := p.node(scalarNode) - n.value = string(p.event.value) - n.tag = string(p.event.tag) - n.implicit = p.event.implicit - p.anchor(n, p.event.anchor) - p.expect(yaml_SCALAR_EVENT) - return n -} - -func (p *parser) sequence() *node { - n := p.node(sequenceNode) - p.anchor(n, p.event.anchor) - p.expect(yaml_SEQUENCE_START_EVENT) - for p.peek() != yaml_SEQUENCE_END_EVENT { - n.children = append(n.children, p.parse()) - } - p.expect(yaml_SEQUENCE_END_EVENT) - return n -} - -func (p *parser) mapping() *node { - n := p.node(mappingNode) - p.anchor(n, p.event.anchor) - p.expect(yaml_MAPPING_START_EVENT) - for p.peek() != yaml_MAPPING_END_EVENT { - n.children = append(n.children, p.parse(), p.parse()) - } - p.expect(yaml_MAPPING_END_EVENT) - return n -} - -// ---------------------------------------------------------------------------- -// Decoder, unmarshals a node into a provided value. - -type decoder struct { - doc *node - aliases map[*node]bool - mapType reflect.Type - terrors []string - strict bool -} - -var ( - mapItemType = reflect.TypeOf(MapItem{}) - durationType = reflect.TypeOf(time.Duration(0)) - // DefaultMapType type to unmarshal maps into, use MapSlice for ordered maps. - DefaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) - ifaceType = DefaultMapType.Elem() - timeType = reflect.TypeOf(time.Time{}) - ptrTimeType = reflect.TypeOf(&time.Time{}) -) - -func newDecoder(strict bool) *decoder { - d := &decoder{mapType: DefaultMapType, strict: strict} - d.aliases = make(map[*node]bool) - return d -} - -func (d *decoder) terror(n *node, tag string, out reflect.Value) { - if n.tag != "" { - tag = n.tag - } - value := n.value - if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { - if len(value) > 10 { - value = " `" + value[:7] + "...`" - } else { - value = " `" + value + "`" - } - } - d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) -} - -func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { - terrlen := len(d.terrors) - err := u.UnmarshalYAML(func(v interface{}) (err error) { - defer handleErr(&err) - d.unmarshal(n, reflect.ValueOf(v)) - if len(d.terrors) > terrlen { - issues := d.terrors[terrlen:] - d.terrors = d.terrors[:terrlen] - return &TypeError{issues} - } - return nil - }) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -// d.prepare initializes and dereferences pointers and calls UnmarshalYAML -// if a value is found to implement it. -// It returns the initialized and dereferenced out value, whether -// unmarshalling was already done by UnmarshalYAML, and if so whether -// its types unmarshalled appropriately. -// -// If n holds a null value, prepare returns before doing anything. -func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { - if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) { - return out, false, false - } - again := true - for again { - again = false - if out.Kind() == reflect.Ptr { - if out.IsNil() { - out.Set(reflect.New(out.Type().Elem())) - } - out = out.Elem() - again = true - } - if out.CanAddr() { - if u, ok := out.Addr().Interface().(Unmarshaler); ok { - good = d.callUnmarshaler(n, u) - return out, true, good - } - } - } - return out, false, false -} - -func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { - switch n.kind { - case documentNode: - return d.document(n, out) - case aliasNode: - return d.alias(n, out) - } - out, unmarshaled, good := d.prepare(n, out) - if unmarshaled { - return good - } - switch n.kind { - case scalarNode: - good = d.scalar(n, out) - case mappingNode: - good = d.mapping(n, out) - case sequenceNode: - good = d.sequence(n, out) - default: - panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) - } - return good -} - -func (d *decoder) document(n *node, out reflect.Value) (good bool) { - if len(n.children) == 1 { - d.doc = n - d.unmarshal(n.children[0], out) - return true - } - return false -} - -func (d *decoder) alias(n *node, out reflect.Value) (good bool) { - if d.aliases[n] { - // TODO this could actually be allowed in some circumstances. - failf("anchor '%s' value contains itself", n.value) - } - d.aliases[n] = true - good = d.unmarshal(n.alias, out) - delete(d.aliases, n) - return good -} - -var zeroValue reflect.Value - -func resetMap(out reflect.Value) { - for _, k := range out.MapKeys() { - out.SetMapIndex(k, zeroValue) - } -} - -func (d *decoder) scalar(n *node, out reflect.Value) bool { - var tag string - var resolved interface{} - if n.tag == "" && !n.implicit { - tag = yaml_STR_TAG - resolved = n.value - } else { - tag, resolved = resolve(n.tag, n.value) - if tag == yaml_BINARY_TAG { - data, err := base64.StdEncoding.DecodeString(resolved.(string)) - if err != nil { - failf("!!binary value contains invalid base64 data") - } - resolved = string(data) - } - } - if resolved == nil { - if out.Kind() == reflect.Map && !out.CanAddr() { - resetMap(out) - } else { - out.Set(reflect.Zero(out.Type())) - } - return true - } - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - // We've resolved to exactly the type we want, so use that. - out.Set(resolvedv) - return true - } - // Perhaps we can use the value as a TextUnmarshaler to - // set its value. - if out.CanAddr() { - u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) - if ok { - var text []byte - if tag == yaml_BINARY_TAG { - text = []byte(resolved.(string)) - } else { - // We let any value be unmarshaled into TextUnmarshaler. - // That might be more lax than we'd like, but the - // TextUnmarshaler itself should bowl out any dubious values. - text = []byte(n.value) - } - err := u.UnmarshalText(text) - if err != nil { - fail(err) - } - return true - } - } - switch out.Kind() { - case reflect.String: - if tag == yaml_BINARY_TAG { - out.SetString(resolved.(string)) - return true - } - if resolved != nil { - out.SetString(n.value) - return true - } - case reflect.Interface: - if resolved == nil { - out.Set(reflect.Zero(out.Type())) - } else if tag == yaml_TIMESTAMP_TAG { - // It looks like a timestamp but for backward compatibility - // reasons we set it as a string, so that code that unmarshals - // timestamp-like values into interface{} will continue to - // see a string and not a time.Time. - // TODO(v3) Drop this. - out.Set(reflect.ValueOf(n.value)) - } else { - out.Set(reflect.ValueOf(resolved)) - } - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch resolved := resolved.(type) { - case int: - if !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case int64: - if !out.OverflowInt(resolved) { - out.SetInt(resolved) - return true - } - case uint64: - if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case float64: - if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case string: - if out.Type() == durationType { - d, err := time.ParseDuration(resolved) - if err == nil { - out.SetInt(int64(d)) - return true - } - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch resolved := resolved.(type) { - case int: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case int64: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case uint64: - if !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case float64: - if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - } - case reflect.Bool: - switch resolved := resolved.(type) { - case bool: - out.SetBool(resolved) - return true - } - case reflect.Float32, reflect.Float64: - switch resolved := resolved.(type) { - case int: - out.SetFloat(float64(resolved)) - return true - case int64: - out.SetFloat(float64(resolved)) - return true - case uint64: - out.SetFloat(float64(resolved)) - return true - case float64: - out.SetFloat(resolved) - return true - } - case reflect.Struct: - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - out.Set(resolvedv) - return true - } - case reflect.Ptr: - if out.Type().Elem() == reflect.TypeOf(resolved) { - // TODO DOes this make sense? When is out a Ptr except when decoding a nil value? - elem := reflect.New(out.Type().Elem()) - elem.Elem().Set(reflect.ValueOf(resolved)) - out.Set(elem) - return true - } - } - d.terror(n, tag, out) - return false -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { - l := len(n.children) - - var iface reflect.Value - switch out.Kind() { - case reflect.Slice: - out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } - case reflect.Interface: - // No type hints. Will have to use a generic sequence. - iface = out - out = settableValueOf(make([]interface{}, l)) - default: - d.terror(n, yaml_SEQ_TAG, out) - return false - } - et := out.Type().Elem() - - j := 0 - for i := 0; i < l; i++ { - e := reflect.New(et).Elem() - if ok := d.unmarshal(n.children[i], e); ok { - out.Index(j).Set(e) - j++ - } - } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } - if iface.IsValid() { - iface.Set(out) - } - return true -} - -func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { - switch out.Kind() { - case reflect.Struct: - return d.mappingStruct(n, out) - case reflect.Slice: - return d.mappingSlice(n, out) - case reflect.Map: - // okay - case reflect.Interface: - if d.mapType.Kind() == reflect.Map { - iface := out - out = reflect.MakeMap(d.mapType) - iface.Set(out) - } else { - slicev := reflect.New(d.mapType).Elem() - if !d.mappingSlice(n, slicev) { - return false - } - out.Set(slicev) - return true - } - default: - d.terror(n, yaml_MAP_TAG, out) - return false - } - outt := out.Type() - kt := outt.Key() - et := outt.Elem() - - mapType := d.mapType - if outt.Key() == ifaceType && outt.Elem() == ifaceType { - d.mapType = outt - } - - if out.IsNil() { - out.Set(reflect.MakeMap(outt)) - } - l := len(n.children) - for i := 0; i < l; i += 2 { - if isMerge(n.children[i]) { - d.merge(n.children[i+1], out) - continue - } - k := reflect.New(kt).Elem() - if d.unmarshal(n.children[i], k) { - kkind := k.Kind() - if kkind == reflect.Interface { - kkind = k.Elem().Kind() - } - if kkind == reflect.Map || kkind == reflect.Slice { - failf("invalid map key: %#v", k.Interface()) - } - e := reflect.New(et).Elem() - if d.unmarshal(n.children[i+1], e) { - d.setMapIndex(n.children[i+1], out, k, e) - } - } - } - d.mapType = mapType - return true -} - -func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) { - if d.strict && out.MapIndex(k) != zeroValue { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface())) - return - } - out.SetMapIndex(k, v) -} - -func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { - outt := out.Type() - if outt.Elem() != mapItemType { - d.terror(n, yaml_MAP_TAG, out) - return false - } - - mapType := d.mapType - d.mapType = outt - - var slice []MapItem - var l = len(n.children) - for i := 0; i < l; i += 2 { - if isMerge(n.children[i]) { - d.merge(n.children[i+1], out) - continue - } - item := MapItem{} - k := reflect.ValueOf(&item.Key).Elem() - if d.unmarshal(n.children[i], k) { - v := reflect.ValueOf(&item.Value).Elem() - if d.unmarshal(n.children[i+1], v) { - slice = append(slice, item) - } - } - } - out.Set(reflect.ValueOf(slice)) - d.mapType = mapType - return true -} - -func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - name := settableValueOf("") - l := len(n.children) - - var inlineMap reflect.Value - var elemType reflect.Type - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) - elemType = inlineMap.Type().Elem() - } - - var doneFields []bool - if d.strict { - doneFields = make([]bool, len(sinfo.FieldsList)) - } - for i := 0; i < l; i += 2 { - ni := n.children[i] - if isMerge(ni) { - d.merge(n.children[i+1], out) - continue - } - if !d.unmarshal(ni, name) { - continue - } - if info, ok := sinfo.FieldsMap[name.String()]; ok { - if d.strict { - if doneFields[info.Id] { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type())) - continue - } - doneFields[info.Id] = true - } - var field reflect.Value - if info.Inline == nil { - field = out.Field(info.Num) - } else { - field = out.FieldByIndex(info.Inline) - } - d.unmarshal(n.children[i+1], field) - } else if sinfo.InlineMap != -1 { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - value := reflect.New(elemType).Elem() - d.unmarshal(n.children[i+1], value) - d.setMapIndex(n.children[i+1], inlineMap, name, value) - } else if d.strict { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type())) - } - } - return true -} - -func failWantMap() { - failf("map merge requires map or sequence of maps as the value") -} - -func (d *decoder) merge(n *node, out reflect.Value) { - switch n.kind { - case mappingNode: - d.unmarshal(n, out) - case aliasNode: - an, ok := d.doc.anchors[n.value] - if ok && an.kind != mappingNode { - failWantMap() - } - d.unmarshal(n, out) - case sequenceNode: - // Step backwards as earlier nodes take precedence. - for i := len(n.children) - 1; i >= 0; i-- { - ni := n.children[i] - if ni.kind == aliasNode { - an, ok := d.doc.anchors[ni.value] - if ok && an.kind != mappingNode { - failWantMap() - } - } else if ni.kind != mappingNode { - failWantMap() - } - d.unmarshal(ni, out) - } - default: - failWantMap() - } -} - -func isMerge(n *node) bool { - return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) -} diff --git a/vendor/github.com/mikefarah/yaml/v2/emitterc.go b/vendor/github.com/mikefarah/yaml/v2/emitterc.go deleted file mode 100644 index a1c2cc526..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/emitterc.go +++ /dev/null @@ -1,1685 +0,0 @@ -package yaml - -import ( - "bytes" - "fmt" -) - -// Flush the buffer if needed. -func flush(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) { - return yaml_emitter_flush(emitter) - } - return true -} - -// Put a character to the output buffer. -func put(emitter *yaml_emitter_t, value byte) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - emitter.buffer[emitter.buffer_pos] = value - emitter.buffer_pos++ - emitter.column++ - return true -} - -// Put a line break to the output buffer. -func put_break(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - switch emitter.line_break { - case yaml_CR_BREAK: - emitter.buffer[emitter.buffer_pos] = '\r' - emitter.buffer_pos += 1 - case yaml_LN_BREAK: - emitter.buffer[emitter.buffer_pos] = '\n' - emitter.buffer_pos += 1 - case yaml_CRLN_BREAK: - emitter.buffer[emitter.buffer_pos+0] = '\r' - emitter.buffer[emitter.buffer_pos+1] = '\n' - emitter.buffer_pos += 2 - default: - panic("unknown line break setting") - } - emitter.column = 0 - emitter.line++ - return true -} - -// Copy a character from a string into buffer. -func write(emitter *yaml_emitter_t, s []byte, i *int) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - p := emitter.buffer_pos - w := width(s[*i]) - switch w { - case 4: - emitter.buffer[p+3] = s[*i+3] - fallthrough - case 3: - emitter.buffer[p+2] = s[*i+2] - fallthrough - case 2: - emitter.buffer[p+1] = s[*i+1] - fallthrough - case 1: - emitter.buffer[p+0] = s[*i+0] - default: - panic("unknown character width") - } - emitter.column++ - emitter.buffer_pos += w - *i += w - return true -} - -// Write a whole string into buffer. -func write_all(emitter *yaml_emitter_t, s []byte) bool { - for i := 0; i < len(s); { - if !write(emitter, s, &i) { - return false - } - } - return true -} - -// Copy a line break character from a string into buffer. -func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { - if s[*i] == '\n' { - if !put_break(emitter) { - return false - } - *i++ - } else { - if !write(emitter, s, i) { - return false - } - emitter.column = 0 - emitter.line++ - } - return true -} - -// Set an emitter error and return false. -func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_EMITTER_ERROR - emitter.problem = problem - return false -} - -// Emit an event. -func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.events = append(emitter.events, *event) - for !yaml_emitter_need_more_events(emitter) { - event := &emitter.events[emitter.events_head] - if !yaml_emitter_analyze_event(emitter, event) { - return false - } - if !yaml_emitter_state_machine(emitter, event) { - return false - } - yaml_event_delete(event) - emitter.events_head++ - } - return true -} - -// Check if we need to accumulate more events before emitting. -// -// We accumulate extra -// - 1 event for DOCUMENT-START -// - 2 events for SEQUENCE-START -// - 3 events for MAPPING-START -// -func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { - if emitter.events_head == len(emitter.events) { - return true - } - var accumulate int - switch emitter.events[emitter.events_head].typ { - case yaml_DOCUMENT_START_EVENT: - accumulate = 1 - break - case yaml_SEQUENCE_START_EVENT: - accumulate = 2 - break - case yaml_MAPPING_START_EVENT: - accumulate = 3 - break - default: - return false - } - if len(emitter.events)-emitter.events_head > accumulate { - return false - } - var level int - for i := emitter.events_head; i < len(emitter.events); i++ { - switch emitter.events[i].typ { - case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: - level++ - case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: - level-- - } - if level == 0 { - return false - } - } - return true -} - -// Append a directive to the directives stack. -func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { - for i := 0; i < len(emitter.tag_directives); i++ { - if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") - } - } - - // [Go] Do we actually need to copy this given garbage collection - // and the lack of deallocating destructors? - tag_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(tag_copy.handle, value.handle) - copy(tag_copy.prefix, value.prefix) - emitter.tag_directives = append(emitter.tag_directives, tag_copy) - return true -} - -// Increase the indentation level. -func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { - emitter.indents = append(emitter.indents, emitter.indent) - if emitter.indent < 0 { - if flow { - emitter.indent = emitter.best_indent - } else { - emitter.indent = 0 - } - } else if !indentless { - emitter.indent += emitter.best_indent - } - return true -} - -// State dispatcher. -func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { - switch emitter.state { - default: - case yaml_EMIT_STREAM_START_STATE: - return yaml_emitter_emit_stream_start(emitter, event) - - case yaml_EMIT_FIRST_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, true) - - case yaml_EMIT_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, false) - - case yaml_EMIT_DOCUMENT_CONTENT_STATE: - return yaml_emitter_emit_document_content(emitter, event) - - case yaml_EMIT_DOCUMENT_END_STATE: - return yaml_emitter_emit_document_end(emitter, event) - - case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, true) - - case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false) - - case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false) - - case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, false) - - case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, true) - - case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, false) - - case yaml_EMIT_END_STATE: - return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") - } - panic("invalid emitter state") -} - -// Expect STREAM-START. -func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_STREAM_START_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") - } - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = event.encoding - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = yaml_UTF8_ENCODING - } - } - if emitter.best_indent < 2 || emitter.best_indent > 9 { - emitter.best_indent = 2 - } - if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { - emitter.best_width = 80 - } - if emitter.best_width < 0 { - emitter.best_width = 1<<31 - 1 - } - if emitter.line_break == yaml_ANY_BREAK { - emitter.line_break = yaml_LN_BREAK - } - - emitter.indent = -1 - emitter.line = 0 - emitter.column = 0 - emitter.whitespace = true - emitter.indention = true - - if emitter.encoding != yaml_UTF8_ENCODING { - if !yaml_emitter_write_bom(emitter) { - return false - } - } - emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE - return true -} - -// Expect DOCUMENT-START or STREAM-END. -func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - - if event.typ == yaml_DOCUMENT_START_EVENT { - - if event.version_directive != nil { - if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { - return false - } - } - - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { - return false - } - if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { - return false - } - } - - for i := 0; i < len(default_tag_directives); i++ { - tag_directive := &default_tag_directives[i] - if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { - return false - } - } - - implicit := event.implicit - if !first || emitter.canonical { - implicit = false - } - - if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if event.version_directive != nil { - implicit = false - if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if len(event.tag_directives) > 0 { - implicit = false - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { - return false - } - if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if yaml_emitter_check_empty_document(emitter) { - implicit = false - } - if !implicit { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { - return false - } - if emitter.canonical { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE - return true - } - - if event.typ == yaml_STREAM_END_EVENT { - if emitter.open_ended { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_END_STATE - return true - } - - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") -} - -// Expect the root node. -func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) - return yaml_emitter_emit_node(emitter, event, true, false, false, false) -} - -// Expect DOCUMENT-END. -func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_DOCUMENT_END_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !event.implicit { - // [Go] Allocate the slice elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_DOCUMENT_START_STATE - emitter.tag_directives = emitter.tag_directives[:0] - return true -} - -// Expect a flow item node. -func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - - return true - } - - if !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) -} - -// Expect a flow key node. -func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_MAPPING_END_EVENT { - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - - if !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a flow value node. -func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block item node. -func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { - return false - } - } - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) -} - -// Expect a block key node. -func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, false) { - return false - } - } - if event.typ == yaml_MAPPING_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block value node. -func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a node. -func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, - root bool, sequence bool, mapping bool, simple_key bool) bool { - - emitter.root_context = root - emitter.sequence_context = sequence - emitter.mapping_context = mapping - emitter.simple_key_context = simple_key - - switch event.typ { - case yaml_ALIAS_EVENT: - return yaml_emitter_emit_alias(emitter, event) - case yaml_SCALAR_EVENT: - return yaml_emitter_emit_scalar(emitter, event) - case yaml_SEQUENCE_START_EVENT: - return yaml_emitter_emit_sequence_start(emitter, event) - case yaml_MAPPING_START_EVENT: - return yaml_emitter_emit_mapping_start(emitter, event) - default: - return yaml_emitter_set_emitter_error(emitter, - fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) - } -} - -// Expect ALIAS. -func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SCALAR. -func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_select_scalar_style(emitter, event) { - return false - } - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - if !yaml_emitter_process_scalar(emitter) { - return false - } - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SEQUENCE-START. -func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || - yaml_emitter_check_empty_sequence(emitter) { - emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE - } - return true -} - -// Expect MAPPING-START. -func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || - yaml_emitter_check_empty_mapping(emitter) { - emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE - } - return true -} - -// Check if the document content is an empty scalar. -func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { - return false // [Go] Huh? -} - -// Check if the next events represent an empty sequence. -func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT -} - -// Check if the next events represent an empty mapping. -func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT -} - -// Check if the next node can be expressed as a simple key. -func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { - length := 0 - switch emitter.events[emitter.events_head].typ { - case yaml_ALIAS_EVENT: - length += len(emitter.anchor_data.anchor) - case yaml_SCALAR_EVENT: - if emitter.scalar_data.multiline { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) + - len(emitter.scalar_data.value) - case yaml_SEQUENCE_START_EVENT: - if !yaml_emitter_check_empty_sequence(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - case yaml_MAPPING_START_EVENT: - if !yaml_emitter_check_empty_mapping(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - default: - return false - } - return length <= 128 -} - -// Determine an acceptable scalar style. -func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 - if no_tag && !event.implicit && !event.quoted_implicit { - return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") - } - - style := event.scalar_style() - if style == yaml_ANY_SCALAR_STYLE { - style = yaml_PLAIN_SCALAR_STYLE - } - if emitter.canonical { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - if emitter.simple_key_context && emitter.scalar_data.multiline { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - if style == yaml_PLAIN_SCALAR_STYLE { - if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || - emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if no_tag && !event.implicit { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { - if !emitter.scalar_data.single_quoted_allowed { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { - if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - - if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { - emitter.tag_data.handle = []byte{'!'} - } - emitter.scalar_data.style = style - return true -} - -// Write an anchor. -func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { - if emitter.anchor_data.anchor == nil { - return true - } - c := []byte{'&'} - if emitter.anchor_data.alias { - c[0] = '*' - } - if !yaml_emitter_write_indicator(emitter, c, true, false, false) { - return false - } - return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) -} - -// Write a tag. -func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { - if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { - return true - } - if len(emitter.tag_data.handle) > 0 { - if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { - return false - } - if len(emitter.tag_data.suffix) > 0 { - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - } - } else { - // [Go] Allocate these slices elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { - return false - } - } - return true -} - -// Write a scalar. -func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { - switch emitter.scalar_data.style { - case yaml_PLAIN_SCALAR_STYLE: - return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_SINGLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_DOUBLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_LITERAL_SCALAR_STYLE: - return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) - - case yaml_FOLDED_SCALAR_STYLE: - return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) - } - panic("unknown scalar style") -} - -// Check if a %YAML directive is valid. -func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { - if version_directive.major != 1 || version_directive.minor != 1 { - return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") - } - return true -} - -// Check if a %TAG directive is valid. -func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { - handle := tag_directive.handle - prefix := tag_directive.prefix - if len(handle) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") - } - if handle[0] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") - } - if handle[len(handle)-1] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") - } - for i := 1; i < len(handle)-1; i += width(handle[i]) { - if !is_alpha(handle, i) { - return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") - } - } - if len(prefix) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") - } - return true -} - -// Check if an anchor is valid. -func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { - if len(anchor) == 0 { - problem := "anchor value must not be empty" - if alias { - problem = "alias value must not be empty" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - for i := 0; i < len(anchor); i += width(anchor[i]) { - if !is_alpha(anchor, i) { - problem := "anchor value must contain alphanumerical characters only" - if alias { - problem = "alias value must contain alphanumerical characters only" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - } - emitter.anchor_data.anchor = anchor - emitter.anchor_data.alias = alias - return true -} - -// Check if a tag is valid. -func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { - if len(tag) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") - } - for i := 0; i < len(emitter.tag_directives); i++ { - tag_directive := &emitter.tag_directives[i] - if bytes.HasPrefix(tag, tag_directive.prefix) { - emitter.tag_data.handle = tag_directive.handle - emitter.tag_data.suffix = tag[len(tag_directive.prefix):] - return true - } - } - emitter.tag_data.suffix = tag - return true -} - -// Check if a scalar is valid. -func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { - var ( - block_indicators = false - flow_indicators = false - line_breaks = false - special_characters = false - - leading_space = false - leading_break = false - trailing_space = false - trailing_break = false - break_space = false - space_break = false - - preceded_by_whitespace = false - followed_by_whitespace = false - previous_space = false - previous_break = false - ) - - emitter.scalar_data.value = value - - if len(value) == 0 { - emitter.scalar_data.multiline = false - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = false - return true - } - - if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { - block_indicators = true - flow_indicators = true - } - - preceded_by_whitespace = true - for i, w := 0, 0; i < len(value); i += w { - w = width(value[i]) - followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) - - if i == 0 { - switch value[i] { - case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': - flow_indicators = true - block_indicators = true - case '?', ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '-': - if followed_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } else { - switch value[i] { - case ',', '?', '[', ']', '{', '}': - flow_indicators = true - case ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '#': - if preceded_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } - - if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { - special_characters = true - } - if is_space(value, i) { - if i == 0 { - leading_space = true - } - if i+width(value[i]) == len(value) { - trailing_space = true - } - if previous_break { - break_space = true - } - previous_space = true - previous_break = false - } else if is_break(value, i) { - line_breaks = true - if i == 0 { - leading_break = true - } - if i+width(value[i]) == len(value) { - trailing_break = true - } - if previous_space { - space_break = true - } - previous_space = false - previous_break = true - } else { - previous_space = false - previous_break = false - } - - // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. - preceded_by_whitespace = is_blankz(value, i) - } - - emitter.scalar_data.multiline = line_breaks - emitter.scalar_data.flow_plain_allowed = true - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = true - - if leading_space || leading_break || trailing_space || trailing_break { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if trailing_space { - emitter.scalar_data.block_allowed = false - } - if break_space { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || special_characters { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - emitter.scalar_data.block_allowed = false - } - if line_breaks { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if flow_indicators { - emitter.scalar_data.flow_plain_allowed = false - } - if block_indicators { - emitter.scalar_data.block_plain_allowed = false - } - return true -} - -// Check if the event data is valid. -func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - emitter.anchor_data.anchor = nil - emitter.tag_data.handle = nil - emitter.tag_data.suffix = nil - emitter.scalar_data.value = nil - - switch event.typ { - case yaml_ALIAS_EVENT: - if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { - return false - } - - case yaml_SCALAR_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - if !yaml_emitter_analyze_scalar(emitter, event.value) { - return false - } - - case yaml_SEQUENCE_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - - case yaml_MAPPING_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - } - return true -} - -// Write the BOM character. -func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { - if !flush(emitter) { - return false - } - pos := emitter.buffer_pos - emitter.buffer[pos+0] = '\xEF' - emitter.buffer[pos+1] = '\xBB' - emitter.buffer[pos+2] = '\xBF' - emitter.buffer_pos += 3 - return true -} - -func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { - indent := emitter.indent - if indent < 0 { - indent = 0 - } - if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { - if !put_break(emitter) { - return false - } - } - for emitter.column < indent { - if !put(emitter, ' ') { - return false - } - } - emitter.whitespace = true - emitter.indention = true - return true -} - -func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, indicator) { - return false - } - emitter.whitespace = is_whitespace - emitter.indention = (emitter.indention && is_indention) - emitter.open_ended = false - return true -} - -func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - for i := 0; i < len(value); { - var must_write bool - switch value[i] { - case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': - must_write = true - default: - must_write = is_alpha(value, i) - } - if must_write { - if !write(emitter, value, &i) { - return false - } - } else { - w := width(value[i]) - for k := 0; k < w; k++ { - octet := value[i] - i++ - if !put(emitter, '%') { - return false - } - - c := octet >> 4 - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - - c = octet & 0x0f - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - } - } - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - - emitter.whitespace = false - emitter.indention = false - if emitter.root_context { - emitter.open_ended = true - } - - return true -} - -func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { - return false - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if value[i] == '\'' { - if !put(emitter, '\'') { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - spaces := false - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { - return false - } - - for i := 0; i < len(value); { - if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || - is_bom(value, i) || is_break(value, i) || - value[i] == '"' || value[i] == '\\' { - - octet := value[i] - - var w int - var v rune - switch { - case octet&0x80 == 0x00: - w, v = 1, rune(octet&0x7F) - case octet&0xE0 == 0xC0: - w, v = 2, rune(octet&0x1F) - case octet&0xF0 == 0xE0: - w, v = 3, rune(octet&0x0F) - case octet&0xF8 == 0xF0: - w, v = 4, rune(octet&0x07) - } - for k := 1; k < w; k++ { - octet = value[i+k] - v = (v << 6) + (rune(octet) & 0x3F) - } - i += w - - if !put(emitter, '\\') { - return false - } - - var ok bool - switch v { - case 0x00: - ok = put(emitter, '0') - case 0x07: - ok = put(emitter, 'a') - case 0x08: - ok = put(emitter, 'b') - case 0x09: - ok = put(emitter, 't') - case 0x0A: - ok = put(emitter, 'n') - case 0x0b: - ok = put(emitter, 'v') - case 0x0c: - ok = put(emitter, 'f') - case 0x0d: - ok = put(emitter, 'r') - case 0x1b: - ok = put(emitter, 'e') - case 0x22: - ok = put(emitter, '"') - case 0x5c: - ok = put(emitter, '\\') - case 0x85: - ok = put(emitter, 'N') - case 0xA0: - ok = put(emitter, '_') - case 0x2028: - ok = put(emitter, 'L') - case 0x2029: - ok = put(emitter, 'P') - default: - if v <= 0xFF { - ok = put(emitter, 'x') - w = 2 - } else if v <= 0xFFFF { - ok = put(emitter, 'u') - w = 4 - } else { - ok = put(emitter, 'U') - w = 8 - } - for k := (w - 1) * 4; ok && k >= 0; k -= 4 { - digit := byte((v >> uint(k)) & 0x0F) - if digit < 10 { - ok = put(emitter, digit+'0') - } else { - ok = put(emitter, digit+'A'-10) - } - } - } - if !ok { - return false - } - spaces = false - } else if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if is_space(value, i+1) { - if !put(emitter, '\\') { - return false - } - } - i += width(value[i]) - } else if !write(emitter, value, &i) { - return false - } - spaces = true - } else { - if !write(emitter, value, &i) { - return false - } - spaces = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { - if is_space(value, 0) || is_break(value, 0) { - indent_hint := []byte{'0' + byte(emitter.best_indent)} - if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { - return false - } - } - - emitter.open_ended = false - - var chomp_hint [1]byte - if len(value) == 0 { - chomp_hint[0] = '-' - } else { - i := len(value) - 1 - for value[i]&0xC0 == 0x80 { - i-- - } - if !is_break(value, i) { - chomp_hint[0] = '-' - } else if i == 0 { - chomp_hint[0] = '+' - emitter.open_ended = true - } else { - i-- - for value[i]&0xC0 == 0x80 { - i-- - } - if is_break(value, i) { - chomp_hint[0] = '+' - emitter.open_ended = true - } - } - } - if chomp_hint[0] != 0 { - if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { - return false - } - } - return true -} - -func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - if !put_break(emitter) { - return false - } - emitter.indention = true - emitter.whitespace = true - breaks := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - - return true -} - -func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - - if !put_break(emitter) { - return false - } - emitter.indention = true - emitter.whitespace = true - - breaks := true - leading_spaces := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !breaks && !leading_spaces && value[i] == '\n' { - k := 0 - for is_break(value, k) { - k += width(value[k]) - } - if !is_blankz(value, k) { - if !put_break(emitter) { - return false - } - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - leading_spaces = is_blank(value, i) - } - if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - emitter.indention = false - breaks = false - } - } - return true -} diff --git a/vendor/github.com/mikefarah/yaml/v2/encode.go b/vendor/github.com/mikefarah/yaml/v2/encode.go deleted file mode 100644 index a14435e82..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/encode.go +++ /dev/null @@ -1,362 +0,0 @@ -package yaml - -import ( - "encoding" - "fmt" - "io" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -type encoder struct { - emitter yaml_emitter_t - event yaml_event_t - out []byte - flow bool - // doneInit holds whether the initial stream_start_event has been - // emitted. - doneInit bool -} - -func newEncoder() *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_string(&e.emitter, &e.out) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func newEncoderWithWriter(w io.Writer) *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_writer(&e.emitter, w) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func (e *encoder) init() { - if e.doneInit { - return - } - yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) - e.emit() - e.doneInit = true -} - -func (e *encoder) finish() { - e.emitter.open_ended = false - yaml_stream_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) destroy() { - yaml_emitter_delete(&e.emitter) -} - -func (e *encoder) emit() { - // This will internally delete the e.event value. - e.must(yaml_emitter_emit(&e.emitter, &e.event)) -} - -func (e *encoder) must(ok bool) { - if !ok { - msg := e.emitter.problem - if msg == "" { - msg = "unknown problem generating YAML content" - } - failf("%s", msg) - } -} - -func (e *encoder) marshalDoc(tag string, in reflect.Value) { - e.init() - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.emit() - e.marshal(tag, in) - yaml_document_end_event_initialize(&e.event, true) - e.emit() -} - -func (e *encoder) marshal(tag string, in reflect.Value) { - if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { - e.nilv() - return - } - iface := in.Interface() - switch m := iface.(type) { - case time.Time, *time.Time: - // Although time.Time implements TextMarshaler, - // we don't want to treat it as a string for YAML - // purposes because YAML has special support for - // timestamps. - case Marshaler: - v, err := m.MarshalYAML() - if err != nil { - fail(err) - } - if v == nil { - e.nilv() - return - } - in = reflect.ValueOf(v) - case encoding.TextMarshaler: - text, err := m.MarshalText() - if err != nil { - fail(err) - } - in = reflect.ValueOf(string(text)) - case nil: - e.nilv() - return - } - switch in.Kind() { - case reflect.Interface: - e.marshal(tag, in.Elem()) - case reflect.Map: - e.mapv(tag, in) - case reflect.Ptr: - if in.Type() == ptrTimeType { - e.timev(tag, in.Elem()) - } else { - e.marshal(tag, in.Elem()) - } - case reflect.Struct: - if in.Type() == timeType { - e.timev(tag, in) - } else { - e.structv(tag, in) - } - case reflect.Slice, reflect.Array: - if in.Type().Elem() == mapItemType { - e.itemsv(tag, in) - } else { - e.slicev(tag, in) - } - case reflect.String: - e.stringv(tag, in) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if in.Type() == durationType { - e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) - } else { - e.intv(tag, in) - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.uintv(tag, in) - case reflect.Float32, reflect.Float64: - e.floatv(tag, in) - case reflect.Bool: - e.boolv(tag, in) - default: - panic("cannot marshal type: " + in.Type().String()) - } -} - -func (e *encoder) mapv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - keys := keyList(in.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - e.marshal("", k) - e.marshal("", in.MapIndex(k)) - } - }) -} - -func (e *encoder) itemsv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) - for _, item := range slice { - e.marshal("", reflect.ValueOf(item.Key)) - e.marshal("", reflect.ValueOf(item.Value)) - } - }) -} - -func (e *encoder) structv(tag string, in reflect.Value) { - sinfo, err := getStructInfo(in.Type()) - if err != nil { - panic(err) - } - e.mappingv(tag, func() { - for _, info := range sinfo.FieldsList { - var value reflect.Value - if info.Inline == nil { - value = in.Field(info.Num) - } else { - value = in.FieldByIndex(info.Inline) - } - if info.OmitEmpty && isZero(value) { - continue - } - e.marshal("", reflect.ValueOf(info.Key)) - e.flow = info.Flow - e.marshal("", value) - } - if sinfo.InlineMap >= 0 { - m := in.Field(sinfo.InlineMap) - if m.Len() > 0 { - e.flow = false - keys := keyList(m.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - if _, found := sinfo.FieldsMap[k.String()]; found { - panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) - } - e.marshal("", k) - e.flow = false - e.marshal("", m.MapIndex(k)) - } - } - } - }) -} - -func (e *encoder) mappingv(tag string, f func()) { - implicit := tag == "" - style := yaml_BLOCK_MAPPING_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) - e.emit() - f() - yaml_mapping_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) slicev(tag string, in reflect.Value) { - implicit := tag == "" - style := yaml_BLOCK_SEQUENCE_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - n := in.Len() - for i := 0; i < n; i++ { - e.marshal("", in.Index(i)) - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.emit() -} - -// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. -// -// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported -// in YAML 1.2 and by this package, but these should be marshalled quoted for -// the time being for compatibility with other parsers. -func isBase60Float(s string) (result bool) { - // Fast path. - if s == "" { - return false - } - c := s[0] - if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { - return false - } - // Do the full match. - return base60float.MatchString(s) -} - -// From http://yaml.org/type/float.html, except the regular expression there -// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. -var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) - -func (e *encoder) stringv(tag string, in reflect.Value) { - var style yaml_scalar_style_t - s := in.String() - canUsePlain := true - switch { - case !utf8.ValidString(s): - if tag == yaml_BINARY_TAG { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = yaml_BINARY_TAG - s = encodeBase64(s) - case tag == "": - // Check to see if it would resolve to a specific - // tag when encoded unquoted. If it doesn't, - // there's no need to quote it. - rtag, _ := resolve("", s) - canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s) - } - // Note: it's possible for user code to emit invalid YAML - // if they explicitly specify a tag and a string containing - // text that's incompatible with that tag. - switch { - case strings.Contains(s, "\n"): - style = yaml_LITERAL_SCALAR_STYLE - case canUsePlain: - style = yaml_PLAIN_SCALAR_STYLE - default: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - e.emitScalar(s, "", tag, style) -} - -func (e *encoder) boolv(tag string, in reflect.Value) { - var s string - if in.Bool() { - s = "true" - } else { - s = "false" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) intv(tag string, in reflect.Value) { - s := strconv.FormatInt(in.Int(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) uintv(tag string, in reflect.Value) { - s := strconv.FormatUint(in.Uint(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) timev(tag string, in reflect.Value) { - t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) - switch s { - case "+Inf": - s = ".inf" - case "-Inf": - s = "-.inf" - case "NaN": - s = ".nan" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) nilv() { - e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { - implicit := tag == "" - e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) - e.emit() -} diff --git a/vendor/github.com/mikefarah/yaml/v2/go.mod b/vendor/github.com/mikefarah/yaml/v2/go.mod deleted file mode 100644 index a0d5f48b3..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "github.com/mikefarah/yaml/v2" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/github.com/mikefarah/yaml/v2/parserc.go b/vendor/github.com/mikefarah/yaml/v2/parserc.go deleted file mode 100644 index 81d05dfe5..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/parserc.go +++ /dev/null @@ -1,1095 +0,0 @@ -package yaml - -import ( - "bytes" -) - -// The parser implements the following grammar: -// -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// implicit_document ::= block_node DOCUMENT-END* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// block_node_or_indentless_sequence ::= -// ALIAS -// | properties (block_content | indentless_block_sequence)? -// | block_content -// | indentless_block_sequence -// block_node ::= ALIAS -// | properties block_content? -// | block_content -// flow_node ::= ALIAS -// | properties flow_content? -// | flow_content -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// block_content ::= block_collection | flow_collection | SCALAR -// flow_content ::= flow_collection | SCALAR -// block_collection ::= block_sequence | block_mapping -// flow_collection ::= flow_sequence | flow_mapping -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// block_mapping ::= BLOCK-MAPPING_START -// ((KEY block_node_or_indentless_sequence?)? -// (VALUE block_node_or_indentless_sequence?)?)* -// BLOCK-END -// flow_sequence ::= FLOW-SEQUENCE-START -// (flow_sequence_entry FLOW-ENTRY)* -// flow_sequence_entry? -// FLOW-SEQUENCE-END -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// flow_mapping ::= FLOW-MAPPING-START -// (flow_mapping_entry FLOW-ENTRY)* -// flow_mapping_entry? -// FLOW-MAPPING-END -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - -// Peek the next token in the token queue. -func peek_token(parser *yaml_parser_t) *yaml_token_t { - if parser.token_available || yaml_parser_fetch_more_tokens(parser) { - return &parser.tokens[parser.tokens_head] - } - return nil -} - -// Remove the next token from the queue (must be called after peek_token). -func skip_token(parser *yaml_parser_t) { - parser.token_available = false - parser.tokens_parsed++ - parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN - parser.tokens_head++ -} - -// Get the next event. -func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { - // Erase the event object. - *event = yaml_event_t{} - - // No events after the end of the stream or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { - return true - } - - // Generate the next event. - return yaml_parser_state_machine(parser, event) -} - -// Set parser error. -func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -// State dispatcher. -func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { - //trace("yaml_parser_state_machine", "state:", parser.state.String()) - - switch parser.state { - case yaml_PARSE_STREAM_START_STATE: - return yaml_parser_parse_stream_start(parser, event) - - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, true) - - case yaml_PARSE_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, false) - - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return yaml_parser_parse_document_content(parser, event) - - case yaml_PARSE_DOCUMENT_END_STATE: - return yaml_parser_parse_document_end(parser, event) - - case yaml_PARSE_BLOCK_NODE_STATE: - return yaml_parser_parse_node(parser, event, true, false) - - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return yaml_parser_parse_node(parser, event, true, true) - - case yaml_PARSE_FLOW_NODE_STATE: - return yaml_parser_parse_node(parser, event, false, false) - - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, true) - - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, false) - - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_indentless_sequence_entry(parser, event) - - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, true) - - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, false) - - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return yaml_parser_parse_block_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, true) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, false) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) - - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, true) - - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, true) - - default: - panic("invalid parser state") - } -} - -// Parse the production: -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// ************ -func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_STREAM_START_TOKEN { - return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) - } - parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - encoding: token.encoding, - } - skip_token(parser) - return true -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// * -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// ************************* -func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { - - token := peek_token(parser) - if token == nil { - return false - } - - // Parse extra document end indicators. - if !implicit { - for token.typ == yaml_DOCUMENT_END_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && - token.typ != yaml_TAG_DIRECTIVE_TOKEN && - token.typ != yaml_DOCUMENT_START_TOKEN && - token.typ != yaml_STREAM_END_TOKEN { - // Parse an implicit document. - if !yaml_parser_process_directives(parser, nil, nil) { - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_BLOCK_NODE_STATE - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - } else if token.typ != yaml_STREAM_END_TOKEN { - // Parse an explicit document. - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - start_mark := token.start_mark - if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { - return false - } - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_DOCUMENT_START_TOKEN { - yaml_parser_set_parser_error(parser, - "did not find expected ", token.start_mark) - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE - end_mark := token.end_mark - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: false, - } - skip_token(parser) - - } else { - // Parse the stream end. - parser.state = yaml_PARSE_END_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - } - - return true -} - -// Parse the productions: -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// *********** -// -func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || - token.typ == yaml_TAG_DIRECTIVE_TOKEN || - token.typ == yaml_DOCUMENT_START_TOKEN || - token.typ == yaml_DOCUMENT_END_TOKEN || - token.typ == yaml_STREAM_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - return yaml_parser_process_empty_scalar(parser, event, - token.start_mark) - } - return yaml_parser_parse_node(parser, event, true, false) -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// ************* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// -func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - start_mark := token.start_mark - end_mark := token.start_mark - - implicit := true - if token.typ == yaml_DOCUMENT_END_TOKEN { - end_mark = token.end_mark - skip_token(parser) - implicit = false - } - - parser.tag_directives = parser.tag_directives[:0] - - parser.state = yaml_PARSE_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - start_mark: start_mark, - end_mark: end_mark, - implicit: implicit, - } - return true -} - -// Parse the productions: -// block_node_or_indentless_sequence ::= -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * -// block_node ::= ALIAS -// ***** -// | properties block_content? -// ********** * -// | block_content -// * -// flow_node ::= ALIAS -// ***** -// | properties flow_content? -// ********** * -// | flow_content -// * -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// ************************* -// block_content ::= block_collection | flow_collection | SCALAR -// ****** -// flow_content ::= flow_collection | SCALAR -// ****** -func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { - //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_ALIAS_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - anchor: token.value, - } - skip_token(parser) - return true - } - - start_mark := token.start_mark - end_mark := token.start_mark - - var tag_token bool - var tag_handle, tag_suffix, anchor []byte - var tag_mark yaml_mark_t - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - start_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } else if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - start_mark = token.start_mark - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - var tag []byte - if tag_token { - if len(tag_handle) == 0 { - tag = tag_suffix - tag_suffix = nil - } else { - for i := range parser.tag_directives { - if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { - tag = append([]byte(nil), parser.tag_directives[i].prefix...) - tag = append(tag, tag_suffix...) - break - } - } - if len(tag) == 0 { - yaml_parser_set_parser_error_context(parser, - "while parsing a node", start_mark, - "found undefined tag handle", tag_mark) - return false - } - } - } - - implicit := len(tag) == 0 - if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_SCALAR_TOKEN { - var plain_implicit, quoted_implicit bool - end_mark = token.end_mark - if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { - plain_implicit = true - } else if len(tag) == 0 { - quoted_implicit = true - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - value: token.value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(token.style), - } - skip_token(parser) - return true - } - if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { - // [Go] Some of the events below can be merged as they differ only on style. - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_FLOW_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - return true - } - if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), - } - return true - } - if len(anchor) > 0 || len(tag) > 0 { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - quoted_implicit: false, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true - } - - context := "while parsing a flow node" - if block { - context = "while parsing a block node" - } - yaml_parser_set_parser_error_context(parser, context, start_mark, - "did not find expected node content", token.start_mark) - return false -} - -// Parse the productions: -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// ******************** *********** * ********* -// -func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } else { - parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } - if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block collection", context_mark, - "did not find expected '-' indicator", token.start_mark) -} - -// Parse the productions: -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// *********** * -func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && - token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? - } - return true -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* -// -// BLOCK-END -// ********* -// -func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_KEY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } else { - parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } else if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block mapping", context_mark, - "did not find expected key", token.start_mark) -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// -// ((KEY block_node_or_indentless_sequence?)? -// -// (VALUE block_node_or_indentless_sequence?)?)* -// ***** * -// BLOCK-END -// -// -func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence ::= FLOW-SEQUENCE-START -// ******************* -// (flow_sequence_entry FLOW-ENTRY)* -// * ********** -// flow_sequence_entry? -// * -// FLOW-SEQUENCE-END -// ***************** -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow sequence", context_mark, - "did not find expected ',' or ']'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - implicit: true, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - skip_token(parser) - return true - } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true -} - -// -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// *** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - mark := token.end_mark - skip_token(parser) - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// ***** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? - } - return true -} - -// Parse the productions: -// flow_mapping ::= FLOW-MAPPING-START -// ****************** -// (flow_mapping_entry FLOW-ENTRY)* -// * ********** -// flow_mapping_entry? -// ****************** -// FLOW-MAPPING-END -// **************** -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * *** * -// -func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow mapping", context_mark, - "did not find expected ',' or '}'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } else { - parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - return true -} - -// Parse the productions: -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * ***** * -// -func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { - token := peek_token(parser) - if token == nil { - return false - } - if empty { - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Generate an empty scalar event. -func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: mark, - end_mark: mark, - value: nil, // Empty - implicit: true, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true -} - -var default_tag_directives = []yaml_tag_directive_t{ - {[]byte("!"), []byte("!")}, - {[]byte("!!"), []byte("tag:yaml.org,2002:")}, -} - -// Parse directives. -func yaml_parser_process_directives(parser *yaml_parser_t, - version_directive_ref **yaml_version_directive_t, - tag_directives_ref *[]yaml_tag_directive_t) bool { - - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - - token := peek_token(parser) - if token == nil { - return false - } - - for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { - if version_directive != nil { - yaml_parser_set_parser_error(parser, - "found duplicate %YAML directive", token.start_mark) - return false - } - if token.major != 1 || token.minor != 1 { - yaml_parser_set_parser_error(parser, - "found incompatible YAML document", token.start_mark) - return false - } - version_directive = &yaml_version_directive_t{ - major: token.major, - minor: token.minor, - } - } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { - value := yaml_tag_directive_t{ - handle: token.value, - prefix: token.prefix, - } - if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { - return false - } - tag_directives = append(tag_directives, value) - } - - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - - for i := range default_tag_directives { - if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { - return false - } - } - - if version_directive_ref != nil { - *version_directive_ref = version_directive - } - if tag_directives_ref != nil { - *tag_directives_ref = tag_directives - } - return true -} - -// Append a tag directive to the directives stack. -func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { - for i := range parser.tag_directives { - if bytes.Equal(value.handle, parser.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) - } - } - - // [Go] I suspect the copy is unnecessary. This was likely done - // because there was no way to track ownership of the data. - value_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(value_copy.handle, value.handle) - copy(value_copy.prefix, value.prefix) - parser.tag_directives = append(parser.tag_directives, value_copy) - return true -} diff --git a/vendor/github.com/mikefarah/yaml/v2/readerc.go b/vendor/github.com/mikefarah/yaml/v2/readerc.go deleted file mode 100644 index 7c1f5fac3..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/readerc.go +++ /dev/null @@ -1,412 +0,0 @@ -package yaml - -import ( - "io" -) - -// Set the reader error and return 0. -func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { - parser.error = yaml_READER_ERROR - parser.problem = problem - parser.problem_offset = offset - parser.problem_value = value - return false -} - -// Byte order marks. -const ( - bom_UTF8 = "\xef\xbb\xbf" - bom_UTF16LE = "\xff\xfe" - bom_UTF16BE = "\xfe\xff" -) - -// Determine the input stream encoding by checking the BOM symbol. If no BOM is -// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. -func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { - // Ensure that we had enough bytes in the raw buffer. - for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { - if !yaml_parser_update_raw_buffer(parser) { - return false - } - } - - // Determine the encoding. - buf := parser.raw_buffer - pos := parser.raw_buffer_pos - avail := len(buf) - pos - if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { - parser.encoding = yaml_UTF16LE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { - parser.encoding = yaml_UTF16BE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { - parser.encoding = yaml_UTF8_ENCODING - parser.raw_buffer_pos += 3 - parser.offset += 3 - } else { - parser.encoding = yaml_UTF8_ENCODING - } - return true -} - -// Update the raw buffer. -func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { - size_read := 0 - - // Return if the raw buffer is full. - if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { - return true - } - - // Return on EOF. - if parser.eof { - return true - } - - // Move the remaining bytes in the raw buffer to the beginning. - if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { - copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) - } - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] - parser.raw_buffer_pos = 0 - - // Call the read handler to fill the buffer. - size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] - if err == io.EOF { - parser.eof = true - } else if err != nil { - return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) - } - return true -} - -// Ensure that the buffer contains at least `length` characters. -// Return true on success, false on failure. -// -// The length is supposed to be significantly less that the buffer size. -func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { - if parser.read_handler == nil { - panic("read handler must be set") - } - - // [Go] This function was changed to guarantee the requested length size at EOF. - // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests - - // If the EOF flag is set and the raw buffer is empty, do nothing. - if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - // [Go] ACTUALLY! Read the documentation of this function above. - // This is just broken. To return true, we need to have the - // given length in the buffer. Not doing that means every single - // check that calls this function to make sure the buffer has a - // given length is Go) panicking; or C) accessing invalid memory. - //return true - } - - // Return if the buffer contains enough characters. - if parser.unread >= length { - return true - } - - // Determine the input encoding if it is not known yet. - if parser.encoding == yaml_ANY_ENCODING { - if !yaml_parser_determine_encoding(parser) { - return false - } - } - - // Move the unread characters to the beginning of the buffer. - buffer_len := len(parser.buffer) - if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { - copy(parser.buffer, parser.buffer[parser.buffer_pos:]) - buffer_len -= parser.buffer_pos - parser.buffer_pos = 0 - } else if parser.buffer_pos == buffer_len { - buffer_len = 0 - parser.buffer_pos = 0 - } - - // Open the whole buffer for writing, and cut it before returning. - parser.buffer = parser.buffer[:cap(parser.buffer)] - - // Fill the buffer until it has enough characters. - first := true - for parser.unread < length { - - // Fill the raw buffer if necessary. - if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { - if !yaml_parser_update_raw_buffer(parser) { - parser.buffer = parser.buffer[:buffer_len] - return false - } - } - first = false - - // Decode the raw buffer. - inner: - for parser.raw_buffer_pos != len(parser.raw_buffer) { - var value rune - var width int - - raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos - - // Decode the next character. - switch parser.encoding { - case yaml_UTF8_ENCODING: - // Decode a UTF-8 character. Check RFC 3629 - // (http://www.ietf.org/rfc/rfc3629.txt) for more details. - // - // The following table (taken from the RFC) is used for - // decoding. - // - // Char. number range | UTF-8 octet sequence - // (hexadecimal) | (binary) - // --------------------+------------------------------------ - // 0000 0000-0000 007F | 0xxxxxxx - // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - // - // Additionally, the characters in the range 0xD800-0xDFFF - // are prohibited as they are reserved for use with UTF-16 - // surrogate pairs. - - // Determine the length of the UTF-8 sequence. - octet := parser.raw_buffer[parser.raw_buffer_pos] - switch { - case octet&0x80 == 0x00: - width = 1 - case octet&0xE0 == 0xC0: - width = 2 - case octet&0xF0 == 0xE0: - width = 3 - case octet&0xF8 == 0xF0: - width = 4 - default: - // The leading octet is invalid. - return yaml_parser_set_reader_error(parser, - "invalid leading UTF-8 octet", - parser.offset, int(octet)) - } - - // Check if the raw buffer contains an incomplete character. - if width > raw_unread { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-8 octet sequence", - parser.offset, -1) - } - break inner - } - - // Decode the leading octet. - switch { - case octet&0x80 == 0x00: - value = rune(octet & 0x7F) - case octet&0xE0 == 0xC0: - value = rune(octet & 0x1F) - case octet&0xF0 == 0xE0: - value = rune(octet & 0x0F) - case octet&0xF8 == 0xF0: - value = rune(octet & 0x07) - default: - value = 0 - } - - // Check and decode the trailing octets. - for k := 1; k < width; k++ { - octet = parser.raw_buffer[parser.raw_buffer_pos+k] - - // Check if the octet is valid. - if (octet & 0xC0) != 0x80 { - return yaml_parser_set_reader_error(parser, - "invalid trailing UTF-8 octet", - parser.offset+k, int(octet)) - } - - // Decode the octet. - value = (value << 6) + rune(octet&0x3F) - } - - // Check the length of the sequence against the value. - switch { - case width == 1: - case width == 2 && value >= 0x80: - case width == 3 && value >= 0x800: - case width == 4 && value >= 0x10000: - default: - return yaml_parser_set_reader_error(parser, - "invalid length of a UTF-8 sequence", - parser.offset, -1) - } - - // Check the range of the value. - if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { - return yaml_parser_set_reader_error(parser, - "invalid Unicode character", - parser.offset, int(value)) - } - - case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: - var low, high int - if parser.encoding == yaml_UTF16LE_ENCODING { - low, high = 0, 1 - } else { - low, high = 1, 0 - } - - // The UTF-16 encoding is not as simple as one might - // naively think. Check RFC 2781 - // (http://www.ietf.org/rfc/rfc2781.txt). - // - // Normally, two subsequent bytes describe a Unicode - // character. However a special technique (called a - // surrogate pair) is used for specifying character - // values larger than 0xFFFF. - // - // A surrogate pair consists of two pseudo-characters: - // high surrogate area (0xD800-0xDBFF) - // low surrogate area (0xDC00-0xDFFF) - // - // The following formulas are used for decoding - // and encoding characters using surrogate pairs: - // - // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) - // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) - // W1 = 110110yyyyyyyyyy - // W2 = 110111xxxxxxxxxx - // - // where U is the character value, W1 is the high surrogate - // area, W2 is the low surrogate area. - - // Check for incomplete UTF-16 character. - if raw_unread < 2 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 character", - parser.offset, -1) - } - break inner - } - - // Get the character. - value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) - - // Check for unexpected low surrogate area. - if value&0xFC00 == 0xDC00 { - return yaml_parser_set_reader_error(parser, - "unexpected low surrogate area", - parser.offset, int(value)) - } - - // Check for a high surrogate area. - if value&0xFC00 == 0xD800 { - width = 4 - - // Check for incomplete surrogate pair. - if raw_unread < 4 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 surrogate pair", - parser.offset, -1) - } - break inner - } - - // Get the next character. - value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) - - // Check for a low surrogate area. - if value2&0xFC00 != 0xDC00 { - return yaml_parser_set_reader_error(parser, - "expected low surrogate area", - parser.offset+2, int(value2)) - } - - // Generate the value of the surrogate pair. - value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) - } else { - width = 2 - } - - default: - panic("impossible") - } - - // Check if the character is in the allowed range: - // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) - // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) - // | [#x10000-#x10FFFF] (32 bit) - switch { - case value == 0x09: - case value == 0x0A: - case value == 0x0D: - case value >= 0x20 && value <= 0x7E: - case value == 0x85: - case value >= 0xA0 && value <= 0xD7FF: - case value >= 0xE000 && value <= 0xFFFD: - case value >= 0x10000 && value <= 0x10FFFF: - default: - return yaml_parser_set_reader_error(parser, - "control characters are not allowed", - parser.offset, int(value)) - } - - // Move the raw pointers. - parser.raw_buffer_pos += width - parser.offset += width - - // Finally put the character into the buffer. - if value <= 0x7F { - // 0000 0000-0000 007F . 0xxxxxxx - parser.buffer[buffer_len+0] = byte(value) - buffer_len += 1 - } else if value <= 0x7FF { - // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) - parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) - buffer_len += 2 - } else if value <= 0xFFFF { - // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) - buffer_len += 3 - } else { - // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) - buffer_len += 4 - } - - parser.unread++ - } - - // On EOF, put NUL into the buffer and return. - if parser.eof { - parser.buffer[buffer_len] = 0 - buffer_len++ - parser.unread++ - break - } - } - // [Go] Read the documentation of this function above. To return true, - // we need to have the given length in the buffer. Not doing that means - // every single check that calls this function to make sure the buffer - // has a given length is Go) panicking; or C) accessing invalid memory. - // This happens here due to the EOF above breaking early. - for buffer_len < length { - parser.buffer[buffer_len] = 0 - buffer_len++ - } - parser.buffer = parser.buffer[:buffer_len] - return true -} diff --git a/vendor/github.com/mikefarah/yaml/v2/resolve.go b/vendor/github.com/mikefarah/yaml/v2/resolve.go deleted file mode 100644 index 6c151db6f..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/resolve.go +++ /dev/null @@ -1,258 +0,0 @@ -package yaml - -import ( - "encoding/base64" - "math" - "regexp" - "strconv" - "strings" - "time" -) - -type resolveMapItem struct { - value interface{} - tag string -} - -var resolveTable = make([]byte, 256) -var resolveMap = make(map[string]resolveMapItem) - -func init() { - t := resolveTable - t[int('+')] = 'S' // Sign - t[int('-')] = 'S' - for _, c := range "0123456789" { - t[int(c)] = 'D' // Digit - } - for _, c := range "yYnNtTfFoO~" { - t[int(c)] = 'M' // In map - } - t[int('.')] = '.' // Float (potentially in map) - - var resolveMapList = []struct { - v interface{} - tag string - l []string - }{ - {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}}, - {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}}, - {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}}, - {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}}, - {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}}, - {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}}, - {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}}, - {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}}, - {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}}, - {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}}, - {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}}, - {"<<", yaml_MERGE_TAG, []string{"<<"}}, - } - - m := resolveMap - for _, item := range resolveMapList { - for _, s := range item.l { - m[s] = resolveMapItem{item.v, item.tag} - } - } -} - -const longTagPrefix = "tag:yaml.org,2002:" - -func shortTag(tag string) string { - // TODO This can easily be made faster and produce less garbage. - if strings.HasPrefix(tag, longTagPrefix) { - return "!!" + tag[len(longTagPrefix):] - } - return tag -} - -func longTag(tag string) string { - if strings.HasPrefix(tag, "!!") { - return longTagPrefix + tag[2:] - } - return tag -} - -func resolvableTag(tag string) bool { - switch tag { - case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG: - return true - } - return false -} - -var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`) - -func resolve(tag string, in string) (rtag string, out interface{}) { - if !resolvableTag(tag) { - return tag, in - } - - defer func() { - switch tag { - case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: - return - case yaml_FLOAT_TAG: - if rtag == yaml_INT_TAG { - switch v := out.(type) { - case int64: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - case int: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - } - } - } - failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) - }() - - // Any data is accepted as a !!str or !!binary. - // Otherwise, the prefix is enough of a hint about what it might be. - hint := byte('N') - if in != "" { - hint = resolveTable[in[0]] - } - if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG { - // Handle things we can lookup in a map. - if item, ok := resolveMap[in]; ok { - return item.tag, item.value - } - - // Base 60 floats are a bad idea, were dropped in YAML 1.2, and - // are purposefully unsupported here. They're still quoted on - // the way out for compatibility with other parser, though. - - switch hint { - case 'M': - // We've already checked the map above. - - case '.': - // Not in the map, so maybe a normal float. - floatv, err := strconv.ParseFloat(in, 64) - if err == nil { - return yaml_FLOAT_TAG, floatv - } - - case 'D', 'S': - // Int, float, or timestamp. - // Only try values as a timestamp if the value is unquoted or there's an explicit - // !!timestamp tag. - if tag == "" || tag == yaml_TIMESTAMP_TAG { - t, ok := parseTimestamp(in) - if ok { - return yaml_TIMESTAMP_TAG, t - } - } - - plain := strings.Replace(in, "_", "", -1) - intv, err := strconv.ParseInt(plain, 0, 64) - if err == nil { - if intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) - } else { - return yaml_INT_TAG, intv - } - } - uintv, err := strconv.ParseUint(plain, 0, 64) - if err == nil { - return yaml_INT_TAG, uintv - } - if yamlStyleFloat.MatchString(plain) { - floatv, err := strconv.ParseFloat(plain, 64) - if err == nil { - return yaml_FLOAT_TAG, floatv - } - } - if strings.HasPrefix(plain, "0b") { - intv, err := strconv.ParseInt(plain[2:], 2, 64) - if err == nil { - if intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) - } else { - return yaml_INT_TAG, intv - } - } - uintv, err := strconv.ParseUint(plain[2:], 2, 64) - if err == nil { - return yaml_INT_TAG, uintv - } - } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) - if err == nil { - if true || intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) - } else { - return yaml_INT_TAG, intv - } - } - } - default: - panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") - } - } - return yaml_STR_TAG, in -} - -// encodeBase64 encodes s as base64 that is broken up into multiple lines -// as appropriate for the resulting length. -func encodeBase64(s string) string { - const lineLen = 70 - encLen := base64.StdEncoding.EncodedLen(len(s)) - lines := encLen/lineLen + 1 - buf := make([]byte, encLen*2+lines) - in := buf[0:encLen] - out := buf[encLen:] - base64.StdEncoding.Encode(in, []byte(s)) - k := 0 - for i := 0; i < len(in); i += lineLen { - j := i + lineLen - if j > len(in) { - j = len(in) - } - k += copy(out[k:], in[i:j]) - if lines > 1 { - out[k] = '\n' - k++ - } - } - return string(out[:k]) -} - -// This is a subset of the formats allowed by the regular expression -// defined at http://yaml.org/type/timestamp.html. -var allowedTimestampFormats = []string{ - "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. - "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". - "2006-1-2 15:4:5.999999999", // space separated with no time zone - "2006-1-2", // date only - // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" - // from the set of examples. -} - -// parseTimestamp parses s as a timestamp string and -// returns the timestamp and reports whether it succeeded. -// Timestamp formats are defined at http://yaml.org/type/timestamp.html -func parseTimestamp(s string) (time.Time, bool) { - // TODO write code to check all the formats supported by - // http://yaml.org/type/timestamp.html instead of using time.Parse. - - // Quick check: all date formats start with YYYY-. - i := 0 - for ; i < len(s); i++ { - if c := s[i]; c < '0' || c > '9' { - break - } - } - if i != 4 || i == len(s) || s[i] != '-' { - return time.Time{}, false - } - for _, format := range allowedTimestampFormats { - if t, err := time.Parse(format, s); err == nil { - return t, true - } - } - return time.Time{}, false -} diff --git a/vendor/github.com/mikefarah/yaml/v2/scannerc.go b/vendor/github.com/mikefarah/yaml/v2/scannerc.go deleted file mode 100644 index 077fd1dd2..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/scannerc.go +++ /dev/null @@ -1,2696 +0,0 @@ -package yaml - -import ( - "bytes" - "fmt" -) - -// Introduction -// ************ -// -// The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in -// some cases we are less restrictive that it requires. -// -// The process of transforming a YAML stream into a sequence of events is -// divided on two steps: Scanning and Parsing. -// -// The Scanner transforms the input stream into a sequence of tokens, while the -// parser transform the sequence of tokens produced by the Scanner into a -// sequence of parsing events. -// -// The Scanner is rather clever and complicated. The Parser, on the contrary, -// is a straightforward implementation of a recursive-descendant parser (or, -// LL(1) parser, as it is usually called). -// -// Actually there are two issues of Scanning that might be called "clever", the -// rest is quite straightforward. The issues are "block collection start" and -// "simple keys". Both issues are explained below in details. -// -// Here the Scanning step is explained and implemented. We start with the list -// of all the tokens produced by the Scanner together with short descriptions. -// -// Now, tokens: -// -// STREAM-START(encoding) # The stream start. -// STREAM-END # The stream end. -// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. -// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. -// DOCUMENT-START # '---' -// DOCUMENT-END # '...' -// BLOCK-SEQUENCE-START # Indentation increase denoting a block -// BLOCK-MAPPING-START # sequence or a block mapping. -// BLOCK-END # Indentation decrease. -// FLOW-SEQUENCE-START # '[' -// FLOW-SEQUENCE-END # ']' -// BLOCK-SEQUENCE-START # '{' -// BLOCK-SEQUENCE-END # '}' -// BLOCK-ENTRY # '-' -// FLOW-ENTRY # ',' -// KEY # '?' or nothing (simple keys). -// VALUE # ':' -// ALIAS(anchor) # '*anchor' -// ANCHOR(anchor) # '&anchor' -// TAG(handle,suffix) # '!handle!suffix' -// SCALAR(value,style) # A scalar. -// -// The following two tokens are "virtual" tokens denoting the beginning and the -// end of the stream: -// -// STREAM-START(encoding) -// STREAM-END -// -// We pass the information about the input stream encoding with the -// STREAM-START token. -// -// The next two tokens are responsible for tags: -// -// VERSION-DIRECTIVE(major,minor) -// TAG-DIRECTIVE(handle,prefix) -// -// Example: -// -// %YAML 1.1 -// %TAG ! !foo -// %TAG !yaml! tag:yaml.org,2002: -// --- -// -// The correspoding sequence of tokens: -// -// STREAM-START(utf-8) -// VERSION-DIRECTIVE(1,1) -// TAG-DIRECTIVE("!","!foo") -// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") -// DOCUMENT-START -// STREAM-END -// -// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole -// line. -// -// The document start and end indicators are represented by: -// -// DOCUMENT-START -// DOCUMENT-END -// -// Note that if a YAML stream contains an implicit document (without '---' -// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be -// produced. -// -// In the following examples, we present whole documents together with the -// produced tokens. -// -// 1. An implicit document: -// -// 'a scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// STREAM-END -// -// 2. An explicit document: -// -// --- -// 'a scalar' -// ... -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// SCALAR("a scalar",single-quoted) -// DOCUMENT-END -// STREAM-END -// -// 3. Several documents in a stream: -// -// 'a scalar' -// --- -// 'another scalar' -// --- -// 'yet another scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// DOCUMENT-START -// SCALAR("another scalar",single-quoted) -// DOCUMENT-START -// SCALAR("yet another scalar",single-quoted) -// STREAM-END -// -// We have already introduced the SCALAR token above. The following tokens are -// used to describe aliases, anchors, tag, and scalars: -// -// ALIAS(anchor) -// ANCHOR(anchor) -// TAG(handle,suffix) -// SCALAR(value,style) -// -// The following series of examples illustrate the usage of these tokens: -// -// 1. A recursive sequence: -// -// &A [ *A ] -// -// Tokens: -// -// STREAM-START(utf-8) -// ANCHOR("A") -// FLOW-SEQUENCE-START -// ALIAS("A") -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A tagged scalar: -// -// !!float "3.14" # A good approximation. -// -// Tokens: -// -// STREAM-START(utf-8) -// TAG("!!","float") -// SCALAR("3.14",double-quoted) -// STREAM-END -// -// 3. Various scalar styles: -// -// --- # Implicit empty plain scalars do not produce tokens. -// --- a plain scalar -// --- 'a single-quoted scalar' -// --- "a double-quoted scalar" -// --- |- -// a literal scalar -// --- >- -// a folded -// scalar -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// DOCUMENT-START -// SCALAR("a plain scalar",plain) -// DOCUMENT-START -// SCALAR("a single-quoted scalar",single-quoted) -// DOCUMENT-START -// SCALAR("a double-quoted scalar",double-quoted) -// DOCUMENT-START -// SCALAR("a literal scalar",literal) -// DOCUMENT-START -// SCALAR("a folded scalar",folded) -// STREAM-END -// -// Now it's time to review collection-related tokens. We will start with -// flow collections: -// -// FLOW-SEQUENCE-START -// FLOW-SEQUENCE-END -// FLOW-MAPPING-START -// FLOW-MAPPING-END -// FLOW-ENTRY -// KEY -// VALUE -// -// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and -// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' -// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the -// indicators '?' and ':', which are used for denoting mapping keys and values, -// are represented by the KEY and VALUE tokens. -// -// The following examples show flow collections: -// -// 1. A flow sequence: -// -// [item 1, item 2, item 3] -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-SEQUENCE-START -// SCALAR("item 1",plain) -// FLOW-ENTRY -// SCALAR("item 2",plain) -// FLOW-ENTRY -// SCALAR("item 3",plain) -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A flow mapping: -// -// { -// a simple key: a value, # Note that the KEY token is produced. -// ? a complex key: another value, -// } -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// FLOW-ENTRY -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// FLOW-ENTRY -// FLOW-MAPPING-END -// STREAM-END -// -// A simple key is a key which is not denoted by the '?' indicator. Note that -// the Scanner still produce the KEY token whenever it encounters a simple key. -// -// For scanning block collections, the following tokens are used (note that we -// repeat KEY and VALUE here): -// -// BLOCK-SEQUENCE-START -// BLOCK-MAPPING-START -// BLOCK-END -// BLOCK-ENTRY -// KEY -// VALUE -// -// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation -// increase that precedes a block collection (cf. the INDENT token in Python). -// The token BLOCK-END denote indentation decrease that ends a block collection -// (cf. the DEDENT token in Python). However YAML has some syntax pecularities -// that makes detections of these tokens more complex. -// -// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators -// '-', '?', and ':' correspondingly. -// -// The following examples show how the tokens BLOCK-SEQUENCE-START, -// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: -// -// 1. Block sequences: -// -// - item 1 -// - item 2 -// - -// - item 3.1 -// - item 3.2 -// - -// key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 3.1",plain) -// BLOCK-ENTRY -// SCALAR("item 3.2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Block mappings: -// -// a simple key: a value # The KEY token is produced here. -// ? a complex key -// : another value -// a mapping: -// key 1: value 1 -// key 2: value 2 -// a sequence: -// - item 1 -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// KEY -// SCALAR("a mapping",plain) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML does not always require to start a new block collection from a new -// line. If the current line contains only '-', '?', and ':' indicators, a new -// block collection may start at the current line. The following examples -// illustrate this case: -// -// 1. Collections in a sequence: -// -// - - item 1 -// - item 2 -// - key 1: value 1 -// key 2: value 2 -// - ? complex key -// : complex value -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("complex key") -// VALUE -// SCALAR("complex value") -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Collections in a mapping: -// -// ? a sequence -// : - item 1 -// - item 2 -// ? a mapping -// : key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// KEY -// SCALAR("a mapping",plain) -// VALUE -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML also permits non-indented sequences if they are included into a block -// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: -// -// key: -// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key",plain) -// VALUE -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// - -// Ensure that the buffer contains the required number of characters. -// Return true on success, false on failure (reader error or memory error). -func cache(parser *yaml_parser_t, length int) bool { - // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) - return parser.unread >= length || yaml_parser_update_buffer(parser, length) -} - -// Advance the buffer pointer. -func skip(parser *yaml_parser_t) { - parser.mark.index++ - parser.mark.column++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) -} - -func skip_line(parser *yaml_parser_t) { - if is_crlf(parser.buffer, parser.buffer_pos) { - parser.mark.index += 2 - parser.mark.column = 0 - parser.mark.line++ - parser.unread -= 2 - parser.buffer_pos += 2 - } else if is_break(parser.buffer, parser.buffer_pos) { - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) - } -} - -// Copy a character to a string buffer and advance pointers. -func read(parser *yaml_parser_t, s []byte) []byte { - w := width(parser.buffer[parser.buffer_pos]) - if w == 0 { - panic("invalid character sequence") - } - if len(s) == 0 { - s = make([]byte, 0, 32) - } - if w == 1 && len(s)+w <= cap(s) { - s = s[:len(s)+1] - s[len(s)-1] = parser.buffer[parser.buffer_pos] - parser.buffer_pos++ - } else { - s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) - parser.buffer_pos += w - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - return s -} - -// Copy a line break character to a string buffer and advance pointers. -func read_line(parser *yaml_parser_t, s []byte) []byte { - buf := parser.buffer - pos := parser.buffer_pos - switch { - case buf[pos] == '\r' && buf[pos+1] == '\n': - // CR LF . LF - s = append(s, '\n') - parser.buffer_pos += 2 - parser.mark.index++ - parser.unread-- - case buf[pos] == '\r' || buf[pos] == '\n': - // CR|LF . LF - s = append(s, '\n') - parser.buffer_pos += 1 - case buf[pos] == '\xC2' && buf[pos+1] == '\x85': - // NEL . LF - s = append(s, '\n') - parser.buffer_pos += 2 - case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): - // LS|PS . LS|PS - s = append(s, buf[parser.buffer_pos:pos+3]...) - parser.buffer_pos += 3 - default: - return s - } - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - return s -} - -// Get the next token. -func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { - // Erase the token object. - *token = yaml_token_t{} // [Go] Is this necessary? - - // No tokens after STREAM-END or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR { - return true - } - - // Ensure that the tokens queue contains enough tokens. - if !parser.token_available { - if !yaml_parser_fetch_more_tokens(parser) { - return false - } - } - - // Fetch the next token from the queue. - *token = parser.tokens[parser.tokens_head] - parser.tokens_head++ - parser.tokens_parsed++ - parser.token_available = false - - if token.typ == yaml_STREAM_END_TOKEN { - parser.stream_end_produced = true - } - return true -} - -// Set the scanner error and return false. -func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { - parser.error = yaml_SCANNER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = parser.mark - return false -} - -func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { - context := "while parsing a tag" - if directive { - context = "while parsing a %TAG directive" - } - return yaml_parser_set_scanner_error(parser, context, context_mark, problem) -} - -func trace(args ...interface{}) func() { - pargs := append([]interface{}{"+++"}, args...) - fmt.Println(pargs...) - pargs = append([]interface{}{"---"}, args...) - return func() { fmt.Println(pargs...) } -} - -// Ensure that the tokens queue contains at least one token which can be -// returned to the Parser. -func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { - // While we need more tokens to fetch, do it. - for { - // Check if we really need to fetch more tokens. - need_more_tokens := false - - if parser.tokens_head == len(parser.tokens) { - // Queue is empty. - need_more_tokens = true - } else { - // Check if any potential simple key may occupy the head position. - if !yaml_parser_stale_simple_keys(parser) { - return false - } - - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] - if simple_key.possible && simple_key.token_number == parser.tokens_parsed { - need_more_tokens = true - break - } - } - } - - // We are finished. - if !need_more_tokens { - break - } - // Fetch the next token. - if !yaml_parser_fetch_next_token(parser) { - return false - } - } - - parser.token_available = true - return true -} - -// The dispatcher for token fetchers. -func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { - // Ensure that the buffer is initialized. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we just started scanning. Fetch STREAM-START then. - if !parser.stream_start_produced { - return yaml_parser_fetch_stream_start(parser) - } - - // Eat whitespaces and comments until we reach the next token. - if !yaml_parser_scan_to_next_token(parser) { - return false - } - - // Remove obsolete potential simple keys. - if !yaml_parser_stale_simple_keys(parser) { - return false - } - - // Check the indentation level against the current column. - if !yaml_parser_unroll_indent(parser, parser.mark.column) { - return false - } - - // Ensure that the buffer contains at least 4 characters. 4 is the length - // of the longest indicators ('--- ' and '... '). - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - // Is it the end of the stream? - if is_z(parser.buffer, parser.buffer_pos) { - return yaml_parser_fetch_stream_end(parser) - } - - // Is it a directive? - if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { - return yaml_parser_fetch_directive(parser) - } - - buf := parser.buffer - pos := parser.buffer_pos - - // Is it the document start indicator? - if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) - } - - // Is it the document end indicator? - if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) - } - - // Is it the flow sequence start indicator? - if buf[pos] == '[' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) - } - - // Is it the flow mapping start indicator? - if parser.buffer[parser.buffer_pos] == '{' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) - } - - // Is it the flow sequence end indicator? - if parser.buffer[parser.buffer_pos] == ']' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_SEQUENCE_END_TOKEN) - } - - // Is it the flow mapping end indicator? - if parser.buffer[parser.buffer_pos] == '}' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_MAPPING_END_TOKEN) - } - - // Is it the flow entry indicator? - if parser.buffer[parser.buffer_pos] == ',' { - return yaml_parser_fetch_flow_entry(parser) - } - - // Is it the block entry indicator? - if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { - return yaml_parser_fetch_block_entry(parser) - } - - // Is it the key indicator? - if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_key(parser) - } - - // Is it the value indicator? - if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_value(parser) - } - - // Is it an alias? - if parser.buffer[parser.buffer_pos] == '*' { - return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) - } - - // Is it an anchor? - if parser.buffer[parser.buffer_pos] == '&' { - return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) - } - - // Is it a tag? - if parser.buffer[parser.buffer_pos] == '!' { - return yaml_parser_fetch_tag(parser) - } - - // Is it a literal scalar? - if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, true) - } - - // Is it a folded scalar? - if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, false) - } - - // Is it a single-quoted scalar? - if parser.buffer[parser.buffer_pos] == '\'' { - return yaml_parser_fetch_flow_scalar(parser, true) - } - - // Is it a double-quoted scalar? - if parser.buffer[parser.buffer_pos] == '"' { - return yaml_parser_fetch_flow_scalar(parser, false) - } - - // Is it a plain scalar? - // - // A plain scalar may start with any non-blank characters except - // - // '-', '?', ':', ',', '[', ']', '{', '}', - // '#', '&', '*', '!', '|', '>', '\'', '\"', - // '%', '@', '`'. - // - // In the block context (and, for the '-' indicator, in the flow context - // too), it may also start with the characters - // - // '-', '?', ':' - // - // if it is followed by a non-space character. - // - // The last rule is more restrictive than the specification requires. - // [Go] Make this logic more reasonable. - //switch parser.buffer[parser.buffer_pos] { - //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': - //} - if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || - parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || - parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || - (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level == 0 && - (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && - !is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_plain_scalar(parser) - } - - // If we don't determine the token type so far, it is an error. - return yaml_parser_set_scanner_error(parser, - "while scanning for the next token", parser.mark, - "found character that cannot start any token") -} - -// Check the list of potential simple keys and remove the positions that -// cannot contain simple keys anymore. -func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { - // Check for a potential simple key for each flow level. - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] - - // The specification requires that a simple key - // - // - is limited to a single line, - // - is shorter than 1024 characters. - if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { - - // Check if the potential simple key to be removed is required. - if simple_key.required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", simple_key.mark, - "could not find expected ':'") - } - simple_key.possible = false - } - } - return true -} - -// Check if a simple key may start at the current position and add it if -// needed. -func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { - // A simple key is required at the current position if the scanner is in - // the block context and the current column coincides with the indentation - // level. - - required := parser.flow_level == 0 && parser.indent == parser.mark.column - - // - // If the current position may start a simple key, save it. - // - if parser.simple_key_allowed { - simple_key := yaml_simple_key_t{ - possible: true, - required: required, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - } - simple_key.mark = parser.mark - - if !yaml_parser_remove_simple_key(parser) { - return false - } - parser.simple_keys[len(parser.simple_keys)-1] = simple_key - } - return true -} - -// Remove a potential simple key at the current flow level. -func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { - i := len(parser.simple_keys) - 1 - if parser.simple_keys[i].possible { - // If the key is required, it is an error. - if parser.simple_keys[i].required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", parser.simple_keys[i].mark, - "could not find expected ':'") - } - } - // Remove the key from the stack. - parser.simple_keys[i].possible = false - return true -} - -// Increase the flow level and resize the simple key list if needed. -func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - // Reset the simple key on the next level. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - // Increase the flow level. - parser.flow_level++ - return true -} - -// Decrease the flow level. -func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { - if parser.flow_level > 0 { - parser.flow_level-- - parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] - } - return true -} - -// Push the current indentation level to the stack and set the new level -// the current column is greater than the indentation level. In this case, -// append or insert the specified token into the token queue. -func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - if parser.indent < column { - // Push the current indentation level to the stack and set the new - // indentation level. - parser.indents = append(parser.indents, parser.indent) - parser.indent = column - - // Create a token and insert it into the queue. - token := yaml_token_t{ - typ: typ, - start_mark: mark, - end_mark: mark, - } - if number > -1 { - number -= parser.tokens_parsed - } - yaml_insert_token(parser, number, &token) - } - return true -} - -// Pop indentation levels from the indents stack until the current level -// becomes less or equal to the column. For each indentation level, append -// the BLOCK-END token. -func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - // Loop through the indentation levels in the stack. - for parser.indent > column { - // Create a token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - - // Pop the indentation level. - parser.indent = parser.indents[len(parser.indents)-1] - parser.indents = parser.indents[:len(parser.indents)-1] - } - return true -} - -// Initialize the scanner and produce the STREAM-START token. -func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { - - // Set the initial indentation. - parser.indent = -1 - - // Initialize the simple key stack. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - // A simple key is allowed at the beginning of the stream. - parser.simple_key_allowed = true - - // We have started. - parser.stream_start_produced = true - - // Create the STREAM-START token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_START_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - encoding: parser.encoding, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the STREAM-END token and shut down the scanner. -func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { - - // Force new line. - if parser.mark.column != 0 { - parser.mark.column = 0 - parser.mark.line++ - } - - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the STREAM-END token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. -func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. - token := yaml_token_t{} - if !yaml_parser_scan_directive(parser, &token) { - return false - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the DOCUMENT-START or DOCUMENT-END token. -func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Consume the token. - start_mark := parser.mark - - skip(parser) - skip(parser) - skip(parser) - - end_mark := parser.mark - - // Create the DOCUMENT-START or DOCUMENT-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. -func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // The indicators '[' and '{' may start a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // Increase the flow level. - if !yaml_parser_increase_flow_level(parser) { - return false - } - - // A simple key may follow the indicators '[' and '{'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. -func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset any potential simple key on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Decrease the flow level. - if !yaml_parser_decrease_flow_level(parser) { - return false - } - - // No simple keys after the indicators ']' and '}'. - parser.simple_key_allowed = false - - // Consume the token. - - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-ENTRY token. -func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after ','. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_FLOW_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the BLOCK-ENTRY token. -func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { - // Check if the scanner is in the block context. - if parser.flow_level == 0 { - // Check if we are allowed to start a new entry. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "block sequence entries are not allowed in this context") - } - // Add the BLOCK-SEQUENCE-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { - return false - } - } else { - // It is an error for the '-' indicator to occur in the flow context, - // but we let the Parser detect and report about it because the Parser - // is able to point to the context. - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '-'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the BLOCK-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the KEY token. -func yaml_parser_fetch_key(parser *yaml_parser_t) bool { - - // In the block context, additional checks are required. - if parser.flow_level == 0 { - // Check if we are allowed to start a new key (not nessesary simple). - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping keys are not allowed in this context") - } - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '?' in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the KEY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the VALUE token. -func yaml_parser_fetch_value(parser *yaml_parser_t) bool { - - simple_key := &parser.simple_keys[len(parser.simple_keys)-1] - - // Have we found a simple key? - if simple_key.possible { - // Create the KEY token and insert it into the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: simple_key.mark, - end_mark: simple_key.mark, - } - yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) - - // In the block context, we may need to add the BLOCK-MAPPING-START token. - if !yaml_parser_roll_indent(parser, simple_key.mark.column, - simple_key.token_number, - yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { - return false - } - - // Remove the simple key. - simple_key.possible = false - - // A simple key cannot follow another simple key. - parser.simple_key_allowed = false - - } else { - // The ':' indicator follows a complex key. - - // In the block context, extra checks are required. - if parser.flow_level == 0 { - - // Check if we are allowed to start a complex value. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping values are not allowed in this context") - } - - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Simple keys after ':' are allowed in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - } - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the VALUE token and append it to the queue. - token := yaml_token_t{ - typ: yaml_VALUE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the ALIAS or ANCHOR token. -func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // An anchor or an alias could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow an anchor or an alias. - parser.simple_key_allowed = false - - // Create the ALIAS or ANCHOR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_anchor(parser, &token, typ) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the TAG token. -func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { - // A tag could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a tag. - parser.simple_key_allowed = false - - // Create the TAG token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_tag(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. -func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { - // Remove any potential simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // A simple key may follow a block scalar. - parser.simple_key_allowed = true - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_block_scalar(parser, &token, literal) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. -func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_flow_scalar(parser, &token, single) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,plain) token. -func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_plain_scalar(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Eat whitespaces and comments until the next token is found. -func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { - - // Until the next token is not found. - for { - // Allow the BOM mark to start a line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { - skip(parser) - } - - // Eat whitespaces. - // Tabs are allowed: - // - in the flow context - // - in the block context, but not at the beginning of the line or - // after '-', '?', or ':' (complex value). - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Eat a comment until a line break. - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // If it is a line break, eat it. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - - // In the block context, a new line may start a simple key. - if parser.flow_level == 0 { - parser.simple_key_allowed = true - } - } else { - break // We have found a token. - } - } - - return true -} - -// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { - // Eat '%'. - start_mark := parser.mark - skip(parser) - - // Scan the directive name. - var name []byte - if !yaml_parser_scan_directive_name(parser, start_mark, &name) { - return false - } - - // Is it a YAML directive? - if bytes.Equal(name, []byte("YAML")) { - // Scan the VERSION directive value. - var major, minor int8 - if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { - return false - } - end_mark := parser.mark - - // Create a VERSION-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_VERSION_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - major: major, - minor: minor, - } - - // Is it a TAG directive? - } else if bytes.Equal(name, []byte("TAG")) { - // Scan the TAG directive value. - var handle, prefix []byte - if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { - return false - } - end_mark := parser.mark - - // Create a TAG-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_TAG_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - prefix: prefix, - } - - // Unknown directive. - } else { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unknown directive name") - return false - } - - // Eat the rest of the line including any comments. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - return true -} - -// Scan the directive name. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^ -// -func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { - // Consume the directive name. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - var s []byte - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the name is empty. - if len(s) == 0 { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "could not find expected directive name") - return false - } - - // Check for an blank character after the name. - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unexpected non-alphabetical character") - return false - } - *name = s - return true -} - -// Scan the value of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^ -func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the major version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { - return false - } - - // Eat '.'. - if parser.buffer[parser.buffer_pos] != '.' { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected digit or '.' character") - } - - skip(parser) - - // Consume the minor version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { - return false - } - return true -} - -const max_number_length = 2 - -// Scan the version number of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^ -// %YAML 1.1 # a comment \n -// ^ -func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { - - // Repeat while the next character is digit. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var value, length int8 - for is_digit(parser.buffer, parser.buffer_pos) { - // Check if the number is too long. - length++ - if length > max_number_length { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "found extremely long version number") - } - value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the number was present. - if length == 0 { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected version number") - } - *number = value - return true -} - -// Scan the value of a TAG-DIRECTIVE token. -// -// Scope: -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { - var handle_value, prefix_value []byte - - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a handle. - if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { - return false - } - - // Expect a whitespace. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blank(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace") - return false - } - - // Eat whitespaces. - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a prefix. - if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { - return false - } - - // Expect a whitespace or line break. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace or line break") - return false - } - - *handle = handle_value - *prefix = prefix_value - return true -} - -func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { - var s []byte - - // Eat the indicator character. - start_mark := parser.mark - skip(parser) - - // Consume the value. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - end_mark := parser.mark - - /* - * Check if length of the anchor is greater than 0 and it is followed by - * a whitespace character or one of the indicators: - * - * '?', ':', ',', ']', '}', '%', '@', '`'. - */ - - if len(s) == 0 || - !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || - parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '`') { - context := "while scanning an alias" - if typ == yaml_ANCHOR_TOKEN { - context = "while scanning an anchor" - } - yaml_parser_set_scanner_error(parser, context, start_mark, - "did not find expected alphabetic or numeric character") - return false - } - - // Create a token. - *token = yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - value: s, - } - - return true -} - -/* - * Scan a TAG token. - */ - -func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { - var handle, suffix []byte - - start_mark := parser.mark - - // Check if the tag is in the canonical form. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - if parser.buffer[parser.buffer_pos+1] == '<' { - // Keep the handle as '' - - // Eat '!<' - skip(parser) - skip(parser) - - // Consume the tag value. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - - // Check for '>' and eat it. - if parser.buffer[parser.buffer_pos] != '>' { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find the expected '>'") - return false - } - - skip(parser) - } else { - // The tag has either the '!suffix' or the '!handle!suffix' form. - - // First, try to scan a handle. - if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { - return false - } - - // Check if it is, indeed, handle. - if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { - // Scan the suffix now. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - } else { - // It wasn't a handle after all. Scan the rest of the tag. - if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { - return false - } - - // Set the handle to '!'. - handle = []byte{'!'} - - // A special case: the '!' tag. Set the handle to '' and the - // suffix to '!'. - if len(suffix) == 0 { - handle, suffix = suffix, handle - } - } - } - - // Check the character which ends the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find expected whitespace or line break") - return false - } - - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_TAG_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - suffix: suffix, - } - return true -} - -// Scan a tag handle. -func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { - // Check the initial '!' character. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] != '!' { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - - var s []byte - - // Copy the '!' character. - s = read(parser, s) - - // Copy all subsequent alphabetical and numerical characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the trailing character is '!' and copy it. - if parser.buffer[parser.buffer_pos] == '!' { - s = read(parser, s) - } else { - // It's either the '!' tag or not really a tag handle. If it's a %TAG - // directive, it's an error. If it's a tag token, it must be a part of URI. - if directive && string(s) != "!" { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - } - - *handle = s - return true -} - -// Scan a tag. -func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { - //size_t length = head ? strlen((char *)head) : 0 - var s []byte - hasTag := len(head) > 0 - - // Copy the head if needed. - // - // Note that we don't copy the leading '!' character. - if len(head) > 1 { - s = append(s, head[1:]...) - } - - // Scan the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // The set of characters that may appear in URI is as follows: - // - // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', - // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', - // '%'. - // [Go] Convert this into more reasonable logic. - for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || - parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || - parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || - parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || - parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || - parser.buffer[parser.buffer_pos] == '%' { - // Check if it is a URI-escape sequence. - if parser.buffer[parser.buffer_pos] == '%' { - if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { - return false - } - } else { - s = read(parser, s) - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - hasTag = true - } - - if !hasTag { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected tag URI") - return false - } - *uri = s - return true -} - -// Decode an URI-escape sequence corresponding to a single UTF-8 character. -func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { - - // Decode the required number of characters. - w := 1024 - for w > 0 { - // Check for a URI-escaped octet. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - - if !(parser.buffer[parser.buffer_pos] == '%' && - is_hex(parser.buffer, parser.buffer_pos+1) && - is_hex(parser.buffer, parser.buffer_pos+2)) { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find URI escaped octet") - } - - // Get the octet. - octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) - - // If it is the leading octet, determine the length of the UTF-8 sequence. - if w == 1024 { - w = width(octet) - if w == 0 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect leading UTF-8 octet") - } - } else { - // Check if the trailing octet is correct. - if octet&0xC0 != 0x80 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect trailing UTF-8 octet") - } - } - - // Copy the octet and move the pointers. - *s = append(*s, octet) - skip(parser) - skip(parser) - skip(parser) - w-- - } - return true -} - -// Scan a block scalar. -func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { - // Eat the indicator '|' or '>'. - start_mark := parser.mark - skip(parser) - - // Scan the additional block scalar indicators. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check for a chomping indicator. - var chomping, increment int - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - // Set the chomping method and eat the indicator. - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - - // Check for an indentation indicator. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_digit(parser.buffer, parser.buffer_pos) { - // Check that the indentation is greater than 0. - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - - // Get the indentation level and eat the indicator. - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - } - - } else if is_digit(parser.buffer, parser.buffer_pos) { - // Do the same as above, but in the opposite order. - - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - } - } - - // Eat whitespaces and comments to the end of the line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - end_mark := parser.mark - - // Set the indentation level if it was specified. - var indent int - if increment > 0 { - if parser.indent >= 0 { - indent = parser.indent + increment - } else { - indent = increment - } - } - - // Scan the leading line breaks and determine the indentation level if needed. - var s, leading_break, trailing_breaks []byte - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - - // Scan the block scalar content. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var leading_blank, trailing_blank bool - for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { - // We are at the beginning of a non-empty line. - - // Is it a trailing whitespace? - trailing_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Check if we need to fold the leading line break. - if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { - // Do we need to join the lines by space? - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } - } else { - s = append(s, leading_break...) - } - leading_break = leading_break[:0] - - // Append the remaining line breaks. - s = append(s, trailing_breaks...) - trailing_breaks = trailing_breaks[:0] - - // Is it a leading whitespace? - leading_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Consume the current line. - for !is_breakz(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - leading_break = read_line(parser, leading_break) - - // Eat the following indentation spaces and line breaks. - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - } - - // Chomp the tail. - if chomping != -1 { - s = append(s, leading_break...) - } - if chomping == 1 { - s = append(s, trailing_breaks...) - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_LITERAL_SCALAR_STYLE, - } - if !literal { - token.style = yaml_FOLDED_SCALAR_STYLE - } - return true -} - -// Scan indentation spaces and line breaks for a block scalar. Determine the -// indentation level if needed. -func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { - *end_mark = parser.mark - - // Eat the indentation spaces and line breaks. - max_indent := 0 - for { - // Eat the indentation spaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.mark.column > max_indent { - max_indent = parser.mark.column - } - - // Check for a tab character messing the indentation. - if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { - return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found a tab character where an indentation space is expected") - } - - // Have we found a non-empty line? - if !is_break(parser.buffer, parser.buffer_pos) { - break - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - // [Go] Should really be returning breaks instead. - *breaks = read_line(parser, *breaks) - *end_mark = parser.mark - } - - // Determine the indentation level if needed. - if *indent == 0 { - *indent = max_indent - if *indent < parser.indent+1 { - *indent = parser.indent + 1 - } - if *indent < 1 { - *indent = 1 - } - } - return true -} - -// Scan a quoted scalar. -func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { - // Eat the left quote. - start_mark := parser.mark - skip(parser) - - // Consume the content of the quoted scalar. - var s, leading_break, trailing_breaks, whitespaces []byte - for { - // Check that there are no document indicators at the beginning of the line. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected document indicator") - return false - } - - // Check for EOF. - if is_z(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected end of stream") - return false - } - - // Consume non-blank characters. - leading_blanks := false - for !is_blankz(parser.buffer, parser.buffer_pos) { - if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { - // Is is an escaped single quote. - s = append(s, '\'') - skip(parser) - skip(parser) - - } else if single && parser.buffer[parser.buffer_pos] == '\'' { - // It is a right single quote. - break - } else if !single && parser.buffer[parser.buffer_pos] == '"' { - // It is a right double quote. - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { - // It is an escaped line break. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - skip(parser) - skip_line(parser) - leading_blanks = true - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' { - // It is an escape sequence. - code_length := 0 - - // Check the escape character. - switch parser.buffer[parser.buffer_pos+1] { - case '0': - s = append(s, 0) - case 'a': - s = append(s, '\x07') - case 'b': - s = append(s, '\x08') - case 't', '\t': - s = append(s, '\x09') - case 'n': - s = append(s, '\x0A') - case 'v': - s = append(s, '\x0B') - case 'f': - s = append(s, '\x0C') - case 'r': - s = append(s, '\x0D') - case 'e': - s = append(s, '\x1B') - case ' ': - s = append(s, '\x20') - case '"': - s = append(s, '"') - case '\'': - s = append(s, '\'') - case '\\': - s = append(s, '\\') - case 'N': // NEL (#x85) - s = append(s, '\xC2') - s = append(s, '\x85') - case '_': // #xA0 - s = append(s, '\xC2') - s = append(s, '\xA0') - case 'L': // LS (#x2028) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA8') - case 'P': // PS (#x2029) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA9') - case 'x': - code_length = 2 - case 'u': - code_length = 4 - case 'U': - code_length = 8 - default: - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found unknown escape character") - return false - } - - skip(parser) - skip(parser) - - // Consume an arbitrary escape code. - if code_length > 0 { - var value int - - // Scan the character value. - if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { - return false - } - for k := 0; k < code_length; k++ { - if !is_hex(parser.buffer, parser.buffer_pos+k) { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "did not find expected hexdecimal number") - return false - } - value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) - } - - // Check the value and write the character. - if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found invalid Unicode character escape code") - return false - } - if value <= 0x7F { - s = append(s, byte(value)) - } else if value <= 0x7FF { - s = append(s, byte(0xC0+(value>>6))) - s = append(s, byte(0x80+(value&0x3F))) - } else if value <= 0xFFFF { - s = append(s, byte(0xE0+(value>>12))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } else { - s = append(s, byte(0xF0+(value>>18))) - s = append(s, byte(0x80+((value>>12)&0x3F))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } - - // Advance the pointer. - for k := 0; k < code_length; k++ { - skip(parser) - } - } - } else { - // It is a non-escaped non-blank character. - s = read(parser, s) - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we are at the end of the scalar. - if single { - if parser.buffer[parser.buffer_pos] == '\'' { - break - } - } else { - if parser.buffer[parser.buffer_pos] == '"' { - break - } - } - - // Consume blank characters. - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Join the whitespaces or fold line breaks. - if leading_blanks { - // Do we need to fold line breaks? - if len(leading_break) > 0 && leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Eat the right quote. - skip(parser) - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_SINGLE_QUOTED_SCALAR_STYLE, - } - if !single { - token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - return true -} - -// Scan a plain scalar. -func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { - - var s, leading_break, trailing_breaks, whitespaces []byte - var leading_blanks bool - var indent = parser.indent + 1 - - start_mark := parser.mark - end_mark := parser.mark - - // Consume the content of the plain scalar. - for { - // Check for a document indicator. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - break - } - - // Check for a comment. - if parser.buffer[parser.buffer_pos] == '#' { - break - } - - // Consume non-blank characters. - for !is_blankz(parser.buffer, parser.buffer_pos) { - - // Check for indicators that may end a plain scalar. - if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level > 0 && - (parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}')) { - break - } - - // Check if we need to join whitespaces and breaks. - if leading_blanks || len(whitespaces) > 0 { - if leading_blanks { - // Do we need to fold line breaks? - if leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - leading_blanks = false - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Copy the character. - s = read(parser, s) - - end_mark = parser.mark - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - // Is it the end? - if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { - break - } - - // Consume blank characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - - // Check for tab characters that abuse indentation. - if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violates indentation") - return false - } - - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check indentation level. - if parser.flow_level == 0 && parser.mark.column < indent { - break - } - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_PLAIN_SCALAR_STYLE, - } - - // Note that we change the 'simple_key_allowed' flag. - if leading_blanks { - parser.simple_key_allowed = true - } - return true -} diff --git a/vendor/github.com/mikefarah/yaml/v2/sorter.go b/vendor/github.com/mikefarah/yaml/v2/sorter.go deleted file mode 100644 index 4c45e660a..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/sorter.go +++ /dev/null @@ -1,113 +0,0 @@ -package yaml - -import ( - "reflect" - "unicode" -) - -type keyList []reflect.Value - -func (l keyList) Len() int { return len(l) } -func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l keyList) Less(i, j int) bool { - a := l[i] - b := l[j] - ak := a.Kind() - bk := b.Kind() - for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { - a = a.Elem() - ak = a.Kind() - } - for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { - b = b.Elem() - bk = b.Kind() - } - af, aok := keyFloat(a) - bf, bok := keyFloat(b) - if aok && bok { - if af != bf { - return af < bf - } - if ak != bk { - return ak < bk - } - return numLess(a, b) - } - if ak != reflect.String || bk != reflect.String { - return ak < bk - } - ar, br := []rune(a.String()), []rune(b.String()) - for i := 0; i < len(ar) && i < len(br); i++ { - if ar[i] == br[i] { - continue - } - al := unicode.IsLetter(ar[i]) - bl := unicode.IsLetter(br[i]) - if al && bl { - return ar[i] < br[i] - } - if al || bl { - return bl - } - var ai, bi int - var an, bn int64 - if ar[i] == '0' || br[i] == '0' { - for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { - if ar[j] != '0' { - an = 1 - bn = 1 - break - } - } - } - for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { - an = an*10 + int64(ar[ai]-'0') - } - for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { - bn = bn*10 + int64(br[bi]-'0') - } - if an != bn { - return an < bn - } - if ai != bi { - return ai < bi - } - return ar[i] < br[i] - } - return len(ar) < len(br) -} - -// keyFloat returns a float value for v if it is a number/bool -// and whether it is a number/bool or not. -func keyFloat(v reflect.Value) (f float64, ok bool) { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()), true - case reflect.Float32, reflect.Float64: - return v.Float(), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return float64(v.Uint()), true - case reflect.Bool: - if v.Bool() { - return 1, true - } - return 0, true - } - return 0, false -} - -// numLess returns whether a < b. -// a and b must necessarily have the same kind. -func numLess(a, b reflect.Value) bool { - switch a.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return a.Int() < b.Int() - case reflect.Float32, reflect.Float64: - return a.Float() < b.Float() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return a.Uint() < b.Uint() - case reflect.Bool: - return !a.Bool() && b.Bool() - } - panic("not a number") -} diff --git a/vendor/github.com/mikefarah/yaml/v2/writerc.go b/vendor/github.com/mikefarah/yaml/v2/writerc.go deleted file mode 100644 index a2dde608c..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/writerc.go +++ /dev/null @@ -1,26 +0,0 @@ -package yaml - -// Set the writer error and return false. -func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_WRITER_ERROR - emitter.problem = problem - return false -} - -// Flush the output buffer. -func yaml_emitter_flush(emitter *yaml_emitter_t) bool { - if emitter.write_handler == nil { - panic("write handler not set") - } - - // Check if the buffer is empty. - if emitter.buffer_pos == 0 { - return true - } - - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - return true -} diff --git a/vendor/github.com/mikefarah/yaml/v2/yaml.go b/vendor/github.com/mikefarah/yaml/v2/yaml.go deleted file mode 100644 index de85aa4cd..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/yaml.go +++ /dev/null @@ -1,466 +0,0 @@ -// Package yaml implements YAML support for the Go language. -// -// Source code and other details for the project are available at GitHub: -// -// https://github.com/go-yaml/yaml -// -package yaml - -import ( - "errors" - "fmt" - "io" - "reflect" - "strings" - "sync" -) - -// MapSlice encodes and decodes as a YAML map. -// The order of keys is preserved when encoding and decoding. -type MapSlice []MapItem - -// MapItem is an item in a MapSlice. -type MapItem struct { - Key, Value interface{} -} - -// The Unmarshaler interface may be implemented by types to customize their -// behavior when being unmarshaled from a YAML document. The UnmarshalYAML -// method receives a function that may be called to unmarshal the original -// YAML value into a field or variable. It is safe to call the unmarshal -// function parameter more than once if necessary. -type Unmarshaler interface { - UnmarshalYAML(unmarshal func(interface{}) error) error -} - -// The Marshaler interface may be implemented by types to customize their -// behavior when being marshaled into a YAML document. The returned value -// is marshaled in place of the original value implementing Marshaler. -// -// If an error is returned by MarshalYAML, the marshaling procedure stops -// and returns with the provided error. -type Marshaler interface { - MarshalYAML() (interface{}, error) -} - -// Unmarshal decodes the first document found within the in byte slice -// and assigns decoded values into the out value. -// -// Maps and pointers (to a struct, string, int, etc) are accepted as out -// values. If an internal pointer within a struct is not initialized, -// the yaml package will initialize it if necessary for unmarshalling -// the provided data. The out parameter must not be nil. -// -// The type of the decoded values should be compatible with the respective -// values in out. If one or more values cannot be decoded due to a type -// mismatches, decoding continues partially until the end of the YAML -// content, and a *yaml.TypeError is returned with details for all -// missed values. -// -// Struct fields are only unmarshalled if they are exported (have an -// upper case first letter), and are unmarshalled using the field name -// lowercased as the default key. Custom keys may be defined via the -// "yaml" name in the field tag: the content preceding the first comma -// is used as the key, and the following comma-separated options are -// used to tweak the marshalling process (see Marshal). -// Conflicting names result in a runtime error. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// var t T -// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) -// -// See the documentation of Marshal for the format of tags and a list of -// supported tag options. -// -func Unmarshal(in []byte, out interface{}) (err error) { - return unmarshal(in, out, false) -} - -// UnmarshalStrict is like Unmarshal except that any fields that are found -// in the data that do not have corresponding struct members, or mapping -// keys that are duplicates, will result in -// an error. -func UnmarshalStrict(in []byte, out interface{}) (err error) { - return unmarshal(in, out, true) -} - -// A Decorder reads and decodes YAML values from an input stream. -type Decoder struct { - strict bool - parser *parser -} - -// NewDecoder returns a new decoder that reads from r. -// -// The decoder introduces its own buffering and may read -// data from r beyond the YAML values requested. -func NewDecoder(r io.Reader) *Decoder { - return &Decoder{ - parser: newParserFromReader(r), - } -} - -// SetStrict sets whether strict decoding behaviour is enabled when -// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict. -func (dec *Decoder) SetStrict(strict bool) { - dec.strict = strict -} - -// Decode reads the next YAML-encoded value from its input -// and stores it in the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (dec *Decoder) Decode(v interface{}) (err error) { - d := newDecoder(dec.strict) - defer handleErr(&err) - node := dec.parser.parse() - if node == nil { - return io.EOF - } - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(node, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -func unmarshal(in []byte, out interface{}, strict bool) (err error) { - defer handleErr(&err) - d := newDecoder(strict) - p := newParser(in) - defer p.destroy() - node := p.parse() - if node != nil { - v := reflect.ValueOf(out) - if v.Kind() == reflect.Ptr && !v.IsNil() { - v = v.Elem() - } - d.unmarshal(node, v) - } - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -// Marshal serializes the value provided into a YAML document. The structure -// of the generated document will reflect the structure of the value itself. -// Maps and pointers (to struct, string, int, etc) are accepted as the in value. -// -// Struct fields are only marshalled if they are exported (have an upper case -// first letter), and are marshalled using the field name lowercased as the -// default key. Custom keys may be defined via the "yaml" name in the field -// tag: the content preceding the first comma is used as the key, and the -// following comma-separated options are used to tweak the marshalling process. -// Conflicting names result in a runtime error. -// -// The field tag format accepted is: -// -// `(...) yaml:"[][,[,]]" (...)` -// -// The following flags are currently supported: -// -// omitempty Only include the field if it's not set to the zero -// value for the type or to empty slices or maps. -// Zero valued structs will be omitted if all their public -// fields are zero, unless they implement an IsZero -// method (see the IsZeroer interface type), in which -// case the field will be included if that method returns true. -// -// flow Marshal using a flow style (useful for structs, -// sequences and maps). -// -// inline Inline the field, which must be a struct or a map, -// causing all of its fields or keys to be processed as if -// they were part of the outer struct. For maps, keys must -// not conflict with the yaml keys of other struct fields. -// -// In addition, if the key is "-", the field is ignored. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" -// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := newEncoder() - defer e.destroy() - e.marshalDoc("", reflect.ValueOf(in)) - e.finish() - out = e.out - return -} - -// An Encoder writes YAML values to an output stream. -type Encoder struct { - encoder *encoder -} - -// NewEncoder returns a new encoder that writes to w. -// The Encoder should be closed after use to flush all data -// to w. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - encoder: newEncoderWithWriter(w), - } -} - -// Encode writes the YAML encoding of v to the stream. -// If multiple items are encoded to the stream, the -// second and subsequent document will be preceded -// with a "---" document separator, but the first will not. -// -// See the documentation for Marshal for details about the conversion of Go -// values to YAML. -func (e *Encoder) Encode(v interface{}) (err error) { - defer handleErr(&err) - e.encoder.marshalDoc("", reflect.ValueOf(v)) - return nil -} - -// Close closes the encoder by writing any remaining data. -// It does not write a stream terminating string "...". -func (e *Encoder) Close() (err error) { - defer handleErr(&err) - e.encoder.finish() - return nil -} - -func handleErr(err *error) { - if v := recover(); v != nil { - if e, ok := v.(yamlError); ok { - *err = e.err - } else { - panic(v) - } - } -} - -type yamlError struct { - err error -} - -func fail(err error) { - panic(yamlError{err}) -} - -func failf(format string, args ...interface{}) { - panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) -} - -// A TypeError is returned by Unmarshal when one or more fields in -// the YAML document cannot be properly decoded into the requested -// types. When this error is returned, the value is still -// unmarshaled partially. -type TypeError struct { - Errors []string -} - -func (e *TypeError) Error() string { - return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -// The code in this section was copied from mgo/bson. - -// structInfo holds details for the serialization of fields of -// a given struct. -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - - // InlineMap is the number of the field in the struct that - // contains an ,inline map, or -1 if there's none. - InlineMap int -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - Flow bool - // Id holds the unique field identifier, so we can cheaply - // check for field duplicates without maintaining an extra map. - Id int - - // Inline holds the field index if the field is part of an inlined struct. - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var fieldMapMutex sync.RWMutex - -func getStructInfo(st reflect.Type) (*structInfo, error) { - fieldMapMutex.RLock() - sinfo, found := structMap[st] - fieldMapMutex.RUnlock() - if found { - return sinfo, nil - } - - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" && !field.Anonymous { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("yaml") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "flow": - info.Flow = true - case "inline": - inline = true - default: - return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)) - } - } - tag = fields[0] - } - - if inline { - switch field.Type.Kind() { - case reflect.Map: - if inlineMap >= 0 { - return nil, errors.New("Multiple ,inline maps in struct " + st.String()) - } - if field.Type.Key() != reflect.TypeOf("") { - return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) - } - inlineMap = info.Num - case reflect.Struct: - sinfo, err := getStructInfo(field.Type) - if err != nil { - return nil, err - } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) - } - finfo.Id = len(fieldsList) - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - default: - //return nil, errors.New("Option ,inline needs a struct value or map field") - return nil, errors.New("Option ,inline needs a struct value field") - } - continue - } - - if tag != "" { - info.Key = tag - } else { - info.Key = strings.ToLower(field.Name) - } - - if _, found = fieldsMap[info.Key]; found { - msg := "Duplicated key '" + info.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - - info.Id = len(fieldsList) - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - - sinfo = &structInfo{ - FieldsMap: fieldsMap, - FieldsList: fieldsList, - InlineMap: inlineMap, - } - - fieldMapMutex.Lock() - structMap[st] = sinfo - fieldMapMutex.Unlock() - return sinfo, nil -} - -// IsZeroer is used to check whether an object is zero to -// determine whether it should be omitted when marshaling -// with the omitempty flag. One notable implementation -// is time.Time. -type IsZeroer interface { - IsZero() bool -} - -func isZero(v reflect.Value) bool { - kind := v.Kind() - if z, ok := v.Interface().(IsZeroer); ok { - if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { - return true - } - return z.IsZero() - } - switch kind { - case reflect.String: - return len(v.String()) == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Struct: - vt := v.Type() - for i := v.NumField() - 1; i >= 0; i-- { - if vt.Field(i).PkgPath != "" { - continue // Private field - } - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/github.com/mikefarah/yaml/v2/yamlh.go b/vendor/github.com/mikefarah/yaml/v2/yamlh.go deleted file mode 100644 index e25cee563..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/yamlh.go +++ /dev/null @@ -1,738 +0,0 @@ -package yaml - -import ( - "fmt" - "io" -) - -// The version directive data. -type yaml_version_directive_t struct { - major int8 // The major version number. - minor int8 // The minor version number. -} - -// The tag directive data. -type yaml_tag_directive_t struct { - handle []byte // The tag handle. - prefix []byte // The tag prefix. -} - -type yaml_encoding_t int - -// The stream encoding. -const ( - // Let the parser choose the encoding. - yaml_ANY_ENCODING yaml_encoding_t = iota - - yaml_UTF8_ENCODING // The default UTF-8 encoding. - yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. - yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. -) - -type yaml_break_t int - -// Line break types. -const ( - // Let the parser choose the break type. - yaml_ANY_BREAK yaml_break_t = iota - - yaml_CR_BREAK // Use CR for line breaks (Mac style). - yaml_LN_BREAK // Use LN for line breaks (Unix style). - yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). -) - -type yaml_error_type_t int - -// Many bad things could happen with the parser and emitter. -const ( - // No error is produced. - yaml_NO_ERROR yaml_error_type_t = iota - - yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. - yaml_READER_ERROR // Cannot read or decode the input stream. - yaml_SCANNER_ERROR // Cannot scan the input stream. - yaml_PARSER_ERROR // Cannot parse the input stream. - yaml_COMPOSER_ERROR // Cannot compose a YAML document. - yaml_WRITER_ERROR // Cannot write to the output stream. - yaml_EMITTER_ERROR // Cannot emit a YAML stream. -) - -// The pointer position. -type yaml_mark_t struct { - index int // The position index. - line int // The position line. - column int // The position column. -} - -// Node Styles - -type yaml_style_t int8 - -type yaml_scalar_style_t yaml_style_t - -// Scalar styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota - - yaml_PLAIN_SCALAR_STYLE // The plain scalar style. - yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. - yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. - yaml_LITERAL_SCALAR_STYLE // The literal scalar style. - yaml_FOLDED_SCALAR_STYLE // The folded scalar style. -) - -type yaml_sequence_style_t yaml_style_t - -// Sequence styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota - - yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. - yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. -) - -type yaml_mapping_style_t yaml_style_t - -// Mapping styles. -const ( - // Let the emitter choose the style. - yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota - - yaml_BLOCK_MAPPING_STYLE // The block mapping style. - yaml_FLOW_MAPPING_STYLE // The flow mapping style. -) - -// Tokens - -type yaml_token_type_t int - -// Token types. -const ( - // An empty token. - yaml_NO_TOKEN yaml_token_type_t = iota - - yaml_STREAM_START_TOKEN // A STREAM-START token. - yaml_STREAM_END_TOKEN // A STREAM-END token. - - yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. - yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. - yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. - yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. - - yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. - yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. - yaml_BLOCK_END_TOKEN // A BLOCK-END token. - - yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. - yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. - yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. - yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. - - yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. - yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. - yaml_KEY_TOKEN // A KEY token. - yaml_VALUE_TOKEN // A VALUE token. - - yaml_ALIAS_TOKEN // An ALIAS token. - yaml_ANCHOR_TOKEN // An ANCHOR token. - yaml_TAG_TOKEN // A TAG token. - yaml_SCALAR_TOKEN // A SCALAR token. -) - -func (tt yaml_token_type_t) String() string { - switch tt { - case yaml_NO_TOKEN: - return "yaml_NO_TOKEN" - case yaml_STREAM_START_TOKEN: - return "yaml_STREAM_START_TOKEN" - case yaml_STREAM_END_TOKEN: - return "yaml_STREAM_END_TOKEN" - case yaml_VERSION_DIRECTIVE_TOKEN: - return "yaml_VERSION_DIRECTIVE_TOKEN" - case yaml_TAG_DIRECTIVE_TOKEN: - return "yaml_TAG_DIRECTIVE_TOKEN" - case yaml_DOCUMENT_START_TOKEN: - return "yaml_DOCUMENT_START_TOKEN" - case yaml_DOCUMENT_END_TOKEN: - return "yaml_DOCUMENT_END_TOKEN" - case yaml_BLOCK_SEQUENCE_START_TOKEN: - return "yaml_BLOCK_SEQUENCE_START_TOKEN" - case yaml_BLOCK_MAPPING_START_TOKEN: - return "yaml_BLOCK_MAPPING_START_TOKEN" - case yaml_BLOCK_END_TOKEN: - return "yaml_BLOCK_END_TOKEN" - case yaml_FLOW_SEQUENCE_START_TOKEN: - return "yaml_FLOW_SEQUENCE_START_TOKEN" - case yaml_FLOW_SEQUENCE_END_TOKEN: - return "yaml_FLOW_SEQUENCE_END_TOKEN" - case yaml_FLOW_MAPPING_START_TOKEN: - return "yaml_FLOW_MAPPING_START_TOKEN" - case yaml_FLOW_MAPPING_END_TOKEN: - return "yaml_FLOW_MAPPING_END_TOKEN" - case yaml_BLOCK_ENTRY_TOKEN: - return "yaml_BLOCK_ENTRY_TOKEN" - case yaml_FLOW_ENTRY_TOKEN: - return "yaml_FLOW_ENTRY_TOKEN" - case yaml_KEY_TOKEN: - return "yaml_KEY_TOKEN" - case yaml_VALUE_TOKEN: - return "yaml_VALUE_TOKEN" - case yaml_ALIAS_TOKEN: - return "yaml_ALIAS_TOKEN" - case yaml_ANCHOR_TOKEN: - return "yaml_ANCHOR_TOKEN" - case yaml_TAG_TOKEN: - return "yaml_TAG_TOKEN" - case yaml_SCALAR_TOKEN: - return "yaml_SCALAR_TOKEN" - } - return "" -} - -// The token structure. -type yaml_token_t struct { - // The token type. - typ yaml_token_type_t - - // The start/end of the token. - start_mark, end_mark yaml_mark_t - - // The stream encoding (for yaml_STREAM_START_TOKEN). - encoding yaml_encoding_t - - // The alias/anchor/scalar value or tag/tag directive handle - // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). - value []byte - - // The tag suffix (for yaml_TAG_TOKEN). - suffix []byte - - // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). - prefix []byte - - // The scalar style (for yaml_SCALAR_TOKEN). - style yaml_scalar_style_t - - // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). - major, minor int8 -} - -// Events - -type yaml_event_type_t int8 - -// Event types. -const ( - // An empty event. - yaml_NO_EVENT yaml_event_type_t = iota - - yaml_STREAM_START_EVENT // A STREAM-START event. - yaml_STREAM_END_EVENT // A STREAM-END event. - yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. - yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. - yaml_ALIAS_EVENT // An ALIAS event. - yaml_SCALAR_EVENT // A SCALAR event. - yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. - yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. - yaml_MAPPING_START_EVENT // A MAPPING-START event. - yaml_MAPPING_END_EVENT // A MAPPING-END event. -) - -var eventStrings = []string{ - yaml_NO_EVENT: "none", - yaml_STREAM_START_EVENT: "stream start", - yaml_STREAM_END_EVENT: "stream end", - yaml_DOCUMENT_START_EVENT: "document start", - yaml_DOCUMENT_END_EVENT: "document end", - yaml_ALIAS_EVENT: "alias", - yaml_SCALAR_EVENT: "scalar", - yaml_SEQUENCE_START_EVENT: "sequence start", - yaml_SEQUENCE_END_EVENT: "sequence end", - yaml_MAPPING_START_EVENT: "mapping start", - yaml_MAPPING_END_EVENT: "mapping end", -} - -func (e yaml_event_type_t) String() string { - if e < 0 || int(e) >= len(eventStrings) { - return fmt.Sprintf("unknown event %d", e) - } - return eventStrings[e] -} - -// The event structure. -type yaml_event_t struct { - - // The event type. - typ yaml_event_type_t - - // The start and end of the event. - start_mark, end_mark yaml_mark_t - - // The document encoding (for yaml_STREAM_START_EVENT). - encoding yaml_encoding_t - - // The version directive (for yaml_DOCUMENT_START_EVENT). - version_directive *yaml_version_directive_t - - // The list of tag directives (for yaml_DOCUMENT_START_EVENT). - tag_directives []yaml_tag_directive_t - - // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). - anchor []byte - - // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - tag []byte - - // The scalar value (for yaml_SCALAR_EVENT). - value []byte - - // Is the document start/end indicator implicit, or the tag optional? - // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). - implicit bool - - // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). - quoted_implicit bool - - // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - style yaml_style_t -} - -func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } -func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } -func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } - -// Nodes - -const ( - yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. - yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. - yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. - yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. - yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. - yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. - - yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. - yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. - - // Not in original libyaml. - yaml_BINARY_TAG = "tag:yaml.org,2002:binary" - yaml_MERGE_TAG = "tag:yaml.org,2002:merge" - - yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. - yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. - yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. -) - -type yaml_node_type_t int - -// Node types. -const ( - // An empty node. - yaml_NO_NODE yaml_node_type_t = iota - - yaml_SCALAR_NODE // A scalar node. - yaml_SEQUENCE_NODE // A sequence node. - yaml_MAPPING_NODE // A mapping node. -) - -// An element of a sequence node. -type yaml_node_item_t int - -// An element of a mapping node. -type yaml_node_pair_t struct { - key int // The key of the element. - value int // The value of the element. -} - -// The node structure. -type yaml_node_t struct { - typ yaml_node_type_t // The node type. - tag []byte // The node tag. - - // The node data. - - // The scalar parameters (for yaml_SCALAR_NODE). - scalar struct { - value []byte // The scalar value. - length int // The length of the scalar value. - style yaml_scalar_style_t // The scalar style. - } - - // The sequence parameters (for YAML_SEQUENCE_NODE). - sequence struct { - items_data []yaml_node_item_t // The stack of sequence items. - style yaml_sequence_style_t // The sequence style. - } - - // The mapping parameters (for yaml_MAPPING_NODE). - mapping struct { - pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). - pairs_start *yaml_node_pair_t // The beginning of the stack. - pairs_end *yaml_node_pair_t // The end of the stack. - pairs_top *yaml_node_pair_t // The top of the stack. - style yaml_mapping_style_t // The mapping style. - } - - start_mark yaml_mark_t // The beginning of the node. - end_mark yaml_mark_t // The end of the node. - -} - -// The document structure. -type yaml_document_t struct { - - // The document nodes. - nodes []yaml_node_t - - // The version directive. - version_directive *yaml_version_directive_t - - // The list of tag directives. - tag_directives_data []yaml_tag_directive_t - tag_directives_start int // The beginning of the tag directives list. - tag_directives_end int // The end of the tag directives list. - - start_implicit int // Is the document start indicator implicit? - end_implicit int // Is the document end indicator implicit? - - // The start/end of the document. - start_mark, end_mark yaml_mark_t -} - -// The prototype of a read handler. -// -// The read handler is called when the parser needs to read more bytes from the -// source. The handler should write not more than size bytes to the buffer. -// The number of written bytes should be set to the size_read variable. -// -// [in,out] data A pointer to an application data specified by -// yaml_parser_set_input(). -// [out] buffer The buffer to write the data from the source. -// [in] size The size of the buffer. -// [out] size_read The actual number of bytes read from the source. -// -// On success, the handler should return 1. If the handler failed, -// the returned value should be 0. On EOF, the handler should set the -// size_read to 0 and return 1. -type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) - -// This structure holds information about a potential simple key. -type yaml_simple_key_t struct { - possible bool // Is a simple key possible? - required bool // Is a simple key required? - token_number int // The number of the token. - mark yaml_mark_t // The position mark. -} - -// The states of the parser. -type yaml_parser_state_t int - -const ( - yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota - - yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. - yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. - yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. - yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. - yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. - yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. - yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. - yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. - yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. - yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. - yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. - yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. - yaml_PARSE_END_STATE // Expect nothing. -) - -func (ps yaml_parser_state_t) String() string { - switch ps { - case yaml_PARSE_STREAM_START_STATE: - return "yaml_PARSE_STREAM_START_STATE" - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_START_STATE: - return "yaml_PARSE_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return "yaml_PARSE_DOCUMENT_CONTENT_STATE" - case yaml_PARSE_DOCUMENT_END_STATE: - return "yaml_PARSE_DOCUMENT_END_STATE" - case yaml_PARSE_BLOCK_NODE_STATE: - return "yaml_PARSE_BLOCK_NODE_STATE" - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" - case yaml_PARSE_FLOW_NODE_STATE: - return "yaml_PARSE_FLOW_NODE_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" - case yaml_PARSE_END_STATE: - return "yaml_PARSE_END_STATE" - } - return "" -} - -// This structure holds aliases data. -type yaml_alias_data_t struct { - anchor []byte // The anchor. - index int // The node id. - mark yaml_mark_t // The anchor mark. -} - -// The parser structure. -// -// All members are internal. Manage the structure using the -// yaml_parser_ family of functions. -type yaml_parser_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - - problem string // Error description. - - // The byte about which the problem occurred. - problem_offset int - problem_value int - problem_mark yaml_mark_t - - // The error context. - context string - context_mark yaml_mark_t - - // Reader stuff - - read_handler yaml_read_handler_t // Read handler. - - input_reader io.Reader // File input data. - input []byte // String input data. - input_pos int - - eof bool // EOF flag - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - unread int // The number of unread characters in the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The input encoding. - - offset int // The offset of the current position (in bytes). - mark yaml_mark_t // The mark of the current position. - - // Scanner stuff - - stream_start_produced bool // Have we started to scan the input stream? - stream_end_produced bool // Have we reached the end of the input stream? - - flow_level int // The number of unclosed '[' and '{' indicators. - - tokens []yaml_token_t // The tokens queue. - tokens_head int // The head of the tokens queue. - tokens_parsed int // The number of tokens fetched from the queue. - token_available bool // Does the tokens queue contain a token ready for dequeueing. - - indent int // The current indentation level. - indents []int // The indentation levels stack. - - simple_key_allowed bool // May a simple key occur at the current position? - simple_keys []yaml_simple_key_t // The stack of simple keys. - - // Parser stuff - - state yaml_parser_state_t // The current parser state. - states []yaml_parser_state_t // The parser states stack. - marks []yaml_mark_t // The stack of marks. - tag_directives []yaml_tag_directive_t // The list of TAG directives. - - // Dumper stuff - - aliases []yaml_alias_data_t // The alias data. - - document *yaml_document_t // The currently parsed document. -} - -// Emitter Definitions - -// The prototype of a write handler. -// -// The write handler is called when the emitter needs to flush the accumulated -// characters to the output. The handler should write @a size bytes of the -// @a buffer to the output. -// -// @param[in,out] data A pointer to an application data specified by -// yaml_emitter_set_output(). -// @param[in] buffer The buffer with bytes to be written. -// @param[in] size The size of the buffer. -// -// @returns On success, the handler should return @c 1. If the handler failed, -// the returned value should be @c 0. -// -type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error - -type yaml_emitter_state_t int - -// The emitter states. -const ( - // Expect STREAM-START. - yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota - - yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. - yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. - yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. - yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. - yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. - yaml_EMIT_END_STATE // Expect nothing. -) - -// The emitter structure. -// -// All members are internal. Manage the structure using the @c yaml_emitter_ -// family of functions. -type yaml_emitter_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - problem string // Error description. - - // Writer stuff - - write_handler yaml_write_handler_t // Write handler. - - output_buffer *[]byte // String output data. - output_writer io.Writer // File output data. - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The stream encoding. - - // Emitter stuff - - canonical bool // If the output is in the canonical style? - best_indent int // The number of indentation spaces. - best_width int // The preferred width of the output lines. - unicode bool // Allow unescaped non-ASCII characters? - line_break yaml_break_t // The preferred line break. - - state yaml_emitter_state_t // The current emitter state. - states []yaml_emitter_state_t // The stack of states. - - events []yaml_event_t // The event queue. - events_head int // The head of the event queue. - - indents []int // The stack of indentation levels. - - tag_directives []yaml_tag_directive_t // The list of tag directives. - - indent int // The current indentation level. - - flow_level int // The current flow level. - - root_context bool // Is it the document root context? - sequence_context bool // Is it a sequence context? - mapping_context bool // Is it a mapping context? - simple_key_context bool // Is it a simple mapping key context? - - line int // The current line. - column int // The current column. - whitespace bool // If the last character was a whitespace? - indention bool // If the last character was an indentation character (' ', '-', '?', ':')? - open_ended bool // If an explicit document end is required? - - // Anchor analysis. - anchor_data struct { - anchor []byte // The anchor value. - alias bool // Is it an alias? - } - - // Tag analysis. - tag_data struct { - handle []byte // The tag handle. - suffix []byte // The tag suffix. - } - - // Scalar analysis. - scalar_data struct { - value []byte // The scalar value. - multiline bool // Does the scalar contain line breaks? - flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? - block_plain_allowed bool // Can the scalar be expressed in the block plain style? - single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? - block_allowed bool // Can the scalar be expressed in the literal or folded styles? - style yaml_scalar_style_t // The output style. - } - - // Dumper stuff - - opened bool // If the stream was already opened? - closed bool // If the stream was already closed? - - // The information associated with the document nodes. - anchors *struct { - references int // The number of references. - anchor int // The anchor id. - serialized bool // If the node has been emitted? - } - - last_anchor_id int // The last assigned anchor id. - - document *yaml_document_t // The currently emitted document. -} diff --git a/vendor/github.com/mikefarah/yaml/v2/yamlprivateh.go b/vendor/github.com/mikefarah/yaml/v2/yamlprivateh.go deleted file mode 100644 index 8110ce3c3..000000000 --- a/vendor/github.com/mikefarah/yaml/v2/yamlprivateh.go +++ /dev/null @@ -1,173 +0,0 @@ -package yaml - -const ( - // The size of the input raw buffer. - input_raw_buffer_size = 512 - - // The size of the input buffer. - // It should be possible to decode the whole raw buffer. - input_buffer_size = input_raw_buffer_size * 3 - - // The size of the output buffer. - output_buffer_size = 128 - - // The size of the output raw buffer. - // It should be possible to encode the whole output buffer. - output_raw_buffer_size = (output_buffer_size*2 + 2) - - // The size of other stacks and queues. - initial_stack_size = 16 - initial_queue_size = 16 - initial_string_size = 16 -) - -// Check if the character at the specified position is an alphabetical -// character, a digit, '_', or '-'. -func is_alpha(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' -} - -// Check if the character at the specified position is a digit. -func is_digit(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' -} - -// Get the value of a digit. -func as_digit(b []byte, i int) int { - return int(b[i]) - '0' -} - -// Check if the character at the specified position is a hex-digit. -func is_hex(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' -} - -// Get the value of a hex-digit. -func as_hex(b []byte, i int) int { - bi := b[i] - if bi >= 'A' && bi <= 'F' { - return int(bi) - 'A' + 10 - } - if bi >= 'a' && bi <= 'f' { - return int(bi) - 'a' + 10 - } - return int(bi) - '0' -} - -// Check if the character is ASCII. -func is_ascii(b []byte, i int) bool { - return b[i] <= 0x7F -} - -// Check if the character at the start of the buffer can be printed unescaped. -func is_printable(b []byte, i int) bool { - return ((b[i] == 0x0A) || // . == #x0A - (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E - (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF - (b[i] > 0xC2 && b[i] < 0xED) || - (b[i] == 0xED && b[i+1] < 0xA0) || - (b[i] == 0xEE) || - (b[i] == 0xEF && // #xE000 <= . <= #xFFFD - !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF - !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) -} - -// Check if the character at the specified position is NUL. -func is_z(b []byte, i int) bool { - return b[i] == 0x00 -} - -// Check if the beginning of the buffer is a BOM. -func is_bom(b []byte, i int) bool { - return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF -} - -// Check if the character at the specified position is space. -func is_space(b []byte, i int) bool { - return b[i] == ' ' -} - -// Check if the character at the specified position is tab. -func is_tab(b []byte, i int) bool { - return b[i] == '\t' -} - -// Check if the character at the specified position is blank (space or tab). -func is_blank(b []byte, i int) bool { - //return is_space(b, i) || is_tab(b, i) - return b[i] == ' ' || b[i] == '\t' -} - -// Check if the character at the specified position is a line break. -func is_break(b []byte, i int) bool { - return (b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) -} - -func is_crlf(b []byte, i int) bool { - return b[i] == '\r' && b[i+1] == '\n' -} - -// Check if the character is a line break or NUL. -func is_breakz(b []byte, i int) bool { - //return is_break(b, i) || is_z(b, i) - return ( // is_break: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - // is_z: - b[i] == 0) -} - -// Check if the character is a line break, space, or NUL. -func is_spacez(b []byte, i int) bool { - //return is_space(b, i) || is_breakz(b, i) - return ( // is_space: - b[i] == ' ' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Check if the character is a line break, space, tab, or NUL. -func is_blankz(b []byte, i int) bool { - //return is_blank(b, i) || is_breakz(b, i) - return ( // is_blank: - b[i] == ' ' || b[i] == '\t' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Determine the width of the character. -func width(b byte) int { - // Don't replace these by a switch without first - // confirming that it is being inlined. - if b&0x80 == 0x00 { - return 1 - } - if b&0xE0 == 0xC0 { - return 2 - } - if b&0xF0 == 0xE0 { - return 3 - } - if b&0xF8 == 0xF0 { - return 4 - } - return 0 - -} diff --git a/vendor/github.com/mikefarah/yq/v2/.travis.yml b/vendor/github.com/mikefarah/yq/v2/.travis.yml deleted file mode 100644 index 6f4d9cfde..000000000 --- a/vendor/github.com/mikefarah/yq/v2/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: go -go: - - 1.13.x -script: - - scripts/devtools.sh - - make local build diff --git a/vendor/github.com/mikefarah/yq/v2/README.md b/vendor/github.com/mikefarah/yq/v2/README.md deleted file mode 100644 index f11624a9d..000000000 --- a/vendor/github.com/mikefarah/yq/v2/README.md +++ /dev/null @@ -1,127 +0,0 @@ -# yq - -[![Build Status](https://travis-ci.org/mikefarah/yq.svg?branch=master)](https://travis-ci.org/mikefarah/yq) ![Docker Pulls](https://img.shields.io/docker/pulls/mikefarah/yq.svg) ![Github Releases (by Release)](https://img.shields.io/github/downloads/mikefarah/yq/total.svg) ![Go Report](https://goreportcard.com/badge/github.com/mikefarah/yq) - - -a lightweight and portable command-line YAML processor - -The aim of the project is to be the [jq](https://github.com/stedolan/jq) or sed of yaml files. - -## Install -### On MacOS: -``` -brew install yq -``` -### On Ubuntu and other Linux distros supporting `snap` packages: -``` -snap install yq -``` - -#### Snap notes -`yq` installs with with [_strict confinement_](https://docs.snapcraft.io/snap-confinement/6233) in snap, this means it doesn't have direct access to root files. To read root files you can: - -``` -sudo cat /etc/myfile | yq -r - somecommand -``` - -And to write to a root file you can either use [sponge](https://linux.die.net/man/1/sponge): -``` -sudo cat /etc/myfile | yq -r - somecommand | sudo sponge /etc/myfile -``` -or write to a temporary file: -``` -sudo cat /etc/myfile | yq -r - somecommand | sudo tee /etc/myfile.tmp -sudo mv /etc/myfile.tmp /etc/myfile -rm /etc/myfile.tmp -``` - -### On Ubuntu 16.04 or higher from Debian package: -``` -sudo add-apt-repository ppa:rmescandon/yq -sudo apt update -sudo apt install yq -y -``` -### or, [Download latest binary](https://github.com/mikefarah/yq/releases/latest) or alternatively: -``` -GO111MODULE=on go get github.com/mikefarah/yq@2.4.1 -``` - -## Run with Docker - -Oneshot use: - -```bash -docker run --rm -v ${PWD}:/workdir mikefarah/yq yq [flags] FILE... -``` - -Run commands interactively: - -```bash -docker run --rm -it -v ${PWD}:/workdir mikefarah/yq sh -``` - -It can be useful to have a bash function to avoid typing the whole docker command: - -```bash -yq() { - docker run --rm -i -v ${PWD}:/workdir mikefarah/yq yq $@ -} -``` - -## Features -- Written in portable go, so you can download a lovely dependency free binary -- Deep read a yaml file with a given path -- Update a yaml file given a path -- Update a yaml file given a script file -- Update creates any missing entries in the path on the fly -- Create a yaml file given a deep path and value -- Create a yaml file given a script file -- Prefix a path to a yaml file -- Convert from json to yaml -- Convert from yaml to json -- Pipe data in by using '-' -- Merge multiple yaml files where each additional file sets values for missing or null value keys. -- Merge multiple yaml files and override previous values. -- Merge multiple yaml files and append array values. -- Supports multiple documents in a single yaml file - -## [Usage](http://mikefarah.github.io/yq/) - -Check out the [documentation](http://mikefarah.github.io/yq/) for more detailed and advanced usage. - -``` -yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files. - -Usage: - yq [flags] - yq [command] - -Available Commands: - delete yq d [--inplace/-i] [--doc/-d index] sample.yaml a.b.c - help Help about any command - merge yq m [--inplace/-i] [--doc/-d index] [--overwrite/-x] [--append/-a] sample.yaml sample2.yaml - new yq n [--script/-s script_file] a.b.c newValue - prefix yq p [--inplace/-i] [--doc/-d index] sample.yaml a.b.c - read yq r [--doc/-d index] sample.yaml a.b.c - write yq w [--inplace/-i] [--script/-s script_file] [--doc/-d index] sample.yaml a.b.c newValue - -Flags: - -h, --help help for yq - -t, --trim trim yaml output (default true) - -v, --verbose verbose mode - -V, --version Print version information and quit - -Use "yq [command] --help" for more information about a command. -``` - -## Contribute -1. `scripts/devtools.sh` -2. `make [local] vendor` -3. add unit tests -4. apply changes to go.mod -5. `make [local] build` -6. If required, update the user documentation - - Update README.md and/or documentation under the mkdocs folder - - `make [local] build-docs` - - browse to docs/index.html and check your changes -7. profit diff --git a/vendor/github.com/mikefarah/yq/v2/data_navigator.go b/vendor/github.com/mikefarah/yq/v2/data_navigator.go deleted file mode 100644 index 5746db709..000000000 --- a/vendor/github.com/mikefarah/yq/v2/data_navigator.go +++ /dev/null @@ -1,349 +0,0 @@ -package main - -import ( - "fmt" - "reflect" - "strconv" - "strings" - - yaml "github.com/mikefarah/yaml/v2" -) - -func matchesKey(key string, actual interface{}) bool { - var actualString = fmt.Sprintf("%v", actual) - var prefixMatch = strings.TrimSuffix(key, "*") - if prefixMatch != key { - return strings.HasPrefix(actualString, prefixMatch) - } - return actualString == key -} - -func entriesInSlice(context yaml.MapSlice, key string) []*yaml.MapItem { - var matches = make([]*yaml.MapItem, 0) - for idx := range context { - var entry = &context[idx] - if matchesKey(key, entry.Key) { - matches = append(matches, entry) - } - } - return matches -} - -func getMapSlice(context interface{}) yaml.MapSlice { - var mapSlice yaml.MapSlice - switch context := context.(type) { - case yaml.MapSlice: - mapSlice = context - default: - mapSlice = make(yaml.MapSlice, 0) - } - return mapSlice -} - -func getArray(context interface{}) (array []interface{}, ok bool) { - switch context := context.(type) { - case []interface{}: - array = context - ok = true - default: - array = make([]interface{}, 0) - ok = false - } - return -} - -func writeMap(context interface{}, paths []string, value interface{}) interface{} { - log.Debugf("writeMap with path %v for %v to set value %v\n", paths, context, value) - - mapSlice := getMapSlice(context) - - if len(paths) == 0 { - return context - } - - children := entriesInSlice(mapSlice, paths[0]) - - if len(children) == 0 && paths[0] == "*" { - log.Debugf("\tNo matches, return map as is") - return context - } - - if len(children) == 0 { - newChild := yaml.MapItem{Key: paths[0]} - mapSlice = append(mapSlice, newChild) - children = entriesInSlice(mapSlice, paths[0]) - log.Debugf("\tAppended child at %v for mapSlice %v\n", paths[0], mapSlice) - } - - remainingPaths := paths[1:] - for _, child := range children { - child.Value = updatedChildValue(child.Value, remainingPaths, value) - } - log.Debugf("\tReturning mapSlice %v\n", mapSlice) - return mapSlice -} - -func updatedChildValue(child interface{}, remainingPaths []string, value interface{}) interface{} { - if len(remainingPaths) == 0 { - return value - } - log.Debugf("updatedChildValue for child %v with path %v to set value %v", child, remainingPaths, value) - log.Debugf("type of child is %v", reflect.TypeOf(child)) - - switch child := child.(type) { - case nil: - if remainingPaths[0] == "+" || remainingPaths[0] == "*" { - return writeArray(child, remainingPaths, value) - } - case []interface{}: - _, nextIndexErr := strconv.ParseInt(remainingPaths[0], 10, 64) - arrayCommand := nextIndexErr == nil || remainingPaths[0] == "+" || remainingPaths[0] == "*" - if arrayCommand { - return writeArray(child, remainingPaths, value) - } - } - return writeMap(child, remainingPaths, value) -} - -func writeArray(context interface{}, paths []string, value interface{}) []interface{} { - log.Debugf("writeArray with path %v for %v to set value %v\n", paths, context, value) - array, _ := getArray(context) - - if len(paths) == 0 { - return array - } - - log.Debugf("\tarray %v\n", array) - - rawIndex := paths[0] - remainingPaths := paths[1:] - var index int64 - // the append array indicator - if rawIndex == "+" { - index = int64(len(array)) - } else if rawIndex == "*" { - for index, oldChild := range array { - array[index] = updatedChildValue(oldChild, remainingPaths, value) - } - return array - } else { - index, _ = strconv.ParseInt(rawIndex, 10, 64) // nolint - // writeArray is only called by updatedChildValue which handles parsing the - // index, as such this renders this dead code. - } - - for index >= int64(len(array)) { - array = append(array, nil) - } - currentChild := array[index] - - log.Debugf("\tcurrentChild %v\n", currentChild) - - array[index] = updatedChildValue(currentChild, remainingPaths, value) - log.Debugf("\tReturning array %v\n", array) - return array -} - -func readMap(context yaml.MapSlice, head string, tail []string) (interface{}, error) { - log.Debugf("readingMap %v with key %v\n", context, head) - if head == "*" { - return readMapSplat(context, tail) - } - - entries := entriesInSlice(context, head) - if len(entries) == 1 { - return calculateValue(entries[0].Value, tail) - } else if len(entries) == 0 { - return nil, nil - } - var errInIdx error - values := make([]interface{}, len(entries)) - for idx, entry := range entries { - values[idx], errInIdx = calculateValue(entry.Value, tail) - if errInIdx != nil { - log.Errorf("Error updating index %v in %v", idx, context) - return nil, errInIdx - } - - } - return values, nil -} - -func readMapSplat(context yaml.MapSlice, tail []string) (interface{}, error) { - var newArray = make([]interface{}, len(context)) - var i = 0 - for _, entry := range context { - if len(tail) > 0 { - val, err := recurse(entry.Value, tail[0], tail[1:]) - if err != nil { - return nil, err - } - newArray[i] = val - } else { - newArray[i] = entry.Value - } - i++ - } - return newArray, nil -} - -func recurse(value interface{}, head string, tail []string) (interface{}, error) { - switch value := value.(type) { - case []interface{}: - if head == "*" { - return readArraySplat(value, tail) - } - index, err := strconv.ParseInt(head, 10, 64) - if err != nil { - return nil, fmt.Errorf("error accessing array: %v", err) - } - return readArray(value, index, tail) - case yaml.MapSlice: - return readMap(value, head, tail) - default: - return nil, nil - } -} - -func readArray(array []interface{}, head int64, tail []string) (interface{}, error) { - if head >= int64(len(array)) { - return nil, nil - } - - value := array[head] - return calculateValue(value, tail) -} - -func readArraySplat(array []interface{}, tail []string) (interface{}, error) { - var newArray = make([]interface{}, len(array)) - for index, value := range array { - val, err := calculateValue(value, tail) - if err != nil { - return nil, err - } - newArray[index] = val - } - return newArray, nil -} - -func calculateValue(value interface{}, tail []string) (interface{}, error) { - if len(tail) > 0 { - return recurse(value, tail[0], tail[1:]) - } - return value, nil -} - -func deleteMap(context interface{}, paths []string) (yaml.MapSlice, error) { - log.Debugf("deleteMap for %v for %v\n", paths, context) - - mapSlice := getMapSlice(context) - - if len(paths) == 0 { - return mapSlice, nil - } - - var index int - var child yaml.MapItem - for index, child = range mapSlice { - if matchesKey(paths[0], child.Key) { - log.Debugf("\tMatched [%v] with [%v] at index %v", paths[0], child.Key, index) - var badDelete error - mapSlice, badDelete = deleteEntryInMap(mapSlice, child, index, paths) - if badDelete != nil { - return nil, badDelete - } - } - } - - return mapSlice, nil - -} - -func deleteEntryInMap(original yaml.MapSlice, child yaml.MapItem, index int, paths []string) (yaml.MapSlice, error) { - remainingPaths := paths[1:] - - var newSlice yaml.MapSlice - if len(remainingPaths) > 0 { - newChild := yaml.MapItem{Key: child.Key} - var errorDeleting error - newChild.Value, errorDeleting = deleteChildValue(child.Value, remainingPaths) - if errorDeleting != nil { - return nil, errorDeleting - } - - newSlice = make(yaml.MapSlice, len(original)) - for i := range original { - item := original[i] - if i == index { - item = newChild - } - newSlice[i] = item - } - } else { - // Delete item from slice at index - newSlice = append(original[:index], original[index+1:]...) - log.Debugf("\tDeleted item index %d from original", index) - } - - log.Debugf("\tReturning original %v\n", original) - return newSlice, nil -} - -func deleteArraySplat(array []interface{}, tail []string) (interface{}, error) { - log.Debugf("deleteArraySplat for %v for %v\n", tail, array) - var newArray = make([]interface{}, len(array)) - for index, value := range array { - val, err := deleteChildValue(value, tail) - if err != nil { - return nil, err - } - newArray[index] = val - } - return newArray, nil -} - -func deleteArray(array []interface{}, paths []string, index int64) (interface{}, error) { - log.Debugf("deleteArray for %v for %v\n", paths, array) - - if index >= int64(len(array)) { - return array, nil - } - - remainingPaths := paths[1:] - if len(remainingPaths) > 0 { - // Recurse into the array element at index - var errorDeleting error - array[index], errorDeleting = deleteMap(array[index], remainingPaths) - if errorDeleting != nil { - return nil, errorDeleting - } - - } else { - // Delete the array element at index - array = append(array[:index], array[index+1:]...) - log.Debugf("\tDeleted item index %d from array, leaving %v", index, array) - } - - log.Debugf("\tReturning array: %v\n", array) - return array, nil -} - -func deleteChildValue(child interface{}, remainingPaths []string) (interface{}, error) { - log.Debugf("deleteChildValue for %v for %v\n", remainingPaths, child) - var head = remainingPaths[0] - var tail = remainingPaths[1:] - switch child := child.(type) { - case yaml.MapSlice: - return deleteMap(child, remainingPaths) - case []interface{}: - if head == "*" { - return deleteArraySplat(child, tail) - } - index, err := strconv.ParseInt(head, 10, 64) - if err != nil { - return nil, fmt.Errorf("error accessing array: %v", err) - } - return deleteArray(child, remainingPaths, index) - } - return child, nil -} diff --git a/vendor/github.com/mikefarah/yq/v2/go.mod b/vendor/github.com/mikefarah/yq/v2/go.mod deleted file mode 100644 index 0b008769e..000000000 --- a/vendor/github.com/mikefarah/yq/v2/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/mikefarah/yq/v2 - -require ( - github.com/mikefarah/yaml/v2 v2.4.0 - github.com/pkg/errors v0.8.1 - github.com/spf13/cobra v0.0.5 - golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0 // indirect - gopkg.in/imdario/mergo.v0 v0.3.7 - gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 -) - -go 1.13 diff --git a/vendor/github.com/mikefarah/yq/v2/go.sum b/vendor/github.com/mikefarah/yq/v2/go.sum deleted file mode 100644 index 40ff65e55..000000000 --- a/vendor/github.com/mikefarah/yq/v2/go.sum +++ /dev/null @@ -1,50 +0,0 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mikefarah/yaml/v2 v2.4.0 h1:eYqfooY0BnvKTJxr7+ABJs13n3dg9n347GScDaU2Lww= -github.com/mikefarah/yaml/v2 v2.4.0/go.mod h1:ahVqZF4n1W4NqwvVnZzC4es67xsW9uR/RRf2RRxieJU= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0 h1:s5lp4ug7qHzUccgyFdjsX7OZDzHXRaePrF3B3vmUiuM= -golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/imdario/mergo.v0 v0.3.7 h1:QDotlIZtaO/p+Um0ok18HRTpq5i5/SAk/qprsor+9c8= -gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U= -gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= -gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/mikefarah/yq/v2/json_converter.go b/vendor/github.com/mikefarah/yq/v2/json_converter.go deleted file mode 100644 index 10e152b9d..000000000 --- a/vendor/github.com/mikefarah/yq/v2/json_converter.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "strconv" - - yaml "github.com/mikefarah/yaml/v2" -) - -func jsonToString(context interface{}) (string, error) { - out, err := json.Marshal(toJSON(context)) - if err != nil { - return "", fmt.Errorf("error printing yaml as json: %v", err) - } - return string(out), nil -} - -func toJSON(context interface{}) interface{} { - switch context := context.(type) { - case []interface{}: - oldArray := context - newArray := make([]interface{}, len(oldArray)) - for index, value := range oldArray { - newArray[index] = toJSON(value) - } - return newArray - case yaml.MapSlice: - oldMap := context - newMap := make(map[string]interface{}) - for _, entry := range oldMap { - if str, ok := entry.Key.(string); ok { - newMap[str] = toJSON(entry.Value) - } else if i, ok := entry.Key.(int); ok { - newMap[strconv.Itoa(i)] = toJSON(entry.Value) - } else if b, ok := entry.Key.(bool); ok { - newMap[strconv.FormatBool(b)] = toJSON(entry.Value) - } - } - return newMap - default: - return context - } -} diff --git a/vendor/github.com/mikefarah/yq/v2/merge.go b/vendor/github.com/mikefarah/yq/v2/merge.go deleted file mode 100644 index e80bce364..000000000 --- a/vendor/github.com/mikefarah/yq/v2/merge.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import mergo "gopkg.in/imdario/mergo.v0" - -func merge(dst interface{}, src interface{}, overwrite bool, append bool) error { - if overwrite { - return mergo.Merge(dst, src, mergo.WithOverride) - } else if append { - return mergo.Merge(dst, src, mergo.WithAppendSlice) - } - return mergo.Merge(dst, src) -} diff --git a/vendor/github.com/mikefarah/yq/v2/mkdocs.yml b/vendor/github.com/mikefarah/yq/v2/mkdocs.yml deleted file mode 100644 index 99164cbf5..000000000 --- a/vendor/github.com/mikefarah/yq/v2/mkdocs.yml +++ /dev/null @@ -1,28 +0,0 @@ -docs_dir: mkdocs -site_dir: docs -site_name: Yq -theme: 'material' -pages: - - Install: index.md - - Read: read.md - - Write/Update: write.md - - Prefix: prefix.md - - Delete: delete.md - - Create: create.md - - Convert: convert.md - - Merge: merge.md -repo_name: 'mikefarah/yq' -repo_url: 'https://github.com/mikefarah/yq' - -extra: - social: - - type: 'github' - link: 'https://github.com/mikefarah' - - type: 'linkedin' - link: 'https://www.linkedin.com/in/mike-farah-b5a75b2/' - -markdown_extensions: - - markdown_include.include: - base_path: mkdocs - - toc: - permalink: True diff --git a/vendor/github.com/mikefarah/yq/v2/path_parser.go b/vendor/github.com/mikefarah/yq/v2/path_parser.go deleted file mode 100644 index 0eed4a49d..000000000 --- a/vendor/github.com/mikefarah/yq/v2/path_parser.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -func parsePath(path string) []string { - return parsePathAccum([]string{}, path) -} - -func parsePathAccum(paths []string, remaining string) []string { - head, tail := nextYamlPath(remaining) - if tail == "" { - return append(paths, head) - } - return parsePathAccum(append(paths, head), tail) -} - -func nextYamlPath(path string) (pathElement string, remaining string) { - switch path[0] { - case '[': - // e.g [0].blah.cat -> we need to return "0" and "blah.cat" - return search(path[1:], []uint8{']'}, true) - case '"': - // e.g "a.b".blah.cat -> we need to return "a.b" and "blah.cat" - return search(path[1:], []uint8{'"'}, true) - default: - // e.g "a.blah.cat" -> return "a" and "blah.cat" - return search(path[0:], []uint8{'.', '['}, false) - } -} - -func search(path string, matchingChars []uint8, skipNext bool) (pathElement string, remaining string) { - for i := 0; i < len(path); i++ { - var char = path[i] - if contains(matchingChars, char) { - var remainingStart = i + 1 - if skipNext { - remainingStart = remainingStart + 1 - } else if !skipNext && char != '.' { - remainingStart = i - } - if remainingStart > len(path) { - remainingStart = len(path) - } - return path[0:i], path[remainingStart:] - } - } - return path, "" -} - -func contains(matchingChars []uint8, candidate uint8) bool { - for _, a := range matchingChars { - if a == candidate { - return true - } - } - return false -} diff --git a/vendor/github.com/mikefarah/yq/v2/test.yml b/vendor/github.com/mikefarah/yq/v2/test.yml deleted file mode 100644 index 71f1098c6..000000000 --- a/vendor/github.com/mikefarah/yq/v2/test.yml +++ /dev/null @@ -1,2 +0,0 @@ -a: apple -c: cat diff --git a/vendor/github.com/mikefarah/yq/v2/yq.go b/vendor/github.com/mikefarah/yq/v2/yq.go deleted file mode 100644 index c59128f1e..000000000 --- a/vendor/github.com/mikefarah/yq/v2/yq.go +++ /dev/null @@ -1,709 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "reflect" - "strconv" - "strings" - - errors "github.com/pkg/errors" - - yaml "github.com/mikefarah/yaml/v2" - "github.com/spf13/cobra" - logging "gopkg.in/op/go-logging.v1" -) - -var trimOutput = true -var writeInplace = false -var writeScript = "" -var outputToJSON = false -var overwriteFlag = false -var allowEmptyFlag = false -var appendFlag = false -var verbose = false -var version = false -var docIndex = "0" -var log = logging.MustGetLogger("yq") - -func main() { - cmd := newCommandCLI() - if err := cmd.Execute(); err != nil { - log.Error(err.Error()) - os.Exit(1) - } -} - -func newCommandCLI() *cobra.Command { - yaml.DefaultMapType = reflect.TypeOf(yaml.MapSlice{}) - var rootCmd = &cobra.Command{ - Use: "yq", - Short: "yq is a lightweight and portable command-line YAML processor.", - Long: `yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files.`, - RunE: func(cmd *cobra.Command, args []string) error { - if version { - cmd.Print(GetVersionDisplay()) - return nil - } - cmd.Println(cmd.UsageString()) - - return nil - }, - PersistentPreRun: func(cmd *cobra.Command, args []string) { - var format = logging.MustStringFormatter( - `%{color}%{time:15:04:05} %{shortfunc} [%{level:.4s}]%{color:reset} %{message}`, - ) - var backend = logging.AddModuleLevel( - logging.NewBackendFormatter(logging.NewLogBackend(os.Stderr, "", 0), format)) - - if verbose { - backend.SetLevel(logging.DEBUG, "") - } else { - backend.SetLevel(logging.ERROR, "") - } - - logging.SetBackend(backend) - }, - } - - rootCmd.PersistentFlags().BoolVarP(&trimOutput, "trim", "t", true, "trim yaml output") - rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose mode") - rootCmd.Flags().BoolVarP(&version, "version", "V", false, "Print version information and quit") - - rootCmd.AddCommand( - createReadCmd(), - createWriteCmd(), - createPrefixCmd(), - createDeleteCmd(), - createNewCmd(), - createMergeCmd(), - ) - rootCmd.SetOutput(os.Stdout) - - return rootCmd -} - -func createReadCmd() *cobra.Command { - var cmdRead = &cobra.Command{ - Use: "read [yaml_file] [path]", - Aliases: []string{"r"}, - Short: "yq r [--doc/-d index] sample.yaml a.b.c", - Example: ` -yq read things.yaml a.b.c -yq r - a.b.c (reads from stdin) -yq r things.yaml a.*.c -yq r -d1 things.yaml a.array[0].blah -yq r things.yaml a.array[*].blah -yq r -- things.yaml --key-starting-with-dashes - `, - Long: "Outputs the value of the given path in the yaml file to STDOUT", - RunE: readProperty, - } - cmdRead.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") - cmdRead.PersistentFlags().BoolVarP(&outputToJSON, "tojson", "j", false, "output as json") - return cmdRead -} - -func createWriteCmd() *cobra.Command { - var cmdWrite = &cobra.Command{ - Use: "write [yaml_file] [path] [value]", - Aliases: []string{"w"}, - Short: "yq w [--inplace/-i] [--script/-s script_file] [--doc/-d index] sample.yaml a.b.c newValue", - Example: ` -yq write things.yaml a.b.c cat -yq write --inplace -- things.yaml a.b.c --cat -yq w -i things.yaml a.b.c cat -yq w --script update_script.yaml things.yaml -yq w -i -s update_script.yaml things.yaml -yq w --doc 2 things.yaml a.b.d[+] foo -yq w -d2 things.yaml a.b.d[+] foo - `, - Long: `Updates the yaml file w.r.t the given path and value. -Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. - -Append value to array adds the value to the end of array. - -Update Scripts: -Note that you can give an update script to perform more sophisticated updated. Update script -format is a yaml map where the key is the path and the value is..well the value. e.g.: ---- -a.b.c: true, -a.b.e: - - name: bob -`, - RunE: writeProperty, - } - cmdWrite.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") - cmdWrite.PersistentFlags().StringVarP(&writeScript, "script", "s", "", "yaml script for updating yaml") - cmdWrite.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") - return cmdWrite -} - -func createPrefixCmd() *cobra.Command { - var cmdWrite = &cobra.Command{ - Use: "prefix [yaml_file] [path]", - Aliases: []string{"p"}, - Short: "yq p [--inplace/-i] [--doc/-d index] sample.yaml a.b.c", - Example: ` -yq prefix things.yaml a.b.c -yq prefix --inplace things.yaml a.b.c -yq prefix --inplace -- things.yaml --key-starting-with-dash -yq p -i things.yaml a.b.c -yq p --doc 2 things.yaml a.b.d -yq p -d2 things.yaml a.b.d - `, - Long: `Prefixes w.r.t to the yaml file at the given path. -Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. -`, - RunE: prefixProperty, - } - cmdWrite.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") - cmdWrite.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") - return cmdWrite -} - -func createDeleteCmd() *cobra.Command { - var cmdDelete = &cobra.Command{ - Use: "delete [yaml_file] [path]", - Aliases: []string{"d"}, - Short: "yq d [--inplace/-i] [--doc/-d index] sample.yaml a.b.c", - Example: ` -yq delete things.yaml a.b.c -yq delete --inplace things.yaml a.b.c -yq delete --inplace -- things.yaml --key-starting-with-dash -yq d -i things.yaml a.b.c -yq d things.yaml a.b.c - `, - Long: `Deletes the given path from the YAML file. -Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. -`, - RunE: deleteProperty, - } - cmdDelete.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") - cmdDelete.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") - return cmdDelete -} - -func createNewCmd() *cobra.Command { - var cmdNew = &cobra.Command{ - Use: "new [path] [value]", - Aliases: []string{"n"}, - Short: "yq n [--script/-s script_file] a.b.c newValue", - Example: ` -yq new a.b.c cat -yq n a.b.c cat -yq n -- --key-starting-with-dash cat -yq n --script create_script.yaml - `, - Long: `Creates a new yaml w.r.t the given path and value. -Outputs to STDOUT - -Create Scripts: -Note that you can give a create script to perform more sophisticated yaml. This follows the same format as the update script. -`, - RunE: newProperty, - } - cmdNew.PersistentFlags().StringVarP(&writeScript, "script", "s", "", "yaml script for updating yaml") - return cmdNew -} - -func createMergeCmd() *cobra.Command { - var cmdMerge = &cobra.Command{ - Use: "merge [initial_yaml_file] [additional_yaml_file]...", - Aliases: []string{"m"}, - Short: "yq m [--inplace/-i] [--doc/-d index] [--overwrite/-x] [--append/-a] sample.yaml sample2.yaml", - Example: ` -yq merge things.yaml other.yaml -yq merge --inplace things.yaml other.yaml -yq m -i things.yaml other.yaml -yq m --overwrite things.yaml other.yaml -yq m -i -x things.yaml other.yaml -yq m -i -a things.yaml other.yaml - `, - Long: `Updates the yaml file by adding/updating the path(s) and value(s) from additional yaml file(s). -Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. - -If overwrite flag is set then existing values will be overwritten using the values from each additional yaml file. -If append flag is set then existing arrays will be merged with the arrays from each additional yaml file. - -Note that if you set both flags only overwrite will take effect. -`, - RunE: mergeProperties, - } - cmdMerge.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") - cmdMerge.PersistentFlags().BoolVarP(&overwriteFlag, "overwrite", "x", false, "update the yaml file by overwriting existing values") - cmdMerge.PersistentFlags().BoolVarP(&appendFlag, "append", "a", false, "update the yaml file by appending array values") - cmdMerge.PersistentFlags().BoolVarP(&allowEmptyFlag, "allow-empty", "e", false, "allow empty yaml files") - cmdMerge.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") - return cmdMerge -} - -func readProperty(cmd *cobra.Command, args []string) error { - var path = "" - - if len(args) < 1 { - return errors.New("Must provide filename") - } else if len(args) > 1 { - path = args[1] - } - - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - var mappedDocs []interface{} - var dataBucket interface{} - var currentIndex = 0 - var errorReadingStream = readStream(args[0], func(decoder *yaml.Decoder) error { - for { - errorReading := decoder.Decode(&dataBucket) - if errorReading == io.EOF { - log.Debugf("done %v / %v", currentIndex, docIndexInt) - if !updateAll && currentIndex <= docIndexInt { - return fmt.Errorf("asked to process document index %v but there are only %v document(s)", docIndex, currentIndex) - } - return nil - } - log.Debugf("processing %v - requested index %v", currentIndex, docIndexInt) - if updateAll || currentIndex == docIndexInt { - log.Debugf("reading %v in index %v", path, currentIndex) - mappedDoc, errorParsing := readPath(dataBucket, path) - log.Debugf("%v", mappedDoc) - if errorParsing != nil { - return errors.Wrapf(errorParsing, "Error reading path in document index %v", currentIndex) - } - mappedDocs = append(mappedDocs, mappedDoc) - } - currentIndex = currentIndex + 1 - } - }) - - if errorReadingStream != nil { - return errorReadingStream - } - - if !updateAll { - dataBucket = mappedDocs[0] - } else { - dataBucket = mappedDocs - } - - dataStr, err := toString(dataBucket) - if err != nil { - return err - } - cmd.Println(dataStr) - return nil -} - -func readPath(dataBucket interface{}, path string) (interface{}, error) { - if path == "" { - log.Debug("no path") - return dataBucket, nil - } - var paths = parsePath(path) - return recurse(dataBucket, paths[0], paths[1:]) -} - -func newProperty(cmd *cobra.Command, args []string) error { - updatedData, err := newYaml(args) - if err != nil { - return err - } - dataStr, err := toString(updatedData) - if err != nil { - return err - } - cmd.Println(dataStr) - return nil -} - -func newYaml(args []string) (interface{}, error) { - var writeCommands, writeCommandsError = readWriteCommands(args, 2, "Must provide ") - if writeCommandsError != nil { - return nil, writeCommandsError - } - - var dataBucket interface{} - var isArray = strings.HasPrefix(writeCommands[0].Key.(string), "[") - if isArray { - dataBucket = make([]interface{}, 0) - } else { - dataBucket = make(yaml.MapSlice, 0) - } - - for _, entry := range writeCommands { - path := entry.Key.(string) - value := entry.Value - log.Debugf("setting %v to %v", path, value) - var paths = parsePath(path) - dataBucket = updatedChildValue(dataBucket, paths, value) - } - - return dataBucket, nil -} - -func parseDocumentIndex() (bool, int, error) { - if docIndex == "*" { - return true, -1, nil - } - docIndexInt64, err := strconv.ParseInt(docIndex, 10, 32) - if err != nil { - return false, -1, errors.Wrapf(err, "Document index %v is not a integer or *", docIndex) - } - return false, int(docIndexInt64), nil -} - -type updateDataFn func(dataBucket interface{}, currentIndex int) (interface{}, error) - -func mapYamlDecoder(updateData updateDataFn, encoder *yaml.Encoder) yamlDecoderFn { - return func(decoder *yaml.Decoder) error { - var dataBucket interface{} - var errorReading error - var errorWriting error - var errorUpdating error - var currentIndex = 0 - - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - - for { - log.Debugf("Read doc %v", currentIndex) - errorReading = decoder.Decode(&dataBucket) - - if errorReading == io.EOF { - if !updateAll && currentIndex <= docIndexInt { - return fmt.Errorf("asked to process document index %v but there are only %v document(s)", docIndex, currentIndex) - } - return nil - } else if errorReading != nil { - return errors.Wrapf(errorReading, "Error reading document at index %v, %v", currentIndex, errorReading) - } - dataBucket, errorUpdating = updateData(dataBucket, currentIndex) - if errorUpdating != nil { - return errors.Wrapf(errorUpdating, "Error updating document at index %v", currentIndex) - } - - errorWriting = encoder.Encode(dataBucket) - - if errorWriting != nil { - return errors.Wrapf(errorWriting, "Error writing document at index %v, %v", currentIndex, errorWriting) - } - currentIndex = currentIndex + 1 - } - } -} - -func writeProperty(cmd *cobra.Command, args []string) error { - var writeCommands, writeCommandsError = readWriteCommands(args, 3, "Must provide ") - if writeCommandsError != nil { - return writeCommandsError - } - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - - var updateData = func(dataBucket interface{}, currentIndex int) (interface{}, error) { - if updateAll || currentIndex == docIndexInt { - log.Debugf("Updating doc %v", currentIndex) - for _, entry := range writeCommands { - path := entry.Key.(string) - value := entry.Value - log.Debugf("setting %v to %v", path, value) - var paths = parsePath(path) - dataBucket = updatedChildValue(dataBucket, paths, value) - } - } - return dataBucket, nil - } - return readAndUpdate(cmd.OutOrStdout(), args[0], updateData) -} - -func prefixProperty(cmd *cobra.Command, args []string) error { - if len(args) != 2 { - return errors.New("Must provide ") - } - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - - var paths = parsePath(args[1]) - - // Inverse order - for i := len(paths)/2 - 1; i >= 0; i-- { - opp := len(paths) - 1 - i - paths[i], paths[opp] = paths[opp], paths[i] - } - - var updateData = func(dataBucket interface{}, currentIndex int) (interface{}, error) { - - if updateAll || currentIndex == docIndexInt { - log.Debugf("Prefixing %v to doc %v", paths, currentIndex) - var mapDataBucket = dataBucket - for _, key := range paths { - singlePath := []string{key} - mapDataBucket = updatedChildValue(nil, singlePath, mapDataBucket) - } - return mapDataBucket, nil - } - return dataBucket, nil - } - return readAndUpdate(cmd.OutOrStdout(), args[0], updateData) -} - -func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn) error { - var destination io.Writer - var destinationName string - if writeInplace { - info, err := os.Stat(inputFile) - if err != nil { - return err - } - tempFile, err := ioutil.TempFile("", "temp") - if err != nil { - return err - } - destinationName = tempFile.Name() - err = os.Chmod(destinationName, info.Mode()) - if err != nil { - return err - } - destination = tempFile - defer func() { - safelyCloseFile(tempFile) - safelyRenameFile(tempFile.Name(), inputFile) - }() - } else { - var writer = bufio.NewWriter(stdOut) - destination = writer - destinationName = "Stdout" - defer safelyFlush(writer) - } - var encoder = yaml.NewEncoder(destination) - log.Debugf("Writing to %v from %v", destinationName, inputFile) - return readStream(inputFile, mapYamlDecoder(updateData, encoder)) -} - -func deleteProperty(cmd *cobra.Command, args []string) error { - if len(args) < 2 { - return errors.New("Must provide ") - } - var deletePath = args[1] - var paths = parsePath(deletePath) - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - - var updateData = func(dataBucket interface{}, currentIndex int) (interface{}, error) { - if updateAll || currentIndex == docIndexInt { - log.Debugf("Deleting path in doc %v", currentIndex) - return deleteChildValue(dataBucket, paths) - } - return dataBucket, nil - } - - return readAndUpdate(cmd.OutOrStdout(), args[0], updateData) -} - -func mergeProperties(cmd *cobra.Command, args []string) error { - if len(args) < 2 { - return errors.New("Must provide at least 2 yaml files") - } - var input = args[0] - var filesToMerge = args[1:] - var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() - if errorParsingDocIndex != nil { - return errorParsingDocIndex - } - - var updateData = func(dataBucket interface{}, currentIndex int) (interface{}, error) { - if updateAll || currentIndex == docIndexInt { - log.Debugf("Merging doc %v", currentIndex) - var mergedData map[interface{}]interface{} - // merge only works for maps, so put everything in a temporary - // map - var mapDataBucket = make(map[interface{}]interface{}) - mapDataBucket["root"] = dataBucket - if err := merge(&mergedData, mapDataBucket, overwriteFlag, appendFlag); err != nil { - return nil, err - } - for _, f := range filesToMerge { - var fileToMerge interface{} - if err := readData(f, 0, &fileToMerge); err != nil { - if allowEmptyFlag && err == io.EOF { - continue - } - return nil, err - } - mapDataBucket["root"] = fileToMerge - if err := merge(&mergedData, mapDataBucket, overwriteFlag, appendFlag); err != nil { - return nil, err - } - } - return mergedData["root"], nil - } - return dataBucket, nil - } - yaml.DefaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) - defer func() { yaml.DefaultMapType = reflect.TypeOf(yaml.MapSlice{}) }() - return readAndUpdate(cmd.OutOrStdout(), input, updateData) -} - -func readWriteCommands(args []string, expectedArgs int, badArgsMessage string) (yaml.MapSlice, error) { - var writeCommands yaml.MapSlice - if writeScript != "" { - if err := readData(writeScript, 0, &writeCommands); err != nil { - return nil, err - } - } else if len(args) < expectedArgs { - return nil, errors.New(badArgsMessage) - } else { - writeCommands = make(yaml.MapSlice, 1) - writeCommands[0] = yaml.MapItem{Key: args[expectedArgs-2], Value: parseValue(args[expectedArgs-1])} - } - return writeCommands, nil -} - -func parseValue(argument string) interface{} { - var value, err interface{} - var inQuotes = len(argument) > 0 && argument[0] == '"' - if !inQuotes { - value, err = strconv.ParseFloat(argument, 64) - if err == nil { - return value - } - value, err = strconv.ParseBool(argument) - if err == nil { - return value - } - if argument == "[]" { - return make([]interface{}, 0) - } - return argument - } - return argument[1 : len(argument)-1] -} - -func toString(context interface{}) (string, error) { - if outputToJSON { - return jsonToString(context) - } - return yamlToString(context) -} - -func yamlToString(context interface{}) (string, error) { - switch context := context.(type) { - case string: - return context, nil - default: - return marshalContext(context) - } -} - -func marshalContext(context interface{}) (string, error) { - out, err := yaml.Marshal(context) - - if err != nil { - return "", errors.Wrap(err, "error printing yaml") - } - - outStr := string(out) - // trim the trailing new line as it's easier for a script to add - // it in if required than to remove it - if trimOutput { - return strings.Trim(outStr, "\n "), nil - } - return outStr, nil -} - -func safelyRenameFile(from string, to string) { - if renameError := os.Rename(from, to); renameError != nil { - log.Debugf("Error renaming from %v to %v, attemting to copy contents", from, to) - log.Debug(renameError.Error()) - // can't do this rename when running in docker to a file targeted in a mounted volume, - // so gracefully degrade to copying the entire contents. - if copyError := copyFileContents(from, to); copyError != nil { - log.Errorf("Failed copying from %v to %v", from, to) - log.Error(copyError.Error()) - } else { - removeErr := os.Remove(from) - if removeErr != nil { - log.Errorf("failed removing original file: %s", from) - } - } - } -} - -// thanks https://stackoverflow.com/questions/21060945/simple-way-to-copy-a-file-in-golang -func copyFileContents(src, dst string) (err error) { - in, err := os.Open(src) // nolint gosec - if err != nil { - return err - } - defer safelyCloseFile(in) - out, err := os.Create(dst) - if err != nil { - return err - } - defer safelyCloseFile(out) - if _, err = io.Copy(out, in); err != nil { - return err - } - return out.Sync() -} - -func safelyFlush(writer *bufio.Writer) { - if err := writer.Flush(); err != nil { - log.Error("Error flushing writer!") - log.Error(err.Error()) - } - -} -func safelyCloseFile(file *os.File) { - err := file.Close() - if err != nil { - log.Error("Error closing file!") - log.Error(err.Error()) - } -} - -type yamlDecoderFn func(*yaml.Decoder) error - -func readStream(filename string, yamlDecoder yamlDecoderFn) error { - if filename == "" { - return errors.New("Must provide filename") - } - - var stream io.Reader - if filename == "-" { - stream = bufio.NewReader(os.Stdin) - } else { - file, err := os.Open(filename) // nolint gosec - if err != nil { - return err - } - defer safelyCloseFile(file) - stream = file - } - return yamlDecoder(yaml.NewDecoder(stream)) -} - -func readData(filename string, indexToRead int, parsedData interface{}) error { - return readStream(filename, func(decoder *yaml.Decoder) error { - for currentIndex := 0; currentIndex < indexToRead; currentIndex++ { - errorSkipping := decoder.Decode(parsedData) - if errorSkipping != nil { - return errors.Wrapf(errorSkipping, "Error processing document at index %v, %v", currentIndex, errorSkipping) - } - } - return decoder.Decode(parsedData) - }) -} diff --git a/vendor/github.com/mikefarah/yq/v2/.dockerignore b/vendor/github.com/mikefarah/yq/v3/.dockerignore similarity index 100% rename from vendor/github.com/mikefarah/yq/v2/.dockerignore rename to vendor/github.com/mikefarah/yq/v3/.dockerignore diff --git a/vendor/github.com/mikefarah/yq/v2/.gitignore b/vendor/github.com/mikefarah/yq/v3/.gitignore similarity index 96% rename from vendor/github.com/mikefarah/yq/v2/.gitignore rename to vendor/github.com/mikefarah/yq/v3/.gitignore index 691180140..c90640388 100644 --- a/vendor/github.com/mikefarah/yq/v2/.gitignore +++ b/vendor/github.com/mikefarah/yq/v3/.gitignore @@ -23,6 +23,7 @@ _cgo_export.* _testmain.go coverage.out +coverage.html *.exe *.test *.prof diff --git a/vendor/github.com/mikefarah/yq/v3/CODE_OF_CONDUCT.md b/vendor/github.com/mikefarah/yq/v3/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..d2a542d73 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at mikefarah@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/vendor/github.com/mikefarah/yq/v3/CONTRIBUTING.md b/vendor/github.com/mikefarah/yq/v3/CONTRIBUTING.md new file mode 100644 index 000000000..d38f42fde --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/CONTRIBUTING.md @@ -0,0 +1,8 @@ +1. Install (golang)[https://golang.org/] +1. Run `scripts/devtools.sh` to install the required devtools +2. Run `make [local] vendor` to install the vendor dependencies +2. Run `make [local] test` to ensure you can run the existing tests +3. Write unit tests - (see existing examples). Changes will not be accepted without corresponding unit tests. +4. Make the code changes. +5. `make [local] test` to lint code and run tests +6. Profit! ok no profit, but raise a PR and get kudos :) diff --git a/vendor/github.com/mikefarah/yq/v2/Dockerfile b/vendor/github.com/mikefarah/yq/v3/Dockerfile similarity index 85% rename from vendor/github.com/mikefarah/yq/v2/Dockerfile rename to vendor/github.com/mikefarah/yq/v3/Dockerfile index 32060934e..1858eea9e 100644 --- a/vendor/github.com/mikefarah/yq/v2/Dockerfile +++ b/vendor/github.com/mikefarah/yq/v3/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.13 as builder +FROM golang:1.15 as builder WORKDIR /go/src/mikefarah/yq @@ -12,7 +12,7 @@ RUN CGO_ENABLED=0 make local build # Choose alpine as a base image to make this useful for CI, as many # CI tools expect an interactive shell inside the container -FROM alpine:3.8 as production +FROM alpine:3.12 as production COPY --from=builder /go/src/mikefarah/yq/yq /usr/bin/yq RUN chmod +x /usr/bin/yq diff --git a/vendor/github.com/mikefarah/yq/v2/Dockerfile.dev b/vendor/github.com/mikefarah/yq/v3/Dockerfile.dev similarity index 76% rename from vendor/github.com/mikefarah/yq/v2/Dockerfile.dev rename to vendor/github.com/mikefarah/yq/v3/Dockerfile.dev index fb7ddb68e..00e6a5fc2 100644 --- a/vendor/github.com/mikefarah/yq/v2/Dockerfile.dev +++ b/vendor/github.com/mikefarah/yq/v3/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM golang:1.13 +FROM golang:1.15 COPY scripts/devtools.sh /opt/devtools.sh @@ -9,15 +9,15 @@ RUN set -e -x \ RUN set -ex \ && buildDeps=' \ build-essential \ - python-dev \ + python3-dev \ ' \ && apt-get update && apt-get install -y --no-install-recommends \ $buildDeps \ - python2.7 \ - python-setuptools \ - python-wheel \ - python-pip \ - && pip install --upgrade \ + python3 \ + python3-setuptools \ + python3-wheel \ + python3-pip \ + && pip3 install --upgrade \ pip \ 'Markdown>=2.6.9' \ 'mkdocs>=0.16.3' \ diff --git a/vendor/github.com/mikefarah/yq/v2/LICENSE b/vendor/github.com/mikefarah/yq/v3/LICENSE similarity index 100% rename from vendor/github.com/mikefarah/yq/v2/LICENSE rename to vendor/github.com/mikefarah/yq/v3/LICENSE diff --git a/vendor/github.com/mikefarah/yq/v2/Makefile b/vendor/github.com/mikefarah/yq/v3/Makefile similarity index 100% rename from vendor/github.com/mikefarah/yq/v2/Makefile rename to vendor/github.com/mikefarah/yq/v3/Makefile diff --git a/vendor/github.com/mikefarah/yq/v2/Makefile.variables b/vendor/github.com/mikefarah/yq/v3/Makefile.variables similarity index 100% rename from vendor/github.com/mikefarah/yq/v2/Makefile.variables rename to vendor/github.com/mikefarah/yq/v3/Makefile.variables diff --git a/vendor/github.com/mikefarah/yq/v3/README.md b/vendor/github.com/mikefarah/yq/v3/README.md new file mode 100644 index 000000000..87e97d788 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/README.md @@ -0,0 +1,182 @@ +# yq + +![Build](https://github.com/mikefarah/yq/workflows/Build/badge.svg) ![Docker Pulls](https://img.shields.io/docker/pulls/mikefarah/yq.svg) ![Github Releases (by Release)](https://img.shields.io/github/downloads/mikefarah/yq/total.svg) ![Go Report](https://goreportcard.com/badge/github.com/mikefarah/yq) + + +a lightweight and portable command-line YAML processor + +The aim of the project is to be the [jq](https://github.com/stedolan/jq) or sed of yaml files. + +## Install + +### [Download the latest binary](https://github.com/mikefarah/yq/releases/latest) + +### MacOS: +Using [Homebrew](https://brew.sh/) +``` +brew install yq +``` + +### Ubuntu and other Linux distros supporting `snap` packages: +``` +snap install yq +``` + +#### Snap notes +`yq` installs with [_strict confinement_](https://docs.snapcraft.io/snap-confinement/6233) in snap, this means it doesn't have direct access to root files. To read root files you can: + +``` +sudo cat /etc/myfile | yq r - a.path +``` + +And to write to a root file you can either use [sponge](https://linux.die.net/man/1/sponge): +``` +sudo cat /etc/myfile | yq w - a.path value | sudo sponge /etc/myfile +``` +or write to a temporary file: +``` +sudo cat /etc/myfile | yq w - a.path value | sudo tee /etc/myfile.tmp +sudo mv /etc/myfile.tmp /etc/myfile +rm /etc/myfile.tmp +``` + +### wget + +Use wget to download the pre-compiled binaries: + +```bash +wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq &&\ + chmod +x /usr/bin/yq +``` + +For instance, VERSION=3.4.1 and BINARY=yq_linux_amd64 + + +### Run with Docker + +#### Oneshot use: + +```bash +docker run --rm -v "${PWD}":/workdir mikefarah/yq yq [flags] FILE... +``` + +#### Run commands interactively: + +```bash +docker run --rm -it -v "${PWD}":/workdir mikefarah/yq sh +``` + +It can be useful to have a bash function to avoid typing the whole docker command: + +```bash +yq() { + docker run --rm -i -v "${PWD}":/workdir mikefarah/yq yq "$@" +} +``` + +### Go Get: +``` +GO111MODULE=on go get github.com/mikefarah/yq/v3 +``` + +## Community Supported Installation methods +As these are supported by the community :heart: - however, they may be out of date with the officially supported releases. + + +### Windows: +``` +choco install yq +``` +Supported by @chillum (https://chocolatey.org/packages/yq) + +### Mac: +Using [MacPorts](https://www.macports.org/) +``` +sudo port selfupdate +sudo port install yq +``` +Supported by @herbygillot (https://ports.macports.org/maintainer/github/herbygillot) + +### Alpine Linux +- Enable edge/community repo by adding ```$MIRROR/alpine/edge/community``` to ```/etc/apk/repositories``` +- Update database index with ```apk update``` +- Install yq with ```apk add yq``` + +Supported by Tuan Hoang +https://pkgs.alpinelinux.org/package/edge/community/x86/yq + + +### On Ubuntu 16.04 or higher from Debian package: +```sh +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64 +sudo add-apt-repository ppa:rmescandon/yq +sudo apt update +sudo apt install yq -y +``` +Supported by @rmescandon (https://launchpad.net/~rmescandon/+archive/ubuntu/yq) + +## Features +- Written in portable go, so you can download a lovely dependency free binary +- [Colorize the output](https://mikefarah.gitbook.io/yq/usage/output-format#colorize-output) +- [Deep read a yaml file with a given path expression](https://mikefarah.gitbook.io/yq/commands/read#basic) +- [List matching paths of a given path expression](https://mikefarah.gitbook.io/yq/commands/read#path-only) +- [Return the lengths of arrays/object/scalars](https://mikefarah.gitbook.io/yq/commands/read#printing-length-of-the-results) +- Update a yaml file given a [path expression](https://mikefarah.gitbook.io/yq/commands/write-update#basic) or [script file](https://mikefarah.gitbook.io/yq/commands/write-update#basic) +- Update creates any missing entries in the path on the fly +- Deeply [compare](https://mikefarah.gitbook.io/yq/commands/compare) yaml files +- Keeps yaml formatting and comments when updating +- [Validate a yaml file](https://mikefarah.gitbook.io/yq/commands/validate) +- Create a yaml file given a [deep path and value](https://mikefarah.gitbook.io/yq/commands/create#creating-a-simple-yaml-file) or a [script file](https://mikefarah.gitbook.io/yq/commands/create#creating-using-a-create-script) +- [Prefix a path to a yaml file](https://mikefarah.gitbook.io/yq/commands/prefix) +- [Convert to/from json to yaml](https://mikefarah.gitbook.io/yq/usage/convert) +- [Pipe data in by using '-'](https://mikefarah.gitbook.io/yq/commands/read#from-stdin) +- [Merge](https://mikefarah.gitbook.io/yq/commands/merge) multiple yaml files with various options for [overriding](https://mikefarah.gitbook.io/yq/commands/merge#overwrite-values) and [appending](https://mikefarah.gitbook.io/yq/commands/merge#append-values-with-arrays) +- Supports multiple documents in a single yaml file for [reading](https://mikefarah.gitbook.io/yq/commands/read#multiple-documents), [writing](https://mikefarah.gitbook.io/yq/commands/write-update#multiple-documents) and [merging](https://mikefarah.gitbook.io/yq/commands/merge#multiple-documents) +- General shell completion scripts (bash/zsh/fish/powershell) (https://mikefarah.gitbook.io/yq/commands/shell-completion) + +## [Usage](https://mikefarah.gitbook.io/yq/) + +Check out the [documentation](https://mikefarah.gitbook.io/yq/) for more detailed and advanced usage. + +``` +Usage: + yq [flags] + yq [command] + +Available Commands: + compare yq x [--prettyPrint/-P] dataA.yaml dataB.yaml 'b.e(name==fr*).value' + delete yq d [--inplace/-i] [--doc/-d index] sample.yaml 'b.e(name==fred)' + help Help about any command + merge yq m [--inplace/-i] [--doc/-d index] [--overwrite/-x] [--append/-a] sample.yaml sample2.yaml + new yq n [--script/-s script_file] a.b.c newValue + prefix yq p [--inplace/-i] [--doc/-d index] sample.yaml a.b.c + read yq r [--printMode/-p pv] sample.yaml 'b.e(name==fr*).value' + shell-completion Generates shell completion scripts + validate yq v sample.yaml + write yq w [--inplace/-i] [--script/-s script_file] [--doc/-d index] sample.yaml 'b.e(name==fr*).value' newValue + +Flags: + -C, --colors print with colors + -h, --help help for yq + -I, --indent int sets indent level for output (default 2) + -P, --prettyPrint pretty print + -j, --tojson output as json. By default it prints a json document in one line, use the prettyPrint flag to print a formatted doc. + -v, --verbose verbose mode + -V, --version Print version information and quit + +Use "yq [command] --help" for more information about a command. +``` + +## Upgrade from V2 +If you've been using v2 and want/need to upgrade, checkout the [upgrade guide](https://mikefarah.gitbook.io/yq/upgrading-from-v2). + +## V4 is in development! +If you're keen - check out the alpha release [here](https://github.com/mikefarah/yq/releases/), or in docker `mikefarah/yq:4-beta1` and the docs (also in beta) [here](https://mikefarah.gitbook.io/yq/v/v4.x-alpha/). + +V4 is quite different from V3 (sorry for the migration), however it will be much more similar to ```jq```, use a similar expression syntax and therefore support much more complex functionality! + +For now - new features will be held off from V3 in anticipation of the V4 build. Critical fixes / issues will still be released. + +## Known Issues / Missing Features +- `yq` attempts to preserve comment positions and whitespace as much as possible, but it does not handle all scenarios (see https://github.com/go-yaml/yaml/tree/v3 for details) +- You cannot (yet) select multiple paths/keys from the yaml to be printed out (https://github.com/mikefarah/yq/issues/287) (although you can in v4!) diff --git a/vendor/github.com/mikefarah/yq/v3/action.yml b/vendor/github.com/mikefarah/yq/v3/action.yml new file mode 100644 index 000000000..e8de93f72 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/action.yml @@ -0,0 +1,13 @@ +name: 'yq - portable yaml processor' +description: 'create, read, update, delete, merge, validate and do more with yaml' +icon: command +color: gray-dark +inputs: + cmd: + description: 'The Command which should be run' + required: true +runs: + using: 'docker' + image: 'github-action/Dockerfile' + args: + - ${{ inputs.cmd }} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/compare.go b/vendor/github.com/mikefarah/yq/v3/cmd/compare.go new file mode 100644 index 000000000..f6b3188f9 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/compare.go @@ -0,0 +1,89 @@ +package cmd + +import ( + "bufio" + "bytes" + "os" + "strings" + + "github.com/kylelemons/godebug/diff" + "github.com/mikefarah/yq/v3/pkg/yqlib" + errors "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +// turn off for unit tests :( +var forceOsExit = true + +func createCompareCmd() *cobra.Command { + var cmdCompare = &cobra.Command{ + Use: "compare [yaml_file_a] [yaml_file_b]", + Aliases: []string{"x"}, + Short: "yq x [--prettyPrint/-P] dataA.yaml dataB.yaml 'b.e(name==fr*).value'", + Example: ` +yq x - data2.yml # reads from stdin +yq x -pp dataA.yaml dataB.yaml '**' # compare paths +yq x -d1 dataA.yaml dataB.yaml 'a.b.c' +`, + Long: "Deeply compares two yaml files, prints the difference. Use with prettyPrint flag to ignore formatting differences.", + RunE: compareDocuments, + } + cmdCompare.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + cmdCompare.PersistentFlags().StringVarP(&printMode, "printMode", "p", "v", "print mode (v (values, default), p (paths), pv (path and value pairs)") + cmdCompare.PersistentFlags().StringVarP(&defaultValue, "defaultValue", "D", "", "default value printed when there are no results") + cmdCompare.PersistentFlags().BoolVarP(&stripComments, "stripComments", "", false, "strip comments out before comparing") + cmdCompare.PersistentFlags().BoolVarP(&explodeAnchors, "explodeAnchors", "X", false, "explode anchors") + return cmdCompare +} + +func compareDocuments(cmd *cobra.Command, args []string) error { + var path = "" + + if len(args) < 2 { + return errors.New("Must provide at 2 yaml files") + } else if len(args) > 2 { + path = args[2] + } + + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + var matchingNodesA []*yqlib.NodeContext + var matchingNodesB []*yqlib.NodeContext + var errorDoingThings error + + matchingNodesA, errorDoingThings = readYamlFile(args[0], path, updateAll, docIndexInt) + + if errorDoingThings != nil { + return errorDoingThings + } + + matchingNodesB, errorDoingThings = readYamlFile(args[1], path, updateAll, docIndexInt) + if errorDoingThings != nil { + return errorDoingThings + } + + var dataBufferA bytes.Buffer + var dataBufferB bytes.Buffer + errorDoingThings = printResults(matchingNodesA, bufio.NewWriter(&dataBufferA)) + if errorDoingThings != nil { + return errorDoingThings + } + errorDoingThings = printResults(matchingNodesB, bufio.NewWriter(&dataBufferB)) + if errorDoingThings != nil { + return errorDoingThings + } + + diffString := diff.Diff(strings.TrimSuffix(dataBufferA.String(), "\n"), strings.TrimSuffix(dataBufferB.String(), "\n")) + + if len(diffString) > 1 { + cmd.Print(diffString) + cmd.Print("\n") + if forceOsExit { + os.Exit(1) + } + } + return nil +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/constant.go b/vendor/github.com/mikefarah/yq/v3/cmd/constant.go new file mode 100644 index 000000000..a1f631198 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/constant.go @@ -0,0 +1,36 @@ +package cmd + +import ( + "github.com/mikefarah/yq/v3/pkg/yqlib" + logging "gopkg.in/op/go-logging.v1" +) + +var customTag = "" +var printMode = "v" +var printLength = false +var unwrapScalar = true +var customStyle = "" +var anchorName = "" +var makeAlias = false +var stripComments = false +var collectIntoArray = false +var writeInplace = false +var writeScript = "" +var sourceYamlFile = "" +var outputToJSON = false +var exitStatus = false +var prettyPrint = false +var explodeAnchors = false +var colorsEnabled = false +var defaultValue = "" +var indent = 2 +var overwriteFlag = false +var autoCreateFlag = true +var arrayMergeStrategyFlag = "update" +var commentsMergeStrategyFlag = "setWhenBlank" +var verbose = false +var version = false +var docIndex = "0" +var log = logging.MustGetLogger("yq") +var lib = yqlib.NewYqLib() +var valueParser = yqlib.NewValueParser() diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/delete.go b/vendor/github.com/mikefarah/yq/v3/cmd/delete.go new file mode 100644 index 000000000..b11531099 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/delete.go @@ -0,0 +1,41 @@ +package cmd + +import ( + "github.com/mikefarah/yq/v3/pkg/yqlib" + errors "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +func createDeleteCmd() *cobra.Command { + var cmdDelete = &cobra.Command{ + Use: "delete [yaml_file] [path_expression]", + Aliases: []string{"d"}, + Short: "yq d [--inplace/-i] [--doc/-d index] sample.yaml 'b.e(name==fred)'", + Example: ` +yq delete things.yaml 'a.b.c' +yq delete things.yaml 'a.*.c' +yq delete things.yaml 'a.(child.subchild==co*).c' +yq delete things.yaml 'a.**' +yq delete --inplace things.yaml 'a.b.c' +yq delete --inplace -- things.yaml '--key-starting-with-dash' # need to use '--' to stop processing arguments as flags +yq d -i things.yaml 'a.b.c' + `, + Long: `Deletes the nodes matching the given path expression from the YAML file. +Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. +`, + RunE: deleteProperty, + } + cmdDelete.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") + cmdDelete.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + return cmdDelete +} + +func deleteProperty(cmd *cobra.Command, args []string) error { + if len(args) < 2 { + return errors.New("Must provide ") + } + var updateCommands []yqlib.UpdateCommand = make([]yqlib.UpdateCommand, 1) + updateCommands[0] = yqlib.UpdateCommand{Command: "delete", Path: args[1]} + + return updateDoc(args[0], updateCommands, cmd.OutOrStdout()) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/merge.go b/vendor/github.com/mikefarah/yq/v3/cmd/merge.go new file mode 100644 index 000000000..ef4ca927a --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/merge.go @@ -0,0 +1,124 @@ +package cmd + +import ( + "github.com/mikefarah/yq/v3/pkg/yqlib" + errors "github.com/pkg/errors" + "github.com/spf13/cobra" + yaml "gopkg.in/yaml.v3" +) + +func createMergeCmd() *cobra.Command { + var cmdMerge = &cobra.Command{ + Use: "merge [initial_yaml_file] [additional_yaml_file]...", + Aliases: []string{"m"}, + Short: "yq m [--inplace/-i] [--doc/-d index] [--overwrite/-x] [--arrayMerge/-a strategy] sample.yaml sample2.yaml", + Example: ` +yq merge things.yaml other.yaml +yq merge --inplace things.yaml other.yaml +yq m -i things.yaml other.yaml +yq m --overwrite things.yaml other.yaml +yq m -i -x things.yaml other.yaml +yq m -i -a=append things.yaml other.yaml +yq m -i --autocreate=false things.yaml other.yaml + `, + Long: `Updates the yaml file by adding/updating the path(s) and value(s) from additional yaml file(s). +Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. + +If overwrite flag is set then existing values will be overwritten using the values from each additional yaml file. +If append flag is set then existing arrays will be merged with the arrays from each additional yaml file. +`, + RunE: mergeProperties, + } + cmdMerge.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") + cmdMerge.PersistentFlags().BoolVarP(&overwriteFlag, "overwrite", "x", false, "update the yaml file by overwriting existing values") + cmdMerge.PersistentFlags().BoolVarP(&autoCreateFlag, "autocreate", "c", true, "automatically create any missing entries") + cmdMerge.PersistentFlags().StringVarP(&arrayMergeStrategyFlag, "arrays", "a", "update", `array merge strategy (update/append/overwrite) +update: recursively update arrays by their index +append: concatenate arrays together +overwrite: replace arrays +`) + cmdMerge.PersistentFlags().StringVarP(&commentsMergeStrategyFlag, "comments", "", "setWhenBlank", `comments merge strategy (setWhenBlank/ignore/append/overwrite) +setWhenBlank: set comment if the original document has no comment at that node +ignore: leave comments as-is in the original +append: append comments together +overwrite: overwrite comments completely +`) + cmdMerge.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + return cmdMerge +} + +/* +* We don't deeply traverse arrays when appending a merge, instead we want to +* append the entire array element. + */ +func createReadFunctionForMerge(arrayMergeStrategy yqlib.ArrayMergeStrategy) func(*yaml.Node) ([]*yqlib.NodeContext, error) { + return func(dataBucket *yaml.Node) ([]*yqlib.NodeContext, error) { + return lib.GetForMerge(dataBucket, "**", arrayMergeStrategy) + } +} + +func mergeProperties(cmd *cobra.Command, args []string) error { + var updateCommands []yqlib.UpdateCommand = make([]yqlib.UpdateCommand, 0) + + if len(args) < 1 { + return errors.New("Must provide at least 1 yaml file") + } + var arrayMergeStrategy yqlib.ArrayMergeStrategy + + switch arrayMergeStrategyFlag { + case "update": + arrayMergeStrategy = yqlib.UpdateArrayMergeStrategy + case "append": + arrayMergeStrategy = yqlib.AppendArrayMergeStrategy + case "overwrite": + arrayMergeStrategy = yqlib.OverwriteArrayMergeStrategy + default: + return errors.New("Array merge strategy must be one of: update/append/overwrite") + } + + var commentsMergeStrategy yqlib.CommentsMergeStrategy + + switch commentsMergeStrategyFlag { + case "setWhenBlank": + commentsMergeStrategy = yqlib.SetWhenBlankCommentsMergeStrategy + case "ignore": + commentsMergeStrategy = yqlib.IgnoreCommentsMergeStrategy + case "append": + commentsMergeStrategy = yqlib.AppendCommentsMergeStrategy + case "overwrite": + commentsMergeStrategy = yqlib.OverwriteCommentsMergeStrategy + default: + return errors.New("Comments merge strategy must be one of: setWhenBlank/ignore/append/overwrite") + } + + if len(args) > 1 { + // first generate update commands from the file + var filesToMerge = args[1:] + + for _, fileToMerge := range filesToMerge { + matchingNodes, errorProcessingFile := doReadYamlFile(fileToMerge, createReadFunctionForMerge(arrayMergeStrategy), false, 0) + if errorProcessingFile != nil { + return errorProcessingFile + } + log.Debugf("finished reading for merge!") + for _, matchingNode := range matchingNodes { + log.Debugf("matched node %v", lib.PathStackToString(matchingNode.PathStack)) + yqlib.DebugNode(matchingNode.Node) + } + for _, matchingNode := range matchingNodes { + mergePath := lib.MergePathStackToString(matchingNode.PathStack, arrayMergeStrategy) + updateCommands = append(updateCommands, yqlib.UpdateCommand{ + Command: "merge", + Path: mergePath, + Value: matchingNode.Node, + Overwrite: overwriteFlag, + CommentsMergeStrategy: commentsMergeStrategy, + // dont update the content for nodes midway, only leaf nodes + DontUpdateNodeContent: matchingNode.IsMiddleNode && (arrayMergeStrategy != yqlib.OverwriteArrayMergeStrategy || matchingNode.Node.Kind != yaml.SequenceNode), + }) + } + } + } + + return updateDoc(args[0], updateCommands, cmd.OutOrStdout()) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/new.go b/vendor/github.com/mikefarah/yq/v3/cmd/new.go new file mode 100644 index 000000000..fede25238 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/new.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "github.com/mikefarah/yq/v3/pkg/yqlib" + "github.com/spf13/cobra" +) + +func createNewCmd() *cobra.Command { + var cmdNew = &cobra.Command{ + Use: "new [path] [value]", + Aliases: []string{"n"}, + Short: "yq n [--script/-s script_file] a.b.c newValue", + Example: ` +yq new 'a.b.c' cat +yq n 'a.b.c' --tag '!!str' true # force 'true' to be interpreted as a string instead of bool +yq n 'a.b[+]' cat +yq n -- '--key-starting-with-dash' cat # need to use '--' to stop processing arguments as flags +yq n --script create_script.yaml + `, + Long: `Creates a new yaml w.r.t the given path and value. +Outputs to STDOUT + +Create Scripts: +Note that you can give a create script to perform more sophisticated yaml. This follows the same format as the update script. +`, + RunE: newProperty, + } + cmdNew.PersistentFlags().StringVarP(&writeScript, "script", "s", "", "yaml script for creating yaml") + cmdNew.PersistentFlags().StringVarP(&customTag, "tag", "t", "", "set yaml tag (e.g. !!int)") + cmdNew.PersistentFlags().StringVarP(&customStyle, "style", "", "", "formatting style of the value: single, double, folded, flow, literal, tagged") + cmdNew.PersistentFlags().StringVarP(&anchorName, "anchorName", "", "", "anchor name") + cmdNew.PersistentFlags().BoolVarP(&makeAlias, "makeAlias", "", false, "create an alias using the value as the anchor name") + return cmdNew +} + +func newProperty(cmd *cobra.Command, args []string) error { + var badArgsMessage = "Must provide " + var updateCommands, updateCommandsError = readUpdateCommands(args, 2, badArgsMessage, false) + if updateCommandsError != nil { + return updateCommandsError + } + newNode := lib.New(updateCommands[0].Path) + + for _, updateCommand := range updateCommands { + + errorUpdating := lib.Update(&newNode, updateCommand, true) + + if errorUpdating != nil { + return errorUpdating + } + } + + var encoder = yqlib.NewYamlEncoder(cmd.OutOrStdout(), indent, colorsEnabled) + return encoder.Encode(&newNode) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/prefix.go b/vendor/github.com/mikefarah/yq/v3/cmd/prefix.go new file mode 100644 index 000000000..ae5c28ae6 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/prefix.go @@ -0,0 +1,50 @@ +package cmd + +import ( + "github.com/mikefarah/yq/v3/pkg/yqlib" + errors "github.com/pkg/errors" + "github.com/spf13/cobra" + yaml "gopkg.in/yaml.v3" +) + +func createPrefixCmd() *cobra.Command { + var cmdPrefix = &cobra.Command{ + Use: "prefix [yaml_file] [path]", + Aliases: []string{"p"}, + Short: "yq p [--inplace/-i] [--doc/-d index] sample.yaml a.b.c", + Example: ` +yq prefix things.yaml 'a.b.c' +yq prefix --inplace things.yaml 'a.b.c' +yq prefix --inplace -- things.yaml '--key-starting-with-dash' # need to use '--' to stop processing arguments as flags +yq p -i things.yaml 'a.b.c' +yq p --doc 2 things.yaml 'a.b.d' +yq p -d2 things.yaml 'a.b.d' + `, + Long: `Prefixes w.r.t to the yaml file at the given path. +Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. +`, + RunE: prefixProperty, + } + cmdPrefix.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") + cmdPrefix.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + return cmdPrefix +} + +func prefixProperty(cmd *cobra.Command, args []string) error { + + if len(args) < 2 { + return errors.New("Must provide ") + } + updateCommand := yqlib.UpdateCommand{Command: "update", Path: args[1]} + log.Debugf("args %v", args) + + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + var updateData = func(dataBucket *yaml.Node, currentIndex int) error { + return prefixDocument(updateAll, docIndexInt, currentIndex, dataBucket, updateCommand) + } + return readAndUpdate(cmd.OutOrStdout(), args[0], updateData) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/read.go b/vendor/github.com/mikefarah/yq/v3/cmd/read.go new file mode 100644 index 000000000..8e68f77c5 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/read.go @@ -0,0 +1,66 @@ +package cmd + +import ( + errors "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +func createReadCmd() *cobra.Command { + var cmdRead = &cobra.Command{ + Use: "read [yaml_file] [path_expression]", + Aliases: []string{"r"}, + Short: "yq r [--printMode/-p pv] sample.yaml 'b.e(name==fr*).value'", + Example: ` +yq read things.yaml 'a.b.c' +yq r - 'a.b.c' # reads from stdin +yq r things.yaml 'a.*.c' +yq r things.yaml 'a.**.c' # deep splat +yq r things.yaml 'a.(child.subchild==co*).c' +yq r -d1 things.yaml 'a.array[0].blah' +yq r things.yaml 'a.array[*].blah' +yq r -- things.yaml '--key-starting-with-dashes.blah' + `, + Long: "Outputs the value of the given path in the yaml file to STDOUT", + RunE: readProperty, + } + cmdRead.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + cmdRead.PersistentFlags().StringVarP(&printMode, "printMode", "p", "v", "print mode (v (values, default), p (paths), pv (path and value pairs)") + cmdRead.PersistentFlags().StringVarP(&defaultValue, "defaultValue", "D", "", "default value printed when there are no results") + cmdRead.PersistentFlags().BoolVarP(&printLength, "length", "l", false, "print length of results") + cmdRead.PersistentFlags().BoolVarP(&collectIntoArray, "collect", "c", false, "collect results into array") + cmdRead.PersistentFlags().BoolVarP(&unwrapScalar, "unwrapScalar", "", true, "unwrap scalar, print the value with no quotes, colors or comments") + cmdRead.PersistentFlags().BoolVarP(&stripComments, "stripComments", "", false, "print yaml without any comments") + cmdRead.PersistentFlags().BoolVarP(&explodeAnchors, "explodeAnchors", "X", false, "explode anchors") + cmdRead.PersistentFlags().BoolVarP(&exitStatus, "exitStatus", "e", false, "set exit status if no matches are found") + return cmdRead +} + +func readProperty(cmd *cobra.Command, args []string) error { + var path = "" + + if len(args) < 1 { + return errors.New("Must provide filename") + } else if len(args) > 1 { + path = args[1] + } + + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + matchingNodes, errorReadingStream := readYamlFile(args[0], path, updateAll, docIndexInt) + + if exitStatus && len(matchingNodes) == 0 { + cmd.SilenceUsage = true + return errors.New("No matches found") + } + + if errorReadingStream != nil { + cmd.SilenceUsage = true + return errorReadingStream + } + out := cmd.OutOrStdout() + + return printResults(matchingNodes, out) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/root.go b/vendor/github.com/mikefarah/yq/v3/cmd/root.go new file mode 100644 index 000000000..a7f9b6bd6 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/root.go @@ -0,0 +1,61 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" + logging "gopkg.in/op/go-logging.v1" +) + +func New() *cobra.Command { + var rootCmd = &cobra.Command{ + Use: "yq", + Short: "yq is a lightweight and portable command-line YAML processor.", + Long: `yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files.`, + RunE: func(cmd *cobra.Command, args []string) error { + if version { + cmd.Print(GetVersionDisplay()) + return nil + } + cmd.Println(cmd.UsageString()) + + return nil + }, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + cmd.SetOut(cmd.OutOrStdout()) + var format = logging.MustStringFormatter( + `%{color}%{time:15:04:05} %{shortfunc} [%{level:.4s}]%{color:reset} %{message}`, + ) + var backend = logging.AddModuleLevel( + logging.NewBackendFormatter(logging.NewLogBackend(os.Stderr, "", 0), format)) + + if verbose { + backend.SetLevel(logging.DEBUG, "") + } else { + backend.SetLevel(logging.ERROR, "") + } + + logging.SetBackend(backend) + }, + } + + rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose mode") + rootCmd.PersistentFlags().BoolVarP(&outputToJSON, "tojson", "j", false, "output as json. By default it prints a json document in one line, use the prettyPrint flag to print a formatted doc.") + rootCmd.PersistentFlags().BoolVarP(&prettyPrint, "prettyPrint", "P", false, "pretty print") + rootCmd.PersistentFlags().IntVarP(&indent, "indent", "I", 2, "sets indent level for output") + rootCmd.Flags().BoolVarP(&version, "version", "V", false, "Print version information and quit") + rootCmd.PersistentFlags().BoolVarP(&colorsEnabled, "colors", "C", false, "print with colors") + + rootCmd.AddCommand( + createReadCmd(), + createCompareCmd(), + createValidateCmd(), + createWriteCmd(), + createPrefixCmd(), + createDeleteCmd(), + createNewCmd(), + createMergeCmd(), + createBashCompletionCmd(rootCmd), + ) + return rootCmd +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/shell_completion.go b/vendor/github.com/mikefarah/yq/v3/cmd/shell_completion.go new file mode 100644 index 000000000..d1d287b35 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/shell_completion.go @@ -0,0 +1,57 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" +) + +var shellVariant = "bash" + +func createBashCompletionCmd(rootCmd *cobra.Command) *cobra.Command { + var completionCmd = &cobra.Command{ + Use: "shell-completion", + Short: "Generates shell completion scripts", + Long: `To load completion for: +bash: + Run + . <(yq shell-completion) + + To configure your bash shell to load completions for each session add to + your bashrc + + # ~/.bashrc or ~/.profile + . <(yq shell-completion) + +zsh: + The generated completion script should be put somewhere in your $fpath named _yq + +powershell: + Users need PowerShell version 5.0 or above, which comes with Windows 10 and + can be downloaded separately for Windows 7 or 8.1. They can then write the + completions to a file and source this file from their PowerShell profile, + which is referenced by the $Profile environment variable. + +fish: + Save the output to a fish file and add it to your completions directory. + + `, + RunE: func(cmd *cobra.Command, args []string) error { + switch shellVariant { + case "bash", "": + return rootCmd.GenBashCompletion(os.Stdout) + case "zsh": + return rootCmd.GenZshCompletion(os.Stdout) + case "fish": + return rootCmd.GenFishCompletion(os.Stdout, true) + case "powershell": + return rootCmd.GenPowerShellCompletion(os.Stdout) + default: + return fmt.Errorf("Unknown variant %v", shellVariant) + } + }, + } + completionCmd.PersistentFlags().StringVarP(&shellVariant, "variation", "V", "", "shell variation: bash (default), zsh, fish, powershell") + return completionCmd +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/utils.go b/vendor/github.com/mikefarah/yq/v3/cmd/utils.go new file mode 100644 index 000000000..9b1ca726a --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/utils.go @@ -0,0 +1,619 @@ +package cmd + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "os" + "strconv" + + "github.com/mikefarah/yq/v3/pkg/yqlib" + errors "github.com/pkg/errors" + yaml "gopkg.in/yaml.v3" +) + +type readDataFn func(dataBucket *yaml.Node) ([]*yqlib.NodeContext, error) + +func createReadFunction(path string) func(*yaml.Node) ([]*yqlib.NodeContext, error) { + return func(dataBucket *yaml.Node) ([]*yqlib.NodeContext, error) { + return lib.Get(dataBucket, path) + } +} + +func readYamlFile(filename string, path string, updateAll bool, docIndexInt int) ([]*yqlib.NodeContext, error) { + return doReadYamlFile(filename, createReadFunction(path), updateAll, docIndexInt) +} + +func doReadYamlFile(filename string, readFn readDataFn, updateAll bool, docIndexInt int) ([]*yqlib.NodeContext, error) { + var matchingNodes []*yqlib.NodeContext + + var currentIndex = 0 + var errorReadingStream = readStream(filename, func(decoder *yaml.Decoder) error { + for { + var dataBucket yaml.Node + errorReading := decoder.Decode(&dataBucket) + + if errorReading == io.EOF { + return handleEOF(updateAll, docIndexInt, currentIndex) + } else if errorReading != nil { + return errorReading + } + + var errorParsing error + matchingNodes, errorParsing = appendDocument(matchingNodes, dataBucket, readFn, updateAll, docIndexInt, currentIndex) + if errorParsing != nil { + return errorParsing + } + if !updateAll && currentIndex == docIndexInt { + log.Debug("all done") + return nil + } + currentIndex = currentIndex + 1 + } + }) + return matchingNodes, errorReadingStream +} + +func handleEOF(updateAll bool, docIndexInt int, currentIndex int) error { + log.Debugf("done %v / %v", currentIndex, docIndexInt) + if !updateAll && currentIndex <= docIndexInt && docIndexInt != 0 { + return fmt.Errorf("Could not process document index %v as there are only %v document(s)", docIndex, currentIndex) + } + return nil +} + +func appendDocument(originalMatchingNodes []*yqlib.NodeContext, dataBucket yaml.Node, readFn readDataFn, updateAll bool, docIndexInt int, currentIndex int) ([]*yqlib.NodeContext, error) { + log.Debugf("processing document %v - requested index %v", currentIndex, docIndexInt) + yqlib.DebugNode(&dataBucket) + if !updateAll && currentIndex != docIndexInt { + return originalMatchingNodes, nil + } + log.Debugf("reading in document %v", currentIndex) + matchingNodes, errorParsing := readFn(&dataBucket) + if errorParsing != nil { + return nil, errors.Wrapf(errorParsing, "Error reading path in document index %v", currentIndex) + } + return append(originalMatchingNodes, matchingNodes...), nil +} + +func lengthOf(node *yaml.Node) int { + kindToCheck := node.Kind + if node.Kind == yaml.DocumentNode && len(node.Content) == 1 { + log.Debugf("length of document node, calculating length of child") + kindToCheck = node.Content[0].Kind + } + switch kindToCheck { + case yaml.ScalarNode: + return len(node.Value) + case yaml.MappingNode: + return len(node.Content) / 2 + default: + return len(node.Content) + } +} + +// transforms node before printing, if required +func transformNode(node *yaml.Node) *yaml.Node { + if printLength { + return &yaml.Node{Kind: yaml.ScalarNode, Value: fmt.Sprintf("%v", lengthOf(node))} + } + return node +} + +func printNode(node *yaml.Node, writer io.Writer) error { + var encoder yqlib.Encoder + if node.Kind == yaml.ScalarNode && unwrapScalar && !outputToJSON { + return writeString(writer, node.Value+"\n") + } + if outputToJSON { + encoder = yqlib.NewJsonEncoder(writer, prettyPrint, indent) + } else { + encoder = yqlib.NewYamlEncoder(writer, indent, colorsEnabled) + } + return encoder.Encode(node) +} + +func removeComments(matchingNodes []*yqlib.NodeContext) { + for _, nodeContext := range matchingNodes { + removeCommentOfNode(nodeContext.Node) + } +} + +func removeCommentOfNode(node *yaml.Node) { + node.HeadComment = "" + node.LineComment = "" + node.FootComment = "" + + for _, child := range node.Content { + removeCommentOfNode(child) + } +} + +func setStyle(matchingNodes []*yqlib.NodeContext, style yaml.Style) { + for _, nodeContext := range matchingNodes { + updateStyleOfNode(nodeContext.Node, style) + } +} + +func updateStyleOfNode(node *yaml.Node, style yaml.Style) { + node.Style = style + + for _, child := range node.Content { + updateStyleOfNode(child, style) + } +} + +func writeString(writer io.Writer, txt string) error { + _, errorWriting := writer.Write([]byte(txt)) + return errorWriting +} + +func setIfNotThere(node *yaml.Node, key string, value *yaml.Node) { + for index := 0; index < len(node.Content); index = index + 2 { + keyNode := node.Content[index] + if keyNode.Value == key { + return + } + } + // need to add it to the map + mapEntryKey := yaml.Node{Value: key, Kind: yaml.ScalarNode} + node.Content = append(node.Content, &mapEntryKey) + node.Content = append(node.Content, value) +} + +func applyAlias(node *yaml.Node, alias *yaml.Node) { + if alias == nil { + return + } + for index := 0; index < len(alias.Content); index = index + 2 { + keyNode := alias.Content[index] + log.Debugf("applying alias key %v", keyNode.Value) + valueNode := alias.Content[index+1] + setIfNotThere(node, keyNode.Value, valueNode) + } +} + +func explodeNode(node *yaml.Node) error { + node.Anchor = "" + switch node.Kind { + case yaml.SequenceNode, yaml.DocumentNode: + for index, contentNode := range node.Content { + log.Debugf("exploding index %v", index) + errorInContent := explodeNode(contentNode) + if errorInContent != nil { + return errorInContent + } + } + return nil + case yaml.AliasNode: + log.Debugf("its an alias!") + if node.Alias != nil { + node.Kind = node.Alias.Kind + node.Style = node.Alias.Style + node.Tag = node.Alias.Tag + node.Content = node.Alias.Content + node.Value = node.Alias.Value + node.Alias = nil + } + return nil + case yaml.MappingNode: + for index := 0; index < len(node.Content); index = index + 2 { + keyNode := node.Content[index] + valueNode := node.Content[index+1] + log.Debugf("traversing %v", keyNode.Value) + if keyNode.Value != "<<" { + errorInContent := explodeNode(valueNode) + if errorInContent != nil { + return errorInContent + } + errorInContent = explodeNode(keyNode) + if errorInContent != nil { + return errorInContent + } + } else { + if valueNode.Kind == yaml.SequenceNode { + log.Debugf("an alias merge list!") + for index := len(valueNode.Content) - 1; index >= 0; index = index - 1 { + aliasNode := valueNode.Content[index] + applyAlias(node, aliasNode.Alias) + } + } else { + log.Debugf("an alias merge!") + applyAlias(node, valueNode.Alias) + } + node.Content = append(node.Content[:index], node.Content[index+2:]...) + //replay that index, since the array is shorter now. + index = index - 2 + } + } + + return nil + default: + return nil + } +} + +func explode(matchingNodes []*yqlib.NodeContext) error { + log.Debug("exploding nodes") + for _, nodeContext := range matchingNodes { + log.Debugf("exploding %v", nodeContext.Head) + errorExplodingNode := explodeNode(nodeContext.Node) + if errorExplodingNode != nil { + return errorExplodingNode + } + } + return nil +} + +func printResults(matchingNodes []*yqlib.NodeContext, writer io.Writer) error { + if prettyPrint { + setStyle(matchingNodes, 0) + } + + if stripComments { + removeComments(matchingNodes) + } + + //always explode anchors when printing json + if explodeAnchors || outputToJSON { + errorExploding := explode(matchingNodes) + if errorExploding != nil { + return errorExploding + } + } + + bufferedWriter := bufio.NewWriter(writer) + defer safelyFlush(bufferedWriter) + + if len(matchingNodes) == 0 { + log.Debug("no matching results, nothing to print") + if defaultValue != "" { + return writeString(bufferedWriter, defaultValue) + } + return nil + } + var errorWriting error + + var arrayCollection = yaml.Node{Kind: yaml.SequenceNode} + + for _, mappedDoc := range matchingNodes { + switch printMode { + case "p": + errorWriting = writeString(bufferedWriter, lib.PathStackToString(mappedDoc.PathStack)+"\n") + if errorWriting != nil { + return errorWriting + } + case "pv", "vp": + // put it into a node and print that. + var parentNode = yaml.Node{Kind: yaml.MappingNode} + parentNode.Content = make([]*yaml.Node, 2) + parentNode.Content[0] = &yaml.Node{Kind: yaml.ScalarNode, Value: lib.PathStackToString(mappedDoc.PathStack)} + parentNode.Content[1] = transformNode(mappedDoc.Node) + if collectIntoArray { + arrayCollection.Content = append(arrayCollection.Content, &parentNode) + } else if err := printNode(&parentNode, bufferedWriter); err != nil { + return err + } + default: + if collectIntoArray { + arrayCollection.Content = append(arrayCollection.Content, mappedDoc.Node) + } else if err := printNode(transformNode(mappedDoc.Node), bufferedWriter); err != nil { + return err + } + } + } + + if collectIntoArray { + if err := printNode(transformNode(&arrayCollection), bufferedWriter); err != nil { + return err + } + } + + return nil +} + +func parseDocumentIndex() (bool, int, error) { + if docIndex == "*" { + return true, -1, nil + } + docIndexInt64, err := strconv.ParseInt(docIndex, 10, 32) + if err != nil { + return false, -1, errors.Wrapf(err, "Document index %v is not a integer or *", docIndex) + } + return false, int(docIndexInt64), nil +} + +type updateDataFn func(dataBucket *yaml.Node, currentIndex int) error + +func isNullDocument(dataBucket *yaml.Node) bool { + return dataBucket.Kind == yaml.DocumentNode && (len(dataBucket.Content) == 0 || + dataBucket.Content[0].Kind == yaml.ScalarNode && dataBucket.Content[0].Tag == "!!null") +} + +func mapYamlDecoder(updateData updateDataFn, encoder yqlib.Encoder) yamlDecoderFn { + return func(decoder *yaml.Decoder) error { + var dataBucket yaml.Node + var errorReading error + var errorWriting error + var errorUpdating error + var currentIndex = 0 + + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + for { + log.Debugf("Read doc %v", currentIndex) + errorReading = decoder.Decode(&dataBucket) + + if errorReading == io.EOF && docIndexInt == 0 && currentIndex == 0 { + //empty document, lets just make one + dataBucket = yaml.Node{Kind: yaml.DocumentNode, Content: make([]*yaml.Node, 1)} + child := yaml.Node{Kind: yaml.MappingNode} + dataBucket.Content[0] = &child + } else if isNullDocument(&dataBucket) && (updateAll || docIndexInt == currentIndex) { + child := yaml.Node{Kind: yaml.MappingNode} + dataBucket.Content[0] = &child + } else if errorReading == io.EOF { + if !updateAll && currentIndex <= docIndexInt { + return fmt.Errorf("asked to process document index %v but there are only %v document(s)", docIndex, currentIndex) + } + return nil + } else if errorReading != nil { + return errors.Wrapf(errorReading, "Error reading document at index %v, %v", currentIndex, errorReading) + } + errorUpdating = updateData(&dataBucket, currentIndex) + if errorUpdating != nil { + return errors.Wrapf(errorUpdating, "Error updating document at index %v", currentIndex) + } + + if prettyPrint { + updateStyleOfNode(&dataBucket, 0) + } + + errorWriting = encoder.Encode(&dataBucket) + + if errorWriting != nil { + return errors.Wrapf(errorWriting, "Error writing document at index %v, %v", currentIndex, errorWriting) + } + currentIndex = currentIndex + 1 + } + } +} + +func prefixDocument(updateAll bool, docIndexInt int, currentIndex int, dataBucket *yaml.Node, updateCommand yqlib.UpdateCommand) error { + if updateAll || currentIndex == docIndexInt { + log.Debugf("Prefixing document %v", currentIndex) + yqlib.DebugNode(dataBucket) + updateCommand.Value = dataBucket.Content[0] + dataBucket.Content = make([]*yaml.Node, 1) + + newNode := lib.New(updateCommand.Path) + dataBucket.Content[0] = &newNode + + errorUpdating := lib.Update(dataBucket, updateCommand, true) + if errorUpdating != nil { + return errorUpdating + } + } + return nil +} + +func updateDoc(inputFile string, updateCommands []yqlib.UpdateCommand, writer io.Writer) error { + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + var updateData = func(dataBucket *yaml.Node, currentIndex int) error { + if updateAll || currentIndex == docIndexInt { + log.Debugf("Updating doc %v", currentIndex) + for _, updateCommand := range updateCommands { + log.Debugf("Processing update to Path %v", updateCommand.Path) + errorUpdating := lib.Update(dataBucket, updateCommand, autoCreateFlag) + if errorUpdating != nil { + return errorUpdating + } + } + } + return nil + } + return readAndUpdate(writer, inputFile, updateData) +} + +func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn) error { + var destination io.Writer + var destinationName string + var completedSuccessfully = false + if writeInplace { + info, err := os.Stat(inputFile) + if err != nil { + return err + } + // mkdir temp dir as some docker images does not have temp dir + _, err = os.Stat(os.TempDir()) + if os.IsNotExist(err) { + err = os.Mkdir(os.TempDir(), 0700) + if err != nil { + return err + } + } else if err != nil { + return err + } + tempFile, err := ioutil.TempFile("", "temp") + if err != nil { + return err + } + destinationName = tempFile.Name() + err = os.Chmod(destinationName, info.Mode()) + if err != nil { + return err + } + destination = tempFile + defer func() { + safelyCloseFile(tempFile) + if completedSuccessfully { + safelyRenameFile(tempFile.Name(), inputFile) + } + }() + } else { + destination = stdOut + destinationName = "Stdout" + } + + log.Debugf("Writing to %v from %v", destinationName, inputFile) + + bufferedWriter := bufio.NewWriter(destination) + defer safelyFlush(bufferedWriter) + + var encoder yqlib.Encoder + if outputToJSON { + encoder = yqlib.NewJsonEncoder(bufferedWriter, prettyPrint, indent) + } else { + encoder = yqlib.NewYamlEncoder(bufferedWriter, indent, colorsEnabled) + } + + var errorProcessing = readStream(inputFile, mapYamlDecoder(updateData, encoder)) + completedSuccessfully = errorProcessing == nil + return errorProcessing +} + +type updateCommandParsed struct { + Command string + Path string + Value yaml.Node +} + +func readUpdateCommands(args []string, expectedArgs int, badArgsMessage string, allowNoValue bool) ([]yqlib.UpdateCommand, error) { + var updateCommands []yqlib.UpdateCommand = make([]yqlib.UpdateCommand, 0) + if writeScript != "" { + var parsedCommands = make([]updateCommandParsed, 0) + + err := readData(writeScript, 0, &parsedCommands) + + if err != nil && err != io.EOF { + return nil, err + } + + log.Debugf("Read write commands file '%v'", parsedCommands) + for index := range parsedCommands { + parsedCommand := parsedCommands[index] + updateCommand := yqlib.UpdateCommand{Command: parsedCommand.Command, Path: parsedCommand.Path, Value: &parsedCommand.Value, Overwrite: true} + updateCommands = append(updateCommands, updateCommand) + } + + log.Debugf("Read write commands file '%v'", updateCommands) + } else if sourceYamlFile != "" && len(args) == expectedArgs-1 { + log.Debugf("Reading value from %v", sourceYamlFile) + var value yaml.Node + err := readData(sourceYamlFile, 0, &value) + if err != nil && err != io.EOF { + return nil, err + } + log.Debug("args %v", args[expectedArgs-2]) + updateCommands = make([]yqlib.UpdateCommand, 1) + updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: value.Content[0], Overwrite: true} + } else if len(args) == expectedArgs { + updateCommands = make([]yqlib.UpdateCommand, 1) + log.Debug("args %v", args) + log.Debug("path %v", args[expectedArgs-2]) + log.Debug("Value %v", args[expectedArgs-1]) + value := valueParser.Parse(args[expectedArgs-1], customTag, customStyle, anchorName, makeAlias) + updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: value, Overwrite: true, CommentsMergeStrategy: yqlib.IgnoreCommentsMergeStrategy} + } else if len(args) == expectedArgs-1 && allowNoValue { + // don't update the value + updateCommands = make([]yqlib.UpdateCommand, 1) + log.Debug("args %v", args) + log.Debug("path %v", args[expectedArgs-2]) + updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: valueParser.Parse("", customTag, customStyle, anchorName, makeAlias), Overwrite: true, DontUpdateNodeValue: true} + } else { + return nil, errors.New(badArgsMessage) + } + return updateCommands, nil +} + +func safelyRenameFile(from string, to string) { + if renameError := os.Rename(from, to); renameError != nil { + log.Debugf("Error renaming from %v to %v, attempting to copy contents", from, to) + log.Debug(renameError.Error()) + // can't do this rename when running in docker to a file targeted in a mounted volume, + // so gracefully degrade to copying the entire contents. + if copyError := copyFileContents(from, to); copyError != nil { + log.Errorf("Failed copying from %v to %v", from, to) + log.Error(copyError.Error()) + } else { + removeErr := os.Remove(from) + if removeErr != nil { + log.Errorf("failed removing original file: %s", from) + } + } + } +} + +// thanks https://stackoverflow.com/questions/21060945/simple-way-to-copy-a-file-in-golang +func copyFileContents(src, dst string) (err error) { + in, err := os.Open(src) // nolint gosec + if err != nil { + return err + } + defer safelyCloseFile(in) + out, err := os.Create(dst) + if err != nil { + return err + } + defer safelyCloseFile(out) + if _, err = io.Copy(out, in); err != nil { + return err + } + return out.Sync() +} + +func safelyFlush(writer *bufio.Writer) { + if err := writer.Flush(); err != nil { + log.Error("Error flushing writer!") + log.Error(err.Error()) + } + +} +func safelyCloseFile(file *os.File) { + err := file.Close() + if err != nil { + log.Error("Error closing file!") + log.Error(err.Error()) + } +} + +type yamlDecoderFn func(*yaml.Decoder) error + +func readStream(filename string, yamlDecoder yamlDecoderFn) error { + if filename == "" { + return errors.New("Must provide filename") + } + + var stream io.Reader + if filename == "-" { + stream = bufio.NewReader(os.Stdin) + } else { + file, err := os.Open(filename) // nolint gosec + if err != nil { + return err + } + defer safelyCloseFile(file) + stream = file + } + return yamlDecoder(yaml.NewDecoder(stream)) +} + +func readData(filename string, indexToRead int, parsedData interface{}) error { + return readStream(filename, func(decoder *yaml.Decoder) error { + for currentIndex := 0; currentIndex < indexToRead; currentIndex++ { + errorSkipping := decoder.Decode(parsedData) + if errorSkipping != nil { + return errors.Wrapf(errorSkipping, "Error processing document at index %v, %v", currentIndex, errorSkipping) + } + } + return decoder.Decode(parsedData) + }) +} diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/validate.go b/vendor/github.com/mikefarah/yq/v3/cmd/validate.go new file mode 100644 index 000000000..5e3a93017 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/validate.go @@ -0,0 +1,37 @@ +package cmd + +import ( + errors "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +func createValidateCmd() *cobra.Command { + var cmdRead = &cobra.Command{ + Use: "validate [yaml_file]", + Aliases: []string{"v"}, + Short: "yq v sample.yaml", + Example: ` +yq v - # reads from stdin +`, + RunE: validateProperty, + SilenceUsage: true, + SilenceErrors: false, + } + cmdRead.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + return cmdRead +} + +func validateProperty(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return errors.New("Must provide filename") + } + + var updateAll, docIndexInt, errorParsingDocIndex = parseDocumentIndex() + if errorParsingDocIndex != nil { + return errorParsingDocIndex + } + + _, errorReadingStream := readYamlFile(args[0], "", updateAll, docIndexInt) + + return errorReadingStream +} diff --git a/vendor/github.com/mikefarah/yq/v2/version.go b/vendor/github.com/mikefarah/yq/v3/cmd/version.go similarity index 97% rename from vendor/github.com/mikefarah/yq/v2/version.go rename to vendor/github.com/mikefarah/yq/v3/cmd/version.go index eca405f09..337053734 100644 --- a/vendor/github.com/mikefarah/yq/v2/version.go +++ b/vendor/github.com/mikefarah/yq/v3/cmd/version.go @@ -1,4 +1,4 @@ -package main +package cmd import ( "fmt" @@ -11,7 +11,7 @@ var ( GitDescribe string // Version is main version number that is being run at the moment. - Version = "2.4.1" + Version = "3.4.1" // VersionPrerelease is a pre-release marker for the version. If this is "" (empty string) // then it means that it is a final release. Otherwise, this is a pre-release diff --git a/vendor/github.com/mikefarah/yq/v3/cmd/write.go b/vendor/github.com/mikefarah/yq/v3/cmd/write.go new file mode 100644 index 000000000..be14a132d --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/cmd/write.go @@ -0,0 +1,61 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +func createWriteCmd() *cobra.Command { + var cmdWrite = &cobra.Command{ + Use: "write [yaml_file] [path_expression] [value]", + Aliases: []string{"w"}, + Short: "yq w [--inplace/-i] [--script/-s script_file] [--doc/-d index] sample.yaml 'b.e(name==fr*).value' newValue", + Example: ` +yq write things.yaml 'a.b.c' true +yq write things.yaml 'a.*.c' true +yq write things.yaml 'a.**' true +yq write things.yaml 'a.(child.subchild==co*).c' true +yq write things.yaml 'a.b.c' --tag '!!str' true # force 'true' to be interpreted as a string instead of bool +yq write things.yaml 'a.b.c' --tag '!!float' 3 +yq write --inplace -- things.yaml 'a.b.c' '--cat' # need to use '--' to stop processing arguments as flags +yq w -i things.yaml 'a.b.c' cat +yq w -i -s update_script.yaml things.yaml +yq w things.yaml 'a.b.d[+]' foo # appends a new node to the 'd' array +yq w --doc 2 things.yaml 'a.b.d[+]' foo # updates the 3rd document of the yaml file + `, + Long: `Updates the yaml file w.r.t the given path and value. +Outputs to STDOUT unless the inplace flag is used, in which case the file is updated instead. + +Append value to array adds the value to the end of array. + +Update Scripts: +Note that you can give an update script to perform more sophisticated update. Update script +format is list of update commands (update or delete) like so: +--- +- command: update + path: b.c + value: + #great + things: frog # wow! +- command: delete + path: b.d +`, + RunE: writeProperty, + } + cmdWrite.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace") + cmdWrite.PersistentFlags().StringVarP(&writeScript, "script", "s", "", "yaml script for updating yaml") + cmdWrite.PersistentFlags().StringVarP(&sourceYamlFile, "from", "f", "", "yaml file for updating yaml (as-is)") + cmdWrite.PersistentFlags().StringVarP(&customTag, "tag", "t", "", "set yaml tag (e.g. !!int)") + cmdWrite.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") + cmdWrite.PersistentFlags().StringVarP(&customStyle, "style", "", "", "formatting style of the value: single, double, folded, flow, literal, tagged") + cmdWrite.PersistentFlags().StringVarP(&anchorName, "anchorName", "", "", "anchor name") + cmdWrite.PersistentFlags().BoolVarP(&makeAlias, "makeAlias", "", false, "create an alias using the value as the anchor name") + return cmdWrite +} + +func writeProperty(cmd *cobra.Command, args []string) error { + var updateCommands, updateCommandsError = readUpdateCommands(args, 3, "Must provide ", true) + if updateCommandsError != nil { + return updateCommandsError + } + return updateDoc(args[0], updateCommands, cmd.OutOrStdout()) +} diff --git a/vendor/github.com/mikefarah/yq/v3/compare.sh b/vendor/github.com/mikefarah/yq/v3/compare.sh new file mode 100644 index 000000000..fc8cd8bf9 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/compare.sh @@ -0,0 +1,13 @@ +GREEN='\033[0;32m' +NC='\033[0m' + +echo "${GREEN}---Old---${NC}" +yq $@ > /tmp/yq-old-output +cat /tmp/yq-old-output + +echo "${GREEN}---New---${NC}" +./yq $@ > /tmp/yq-new-output +cat /tmp/yq-new-output + +echo "${GREEN}---Diff---${NC}" +colordiff /tmp/yq-old-output /tmp/yq-new-output \ No newline at end of file diff --git a/vendor/github.com/mikefarah/yq/v3/go.mod b/vendor/github.com/mikefarah/yq/v3/go.mod new file mode 100644 index 000000000..b2d77dc9f --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/go.mod @@ -0,0 +1,16 @@ +module github.com/mikefarah/yq/v3 + +require ( + github.com/fatih/color v1.9.0 + github.com/goccy/go-yaml v1.8.1 + github.com/kylelemons/godebug v1.1.0 + github.com/mattn/go-colorable v0.1.7 // indirect + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.0.0 + github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 +) + +go 1.15 diff --git a/vendor/github.com/mikefarah/yq/v3/go.sum b/vendor/github.com/mikefarah/yq/v3/go.sum new file mode 100644 index 000000000..807e86400 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/go.sum @@ -0,0 +1,180 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-yaml v1.8.1 h1:JuZRFlqLM5cWF6A+waL8AKVuCcqvKOuhJtUQI+L3ez0= +github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/mikefarah/yq/v3/mkdocs.yml b/vendor/github.com/mikefarah/yq/v3/mkdocs.yml new file mode 100644 index 000000000..9896ee029 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/mkdocs.yml @@ -0,0 +1,7 @@ +docs_dir: mkdocs +site_dir: docs +site_name: Yq +theme: 'material' +repo_name: 'mikefarah/yq' +repo_url: 'https://github.com/mikefarah/yq' + diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/color_print.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/color_print.go new file mode 100644 index 000000000..82968ed33 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/color_print.go @@ -0,0 +1,61 @@ +package yqlib + +import ( + "fmt" + "io" + + "github.com/fatih/color" + "github.com/goccy/go-yaml/lexer" + "github.com/goccy/go-yaml/printer" +) + +// Thanks @risentveber! + +const escape = "\x1b" + +func format(attr color.Attribute) string { + return fmt.Sprintf("%s[%dm", escape, attr) +} + +func ColorizeAndPrint(bytes []byte, writer io.Writer) error { + tokens := lexer.Tokenize(string(bytes)) + var p printer.Printer + p.Bool = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgHiMagenta), + Suffix: format(color.Reset), + } + } + p.Number = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgHiMagenta), + Suffix: format(color.Reset), + } + } + p.MapKey = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgCyan), + Suffix: format(color.Reset), + } + } + p.Anchor = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgHiYellow), + Suffix: format(color.Reset), + } + } + p.Alias = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgHiYellow), + Suffix: format(color.Reset), + } + } + p.String = func() *printer.Property { + return &printer.Property{ + Prefix: format(color.FgGreen), + Suffix: format(color.Reset), + } + } + _, err := writer.Write([]byte(p.PrintTokens(tokens) + "\n")) + return err +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/data_navigator.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/data_navigator.go new file mode 100644 index 000000000..a7c41c64d --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/data_navigator.go @@ -0,0 +1,295 @@ +package yqlib + +import ( + "fmt" + "strconv" + + yaml "gopkg.in/yaml.v3" +) + +type DataNavigator interface { + Traverse(value *yaml.Node, path []interface{}) error +} + +type navigator struct { + navigationStrategy NavigationStrategy +} + +func NewDataNavigator(NavigationStrategy NavigationStrategy) DataNavigator { + return &navigator{ + navigationStrategy: NavigationStrategy, + } +} + +func (n *navigator) Traverse(value *yaml.Node, path []interface{}) error { + emptyArray := make([]interface{}, 0) + log.Debugf("Traversing path %v", pathStackToString(path)) + return n.doTraverse(value, "", path, emptyArray) +} + +func (n *navigator) doTraverse(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { + + log.Debug("head %v", head) + DebugNode(value) + var nodeContext = NewNodeContext(value, head, tail, pathStack) + + var errorDeepSplatting error + // no need to deeply traverse the DocumentNode, as it's already covered by its first child. + if head == "**" && value.Kind != yaml.DocumentNode && value.Kind != yaml.ScalarNode && n.navigationStrategy.ShouldDeeplyTraverse(nodeContext) { + if len(pathStack) == 0 || pathStack[len(pathStack)-1] != "<<" { + errorDeepSplatting = n.recurse(value, head, tail, pathStack) + } + // ignore errors here, we are deep splatting so we may accidently give a string key + // to an array sequence + if len(tail) > 0 { + _ = n.recurse(value, tail[0], tail[1:], pathStack) + } + return errorDeepSplatting + } + + if value.Kind == yaml.DocumentNode { + log.Debugf("its a document, diving into %v", head) + DebugNode(value) + return n.recurse(value, head, tail, pathStack) + } else if len(tail) > 0 && value.Kind != yaml.ScalarNode { + log.Debugf("diving into %v", tail[0]) + DebugNode(value) + return n.recurse(value, tail[0], tail[1:], pathStack) + } + return n.navigationStrategy.Visit(nodeContext) +} + +func (n *navigator) getOrReplace(original *yaml.Node, expectedKind yaml.Kind) *yaml.Node { + if original.Kind != expectedKind { + log.Debug("wanted %v but it was %v, overriding", KindString(expectedKind), KindString(original.Kind)) + return &yaml.Node{Kind: expectedKind} + } + return original +} + +func (n *navigator) recurse(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { + log.Debug("recursing, processing %v, pathStack %v", head, pathStackToString(pathStack)) + + nodeContext := NewNodeContext(value, head, tail, pathStack) + + if head == "**" && !n.navigationStrategy.ShouldOnlyDeeplyVisitLeaves(nodeContext) { + nodeContext.IsMiddleNode = true + errorVisitingDeeply := n.navigationStrategy.Visit(nodeContext) + if errorVisitingDeeply != nil { + return errorVisitingDeeply + } + } + + switch value.Kind { + case yaml.MappingNode: + log.Debug("its a map with %v entries", len(value.Content)/2) + headString := fmt.Sprintf("%v", head) + return n.recurseMap(value, headString, tail, pathStack) + + case yaml.SequenceNode: + log.Debug("its a sequence of %v things!", len(value.Content)) + + switch head := head.(type) { + case int64: + return n.recurseArray(value, head, head, tail, pathStack) + default: + + if head == "+" { + return n.appendArray(value, head, tail, pathStack) + } else if len(value.Content) == 0 && head == "**" { + return n.navigationStrategy.Visit(nodeContext) + } + return n.splatArray(value, head, tail, pathStack) + } + case yaml.AliasNode: + log.Debug("its an alias!") + DebugNode(value.Alias) + if n.navigationStrategy.FollowAlias(nodeContext) { + log.Debug("following the alias") + return n.recurse(value.Alias, head, tail, pathStack) + } + return nil + case yaml.DocumentNode: + return n.doTraverse(value.Content[0], head, tail, pathStack) + default: + return n.navigationStrategy.Visit(nodeContext) + } +} + +func (n *navigator) recurseMap(value *yaml.Node, head string, tail []interface{}, pathStack []interface{}) error { + traversedEntry := false + errorVisiting := n.visitMatchingEntries(value, head, tail, pathStack, func(contents []*yaml.Node, indexInMap int) error { + log.Debug("recurseMap: visitMatchingEntries for %v", contents[indexInMap].Value) + n.navigationStrategy.DebugVisitedNodes() + newPathStack := append(pathStack, contents[indexInMap].Value) + log.Debug("should I traverse? head: %v, path: %v", head, pathStackToString(newPathStack)) + DebugNode(value) + if n.navigationStrategy.ShouldTraverse(NewNodeContext(contents[indexInMap+1], head, tail, newPathStack), contents[indexInMap].Value) { + log.Debug("recurseMap: Going to traverse") + traversedEntry = true + contents[indexInMap+1] = n.getOrReplace(contents[indexInMap+1], guessKind(head, tail, contents[indexInMap+1].Kind)) + errorTraversing := n.doTraverse(contents[indexInMap+1], head, tail, newPathStack) + log.Debug("recurseMap: Finished traversing") + n.navigationStrategy.DebugVisitedNodes() + return errorTraversing + } else { + log.Debug("nope not traversing") + } + return nil + }) + + if errorVisiting != nil { + return errorVisiting + } + + if len(value.Content) == 0 && head == "**" { + return n.navigationStrategy.Visit(NewNodeContext(value, head, tail, pathStack)) + } else if traversedEntry || n.navigationStrategy.GetPathParser().IsPathExpression(head) || !n.navigationStrategy.AutoCreateMap(NewNodeContext(value, head, tail, pathStack)) { + return nil + } + + _, errorParsingInt := strconv.ParseInt(head, 10, 64) + + mapEntryKey := yaml.Node{Value: head, Kind: yaml.ScalarNode} + + if errorParsingInt == nil { + // fixes a json encoding problem where keys that look like numbers + // get treated as numbers and cannot be used in a json map + mapEntryKey.Style = yaml.LiteralStyle + } + + value.Content = append(value.Content, &mapEntryKey) + mapEntryValue := yaml.Node{Kind: guessKind(head, tail, 0)} + value.Content = append(value.Content, &mapEntryValue) + log.Debug("adding a new node %v - def a string", head) + return n.doTraverse(&mapEntryValue, head, tail, append(pathStack, head)) +} + +// need to pass the node in, as it may be aliased +type mapVisitorFn func(contents []*yaml.Node, index int) error + +func (n *navigator) visitDirectMatchingEntries(node *yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { + var contents = node.Content + for index := 0; index < len(contents); index = index + 2 { + content := contents[index] + + log.Debug("index %v, checking %v, %v", index, content.Value, content.Tag) + n.navigationStrategy.DebugVisitedNodes() + errorVisiting := visit(contents, index) + if errorVisiting != nil { + return errorVisiting + } + } + return nil +} + +func (n *navigator) visitMatchingEntries(node *yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { + var contents = node.Content + log.Debug("visitMatchingEntries %v", head) + DebugNode(node) + // value.Content is a concatenated array of key, value, + // so keys are in the even indexes, values in odd. + // merge aliases are defined first, but we only want to traverse them + // if we don't find a match directly on this node first. + errorVisitedDirectEntries := n.visitDirectMatchingEntries(node, head, tail, pathStack, visit) + + if errorVisitedDirectEntries != nil || !n.navigationStrategy.FollowAlias(NewNodeContext(node, head, tail, pathStack)) { + return errorVisitedDirectEntries + } + return n.visitAliases(contents, head, tail, pathStack, visit) +} + +func (n *navigator) visitAliases(contents []*yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { + // merge aliases are defined first, but we only want to traverse them + // if we don't find a match on this node first. + // traverse them backwards so that the last alias overrides the preceding. + // a node can either be + // an alias to one other node (e.g. <<: *blah) + // or a sequence of aliases (e.g. <<: [*blah, *foo]) + log.Debug("checking for aliases, head: %v, pathstack: %v", head, pathStackToString(pathStack)) + for index := len(contents) - 2; index >= 0; index = index - 2 { + + if contents[index+1].Kind == yaml.AliasNode && contents[index].Value == "<<" { + valueNode := contents[index+1] + log.Debug("found an alias") + DebugNode(contents[index]) + DebugNode(valueNode) + + errorInAlias := n.visitMatchingEntries(valueNode.Alias, head, tail, pathStack, visit) + if errorInAlias != nil { + return errorInAlias + } + } else if contents[index+1].Kind == yaml.SequenceNode { + // could be an array of aliases... + errorVisitingAliasSeq := n.visitAliasSequence(contents[index+1].Content, head, tail, pathStack, visit) + if errorVisitingAliasSeq != nil { + return errorVisitingAliasSeq + } + } + } + return nil +} + +func (n *navigator) visitAliasSequence(possibleAliasArray []*yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { + // need to search this backwards too, so that aliases defined last override the preceding. + for aliasIndex := len(possibleAliasArray) - 1; aliasIndex >= 0; aliasIndex = aliasIndex - 1 { + child := possibleAliasArray[aliasIndex] + if child.Kind == yaml.AliasNode { + log.Debug("found an alias") + DebugNode(child) + errorInAlias := n.visitMatchingEntries(child.Alias, head, tail, pathStack, visit) + if errorInAlias != nil { + return errorInAlias + } + } + } + return nil +} + +func (n *navigator) splatArray(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { + for index, childValue := range value.Content { + log.Debug("processing") + DebugNode(childValue) + childValue = n.getOrReplace(childValue, guessKind(head, tail, childValue.Kind)) + + newPathStack := append(pathStack, index) + if n.navigationStrategy.ShouldTraverse(NewNodeContext(childValue, head, tail, newPathStack), childValue.Value) { + // here we should not deeply traverse the array if we are appending..not sure how to do that. + // need to visit instead... + // easiest way is to pop off the head and pass the rest of the tail in. + var err = n.doTraverse(childValue, head, tail, newPathStack) + if err != nil { + return err + } + } + } + return nil +} + +func (n *navigator) appendArray(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { + var newNode = yaml.Node{Kind: guessKind(head, tail, 0)} + value.Content = append(value.Content, &newNode) + log.Debug("appending a new node, %v", value.Content) + return n.doTraverse(&newNode, head, tail, append(pathStack, len(value.Content)-1)) +} + +func (n *navigator) recurseArray(value *yaml.Node, index int64, head interface{}, tail []interface{}, pathStack []interface{}) error { + var contentLength = int64(len(value.Content)) + for contentLength <= index { + value.Content = append(value.Content, &yaml.Node{Kind: guessKind(head, tail, 0)}) + contentLength = int64(len(value.Content)) + } + var indexToUse = index + + if indexToUse < 0 { + indexToUse = contentLength + indexToUse + } + + if indexToUse < 0 { + return fmt.Errorf("Index [%v] out of range, array size is %v", index, contentLength) + } + + value.Content[indexToUse] = n.getOrReplace(value.Content[indexToUse], guessKind(head, tail, value.Content[indexToUse].Kind)) + + return n.doTraverse(value.Content[indexToUse], head, tail, append(pathStack, index)) +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/delete_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/delete_navigation_strategy.go new file mode 100644 index 000000000..a0792c38c --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/delete_navigation_strategy.go @@ -0,0 +1,73 @@ +package yqlib + +import ( + yaml "gopkg.in/yaml.v3" +) + +func DeleteNavigationStrategy(pathElementToDelete interface{}) NavigationStrategy { + parser := NewPathParser() + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: parser, + followAlias: func(nodeContext NodeContext) bool { + return false + }, + shouldOnlyDeeplyVisitLeaves: func(nodeContext NodeContext) bool { + return false + }, + visit: func(nodeContext NodeContext) error { + node := nodeContext.Node + log.Debug("need to find and delete %v in here (%v)", pathElementToDelete, pathStackToString(nodeContext.PathStack)) + DebugNode(node) + if node.Kind == yaml.SequenceNode { + newContent := deleteFromArray(parser, node.Content, nodeContext.PathStack, pathElementToDelete) + node.Content = newContent + } else if node.Kind == yaml.MappingNode { + node.Content = deleteFromMap(parser, node.Content, nodeContext.PathStack, pathElementToDelete) + } + return nil + }, + } +} +func deleteFromMap(pathParser PathParser, contents []*yaml.Node, pathStack []interface{}, pathElementToDelete interface{}) []*yaml.Node { + newContents := make([]*yaml.Node, 0) + for index := 0; index < len(contents); index = index + 2 { + keyNode := contents[index] + valueNode := contents[index+1] + if !pathParser.MatchesNextPathElement(NewNodeContext(keyNode, pathElementToDelete, make([]interface{}, 0), pathStack), keyNode.Value) { + log.Debug("adding node %v", keyNode.Value) + newContents = append(newContents, keyNode, valueNode) + } else { + log.Debug("skipping node %v", keyNode.Value) + } + } + return newContents +} + +func deleteFromArray(pathParser PathParser, content []*yaml.Node, pathStack []interface{}, pathElementToDelete interface{}) []*yaml.Node { + + switch pathElementToDelete := pathElementToDelete.(type) { + case int64: + return deleteIndexInArray(content, pathElementToDelete) + default: + log.Debug("%v is not a numeric index, finding matching patterns", pathElementToDelete) + var newArray = make([]*yaml.Node, 0) + + for _, childValue := range content { + if !pathParser.MatchesNextPathElement(NewNodeContext(childValue, pathElementToDelete, make([]interface{}, 0), pathStack), childValue.Value) { + newArray = append(newArray, childValue) + } + } + return newArray + } + +} + +func deleteIndexInArray(content []*yaml.Node, index int64) []*yaml.Node { + log.Debug("deleting index %v in array", index) + if index >= int64(len(content)) { + log.Debug("index %v is greater than content length %v", index, len(content)) + return content + } + return append(content[:index], content[index+1:]...) +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/encoder.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/encoder.go new file mode 100644 index 000000000..e9ab95873 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/encoder.go @@ -0,0 +1,249 @@ +package yqlib + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + + yaml "gopkg.in/yaml.v3" +) + +type Encoder interface { + Encode(node *yaml.Node) error +} + +type yamlEncoder struct { + destination io.Writer + indent int + colorise bool + firstDoc bool +} + +func NewYamlEncoder(destination io.Writer, indent int, colorise bool) Encoder { + if indent < 0 { + indent = 0 + } + return &yamlEncoder{destination, indent, colorise, true} +} + +func (ye *yamlEncoder) Encode(node *yaml.Node) error { + + destination := ye.destination + tempBuffer := bytes.NewBuffer(nil) + if ye.colorise { + destination = tempBuffer + } + + var encoder = yaml.NewEncoder(destination) + + encoder.SetIndent(ye.indent) + // TODO: work out if the first doc had a separator or not. + if ye.firstDoc { + ye.firstDoc = false + } else if _, err := destination.Write([]byte("---\n")); err != nil { + return err + } + + if err := encoder.Encode(node); err != nil { + return err + } + + if ye.colorise { + return ColorizeAndPrint(tempBuffer.Bytes(), ye.destination) + } + return nil +} + +type jsonEncoder struct { + encoder *json.Encoder +} + +func mapKeysToStrings(node *yaml.Node) { + + if node.Kind == yaml.MappingNode { + for index, child := range node.Content { + if index%2 == 0 { // its a map key + child.Tag = "!!str" + } + } + } + + for _, child := range node.Content { + mapKeysToStrings(child) + } +} + +func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder { + var encoder = json.NewEncoder(destination) + var indentString = "" + + for index := 0; index < indent; index++ { + indentString = indentString + " " + } + if prettyPrint { + encoder.SetIndent("", indentString) + } + return &jsonEncoder{encoder} +} + +func (je *jsonEncoder) Encode(node *yaml.Node) error { + var dataBucket orderedMap + // firstly, convert all map keys to strings + mapKeysToStrings(node) + errorDecoding := node.Decode(&dataBucket) + if errorDecoding != nil { + return errorDecoding + } + return je.encoder.Encode(dataBucket) +} + +// orderedMap allows to marshal and unmarshal JSON and YAML values keeping the +// order of keys and values in a map or an object. +type orderedMap struct { + // if this is an object, kv != nil. If this is not an object, kv == nil. + kv []orderedMapKV + altVal interface{} +} + +type orderedMapKV struct { + K string + V orderedMap +} + +func (o *orderedMap) UnmarshalJSON(data []byte) error { + switch data[0] { + case '{': + // initialise so that even if the object is empty it is not nil + o.kv = []orderedMapKV{} + + // create decoder + dec := json.NewDecoder(bytes.NewReader(data)) + _, err := dec.Token() // open object + if err != nil { + return err + } + + // cycle through k/v + var tok json.Token + for tok, err = dec.Token(); err != io.EOF; tok, err = dec.Token() { + // we can expect two types: string or Delim. Delim automatically means + // that it is the closing bracket of the object, whereas string means + // that there is another key. + if _, ok := tok.(json.Delim); ok { + break + } + kv := orderedMapKV{ + K: tok.(string), + } + if err := dec.Decode(&kv.V); err != nil { + return err + } + o.kv = append(o.kv, kv) + } + // unexpected error + if err != nil && err != io.EOF { + return err + } + return nil + case '[': + var arr []orderedMap + return json.Unmarshal(data, &arr) + } + + return json.Unmarshal(data, &o.altVal) +} + +func (o orderedMap) MarshalJSON() ([]byte, error) { + if o.kv == nil { + return json.Marshal(o.altVal) + } + buf := new(bytes.Buffer) + enc := json.NewEncoder(buf) + buf.WriteByte('{') + for idx, el := range o.kv { + if err := enc.Encode(el.K); err != nil { + return nil, err + } + buf.WriteByte(':') + if err := enc.Encode(el.V); err != nil { + return nil, err + } + if idx != len(o.kv)-1 { + buf.WriteByte(',') + } + } + buf.WriteByte('}') + return buf.Bytes(), nil +} + +func (o *orderedMap) UnmarshalYAML(node *yaml.Node) error { + switch node.Kind { + case yaml.DocumentNode: + if len(node.Content) == 0 { + return nil + } + return o.UnmarshalYAML(node.Content[0]) + case yaml.AliasNode: + return o.UnmarshalYAML(node.Alias) + case yaml.ScalarNode: + return node.Decode(&o.altVal) + case yaml.MappingNode: + // set kv to non-nil + o.kv = []orderedMapKV{} + for i := 0; i < len(node.Content); i += 2 { + var key string + var val orderedMap + if err := node.Content[i].Decode(&key); err != nil { + return err + } + if err := node.Content[i+1].Decode(&val); err != nil { + return err + } + o.kv = append(o.kv, orderedMapKV{ + K: key, + V: val, + }) + } + return nil + case yaml.SequenceNode: + var res []orderedMap + if err := node.Decode(&res); err != nil { + return err + } + o.altVal = res + o.kv = nil + return nil + case 0: + // null + o.kv = nil + o.altVal = nil + return nil + default: + return fmt.Errorf("orderedMap: invalid yaml node") + } +} + +func (o *orderedMap) MarshalYAML() (interface{}, error) { + // fast path: kv is nil, use altVal + if o.kv == nil { + return o.altVal, nil + } + content := make([]*yaml.Node, 0, len(o.kv)*2) + for _, val := range o.kv { + n := new(yaml.Node) + if err := n.Encode(val.V); err != nil { + return nil, err + } + content = append(content, &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Value: val.K, + }, n) + } + return &yaml.Node{ + Kind: yaml.MappingNode, + Tag: "!!map", + Content: content, + }, nil +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/filter_matching_node_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/filter_matching_node_navigation_strategy.go new file mode 100644 index 000000000..4c15c4fe6 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/filter_matching_node_navigation_strategy.go @@ -0,0 +1,15 @@ +package yqlib + +func FilterMatchingNodesNavigationStrategy(value string) NavigationStrategy { + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: NewPathParser(), + visit: func(nodeContext NodeContext) error { + return nil + }, + shouldVisitExtraFn: func(nodeContext NodeContext) bool { + log.Debug("does %v match %v ? %v", nodeContext.Node.Value, value, nodeContext.Node.Value == value) + return matchesString(value, nodeContext.Node.Value) + }, + } +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/lib.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/lib.go new file mode 100644 index 000000000..3f548f6bb --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/lib.go @@ -0,0 +1,208 @@ +package yqlib + +import ( + "bytes" + "fmt" + "strconv" + "strings" + + logging "gopkg.in/op/go-logging.v1" + yaml "gopkg.in/yaml.v3" +) + +var log = logging.MustGetLogger("yq") + +type UpdateCommand struct { + Command string + Path string + Value *yaml.Node + Overwrite bool + DontUpdateNodeValue bool + DontUpdateNodeContent bool + CommentsMergeStrategy CommentsMergeStrategy +} + +func KindString(kind yaml.Kind) string { + switch kind { + case yaml.ScalarNode: + return "ScalarNode" + case yaml.SequenceNode: + return "SequenceNode" + case yaml.MappingNode: + return "MappingNode" + case yaml.DocumentNode: + return "DocumentNode" + case yaml.AliasNode: + return "AliasNode" + default: + return "unknown!" + } +} + +func DebugNode(value *yaml.Node) { + if value == nil { + log.Debug("-- node is nil --") + } else if log.IsEnabledFor(logging.DEBUG) { + buf := new(bytes.Buffer) + encoder := yaml.NewEncoder(buf) + errorEncoding := encoder.Encode(value) + if errorEncoding != nil { + log.Error("Error debugging node, %v", errorEncoding.Error()) + } + encoder.Close() + log.Debug("Tag: %v, Kind: %v, Anchor: %v", value.Tag, KindString(value.Kind), value.Anchor) + log.Debug("Head Comment: %v", value.HeadComment) + log.Debug("Line Comment: %v", value.LineComment) + log.Debug("FootComment Comment: %v", value.FootComment) + log.Debug("\n%v", buf.String()) + } +} + +func pathStackToString(pathStack []interface{}) string { + return mergePathStackToString(pathStack, UpdateArrayMergeStrategy) +} + +func mergePathStackToString(pathStack []interface{}, arrayMergeStrategy ArrayMergeStrategy) string { + var sb strings.Builder + for index, path := range pathStack { + switch path.(type) { + case int, int64: + if arrayMergeStrategy == AppendArrayMergeStrategy { + sb.WriteString("[+]") + } else { + sb.WriteString(fmt.Sprintf("[%v]", path)) + } + + default: + s := fmt.Sprintf("%v", path) + var _, errParsingInt = strconv.ParseInt(s, 10, 64) // nolint + + hasSpecial := strings.Contains(s, ".") || strings.Contains(s, "[") || strings.Contains(s, "]") || strings.Contains(s, "\"") + hasDoubleQuotes := strings.Contains(s, "\"") + wrappingCharacterStart := "\"" + wrappingCharacterEnd := "\"" + if hasDoubleQuotes { + wrappingCharacterStart = "(" + wrappingCharacterEnd = ")" + } + if hasSpecial || errParsingInt == nil { + sb.WriteString(wrappingCharacterStart) + } + sb.WriteString(s) + if hasSpecial || errParsingInt == nil { + sb.WriteString(wrappingCharacterEnd) + } + } + + if index < len(pathStack)-1 { + sb.WriteString(".") + } + } + return sb.String() +} + +func guessKind(head interface{}, tail []interface{}, guess yaml.Kind) yaml.Kind { + log.Debug("guessKind: tail %v", tail) + if len(tail) == 0 && guess == 0 { + log.Debug("end of path, must be a scalar") + return yaml.ScalarNode + } else if len(tail) == 0 { + return guess + } + var next = tail[0] + switch next.(type) { + case int64: + return yaml.SequenceNode + default: + var nextString = fmt.Sprintf("%v", next) + if nextString == "+" { + return yaml.SequenceNode + } + pathParser := NewPathParser() + if pathParser.IsPathExpression(nextString) && (guess == yaml.SequenceNode || guess == yaml.MappingNode) { + return guess + } else if guess == yaml.AliasNode { + log.Debug("guess was an alias, okey doke.") + return guess + } else if head == "**" { + log.Debug("deep wildcard, go with the guess") + return guess + } + log.Debug("forcing a mapping node") + log.Debug("yaml.SequenceNode %v", guess == yaml.SequenceNode) + log.Debug("yaml.ScalarNode %v", guess == yaml.ScalarNode) + return yaml.MappingNode + } +} + +type YqLib interface { + Get(rootNode *yaml.Node, path string) ([]*NodeContext, error) + GetForMerge(rootNode *yaml.Node, path string, arrayMergeStrategy ArrayMergeStrategy) ([]*NodeContext, error) + Update(rootNode *yaml.Node, updateCommand UpdateCommand, autoCreate bool) error + New(path string) yaml.Node + + PathStackToString(pathStack []interface{}) string + MergePathStackToString(pathStack []interface{}, arrayMergeStrategy ArrayMergeStrategy) string +} + +type lib struct { + parser PathParser +} + +func NewYqLib() YqLib { + return &lib{ + parser: NewPathParser(), + } +} + +func (l *lib) Get(rootNode *yaml.Node, path string) ([]*NodeContext, error) { + var paths = l.parser.ParsePath(path) + navigationStrategy := ReadNavigationStrategy() + navigator := NewDataNavigator(navigationStrategy) + error := navigator.Traverse(rootNode, paths) + return navigationStrategy.GetVisitedNodes(), error +} + +func (l *lib) GetForMerge(rootNode *yaml.Node, path string, arrayMergeStrategy ArrayMergeStrategy) ([]*NodeContext, error) { + var paths = l.parser.ParsePath(path) + navigationStrategy := ReadForMergeNavigationStrategy(arrayMergeStrategy) + navigator := NewDataNavigator(navigationStrategy) + error := navigator.Traverse(rootNode, paths) + return navigationStrategy.GetVisitedNodes(), error +} + +func (l *lib) PathStackToString(pathStack []interface{}) string { + return pathStackToString(pathStack) +} + +func (l *lib) MergePathStackToString(pathStack []interface{}, arrayMergeStrategy ArrayMergeStrategy) string { + return mergePathStackToString(pathStack, arrayMergeStrategy) +} + +func (l *lib) New(path string) yaml.Node { + var paths = l.parser.ParsePath(path) + newNode := yaml.Node{Kind: guessKind("", paths, 0)} + return newNode +} + +func (l *lib) Update(rootNode *yaml.Node, updateCommand UpdateCommand, autoCreate bool) error { + log.Debugf("%v to %v", updateCommand.Command, updateCommand.Path) + switch updateCommand.Command { + case "update": + var paths = l.parser.ParsePath(updateCommand.Path) + navigator := NewDataNavigator(UpdateNavigationStrategy(updateCommand, autoCreate)) + return navigator.Traverse(rootNode, paths) + case "merge": + var paths = l.parser.ParsePath(updateCommand.Path) + navigator := NewDataNavigator(MergeNavigationStrategy(updateCommand, autoCreate)) + return navigator.Traverse(rootNode, paths) + case "delete": + var paths = l.parser.ParsePath(updateCommand.Path) + lastBit, newTail := paths[len(paths)-1], paths[:len(paths)-1] + navigator := NewDataNavigator(DeleteNavigationStrategy(lastBit)) + return navigator.Traverse(rootNode, newTail) + default: + return fmt.Errorf("Unknown command %v", updateCommand.Command) + } + +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/merge_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/merge_navigation_strategy.go new file mode 100644 index 000000000..686ba4eb0 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/merge_navigation_strategy.go @@ -0,0 +1,103 @@ +package yqlib + +import "gopkg.in/yaml.v3" + +type ArrayMergeStrategy uint32 + +const ( + UpdateArrayMergeStrategy ArrayMergeStrategy = 1 << iota + OverwriteArrayMergeStrategy + AppendArrayMergeStrategy +) + +type CommentsMergeStrategy uint32 + +const ( + SetWhenBlankCommentsMergeStrategy CommentsMergeStrategy = 1 << iota + IgnoreCommentsMergeStrategy + OverwriteCommentsMergeStrategy + AppendCommentsMergeStrategy +) + +func MergeNavigationStrategy(updateCommand UpdateCommand, autoCreate bool) NavigationStrategy { + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: NewPathParser(), + followAlias: func(nodeContext NodeContext) bool { + return false + }, + autoCreateMap: func(nodeContext NodeContext) bool { + return autoCreate + }, + visit: func(nodeContext NodeContext) error { + node := nodeContext.Node + changesToApply := updateCommand.Value + + if node.Kind == yaml.DocumentNode && changesToApply.Kind != yaml.DocumentNode { + // when the path is empty, it matches both the top level pseudo document node + // and the actual top level node (e.g. map/sequence/whatever) + // so when we are updating with no path, make sure we update the right node. + node = node.Content[0] + } + + log.Debug("going to update") + DebugNode(node) + log.Debug("with") + DebugNode(changesToApply) + + if updateCommand.Overwrite || node.Value == "" { + node.Value = changesToApply.Value + node.Tag = changesToApply.Tag + node.Kind = changesToApply.Kind + node.Style = changesToApply.Style + node.Anchor = changesToApply.Anchor + node.Alias = changesToApply.Alias + + if !updateCommand.DontUpdateNodeContent { + node.Content = changesToApply.Content + } + } else { + log.Debug("skipping update as node already has value %v and overwriteFlag is ", node.Value, updateCommand.Overwrite) + } + + switch updateCommand.CommentsMergeStrategy { + case OverwriteCommentsMergeStrategy: + node.HeadComment = changesToApply.HeadComment + node.LineComment = changesToApply.LineComment + node.FootComment = changesToApply.FootComment + case SetWhenBlankCommentsMergeStrategy: + if node.HeadComment == "" { + node.HeadComment = changesToApply.HeadComment + } + if node.LineComment == "" { + node.LineComment = changesToApply.LineComment + } + if node.FootComment == "" { + node.FootComment = changesToApply.FootComment + } + case AppendCommentsMergeStrategy: + if node.HeadComment == "" { + node.HeadComment = changesToApply.HeadComment + } else { + node.HeadComment = node.HeadComment + "\n" + changesToApply.HeadComment + } + if node.LineComment == "" { + node.LineComment = changesToApply.LineComment + } else { + node.LineComment = node.LineComment + " " + changesToApply.LineComment + } + if node.FootComment == "" { + node.FootComment = changesToApply.FootComment + } else { + node.FootComment = node.FootComment + "\n" + changesToApply.FootComment + } + default: + } + + log.Debug("result") + DebugNode(node) + + return nil + }, + } +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/navigation_strategy.go new file mode 100644 index 000000000..e88641d0c --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/navigation_strategy.go @@ -0,0 +1,180 @@ +package yqlib + +import ( + "fmt" + + yaml "gopkg.in/yaml.v3" +) + +type NodeContext struct { + Node *yaml.Node + Head interface{} + Tail []interface{} + PathStack []interface{} + // middle nodes are nodes that match along the original path, but not a + // target match of the path. This is only relevant when ShouldOnlyDeeplyVisitLeaves is false. + IsMiddleNode bool +} + +func NewNodeContext(node *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) NodeContext { + newTail := make([]interface{}, len(tail)) + copy(newTail, tail) + + newPathStack := make([]interface{}, len(pathStack)) + copy(newPathStack, pathStack) + return NodeContext{ + Node: node, + Head: head, + Tail: newTail, + PathStack: newPathStack, + } +} + +type NavigationStrategy interface { + FollowAlias(nodeContext NodeContext) bool + AutoCreateMap(nodeContext NodeContext) bool + Visit(nodeContext NodeContext) error + // node key is the string value of the last element in the path stack + // we use it to match against the pathExpression in head. + ShouldTraverse(nodeContext NodeContext, nodeKey string) bool + ShouldDeeplyTraverse(nodeContext NodeContext) bool + // when deeply traversing, should we visit all matching nodes, or just leaves? + ShouldOnlyDeeplyVisitLeaves(NodeContext) bool + GetVisitedNodes() []*NodeContext + DebugVisitedNodes() + GetPathParser() PathParser +} + +type NavigationStrategyImpl struct { + followAlias func(nodeContext NodeContext) bool + autoCreateMap func(nodeContext NodeContext) bool + visit func(nodeContext NodeContext) error + shouldVisitExtraFn func(nodeContext NodeContext) bool + shouldDeeplyTraverse func(nodeContext NodeContext) bool + shouldOnlyDeeplyVisitLeaves func(nodeContext NodeContext) bool + visitedNodes []*NodeContext + pathParser PathParser +} + +func (ns *NavigationStrategyImpl) GetPathParser() PathParser { + return ns.pathParser +} + +func (ns *NavigationStrategyImpl) GetVisitedNodes() []*NodeContext { + return ns.visitedNodes +} + +func (ns *NavigationStrategyImpl) FollowAlias(nodeContext NodeContext) bool { + if ns.followAlias != nil { + return ns.followAlias(nodeContext) + } + return true +} + +func (ns *NavigationStrategyImpl) AutoCreateMap(nodeContext NodeContext) bool { + if ns.autoCreateMap != nil { + return ns.autoCreateMap(nodeContext) + } + return false +} + +func (ns *NavigationStrategyImpl) ShouldDeeplyTraverse(nodeContext NodeContext) bool { + if ns.shouldDeeplyTraverse != nil { + return ns.shouldDeeplyTraverse(nodeContext) + } + return true +} + +func (ns *NavigationStrategyImpl) ShouldOnlyDeeplyVisitLeaves(nodeContext NodeContext) bool { + if ns.shouldOnlyDeeplyVisitLeaves != nil { + return ns.shouldOnlyDeeplyVisitLeaves(nodeContext) + } + return true + +} + +func (ns *NavigationStrategyImpl) ShouldTraverse(nodeContext NodeContext, nodeKey string) bool { + // we should traverse aliases (if enabled), but not visit them :/ + if len(nodeContext.PathStack) == 0 { + return true + } + + if ns.alreadyVisited(nodeContext.PathStack) { + return false + } + + return (nodeKey == "<<" && ns.FollowAlias(nodeContext)) || (nodeKey != "<<" && + ns.pathParser.MatchesNextPathElement(nodeContext, nodeKey)) +} + +func (ns *NavigationStrategyImpl) shouldVisit(nodeContext NodeContext) bool { + pathStack := nodeContext.PathStack + if len(pathStack) == 0 { + return true + } + log.Debug("tail len %v", len(nodeContext.Tail)) + + if ns.alreadyVisited(pathStack) || len(nodeContext.Tail) != 0 { + return false + } + + nodeKey := fmt.Sprintf("%v", pathStack[len(pathStack)-1]) + log.Debug("nodeKey: %v, nodeContext.Head: %v", nodeKey, nodeContext.Head) + + // only visit aliases if its an exact match + return ((nodeKey == "<<" && nodeContext.Head == "<<") || (nodeKey != "<<" && + ns.pathParser.MatchesNextPathElement(nodeContext, nodeKey))) && (ns.shouldVisitExtraFn == nil || ns.shouldVisitExtraFn(nodeContext)) +} + +func (ns *NavigationStrategyImpl) Visit(nodeContext NodeContext) error { + log.Debug("Visit?, %v, %v", nodeContext.Head, pathStackToString(nodeContext.PathStack)) + DebugNode(nodeContext.Node) + if ns.shouldVisit(nodeContext) { + log.Debug("yep, visiting") + // pathStack array must be + // copied, as append() may sometimes reuse and modify the array + ns.visitedNodes = append(ns.visitedNodes, &nodeContext) + ns.DebugVisitedNodes() + return ns.visit(nodeContext) + } + log.Debug("nope, skip it") + return nil +} + +func (ns *NavigationStrategyImpl) DebugVisitedNodes() { + log.Debug("Visited Nodes:") + for _, candidate := range ns.visitedNodes { + log.Debug(" - %v", pathStackToString(candidate.PathStack)) + } +} + +func (ns *NavigationStrategyImpl) alreadyVisited(pathStack []interface{}) bool { + log.Debug("checking already visited pathStack: %v", pathStackToString(pathStack)) + for _, candidate := range ns.visitedNodes { + candidatePathStack := candidate.PathStack + if patchStacksMatch(candidatePathStack, pathStack) { + log.Debug("paths match, already seen it") + return true + } + + } + log.Debug("never seen it before!") + return false +} + +func patchStacksMatch(path1 []interface{}, path2 []interface{}) bool { + log.Debug("checking against path: %v", pathStackToString(path1)) + + if len(path1) != len(path2) { + return false + } + for index, p1Value := range path1 { + + p2Value := path2[index] + if p1Value != p2Value { + return false + } + } + return true + +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/path_parser.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/path_parser.go new file mode 100644 index 000000000..4e5189904 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/path_parser.go @@ -0,0 +1,153 @@ +package yqlib + +import ( + "fmt" + "strconv" + "strings" + + yaml "gopkg.in/yaml.v3" +) + +type PathParser interface { + ParsePath(path string) []interface{} + MatchesNextPathElement(nodeContext NodeContext, nodeKey string) bool + IsPathExpression(pathElement string) bool +} + +type pathParser struct{} + +func NewPathParser() PathParser { + return &pathParser{} +} + +func matchesString(expression string, value string) bool { + var prefixMatch = strings.TrimSuffix(expression, "*") + if prefixMatch != expression { + log.Debug("prefix match, %v", strings.HasPrefix(value, prefixMatch)) + return strings.HasPrefix(value, prefixMatch) + } + return value == expression +} + +func (p *pathParser) IsPathExpression(pathElement string) bool { + return pathElement == "*" || pathElement == "**" || strings.Contains(pathElement, "==") +} + +/** + * node: node that we may traverse/visit + * head: path element expression to match against + * tail: remaining path element expressions + * pathStack: stack of actual paths we've matched to get to node + * nodeKey: actual value of this nodes 'key' or index. + */ +func (p *pathParser) MatchesNextPathElement(nodeContext NodeContext, nodeKey string) bool { + head := nodeContext.Head + if head == "**" || head == "*" { + return true + } + var headString = fmt.Sprintf("%v", head) + + if strings.Contains(headString, "==") && nodeContext.Node.Kind != yaml.ScalarNode { + log.Debug("ooh deep recursion time") + result := strings.SplitN(headString, "==", 2) + path := strings.TrimSpace(result[0]) + value := strings.TrimSpace(result[1]) + log.Debug("path %v", path) + log.Debug("value %v", value) + DebugNode(nodeContext.Node) + navigationStrategy := FilterMatchingNodesNavigationStrategy(value) + + navigator := NewDataNavigator(navigationStrategy) + err := navigator.Traverse(nodeContext.Node, p.ParsePath(path)) + if err != nil { + log.Error("Error deep recursing - ignoring") + log.Error(err.Error()) + } + log.Debug("done deep recursing, found %v matches", len(navigationStrategy.GetVisitedNodes())) + return len(navigationStrategy.GetVisitedNodes()) > 0 + } else if strings.Contains(headString, "==") && nodeContext.Node.Kind == yaml.ScalarNode { + result := strings.SplitN(headString, "==", 2) + path := strings.TrimSpace(result[0]) + value := strings.TrimSpace(result[1]) + if path == "." { + log.Debug("need to match scalar") + return matchesString(value, nodeContext.Node.Value) + } + } + + if head == "+" { + log.Debug("head is +, nodeKey is %v", nodeKey) + var _, err = strconv.ParseInt(nodeKey, 10, 64) // nolint + if err == nil { + return true + } + } + + return matchesString(headString, nodeKey) +} + +func (p *pathParser) ParsePath(path string) []interface{} { + var paths = make([]interface{}, 0) + if path == "" { + return paths + } + return p.parsePathAccum(paths, path) +} + +func (p *pathParser) parsePathAccum(paths []interface{}, remaining string) []interface{} { + head, tail := p.nextYamlPath(remaining) + if tail == "" { + return append(paths, head) + } + return p.parsePathAccum(append(paths, head), tail) +} + +func (p *pathParser) nextYamlPath(path string) (pathElement interface{}, remaining string) { + switch path[0] { + case '[': + // e.g [0].blah.cat -> we need to return "0" and "blah.cat" + var value, remainingBit = p.search(path[1:], []uint8{']'}, true) + var number, errParsingInt = strconv.ParseInt(value, 10, 64) // nolint + if errParsingInt == nil { + return number, remainingBit + } + return value, remainingBit + case '"': + // e.g "a.b".blah.cat -> we need to return "a.b" and "blah.cat" + return p.search(path[1:], []uint8{'"'}, true) + case '(': + // e.g "a.b".blah.cat -> we need to return "a.b" and "blah.cat" + return p.search(path[1:], []uint8{')'}, true) + default: + // e.g "a.blah.cat" -> return "a" and "blah.cat" + return p.search(path[0:], []uint8{'.', '[', '"', '('}, false) + } +} + +func (p *pathParser) search(path string, matchingChars []uint8, skipNext bool) (pathElement string, remaining string) { + for i := 0; i < len(path); i++ { + var char = path[i] + if p.contains(matchingChars, char) { + var remainingStart = i + 1 + if skipNext { + remainingStart = remainingStart + 1 + } else if !skipNext && char != '.' { + remainingStart = i + } + if remainingStart > len(path) { + remainingStart = len(path) + } + return path[0:i], path[remainingStart:] + } + } + return path, "" +} + +func (p *pathParser) contains(matchingChars []uint8, candidate uint8) bool { + for _, a := range matchingChars { + if a == candidate { + return true + } + } + return false +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_for_merge_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_for_merge_navigation_strategy.go new file mode 100644 index 000000000..730613386 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_for_merge_navigation_strategy.go @@ -0,0 +1,37 @@ +package yqlib + +import "gopkg.in/yaml.v3" + +func ReadForMergeNavigationStrategy(arrayMergeStrategy ArrayMergeStrategy) NavigationStrategy { + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: NewPathParser(), + followAlias: func(nodeContext NodeContext) bool { + return false + }, + shouldOnlyDeeplyVisitLeaves: func(nodeContext NodeContext) bool { + return false + }, + visit: func(nodeContext NodeContext) error { + return nil + }, + shouldDeeplyTraverse: func(nodeContext NodeContext) bool { + if nodeContext.Node.Kind == yaml.SequenceNode && arrayMergeStrategy == OverwriteArrayMergeStrategy { + nodeContext.IsMiddleNode = false + return false + } + + var isInArray = false + if len(nodeContext.PathStack) > 0 { + var lastElement = nodeContext.PathStack[len(nodeContext.PathStack)-1] + switch lastElement.(type) { + case int: + isInArray = true + default: + isInArray = false + } + } + return arrayMergeStrategy == UpdateArrayMergeStrategy || !isInArray + }, + } +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_navigation_strategy.go new file mode 100644 index 000000000..ba29e94e8 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/read_navigation_strategy.go @@ -0,0 +1,11 @@ +package yqlib + +func ReadNavigationStrategy() NavigationStrategy { + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: NewPathParser(), + visit: func(nodeContext NodeContext) error { + return nil + }, + } +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/update_navigation_strategy.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/update_navigation_strategy.go new file mode 100644 index 000000000..b5b0e7505 --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/update_navigation_strategy.go @@ -0,0 +1,43 @@ +package yqlib + +func UpdateNavigationStrategy(updateCommand UpdateCommand, autoCreate bool) NavigationStrategy { + return &NavigationStrategyImpl{ + visitedNodes: []*NodeContext{}, + pathParser: NewPathParser(), + followAlias: func(nodeContext NodeContext) bool { + return false + }, + autoCreateMap: func(nodeContext NodeContext) bool { + return autoCreate + }, + visit: func(nodeContext NodeContext) error { + node := nodeContext.Node + changesToApply := updateCommand.Value + if updateCommand.Overwrite || node.Value == "" { + log.Debug("going to update") + DebugNode(node) + log.Debug("with") + DebugNode(changesToApply) + if !updateCommand.DontUpdateNodeValue { + node.Value = changesToApply.Value + } + node.Tag = changesToApply.Tag + node.Kind = changesToApply.Kind + node.Style = changesToApply.Style + if !updateCommand.DontUpdateNodeContent { + node.Content = changesToApply.Content + } + node.Anchor = changesToApply.Anchor + node.Alias = changesToApply.Alias + if updateCommand.CommentsMergeStrategy != IgnoreCommentsMergeStrategy { + node.HeadComment = changesToApply.HeadComment + node.LineComment = changesToApply.LineComment + node.FootComment = changesToApply.FootComment + } + } else { + log.Debug("skipping update as node already has value %v and overwriteFlag is ", node.Value, updateCommand.Overwrite) + } + return nil + }, + } +} diff --git a/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/value_parser.go b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/value_parser.go new file mode 100644 index 000000000..6dee7400f --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/pkg/yqlib/value_parser.go @@ -0,0 +1,46 @@ +package yqlib + +import ( + yaml "gopkg.in/yaml.v3" +) + +type ValueParser interface { + Parse(argument string, customTag string, customStyle string, anchorName string, createAlias bool) *yaml.Node +} + +type valueParser struct { +} + +func NewValueParser() ValueParser { + return &valueParser{} +} + +func (v *valueParser) Parse(argument string, customTag string, customStyle string, anchorName string, createAlias bool) *yaml.Node { + var style yaml.Style + if customStyle == "tagged" { + style = yaml.TaggedStyle + } else if customStyle == "double" { + style = yaml.DoubleQuotedStyle + } else if customStyle == "single" { + style = yaml.SingleQuotedStyle + } else if customStyle == "literal" { + style = yaml.LiteralStyle + } else if customStyle == "folded" { + style = yaml.FoldedStyle + } else if customStyle == "flow" { + style = yaml.FlowStyle + } else if customStyle != "" { + log.Error("Unknown style %v, ignoring", customStyle) + } + if argument == "[]" { + return &yaml.Node{Tag: "!!seq", Kind: yaml.SequenceNode, Style: style} + } + + kind := yaml.ScalarNode + + if createAlias { + kind = yaml.AliasNode + } + + return &yaml.Node{Value: argument, Tag: customTag, Kind: kind, Style: style, Anchor: anchorName} +} diff --git a/vendor/github.com/mikefarah/yq/v2/release_instructions.txt b/vendor/github.com/mikefarah/yq/v3/release_instructions.txt similarity index 87% rename from vendor/github.com/mikefarah/yq/v2/release_instructions.txt rename to vendor/github.com/mikefarah/yq/v3/release_instructions.txt index 07b005f7d..ef6c88c32 100644 --- a/vendor/github.com/mikefarah/yq/v2/release_instructions.txt +++ b/vendor/github.com/mikefarah/yq/v3/release_instructions.txt @@ -2,9 +2,9 @@ - increment version in snapcraft.yaml - commit - tag git with same version number - - be sure to also tag with 'v' for gopkg.in - make sure local build passes - push tag to git + - 3.4.0, v3 - git push --tags - make local xcompile (builds binaries for all platforms) @@ -31,9 +31,11 @@ - docker - build and push latest and new version tag - - docker build . -t mikefarah/yq:latest -t mikefarah/yq:VERSION + - docker build . -t mikefarah/yq:latest -t mikefarah/yq:3 -t mikefarah/yq:3.X - debian package + - ensure you get all vendor dependencies before packaging + ```go mod vendor``` - execute ```dch -i``` - fill debian/changelog with changes from last version @@ -43,4 +45,4 @@ - put to PPA ```dput ppa: ../yq__source.changes``` (current distro repository is ppa:rmescandon/yq. In case that a new version - is released, please contact rmescandon@gmail.com to bump debian package) \ No newline at end of file + is released, please contact rmescandon@gmail.com to bump debian package) diff --git a/vendor/github.com/mikefarah/yq/v3/yq.go b/vendor/github.com/mikefarah/yq/v3/yq.go new file mode 100644 index 000000000..b409fab5a --- /dev/null +++ b/vendor/github.com/mikefarah/yq/v3/yq.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + command "github.com/mikefarah/yq/v3/cmd" +) + +func main() { + cmd := command.New() + if err := cmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/gopkg.in/imdario/mergo.v0/.gitignore b/vendor/gopkg.in/imdario/mergo.v0/.gitignore deleted file mode 100644 index 529c3412b..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -#### joe made this: http://goel.io/joe - -#### go #### -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ - -#### vim #### -# Swap -[._]*.s[a-v][a-z] -[._]*.sw[a-p] -[._]s[a-v][a-z] -[._]sw[a-p] - -# Session -Session.vim - -# Temporary -.netrwhist -*~ -# Auto-generated tag files -tags diff --git a/vendor/gopkg.in/imdario/mergo.v0/.travis.yml b/vendor/gopkg.in/imdario/mergo.v0/.travis.yml deleted file mode 100644 index b13a50ed1..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -install: - - go get -t - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls -script: - - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/gopkg.in/imdario/mergo.v0/CODE_OF_CONDUCT.md b/vendor/gopkg.in/imdario/mergo.v0/CODE_OF_CONDUCT.md deleted file mode 100644 index 469b44907..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i@dario.im. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/gopkg.in/imdario/mergo.v0/LICENSE b/vendor/gopkg.in/imdario/mergo.v0/LICENSE deleted file mode 100644 index 686680298..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2013 Dario Castañé. All rights reserved. -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/gopkg.in/imdario/mergo.v0/README.md b/vendor/gopkg.in/imdario/mergo.v0/README.md deleted file mode 100644 index 02fc81e06..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/README.md +++ /dev/null @@ -1,238 +0,0 @@ -# Mergo - -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. - -## Status - -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). - -[![GoDoc][3]][4] -[![GoCard][5]][6] -[![Build Status][1]][2] -[![Coverage Status][7]][8] -[![Sourcegraph][9]][10] -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield) - -[1]: https://travis-ci.org/imdario/mergo.png -[2]: https://travis-ci.org/imdario/mergo -[3]: https://godoc.org/github.com/imdario/mergo?status.svg -[4]: https://godoc.org/github.com/imdario/mergo -[5]: https://goreportcard.com/badge/imdario/mergo -[6]: https://goreportcard.com/report/github.com/imdario/mergo -[7]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master -[8]: https://coveralls.io/github/imdario/mergo?branch=master -[9]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg -[10]: https://sourcegraph.com/github.com/imdario/mergo?badge - -### Latest release - -[Release v0.3.7](https://github.com/imdario/mergo/releases/tag/v0.3.7). - -### Important note - -Please keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2) Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). An optional/variadic argument has been added, so it won't break existing code. - -If you were using Mergo **before** April 6th 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause (I hope it won't!) in existing projects after the change (release 0.2.0). - -### Donations - -If Mergo is useful to you, consider buying me a coffee, a beer or making a monthly donation so I can keep building great free software. :heart_eyes: - -Buy Me a Coffee at ko-fi.com -[![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) -[![Beerpay](https://beerpay.io/imdario/mergo/make-wish.svg)](https://beerpay.io/imdario/mergo) -Donate using Liberapay - -### Mergo in the wild - -- [moby/moby](https://github.com/moby/moby) -- [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) -- [vmware/dispatch](https://github.com/vmware/dispatch) -- [Shopify/themekit](https://github.com/Shopify/themekit) -- [imdario/zas](https://github.com/imdario/zas) -- [matcornic/hermes](https://github.com/matcornic/hermes) -- [OpenBazaar/openbazaar-go](https://github.com/OpenBazaar/openbazaar-go) -- [kataras/iris](https://github.com/kataras/iris) -- [michaelsauter/crane](https://github.com/michaelsauter/crane) -- [go-task/task](https://github.com/go-task/task) -- [sensu/uchiwa](https://github.com/sensu/uchiwa) -- [ory/hydra](https://github.com/ory/hydra) -- [sisatech/vcli](https://github.com/sisatech/vcli) -- [dairycart/dairycart](https://github.com/dairycart/dairycart) -- [projectcalico/felix](https://github.com/projectcalico/felix) -- [resin-os/balena](https://github.com/resin-os/balena) -- [go-kivik/kivik](https://github.com/go-kivik/kivik) -- [Telefonica/govice](https://github.com/Telefonica/govice) -- [supergiant/supergiant](supergiant/supergiant) -- [SergeyTsalkov/brooce](https://github.com/SergeyTsalkov/brooce) -- [soniah/dnsmadeeasy](https://github.com/soniah/dnsmadeeasy) -- [ohsu-comp-bio/funnel](https://github.com/ohsu-comp-bio/funnel) -- [EagerIO/Stout](https://github.com/EagerIO/Stout) -- [lynndylanhurley/defsynth-api](https://github.com/lynndylanhurley/defsynth-api) -- [russross/canvasassignments](https://github.com/russross/canvasassignments) -- [rdegges/cryptly-api](https://github.com/rdegges/cryptly-api) -- [casualjim/exeggutor](https://github.com/casualjim/exeggutor) -- [divshot/gitling](https://github.com/divshot/gitling) -- [RWJMurphy/gorl](https://github.com/RWJMurphy/gorl) -- [andrerocker/deploy42](https://github.com/andrerocker/deploy42) -- [elwinar/rambler](https://github.com/elwinar/rambler) -- [tmaiaroto/gopartman](https://github.com/tmaiaroto/gopartman) -- [jfbus/impressionist](https://github.com/jfbus/impressionist) -- [Jmeyering/zealot](https://github.com/Jmeyering/zealot) -- [godep-migrator/rigger-host](https://github.com/godep-migrator/rigger-host) -- [Dronevery/MultiwaySwitch-Go](https://github.com/Dronevery/MultiwaySwitch-Go) -- [thoas/picfit](https://github.com/thoas/picfit) -- [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) -- [jnuthong/item_search](https://github.com/jnuthong/item_search) -- [bukalapak/snowboard](https://github.com/bukalapak/snowboard) - -## Installation - - go get github.com/imdario/mergo - - // use in your .go code - import ( - "github.com/imdario/mergo" - ) - -## Usage - -You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are not considered zero values](https://golang.org/ref/spec#The_zero_value) either. Also maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). - -```go -if err := mergo.Merge(&dst, src); err != nil { - // ... -} -``` - -Also, you can merge overwriting values using the transformer `WithOverride`. - -```go -if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { - // ... -} -``` - -Additionally, you can map a `map[string]interface{}` to a struct (and otherwise, from struct to map), following the same restrictions as in `Merge()`. Keys are capitalized to find each corresponding exported field. - -```go -if err := mergo.Map(&dst, srcMap); err != nil { - // ... -} -``` - -Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. - -More information and examples in [godoc documentation](http://godoc.org/github.com/imdario/mergo). - -### Nice example - -```go -package main - -import ( - "fmt" - "github.com/imdario/mergo" -) - -type Foo struct { - A string - B int64 -} - -func main() { - src := Foo{ - A: "one", - B: 2, - } - dest := Foo{ - A: "two", - } - mergo.Merge(&dest, src) - fmt.Println(dest) - // Will print - // {two 2} -} -``` - -Note: if test are failing due missing package, please execute: - - go get gopkg.in/yaml.v2 - -### Transformers - -Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, `time.Time` is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero `time.Time`? - -```go -package main - -import ( - "fmt" - "github.com/imdario/mergo" - "reflect" - "time" -) - -type timeTransfomer struct { -} - -func (t timeTransfomer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { - if typ == reflect.TypeOf(time.Time{}) { - return func(dst, src reflect.Value) error { - if dst.CanSet() { - isZero := dst.MethodByName("IsZero") - result := isZero.Call([]reflect.Value{}) - if result[0].Bool() { - dst.Set(src) - } - } - return nil - } - } - return nil -} - -type Snapshot struct { - Time time.Time - // ... -} - -func main() { - src := Snapshot{time.Now()} - dest := Snapshot{} - mergo.Merge(&dest, src, mergo.WithTransformers(timeTransfomer{})) - fmt.Println(dest) - // Will print - // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } -} -``` - - -## Contact me - -If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) - -## About - -Written by [Dario Castañé](http://dario.im). - -## Top Contributors - -[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) -[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) -[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) -[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) -[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) -[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) -[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) -[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) - - -## License - -[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). - - -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large) diff --git a/vendor/gopkg.in/imdario/mergo.v0/doc.go b/vendor/gopkg.in/imdario/mergo.v0/doc.go deleted file mode 100644 index 6e9aa7baf..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/doc.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package mergo merges same-type structs and maps by setting default values in zero-value fields. - -Mergo won't merge unexported (private) fields but will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). - -Usage - -From my own work-in-progress project: - - type networkConfig struct { - Protocol string - Address string - ServerType string `json: "server_type"` - Port uint16 - } - - type FssnConfig struct { - Network networkConfig - } - - var fssnDefault = FssnConfig { - networkConfig { - "tcp", - "127.0.0.1", - "http", - 31560, - }, - } - - // Inside a function [...] - - if err := mergo.Merge(&config, fssnDefault); err != nil { - log.Fatal(err) - } - - // More code [...] - -*/ -package mergo diff --git a/vendor/gopkg.in/imdario/mergo.v0/map.go b/vendor/gopkg.in/imdario/mergo.v0/map.go deleted file mode 100644 index 3f5afa83a..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/map.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2014 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "fmt" - "reflect" - "unicode" - "unicode/utf8" -) - -func changeInitialCase(s string, mapper func(rune) rune) string { - if s == "" { - return s - } - r, n := utf8.DecodeRuneInString(s) - return string(mapper(r)) + s[n:] -} - -func isExported(field reflect.StructField) bool { - r, _ := utf8.DecodeRuneInString(field.Name) - return r >= 'A' && r <= 'Z' -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { - overwrite := config.Overwrite - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - zeroValue := reflect.Value{} - switch dst.Kind() { - case reflect.Map: - dstMap := dst.Interface().(map[string]interface{}) - for i, n := 0, src.NumField(); i < n; i++ { - srcType := src.Type() - field := srcType.Field(i) - if !isExported(field) { - continue - } - fieldName := field.Name - fieldName = changeInitialCase(fieldName, unicode.ToLower) - if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { - dstMap[fieldName] = src.Field(i).Interface() - } - } - case reflect.Ptr: - if dst.IsNil() { - v := reflect.New(dst.Type().Elem()) - dst.Set(v) - } - dst = dst.Elem() - fallthrough - case reflect.Struct: - srcMap := src.Interface().(map[string]interface{}) - for key := range srcMap { - config.overwriteWithEmptyValue = true - srcValue := srcMap[key] - fieldName := changeInitialCase(key, unicode.ToUpper) - dstElement := dst.FieldByName(fieldName) - if dstElement == zeroValue { - // We discard it because the field doesn't exist. - continue - } - srcElement := reflect.ValueOf(srcValue) - dstKind := dstElement.Kind() - srcKind := srcElement.Kind() - if srcKind == reflect.Ptr && dstKind != reflect.Ptr { - srcElement = srcElement.Elem() - srcKind = reflect.TypeOf(srcElement.Interface()).Kind() - } else if dstKind == reflect.Ptr { - // Can this work? I guess it can't. - if srcKind != reflect.Ptr && srcElement.CanAddr() { - srcPtr := srcElement.Addr() - srcElement = reflect.ValueOf(srcPtr) - srcKind = reflect.Ptr - } - } - - if !srcElement.IsValid() { - continue - } - if srcKind == dstKind { - if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { - if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else if srcKind == reflect.Map { - if err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else { - return fmt.Errorf("type mismatch on %s field: found %v, expected %v", fieldName, srcKind, dstKind) - } - } - } - return -} - -// Map sets fields' values in dst from src. -// src can be a map with string keys or a struct. dst must be the opposite: -// if src is a map, dst must be a valid pointer to struct. If src is a struct, -// dst must be map[string]interface{}. -// It won't merge unexported (private) fields and will do recursively -// any exported field. -// If dst is a map, keys will be src fields' names in lower camel case. -// Missing key in src that doesn't match a field in dst will be skipped. This -// doesn't apply if dst is a map. -// This is separated method from Merge because it is cleaner and it keeps sane -// semantics: merging equal types, mapping different (restricted) types. -func Map(dst, src interface{}, opts ...func(*Config)) error { - return _map(dst, src, opts...) -} - -// MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by -// non-empty src attribute values. -// Deprecated: Use Map(…) with WithOverride -func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { - return _map(dst, src, append(opts, WithOverride)...) -} - -func _map(dst, src interface{}, opts ...func(*Config)) error { - var ( - vDst, vSrc reflect.Value - err error - ) - config := &Config{} - - for _, opt := range opts { - opt(config) - } - - if vDst, vSrc, err = resolveValues(dst, src); err != nil { - return err - } - // To be friction-less, we redirect equal-type arguments - // to deepMerge. Only because arguments can be anything. - if vSrc.Kind() == vDst.Kind() { - return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) - } - switch vSrc.Kind() { - case reflect.Struct: - if vDst.Kind() != reflect.Map { - return ErrExpectedMapAsDestination - } - case reflect.Map: - if vDst.Kind() != reflect.Struct { - return ErrExpectedStructAsDestination - } - default: - return ErrNotSupported - } - return deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config) -} diff --git a/vendor/gopkg.in/imdario/mergo.v0/merge.go b/vendor/gopkg.in/imdario/mergo.v0/merge.go deleted file mode 100644 index f8de6c543..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/merge.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "fmt" - "reflect" -) - -func hasExportedField(dst reflect.Value) (exported bool) { - for i, n := 0, dst.NumField(); i < n; i++ { - field := dst.Type().Field(i) - if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { - exported = exported || hasExportedField(dst.Field(i)) - } else { - exported = exported || len(field.PkgPath) == 0 - } - } - return -} - -type Config struct { - Overwrite bool - AppendSlice bool - Transformers Transformers - overwriteWithEmptyValue bool -} - -type Transformers interface { - Transformer(reflect.Type) func(dst, src reflect.Value) error -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { - overwrite := config.Overwrite - overwriteWithEmptySrc := config.overwriteWithEmptyValue - config.overwriteWithEmptyValue = false - - if !src.IsValid() { - return - } - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - - if config.Transformers != nil && !isEmptyValue(dst) { - if fn := config.Transformers.Transformer(dst.Type()); fn != nil { - err = fn(dst, src) - return - } - } - - switch dst.Kind() { - case reflect.Struct: - if hasExportedField(dst) { - for i, n := 0, dst.NumField(); i < n; i++ { - if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { - return - } - } - } else { - if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } - case reflect.Map: - if dst.IsNil() && !src.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - for _, key := range src.MapKeys() { - srcElement := src.MapIndex(key) - if !srcElement.IsValid() { - continue - } - dstElement := dst.MapIndex(key) - switch srcElement.Kind() { - case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: - if srcElement.IsNil() { - continue - } - fallthrough - default: - if !srcElement.CanInterface() { - continue - } - switch reflect.TypeOf(srcElement.Interface()).Kind() { - case reflect.Struct: - fallthrough - case reflect.Ptr: - fallthrough - case reflect.Map: - srcMapElm := srcElement - dstMapElm := dstElement - if srcMapElm.CanInterface() { - srcMapElm = reflect.ValueOf(srcMapElm.Interface()) - if dstMapElm.IsValid() { - dstMapElm = reflect.ValueOf(dstMapElm.Interface()) - } - } - if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { - return - } - case reflect.Slice: - srcSlice := reflect.ValueOf(srcElement.Interface()) - - var dstSlice reflect.Value - if !dstElement.IsValid() || dstElement.IsNil() { - dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) - } else { - dstSlice = reflect.ValueOf(dstElement.Interface()) - } - - if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { - dstSlice = srcSlice - } else if config.AppendSlice { - if srcSlice.Type() != dstSlice.Type() { - return fmt.Errorf("cannot append two slice with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) - } - dstSlice = reflect.AppendSlice(dstSlice, srcSlice) - } - dst.SetMapIndex(key, dstSlice) - } - } - if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { - continue - } - - if srcElement.IsValid() && (overwrite || (!dstElement.IsValid() || isEmptyValue(dstElement))) { - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - dst.SetMapIndex(key, srcElement) - } - } - case reflect.Slice: - if !dst.CanSet() { - break - } - if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { - dst.Set(src) - } else if config.AppendSlice { - if src.Type() != dst.Type() { - return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) - } - dst.Set(reflect.AppendSlice(dst, src)) - } - case reflect.Ptr: - fallthrough - case reflect.Interface: - if src.IsNil() { - break - } - if src.Kind() != reflect.Interface { - if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } else if src.Kind() == reflect.Ptr { - if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return - } - } else if dst.Elem().Type() == src.Type() { - if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { - return - } - } else { - return ErrDifferentArgumentsTypes - } - break - } - if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return - } - default: - if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } - return -} - -// Merge will fill any empty for value type attributes on the dst struct using corresponding -// src attributes if they themselves are not empty. dst and src must be valid same-type structs -// and dst must be a pointer to struct. -// It won't merge unexported (private) fields and will do recursively any exported field. -func Merge(dst, src interface{}, opts ...func(*Config)) error { - return merge(dst, src, opts...) -} - -// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overriden by -// non-empty src attribute values. -// Deprecated: use Merge(…) with WithOverride -func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { - return merge(dst, src, append(opts, WithOverride)...) -} - -// WithTransformers adds transformers to merge, allowing to customize the merging of some types. -func WithTransformers(transformers Transformers) func(*Config) { - return func(config *Config) { - config.Transformers = transformers - } -} - -// WithOverride will make merge override non-empty dst attributes with non-empty src attributes values. -func WithOverride(config *Config) { - config.Overwrite = true -} - -// WithAppendSlice will make merge append slices instead of overwriting it -func WithAppendSlice(config *Config) { - config.AppendSlice = true -} - -func merge(dst, src interface{}, opts ...func(*Config)) error { - var ( - vDst, vSrc reflect.Value - err error - ) - - config := &Config{} - - for _, opt := range opts { - opt(config) - } - - if vDst, vSrc, err = resolveValues(dst, src); err != nil { - return err - } - if vDst.Type() != vSrc.Type() { - return ErrDifferentArgumentsTypes - } - return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) -} diff --git a/vendor/gopkg.in/imdario/mergo.v0/mergo.go b/vendor/gopkg.in/imdario/mergo.v0/mergo.go deleted file mode 100644 index a82fea2fd..000000000 --- a/vendor/gopkg.in/imdario/mergo.v0/mergo.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "errors" - "reflect" -) - -// Errors reported by Mergo when it finds invalid arguments. -var ( - ErrNilArguments = errors.New("src and dst must not be nil") - ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") - ErrNotSupported = errors.New("only structs and maps are supported") - ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") - ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") -) - -// During deepMerge, must keep track of checks that are -// in progress. The comparison algorithm assumes that all -// checks in progress are true when it reencounters them. -// Visited are stored in a map indexed by 17 * a1 + a2; -type visit struct { - ptr uintptr - typ reflect.Type - next *visit -} - -// From src/pkg/encoding/json/encode.go. -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - if v.IsNil() { - return true - } - return isEmptyValue(v.Elem()) - case reflect.Func: - return v.IsNil() - case reflect.Invalid: - return true - } - return false -} - -func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { - if dst == nil || src == nil { - err = ErrNilArguments - return - } - vDst = reflect.ValueOf(dst).Elem() - if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { - err = ErrNotSupported - return - } - vSrc = reflect.ValueOf(src) - // We check if vSrc is a pointer to dereference it. - if vSrc.Kind() == reflect.Ptr { - vSrc = vSrc.Elem() - } - return -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deeper(dst, src reflect.Value, visited map[uintptr]*visit, depth int) (err error) { - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - return // TODO refactor -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 9eee9b174..11634c2a4 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -15,7 +15,7 @@ github.com/blang/semver/v4 github.com/cespare/xxhash/v2 # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew -# github.com/fatih/color v1.7.0 +# github.com/fatih/color v1.9.0 github.com/fatih/color # github.com/ghodss/yaml v1.0.0 ## explicit @@ -36,6 +36,12 @@ github.com/go-openapi/spec github.com/go-openapi/swag # github.com/gobuffalo/flect v0.2.0 github.com/gobuffalo/flect +# github.com/goccy/go-yaml v1.8.1 +github.com/goccy/go-yaml/ast +github.com/goccy/go-yaml/lexer +github.com/goccy/go-yaml/printer +github.com/goccy/go-yaml/scanner +github.com/goccy/go-yaml/token # github.com/gogo/protobuf v1.3.1 github.com/gogo/protobuf/proto github.com/gogo/protobuf/sortkeys @@ -68,21 +74,23 @@ github.com/kisielk/errcheck github.com/kisielk/errcheck/internal/errcheck # github.com/konsorten/go-windows-terminal-sequences v1.0.3 github.com/konsorten/go-windows-terminal-sequences +# github.com/kylelemons/godebug v1.1.0 +github.com/kylelemons/godebug/diff # github.com/mailru/easyjson v0.7.0 github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter -# github.com/mattn/go-colorable v0.1.2 +# github.com/mattn/go-colorable v0.1.7 github.com/mattn/go-colorable -# github.com/mattn/go-isatty v0.0.8 +# github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-isatty # github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/matttproud/golang_protobuf_extensions/pbutil -# github.com/mikefarah/yaml/v2 v2.4.0 -github.com/mikefarah/yaml/v2 -# github.com/mikefarah/yq/v2 v2.4.1 +# github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 ## explicit -github.com/mikefarah/yq/v2 +github.com/mikefarah/yq/v3 +github.com/mikefarah/yq/v3/cmd +github.com/mikefarah/yq/v3/pkg/yqlib # github.com/mitchellh/mapstructure v1.1.2 github.com/mitchellh/mapstructure # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd @@ -243,8 +251,6 @@ google.golang.org/protobuf/runtime/protoimpl google.golang.org/protobuf/types/known/anypb google.golang.org/protobuf/types/known/durationpb google.golang.org/protobuf/types/known/timestamppb -# gopkg.in/imdario/mergo.v0 v0.3.7 -gopkg.in/imdario/mergo.v0 # gopkg.in/inf.v0 v0.9.1 gopkg.in/inf.v0 # gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473